@airframes/acars-decoder 1.8.11 → 1.8.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +114 -39
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +114 -39
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -1
package/dist/index.mjs
CHANGED
|
@@ -404,15 +404,6 @@ var ResultFormatter = class {
|
|
|
404
404
|
value: `${from} -> ${to}`
|
|
405
405
|
});
|
|
406
406
|
}
|
|
407
|
-
static freetext(decodeResult, value) {
|
|
408
|
-
decodeResult.raw.freetext = value;
|
|
409
|
-
decodeResult.formatted.items.push({
|
|
410
|
-
type: "freetext",
|
|
411
|
-
code: "FREE_TEXT",
|
|
412
|
-
label: "Free Text",
|
|
413
|
-
value
|
|
414
|
-
});
|
|
415
|
-
}
|
|
416
407
|
static door_event(decodeResult, name, state) {
|
|
417
408
|
decodeResult.raw.door_event = {
|
|
418
409
|
door: name,
|
|
@@ -929,6 +920,24 @@ var ResultFormatter = class {
|
|
|
929
920
|
value: DateTimeUtils.timestampToString(value, "epoch")
|
|
930
921
|
});
|
|
931
922
|
}
|
|
923
|
+
static sequenceNumber(decodeResult, value) {
|
|
924
|
+
decodeResult.raw.sequence_number = value;
|
|
925
|
+
decodeResult.formatted.items.push({
|
|
926
|
+
type: "sequence",
|
|
927
|
+
code: "SEQ",
|
|
928
|
+
label: "Sequence Number",
|
|
929
|
+
value: decodeResult.raw.sequence_number
|
|
930
|
+
});
|
|
931
|
+
}
|
|
932
|
+
static sequenceResponse(decodeResult, value) {
|
|
933
|
+
decodeResult.raw.sequence_response = value;
|
|
934
|
+
decodeResult.formatted.items.push({
|
|
935
|
+
type: "sequence",
|
|
936
|
+
code: "SEQ_RESP",
|
|
937
|
+
label: "Sequence Response",
|
|
938
|
+
value: decodeResult.raw.sequence_response
|
|
939
|
+
});
|
|
940
|
+
}
|
|
932
941
|
static unknown(decodeResult, value, sep = ",") {
|
|
933
942
|
if (!decodeResult.remaining.text) decodeResult.remaining.text = value;
|
|
934
943
|
else decodeResult.remaining.text += sep + value;
|
|
@@ -2975,8 +2984,9 @@ var FlightPlanUtils = class _FlightPlanUtils {
|
|
|
2975
2984
|
/**
|
|
2976
2985
|
* Processes flight plan data
|
|
2977
2986
|
*
|
|
2978
|
-
* Expected format is [header,
|
|
2987
|
+
* Expected format is [header, fpei, val1, ... fpeiN, valN]
|
|
2979
2988
|
*
|
|
2989
|
+
* @see https://atlaske-content.garmin.com/filestorage//email/outbound/attachments/GTN_Flight_Plan_and_User_Waypoint_transfer_Time1712844670119.pdf
|
|
2980
2990
|
* @param decodeResult - results
|
|
2981
2991
|
* @param data - original message split by ':'
|
|
2982
2992
|
* @returns whether all fields were processed or not
|
|
@@ -2984,9 +2994,9 @@ var FlightPlanUtils = class _FlightPlanUtils {
|
|
|
2984
2994
|
static processFlightPlan(decodeResult, data) {
|
|
2985
2995
|
let allKnownFields = _FlightPlanUtils.parseHeader(decodeResult, data[0]);
|
|
2986
2996
|
for (let i = 1; i < data.length; i += 2) {
|
|
2987
|
-
const
|
|
2997
|
+
const fpei = data[i];
|
|
2988
2998
|
const value = data[i + 1];
|
|
2989
|
-
switch (
|
|
2999
|
+
switch (fpei) {
|
|
2990
3000
|
case "A":
|
|
2991
3001
|
_FlightPlanUtils.addProcedure(decodeResult, value, "arrival");
|
|
2992
3002
|
break;
|
|
@@ -3021,7 +3031,7 @@ var FlightPlanUtils = class _FlightPlanUtils {
|
|
|
3021
3031
|
decodeResult.remaining.text = "";
|
|
3022
3032
|
allKnownFields = false;
|
|
3023
3033
|
}
|
|
3024
|
-
decodeResult.remaining.text += `:${
|
|
3034
|
+
decodeResult.remaining.text += `:${fpei}:${value}`;
|
|
3025
3035
|
decodeResult.decoder.decodeLevel = "partial";
|
|
3026
3036
|
}
|
|
3027
3037
|
}
|
|
@@ -3357,7 +3367,7 @@ var Label_4A_DIS = class extends DecoderPlugin {
|
|
|
3357
3367
|
DateTimeUtils.convertHHMMSSToTod(fields[1].substring(2) + "00")
|
|
3358
3368
|
);
|
|
3359
3369
|
ResultFormatter.callsign(decodeResult, fields[2]);
|
|
3360
|
-
ResultFormatter.
|
|
3370
|
+
ResultFormatter.text(decodeResult, fields.slice(3).join(""));
|
|
3361
3371
|
if (decodeResult.decoded) {
|
|
3362
3372
|
if (!decodeResult.remaining.text)
|
|
3363
3373
|
decodeResult.decoder.decodeLevel = "full";
|
|
@@ -3975,9 +3985,22 @@ var Label_ColonComma = class extends DecoderPlugin {
|
|
|
3975
3985
|
}
|
|
3976
3986
|
};
|
|
3977
3987
|
|
|
3978
|
-
// lib/utils/
|
|
3979
|
-
var
|
|
3988
|
+
// lib/utils/arinc_702_helper.ts
|
|
3989
|
+
var Arinc702Helper = class _Arinc702Helper {
|
|
3990
|
+
/**
|
|
3991
|
+
* Decodes an ARINC 702 message
|
|
3992
|
+
*
|
|
3993
|
+
* Steps:
|
|
3994
|
+
* 1. Check against known checksum algorithms to determine if message is valid
|
|
3995
|
+
* 2. Parse the Imbedded Message Identifier (IMI) to determine the type of message
|
|
3996
|
+
* 3. Iterate through the Information Elements (IEI) and decode known fields, while storing unknown fields for further analysis
|
|
3997
|
+
*
|
|
3998
|
+
* @param decodeResult - object to store decoded results in
|
|
3999
|
+
* @param message - message to decode
|
|
4000
|
+
* @returns boolean indicating if the message was successfully decoded
|
|
4001
|
+
*/
|
|
3980
4002
|
static decodeH1Message(decodeResult, message) {
|
|
4003
|
+
decodeResult.remaining.text = "";
|
|
3981
4004
|
const checksum = parseInt(message.slice(-4), 16);
|
|
3982
4005
|
const data = message.slice(0, message.length - 4);
|
|
3983
4006
|
let checksumAlgorithmUsed = "";
|
|
@@ -3998,9 +4021,9 @@ var H1Helper = class _H1Helper {
|
|
|
3998
4021
|
return false;
|
|
3999
4022
|
}
|
|
4000
4023
|
for (let i = 1; i < fields.length; ++i) {
|
|
4001
|
-
const
|
|
4024
|
+
const iei = fields[i].substring(0, 2);
|
|
4002
4025
|
const data2 = fields[i].substring(2);
|
|
4003
|
-
switch (
|
|
4026
|
+
switch (iei) {
|
|
4004
4027
|
case "AF":
|
|
4005
4028
|
processAirField(decodeResult, data2.split(","));
|
|
4006
4029
|
break;
|
|
@@ -4035,7 +4058,7 @@ var H1Helper = class _H1Helper {
|
|
|
4035
4058
|
decodeResult.raw.flight_number = data2;
|
|
4036
4059
|
break;
|
|
4037
4060
|
case "FX":
|
|
4038
|
-
ResultFormatter.
|
|
4061
|
+
ResultFormatter.text(decodeResult, data2);
|
|
4039
4062
|
break;
|
|
4040
4063
|
case "GA":
|
|
4041
4064
|
ResultFormatter.groundAddress(decodeResult, data2);
|
|
@@ -4046,11 +4069,18 @@ var H1Helper = class _H1Helper {
|
|
|
4046
4069
|
case "LR":
|
|
4047
4070
|
processLandingReport(decodeResult, data2.split(","));
|
|
4048
4071
|
break;
|
|
4072
|
+
case "MR":
|
|
4073
|
+
processMessageReference(decodeResult, data2.split(","));
|
|
4074
|
+
break;
|
|
4049
4075
|
case "PR":
|
|
4050
|
-
|
|
4076
|
+
processPerformanceData(decodeResult, data2.split(","));
|
|
4051
4077
|
break;
|
|
4078
|
+
//case 'PR':
|
|
4079
|
+
// TODO: decode /PR fields
|
|
4080
|
+
// ResultFormatter.unknown(decodeResult, fields[i], '/');
|
|
4081
|
+
// break;
|
|
4052
4082
|
case "PS":
|
|
4053
|
-
|
|
4083
|
+
_Arinc702Helper.processPS(decodeResult, data2.split(","));
|
|
4054
4084
|
break;
|
|
4055
4085
|
case "RF":
|
|
4056
4086
|
case "RI":
|
|
@@ -4075,7 +4105,7 @@ var H1Helper = class _H1Helper {
|
|
|
4075
4105
|
processTimeOfDeparture(decodeResult, data2.split(","));
|
|
4076
4106
|
break;
|
|
4077
4107
|
case "TS":
|
|
4078
|
-
|
|
4108
|
+
_Arinc702Helper.processTimeStamp(decodeResult, data2.split(","));
|
|
4079
4109
|
break;
|
|
4080
4110
|
case "VR":
|
|
4081
4111
|
ResultFormatter.version(decodeResult, parseInt(data2, 10) / 10);
|
|
@@ -4087,6 +4117,8 @@ var H1Helper = class _H1Helper {
|
|
|
4087
4117
|
processWeatherQuery(decodeResult, data2.split(":"));
|
|
4088
4118
|
break;
|
|
4089
4119
|
default:
|
|
4120
|
+
console.log(`Unknown IEI ${iei} in H1 message, data: ${data2}`);
|
|
4121
|
+
console.log(`Remaing text: ${decodeResult.remaining.text}`);
|
|
4090
4122
|
ResultFormatter.unknown(decodeResult, fields[i], "/");
|
|
4091
4123
|
}
|
|
4092
4124
|
}
|
|
@@ -4177,14 +4209,14 @@ function processAirField(decodeResult, data) {
|
|
|
4177
4209
|
}
|
|
4178
4210
|
function processTimeOfDeparture(decodeResult, data) {
|
|
4179
4211
|
if (data.length === 2) {
|
|
4180
|
-
decodeResult.raw.
|
|
4212
|
+
decodeResult.raw.planned_departure_time = data[0];
|
|
4181
4213
|
decodeResult.formatted.items.push({
|
|
4182
4214
|
type: "ptd",
|
|
4183
4215
|
code: "ptd",
|
|
4184
4216
|
label: "Planned Departure Time",
|
|
4185
4217
|
value: `YYYY-MM-${data[0].substring(0, 2)}T${data[0].substring(2, 4)}:${data[0].substring(4)}:00Z`
|
|
4186
4218
|
});
|
|
4187
|
-
decodeResult.raw.
|
|
4219
|
+
decodeResult.raw.estimated_departure_time = data[1];
|
|
4188
4220
|
decodeResult.formatted.items.push({
|
|
4189
4221
|
type: "etd",
|
|
4190
4222
|
code: "etd",
|
|
@@ -4277,12 +4309,15 @@ function parseMessageType(decodeResult, messagePart) {
|
|
|
4277
4309
|
const messageParts = messagePart.split(",");
|
|
4278
4310
|
const messageType = messageParts[0];
|
|
4279
4311
|
if (messageType.startsWith("POS")) {
|
|
4280
|
-
|
|
4281
|
-
|
|
4312
|
+
Arinc702Helper.processPosition(
|
|
4313
|
+
decodeResult,
|
|
4314
|
+
messagePart.substring(3).split(",")
|
|
4315
|
+
);
|
|
4316
|
+
return processIMI(decodeResult, "POS");
|
|
4282
4317
|
} else if (messageType.length === 6) {
|
|
4283
|
-
const part1 =
|
|
4318
|
+
const part1 = processIMI(decodeResult, messageType.substring(0, 3));
|
|
4284
4319
|
const description = decodeResult.formatted.description;
|
|
4285
|
-
const part2 =
|
|
4320
|
+
const part2 = processIMI(decodeResult, messageType.substring(3, 6));
|
|
4286
4321
|
decodeResult.formatted.description = description + " for " + decodeResult.formatted.description;
|
|
4287
4322
|
if (messageParts.length > 1) {
|
|
4288
4323
|
ResultFormatter.unknown(
|
|
@@ -4296,9 +4331,9 @@ function parseMessageType(decodeResult, messagePart) {
|
|
|
4296
4331
|
if (messageParts.length > 1) {
|
|
4297
4332
|
ResultFormatter.unknown(decodeResult, messageParts.slice(1).join(","), "/");
|
|
4298
4333
|
}
|
|
4299
|
-
return
|
|
4334
|
+
return processIMI(decodeResult, messageType);
|
|
4300
4335
|
}
|
|
4301
|
-
function
|
|
4336
|
+
function processIMI(decodeResult, type) {
|
|
4302
4337
|
if (type === "FPN") {
|
|
4303
4338
|
decodeResult.formatted.description = "Flight Plan";
|
|
4304
4339
|
} else if (type === "FTX") {
|
|
@@ -4325,12 +4360,42 @@ function processMessageType(decodeResult, type) {
|
|
|
4325
4360
|
decodeResult.formatted.description = "Request";
|
|
4326
4361
|
} else if (type === "RES") {
|
|
4327
4362
|
decodeResult.formatted.description = "Response";
|
|
4363
|
+
} else if (type === "SUM") {
|
|
4364
|
+
decodeResult.formatted.description = "Summary Report";
|
|
4328
4365
|
} else {
|
|
4329
4366
|
decodeResult.formatted.description = "Unknown H1 Message";
|
|
4330
4367
|
return false;
|
|
4331
4368
|
}
|
|
4332
4369
|
return true;
|
|
4333
4370
|
}
|
|
4371
|
+
function processPerformanceData(decodeResult, data) {
|
|
4372
|
+
if (data.length < 3) {
|
|
4373
|
+
ResultFormatter.unknownArr(decodeResult, data, ",");
|
|
4374
|
+
return;
|
|
4375
|
+
}
|
|
4376
|
+
if (data[2] !== void 0 && data[2] !== "") {
|
|
4377
|
+
const alt = Number(data[2]) * 100;
|
|
4378
|
+
if (!isNaN(alt) && alt > 0) {
|
|
4379
|
+
ResultFormatter.altitude(decodeResult, alt);
|
|
4380
|
+
}
|
|
4381
|
+
}
|
|
4382
|
+
if (data.length > 8 && data[8] !== void 0 && data[8] !== "") {
|
|
4383
|
+
ResultFormatter.temperature(decodeResult, data[8]);
|
|
4384
|
+
}
|
|
4385
|
+
const remaining = [];
|
|
4386
|
+
for (let i = 0; i < data.length; i++) {
|
|
4387
|
+
if (i === 2 && data[i] !== "" && !isNaN(Number(data[i])) && Number(data[i]) * 100 > 0) {
|
|
4388
|
+
continue;
|
|
4389
|
+
}
|
|
4390
|
+
if (i === 8 && data[i] !== "" && (data[i].startsWith("M") || data[i].startsWith("P") || !isNaN(Number(data[i])))) {
|
|
4391
|
+
continue;
|
|
4392
|
+
}
|
|
4393
|
+
remaining.push(data[i]);
|
|
4394
|
+
}
|
|
4395
|
+
if (remaining.length > 0 && remaining.some((r) => r !== "")) {
|
|
4396
|
+
ResultFormatter.unknown(decodeResult, remaining.join(","), "/PR");
|
|
4397
|
+
}
|
|
4398
|
+
}
|
|
4334
4399
|
function processDateCode(decodeResult, data) {
|
|
4335
4400
|
if (data.length === 1) {
|
|
4336
4401
|
} else if (data.length === 2) {
|
|
@@ -4453,13 +4518,23 @@ function crc16Genibus(data) {
|
|
|
4453
4518
|
}
|
|
4454
4519
|
return (crc ^ 65535) & 65535;
|
|
4455
4520
|
}
|
|
4521
|
+
function processMessageReference(decodeResult, data) {
|
|
4522
|
+
if (data.length !== 2) {
|
|
4523
|
+
ResultFormatter.unknown(decodeResult, data.join(","), "/MR");
|
|
4524
|
+
return;
|
|
4525
|
+
}
|
|
4526
|
+
ResultFormatter.sequenceNumber(decodeResult, parseInt(data[0], 10));
|
|
4527
|
+
if (data[1] !== "") {
|
|
4528
|
+
ResultFormatter.sequenceResponse(decodeResult, parseInt(data[1], 10));
|
|
4529
|
+
}
|
|
4530
|
+
}
|
|
4456
4531
|
|
|
4457
|
-
// lib/plugins/
|
|
4458
|
-
var
|
|
4459
|
-
name = "
|
|
4532
|
+
// lib/plugins/ARINC_702.ts
|
|
4533
|
+
var Arinc702 = class extends DecoderPlugin {
|
|
4534
|
+
name = "arinc-702";
|
|
4460
4535
|
qualifiers() {
|
|
4461
4536
|
return {
|
|
4462
|
-
labels: ["
|
|
4537
|
+
labels: ["*"]
|
|
4463
4538
|
};
|
|
4464
4539
|
}
|
|
4465
4540
|
decode(message, options = {}) {
|
|
@@ -4468,13 +4543,13 @@ var Label_H1 = class extends DecoderPlugin {
|
|
|
4468
4543
|
decodeResult.message = message;
|
|
4469
4544
|
const msg = message.text.replace(/\n|\r/g, "");
|
|
4470
4545
|
let decoded = false;
|
|
4471
|
-
decoded =
|
|
4546
|
+
decoded = Arinc702Helper.decodeH1Message(decodeResult, msg);
|
|
4472
4547
|
if (decoded) {
|
|
4473
4548
|
return this.processDecodeResult(decodeResult, decoded, options, message);
|
|
4474
4549
|
}
|
|
4475
4550
|
if (msg.startsWith("/")) {
|
|
4476
4551
|
const headerData = msg.split(".");
|
|
4477
|
-
decoded =
|
|
4552
|
+
decoded = Arinc702Helper.decodeH1Message(
|
|
4478
4553
|
decodeResult,
|
|
4479
4554
|
headerData.slice(1).join(".")
|
|
4480
4555
|
);
|
|
@@ -4491,7 +4566,7 @@ var Label_H1 = class extends DecoderPlugin {
|
|
|
4491
4566
|
const hashParts = msg.split("#");
|
|
4492
4567
|
if (hashParts.length == 2) {
|
|
4493
4568
|
const offset = hashParts[0] === "- " || isNaN(parseInt(hashParts[1][1])) ? 3 : 4;
|
|
4494
|
-
decoded =
|
|
4569
|
+
decoded = Arinc702Helper.decodeH1Message(
|
|
4495
4570
|
decodeResult,
|
|
4496
4571
|
msg.slice(hashParts[0].length + offset)
|
|
4497
4572
|
);
|
|
@@ -4510,7 +4585,7 @@ var Label_H1 = class extends DecoderPlugin {
|
|
|
4510
4585
|
}
|
|
4511
4586
|
const slashParts = msg.split("/");
|
|
4512
4587
|
if (slashParts[0].length > 3) {
|
|
4513
|
-
decoded =
|
|
4588
|
+
decoded = Arinc702Helper.decodeH1Message(
|
|
4514
4589
|
decodeResult,
|
|
4515
4590
|
msg.slice(slashParts[0].length - 3)
|
|
4516
4591
|
);
|
|
@@ -6137,6 +6212,7 @@ var MessageDecoder = class {
|
|
|
6137
6212
|
this.plugins = [];
|
|
6138
6213
|
this.debug = false;
|
|
6139
6214
|
this.registerPlugin(new CBand(this));
|
|
6215
|
+
this.registerPlugin(new Arinc702(this));
|
|
6140
6216
|
this.registerPlugin(new Label_ColonComma(this));
|
|
6141
6217
|
this.registerPlugin(new Label_5Z_Slash(this));
|
|
6142
6218
|
this.registerPlugin(new Label_10_LDR(this));
|
|
@@ -6184,7 +6260,6 @@ var MessageDecoder = class {
|
|
|
6184
6260
|
this.registerPlugin(new Label_H1_OHMA(this));
|
|
6185
6261
|
this.registerPlugin(new Label_H1_Paren(this));
|
|
6186
6262
|
this.registerPlugin(new Label_H1_WRN(this));
|
|
6187
|
-
this.registerPlugin(new Label_H1(this));
|
|
6188
6263
|
this.registerPlugin(new Label_H1_StarPOS(this));
|
|
6189
6264
|
this.registerPlugin(new Label_HX(this));
|
|
6190
6265
|
this.registerPlugin(new Label_58(this));
|