diff --git a/lib/plugins/Label_5Z_Slash.ts b/lib/plugins/Label_5Z_Slash.ts index 7329b5b..cac75d9 100644 --- a/lib/plugins/Label_5Z_Slash.ts +++ b/lib/plugins/Label_5Z_Slash.ts @@ -1,6 +1,7 @@ import { DateTimeUtils } from '../DateTimeUtils'; import { DecoderPlugin } from '../DecoderPlugin'; import { DecodeResult, Message, Options } from '../DecoderPluginInterface'; +import { formatAcarsFreeText } from '../utils/acars_free_text'; import { ResultFormatter } from '../utils/result_formatter'; export class Label_5Z_Slash extends DecoderPlugin { @@ -49,7 +50,10 @@ export class Label_5Z_Slash extends DecoderPlugin { const lines = message.text.split('\r\n'); if (lines[0] === '/TXT') { // not UA, but starts with `/` - ResultFormatter.text(decodeResult, lines.slice(1).join('\r\n')); + ResultFormatter.text( + decodeResult, + formatAcarsFreeText(lines.slice(1).join('\r\n')), + ); decodeResult.decoded = true; decodeResult.decoder.decodeLevel = 'full'; return decodeResult; diff --git a/lib/utils/acars_free_text.test.ts b/lib/utils/acars_free_text.test.ts new file mode 100644 index 0000000..f3b33e0 --- /dev/null +++ b/lib/utils/acars_free_text.test.ts @@ -0,0 +1,13 @@ +import { formatAcarsFreeText } from './acars_free_text'; + +describe('acars free text helper', () => { + test('cleans whitespace', () => { + expect(formatAcarsFreeText(' HELLO WORLD ')).toBe('HELLO WORLD'); + }); + + test('handles empty input', () => { + expect(formatAcarsFreeText('')).toBe(''); + expect(formatAcarsFreeText(null)).toBe(''); + expect(formatAcarsFreeText(undefined)).toBe(''); + }); +}); diff --git a/lib/utils/acars_free_text.ts b/lib/utils/acars_free_text.ts new file mode 100644 index 0000000..c0c28f1 --- /dev/null +++ b/lib/utils/acars_free_text.ts @@ -0,0 +1,4 @@ +export function formatAcarsFreeText(text?: string | null): string { + if (!text) return ''; + return text.trim().replace(/\s+/g, ' '); +} diff --git a/lib/utils/emergency_squawk.test.ts b/lib/utils/emergency_squawk.test.ts new file mode 100644 index 0000000..d952902 --- /dev/null +++ b/lib/utils/emergency_squawk.test.ts @@ -0,0 +1,44 @@ +import { + getEmergencySquawkInfo, + isEmergencySquawk, + formatEmergencySquawk, +} from './emergency_squawk'; + +describe('emergency squawk helpers', () => { + test('recognizes 7500', () => { + expect(isEmergencySquawk(7500)).toBe(true); + expect(getEmergencySquawkInfo(7500)).toEqual({ + code: 7500, + meaning: 'Unlawful interference / hijacking', + }); + expect(formatEmergencySquawk(7500)).toBe( + '7500: Unlawful interference / hijacking', + ); + }); + + test('recognizes 7600', () => { + expect(isEmergencySquawk(7600)).toBe(true); + expect(getEmergencySquawkInfo(7600)).toEqual({ + code: 7600, + meaning: 'Radio communication failure', + }); + expect(formatEmergencySquawk(7600)).toBe( + '7600: Radio communication failure', + ); + }); + + test('recognizes 7700', () => { + expect(isEmergencySquawk(7700)).toBe(true); + expect(getEmergencySquawkInfo(7700)).toEqual({ + code: 7700, + meaning: 'General emergency', + }); + expect(formatEmergencySquawk(7700)).toBe('7700: General emergency'); + }); + + test('rejects unknown codes', () => { + expect(isEmergencySquawk(1234)).toBe(false); + expect(getEmergencySquawkInfo(1234)).toBeNull(); + expect(formatEmergencySquawk(1234)).toBe('Unknown squawk code: 1234'); + }); +}); diff --git a/lib/utils/emergency_squawk.ts b/lib/utils/emergency_squawk.ts new file mode 100644 index 0000000..bb23071 --- /dev/null +++ b/lib/utils/emergency_squawk.ts @@ -0,0 +1,31 @@ +export type EmergencySquawkCode = 7500 | 7600 | 7700; + +export interface EmergencySquawkInfo { + code: number; + meaning: string; +} + +const SQUAWK_MAP: Record = { + 7500: 'Unlawful interference / hijacking', + 7600: 'Radio communication failure', + 7700: 'General emergency', +}; + +export function getEmergencySquawkInfo( + code: number, +): EmergencySquawkInfo | null { + const meaning = SQUAWK_MAP[code]; + if (!meaning) return null; + return { code, meaning }; +} + +export function isEmergencySquawk(code: number): boolean { + return code in SQUAWK_MAP; +} + +export function formatEmergencySquawk(code: number): string { + const info = getEmergencySquawkInfo(code); + return info + ? `${info.code}: ${info.meaning}` + : `Unknown squawk code: ${code}`; +}