Skip to content

Commit 3df346f

Browse files
makrsmarkjwarne-ausclaude
authored
Add ARINC 702 PR IMI (#360)
Process Performance data ran linter ran npm audit --------- Co-authored-by: James Warne <jwarne@gmail.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent efeaba4 commit 3df346f

10 files changed

Lines changed: 187 additions & 62 deletions

lib/plugins/Label_1J_2J_FTX.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ describe('Label 1J/2J FTX', () => {
4949
expect(decodeResult.raw.version).toBe(3.2);
5050
expect(decodeResult.raw.checksum).toBe(0x8d70);
5151
expect(decodeResult.formatted.items.length).toBe(7);
52-
expect(decodeResult.remaining.text).toContain('M74');
52+
expect(decodeResult.remaining.text).toBe('M74/');
5353
});
5454

5555
test('decodes <invalid>', () => {

lib/plugins/Label_2A_SUM.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ describe('Label 2A preamble SUM', () => {
2626
expect(decodeResult.formatted.items.length).toBe(5);
2727
// Only check formatted.items.length and description, rest are raw fields
2828
// Remaining text may be set by ResultFormatter. Check actual value.
29-
expect(decodeResult.remaining.text).toBe('SM031612,420,032139,031623,416,031631,413,032130,212,032139,209');
29+
expect(decodeResult.remaining.text).toBe(
30+
'SM031612,420,032139,031623,416,031631,413,032130,212,032139,209',
31+
);
3032
});
3133

3234
test('decodes Inmarsat variant', () => {

lib/plugins/Label_H1_FPN.test.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ describe('Label_H1 FPN', () => {
120120
expect(decodeResult.decoder.decodeLevel).toBe('partial');
121121
expect(decodeResult.raw.message_timestamp).toBe(1708178417);
122122
expect(decodeResult.formatted.description).toBe('Flight Plan');
123-
expect(decodeResult.formatted.items.length).toBe(9);
123+
expect(decodeResult.formatted.items.length).toBe(10);
124124
expect(decodeResult.formatted.items[0].label).toBe('Route Status');
125125
expect(decodeResult.formatted.items[0].value).toBe('Route Planned');
126126
expect(decodeResult.formatted.items[1].label).toBe('Origin');
@@ -133,19 +133,18 @@ describe('Label_H1 FPN', () => {
133133
expect(decodeResult.formatted.items[3].value).toBe('BAINY3');
134134
expect(decodeResult.formatted.items[4].label).toBe('Approach Procedure');
135135
expect(decodeResult.formatted.items[4].value).toBe('ILS30L(30L)');
136-
expect(decodeResult.formatted.items[5].label).toBe('Arrival Runway');
137-
expect(decodeResult.formatted.items[5].value).toBe('30L');
138-
expect(decodeResult.formatted.items[6].label).toBe('Fuel On Board');
139-
expect(decodeResult.formatted.items[6].value).toBe('172');
140-
expect(decodeResult.formatted.items[7].label).toBe(
136+
expect(decodeResult.formatted.items[5].label).toBe('Altitude');
137+
expect(decodeResult.formatted.items[5].value).toBe('36000 feet');
138+
expect(decodeResult.formatted.items[6].label).toBe('Arrival Runway');
139+
expect(decodeResult.formatted.items[6].value).toBe('30L');
140+
expect(decodeResult.formatted.items[7].label).toBe('Fuel On Board');
141+
expect(decodeResult.formatted.items[7].value).toBe('172');
142+
expect(decodeResult.formatted.items[8].label).toBe(
141143
'Estimated Time of Arrival',
142144
);
143-
expect(decodeResult.formatted.items[7].value).toBe('21:51:17');
144-
expect(decodeResult.formatted.items[8].label).toBe('Message Checksum');
145-
expect(decodeResult.formatted.items[8].value).toBe('0x156d');
146-
expect(decodeResult.remaining.text).toBe(
147-
':WS:N61000W030000,370..N61000W040000..N60000W050000..URTAK:WS:URTAK,380..LAKES:WS:LAKES,400..N57000W070000..N54300W080000..N49000W090000..DLH..COLDD/PR4356,344,360,1060,,,13,,,30,,,P50,M40,36090,,3296,292',
148-
);
145+
expect(decodeResult.formatted.items[8].value).toBe('21:51:17');
146+
expect(decodeResult.formatted.items[9].label).toBe('Message Checksum');
147+
expect(decodeResult.formatted.items[9].value).toBe('0x156d');
149148
});
150149

151150
test('decodes Label H1 Preamble FPN with newlines', () => {
@@ -172,6 +171,7 @@ describe('Label_H1 FPN', () => {
172171
); //TODO - pull out route
173172
expect(decodeResult.formatted.items[4].label).toBe('Message Checksum');
174173
expect(decodeResult.formatted.items[4].value).toBe('0x0560');
174+
expect(decodeResult.remaining.text).toBe('');
175175
});
176176

177177
test('decodes Label H1 Preamble FPN with SN and TS', () => {
@@ -292,10 +292,10 @@ describe('Label_H1 FPN', () => {
292292
expect(decodeResult.raw.eta_time).toBe(85448);
293293
expect(decodeResult.raw.checksum).toBe(0x47c0);
294294
expect(decodeResult.formatted.description).toBe('Flight Plan');
295-
expect(decodeResult.formatted.items.length).toBe(11);
296-
expect(decodeResult.remaining.text).toBe(
297-
'F37A#M1B/PR,,110,,183,7,13,,M7,25,,,P30,M40,36090,13,3455,300',
298-
);
295+
expect(decodeResult.formatted.items.length).toBe(13);
296+
expect(decodeResult.raw.altitude).toBe(11000);
297+
expect(decodeResult.raw.outside_air_temperature).toBe(-7);
298+
expect(decodeResult.remaining.text).toBe('F37A#M1B/,,,183,7,13,,25,,,P30,M40,36090,13,3455,300');
299299
});
300300

301301
test('decodes Label H1 Preamble FPN <invalid>', () => {

lib/plugins/Label_H1_INR.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,6 @@ describe('Label_H1 INR', () => {
2626
expect(decodeResult.raw.fuel_on_board).toBe(983);
2727
expect(decodeResult.raw.checksum).toBe(0xbf4c);
2828
expect(decodeResult.formatted.items.length).toBe(7);
29-
expect(decodeResult.remaining.text).toContain('NR,,,,,,,,950,0');
29+
expect(decodeResult.remaining.text).toBe('NR,,,,,,,,950,0');
3030
});
3131
});

lib/plugins/Label_H1_PER.test.ts

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,16 @@ describe('Label_H1 PER', () => {
1717
expect(decodeResult.decoded).toBe(true);
1818
expect(decodeResult.decoder.decodeLevel).toBe('partial');
1919
expect(decodeResult.raw.checksum).toBe(0x2917);
20-
expect(decodeResult.formatted.items.length).toBe(1);
21-
expect(decodeResult.remaining.text).toBe(
22-
'PR1337,262,320,222,,60,24,275103,M53,180,P52,P0',
20+
expect(decodeResult.raw.altitude).toBe(32000);
21+
expect(decodeResult.raw.outside_air_temperature).toBe(-53);
22+
expect(decodeResult.formatted.items.length).toBe(3);
23+
expect(decodeResult.formatted.items[0].label).toBe('Altitude');
24+
expect(decodeResult.formatted.items[0].value).toBe('32000 feet');
25+
expect(decodeResult.formatted.items[1].label).toBe(
26+
'Outside Air Temperature (C)',
2327
);
28+
expect(decodeResult.formatted.items[1].value).toBe('-53 degrees');
29+
expect(decodeResult.formatted.items[2].label).toBe('Message Checksum');
2430
});
2531

2632
test('long variant', () => {
@@ -31,9 +37,18 @@ describe('Label_H1 PER', () => {
3137
expect(decodeResult.decoded).toBe(true);
3238
expect(decodeResult.decoder.decodeLevel).toBe('partial');
3339
expect(decodeResult.raw.checksum).toBe(0x388d);
34-
expect(decodeResult.formatted.items.length).toBe(1);
40+
expect(decodeResult.raw.altitude).toBe(34000);
41+
expect(decodeResult.raw.outside_air_temperature).toBe(-56);
42+
expect(decodeResult.formatted.items.length).toBe(3);
43+
expect(decodeResult.formatted.items[0].label).toBe('Altitude');
44+
expect(decodeResult.formatted.items[0].value).toBe('34000 feet');
45+
expect(decodeResult.formatted.items[1].label).toBe(
46+
'Outside Air Temperature (C)',
47+
);
48+
expect(decodeResult.formatted.items[1].value).toBe('-56 degrees');
49+
expect(decodeResult.formatted.items[2].label).toBe('Message Checksum');
3550
expect(decodeResult.remaining.text).toBe(
36-
'PR1218,276,340,134,,0,68,,M56,180,,,P30,P0,33936,,1084,284',
51+
'1218,276,134,,0,68,,180,,,P30,P0,33936,,1084,284',
3752
);
3853
});
3954

lib/plugins/Label_H1_POS.test.ts

Lines changed: 42 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ describe('Label_H1 POS', () => {
193193
expect(decodeResult.decoded).toBe(true);
194194
expect(decodeResult.decoder.decodeLevel).toBe('partial');
195195
expect(decodeResult.formatted.description).toBe('Position Report');
196-
expect(decodeResult.formatted.items.length).toBe(12);
196+
expect(decodeResult.formatted.items.length).toBe(14);
197197
expect(decodeResult.formatted.items[0].label).toBe('Destination');
198198
expect(decodeResult.formatted.items[0].value).toBe('MMGL');
199199
expect(decodeResult.formatted.items[1].label).toBe('Arrival Runway');
@@ -204,29 +204,34 @@ describe('Label_H1 POS', () => {
204204
'Estimated Time of Arrival',
205205
);
206206
expect(decodeResult.formatted.items[3].value).toBe('10:33:16');
207-
expect(decodeResult.formatted.items[4].label).toBe('Route Status');
208-
expect(decodeResult.formatted.items[4].value).toBe('Route Planned');
209-
expect(decodeResult.formatted.items[5].label).toBe('Origin');
210-
expect(decodeResult.formatted.items[5].value).toBe('MMTJ');
211-
expect(decodeResult.formatted.items[6].label).toBe('Destination');
212-
expect(decodeResult.formatted.items[6].value).toBe('MMGL');
213-
expect(decodeResult.formatted.items[7].label).toBe('Departure Runway');
214-
expect(decodeResult.formatted.items[7].value).toBe('27O');
215-
expect(decodeResult.formatted.items[8].label).toBe('Departure Procedure');
216-
expect(decodeResult.formatted.items[8].value).toBe(
217-
'TUMA2B: >> SANFE > UT4 >> LMM',
207+
expect(decodeResult.formatted.items[4].label).toBe('Altitude');
208+
expect(decodeResult.formatted.items[4].value).toBe('35000 feet');
209+
expect(decodeResult.formatted.items[5].label).toBe(
210+
'Outside Air Temperature (C)',
218211
);
219-
expect(decodeResult.formatted.items[9].label).toBe('Arrival Procedure');
220-
expect(decodeResult.formatted.items[9].value).toBe('LONV1D');
221-
expect(decodeResult.formatted.items[10].label).toBe('Approach Procedure');
212+
expect(decodeResult.formatted.items[5].value).toBe('-45 degrees');
213+
expect(decodeResult.formatted.items[6].label).toBe('Route Status');
214+
expect(decodeResult.formatted.items[6].value).toBe('Route Planned');
215+
expect(decodeResult.formatted.items[7].label).toBe('Origin');
216+
expect(decodeResult.formatted.items[7].value).toBe('MMTJ');
217+
expect(decodeResult.formatted.items[8].label).toBe('Destination');
218+
expect(decodeResult.formatted.items[8].value).toBe('MMGL');
219+
expect(decodeResult.formatted.items[9].label).toBe('Departure Runway');
220+
expect(decodeResult.formatted.items[9].value).toBe('27O');
221+
expect(decodeResult.formatted.items[10].label).toBe('Departure Procedure');
222222
expect(decodeResult.formatted.items[10].value).toBe(
223+
'TUMA2B: >> SANFE > UT4 >> LMM',
224+
);
225+
expect(decodeResult.formatted.items[11].label).toBe('Arrival Procedure');
226+
expect(decodeResult.formatted.items[11].value).toBe('LONV1D');
227+
expect(decodeResult.formatted.items[12].label).toBe('Approach Procedure');
228+
expect(decodeResult.formatted.items[12].value).toBe(
223229
'ILSZ29 starting at PLADE(29O)',
224230
);
225-
expect(decodeResult.formatted.items[11].label).toBe('Message Checksum');
226-
expect(decodeResult.formatted.items[11].value).toBe('0x9d1c');
231+
expect(decodeResult.formatted.items[13].label).toBe('Message Checksum');
232+
expect(decodeResult.formatted.items[13].value).toBe('0x9d1c');
227233
expect(decodeResult.remaining.text).toBe(
228-
'PR1754,231,350,189,,0,0,,M45,185,,,P16,P0,36000,,1565,250',
229-
);
234+
'1754,231,189,,0,0,,185,,,P16,P0,36000,,1565,250');
230235
});
231236

232237
test('variant 1 with offset', () => {
@@ -292,7 +297,7 @@ describe('Label_H1 POS', () => {
292297
expect(decodeResult.decoded).toBe(true);
293298
expect(decodeResult.decoder.decodeLevel).toBe('partial');
294299
expect(decodeResult.formatted.description).toBe('Position Report');
295-
expect(decodeResult.formatted.items.length).toBe(12);
300+
expect(decodeResult.formatted.items.length).toBe(14);
296301
expect(decodeResult.formatted.items[0].label).toBe('Aircraft Position');
297302
expect(decodeResult.formatted.items[0].value).toBe('51.323 N, 4.878 E');
298303
expect(decodeResult.formatted.items[1].label).toBe('Altitude');
@@ -313,20 +318,26 @@ describe('Label_H1 POS', () => {
313318
expect(decodeResult.formatted.items[6].value).toBe(
314319
'LEIB..CIV.N872.MEDIL.UN872.KOVIN.UM728.RESMI.UN857.DISAK..DIRMO..ETAMO..ADEKA..MOKDI..MEN..BADAM..KANIG..KENAS.N855.POS',
315320
);
316-
expect(decodeResult.formatted.items[7].label).toBe('Arrival Runway'); // FIXME should remove
317-
expect(decodeResult.formatted.items[7].value).toBe(''); // FIXME should remove
318-
expect(decodeResult.formatted.items[8].label).toBe('Fuel On Board');
319-
expect(decodeResult.formatted.items[8].value).toBe('89');
320-
expect(decodeResult.formatted.items[9].label).toBe(
321+
expect(decodeResult.formatted.items[7].label).toBe('Altitude');
322+
expect(decodeResult.formatted.items[7].value).toBe('37000 feet');
323+
expect(decodeResult.formatted.items[8].label).toBe(
324+
'Outside Air Temperature (C)',
325+
);
326+
expect(decodeResult.formatted.items[8].value).toBe('-47 degrees');
327+
expect(decodeResult.formatted.items[9].label).toBe('Arrival Runway'); // FIXME should remove
328+
expect(decodeResult.formatted.items[9].value).toBe(''); // FIXME should remove
329+
expect(decodeResult.formatted.items[10].label).toBe('Fuel On Board');
330+
expect(decodeResult.formatted.items[10].value).toBe('89');
331+
expect(decodeResult.formatted.items[11].label).toBe(
321332
'Estimated Time of Arrival',
322333
);
323-
expect(decodeResult.formatted.items[9].value).toBe('12:45:03');
324-
expect(decodeResult.formatted.items[10].label).toBe('Fuel Remaining');
325-
expect(decodeResult.formatted.items[10].value).toBe('73');
326-
expect(decodeResult.formatted.items[11].label).toBe('Message Checksum');
327-
expect(decodeResult.formatted.items[11].value).toBe('0x53b2');
334+
expect(decodeResult.formatted.items[11].value).toBe('12:45:03');
335+
expect(decodeResult.formatted.items[12].label).toBe('Fuel Remaining');
336+
expect(decodeResult.formatted.items[12].value).toBe('73');
337+
expect(decodeResult.formatted.items[13].label).toBe('Message Checksum');
338+
expect(decodeResult.formatted.items[13].value).toBe('0x53b2');
328339
expect(decodeResult.remaining.text).toBe(
329-
'290016,191/PR1496,150,370,191,,55,10,248028,M47,30,P19,P0/FHCIV,105208,273K,3226,175,M41,252027,450,N,221,62.MEDIL,105411,267K,3439,172,M44,250028,459,N,203,15.PITHI,105533,259K,3584,170,M47,249028,456,N,203,10.LESDO,105859,252K,3700,167,M47,248028,456,N,203,25.KOVIN,110153,252K,3700,164,M47,248028,456,N,203,21.DUCRA,110705,252K,3700,160,M47,248028,456,N,213,37.RESMI,111101,251K,3700,156,M47,248028,455,N,213,28.DEKOD,111325,251K,3700,154,M47,248028,455,N,192,17.DISAK,111438,251K,3700,153,M47,248028,454,N,172,9.DIRMO,112306,251K,3700,145,M47,248028,454,N,178,63.ETAMO,112514,250K,3700,143,M47,248028,453,N,158,16.ADEKA,113339,250K,3700,136,M47,248028,454,N,147,64.MOKDI,114139,251K,3700,129,M47,248028,454,N,181,59.MEN,114429,251K,3700,127,M47,248028,454,N,181,21.BADAM,114843,251K,3700,123,M47,248028,454,N,179,31.KANIG,120154,250K,3700,111,M47,248028,453,N,185,97.KENAS,121800,250K,3700,98,M47,248028,453,N,177,119.POS,122257,250K,3018,96,M45,248023,395,N,182,34.LEIB,124503,150K,2,89,P15,000000,161,N,231,103',
340+
'290016,191/PR1496,150,191,,55,10,248028,30,P19,P0/FHCIV,105208,273K,3226,175,M41,252027,450,N,221,62.MEDIL,105411,267K,3439,172,M44,250028,459,N,203,15.PITHI,105533,259K,3584,170,M47,249028,456,N,203,10.LESDO,105859,252K,3700,167,M47,248028,456,N,203,25.KOVIN,110153,252K,3700,164,M47,248028,456,N,203,21.DUCRA,110705,252K,3700,160,M47,248028,456,N,213,37.RESMI,111101,251K,3700,156,M47,248028,455,N,213,28.DEKOD,111325,251K,3700,154,M47,248028,455,N,192,17.DISAK,111438,251K,3700,153,M47,248028,454,N,172,9.DIRMO,112306,251K,3700,145,M47,248028,454,N,178,63.ETAMO,112514,250K,3700,143,M47,248028,453,N,158,16.ADEKA,113339,250K,3700,136,M47,248028,454,N,147,64.MOKDI,114139,251K,3700,129,M47,248028,454,N,181,59.MEN,114429,251K,3700,127,M47,248028,454,N,181,21.BADAM,114843,251K,3700,123,M47,248028,454,N,179,31.KANIG,120154,250K,3700,111,M47,248028,453,N,185,97.KENAS,121800,250K,3700,98,M47,248028,453,N,177,119.POS,122257,250K,3018,96,M45,248023,395,N,182,34.LEIB,124503,150K,2,89,P15,000000,161,N,231,103',
330341
);
331342
});
332343

lib/plugins/Label_H1_PRG.test.ts

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,38 @@ describe('Label H1 Preamble PRG', () => {
5858
expect(decodeResult.decoded).toBe(true);
5959
expect(decodeResult.decoder.decodeLevel).toBe('partial');
6060
expect(decodeResult.formatted.description).toBe('Progress Report');
61-
expect(decodeResult.formatted.items.length).toBe(10);
61+
expect(decodeResult.formatted.items.length).toBe(11);
62+
expect(decodeResult.formatted.items[0].label).toBe('Destination');
63+
expect(decodeResult.formatted.items[0].value).toBe('GCRR');
64+
expect(decodeResult.formatted.items[1].label).toBe('Arrival Runway');
65+
expect(decodeResult.formatted.items[1].value).toBe('03O');
66+
expect(decodeResult.formatted.items[2].label).toBe('Fuel On Board');
67+
expect(decodeResult.formatted.items[2].value).toBe('62');
68+
expect(decodeResult.formatted.items[3].label).toBe(
69+
'Estimated Time of Arrival',
70+
);
71+
expect(decodeResult.formatted.items[3].value).toBe('16:30:55');
72+
expect(decodeResult.formatted.items[4].label).toBe('Altitude');
73+
expect(decodeResult.formatted.items[4].value).toBe('35000 feet');
74+
expect(decodeResult.formatted.items[5].label).toBe('Route Status');
75+
expect(decodeResult.formatted.items[5].value).toBe('Route Planned');
76+
expect(decodeResult.formatted.items[6].label).toBe('Origin');
77+
expect(decodeResult.formatted.items[6].value).toBe('EDDB');
78+
expect(decodeResult.formatted.items[7].label).toBe('Destination');
79+
expect(decodeResult.formatted.items[7].value).toBe(
80+
'GCRR..N50059E004552..N49588E004338..N49241E002528..N49122E002199..PON.UN872..ERIGA..FUJTI',
81+
); // TODO - pull out route
82+
expect(decodeResult.formatted.items[8].label).toBe('Arrival Procedure');
83+
expect(decodeResult.formatted.items[8].value).toBe('TERT1P');
84+
expect(decodeResult.formatted.items[9].label).toBe('Approach Procedure');
85+
expect(decodeResult.formatted.items[9].value).toBe(
86+
'ILSZ03 starting at BAPAL(03O)',
87+
);
88+
expect(decodeResult.formatted.items[10].label).toBe('Message Checksum');
89+
expect(decodeResult.formatted.items[10].value).toBe('0x226d');
90+
expect(decodeResult.remaining.text).toBe(
91+
':WS:FUJTI,360..BAKUP..BATAX..TAKAV..VEDOD',
92+
);
6293
});
6394

6495
test('decodes named runway inmarsat', () => {

lib/plugins/Label_H1_REQ.test.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ describe('Label H1 preamble REQ', () => {
4242
]);
4343
expect(decodeResult.raw.checksum).toBe(0x77ce);
4444
expect(decodeResult.formatted.items.length).toBe(5);
45-
expect(decodeResult.formatted.description).toBe('Request for Pilot Weather Information');
45+
expect(decodeResult.formatted.description).toBe(
46+
'Request for Pilot Weather Information',
47+
);
4648
});
4749

4850
test('decodes POS', () => {
@@ -53,7 +55,9 @@ describe('Label H1 preamble REQ', () => {
5355
expect(decodeResult.decoder.decodeLevel).toBe('full');
5456
expect(decodeResult.raw.checksum).toBe(0x037b);
5557
expect(decodeResult.formatted.items.length).toBe(1);
56-
expect(decodeResult.formatted.description).toBe('Request for Position Report');
58+
expect(decodeResult.formatted.description).toBe(
59+
'Request for Position Report',
60+
);
5761
});
5862

5963
test('decodes REQ POS inmarsat', () => {
@@ -69,7 +73,7 @@ describe('Label H1 preamble REQ', () => {
6973
expect(decodeResult.raw.checksum).toBe(0x9310);
7074
expect(decodeResult.formatted.items.length).toBe(4);
7175
expect(decodeResult.formatted.description).toBeDefined();
72-
expect(decodeResult.remaining.text).toContain('AU3');
76+
expect(decodeResult.remaining.text).toBe('AU3');
7377
});
7478

7579
test('decodes FPN', () => {

0 commit comments

Comments
 (0)