From 5b496a82353363667e49fa7d058715babdfad3b0 Mon Sep 17 00:00:00 2001 From: you Date: Tue, 24 Mar 2026 01:23:12 +0000 Subject: [PATCH] feat: add missing payload types from firmware spec Added GRP_DATA (0x06), MULTIPART (0x0A), CONTROL (0x0B), RAW_CUSTOM (0x0F) to decoder.js, app.js display names, and packet-filter.js. Source: firmware/src/Packet.h PAYLOAD_TYPE definitions. --- decoder.js | 4 ++++ public/app.js | 2 +- public/index.html | 50 ++++++++++++++++++++--------------------- public/packet-filter.js | 4 ++-- test-decoder.js | 2 +- 5 files changed, 33 insertions(+), 29 deletions(-) diff --git a/decoder.js b/decoder.js index 57f8f37..6a835ea 100644 --- a/decoder.js +++ b/decoder.js @@ -33,9 +33,13 @@ const PAYLOAD_TYPES = { 0x03: 'ACK', 0x04: 'ADVERT', 0x05: 'GRP_TXT', + 0x06: 'GRP_DATA', 0x07: 'ANON_REQ', 0x08: 'PATH', 0x09: 'TRACE', + 0x0A: 'MULTIPART', + 0x0B: 'CONTROL', + 0x0F: 'RAW_CUSTOM', }; // Route types that carry transport codes (nextHop + lastHop, 2 bytes each) diff --git a/public/app.js b/public/app.js index 1ce959b..b37d1b2 100644 --- a/public/app.js +++ b/public/app.js @@ -3,7 +3,7 @@ // --- Route/Payload name maps --- const ROUTE_TYPES = { 0: 'TRANSPORT_FLOOD', 1: 'FLOOD', 2: 'DIRECT', 3: 'TRANSPORT_DIRECT' }; -const PAYLOAD_TYPES = { 0: 'Request', 1: 'Response', 2: 'Direct Msg', 3: 'ACK', 4: 'Advert', 5: 'Channel Msg', 7: 'Anon Req', 8: 'Path', 9: 'Trace', 11: 'Control' }; +const PAYLOAD_TYPES = { 0: 'Request', 1: 'Response', 2: 'Direct Msg', 3: 'ACK', 4: 'Advert', 5: 'Channel Msg', 6: 'Group Data', 7: 'Anon Req', 8: 'Path', 9: 'Trace', 10: 'Multipart', 11: 'Control', 15: 'Raw Custom' }; const PAYLOAD_COLORS = { 0: 'req', 1: 'response', 2: 'txt-msg', 3: 'ack', 4: 'advert', 5: 'grp-txt', 7: 'anon-req', 8: 'path', 9: 'trace' }; function routeTypeName(n) { return ROUTE_TYPES[n] || 'UNKNOWN'; } diff --git a/public/index.html b/public/index.html index 8dc5199..2b46828 100644 --- a/public/index.html +++ b/public/index.html @@ -22,9 +22,9 @@ - - - + + + @@ -81,27 +81,27 @@
- - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/packet-filter.js b/public/packet-filter.js index 980c672..e44512c 100644 --- a/public/packet-filter.js +++ b/public/packet-filter.js @@ -6,9 +6,9 @@ // Local copies of type maps (also available as window globals from app.js) // Standard firmware payload type names (canonical) - var FW_PAYLOAD_TYPES = { 0: 'REQ', 1: 'RESPONSE', 2: 'TXT_MSG', 3: 'ACK', 4: 'ADVERT', 5: 'GRP_TXT', 7: 'ANON_REQ', 8: 'PATH', 9: 'TRACE', 11: 'CONTROL' }; + var FW_PAYLOAD_TYPES = { 0: 'REQ', 1: 'RESPONSE', 2: 'TXT_MSG', 3: 'ACK', 4: 'ADVERT', 5: 'GRP_TXT', 6: 'GRP_DATA', 7: 'ANON_REQ', 8: 'PATH', 9: 'TRACE', 10: 'MULTIPART', 11: 'CONTROL', 15: 'RAW_CUSTOM' }; // Aliases: display names → firmware names (for user convenience) - var TYPE_ALIASES = { 'request': 'REQ', 'response': 'RESPONSE', 'direct msg': 'TXT_MSG', 'dm': 'TXT_MSG', 'ack': 'ACK', 'advert': 'ADVERT', 'channel msg': 'GRP_TXT', 'channel': 'GRP_TXT', 'anon req': 'ANON_REQ', 'path': 'PATH', 'trace': 'TRACE', 'control': 'CONTROL' }; + var TYPE_ALIASES = { 'request': 'REQ', 'response': 'RESPONSE', 'direct msg': 'TXT_MSG', 'dm': 'TXT_MSG', 'ack': 'ACK', 'advert': 'ADVERT', 'channel msg': 'GRP_TXT', 'channel': 'GRP_TXT', 'group data': 'GRP_DATA', 'anon req': 'ANON_REQ', 'path': 'PATH', 'trace': 'TRACE', 'multipart': 'MULTIPART', 'control': 'CONTROL', 'raw': 'RAW_CUSTOM', 'custom': 'RAW_CUSTOM' }; var ROUTE_TYPES = { 0: 'TRANSPORT_FLOOD', 1: 'FLOOD', 2: 'DIRECT', 3: 'TRANSPORT_DIRECT' }; // Use window globals if available (they may have more types) diff --git a/test-decoder.js b/test-decoder.js index 3ef8b41..2d5a6f0 100644 --- a/test-decoder.js +++ b/test-decoder.js @@ -12,7 +12,7 @@ function test(name, fn) { // === Constants === console.log('\n=== Constants ==='); test('ROUTE_TYPES has 4 entries', () => assert.strictEqual(Object.keys(ROUTE_TYPES).length, 4)); -test('PAYLOAD_TYPES has 9 entries', () => assert.strictEqual(Object.keys(PAYLOAD_TYPES).length, 9)); +test('PAYLOAD_TYPES has 13 entries', () => assert.strictEqual(Object.keys(PAYLOAD_TYPES).length, 13)); test('VALID_ROLES has repeater, companion, room, sensor', () => { for (const r of ['repeater', 'companion', 'room', 'sensor']) assert(VALID_ROLES.has(r)); });