Skip to content

Commit

Permalink
Add Label 24 / Parsing (#166)
Browse files Browse the repository at this point in the history
also normalizing results
- eta can be seconds in day (tod) or seconds since epoch
- airports can be icao or iata
  • Loading branch information
makrsmark authored Oct 22, 2024
1 parent d128091 commit 811f55a
Show file tree
Hide file tree
Showing 13 changed files with 124 additions and 124 deletions.
32 changes: 19 additions & 13 deletions lib/plugins/Label_1M_Slash.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ test('decodes Label 8E sample 1', () => {

const text = '/BA0843/ETA01/230822/LDSP/EGLL/EGSS/2JK0\n1940/EGLL27L/10';
const decodeResult = decoderPlugin.decode({ text: text });

expect(decodeResult.decoded).toBe(true);
expect(decodeResult.decoder.decodeLevel).toBe('partial');
expect(decodeResult.decoder.name).toBe('label-1m-slash');
Expand All @@ -26,19 +26,25 @@ test('decodes Label 8E sample 1', () => {
expect(decodeResult.raw.arrival_runway).toBe('27L');
expect(decodeResult.raw.departure_icao).toBe('LDSP');
expect(decodeResult.raw.flight_number).toBe('BA0843');
expect(decodeResult.formatted.items.length).toBe(3);
expect(decodeResult.formatted.items[0].type).toBe('eta');
expect(decodeResult.formatted.items[0].code).toBe('ETA');
expect(decodeResult.formatted.items[0].label).toBe('Estimated Time of Arrival');
// Check for the minutes as typescript doesn't have a UTC time string method
// so the hour will depend on the test host timezone.
expect((decodeResult.formatted.items[0].value as string).includes('40')).toBe(true);
expect(decodeResult.formatted.items[1].type).toBe('destination');
expect(decodeResult.formatted.items.length).toBe(5);
expect(decodeResult.formatted.items[0].type).toBe('icao');
expect(decodeResult.formatted.items[0].code).toBe('ORG');
expect(decodeResult.formatted.items[0].label).toBe('Origin');
expect(decodeResult.formatted.items[0].value).toBe('LDSP');
expect(decodeResult.formatted.items[1].type).toBe('icao');
expect(decodeResult.formatted.items[1].code).toBe('DST');
expect(decodeResult.formatted.items[1].label).toBe('Destination');
expect(decodeResult.formatted.items[1].value).toBe('EGLL');
expect(decodeResult.formatted.items[2].type).toBe('origin');
expect(decodeResult.formatted.items[2].code).toBe('ORG');
expect(decodeResult.formatted.items[2].label).toBe('Origin');
expect(decodeResult.formatted.items[2].value).toBe('LDSP');
expect(decodeResult.formatted.items[2].type).toBe('icao');
expect(decodeResult.formatted.items[2].code).toBe('ALT_DST');
expect(decodeResult.formatted.items[2].label).toBe('Alternate Destination');
expect(decodeResult.formatted.items[2].value).toBe('EGSS');
expect(decodeResult.formatted.items[3].type).toBe('runway');
expect(decodeResult.formatted.items[3].code).toBe('ARWY');
expect(decodeResult.formatted.items[3].label).toBe('Arrival Runway');
expect(decodeResult.formatted.items[3].value).toBe('27L');
expect(decodeResult.formatted.items[4].type).toBe('epoch');
expect(decodeResult.formatted.items[4].code).toBe('ETA');
expect(decodeResult.formatted.items[4].label).toBe('Estimated Time of Arrival');
expect(decodeResult.formatted.items[4].value).toBe('2023-08-22T19:40:00Z');
});
32 changes: 8 additions & 24 deletions lib/plugins/Label_1M_Slash.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { DateTimeUtils } from '../DateTimeUtils';
import { DecoderPlugin } from '../DecoderPlugin';
import { DecodeResult, Message, Options } from '../DecoderPluginInterface';
import { ResultFormatter } from '../utils/result_formatter';

export class Label_1M_Slash extends DecoderPlugin {
name = 'label-1m-slash';
Expand Down Expand Up @@ -30,34 +31,17 @@ export class Label_1M_Slash extends DecoderPlugin {
decodeResult.raw.flight_number = results[0];
// results[1]: ETA01 (???)
// results[2]: 230822 - UTC date of eta
decodeResult.raw.departure_icao = results[3];
decodeResult.raw.arrival_icao = results[4];
decodeResult.raw.alternate_icao = results[5];
ResultFormatter.departureAirport(decodeResult, results[3]);
ResultFormatter.arrivalAirport(decodeResult, results[4]);
ResultFormatter.alternateAirport(decodeResult, results[5]);
// results[6]: 2JK0 (???)
// results[7] 1940 - UTC eta
decodeResult.raw.arrival_runway = results[8].replace(decodeResult.raw.arrival_icao, ""); // results[8] EGLL27L
ResultFormatter.arrivalRunway(decodeResult, results[8].replace(results[4], "")); // results[8] EGLL27L
// results[9]: 10(space) (???)

decodeResult.formatted.items.push({
type: 'eta',
code: 'ETA',
label: 'Estimated Time of Arrival',
value: DateTimeUtils.UTCDateTimeToString(results[2], results[7]),
});

decodeResult.formatted.items.push({
type: 'destination',
code: 'DST',
label: 'Destination',
value: decodeResult.raw.arrival_icao,
});

decodeResult.formatted.items.push({
type: 'origin',
code: 'ORG',
label: 'Origin',
value: decodeResult.raw.departure_icao,
});
const yymmdd = results[2];
ResultFormatter.eta(decodeResult, DateTimeUtils.convertDateTimeToEpoch(results[7]+'00', yymmdd.substring(2,4)+yymmdd.substring(4,6)+yymmdd.substring(0,2)), 'epoch')

}

decodeResult.decoded = true;
Expand Down
2 changes: 1 addition & 1 deletion lib/plugins/Label_21_POS.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ describe('Label_21_POS', () => {
expect(decodeResult.formatted.items[4].code).toBe('ETA');
expect(decodeResult.formatted.items[4].label).toBe('Estimated Time of Arrival');
expect(decodeResult.formatted.items[4].value).toBe('20:47:48');
expect(decodeResult.formatted.items[5].type).toBe('destination');
expect(decodeResult.formatted.items[5].type).toBe('icao');
expect(decodeResult.formatted.items[5].code).toBe('DST');
expect(decodeResult.formatted.items[5].label).toBe('Destination');
expect(decodeResult.formatted.items[5].value).toBe('KTPA');
Expand Down
8 changes: 3 additions & 5 deletions lib/plugins/Label_30_Slash_EA.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,11 @@ test('decodes Label 30 sample 1', () => {
expect(decodeResult.message.text).toBe(text);
expect(decodeResult.raw.arrival_icao).toBe('KSFO');
expect(decodeResult.formatted.items.length).toBe(2);
expect(decodeResult.formatted.items[0].type).toBe('eta');
expect(decodeResult.formatted.items[0].type).toBe('time_of_day');
expect(decodeResult.formatted.items[0].code).toBe('ETA');
expect(decodeResult.formatted.items[0].label).toBe('Estimated Time of Arrival');
// This test is a bit rough as typescript doesn't have a UTC time string
// method so the hour will be depend on the test host timezone.
expect((decodeResult.formatted.items[0].value as string).includes('19')).toBe(true);
expect(decodeResult.formatted.items[1].type).toBe('destination');
expect(decodeResult.formatted.items[0].value).toBe('17:19:00');
expect(decodeResult.formatted.items[1].type).toBe('icao');
expect(decodeResult.formatted.items[1].code).toBe('DST');
expect(decodeResult.formatted.items[1].label).toBe('Destination');
expect(decodeResult.formatted.items[1].value).toBe('KSFO');
Expand Down
23 changes: 5 additions & 18 deletions lib/plugins/Label_30_Slash_EA.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { DateTimeUtils } from '../DateTimeUtils';
import { DecoderPlugin } from '../DecoderPlugin';
import { DecodeResult, Message, Options } from '../DecoderPluginInterface';
import { ResultFormatter } from '../utils/result_formatter';

export class Label_30_Slash_EA extends DecoderPlugin {
name = 'label-30-slash-ea';
Expand Down Expand Up @@ -28,24 +29,10 @@ export class Label_30_Slash_EA extends DecoderPlugin {
}
}

decodeResult.formatted.items.push({
type: 'eta',
code: 'ETA',
label: 'Estimated Time of Arrival',
value: DateTimeUtils.UTCToString(results[0].substr(2, 4)),
});

if (results[1].substr(0, 2) === "DS") {
decodeResult.raw.arrival_icao = results[1].substr(2, 4);
decodeResult.formatted.items.push({
type: 'destination',
code: 'DST',
label: 'Destination',
value: decodeResult.raw.arrival_icao,
});

// We don't know what the /SK section means. We have seen various numbers
// after the /SK.
ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results[0].substr(2, 4)+'00'));

if (results[1].substring(0,2) === "DS") {
ResultFormatter.arrivalAirport(decodeResult, results[1].substring(2, 6));
decodeResult.remaining.text = "/".concat(results[2]);
} else {
decodeResult.remaining.text = "/".concat(results[1], "/", results[2])
Expand Down
4 changes: 2 additions & 2 deletions lib/plugins/Label_44_POS.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,11 @@ test('decodes Label 44 Preamble POS02 variant 1', () => {
expect(decodeResult.formatted.items[0].code).toBe('POS');
expect(decodeResult.formatted.items[0].label).toBe('Aircraft Position');
expect(decodeResult.formatted.items[0].value).toBe('38.285 N, 77.845 W');
expect(decodeResult.formatted.items[1].type).toBe('origin');
expect(decodeResult.formatted.items[1].type).toBe('icao');
expect(decodeResult.formatted.items[1].code).toBe('ORG');
expect(decodeResult.formatted.items[1].label).toBe('Origin');
expect(decodeResult.formatted.items[1].value).toBe('KJFK');
expect(decodeResult.formatted.items[2].type).toBe('destination');
expect(decodeResult.formatted.items[2].type).toBe('icao');
expect(decodeResult.formatted.items[2].code).toBe('DST');
expect(decodeResult.formatted.items[2].label).toBe('Destination');
expect(decodeResult.formatted.items[2].value).toBe('KUZA');
Expand Down
8 changes: 4 additions & 4 deletions lib/plugins/Label_80.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,11 @@ test('decodes Label 80 variant 1', () => {
expect(decodeResult.raw.position.longitude).toBe(-95.133);
expect(decodeResult.raw.altitude).toBe(15608);
expect(decodeResult.formatted.items.length).toBe(8);
expect(decodeResult.formatted.items[0].type).toBe('origin');
expect(decodeResult.formatted.items[0].type).toBe('icao');
expect(decodeResult.formatted.items[0].code).toBe('ORG');
expect(decodeResult.formatted.items[0].label).toBe('Origin');
expect(decodeResult.formatted.items[0].value).toBe('KIAH');
expect(decodeResult.formatted.items[1].type).toBe('destination');
expect(decodeResult.formatted.items[1].type).toBe('icao');
expect(decodeResult.formatted.items[1].code).toBe('DST');
expect(decodeResult.formatted.items[1].label).toBe('Destination');
expect(decodeResult.formatted.items[1].value).toBe('MMGL');
Expand Down Expand Up @@ -77,11 +77,11 @@ test('decodes Label 80 variant 2', () => {
expect(decodeResult.raw.position.latitude).toBe(35.391999999999996); // FIXME?: 35.392
expect(decodeResult.raw.position.longitude).toBe(-79.372);
expect(decodeResult.formatted.items.length).toBe(16);
expect(decodeResult.formatted.items[0].type).toBe('origin');
expect(decodeResult.formatted.items[0].type).toBe('icao');
expect(decodeResult.formatted.items[0].code).toBe('ORG');
expect(decodeResult.formatted.items[0].label).toBe('Origin');
expect(decodeResult.formatted.items[0].value).toBe('KIAD');
expect(decodeResult.formatted.items[1].type).toBe('destination');
expect(decodeResult.formatted.items[1].type).toBe('icao');
expect(decodeResult.formatted.items[1].code).toBe('DST');
expect(decodeResult.formatted.items[1].label).toBe('Destination');
expect(decodeResult.formatted.items[1].value).toBe('MSLP');
Expand Down
8 changes: 4 additions & 4 deletions lib/plugins/Label_83.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@ test('decodes Label 83 variant 1', () => {
expect(decodeResult.raw.heading).toBe('140.0');
expect(decodeResult.remaining.text).toBe('19700');
expect(decodeResult.formatted.items.length).toBe(6);
expect(decodeResult.formatted.items[0].type).toBe('origin');
expect(decodeResult.formatted.items[0].type).toBe('icao');
expect(decodeResult.formatted.items[0].value).toBe('KLAX');
expect(decodeResult.formatted.items[1].type).toBe('destination');
expect(decodeResult.formatted.items[1].type).toBe('icao');
expect(decodeResult.formatted.items[1].value).toBe('KEWR');
expect(decodeResult.formatted.items[2].type).toBe('aircraft_position');
expect(decodeResult.formatted.items[2].value).toBe('40.530 N, 74.470 W');
Expand Down Expand Up @@ -70,9 +70,9 @@ test('decodes Label 83 variant 1 (C-band)', () => {
expect(decodeResult.raw.heading).toBe('-107.6');
expect(decodeResult.remaining.text).toBe('64900');
expect(decodeResult.formatted.items.length).toBe(6);
expect(decodeResult.formatted.items[0].type).toBe('origin');
expect(decodeResult.formatted.items[0].type).toBe('icao');
expect(decodeResult.formatted.items[0].value).toBe('KIAH');
expect(decodeResult.formatted.items[1].type).toBe('destination');
expect(decodeResult.formatted.items[1].type).toBe('icao');
expect(decodeResult.formatted.items[1].value).toBe('RJAA');
expect(decodeResult.formatted.items[2].type).toBe('aircraft_position');
expect(decodeResult.formatted.items[2].value).toBe('39.120 N, 175.100 W');
Expand Down
8 changes: 3 additions & 5 deletions lib/plugins/Label_8E.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,11 @@ test('decodes Label 8E sample 1', () => {
expect(decodeResult.message.text).toBe('EGSS,1618');
expect(decodeResult.raw.arrival_icao).toBe('EGSS');
expect(decodeResult.formatted.items.length).toBe(2);
expect(decodeResult.formatted.items[0].type).toBe('eta');
expect(decodeResult.formatted.items[0].type).toBe('time_of_day');
expect(decodeResult.formatted.items[0].code).toBe('ETA');
expect(decodeResult.formatted.items[0].label).toBe('Estimated Time of Arrival');
// Check for the minutes as typescript doesn't have a UTC time string method
// so the hour will depend on the test host timezone.
expect((decodeResult.formatted.items[0].value as string).includes('18')).toBe(true);
expect(decodeResult.formatted.items[1].type).toBe('destination');
expect(decodeResult.formatted.items[0].value).toBe('16:18:00');
expect(decodeResult.formatted.items[1].type).toBe('icao');
expect(decodeResult.formatted.items[1].code).toBe('DST');
expect(decodeResult.formatted.items[1].label).toBe('Destination');
expect(decodeResult.formatted.items[1].value).toBe('EGSS');
Expand Down
19 changes: 3 additions & 16 deletions lib/plugins/Label_8E.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { DateTimeUtils } from '../DateTimeUtils';
import { DecoderPlugin } from '../DecoderPlugin';
import { DecodeResult, Message, Options } from '../DecoderPluginInterface';
import { ResultFormatter } from '../utils/result_formatter';

// ETA
export class Label_8E extends DecoderPlugin {
Expand Down Expand Up @@ -28,22 +29,8 @@ export class Label_8E extends DecoderPlugin {
console.log(results.groups);
}

decodeResult.formatted.items.push({
type: 'eta',
code: 'ETA',
label: 'Estimated Time of Arrival',
value: DateTimeUtils.UTCToString(results.groups.arrival_eta),
});


decodeResult.raw.arrival_icao = results.groups.arrival_icao;
decodeResult.formatted.items.push({
type: 'destination',
code: 'DST',
label: 'Destination',
value: decodeResult.raw.arrival_icao,
});

ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results.groups.arrival_eta + '00'));
ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);
}

decodeResult.decoded = true;
Expand Down
2 changes: 1 addition & 1 deletion lib/plugins/Label_HX.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ test('decodes Label HX variant 2', () => {
expect(decodeResult.raw.departure_icao).toBe('GSP');
expect(decodeResult.remaining.text).toBe('B02');
expect(decodeResult.formatted.items.length).toBe(1);
expect(decodeResult.formatted.items[0].type).toBe('origin');
expect(decodeResult.formatted.items[0].type).toBe('icao');
expect(decodeResult.formatted.items[0].code).toBe('ORG');
expect(decodeResult.formatted.items[0].label).toBe('Origin');
expect(decodeResult.formatted.items[0].value).toBe('GSP');
Expand Down
12 changes: 6 additions & 6 deletions lib/plugins/Label_QQ.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,11 @@ test('decodes Label QQ variant 1', () => {
expect(decodeResult.raw.groundspeed).toBe('175');
expect(decodeResult.remaining.text).toBe('028,0042');
expect(decodeResult.formatted.items.length).toBe(5);
expect(decodeResult.formatted.items[0].type).toBe('origin');
expect(decodeResult.formatted.items[0].type).toBe('icao');
expect(decodeResult.formatted.items[0].code).toBe('ORG');
expect(decodeResult.formatted.items[0].label).toBe('Origin');
expect(decodeResult.formatted.items[0].value).toBe('KSDL');
expect(decodeResult.formatted.items[1].type).toBe('destination');
expect(decodeResult.formatted.items[1].type).toBe('icao');
expect(decodeResult.formatted.items[1].code).toBe('DST');
expect(decodeResult.formatted.items[1].label).toBe('Destination');
expect(decodeResult.formatted.items[1].value).toBe('KLAS');
Expand Down Expand Up @@ -74,11 +74,11 @@ test('decodes Label QQ variant 2', () => {
expect(decodeResult.raw.position.longitude).toBe(-118.16833333333334);
expect(decodeResult.remaining.text).toBe('---,020,0009');
expect(decodeResult.formatted.items.length).toBe(4);
expect(decodeResult.formatted.items[0].type).toBe('origin');
expect(decodeResult.formatted.items[0].type).toBe('icao');
expect(decodeResult.formatted.items[0].code).toBe('ORG');
expect(decodeResult.formatted.items[0].label).toBe('Origin');
expect(decodeResult.formatted.items[0].value).toBe('KLGB');
expect(decodeResult.formatted.items[1].type).toBe('destination');
expect(decodeResult.formatted.items[1].type).toBe('icao');
expect(decodeResult.formatted.items[1].code).toBe('DST');
expect(decodeResult.formatted.items[1].label).toBe('Destination');
expect(decodeResult.formatted.items[1].value).toBe('KLAX');
Expand Down Expand Up @@ -110,11 +110,11 @@ test('decodes Label QQ variant 3', () => {
expect(decodeResult.raw.wheels_off).toBe('0058');
expect(decodeResult.remaining.text).toBe('/OFFRPT/090155');
expect(decodeResult.formatted.items.length).toBe(3);
expect(decodeResult.formatted.items[0].type).toBe('origin');
expect(decodeResult.formatted.items[0].type).toBe('icao');
expect(decodeResult.formatted.items[0].code).toBe('ORG');
expect(decodeResult.formatted.items[0].label).toBe('Origin');
expect(decodeResult.formatted.items[0].value).toBe('CYOW');
expect(decodeResult.formatted.items[1].type).toBe('destination');
expect(decodeResult.formatted.items[1].type).toBe('icao');
expect(decodeResult.formatted.items[1].code).toBe('DST');
expect(decodeResult.formatted.items[1].label).toBe('Destination');
expect(decodeResult.formatted.items[1].value).toBe('KMEM');
Expand Down
Loading

0 comments on commit 811f55a

Please sign in to comment.