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.
This commit is contained in:
you
2026-03-24 01:23:12 +00:00
parent 909b53c2b7
commit 5b496a8235
5 changed files with 33 additions and 29 deletions

View File

@@ -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)

View File

@@ -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'; }

View File

@@ -22,9 +22,9 @@
<meta name="twitter:title" content="MeshCore Analyzer">
<meta name="twitter:description" content="Real-time MeshCore LoRa mesh network analyzer — live packet visualization, node tracking, channel decryption, and route analysis.">
<meta name="twitter:image" content="https://raw.githubusercontent.com/Kpa-clawbot/meshcore-analyzer/master/public/og-image.png">
<link rel="stylesheet" href="style.css?v=1774308178">
<link rel="stylesheet" href="home.css?v=1774308178">
<link rel="stylesheet" href="live.css?v=1774308178">
<link rel="stylesheet" href="style.css?v=1774315381">
<link rel="stylesheet" href="home.css?v=1774315381">
<link rel="stylesheet" href="live.css?v=1774315381">
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"
integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY="
crossorigin="anonymous">
@@ -81,27 +81,27 @@
<main id="app" role="main"></main>
<script src="vendor/qrcode.js"></script>
<script src="roles.js?v=1774308178"></script>
<script src="customize.js?v=1774308178" onerror="console.error('Failed to load:', this.src)"></script>
<script src="region-filter.js?v=1774308178"></script>
<script src="hop-resolver.js?v=1774308178"></script>
<script src="hop-display.js?v=1774308178"></script>
<script src="app.js?v=1774308178"></script>
<script src="home.js?v=1774308178"></script>
<script src="packet-filter.js?v=1774308178"></script>
<script src="packets.js?v=1774308178"></script>
<script src="map.js?v=1774308178" onerror="console.error('Failed to load:', this.src)"></script>
<script src="channels.js?v=1774308178" onerror="console.error('Failed to load:', this.src)"></script>
<script src="nodes.js?v=1774308178" onerror="console.error('Failed to load:', this.src)"></script>
<script src="traces.js?v=1774308178" onerror="console.error('Failed to load:', this.src)"></script>
<script src="analytics.js?v=1774308178" onerror="console.error('Failed to load:', this.src)"></script>
<script src="audio.js?v=1774308178" onerror="console.error('Failed to load:', this.src)"></script>
<script src="audio-v1-constellation.js?v=1774308178" onerror="console.error('Failed to load:', this.src)"></script>
<script src="audio-lab.js?v=1774308178" onerror="console.error('Failed to load:', this.src)"></script>
<script src="live.js?v=1774308178" onerror="console.error('Failed to load:', this.src)"></script>
<script src="observers.js?v=1774308178" onerror="console.error('Failed to load:', this.src)"></script>
<script src="observer-detail.js?v=1774308178" onerror="console.error('Failed to load:', this.src)"></script>
<script src="node-analytics.js?v=1774308178" onerror="console.error('Failed to load:', this.src)"></script>
<script src="perf.js?v=1774308178" onerror="console.error('Failed to load:', this.src)"></script>
<script src="roles.js?v=1774315381"></script>
<script src="customize.js?v=1774315381" onerror="console.error('Failed to load:', this.src)"></script>
<script src="region-filter.js?v=1774315381"></script>
<script src="hop-resolver.js?v=1774315381"></script>
<script src="hop-display.js?v=1774315381"></script>
<script src="app.js?v=1774315381"></script>
<script src="home.js?v=1774315381"></script>
<script src="packet-filter.js?v=1774315381"></script>
<script src="packets.js?v=1774315381"></script>
<script src="map.js?v=1774315381" onerror="console.error('Failed to load:', this.src)"></script>
<script src="channels.js?v=1774315381" onerror="console.error('Failed to load:', this.src)"></script>
<script src="nodes.js?v=1774315381" onerror="console.error('Failed to load:', this.src)"></script>
<script src="traces.js?v=1774315381" onerror="console.error('Failed to load:', this.src)"></script>
<script src="analytics.js?v=1774315381" onerror="console.error('Failed to load:', this.src)"></script>
<script src="audio.js?v=1774315381" onerror="console.error('Failed to load:', this.src)"></script>
<script src="audio-v1-constellation.js?v=1774315381" onerror="console.error('Failed to load:', this.src)"></script>
<script src="audio-lab.js?v=1774315381" onerror="console.error('Failed to load:', this.src)"></script>
<script src="live.js?v=1774315381" onerror="console.error('Failed to load:', this.src)"></script>
<script src="observers.js?v=1774315381" onerror="console.error('Failed to load:', this.src)"></script>
<script src="observer-detail.js?v=1774315381" onerror="console.error('Failed to load:', this.src)"></script>
<script src="node-analytics.js?v=1774315381" onerror="console.error('Failed to load:', this.src)"></script>
<script src="perf.js?v=1774315381" onerror="console.error('Failed to load:', this.src)"></script>
</body>
</html>

View File

@@ -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)

View File

@@ -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));
});