From 848720ee6c7facf003273ce64c229713f4c5f99c Mon Sep 17 00:00:00 2001 From: Mark Bumiller Date: Fri, 30 Jan 2026 16:18:57 -0500 Subject: [PATCH 1/2] Fix H1 parsing * Add Version * Fix /FB * Fix /CG --- lib/plugins/Label_1J_2J_FTX.test.ts | 7 ++--- lib/plugins/Label_2P_POS.test.ts | 7 ++--- lib/plugins/Label_H1_POS.test.ts | 12 +++++---- lib/utils/h1_helper.ts | 25 ++++++++++++----- lib/utils/result_formatter.ts | 42 +++++++++++++++++++++++++++++ 5 files changed, 75 insertions(+), 18 deletions(-) diff --git a/lib/plugins/Label_1J_2J_FTX.test.ts b/lib/plugins/Label_1J_2J_FTX.test.ts index f13a1d1..8b3183b 100644 --- a/lib/plugins/Label_1J_2J_FTX.test.ts +++ b/lib/plugins/Label_1J_2J_FTX.test.ts @@ -43,11 +43,12 @@ describe('Label 1J/2J FTX', () => { expect(decodeResult.raw.flight_number).toBe('RCH4086'); expect(decodeResult.raw.mission_number).toBe('ABB02R70E037'); expect(decodeResult.raw.message_timestamp).toBe(1759367848); - expect(decodeResult.raw.fuel_burned).toBe(1791); + expect(decodeResult.raw.fuel_on_board).toBe(1791); expect(decodeResult.raw.freetext).toBe('GOOD EVENING PLEASE PASS US THE SUPER BOWL SCORE WHEN ABLE. THANK YOU'); + expect(decodeResult.raw.version).toBe(3.2); expect(decodeResult.raw.checksum).toBe(0x8D70); - expect(decodeResult.formatted.items.length).toBe(5); - expect(decodeResult.remaining.text).toBe('M74/MR049,/VR032'); + expect(decodeResult.formatted.items.length).toBe(6); + expect(decodeResult.remaining.text).toBe('M74/MR049,'); }); test('decodes ', () => { diff --git a/lib/plugins/Label_2P_POS.test.ts b/lib/plugins/Label_2P_POS.test.ts index 0fe5b14..3a1e3ed 100644 --- a/lib/plugins/Label_2P_POS.test.ts +++ b/lib/plugins/Label_2P_POS.test.ts @@ -30,10 +30,11 @@ describe('Label_2P Preamble POS', () => { expect(decodeResult.raw.route.waypoints[0].time).toBe(19084); expect(decodeResult.raw.route.waypoints[2].name).toBe('?'); expect(decodeResult.raw.altitude).toBe(35000); - expect(decodeResult.raw.fuel_burned).toBe(857); + expect(decodeResult.raw.fuel_on_board).toBe(857); + expect(decodeResult.raw.version).toBe(3.2); expect(decodeResult.raw.checksum).toBe(0x2b89); - expect(decodeResult.formatted.items.length).toBe(11); - expect(decodeResult.remaining.text).toBe('M80/MR103,,084081,,/VR032'); + expect(decodeResult.formatted.items.length).toBe(10); + expect(decodeResult.remaining.text).toBe('M80/MR103,,084081,'); }); test('', () => { diff --git a/lib/plugins/Label_H1_POS.test.ts b/lib/plugins/Label_H1_POS.test.ts index e222586..b3bf7b0 100644 --- a/lib/plugins/Label_H1_POS.test.ts +++ b/lib/plugins/Label_H1_POS.test.ts @@ -295,12 +295,14 @@ describe('Label_H1 POS', () => { expect(decodeResult.raw.route.waypoints[1].name).toBe('WEDAK'); expect(decodeResult.raw.route.waypoints[1].time).toBe(11879); expect(decodeResult.raw.route.waypoints[2].name).toBe('?'); - expect(decodeResult.raw.mac).toBe(26.4); - expect(decodeResult.raw.trim).toBe(1.1); - expect(decodeResult.raw.fuel_burned).toBe(742); + expect(decodeResult.raw.center_of_gravity).toBe(26.4); + expect(decodeResult.raw.cg_lower_limit).toBe(11.0); + expect(decodeResult.raw.cg_upper_limit).toBe(36.0); + expect(decodeResult.raw.fuel_on_board).toBe(742); + expect(decodeResult.raw.version).toBe(3.2); expect(decodeResult.raw.checksum).toBe(0x4e17); - expect(decodeResult.formatted.items.length).toBe(12); - expect(decodeResult.remaining.text).toBe('F37A#M1B/MR1,,267070,T468,360/VR32'); + expect(decodeResult.formatted.items.length).toBe(14); + expect(decodeResult.remaining.text).toBe('F37A#M1B/MR1,,267070,T468'); }); test('variant 8', () => { diff --git a/lib/utils/h1_helper.ts b/lib/utils/h1_helper.ts index 6049653..85c1f82 100644 --- a/lib/utils/h1_helper.ts +++ b/lib/utils/h1_helper.ts @@ -46,7 +46,7 @@ export class H1Helper { processETA(data, decodeResult, fields, i); break; case 'FB': - ResultFormatter.burnedFuel(decodeResult, parseInt(data, 10)); + ResultFormatter.currentFuel(decodeResult, parseInt(data, 10)); break; case 'FN': decodeResult.raw.flight_number = data; @@ -78,13 +78,16 @@ export class H1Helper { decodeResult.raw.serial_number = data; break; case 'TD': - processTimeOfDeparture(decodeResult, data.split(',')); // Strip off TD + processTimeOfDeparture(decodeResult, data.split(',')); break; case 'TS': H1Helper.processTimeStamp(decodeResult, data.split(',')); break; + case 'VR': + ResultFormatter.version(decodeResult, parseInt(data, 10)/10); + break; case 'WD': - processWindData(decodeResult, data); // Strip off WD + processWindData(decodeResult, data); break; default: ResultFormatter.unknown(decodeResult, fields[i], '/'); @@ -242,11 +245,19 @@ function processLandingReport(decodeResult: DecodeResult, data: string[]) { function processCenterOfGravity(decodeResult: DecodeResult, data: string[]) { if(data.length === 1) { - ResultFormatter.mac(decodeResult, parseInt(data[0], 10) / 10); + if(!!data) { + ResultFormatter.cg(decodeResult, parseInt(data[0], 10) / 10); + } } else if (data.length === 3) { - ResultFormatter.mac(decodeResult, parseInt(data[0], 10) / 10); - ResultFormatter.trim(decodeResult, parseInt(data[1], 10) / 100); - ResultFormatter.unknown(decodeResult, data[2],','); + if(!!data[0]) { + ResultFormatter.cg(decodeResult, parseInt(data[0], 10) / 10, 'center'); + } + if(!!data[1]) { + ResultFormatter.cg(decodeResult, parseInt(data[1], 10) / 10, 'lower'); + } + if(!!data[2]) { + ResultFormatter.cg(decodeResult, parseInt(data[2], 10) / 10, 'upper'); + } } else { ResultFormatter.unknown(decodeResult, data.join(',')); diff --git a/lib/utils/result_formatter.ts b/lib/utils/result_formatter.ts index 0d27b4e..c6245c8 100644 --- a/lib/utils/result_formatter.ts +++ b/lib/utils/result_formatter.ts @@ -459,6 +459,48 @@ export class ResultFormatter { } } + static cg(decodeResult: DecodeResult, value: number, type: "center" | "lower" | "upper" = "center") { + switch(type) { + case "center": + decodeResult.raw.center_of_gravity = value; + decodeResult.formatted.items.push({ + type: "center_of_gravity", + code: "CG", + label: "Center of Gravity", + value: `${decodeResult.raw.center_of_gravity} %`, + }); + break; + case "lower": + decodeResult.raw.cg_lower_limit = value; + decodeResult.formatted.items.push({ + type: "cg_lower_limit", + code: "CG_LOWER", + label: "Center of Gravity Lower Limit", + value: `${decodeResult.raw.cg_lower_limit} %`, + }); + break; + case "upper": + decodeResult.raw.cg_upper_limit = value; + decodeResult.formatted.items.push({ + type: "cg_upper_limit", + code: "CG_UPPER", + label: "Center of Gravity Upper Limit", + value: `${decodeResult.raw.cg_upper_limit} %`, + }); + break; + } + } + + static version(decodeResult: DecodeResult, value: number) { + decodeResult.raw.version = value; + decodeResult.formatted.items.push({ + type: "version", + code: "VERSION", + label: "Message Version", + value: `v${decodeResult.raw.version.toFixed(1)}`, + }); + } + static unknown(decodeResult: DecodeResult, value: string, sep: string = ',') { if (!decodeResult.remaining.text) decodeResult.remaining.text = value; From 4a837000644e492f89fcfecca66402a8e50587a1 Mon Sep 17 00:00:00 2001 From: Mark Bumiller Date: Fri, 30 Jan 2026 16:23:06 -0500 Subject: [PATCH 2/2] feedback --- lib/utils/h1_helper.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/utils/h1_helper.ts b/lib/utils/h1_helper.ts index 85c1f82..43a1239 100644 --- a/lib/utils/h1_helper.ts +++ b/lib/utils/h1_helper.ts @@ -245,17 +245,17 @@ function processLandingReport(decodeResult: DecodeResult, data: string[]) { function processCenterOfGravity(decodeResult: DecodeResult, data: string[]) { if(data.length === 1) { - if(!!data) { + if(data[0] !== undefined && data[0] !== '') { ResultFormatter.cg(decodeResult, parseInt(data[0], 10) / 10); } } else if (data.length === 3) { - if(!!data[0]) { + if(data[0] !== undefined && data[0] !== '') { ResultFormatter.cg(decodeResult, parseInt(data[0], 10) / 10, 'center'); } - if(!!data[1]) { + if(data[1] !== undefined && data[1] !== '') { ResultFormatter.cg(decodeResult, parseInt(data[1], 10) / 10, 'lower'); } - if(!!data[2]) { + if(data[2] !== undefined && data[2] !== '') { ResultFormatter.cg(decodeResult, parseInt(data[2], 10) / 10, 'upper'); }