mirror of
https://github.com/Kpa-clawbot/meshcore-analyzer.git
synced 2026-03-29 08:29:55 +00:00
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:
@@ -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)
|
||||
|
||||
@@ -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'; }
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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));
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user