From 3811b0412ef0e5f60c3bfd24df32f4755c538b81 Mon Sep 17 00:00:00 2001 From: Mark Bumiller Date: Tue, 12 Nov 2024 19:21:57 -0500 Subject: [PATCH] support converting minute resolution (#189) there was lots of code where we manually appended seconds. Do this in the method so it's not repeated everywhere --- lib/DateTimeUtils.ts | 5 ++++- lib/plugins/Label_10_Slash.ts | 6 +++--- lib/plugins/Label_1L_070.ts | 4 ++-- lib/plugins/Label_1L_3-line.ts | 2 +- lib/plugins/Label_1L_Slash.ts | 2 +- lib/plugins/Label_22_OFF.ts | 10 +++++----- lib/plugins/Label_24_Slash.ts | 2 +- lib/plugins/Label_30_Slash_EA.ts | 2 +- lib/plugins/Label_5Z_Slash.ts | 2 +- lib/plugins/Label_8E.ts | 2 +- lib/plugins/Label_H1_StarPOS.test.ts | 18 +++++++++++------- lib/plugins/Label_H1_StarPOS.ts | 6 +++--- lib/plugins/Label_QP.ts | 2 +- lib/plugins/Label_QR.ts | 2 +- lib/plugins/Label_QS.ts | 2 +- lib/utils/h1_helper.ts | 4 ++-- lib/utils/result_formatter.ts | 14 ++++++++++++-- 17 files changed, 51 insertions(+), 34 deletions(-) diff --git a/lib/DateTimeUtils.ts b/lib/DateTimeUtils.ts index 0bd921c..efb75f1 100644 --- a/lib/DateTimeUtils.ts +++ b/lib/DateTimeUtils.ts @@ -26,10 +26,13 @@ export class DateTimeUtils { /** * - * @param time HHMMSS + * @param time HHMMSS or HHMM * @returns seconds since midnight */ public static convertHHMMSSToTod(time: string): number { + if(time.length === 4) { // add seconds if not present + time += '00'; + } const h = Number(time.substring(0, 2)); const m = Number(time.substring(2, 4)); const s = Number(time.substring(4, 6)); diff --git a/lib/plugins/Label_10_Slash.ts b/lib/plugins/Label_10_Slash.ts index 262c47b..62c3f59 100644 --- a/lib/plugins/Label_10_Slash.ts +++ b/lib/plugins/Label_10_Slash.ts @@ -42,16 +42,16 @@ export class Label_10_Slash extends DecoderPlugin { // eslint-disable-line camel ResultFormatter.heading(decodeResult, Number(parts[5])); ResultFormatter.altitude(decodeResult, 100*Number(parts[6])); ResultFormatter.arrivalAirport(decodeResult, parts[7]); - ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[8]+'00')); + ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[8])); const waypoints: Waypoint[] = [{ name: parts[11], },{ name: parts[12], - time: DateTimeUtils.convertHHMMSSToTod(parts[13]+'00'), + time: DateTimeUtils.convertHHMMSSToTod(parts[13]), timeFormat: 'tod', },{ name: parts[14], - time: DateTimeUtils.convertHHMMSSToTod(parts[15]+'00'), + time: DateTimeUtils.convertHHMMSSToTod(parts[15]), timeFormat: 'tod', },]; ResultFormatter.route(decodeResult, { waypoints: waypoints }); diff --git a/lib/plugins/Label_1L_070.ts b/lib/plugins/Label_1L_070.ts index ab25f67..a03b063 100644 --- a/lib/plugins/Label_1L_070.ts +++ b/lib/plugins/Label_1L_070.ts @@ -44,8 +44,8 @@ export class Label_1L_070 extends DecoderPlugin { // eslint-disable-line camelca ResultFormatter.departureAirport(decodeResult, parts[0]); ResultFormatter.arrivalAirport(decodeResult, parts[1]); - ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[2] + '00')); - ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[3] + '00')); + ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[2])); + ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[3])); ResultFormatter.position(decodeResult, { latitude: CoordinateUtils.getDirection(parts[4][0]) * Number(parts[4].substring(1)), longitude: CoordinateUtils.getDirection(parts[5][0]) * Number(parts[5].substring(1)), diff --git a/lib/plugins/Label_1L_3-line.ts b/lib/plugins/Label_1L_3-line.ts index 0ab49b2..ff14801 100644 --- a/lib/plugins/Label_1L_3-line.ts +++ b/lib/plugins/Label_1L_3-line.ts @@ -49,7 +49,7 @@ export class Label_1L_3Line extends DecoderPlugin { // eslint-disable-line camel } const eta = data.get('ETA'); if (eta) { - ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(eta + '00')); + ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(eta)); data.delete('ETA'); } const alt = data.get('ALT'); diff --git a/lib/plugins/Label_1L_Slash.ts b/lib/plugins/Label_1L_Slash.ts index be1681e..1b18351 100644 --- a/lib/plugins/Label_1L_Slash.ts +++ b/lib/plugins/Label_1L_Slash.ts @@ -65,7 +65,7 @@ export class Label_1L_Slash extends DecoderPlugin { // eslint-disable-line camel } const eta = data.get('ETA'); if (eta) { - ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(eta + '00')); + ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(eta)); data.delete('ETA'); } diff --git a/lib/plugins/Label_22_OFF.ts b/lib/plugins/Label_22_OFF.ts index a7b8a4d..de938d9 100644 --- a/lib/plugins/Label_22_OFF.ts +++ b/lib/plugins/Label_22_OFF.ts @@ -33,7 +33,7 @@ export class Label_22_OFF extends DecoderPlugin { ResultFormatter.flightNumber(decodeResult, fields[0]); ResultFormatter.departureDay(decodeResult, Number(fields[1].substring(0, 2))); // departure day ResultFormatter.arrivalDay(decodeResult, Number(fields[1].substring(2,4))); // arrival day - ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(4, 8) + '00')); //HHMM + ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(4, 8))); ResultFormatter.departureAirport(decodeResult, fields[1].substring(8, 12)); ResultFormatter.arrivalAirport(decodeResult, fields[1].substring(12, 16)); ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16,22))); @@ -52,7 +52,7 @@ export class Label_22_OFF extends DecoderPlugin { ResultFormatter.departureAirport(decodeResult, fields[0]); ResultFormatter.arrivalAirport(decodeResult, fields[1]); - ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[2] + '00')); + ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[2])); ResultFormatter.unknown(decodeResult, fields[3]); decodeResult.decoded = true; @@ -72,12 +72,12 @@ export class Label_22_OFF extends DecoderPlugin { ResultFormatter.position(decodeResult, position); } ResultFormatter.day(decodeResult, Number(fields[1].substring(14, 16))); - ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 20) + '00')); + ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 20) )); ResultFormatter.departureAirport(decodeResult, fields[1].substring(20, 24)); ResultFormatter.arrivalAirport(decodeResult, fields[1].substring(24, 28)); - ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(28, 32) + '00')); + ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(28, 32))); ResultFormatter.unknown(decodeResult, fields[1].substring(32, 36)); - ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(36,40) + '00')); + ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(36,40))); decodeResult.decoded = true; decodeResult.decoder.decodeLevel = 'partial'; diff --git a/lib/plugins/Label_24_Slash.ts b/lib/plugins/Label_24_Slash.ts index 9a69651..2fe7fd8 100644 --- a/lib/plugins/Label_24_Slash.ts +++ b/lib/plugins/Label_24_Slash.ts @@ -35,7 +35,7 @@ export class Label_24_Slash extends DecoderPlugin { longitude: (lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1)), }; ResultFormatter.position(decodeResult, position); - ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[8]+'00')); + ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[8])); ResultFormatter.unknown(decodeResult, fields[7]); decodeResult.decoded = true; diff --git a/lib/plugins/Label_30_Slash_EA.ts b/lib/plugins/Label_30_Slash_EA.ts index 5807369..f5d71a8 100644 --- a/lib/plugins/Label_30_Slash_EA.ts +++ b/lib/plugins/Label_30_Slash_EA.ts @@ -29,7 +29,7 @@ export class Label_30_Slash_EA extends DecoderPlugin { } } - ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results[0].substr(2, 4)+'00')); + ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results[0].substr(2, 4))); if (results[1].substring(0,2) === "DS") { ResultFormatter.arrivalAirport(decodeResult, results[1].substring(2, 6)); diff --git a/lib/plugins/Label_5Z_Slash.ts b/lib/plugins/Label_5Z_Slash.ts index 40283d2..46a00b9 100644 --- a/lib/plugins/Label_5Z_Slash.ts +++ b/lib/plugins/Label_5Z_Slash.ts @@ -112,7 +112,7 @@ export class Label_5Z_Slash extends DecoderPlugin { ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(airports[4])); const estimates = data[3].split(' '); - ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(estimates[1]+'00')); + ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(estimates[1])); ResultFormatter.unknown(decodeResult, estimates[2]); } else { if (options.debug) { diff --git a/lib/plugins/Label_8E.ts b/lib/plugins/Label_8E.ts index c0a719b..931cced 100644 --- a/lib/plugins/Label_8E.ts +++ b/lib/plugins/Label_8E.ts @@ -29,7 +29,7 @@ export class Label_8E extends DecoderPlugin { console.log(results.groups); } - ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results.groups.arrival_eta + '00')); + ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results.groups.arrival_eta)); ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao); } diff --git a/lib/plugins/Label_H1_StarPOS.test.ts b/lib/plugins/Label_H1_StarPOS.test.ts index d8740f0..63303db 100644 --- a/lib/plugins/Label_H1_StarPOS.test.ts +++ b/lib/plugins/Label_H1_StarPOS.test.ts @@ -24,13 +24,17 @@ describe('Label H1 *POS', () => { expect(decodeResult.raw.position.latitude).toBe(39.900000); expect(decodeResult.raw.position.longitude).toBe(-77.98333333333333); expect(decodeResult.raw.altitude).toBe(36331); - expect(decodeResult.formatted.items.length).toBe(3); - expect(decodeResult.formatted.items[0].label).toBe('Message Timestamp'); - expect(decodeResult.formatted.items[0].value).toBe('09:50:00'); - expect(decodeResult.formatted.items[1].label).toBe('Aircraft Position'); - expect(decodeResult.formatted.items[1].value).toBe('39.900 N, 77.983 W'); - expect(decodeResult.formatted.items[2].label).toBe('Altitude'); - expect(decodeResult.formatted.items[2].value).toBe('36331 feet'); + expect(decodeResult.formatted.items.length).toBe(5); + expect(decodeResult.formatted.items[0].label).toBe('Month of Year'); + expect(decodeResult.formatted.items[0].value).toBe('10'); + expect(decodeResult.formatted.items[1].label).toBe('Day of Month'); + expect(decodeResult.formatted.items[1].value).toBe('30'); + expect(decodeResult.formatted.items[2].label).toBe('Message Timestamp'); + expect(decodeResult.formatted.items[2].value).toBe('09:50:00'); + expect(decodeResult.formatted.items[3].label).toBe('Aircraft Position'); + expect(decodeResult.formatted.items[3].value).toBe('39.900 N, 77.983 W'); + expect(decodeResult.formatted.items[4].label).toBe('Altitude'); + expect(decodeResult.formatted.items[4].value).toBe('36331 feet'); expect(decodeResult.remaining.text).toBe('2045802M5230175'); }); diff --git a/lib/plugins/Label_H1_StarPOS.ts b/lib/plugins/Label_H1_StarPOS.ts index ca73e4c..7dc6b22 100644 --- a/lib/plugins/Label_H1_StarPOS.ts +++ b/lib/plugins/Label_H1_StarPOS.ts @@ -31,9 +31,9 @@ export class Label_H1_StarPOS extends DecoderPlugin { return decodeResult; } - decodeResult.raw.month = Number(msg.substring(4, 6)); - decodeResult.raw.day = Number(msg.substring(6, 8)); - ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(msg.substring(8, 12) + '00')); + ResultFormatter.month(decodeResult, Number(msg.substring(4, 6))); + ResultFormatter.day(decodeResult, Number(msg.substring(6, 8))); + ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(msg.substring(8, 12))); ResultFormatter.position(decodeResult, { // Deg Min, no sec latitude: CoordinateUtils.getDirection(msg.substring(12,13)) * (Number(msg.substring(13, 15)) + Number(msg.substring(15, 17))/60), longitude: CoordinateUtils.getDirection(msg.substring(17,18)) * (Number(msg.substring(18, 21)) + Number(msg.substring(21, 23))/60) diff --git a/lib/plugins/Label_QP.ts b/lib/plugins/Label_QP.ts index fb7429d..866778f 100644 --- a/lib/plugins/Label_QP.ts +++ b/lib/plugins/Label_QP.ts @@ -19,7 +19,7 @@ export class Label_QP extends DecoderPlugin { ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4)); ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8)); - ResultFormatter.out(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)+'00')); + ResultFormatter.out(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12))); ResultFormatter.unknown(decodeResult, message.text.substring(12)); decodeResult.decoded = true; diff --git a/lib/plugins/Label_QR.ts b/lib/plugins/Label_QR.ts index 1df2d26..9e90295 100644 --- a/lib/plugins/Label_QR.ts +++ b/lib/plugins/Label_QR.ts @@ -19,7 +19,7 @@ export class Label_QR extends DecoderPlugin { ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4)); ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8)); - ResultFormatter.on(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)+'00')); + ResultFormatter.on(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12))); ResultFormatter.unknown(decodeResult, message.text.substring(12)); decodeResult.decoded = true; diff --git a/lib/plugins/Label_QS.ts b/lib/plugins/Label_QS.ts index 9f9ba62..3d1a8dc 100644 --- a/lib/plugins/Label_QS.ts +++ b/lib/plugins/Label_QS.ts @@ -19,7 +19,7 @@ export class Label_QS extends DecoderPlugin { ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4)); ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8)); - ResultFormatter.in(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)+'00')); + ResultFormatter.in(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12))); ResultFormatter.unknown(decodeResult, message.text.substring(12)); decodeResult.decoded = true; diff --git a/lib/utils/h1_helper.ts b/lib/utils/h1_helper.ts index f5aa343..db37277 100644 --- a/lib/utils/h1_helper.ts +++ b/lib/utils/h1_helper.ts @@ -56,10 +56,10 @@ export class H1Helper { } else if (fields[i].startsWith('ET')) { if(fields[i].length === 7) { // 1 digit day ResultFormatter.day(decodeResult, Number(fields[i].substring(2, 3))); - ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[i].substring(3)+'00')); + ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[i].substring(3))); } else if(fields[i].length === 8) { // 2 digit day ResultFormatter.day(decodeResult, Number(fields[i].substring(2, 4))); - ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[i].substring(4)+'00')); + ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[i].substring(4))); } else { ResultFormatter.unknown(decodeResult, fields[i], '/'); } diff --git a/lib/utils/result_formatter.ts b/lib/utils/result_formatter.ts index d8a9e00..e63b103 100644 --- a/lib/utils/result_formatter.ts +++ b/lib/utils/result_formatter.ts @@ -11,7 +11,7 @@ import { Route } from "../types/route"; */ export class ResultFormatter { - static route(decodeResult: DecodeResult, route: Route ) { + static route(decodeResult: DecodeResult, route: Route) { decodeResult.raw.route = route; decodeResult.formatted.items.push({ type: 'aircraft_route', @@ -61,7 +61,7 @@ export class ResultFormatter { } static position(decodeResult: DecodeResult, value: { latitude: number, longitude: number } | undefined) { - if(!value || isNaN(value.latitude) || isNaN(value.longitude)) { + if (!value || isNaN(value.latitude) || isNaN(value.longitude)) { return; } decodeResult.raw.position = value; @@ -334,6 +334,16 @@ export class ResultFormatter { }); } + static month(decodeResult: DecodeResult, month: number) { + decodeResult.raw.month = month; + decodeResult.formatted.items.push({ + type: 'month_of_year', + code: 'MSG_MON', + label: 'Month of Year', + value: `${month}`, + }); + } + static departureDay(decodeResult: DecodeResult, day: number) { decodeResult.raw.departure_day = day; decodeResult.formatted.items.push({