Commit dc6bfc7a authored by martin hou's avatar martin hou

fix: 调整接收缓冲区大小测试分块组合解码

parent 5021a609
...@@ -196,24 +196,25 @@ export function Home() { ...@@ -196,24 +196,25 @@ export function Home() {
let filename = ''; let filename = '';
let filelength = 0; let filelength = 0;
const transferFile = async () => { const transferFile = async () => {
if (files == null || files.length == 0) return alert('请先点击List Files'); // if (files == null || files.length == 0) return alert('请先点击List Files');
let idx = prompt('请输入需要获取的文件序号(从0开始):', '0'); // let idx = prompt('请输入需要获取的文件序号(从0开始):', '0');
if (idx === undefined || idx === null) return; // if (idx === undefined || idx === null) return;
let num = parseInt(idx); // let num = parseInt(idx);
if (isNaN(num) || num < 0 || num >= files.length) return alert('请输入正确的序号'); // if (isNaN(num) || num < 0 || num >= files.length) return alert('请输入正确的序号');
let file = files[num]; // let file = files[num];
filename = file.name; // 2025Jun24-165914-Wip00.hda, 232704 @ 19392
filelength = file.length; filename = '2025Jun24-165914-Wip00.hda';
filelength = 232704;
get_file(); get_file();
} }
const get_file = () => { const get_file = () => {
jensen.getFile(filename, filelength, function(data) { jensen.getFile(filename, filelength, function(data) {
console.log('data', data.length); // console.log('data', data.length);
}, function(recvBytes) { }, function(recvBytes) {
let percent = Math.floor(recvBytes / filelength * 100); let percent = Math.floor(recvBytes / filelength * 100);
console.log('progress', percent); // console.log('progress', percent);
}); });
} }
......
...@@ -108,7 +108,7 @@ function Jensen(log, conn) { ...@@ -108,7 +108,7 @@ function Jensen(log, conn) {
this.lastTimerInvoked = new Date().getTime(); this.lastTimerInvoked = new Date().getTime();
this.wakeupTime = null; this.wakeupTime = null;
const RECV_BUFF_SIZE = 512000; const RECV_BUFF_SIZE = 3200;
const _check_conn_status = () => { const _check_conn_status = () => {
if (device?.opened === false) { if (device?.opened === false) {
...@@ -439,7 +439,7 @@ function Jensen(log, conn) { ...@@ -439,7 +439,7 @@ function Jensen(log, conn) {
// console.log('trace', device); // console.log('trace', device);
device.transferIn(2, RECV_BUFF_SIZE).then((r) => { device.transferIn(2, RECV_BUFF_SIZE).then((r) => {
Logger.save?.('jensen', 'tryReceive', r?.data); Logger.save?.('jensen', 'tryReceive', r?.data);
console.log(pid + '-Receive', new Date().toLocaleString(), r?.data); // console.log(pid + '-Receive', new Date().toLocaleString(), r?.data);
receive(r); receive(r);
}).catch((e) => { }).catch((e) => {
console.log('tryReceive error', e) console.log('tryReceive error', e)
...@@ -479,14 +479,25 @@ function Jensen(log, conn) { ...@@ -479,14 +479,25 @@ function Jensen(log, conn) {
const tryDecode = function () { const tryDecode = function () {
if (!current) return; if (!current) return;
// 一个容器,比单独任意一个小包要大一点儿,好像还差一点儿 // 一个容器,比单独任意一个小包要大一点儿,好像还差一点儿
// 当前总缓冲区大小
let totalBuffLen = 0;
for (let i = 0; i < blocks.length; i++)
{
totalBuffLen += blocks[i].byteLength;
}
Logger.info('jensen', 'transfer', `try to decode buffer with ${totalBuffLen} bytes`);
let stime = new Date(); let stime = new Date();
let buff = new ArrayBuffer(RECV_BUFF_SIZE * 2); let buff = new ArrayBuffer(RECV_BUFF_SIZE * 2);
let bview = new Uint8Array(buff); // bview的大小,必须是要大于固件端给出的最大包大小,已知的最大大小为8192字节,但是后面可能会提供整文件大小传输的情况,那个时候大小会变得巨大
let bview = new Uint8Array(10240);
// buff中实际使用的字节数,有效字节数 // buff中实际使用的字节数,有效字节数
let buffLength = 0; let buffLength = 0;
let crash = false; let crash = false;
let decodeBytes = 0;
for (let i = 0, l = blocks.length; i < l; i++) { for (let i = 0, l = blocks.length; i < l; i++) {
let block = blocks.shift(); let block = blocks.shift();
Logger.info('jensen', 'decode-block', `${i}/${l}@${block.byteLength}`);
// 把block加到buff的最末尾 // 把block加到buff的最末尾
for (let k = 0; k < block.byteLength; k++) { for (let k = 0; k < block.byteLength; k++) {
bview[k + buffLength] = block.getInt8(k); bview[k + buffLength] = block.getInt8(k);
...@@ -498,8 +509,13 @@ function Jensen(log, conn) { ...@@ -498,8 +509,13 @@ function Jensen(log, conn) {
let rst = null; let rst = null;
try { try {
rst = decodeMessage(bview, startIndex, buffLength); rst = decodeMessage(bview, startIndex, buffLength);
if (rst == null)
{
Logger.info('jensen', 'decode', `start: ${startIndex}, length: ${buffLength}, cut: 0`);
}
else Logger.info('jensen', 'decode', `start: ${startIndex}, length: ${buffLength}, cut: ${rst.length}`);
} catch (e) { } catch (e) {
Logger.error('jensen', 'decode', String(e)); // Logger.error('jensen', 'decode', String(e));
crash = true; crash = true;
break; break;
} }
...@@ -509,7 +525,9 @@ function Jensen(log, conn) { ...@@ -509,7 +525,9 @@ function Jensen(log, conn) {
startIndex += rst.length; startIndex += rst.length;
let msg = rst.message; let msg = rst.message;
console.log('seq = ' + msg.sequence); decodeBytes += msg.body.length;
// Logger.info('jensen', 'decode', `total decoded: ${decodeBytes}`);
// console.log('seq = ' + msg.sequence);
// WARN: 接下来怎么整 // WARN: 接下来怎么整
let cname = msg.id === FACTORY_RESET ? 'factory-reset' : COMMAND_NAMES[msg.id]; let cname = msg.id === FACTORY_RESET ? 'factory-reset' : COMMAND_NAMES[msg.id];
let heading = []; let heading = [];
...@@ -517,11 +535,7 @@ function Jensen(log, conn) { ...@@ -517,11 +535,7 @@ function Jensen(log, conn) {
heading.push('0' + (msg.body[x] & 0xff).toString(16).replace(/^0(\w{2})$/gi, '$1')); heading.push('0' + (msg.body[x] & 0xff).toString(16).replace(/^0(\w{2})$/gi, '$1'));
} }
if (msg.id !== TRANSFER_FILE) if (msg.id !== TRANSFER_FILE)
Logger.debug( Logger.debug('jensen', 'receive', pid + '-recv: cmd=' + msg.id + ', seq: ' + msg.sequence + ', data bytes: ' + msg.body?.byteLength + ', data: ' + heading.join(' '));
'jensen',
'receive',
pid + '-recv: cmd=' + msg.id + ', seq: ' + msg.sequence + ', data bytes: ' + msg.body?.byteLength + ', data: ' + heading.join(' ')
);
try { try {
let handler = handlers[msg.id]; let handler = handlers[msg.id];
if (!handler) handler = Jensen.handlers[msg.id]; if (!handler) handler = Jensen.handlers[msg.id];
...@@ -560,6 +574,7 @@ function Jensen(log, conn) { ...@@ -560,6 +574,7 @@ function Jensen(log, conn) {
} }
buffLength = buffLength - startIndex; buffLength = buffLength - startIndex;
} }
// Logger.info('jensen', 'decode', `total decode: ${decodeBytes}`);
// console.error('Decode: ' + (new Date().getTime() - stime.getTime()) + 'ms'); // console.error('Decode: ' + (new Date().getTime() - stime.getTime()) + 'ms');
}; };
...@@ -1049,9 +1064,11 @@ Jensen.prototype.getFile = async function (filename, length, ondata, onprogress) ...@@ -1049,9 +1064,11 @@ Jensen.prototype.getFile = async function (filename, length, ondata, onprogress)
let stime = new Date(); let stime = new Date();
let flen = 0; let flen = 0;
let handler = (msg) => { let handler = (msg) => {
// Logger.info('jensen', 'transfer', typeof(msg));
if (msg != null) { if (msg != null) {
flen += msg.body.length || msg.body.byteLength; flen += msg.body.length || msg.body.byteLength;
ondata(msg.body); ondata(msg.body);
Logger.info('jensen', 'transfer', `${flen} / ${length}`);
// Logger.info('jensen', 'getFile length', `${length} ${flen}`); // Logger.info('jensen', 'getFile length', `${length} ${flen}`);
if (flen >= length) { if (flen >= length) {
// document.removeEventListener('visibilitychange', visibilitychange); // document.removeEventListener('visibilitychange', visibilitychange);
...@@ -1077,7 +1094,9 @@ Jensen.prototype.getFile = async function (filename, length, ondata, onprogress) ...@@ -1077,7 +1094,9 @@ Jensen.prototype.getFile = async function (filename, length, ondata, onprogress)
this.onreceive = function(recvBytes) this.onreceive = function(recvBytes)
{ {
let percent = Math.floor(recvBytes / length * 1000); let percent = Math.floor(recvBytes / length * 1000);
percent = Math.min(1000, percent);
let k = 't' + percent; let k = 't' + percent;
Logger.info('jensen', 'transfer', (percent / 10).toFixed(1) + '%');
if (percent > 0 && percent < 1000) if (percent > 0 && percent < 1000)
{ {
if (!(k in self._progress_report)) onprogress?.(recvBytes); if (!(k in self._progress_report)) onprogress?.(recvBytes);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment