Skip to content

Commit 8ed52e5

Browse files
committed
LAD / LOD extensions for B records
example : I013637LAD B1526594446200N00547906EA013770137247
1 parent 4856ff8 commit 8ed52e5

File tree

2 files changed

+29
-9
lines changed

2 files changed

+29
-9
lines changed

index.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ const RE_K = /^K(\d{2})(\d{2})(\d{2})/;
2121
const RE_IJ = /^[IJ](\d{2})(?:\d{2}\d{2}[A-Z]{3})+/;
2222
const RE_TASK = /^C(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{4})([-\d]{2})(.*)/;
2323
const RE_TASKPOINT = /^C(\d{2})(\d{2})(\d{3})([NS])(\d{3})(\d{2})(\d{3})([EW])(.*)/;
24+
const RE_INT = /^\d*$/;
2425
/* tslint:enable:max-line-length */
2526

2627
const VALID_DATA_SOURCES = ['F', 'O', 'P'];
@@ -430,24 +431,26 @@ class IGCParser {
430431
throw new Error(`Invalid B record at line ${this.lineNumber}: ${line}`);
431432
}
432433

434+
let extensions: IGCParser.RecordExtensions = {};
435+
if (this.fixExtensions) {
436+
for (let { code, start, length } of this.fixExtensions) {
437+
extensions[code] = line.slice(start, start + length);
438+
}
439+
}
440+
433441
let time = `${match[1]}:${match[2]}:${match[3]}`;
434442
let timestamp = this.calcTimestamp(time);
435443

436-
let latitude = IGCParser.parseLatitude(match[4], match[5], match[6], match[7]);
437-
let longitude = IGCParser.parseLongitude(match[8], match[9], match[10], match[11]);
444+
let mmmext = (RE_INT.test(extensions['LAD'])) ? extensions['LAD'] : '';
445+
let latitude = IGCParser.parseLatitude(match[4], match[5], match[6] + mmmext, match[7]);
446+
mmmext = (RE_INT.test(extensions['LOD'])) ? extensions['LOD'] : '';
447+
let longitude = IGCParser.parseLongitude(match[8], match[9], match[10] + mmmext, match[11]);
438448

439449
let valid = match[12] === 'A';
440450

441451
let pressureAltitude = match[13] === '00000' ? null : parseInt(match[13], 10);
442452
let gpsAltitude = match[14] === '00000' ? null : parseInt(match[14], 10);
443453

444-
let extensions: IGCParser.RecordExtensions = {};
445-
if (this.fixExtensions) {
446-
for (let { code, start, length } of this.fixExtensions) {
447-
extensions[code] = line.slice(start, start + length);
448-
}
449-
}
450-
451454
let enl = null;
452455
if (extensions['ENL']) {
453456
let enlLength = this.fixExtensions.filter(it => it.code === 'ENL')[0].length;

test.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,18 @@ describe('IGCParser', () => {
112112
expect(result.errors).toMatchSnapshot();
113113
});
114114

115+
test('lad_lod_extensions.igc', () => {
116+
let content = fs.readFileSync(`${__dirname}/fixtures/lad_lod_extensions.igc`, 'utf8');
117+
let result = IGCParser.parse(content, { lenient: true });
118+
119+
expect(result.fixes.length).toEqual(424);
120+
121+
expect(result.fixes[0].latitude).toEqual(44.968046666666666);
122+
expect(result.fixes[0].longitude).toEqual(5.833138333333333);
123+
124+
expect(result.errors).toMatchSnapshot();
125+
});
126+
115127
it('throws if HFDTE is missing', () => {
116128
let lines = [
117129
'ALXV6M7FLIGHT:1',
@@ -354,6 +366,11 @@ describe('IGCParser', () => {
354366
{ code: 'ACZ', start: 63, length: 4 },
355367
]);
356368

369+
test.pass('I023636LAD3737LOD', [
370+
{ code: 'LAD', start: 35, length: 1 },
371+
{ code: 'LOD', start: 36, length: 1 },
372+
]);
373+
357374
test.fail('');
358375
test.fail('I023638FXA');
359376
test.fail('I0136FXA38');

0 commit comments

Comments
 (0)