Better connection handling, CSS

This commit is contained in:
2026-03-01 18:38:06 +01:00
parent 0ad07ac8ce
commit b8e3658f66
2 changed files with 85 additions and 57 deletions
+42 -14
View File
@@ -215,14 +215,28 @@ async function doReset() {
// float temp [12], float biasRms [16]
// uint16 recalCount [20], uint8 chargeStatus [22], uint8 pad [23]
function parseTelemetry(dv) {
const view = new DataView(dv.buffer ?? dv);
const uptime = view.getUint32(0, true);
const leftClicks = view.getUint32(4, true);
const rightClicks = view.getUint32(8, true);
const temp = view.getFloat32(12,true);
const biasRms = view.getFloat32(16,true);
const recalCount = view.getUint16(20, true);
const chargeStatus= view.getUint8(22);
let view;
try {
view = dv instanceof DataView ? new DataView(dv.buffer, dv.byteOffset, dv.byteLength) : new DataView(dv);
} catch(e) { log(`parseTelemetry: DataView wrap failed — ${e.message}`,'err'); return; }
if (view.byteLength < 24) {
const bytes = new Uint8Array(view.buffer, view.byteOffset, view.byteLength);
const hex = Array.from(bytes).map(b=>b.toString(16).padStart(2,'0')).join(' ');
log(`TELEM: expected 24B, got ${view.byteLength}B — MTU too small? raw: ${hex}`,'err');
return;
}
let uptime, leftClicks, rightClicks, temp, biasRms, recalCount, chargeStatus;
try {
uptime = view.getUint32(0, true);
leftClicks = view.getUint32(4, true);
rightClicks = view.getUint32(8, true);
temp = view.getFloat32(12,true);
biasRms = view.getFloat32(16,true);
recalCount = view.getUint16(20, true);
chargeStatus= view.getUint8(22);
} catch(e) { log(`parseTelemetry: parse error at offset — ${e.message}`,'err'); return; }
document.getElementById('telTemp').textContent = temp.toFixed(1)+'°';
document.getElementById('telUptime').textContent = formatUptime(uptime);
@@ -342,12 +356,26 @@ const TRAIL_LEN = 120;
let cursorX = canvas.width/2, cursorY = canvas.height/2, trail = [];
function parseImuStream(dv) {
const view = new DataView(dv.buffer ?? dv);
const gyroY = view.getInt16(0, true);
const gyroZ = view.getInt16(2, true);
const moveX = view.getInt8(10);
const moveY = view.getInt8(11);
const flags = view.getUint8(12);
let view;
try {
view = dv instanceof DataView ? new DataView(dv.buffer, dv.byteOffset, dv.byteLength) : new DataView(dv);
} catch(e) { log(`parseImuStream: DataView wrap failed — ${e.message}`,'err'); return; }
if (view.byteLength < 14) {
const bytes = new Uint8Array(view.buffer, view.byteOffset, view.byteLength);
const hex = Array.from(bytes).map(b=>b.toString(16).padStart(2,'0')).join(' ');
log(`IMU raw (${view.byteLength}B, expected 14): ${hex}`,'err');
return;
}
let gyroY, gyroZ, moveX, moveY, flags;
try {
gyroY = view.getInt16(0, true);
gyroZ = view.getInt16(2, true);
moveX = view.getInt8(10);
moveY = view.getInt8(11);
flags = view.getUint8(12);
} catch(e) { log(`parseImuStream: parse error — ${e.message}`,'err'); return; }
const idle = !!(flags & 0x01);
const single = !!(flags & 0x02);
const dbl = !!(flags & 0x04);