Commit dc6bfc7a authored by martin hou's avatar martin hou

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

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