diff --git a/lib/plugins/Label_15.test.ts b/lib/plugins/Label_15.test.ts index 269543f..88c5e18 100644 --- a/lib/plugins/Label_15.test.ts +++ b/lib/plugins/Label_15.test.ts @@ -19,32 +19,62 @@ describe('Label_15', () => { }); }); - test('decodes variant 1', () => { + test('decodes short variant missing ???', () => { const text = '(2N39413W 73354--- 66349-43(Z' const decodeResult = plugin.decode({ text: text }); expect(decodeResult.decoded).toBe(true); expect(decodeResult.decoder.decodeLevel).toBe('partial'); - expect(decodeResult.formatted.items.length).toBe(2); + expect(decodeResult.formatted.items.length).toBe(3); expect(decodeResult.formatted.items[0].label).toBe('Aircraft Position'); expect(decodeResult.formatted.items[0].value).toBe('39.688 N, 73.590 W'); expect(decodeResult.formatted.items[1].label).toBe('Altitude'); expect(decodeResult.formatted.items[1].value).toBe('34900 feet'); - expect(decodeResult.remaining.text).toBe('--- 66-43'); + expect(decodeResult.formatted.items[2].label).toBe('Outside Air Temperature (C)'); + expect(decodeResult.formatted.items[2].value).toBe('-43 degrees'); + expect(decodeResult.remaining.text).toBe('--- 66'); }); - test('decodes variant 2', () => { + test('decodes short variant all fields', () => { const text = '(2N40492W 77179248 99380-53(Z' const decodeResult = plugin.decode({ text: text }); expect(decodeResult.decoded).toBe(true); expect(decodeResult.decoder.decodeLevel).toBe('partial'); - expect(decodeResult.formatted.items.length).toBe(2); + expect(decodeResult.formatted.items.length).toBe(3); expect(decodeResult.formatted.items[0].label).toBe('Aircraft Position'); expect(decodeResult.formatted.items[0].value).toBe('40.820 N, 77.298 W'); expect(decodeResult.formatted.items[1].label).toBe('Altitude'); expect(decodeResult.formatted.items[1].value).toBe('38000 feet'); - expect(decodeResult.remaining.text).toBe('248 99-53'); + expect(decodeResult.formatted.items[2].label).toBe('Outside Air Temperature (C)'); + expect(decodeResult.formatted.items[2].value).toBe('-53 degrees'); + expect(decodeResult.remaining.text).toBe('248 99'); + }); + + test('decodes short variant missing alt', () => { + const text = '(2N39269W 77374--- 42---- 5(Z' + const decodeResult = plugin.decode({ text: text }); + + expect(decodeResult.decoded).toBe(true); + expect(decodeResult.decoder.decodeLevel).toBe('partial'); + expect(decodeResult.formatted.items.length).toBe(2); + expect(decodeResult.formatted.items[0].label).toBe('Aircraft Position'); + expect(decodeResult.formatted.items[0].value).toBe('39.448 N, 77.623 W'); + expect(decodeResult.formatted.items[1].label).toBe('Outside Air Temperature (C)'); + expect(decodeResult.formatted.items[1].value).toBe('-5 degrees'); + expect(decodeResult.remaining.text).toBe('--- 42'); + }); + + test('decodes long variant', () => { + const text = '(2N39018W 77284OFF11112418101313--------(Z' + const decodeResult = plugin.decode({ text: text }); + + expect(decodeResult.decoded).toBe(true); + expect(decodeResult.decoder.decodeLevel).toBe('partial'); + expect(decodeResult.formatted.items.length).toBe(1); + expect(decodeResult.formatted.items[0].label).toBe('Aircraft Position'); + expect(decodeResult.formatted.items[0].value).toBe('39.030 N, 77.473 W'); + expect(decodeResult.remaining.text).toBe('OFF11112418101313--------'); }); test('does not decode Label 15 ', () => { diff --git a/lib/plugins/Label_15.ts b/lib/plugins/Label_15.ts index f2591f3..9ed9b9d 100644 --- a/lib/plugins/Label_15.ts +++ b/lib/plugins/Label_15.ts @@ -14,20 +14,25 @@ export class Label_15 extends DecoderPlugin { }; } - decode(message: Message, options: Options = {}) : DecodeResult { + decode(message: Message, options: Options = {}): DecodeResult { const decodeResult = this.defaultResult(); decodeResult.decoder.name = this.name; decodeResult.formatted.description = 'Position Report'; decodeResult.message = message; - const twoZeeRegex = /^\(2(?.+)\(Z$/; - const results = message.text.match(twoZeeRegex); - if (results?.groups) { - // Style: (2N38111W 82211266 76400-64(Z - const between = results.groups.between - ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(between.substring(0,13))); - ResultFormatter.altitude(decodeResult, 100 * Number(between.substring(19, 22))); - ResultFormatter.unknown(decodeResult, between.substring(13,19) + between.substring(22)); + if (message.text.startsWith('(2') && message.text.endsWith('(Z')) { + const between = message.text.substring(2, message.text.length - 2); + ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(between.substring(0, 13))); + if (between.length === 25) { // short variant + ResultFormatter.unknown(decodeResult, between.substring(13, 19)); + const alt = between.substring(19, 22); + if (alt != '---') { + ResultFormatter.altitude(decodeResult, 100 * Number(alt)); + } + ResultFormatter.temperature(decodeResult, between.substring(22).replace(" ", "0")); + } else { // long variant + ResultFormatter.unknown(decodeResult, between.substring(13)); + } } else { if (options.debug) { console.log(`Decoder: Unknown 15 message: ${message.text}`);