From 08997c710941cfb5b652047ac35265b461d103be Mon Sep 17 00:00:00 2001 From: alkadienePhoton Date: Sat, 21 Mar 2026 12:44:27 -0500 Subject: [PATCH] Test --- main.html | 46 ++++++++++++++++++++++++++++++++++++++-------- main.mpy | Bin 0 -> 391 bytes main.py | 4 +++- main2.mpy | Bin 0 -> 360 bytes 4 files changed, 41 insertions(+), 9 deletions(-) create mode 100644 main.mpy create mode 100644 main2.mpy diff --git a/main.html b/main.html index 4f2972e..dadac68 100644 --- a/main.html +++ b/main.html @@ -59,8 +59,10 @@ const CAPABILITIES_UUID = 'c5f50003-8280-46da-89f4-6d8051e4aeef'; // Command codes - const CMD_WRITE_USER_PROGRAM_META = 0x06; - const CMD_WRITE_USER_RAM = 0x03; + const CMD_WRITE_USER_PROGRAM_META = 0x06; // ✅ correct + const CMD_WRITE_USER_PROGRAM = 0x07; // writes to FLASH (button runnable) + const CMD_WRITE_USER_RAM = 0x03; // writes to RAM only + const CMD_START_USER_PROGRAM = 0x01; // triggers run immediately let device, server, cmdChar, maxDataSize = 20; @@ -125,6 +127,17 @@ } } + function crc32(buf) { + let crc = 0xFFFFFFFF; + for (let i = 0; i < buf.length; i++) { + crc ^= buf[i]; + for (let j = 0; j < 8; j++) { + crc = (crc >>> 1) ^ (crc & 1 ? 0xEDB88320 : 0); + } + } + return (crc ^ 0xFFFFFFFF) >>> 0; + } + async function upload() { try { const resp = await fetch('./main.mpy'); @@ -134,23 +147,31 @@ log(`Uploading ${mpy.length} bytes...`); setStatus('Uploading...'); - // Write program metadata: cmd(1) + size(4 LE) + // 1. Metadata const meta = new Uint8Array(5); - meta[0] = CMD_WRITE_USER_PROGRAM_META; + meta[0] = 0x06; // CMD_WRITE_USER_PROGRAM_META new DataView(meta.buffer).setUint32(1, mpy.length, true); await cmdChar.writeValueWithResponse(meta); - // Write program data in chunks: cmd(1) + offset(4 LE) + data - const chunkSize = maxDataSize - 5; // 1 byte cmd + 4 bytes offset + // 2. Flash chunks + const chunkSize = maxDataSize - 5; for (let offset = 0; offset < mpy.length; offset += chunkSize) { const chunk = mpy.slice(offset, offset + chunkSize); const packet = new Uint8Array(5 + chunk.length); - packet[0] = CMD_WRITE_USER_RAM; + packet[0] = 0x07; // CMD_WRITE_USER_PROGRAM (flash) new DataView(packet.buffer).setUint32(1, offset, true); packet.set(chunk, 5); await cmdChar.writeValueWithResponse(packet); } + // 3. Checksum + const checksum = crc32(mpy); + const cksPacket = new Uint8Array(5); + cksPacket[0] = 0x08; // CMD_WRITE_USER_PROGRAM_CHECKSUM + new DataView(cksPacket.buffer).setUint32(1, checksum, true); + await cmdChar.writeValueWithResponse(cksPacket); + log(`Checksum: 0x${checksum.toString(16)}`); + setStatus('Upload complete'); log('Upload complete. Press the hub button to run.'); } catch (e) { @@ -158,7 +179,16 @@ log('Error: ' + e.message); } } - + function onNotify(event) { + const data = new Uint8Array(event.target.value.buffer); + if (data[0] === 0x01) { + log('[stdout] ' + new TextDecoder().decode(data.slice(1))); + } else if (data[0] === 0x00) { + log('[status] Hub status code: ' + data[1]); // 0x00 = idle, etc. + } else { + log('[event 0x' + data[0].toString(16) + '] ' + Array.from(data).join(',')); + } + } async function disconnect() { if (device && device.gatt.connected) { device.gatt.disconnect(); diff --git a/main.mpy b/main.mpy new file mode 100644 index 0000000000000000000000000000000000000000..a54675fbd14cd36aa7ef23ef17dec868b77eb554 GIT binary patch literal 391 zcmeZeW02=z;LAGSf3k7+CW27`WVnTwVPb*nlQ6w0H>c zFzV>&sOdHcFljMLGs`fEF-0~AumIVtGAv>&KsFnY%`U?x#uh2aWWpfEEyyj*A;Kxh jBFtsR7%9l6)Sh9&7#Wznmw|yHJ|5)u_;?22q3ja?=OtcO literal 0 HcmV?d00001 diff --git a/main.py b/main.py index d19b432..ede11d0 100644 --- a/main.py +++ b/main.py @@ -1,4 +1,6 @@ from pybricks.hubs import PrimeHub from pybricks.parameters import Color +from pybricks.tools import wait hub = PrimeHub() -hub.light.on(Color.GREEN) \ No newline at end of file +hub.light.on(Color.GREEN) +wait(1000) \ No newline at end of file diff --git a/main2.mpy b/main2.mpy new file mode 100644 index 0000000000000000000000000000000000000000..5cb11f61519c5129656b7bf9a7eab6a10fbaa07d GIT binary patch literal 360 zcmbQpz`zh6pPQJO7az~y%f=wj#lQ#R=@nEm@CyVKW#*=OlqNAq6;vh_WhQ4A>t&QC z6*F)-=jY@XF{r^s3lfVGb5l!Fi-2-DnduoN3@rJ13|#I(uC9IzY(PB>%@P6}j5<1M z4FXJBjMB_9Okzxt4FW7cHmeMa7)zuelL>=n+Urgi!g^7V`O0RUUb*-Q0h94 z^2E#%1{t`+OY-w`aJsq0Lx2b9W*s$MT&`{qU<3MqU4~7J4dMfCL2h9V5l)~FxPU$o MWK(L-Fah}l0Jz&$pa1{> literal 0 HcmV?d00001