@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.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, key1, val1, ... keyN, valN]
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 key = data[i];
2997
+ const fpei = data[i];
2988
2998
  const value = data[i + 1];
2989
- switch (key) {
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 += `:${key}:${value}`;
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.freetext(decodeResult, fields.slice(3).join(""));
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/h1_helper.ts
3979
- var H1Helper = class _H1Helper {
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 key = fields[i].substring(0, 2);
4024
+ const iei = fields[i].substring(0, 2);
4002
4025
  const data2 = fields[i].substring(2);
4003
- switch (key) {
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.freetext(decodeResult, data2);
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
- ResultFormatter.unknown(decodeResult, fields[i], "/");
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
- _H1Helper.processPS(decodeResult, data2.split(","));
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
- _H1Helper.processTimeStamp(decodeResult, data2.split(","));
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.plannedDepartureTime = data[0];
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.plannedDepartureTime = data[1];
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
- H1Helper.processPosition(decodeResult, messagePart.substring(3).split(","));
4281
- return processMessageType(decodeResult, "POS");
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 = processMessageType(decodeResult, messageType.substring(0, 3));
4318
+ const part1 = processIMI(decodeResult, messageType.substring(0, 3));
4284
4319
  const description = decodeResult.formatted.description;
4285
- const part2 = processMessageType(decodeResult, messageType.substring(3, 6));
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 processMessageType(decodeResult, messageType);
4334
+ return processIMI(decodeResult, messageType);
4300
4335
  }
4301
- function processMessageType(decodeResult, type) {
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/Label_H1.ts
4458
- var Label_H1 = class extends DecoderPlugin {
4459
- name = "label-h1";
4532
+ // lib/plugins/ARINC_702.ts
4533
+ var Arinc702 = class extends DecoderPlugin {
4534
+ name = "arinc-702";
4460
4535
  qualifiers() {
4461
4536
  return {
4462
- labels: ["1J", "2J", "2P", "4J", "80", "H1"]
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 = H1Helper.decodeH1Message(decodeResult, msg);
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 = H1Helper.decodeH1Message(
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 = H1Helper.decodeH1Message(
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 = H1Helper.decodeH1Message(
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));