sync prod -> git

This commit is contained in:
recrof 2026-01-10 23:15:50 +01:00
parent 4d696db87f
commit ea3dae33dc
74 changed files with 4313 additions and 1073 deletions

View file

@ -1,6 +1,7 @@
function delay(msecs) {
return new Promise((resolve) => setTimeout(resolve, msecs));
}
class LineBreakTransformer {
chunks = '';
port = null;

View file

@ -80,7 +80,30 @@ function calcCrc16(data, crc = 0xFFFF) {
}
function sleep(milliseconds) {
return new Promise((resolve) => setTimeout(resolve, milliseconds))
return new Promise((resolve) => {
const startTime = performance.now();
const targetTime = startTime + milliseconds;
function checkTime() {
if (performance.now() >= targetTime) {
resolve();
} else {
requestAnimationFrame(checkTime);
}
}
const initialDelay = Math.max(0, milliseconds - 16); // Wake up ~1 frame early to start polling
if (initialDelay > 0) {
setTimeout(() => {
// Now start the more precise polling
checkTime();
}, initialDelay);
} else {
// If the desired sleep is very short, go straight to polling
checkTime();
}
});
}
// --- HciPacket Class (adapted from dfu/dfu_transport_serial.py) ---
@ -128,6 +151,29 @@ export class Dfu {
this.eraseBeforeUpdate = eraseBeforeUpdate; // Store the erase flag
}
getReader() {
const reader = this.port.readable.getReader();
return {
read() {
return new Promise((resolve, reject) => {
const timeoutHandle = setTimeout(() => {
reader.releaseLock();
reject(new Error("Read timeout"));
}, DEFAULT_SERIAL_PORT_TIMEOUT * 1000 * 5)
reader.read().then(result => {
clearTimeout(timeoutHandle);
resolve(result);
});
});
},
releaseLock() {
return reader.releaseLock();
}
}
}
async sendPacket(pkt) {
if (!this.port || !this.port.writable) {
throw new Error("Serial port not open or not writable.");
@ -149,7 +195,7 @@ export class Dfu {
throw new Error("Serial port not open or not readable.");
}
const reader = this.port.readable.getReader();
const reader = this.getReader();
let buffer = [];
let c0Count = 0;
@ -169,13 +215,12 @@ export class Dfu {
}
}
}
if (Date.now() - startTime > DEFAULT_SERIAL_PORT_TIMEOUT * 1000 * 5) { // Increased timeout for safety
HciPacket.sequenceNumber = 0; // Reset sequence number on timeout.
throw new Error("Timeout waiting for ACK.");
}
}
} finally {
}
catch(e) {
HciPacket.sequenceNumber = 0;
}
finally {
reader.releaseLock();
}
// Decode SLIP
@ -216,7 +261,7 @@ export class Dfu {
} else if (data[i] === 0xC0) {
// Ignore 0xC0 (start/end of packet)
}
else {
else {
result.push(data[i]);
}
i++;

File diff suppressed because one or more lines are too long