@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 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, key1, val1, ... keyN, valN]
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 key = data[i];
3034
+ const fpei = data[i];
3025
3035
  const value = data[i + 1];
3026
- switch (key) {
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 += `:${key}:${value}`;
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.freetext(decodeResult, fields.slice(3).join(""));
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/h1_helper.ts
4016
- var H1Helper = class _H1Helper {
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 key = fields[i].substring(0, 2);
4061
+ const iei = fields[i].substring(0, 2);
4039
4062
  const data2 = fields[i].substring(2);
4040
- switch (key) {
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.freetext(decodeResult, data2);
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
- ResultFormatter.unknown(decodeResult, fields[i], "/");
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
- _H1Helper.processPS(decodeResult, data2.split(","));
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
- _H1Helper.processTimeStamp(decodeResult, data2.split(","));
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.plannedDepartureTime = data[0];
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.plannedDepartureTime = data[1];
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
- H1Helper.processPosition(decodeResult, messagePart.substring(3).split(","));
4318
- return processMessageType(decodeResult, "POS");
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 = processMessageType(decodeResult, messageType.substring(0, 3));
4355
+ const part1 = processIMI(decodeResult, messageType.substring(0, 3));
4321
4356
  const description = decodeResult.formatted.description;
4322
- const part2 = processMessageType(decodeResult, messageType.substring(3, 6));
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 processMessageType(decodeResult, messageType);
4371
+ return processIMI(decodeResult, messageType);
4337
4372
  }
4338
- function processMessageType(decodeResult, type) {
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/Label_H1.ts
4495
- var Label_H1 = class extends DecoderPlugin {
4496
- name = "label-h1";
4569
+ // lib/plugins/ARINC_702.ts
4570
+ var Arinc702 = class extends DecoderPlugin {
4571
+ name = "arinc-702";
4497
4572
  qualifiers() {
4498
4573
  return {
4499
- labels: ["1J", "2J", "2P", "4J", "80", "H1"]
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 = H1Helper.decodeH1Message(decodeResult, msg);
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 = H1Helper.decodeH1Message(
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 = H1Helper.decodeH1Message(
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 = H1Helper.decodeH1Message(
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));