@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.js
CHANGED
|
@@ -441,15 +441,6 @@ var ResultFormatter = class {
|
|
|
441
441
|
value: `${from} -> ${to}`
|
|
442
442
|
});
|
|
443
443
|
}
|
|
444
|
-
static freetext(decodeResult, value) {
|
|
445
|
-
decodeResult.raw.freetext = value;
|
|
446
|
-
decodeResult.formatted.items.push({
|
|
447
|
-
type: "freetext",
|
|
448
|
-
code: "FREE_TEXT",
|
|
449
|
-
label: "Free Text",
|
|
450
|
-
value
|
|
451
|
-
});
|
|
452
|
-
}
|
|
453
444
|
static door_event(decodeResult, name, state) {
|
|
454
445
|
decodeResult.raw.door_event = {
|
|
455
446
|
door: name,
|
|
@@ -966,6 +957,24 @@ var ResultFormatter = class {
|
|
|
966
957
|
value: DateTimeUtils.timestampToString(value, "epoch")
|
|
967
958
|
});
|
|
968
959
|
}
|
|
960
|
+
static sequenceNumber(decodeResult, value) {
|
|
961
|
+
decodeResult.raw.sequence_number = value;
|
|
962
|
+
decodeResult.formatted.items.push({
|
|
963
|
+
type: "sequence",
|
|
964
|
+
code: "SEQ",
|
|
965
|
+
label: "Sequence Number",
|
|
966
|
+
value: decodeResult.raw.sequence_number
|
|
967
|
+
});
|
|
968
|
+
}
|
|
969
|
+
static sequenceResponse(decodeResult, value) {
|
|
970
|
+
decodeResult.raw.sequence_response = value;
|
|
971
|
+
decodeResult.formatted.items.push({
|
|
972
|
+
type: "sequence",
|
|
973
|
+
code: "SEQ_RESP",
|
|
974
|
+
label: "Sequence Response",
|
|
975
|
+
value: decodeResult.raw.sequence_response
|
|
976
|
+
});
|
|
977
|
+
}
|
|
969
978
|
static unknown(decodeResult, value, sep = ",") {
|
|
970
979
|
if (!decodeResult.remaining.text) decodeResult.remaining.text = value;
|
|
971
980
|
else decodeResult.remaining.text += sep + value;
|
|
@@ -3012,8 +3021,9 @@ var FlightPlanUtils = class _FlightPlanUtils {
|
|
|
3012
3021
|
/**
|
|
3013
3022
|
* Processes flight plan data
|
|
3014
3023
|
*
|
|
3015
|
-
* Expected format is [header,
|
|
3024
|
+
* Expected format is [header, fpei, val1, ... fpeiN, valN]
|
|
3016
3025
|
*
|
|
3026
|
+
* @see https://atlaske-content.garmin.com/filestorage//email/outbound/attachments/GTN_Flight_Plan_and_User_Waypoint_transfer_Time1712844670119.pdf
|
|
3017
3027
|
* @param decodeResult - results
|
|
3018
3028
|
* @param data - original message split by ':'
|
|
3019
3029
|
* @returns whether all fields were processed or not
|
|
@@ -3021,9 +3031,9 @@ var FlightPlanUtils = class _FlightPlanUtils {
|
|
|
3021
3031
|
static processFlightPlan(decodeResult, data) {
|
|
3022
3032
|
let allKnownFields = _FlightPlanUtils.parseHeader(decodeResult, data[0]);
|
|
3023
3033
|
for (let i = 1; i < data.length; i += 2) {
|
|
3024
|
-
const
|
|
3034
|
+
const fpei = data[i];
|
|
3025
3035
|
const value = data[i + 1];
|
|
3026
|
-
switch (
|
|
3036
|
+
switch (fpei) {
|
|
3027
3037
|
case "A":
|
|
3028
3038
|
_FlightPlanUtils.addProcedure(decodeResult, value, "arrival");
|
|
3029
3039
|
break;
|
|
@@ -3058,7 +3068,7 @@ var FlightPlanUtils = class _FlightPlanUtils {
|
|
|
3058
3068
|
decodeResult.remaining.text = "";
|
|
3059
3069
|
allKnownFields = false;
|
|
3060
3070
|
}
|
|
3061
|
-
decodeResult.remaining.text += `:${
|
|
3071
|
+
decodeResult.remaining.text += `:${fpei}:${value}`;
|
|
3062
3072
|
decodeResult.decoder.decodeLevel = "partial";
|
|
3063
3073
|
}
|
|
3064
3074
|
}
|
|
@@ -3394,7 +3404,7 @@ var Label_4A_DIS = class extends DecoderPlugin {
|
|
|
3394
3404
|
DateTimeUtils.convertHHMMSSToTod(fields[1].substring(2) + "00")
|
|
3395
3405
|
);
|
|
3396
3406
|
ResultFormatter.callsign(decodeResult, fields[2]);
|
|
3397
|
-
ResultFormatter.
|
|
3407
|
+
ResultFormatter.text(decodeResult, fields.slice(3).join(""));
|
|
3398
3408
|
if (decodeResult.decoded) {
|
|
3399
3409
|
if (!decodeResult.remaining.text)
|
|
3400
3410
|
decodeResult.decoder.decodeLevel = "full";
|
|
@@ -4012,9 +4022,22 @@ var Label_ColonComma = class extends DecoderPlugin {
|
|
|
4012
4022
|
}
|
|
4013
4023
|
};
|
|
4014
4024
|
|
|
4015
|
-
// lib/utils/
|
|
4016
|
-
var
|
|
4025
|
+
// lib/utils/arinc_702_helper.ts
|
|
4026
|
+
var Arinc702Helper = class _Arinc702Helper {
|
|
4027
|
+
/**
|
|
4028
|
+
* Decodes an ARINC 702 message
|
|
4029
|
+
*
|
|
4030
|
+
* Steps:
|
|
4031
|
+
* 1. Check against known checksum algorithms to determine if message is valid
|
|
4032
|
+
* 2. Parse the Imbedded Message Identifier (IMI) to determine the type of message
|
|
4033
|
+
* 3. Iterate through the Information Elements (IEI) and decode known fields, while storing unknown fields for further analysis
|
|
4034
|
+
*
|
|
4035
|
+
* @param decodeResult - object to store decoded results in
|
|
4036
|
+
* @param message - message to decode
|
|
4037
|
+
* @returns boolean indicating if the message was successfully decoded
|
|
4038
|
+
*/
|
|
4017
4039
|
static decodeH1Message(decodeResult, message) {
|
|
4040
|
+
decodeResult.remaining.text = "";
|
|
4018
4041
|
const checksum = parseInt(message.slice(-4), 16);
|
|
4019
4042
|
const data = message.slice(0, message.length - 4);
|
|
4020
4043
|
let checksumAlgorithmUsed = "";
|
|
@@ -4035,9 +4058,9 @@ var H1Helper = class _H1Helper {
|
|
|
4035
4058
|
return false;
|
|
4036
4059
|
}
|
|
4037
4060
|
for (let i = 1; i < fields.length; ++i) {
|
|
4038
|
-
const
|
|
4061
|
+
const iei = fields[i].substring(0, 2);
|
|
4039
4062
|
const data2 = fields[i].substring(2);
|
|
4040
|
-
switch (
|
|
4063
|
+
switch (iei) {
|
|
4041
4064
|
case "AF":
|
|
4042
4065
|
processAirField(decodeResult, data2.split(","));
|
|
4043
4066
|
break;
|
|
@@ -4072,7 +4095,7 @@ var H1Helper = class _H1Helper {
|
|
|
4072
4095
|
decodeResult.raw.flight_number = data2;
|
|
4073
4096
|
break;
|
|
4074
4097
|
case "FX":
|
|
4075
|
-
ResultFormatter.
|
|
4098
|
+
ResultFormatter.text(decodeResult, data2);
|
|
4076
4099
|
break;
|
|
4077
4100
|
case "GA":
|
|
4078
4101
|
ResultFormatter.groundAddress(decodeResult, data2);
|
|
@@ -4083,11 +4106,18 @@ var H1Helper = class _H1Helper {
|
|
|
4083
4106
|
case "LR":
|
|
4084
4107
|
processLandingReport(decodeResult, data2.split(","));
|
|
4085
4108
|
break;
|
|
4109
|
+
case "MR":
|
|
4110
|
+
processMessageReference(decodeResult, data2.split(","));
|
|
4111
|
+
break;
|
|
4086
4112
|
case "PR":
|
|
4087
|
-
|
|
4113
|
+
processPerformanceData(decodeResult, data2.split(","));
|
|
4088
4114
|
break;
|
|
4115
|
+
//case 'PR':
|
|
4116
|
+
// TODO: decode /PR fields
|
|
4117
|
+
// ResultFormatter.unknown(decodeResult, fields[i], '/');
|
|
4118
|
+
// break;
|
|
4089
4119
|
case "PS":
|
|
4090
|
-
|
|
4120
|
+
_Arinc702Helper.processPS(decodeResult, data2.split(","));
|
|
4091
4121
|
break;
|
|
4092
4122
|
case "RF":
|
|
4093
4123
|
case "RI":
|
|
@@ -4112,7 +4142,7 @@ var H1Helper = class _H1Helper {
|
|
|
4112
4142
|
processTimeOfDeparture(decodeResult, data2.split(","));
|
|
4113
4143
|
break;
|
|
4114
4144
|
case "TS":
|
|
4115
|
-
|
|
4145
|
+
_Arinc702Helper.processTimeStamp(decodeResult, data2.split(","));
|
|
4116
4146
|
break;
|
|
4117
4147
|
case "VR":
|
|
4118
4148
|
ResultFormatter.version(decodeResult, parseInt(data2, 10) / 10);
|
|
@@ -4124,6 +4154,8 @@ var H1Helper = class _H1Helper {
|
|
|
4124
4154
|
processWeatherQuery(decodeResult, data2.split(":"));
|
|
4125
4155
|
break;
|
|
4126
4156
|
default:
|
|
4157
|
+
console.log(`Unknown IEI ${iei} in H1 message, data: ${data2}`);
|
|
4158
|
+
console.log(`Remaing text: ${decodeResult.remaining.text}`);
|
|
4127
4159
|
ResultFormatter.unknown(decodeResult, fields[i], "/");
|
|
4128
4160
|
}
|
|
4129
4161
|
}
|
|
@@ -4214,14 +4246,14 @@ function processAirField(decodeResult, data) {
|
|
|
4214
4246
|
}
|
|
4215
4247
|
function processTimeOfDeparture(decodeResult, data) {
|
|
4216
4248
|
if (data.length === 2) {
|
|
4217
|
-
decodeResult.raw.
|
|
4249
|
+
decodeResult.raw.planned_departure_time = data[0];
|
|
4218
4250
|
decodeResult.formatted.items.push({
|
|
4219
4251
|
type: "ptd",
|
|
4220
4252
|
code: "ptd",
|
|
4221
4253
|
label: "Planned Departure Time",
|
|
4222
4254
|
value: `YYYY-MM-${data[0].substring(0, 2)}T${data[0].substring(2, 4)}:${data[0].substring(4)}:00Z`
|
|
4223
4255
|
});
|
|
4224
|
-
decodeResult.raw.
|
|
4256
|
+
decodeResult.raw.estimated_departure_time = data[1];
|
|
4225
4257
|
decodeResult.formatted.items.push({
|
|
4226
4258
|
type: "etd",
|
|
4227
4259
|
code: "etd",
|
|
@@ -4314,12 +4346,15 @@ function parseMessageType(decodeResult, messagePart) {
|
|
|
4314
4346
|
const messageParts = messagePart.split(",");
|
|
4315
4347
|
const messageType = messageParts[0];
|
|
4316
4348
|
if (messageType.startsWith("POS")) {
|
|
4317
|
-
|
|
4318
|
-
|
|
4349
|
+
Arinc702Helper.processPosition(
|
|
4350
|
+
decodeResult,
|
|
4351
|
+
messagePart.substring(3).split(",")
|
|
4352
|
+
);
|
|
4353
|
+
return processIMI(decodeResult, "POS");
|
|
4319
4354
|
} else if (messageType.length === 6) {
|
|
4320
|
-
const part1 =
|
|
4355
|
+
const part1 = processIMI(decodeResult, messageType.substring(0, 3));
|
|
4321
4356
|
const description = decodeResult.formatted.description;
|
|
4322
|
-
const part2 =
|
|
4357
|
+
const part2 = processIMI(decodeResult, messageType.substring(3, 6));
|
|
4323
4358
|
decodeResult.formatted.description = description + " for " + decodeResult.formatted.description;
|
|
4324
4359
|
if (messageParts.length > 1) {
|
|
4325
4360
|
ResultFormatter.unknown(
|
|
@@ -4333,9 +4368,9 @@ function parseMessageType(decodeResult, messagePart) {
|
|
|
4333
4368
|
if (messageParts.length > 1) {
|
|
4334
4369
|
ResultFormatter.unknown(decodeResult, messageParts.slice(1).join(","), "/");
|
|
4335
4370
|
}
|
|
4336
|
-
return
|
|
4371
|
+
return processIMI(decodeResult, messageType);
|
|
4337
4372
|
}
|
|
4338
|
-
function
|
|
4373
|
+
function processIMI(decodeResult, type) {
|
|
4339
4374
|
if (type === "FPN") {
|
|
4340
4375
|
decodeResult.formatted.description = "Flight Plan";
|
|
4341
4376
|
} else if (type === "FTX") {
|
|
@@ -4362,12 +4397,42 @@ function processMessageType(decodeResult, type) {
|
|
|
4362
4397
|
decodeResult.formatted.description = "Request";
|
|
4363
4398
|
} else if (type === "RES") {
|
|
4364
4399
|
decodeResult.formatted.description = "Response";
|
|
4400
|
+
} else if (type === "SUM") {
|
|
4401
|
+
decodeResult.formatted.description = "Summary Report";
|
|
4365
4402
|
} else {
|
|
4366
4403
|
decodeResult.formatted.description = "Unknown H1 Message";
|
|
4367
4404
|
return false;
|
|
4368
4405
|
}
|
|
4369
4406
|
return true;
|
|
4370
4407
|
}
|
|
4408
|
+
function processPerformanceData(decodeResult, data) {
|
|
4409
|
+
if (data.length < 3) {
|
|
4410
|
+
ResultFormatter.unknownArr(decodeResult, data, ",");
|
|
4411
|
+
return;
|
|
4412
|
+
}
|
|
4413
|
+
if (data[2] !== void 0 && data[2] !== "") {
|
|
4414
|
+
const alt = Number(data[2]) * 100;
|
|
4415
|
+
if (!isNaN(alt) && alt > 0) {
|
|
4416
|
+
ResultFormatter.altitude(decodeResult, alt);
|
|
4417
|
+
}
|
|
4418
|
+
}
|
|
4419
|
+
if (data.length > 8 && data[8] !== void 0 && data[8] !== "") {
|
|
4420
|
+
ResultFormatter.temperature(decodeResult, data[8]);
|
|
4421
|
+
}
|
|
4422
|
+
const remaining = [];
|
|
4423
|
+
for (let i = 0; i < data.length; i++) {
|
|
4424
|
+
if (i === 2 && data[i] !== "" && !isNaN(Number(data[i])) && Number(data[i]) * 100 > 0) {
|
|
4425
|
+
continue;
|
|
4426
|
+
}
|
|
4427
|
+
if (i === 8 && data[i] !== "" && (data[i].startsWith("M") || data[i].startsWith("P") || !isNaN(Number(data[i])))) {
|
|
4428
|
+
continue;
|
|
4429
|
+
}
|
|
4430
|
+
remaining.push(data[i]);
|
|
4431
|
+
}
|
|
4432
|
+
if (remaining.length > 0 && remaining.some((r) => r !== "")) {
|
|
4433
|
+
ResultFormatter.unknown(decodeResult, remaining.join(","), "/PR");
|
|
4434
|
+
}
|
|
4435
|
+
}
|
|
4371
4436
|
function processDateCode(decodeResult, data) {
|
|
4372
4437
|
if (data.length === 1) {
|
|
4373
4438
|
} else if (data.length === 2) {
|
|
@@ -4490,13 +4555,23 @@ function crc16Genibus(data) {
|
|
|
4490
4555
|
}
|
|
4491
4556
|
return (crc ^ 65535) & 65535;
|
|
4492
4557
|
}
|
|
4558
|
+
function processMessageReference(decodeResult, data) {
|
|
4559
|
+
if (data.length !== 2) {
|
|
4560
|
+
ResultFormatter.unknown(decodeResult, data.join(","), "/MR");
|
|
4561
|
+
return;
|
|
4562
|
+
}
|
|
4563
|
+
ResultFormatter.sequenceNumber(decodeResult, parseInt(data[0], 10));
|
|
4564
|
+
if (data[1] !== "") {
|
|
4565
|
+
ResultFormatter.sequenceResponse(decodeResult, parseInt(data[1], 10));
|
|
4566
|
+
}
|
|
4567
|
+
}
|
|
4493
4568
|
|
|
4494
|
-
// lib/plugins/
|
|
4495
|
-
var
|
|
4496
|
-
name = "
|
|
4569
|
+
// lib/plugins/ARINC_702.ts
|
|
4570
|
+
var Arinc702 = class extends DecoderPlugin {
|
|
4571
|
+
name = "arinc-702";
|
|
4497
4572
|
qualifiers() {
|
|
4498
4573
|
return {
|
|
4499
|
-
labels: ["
|
|
4574
|
+
labels: ["*"]
|
|
4500
4575
|
};
|
|
4501
4576
|
}
|
|
4502
4577
|
decode(message, options = {}) {
|
|
@@ -4505,13 +4580,13 @@ var Label_H1 = class extends DecoderPlugin {
|
|
|
4505
4580
|
decodeResult.message = message;
|
|
4506
4581
|
const msg = message.text.replace(/\n|\r/g, "");
|
|
4507
4582
|
let decoded = false;
|
|
4508
|
-
decoded =
|
|
4583
|
+
decoded = Arinc702Helper.decodeH1Message(decodeResult, msg);
|
|
4509
4584
|
if (decoded) {
|
|
4510
4585
|
return this.processDecodeResult(decodeResult, decoded, options, message);
|
|
4511
4586
|
}
|
|
4512
4587
|
if (msg.startsWith("/")) {
|
|
4513
4588
|
const headerData = msg.split(".");
|
|
4514
|
-
decoded =
|
|
4589
|
+
decoded = Arinc702Helper.decodeH1Message(
|
|
4515
4590
|
decodeResult,
|
|
4516
4591
|
headerData.slice(1).join(".")
|
|
4517
4592
|
);
|
|
@@ -4528,7 +4603,7 @@ var Label_H1 = class extends DecoderPlugin {
|
|
|
4528
4603
|
const hashParts = msg.split("#");
|
|
4529
4604
|
if (hashParts.length == 2) {
|
|
4530
4605
|
const offset = hashParts[0] === "- " || isNaN(parseInt(hashParts[1][1])) ? 3 : 4;
|
|
4531
|
-
decoded =
|
|
4606
|
+
decoded = Arinc702Helper.decodeH1Message(
|
|
4532
4607
|
decodeResult,
|
|
4533
4608
|
msg.slice(hashParts[0].length + offset)
|
|
4534
4609
|
);
|
|
@@ -4547,7 +4622,7 @@ var Label_H1 = class extends DecoderPlugin {
|
|
|
4547
4622
|
}
|
|
4548
4623
|
const slashParts = msg.split("/");
|
|
4549
4624
|
if (slashParts[0].length > 3) {
|
|
4550
|
-
decoded =
|
|
4625
|
+
decoded = Arinc702Helper.decodeH1Message(
|
|
4551
4626
|
decodeResult,
|
|
4552
4627
|
msg.slice(slashParts[0].length - 3)
|
|
4553
4628
|
);
|
|
@@ -6174,6 +6249,7 @@ var MessageDecoder = class {
|
|
|
6174
6249
|
this.plugins = [];
|
|
6175
6250
|
this.debug = false;
|
|
6176
6251
|
this.registerPlugin(new CBand(this));
|
|
6252
|
+
this.registerPlugin(new Arinc702(this));
|
|
6177
6253
|
this.registerPlugin(new Label_ColonComma(this));
|
|
6178
6254
|
this.registerPlugin(new Label_5Z_Slash(this));
|
|
6179
6255
|
this.registerPlugin(new Label_10_LDR(this));
|
|
@@ -6221,7 +6297,6 @@ var MessageDecoder = class {
|
|
|
6221
6297
|
this.registerPlugin(new Label_H1_OHMA(this));
|
|
6222
6298
|
this.registerPlugin(new Label_H1_Paren(this));
|
|
6223
6299
|
this.registerPlugin(new Label_H1_WRN(this));
|
|
6224
|
-
this.registerPlugin(new Label_H1(this));
|
|
6225
6300
|
this.registerPlugin(new Label_H1_StarPOS(this));
|
|
6226
6301
|
this.registerPlugin(new Label_HX(this));
|
|
6227
6302
|
this.registerPlugin(new Label_58(this));
|