Skip to content

Commit

Permalink
support converting minute resolution (#189)
Browse files Browse the repository at this point in the history
there was lots of code where we manually appended seconds. Do this in the method so it's not repeated everywhere
makrsmark authored Nov 13, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
1 parent 4e14089 commit 3811b04
Showing 17 changed files with 51 additions and 34 deletions.
5 changes: 4 additions & 1 deletion lib/DateTimeUtils.ts
Original file line number Diff line number Diff line change
@@ -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));
6 changes: 3 additions & 3 deletions lib/plugins/Label_10_Slash.ts
Original file line number Diff line number Diff line change
@@ -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 });
4 changes: 2 additions & 2 deletions lib/plugins/Label_1L_070.ts
Original file line number Diff line number Diff line change
@@ -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)),
2 changes: 1 addition & 1 deletion lib/plugins/Label_1L_3-line.ts
Original file line number Diff line number Diff line change
@@ -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');
2 changes: 1 addition & 1 deletion lib/plugins/Label_1L_Slash.ts
Original file line number Diff line number Diff line change
@@ -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');
}

10 changes: 5 additions & 5 deletions lib/plugins/Label_22_OFF.ts
Original file line number Diff line number Diff line change
@@ -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';

2 changes: 1 addition & 1 deletion lib/plugins/Label_24_Slash.ts
Original file line number Diff line number Diff line change
@@ -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;
2 changes: 1 addition & 1 deletion lib/plugins/Label_30_Slash_EA.ts
Original file line number Diff line number Diff line change
@@ -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));
2 changes: 1 addition & 1 deletion lib/plugins/Label_5Z_Slash.ts
Original file line number Diff line number Diff line change
@@ -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) {
2 changes: 1 addition & 1 deletion lib/plugins/Label_8E.ts
Original file line number Diff line number Diff line change
@@ -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);
}

18 changes: 11 additions & 7 deletions lib/plugins/Label_H1_StarPOS.test.ts
Original file line number Diff line number Diff line change
@@ -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');
});
6 changes: 3 additions & 3 deletions lib/plugins/Label_H1_StarPOS.ts
Original file line number Diff line number Diff line change
@@ -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)
2 changes: 1 addition & 1 deletion lib/plugins/Label_QP.ts
Original file line number Diff line number Diff line change
@@ -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;
2 changes: 1 addition & 1 deletion lib/plugins/Label_QR.ts
Original file line number Diff line number Diff line change
@@ -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;
2 changes: 1 addition & 1 deletion lib/plugins/Label_QS.ts
Original file line number Diff line number Diff line change
@@ -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;
4 changes: 2 additions & 2 deletions lib/utils/h1_helper.ts
Original file line number Diff line number Diff line change
@@ -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], '/');
}
14 changes: 12 additions & 2 deletions lib/utils/result_formatter.ts
Original file line number Diff line number Diff line change
@@ -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({

0 comments on commit 3811b04

Please sign in to comment.