Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 36 additions & 6 deletions lib/plugins/Label_15.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 <invalid>', () => {
Expand Down
23 changes: 14 additions & 9 deletions lib/plugins/Label_15.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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(?<between>.+)\(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}`);
Expand Down