@airframes/acars-decoder 1.8.3 → 1.8.4
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.d.mts +1 -2
- package/dist/index.d.ts +1 -2
- package/dist/index.js +403 -298
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +403 -298
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -177,7 +177,6 @@ var CoordinateUtils = class _CoordinateUtils {
|
|
|
177
177
|
* @returns An object with latitude and longitude properties
|
|
178
178
|
*/
|
|
179
179
|
static decodeStringCoordinates(stringCoords) {
|
|
180
|
-
var results = {};
|
|
181
180
|
const firstChar = stringCoords.substring(0, 1);
|
|
182
181
|
let middleChar = stringCoords.substring(6, 7);
|
|
183
182
|
let longitudeChars = stringCoords.substring(7, 13);
|
|
@@ -186,12 +185,12 @@ var CoordinateUtils = class _CoordinateUtils {
|
|
|
186
185
|
longitudeChars = stringCoords.substring(8, 14);
|
|
187
186
|
}
|
|
188
187
|
if ((firstChar === "N" || firstChar === "S") && (middleChar === "W" || middleChar === "E")) {
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
188
|
+
return {
|
|
189
|
+
latitude: Number(stringCoords.substring(1, 6)) / 1e3 * _CoordinateUtils.getDirection(firstChar),
|
|
190
|
+
longitude: Number(longitudeChars) / 1e3 * _CoordinateUtils.getDirection(middleChar)
|
|
191
|
+
};
|
|
193
192
|
}
|
|
194
|
-
return
|
|
193
|
+
return void 0;
|
|
195
194
|
}
|
|
196
195
|
/**
|
|
197
196
|
* Decode a string of coordinates into an object with latitude and longitude in degrees and decimal minutes
|
|
@@ -200,7 +199,6 @@ var CoordinateUtils = class _CoordinateUtils {
|
|
|
200
199
|
* @returns An object with latitude and longitude properties
|
|
201
200
|
*/
|
|
202
201
|
static decodeStringCoordinatesDecimalMinutes(stringCoords) {
|
|
203
|
-
var results = {};
|
|
204
202
|
const firstChar = stringCoords.substring(0, 1);
|
|
205
203
|
let middleChar = stringCoords.substring(6, 7);
|
|
206
204
|
let longitudeChars = stringCoords.substring(7, 13);
|
|
@@ -213,12 +211,12 @@ var CoordinateUtils = class _CoordinateUtils {
|
|
|
213
211
|
const lonDeg = Math.trunc(Number(longitudeChars) / 1e3);
|
|
214
212
|
const lonMin = Number(longitudeChars) % 1e3 / 10;
|
|
215
213
|
if ((firstChar === "N" || firstChar === "S") && (middleChar === "W" || middleChar === "E")) {
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
214
|
+
return {
|
|
215
|
+
latitude: (latDeg + latMin / 60) * _CoordinateUtils.getDirection(firstChar),
|
|
216
|
+
longitude: (lonDeg + lonMin / 60) * _CoordinateUtils.getDirection(middleChar)
|
|
217
|
+
};
|
|
220
218
|
}
|
|
221
|
-
return
|
|
219
|
+
return void 0;
|
|
222
220
|
}
|
|
223
221
|
static coordinateString(coords) {
|
|
224
222
|
const latDir = coords.latitude > 0 ? "N" : "S";
|
|
@@ -769,6 +767,24 @@ var ResultFormatter = class {
|
|
|
769
767
|
value: `v${decodeResult.raw.version.toFixed(1)}`
|
|
770
768
|
});
|
|
771
769
|
}
|
|
770
|
+
static label(decodeResult, value) {
|
|
771
|
+
decodeResult.raw.label = value;
|
|
772
|
+
decodeResult.formatted.items.push({
|
|
773
|
+
type: "label",
|
|
774
|
+
code: "LABEL",
|
|
775
|
+
label: "Message Label",
|
|
776
|
+
value: `${decodeResult.raw.label}`
|
|
777
|
+
});
|
|
778
|
+
}
|
|
779
|
+
static sublabel(decodeResult, value) {
|
|
780
|
+
decodeResult.raw.sublabel = value;
|
|
781
|
+
decodeResult.formatted.items.push({
|
|
782
|
+
type: "sublabel",
|
|
783
|
+
code: "SUBLABEL",
|
|
784
|
+
label: "Message Sublabel",
|
|
785
|
+
value: `${decodeResult.raw.sublabel}`
|
|
786
|
+
});
|
|
787
|
+
}
|
|
772
788
|
static unknown(decodeResult, value, sep = ",") {
|
|
773
789
|
if (!decodeResult.remaining.text)
|
|
774
790
|
decodeResult.remaining.text = value;
|
|
@@ -4295,252 +4311,54 @@ var Label_HX = class extends DecoderPlugin {
|
|
|
4295
4311
|
}
|
|
4296
4312
|
};
|
|
4297
4313
|
|
|
4298
|
-
// lib/plugins/Label_SQ.ts
|
|
4299
|
-
var Label_SQ = class extends DecoderPlugin {
|
|
4300
|
-
name = "label-sq";
|
|
4301
|
-
qualifiers() {
|
|
4302
|
-
return {
|
|
4303
|
-
labels: ["SQ"]
|
|
4304
|
-
};
|
|
4305
|
-
}
|
|
4306
|
-
decode(message, options = {}) {
|
|
4307
|
-
const decodeResult = this.defaultResult();
|
|
4308
|
-
decodeResult.decoder.name = this.name;
|
|
4309
|
-
decodeResult.raw.preamble = message.text.substring(0, 4);
|
|
4310
|
-
decodeResult.raw.version = message.text.substring(1, 2);
|
|
4311
|
-
decodeResult.raw.network = message.text.substring(3, 4);
|
|
4312
|
-
if (decodeResult.raw.version === "2") {
|
|
4313
|
-
const regex = /0(\d)X(?<org>\w)(?<iata>\w\w\w)(?<icao>\w\w\w\w)(?<station>\d)(?<lat>\d+)(?<latd>[NS])(?<lng>\d+)(?<lngd>[EW])V(?<vfreq>\d+)\/.*/;
|
|
4314
|
-
const result = message.text.match(regex);
|
|
4315
|
-
if (result?.groups && result.length >= 8) {
|
|
4316
|
-
decodeResult.raw.groundStation = {
|
|
4317
|
-
number: result.groups.station,
|
|
4318
|
-
iataCode: result.groups.iata,
|
|
4319
|
-
icaoCode: result.groups.icao,
|
|
4320
|
-
coordinates: {
|
|
4321
|
-
latitude: Number(result.groups.lat) / 100 * (result.groups.latd === "S" ? -1 : 1),
|
|
4322
|
-
longitude: Number(result.groups.lng) / 100 * (result.groups.lngd === "W" ? -1 : 1)
|
|
4323
|
-
}
|
|
4324
|
-
};
|
|
4325
|
-
decodeResult.raw.vdlFrequency = Number(result.groups.vfreq) / 1e3;
|
|
4326
|
-
}
|
|
4327
|
-
}
|
|
4328
|
-
decodeResult.formatted.description = "Ground Station Squitter";
|
|
4329
|
-
var formattedNetwork = "Unknown";
|
|
4330
|
-
if (decodeResult.raw.network == "A") {
|
|
4331
|
-
formattedNetwork = "ARINC";
|
|
4332
|
-
} else if (decodeResult.raw.network == "S") {
|
|
4333
|
-
formattedNetwork = "SITA";
|
|
4334
|
-
}
|
|
4335
|
-
decodeResult.formatted.items = [
|
|
4336
|
-
{
|
|
4337
|
-
type: "network",
|
|
4338
|
-
code: "NETT",
|
|
4339
|
-
label: "Network",
|
|
4340
|
-
value: formattedNetwork
|
|
4341
|
-
},
|
|
4342
|
-
{
|
|
4343
|
-
type: "version",
|
|
4344
|
-
code: "VER",
|
|
4345
|
-
label: "Version",
|
|
4346
|
-
value: decodeResult.raw.version
|
|
4347
|
-
}
|
|
4348
|
-
];
|
|
4349
|
-
if (decodeResult.raw.groundStation) {
|
|
4350
|
-
if (decodeResult.raw.groundStation.icaoCode && decodeResult.raw.groundStation.number) {
|
|
4351
|
-
decodeResult.formatted.items.push({
|
|
4352
|
-
type: "ground_station",
|
|
4353
|
-
code: "GNDSTN",
|
|
4354
|
-
label: "Ground Station",
|
|
4355
|
-
value: `${decodeResult.raw.groundStation.icaoCode}${decodeResult.raw.groundStation.number}`
|
|
4356
|
-
});
|
|
4357
|
-
}
|
|
4358
|
-
if (decodeResult.raw.groundStation.iataCode) {
|
|
4359
|
-
decodeResult.formatted.items.push({
|
|
4360
|
-
type: "iataCode",
|
|
4361
|
-
code: "IATA",
|
|
4362
|
-
label: "IATA",
|
|
4363
|
-
value: decodeResult.raw.groundStation.iataCode
|
|
4364
|
-
});
|
|
4365
|
-
}
|
|
4366
|
-
if (decodeResult.raw.groundStation.icaoCode) {
|
|
4367
|
-
decodeResult.formatted.items.push({
|
|
4368
|
-
type: "icaoCode",
|
|
4369
|
-
code: "ICAO",
|
|
4370
|
-
label: "ICAO",
|
|
4371
|
-
value: decodeResult.raw.groundStation.icaoCode
|
|
4372
|
-
});
|
|
4373
|
-
}
|
|
4374
|
-
if (decodeResult.raw.groundStation.coordinates.latitude) {
|
|
4375
|
-
decodeResult.formatted.items.push({
|
|
4376
|
-
type: "coordinates",
|
|
4377
|
-
code: "COORD",
|
|
4378
|
-
label: "Ground Station Location",
|
|
4379
|
-
value: `${decodeResult.raw.groundStation.coordinates.latitude}, ${decodeResult.raw.groundStation.coordinates.longitude}`
|
|
4380
|
-
});
|
|
4381
|
-
}
|
|
4382
|
-
if (decodeResult.raw.groundStation.airport) {
|
|
4383
|
-
decodeResult.formatted.items.push({
|
|
4384
|
-
type: "airport",
|
|
4385
|
-
code: "APT",
|
|
4386
|
-
label: "Airport",
|
|
4387
|
-
value: `${decodeResult.raw.groundStation.airport.name} (${decodeResult.raw.groundStation.airport.icao}) in ${decodeResult.raw.groundStation.airport.location}`
|
|
4388
|
-
});
|
|
4389
|
-
}
|
|
4390
|
-
}
|
|
4391
|
-
if (decodeResult.raw.vdlFrequency) {
|
|
4392
|
-
decodeResult.formatted.items.push({
|
|
4393
|
-
type: "vdlFrequency",
|
|
4394
|
-
code: "VDLFRQ",
|
|
4395
|
-
label: "VDL Frequency",
|
|
4396
|
-
value: `${decodeResult.raw.vdlFrequency} MHz`
|
|
4397
|
-
});
|
|
4398
|
-
}
|
|
4399
|
-
decodeResult.decoded = true;
|
|
4400
|
-
decodeResult.decoder.decodeLevel = "full";
|
|
4401
|
-
return decodeResult;
|
|
4402
|
-
}
|
|
4403
|
-
};
|
|
4404
|
-
|
|
4405
|
-
// lib/plugins/Label_QR.ts
|
|
4406
|
-
var Label_QR = class extends DecoderPlugin {
|
|
4407
|
-
name = "label-qr";
|
|
4408
|
-
qualifiers() {
|
|
4409
|
-
return {
|
|
4410
|
-
labels: ["QR"]
|
|
4411
|
-
};
|
|
4412
|
-
}
|
|
4413
|
-
decode(message, options = {}) {
|
|
4414
|
-
const decodeResult = this.defaultResult();
|
|
4415
|
-
decodeResult.decoder.name = this.name;
|
|
4416
|
-
decodeResult.formatted.description = "ON Report";
|
|
4417
|
-
ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
|
|
4418
|
-
ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
|
|
4419
|
-
ResultFormatter.on(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
|
|
4420
|
-
ResultFormatter.unknown(decodeResult, message.text.substring(12));
|
|
4421
|
-
decodeResult.decoded = true;
|
|
4422
|
-
if (!decodeResult.remaining.text)
|
|
4423
|
-
decodeResult.decoder.decodeLevel = "full";
|
|
4424
|
-
else
|
|
4425
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
4426
|
-
return decodeResult;
|
|
4427
|
-
}
|
|
4428
|
-
};
|
|
4429
|
-
|
|
4430
|
-
// lib/plugins/Label_QP.ts
|
|
4431
|
-
var Label_QP = class extends DecoderPlugin {
|
|
4432
|
-
name = "label-qp";
|
|
4433
|
-
qualifiers() {
|
|
4434
|
-
return {
|
|
4435
|
-
labels: ["QP"]
|
|
4436
|
-
};
|
|
4437
|
-
}
|
|
4438
|
-
decode(message, options = {}) {
|
|
4439
|
-
const decodeResult = this.defaultResult();
|
|
4440
|
-
decodeResult.decoder.name = this.name;
|
|
4441
|
-
decodeResult.formatted.description = "OUT Report";
|
|
4442
|
-
ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
|
|
4443
|
-
ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
|
|
4444
|
-
ResultFormatter.out(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
|
|
4445
|
-
ResultFormatter.unknown(decodeResult, message.text.substring(12));
|
|
4446
|
-
decodeResult.decoded = true;
|
|
4447
|
-
if (!decodeResult.remaining.text)
|
|
4448
|
-
decodeResult.decoder.decodeLevel = "full";
|
|
4449
|
-
else
|
|
4450
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
4451
|
-
return decodeResult;
|
|
4452
|
-
}
|
|
4453
|
-
};
|
|
4454
|
-
|
|
4455
|
-
// lib/plugins/Label_QS.ts
|
|
4456
|
-
var Label_QS = class extends DecoderPlugin {
|
|
4457
|
-
name = "label-qs";
|
|
4458
|
-
qualifiers() {
|
|
4459
|
-
return {
|
|
4460
|
-
labels: ["QS"]
|
|
4461
|
-
};
|
|
4462
|
-
}
|
|
4463
|
-
decode(message, options = {}) {
|
|
4464
|
-
const decodeResult = this.defaultResult();
|
|
4465
|
-
decodeResult.decoder.name = this.name;
|
|
4466
|
-
decodeResult.formatted.description = "IN Report";
|
|
4467
|
-
ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
|
|
4468
|
-
ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
|
|
4469
|
-
ResultFormatter.in(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
|
|
4470
|
-
ResultFormatter.unknown(decodeResult, message.text.substring(12));
|
|
4471
|
-
decodeResult.decoded = true;
|
|
4472
|
-
if (!decodeResult.remaining.text)
|
|
4473
|
-
decodeResult.decoder.decodeLevel = "full";
|
|
4474
|
-
else
|
|
4475
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
4476
|
-
return decodeResult;
|
|
4477
|
-
}
|
|
4478
|
-
};
|
|
4479
|
-
|
|
4480
|
-
// lib/plugins/Label_QQ.ts
|
|
4481
|
-
var Label_QQ = class extends DecoderPlugin {
|
|
4482
|
-
name = "label-qq";
|
|
4483
|
-
qualifiers() {
|
|
4484
|
-
return {
|
|
4485
|
-
labels: ["QQ"]
|
|
4486
|
-
};
|
|
4487
|
-
}
|
|
4488
|
-
decode(message, options = {}) {
|
|
4489
|
-
const decodeResult = this.defaultResult();
|
|
4490
|
-
decodeResult.decoder.name = this.name;
|
|
4491
|
-
decodeResult.message = message;
|
|
4492
|
-
decodeResult.formatted.description = "OFF Report";
|
|
4493
|
-
ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
|
|
4494
|
-
ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
|
|
4495
|
-
if (message.text.substring(12, 19) === "\r\n001FE") {
|
|
4496
|
-
decodeResult.raw.day = message.text.substring(19, 21);
|
|
4497
|
-
ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(21, 27)));
|
|
4498
|
-
let latdir = message.text.substring(27, 28);
|
|
4499
|
-
let latdeg = Number(message.text.substring(28, 30));
|
|
4500
|
-
let latmin = Number(message.text.substring(30, 34));
|
|
4501
|
-
let londir = message.text.substring(34, 35);
|
|
4502
|
-
let londeg = Number(message.text.substring(35, 38));
|
|
4503
|
-
let lonmin = Number(message.text.substring(38, 42));
|
|
4504
|
-
let pos = {
|
|
4505
|
-
latitude: (latdeg + latmin / 60) * (latdir === "N" ? 1 : -1),
|
|
4506
|
-
longitude: (londeg + lonmin / 60) * (londir === "E" ? 1 : -1)
|
|
4507
|
-
};
|
|
4508
|
-
ResultFormatter.unknown(decodeResult, message.text.substring(42, 45));
|
|
4509
|
-
ResultFormatter.position(decodeResult, pos);
|
|
4510
|
-
if (decodeResult.remaining.text !== "---") {
|
|
4511
|
-
ResultFormatter.groundspeed(decodeResult, Number(message.text.substring(45, 48)));
|
|
4512
|
-
} else {
|
|
4513
|
-
ResultFormatter.unknown(decodeResult, message.text.substring(45, 48));
|
|
4514
|
-
}
|
|
4515
|
-
ResultFormatter.unknown(decodeResult, message.text.substring(48));
|
|
4516
|
-
} else {
|
|
4517
|
-
ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12) + "00"));
|
|
4518
|
-
ResultFormatter.unknown(decodeResult, message.text.substring(12));
|
|
4519
|
-
}
|
|
4520
|
-
decodeResult.decoded = true;
|
|
4521
|
-
if (!decodeResult.remaining.text)
|
|
4522
|
-
decodeResult.decoder.decodeLevel = "full";
|
|
4523
|
-
else
|
|
4524
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
4525
|
-
return decodeResult;
|
|
4526
|
-
}
|
|
4527
|
-
};
|
|
4528
|
-
|
|
4529
4314
|
// lib/utils/miam.ts
|
|
4530
4315
|
var Base85 = __toESM(require("base85"));
|
|
4531
4316
|
var zlib2 = __toESM(require("minizlib"));
|
|
4532
4317
|
var import_node_buffer2 = require("buffer");
|
|
4318
|
+
var MIAMVersion = /* @__PURE__ */ ((MIAMVersion2) => {
|
|
4319
|
+
MIAMVersion2[MIAMVersion2["V1"] = 1] = "V1";
|
|
4320
|
+
MIAMVersion2[MIAMVersion2["V2"] = 2] = "V2";
|
|
4321
|
+
return MIAMVersion2;
|
|
4322
|
+
})(MIAMVersion || {});
|
|
4323
|
+
var MIAMFid = /* @__PURE__ */ ((MIAMFid2) => {
|
|
4324
|
+
MIAMFid2["SingleTransfer"] = "T";
|
|
4325
|
+
MIAMFid2["FileTransferRequest"] = "F";
|
|
4326
|
+
MIAMFid2["FileTransferAccept"] = "K";
|
|
4327
|
+
MIAMFid2["FileSegment"] = "S";
|
|
4328
|
+
MIAMFid2["FileTransferAbort"] = "A";
|
|
4329
|
+
MIAMFid2["XOFFIndication"] = "Y";
|
|
4330
|
+
MIAMFid2["XONIndication"] = "X";
|
|
4331
|
+
return MIAMFid2;
|
|
4332
|
+
})(MIAMFid || {});
|
|
4333
|
+
var MIAMCorePdu = /* @__PURE__ */ ((MIAMCorePdu2) => {
|
|
4334
|
+
MIAMCorePdu2[MIAMCorePdu2["Data"] = 0] = "Data";
|
|
4335
|
+
MIAMCorePdu2[MIAMCorePdu2["Ack"] = 1] = "Ack";
|
|
4336
|
+
MIAMCorePdu2[MIAMCorePdu2["Aloha"] = 2] = "Aloha";
|
|
4337
|
+
MIAMCorePdu2[MIAMCorePdu2["AlohaReply"] = 3] = "AlohaReply";
|
|
4338
|
+
return MIAMCorePdu2;
|
|
4339
|
+
})(MIAMCorePdu || {});
|
|
4340
|
+
var MIAMCoreApp = /* @__PURE__ */ ((MIAMCoreApp2) => {
|
|
4341
|
+
MIAMCoreApp2[MIAMCoreApp2["ACARS2Char"] = 0] = "ACARS2Char";
|
|
4342
|
+
MIAMCoreApp2[MIAMCoreApp2["ACARS4Char"] = 1] = "ACARS4Char";
|
|
4343
|
+
MIAMCoreApp2[MIAMCoreApp2["ACARS6Char"] = 2] = "ACARS6Char";
|
|
4344
|
+
MIAMCoreApp2[MIAMCoreApp2["NonACARS6Char"] = 3] = "NonACARS6Char";
|
|
4345
|
+
return MIAMCoreApp2;
|
|
4346
|
+
})(MIAMCoreApp || {});
|
|
4533
4347
|
var MIAMCoreV1CRCLength = 4;
|
|
4534
4348
|
var MIAMCoreV2CRCLength = 2;
|
|
4349
|
+
var isMIAMVersion = (x) => Object.values(MIAMVersion).includes(x);
|
|
4350
|
+
var isMIAMFid = (x) => Object.values(MIAMFid).includes(x);
|
|
4351
|
+
var isMIAMCoreApp = (x) => Object.values(MIAMCoreApp).includes(x);
|
|
4352
|
+
var isMIAMCorePdu = (x) => Object.values(MIAMCorePdu).includes(x);
|
|
4535
4353
|
var MIAMCoreUtils = class {
|
|
4536
4354
|
static AppTypeToAppIdLenTable = {
|
|
4537
|
-
1: {
|
|
4355
|
+
[1 /* V1 */]: {
|
|
4538
4356
|
[0 /* ACARS2Char */]: 2,
|
|
4539
4357
|
[1 /* ACARS4Char */]: 4,
|
|
4540
4358
|
[2 /* ACARS6Char */]: 6,
|
|
4541
4359
|
[3 /* NonACARS6Char */]: 6
|
|
4542
4360
|
},
|
|
4543
|
-
2: {
|
|
4361
|
+
[2 /* V2 */]: {
|
|
4544
4362
|
[0 /* ACARS2Char */]: 2,
|
|
4545
4363
|
[1 /* ACARS4Char */]: 4,
|
|
4546
4364
|
[2 /* ACARS6Char */]: 6,
|
|
@@ -4606,21 +4424,34 @@ var MIAMCoreUtils = class {
|
|
|
4606
4424
|
hdr = hdr.subarray(0, hdr.length - hpad);
|
|
4607
4425
|
const version = hdr.readUInt8(0) & 15;
|
|
4608
4426
|
const pduType = hdr.readUInt8(0) >> 4 & 15;
|
|
4609
|
-
|
|
4610
|
-
|
|
4427
|
+
if (isMIAMVersion(version) && isMIAMCorePdu(pduType)) {
|
|
4428
|
+
const versionPduHandler = this.VersionPduHandlerTable[version][pduType];
|
|
4429
|
+
return versionPduHandler(hdr, body);
|
|
4430
|
+
} else {
|
|
4611
4431
|
return {
|
|
4612
4432
|
decoded: false,
|
|
4613
4433
|
error: "Invalid version and PDU type combination: v=" + version + ", pdu=" + pduType
|
|
4614
4434
|
};
|
|
4615
4435
|
}
|
|
4616
|
-
return versionPduHandler(hdr, body);
|
|
4617
4436
|
},
|
|
4618
|
-
["F" /* FileTransferRequest */]:
|
|
4619
|
-
|
|
4620
|
-
|
|
4621
|
-
["
|
|
4622
|
-
|
|
4623
|
-
|
|
4437
|
+
["F" /* FileTransferRequest */]: () => {
|
|
4438
|
+
return { decoded: false, error: "File Transfer Request not implemented" };
|
|
4439
|
+
},
|
|
4440
|
+
["K" /* FileTransferAccept */]: () => {
|
|
4441
|
+
return { decoded: false, error: "File Transfer Accept not implemented" };
|
|
4442
|
+
},
|
|
4443
|
+
["S" /* FileSegment */]: () => {
|
|
4444
|
+
return { decoded: false, error: "File Segment not implemented" };
|
|
4445
|
+
},
|
|
4446
|
+
["A" /* FileTransferAbort */]: () => {
|
|
4447
|
+
return { decoded: false, error: "File Transfer Abort not implemented" };
|
|
4448
|
+
},
|
|
4449
|
+
["Y" /* XOFFIndication */]: () => {
|
|
4450
|
+
return { decoded: false, error: "XOFF Indication not implemented" };
|
|
4451
|
+
},
|
|
4452
|
+
["X" /* XONIndication */]: () => {
|
|
4453
|
+
return { decoded: false, error: "XON Indication not implemented" };
|
|
4454
|
+
}
|
|
4624
4455
|
};
|
|
4625
4456
|
static arincCrc16(buf, seed) {
|
|
4626
4457
|
const crctable = [
|
|
@@ -5154,14 +4985,15 @@ var MIAMCoreUtils = class {
|
|
|
5154
4985
|
}
|
|
5155
4986
|
static parse(txt) {
|
|
5156
4987
|
const fidType = txt[0];
|
|
5157
|
-
|
|
5158
|
-
|
|
4988
|
+
if (isMIAMFid(fidType)) {
|
|
4989
|
+
const handler = this.FidHandlerTable[fidType];
|
|
4990
|
+
return handler(txt.substring(1));
|
|
4991
|
+
} else {
|
|
5159
4992
|
return {
|
|
5160
4993
|
decoded: false,
|
|
5161
4994
|
error: "Unsupported FID type: " + fidType
|
|
5162
4995
|
};
|
|
5163
4996
|
}
|
|
5164
|
-
return handler(txt.substring(1));
|
|
5165
4997
|
}
|
|
5166
4998
|
static corePduDataHandler(version, minHdrSize, crcLen, hdr, body) {
|
|
5167
4999
|
if (hdr.length < minHdrSize) {
|
|
@@ -5176,14 +5008,14 @@ var MIAMCoreUtils = class {
|
|
|
5176
5008
|
let pduAppType = 0;
|
|
5177
5009
|
let pduAppId = "";
|
|
5178
5010
|
let pduCrc = 0;
|
|
5179
|
-
let pduData =
|
|
5011
|
+
let pduData = null;
|
|
5180
5012
|
let pduCrcIsOk = false;
|
|
5181
5013
|
let pduIsComplete = true;
|
|
5182
5014
|
let pduErrors = [];
|
|
5183
5015
|
let tail = void 0;
|
|
5184
5016
|
let msgNum = 0;
|
|
5185
5017
|
let ackOptions = 0;
|
|
5186
|
-
if (version === 1) {
|
|
5018
|
+
if (version === 1 /* V1 */) {
|
|
5187
5019
|
pduSize = hdr.readUInt8(1) << 16 | hdr.readUInt8(2) << 8 | hdr.readUInt8(3);
|
|
5188
5020
|
const msgSize = hdr.length + (body === void 0 ? 0 : body.length);
|
|
5189
5021
|
if (pduSize > msgSize) {
|
|
@@ -5193,7 +5025,7 @@ var MIAMCoreUtils = class {
|
|
|
5193
5025
|
hdr = hdr.subarray(4);
|
|
5194
5026
|
tail = hdr.subarray(0, 7).toString("ascii");
|
|
5195
5027
|
hdr = hdr.subarray(7);
|
|
5196
|
-
} else if (version === 2) {
|
|
5028
|
+
} else if (version === 2 /* V2 */) {
|
|
5197
5029
|
hdr = hdr.subarray(1);
|
|
5198
5030
|
}
|
|
5199
5031
|
msgNum = hdr.readUInt8(0) >> 1 & 127;
|
|
@@ -5203,9 +5035,11 @@ var MIAMCoreUtils = class {
|
|
|
5203
5035
|
pduEncoding = hdr.readUInt8(1) >> 4 & 3;
|
|
5204
5036
|
pduAppType = hdr.readUInt8(1) & 15;
|
|
5205
5037
|
hdr = hdr.subarray(2);
|
|
5206
|
-
let appIdLen
|
|
5207
|
-
if (
|
|
5208
|
-
|
|
5038
|
+
let appIdLen;
|
|
5039
|
+
if (isMIAMCoreApp(pduAppType)) {
|
|
5040
|
+
appIdLen = this.AppTypeToAppIdLenTable[version][pduAppType];
|
|
5041
|
+
} else {
|
|
5042
|
+
if (version === 2 /* V2 */ && (pduAppType & 8) !== 0 && pduAppType !== 13) {
|
|
5209
5043
|
appIdLen = (pduAppType & 7) + 1;
|
|
5210
5044
|
} else {
|
|
5211
5045
|
return {
|
|
@@ -5215,9 +5049,6 @@ var MIAMCoreUtils = class {
|
|
|
5215
5049
|
}
|
|
5216
5050
|
}
|
|
5217
5051
|
const pduIsACARS = [
|
|
5218
|
-
0 /* ACARS2Char */,
|
|
5219
|
-
1 /* ACARS4Char */,
|
|
5220
|
-
2 /* ACARS6Char */,
|
|
5221
5052
|
0 /* ACARS2Char */,
|
|
5222
5053
|
1 /* ACARS4Char */,
|
|
5223
5054
|
2 /* ACARS6Char */
|
|
@@ -5239,7 +5070,7 @@ var MIAMCoreUtils = class {
|
|
|
5239
5070
|
if (body !== void 0 && body.length > 0) {
|
|
5240
5071
|
if ([1 /* Deflate */, 1 /* Deflate */].indexOf(pduCompression) >= 0) {
|
|
5241
5072
|
try {
|
|
5242
|
-
const decompress = new zlib2.InflateRaw({
|
|
5073
|
+
const decompress = new zlib2.InflateRaw({});
|
|
5243
5074
|
decompress.write(body);
|
|
5244
5075
|
decompress.flush(zlib2.constants.Z_SYNC_FLUSH);
|
|
5245
5076
|
pduData = decompress.read();
|
|
@@ -5251,18 +5082,18 @@ var MIAMCoreUtils = class {
|
|
|
5251
5082
|
} else {
|
|
5252
5083
|
pduErrors.push("Unsupported v" + version + " compression type: " + pduCompression);
|
|
5253
5084
|
}
|
|
5254
|
-
if (pduData !==
|
|
5085
|
+
if (pduData !== null) {
|
|
5255
5086
|
const crcAlgoHandlerByVersion = {
|
|
5256
|
-
1: (buf, seed) => {
|
|
5087
|
+
[1 /* V1 */]: (buf, seed) => {
|
|
5257
5088
|
return ~this.arinc665Crc32(buf, seed);
|
|
5258
5089
|
},
|
|
5259
|
-
2: this.arincCrc16
|
|
5090
|
+
[2 /* V2 */]: this.arincCrc16
|
|
5260
5091
|
};
|
|
5261
5092
|
const crcAlgoHandler = crcAlgoHandlerByVersion[version];
|
|
5262
5093
|
if (crcAlgoHandler === void 0) {
|
|
5263
5094
|
return {
|
|
5264
5095
|
decoded: false,
|
|
5265
|
-
|
|
5096
|
+
error: "No CRC handler for v" + version
|
|
5266
5097
|
};
|
|
5267
5098
|
}
|
|
5268
5099
|
const crcCheck = crcAlgoHandler(pduData, 4294967295);
|
|
@@ -5310,25 +5141,315 @@ var MIAMCoreUtils = class {
|
|
|
5310
5141
|
};
|
|
5311
5142
|
}
|
|
5312
5143
|
static VersionPduHandlerTable = {
|
|
5313
|
-
1: {
|
|
5144
|
+
[1 /* V1 */]: {
|
|
5314
5145
|
[0 /* Data */]: (hdr, body) => {
|
|
5315
|
-
return this.corePduDataHandler(1
|
|
5146
|
+
return this.corePduDataHandler(1 /* V1 */, 20, MIAMCoreV1CRCLength, hdr, body);
|
|
5316
5147
|
},
|
|
5317
|
-
[1 /* Ack */]:
|
|
5318
|
-
|
|
5319
|
-
|
|
5148
|
+
[1 /* Ack */]: () => {
|
|
5149
|
+
return { decoded: false, error: "v1 Ack PDU not implemented" };
|
|
5150
|
+
},
|
|
5151
|
+
[2 /* Aloha */]: () => {
|
|
5152
|
+
return { decoded: false, error: "v1 Aloha PDU not implemented" };
|
|
5153
|
+
},
|
|
5154
|
+
[3 /* AlohaReply */]: () => {
|
|
5155
|
+
return { decoded: false, error: "v1 AlohaReply PDU not implemented" };
|
|
5156
|
+
}
|
|
5320
5157
|
},
|
|
5321
|
-
2: {
|
|
5158
|
+
[2 /* V2 */]: {
|
|
5322
5159
|
[0 /* Data */]: (hdr, body) => {
|
|
5323
|
-
return this.corePduDataHandler(2
|
|
5160
|
+
return this.corePduDataHandler(2 /* V2 */, 7, MIAMCoreV2CRCLength, hdr, body);
|
|
5161
|
+
},
|
|
5162
|
+
[1 /* Ack */]: () => {
|
|
5163
|
+
return { decoded: false, error: "v2 Ack PDU not implemented" };
|
|
5164
|
+
},
|
|
5165
|
+
[2 /* Aloha */]: () => {
|
|
5166
|
+
return { decoded: false, error: "v2 Aloha PDU not implemented" };
|
|
5324
5167
|
},
|
|
5325
|
-
[
|
|
5326
|
-
|
|
5327
|
-
|
|
5168
|
+
[3 /* AlohaReply */]: () => {
|
|
5169
|
+
return { decoded: false, error: "v2 Aloha reply PDU not implemented" };
|
|
5170
|
+
}
|
|
5328
5171
|
}
|
|
5329
5172
|
};
|
|
5330
5173
|
};
|
|
5331
5174
|
|
|
5175
|
+
// lib/plugins/Label_MA.ts
|
|
5176
|
+
var Label_MA = class extends DecoderPlugin {
|
|
5177
|
+
name = "label-ma";
|
|
5178
|
+
qualifiers() {
|
|
5179
|
+
return {
|
|
5180
|
+
labels: ["MA"]
|
|
5181
|
+
};
|
|
5182
|
+
}
|
|
5183
|
+
decode(message, options = {}) {
|
|
5184
|
+
let decodeResult = this.defaultResult();
|
|
5185
|
+
decodeResult.decoder.name = this.name;
|
|
5186
|
+
decodeResult.message = message;
|
|
5187
|
+
const miamResult = MIAMCoreUtils.parse(message.text);
|
|
5188
|
+
if (miamResult.decoded && miamResult.message.data !== void 0 && miamResult.message.data.crcOk && miamResult.message.data.complete && miamResult.message.data.acars !== void 0) {
|
|
5189
|
+
decodeResult.decoded = true;
|
|
5190
|
+
decodeResult.decoder.decodeLevel = "partial";
|
|
5191
|
+
ResultFormatter.label(decodeResult, miamResult.message.data.acars.label);
|
|
5192
|
+
if (miamResult.message.data.acars.sublabel) {
|
|
5193
|
+
ResultFormatter.sublabel(decodeResult, miamResult.message.data.acars.sublabel);
|
|
5194
|
+
}
|
|
5195
|
+
if (miamResult.message.data.acars.tail) {
|
|
5196
|
+
ResultFormatter.tail(decodeResult, miamResult.message.data.acars.tail);
|
|
5197
|
+
}
|
|
5198
|
+
const messageText = miamResult.message.data.acars.text;
|
|
5199
|
+
if (messageText) {
|
|
5200
|
+
const decoded = this.decoder.decode({
|
|
5201
|
+
label: miamResult.message.data.acars.label,
|
|
5202
|
+
sublabel: miamResult.message.data.acars.sublabel,
|
|
5203
|
+
text: messageText
|
|
5204
|
+
}, options);
|
|
5205
|
+
if (decoded.decoded) {
|
|
5206
|
+
decodeResult.decoder.decodeLevel = decoded.decoder.decodeLevel;
|
|
5207
|
+
decodeResult.raw = { ...decodeResult.raw, ...decoded.raw };
|
|
5208
|
+
decodeResult.formatted.items.push(...decoded.formatted.items);
|
|
5209
|
+
} else {
|
|
5210
|
+
ResultFormatter.text(decodeResult, messageText);
|
|
5211
|
+
}
|
|
5212
|
+
message.text = messageText;
|
|
5213
|
+
}
|
|
5214
|
+
message.label = miamResult.message.data.acars.label;
|
|
5215
|
+
message.sublabel = miamResult.message.data.acars.sublabel;
|
|
5216
|
+
return decodeResult;
|
|
5217
|
+
}
|
|
5218
|
+
return decodeResult;
|
|
5219
|
+
}
|
|
5220
|
+
};
|
|
5221
|
+
|
|
5222
|
+
// lib/plugins/Label_SQ.ts
|
|
5223
|
+
var Label_SQ = class extends DecoderPlugin {
|
|
5224
|
+
name = "label-sq";
|
|
5225
|
+
qualifiers() {
|
|
5226
|
+
return {
|
|
5227
|
+
labels: ["SQ"]
|
|
5228
|
+
};
|
|
5229
|
+
}
|
|
5230
|
+
decode(message, options = {}) {
|
|
5231
|
+
const decodeResult = this.defaultResult();
|
|
5232
|
+
decodeResult.decoder.name = this.name;
|
|
5233
|
+
decodeResult.raw.preamble = message.text.substring(0, 4);
|
|
5234
|
+
decodeResult.raw.version = message.text.substring(1, 2);
|
|
5235
|
+
decodeResult.raw.network = message.text.substring(3, 4);
|
|
5236
|
+
if (decodeResult.raw.version === "2") {
|
|
5237
|
+
const regex = /0(\d)X(?<org>\w)(?<iata>\w\w\w)(?<icao>\w\w\w\w)(?<station>\d)(?<lat>\d+)(?<latd>[NS])(?<lng>\d+)(?<lngd>[EW])V(?<vfreq>\d+)\/.*/;
|
|
5238
|
+
const result = message.text.match(regex);
|
|
5239
|
+
if (result?.groups && result.length >= 8) {
|
|
5240
|
+
decodeResult.raw.groundStation = {
|
|
5241
|
+
number: result.groups.station,
|
|
5242
|
+
iataCode: result.groups.iata,
|
|
5243
|
+
icaoCode: result.groups.icao,
|
|
5244
|
+
coordinates: {
|
|
5245
|
+
latitude: Number(result.groups.lat) / 100 * (result.groups.latd === "S" ? -1 : 1),
|
|
5246
|
+
longitude: Number(result.groups.lng) / 100 * (result.groups.lngd === "W" ? -1 : 1)
|
|
5247
|
+
}
|
|
5248
|
+
};
|
|
5249
|
+
decodeResult.raw.vdlFrequency = Number(result.groups.vfreq) / 1e3;
|
|
5250
|
+
}
|
|
5251
|
+
}
|
|
5252
|
+
decodeResult.formatted.description = "Ground Station Squitter";
|
|
5253
|
+
var formattedNetwork = "Unknown";
|
|
5254
|
+
if (decodeResult.raw.network == "A") {
|
|
5255
|
+
formattedNetwork = "ARINC";
|
|
5256
|
+
} else if (decodeResult.raw.network == "S") {
|
|
5257
|
+
formattedNetwork = "SITA";
|
|
5258
|
+
}
|
|
5259
|
+
decodeResult.formatted.items = [
|
|
5260
|
+
{
|
|
5261
|
+
type: "network",
|
|
5262
|
+
code: "NETT",
|
|
5263
|
+
label: "Network",
|
|
5264
|
+
value: formattedNetwork
|
|
5265
|
+
},
|
|
5266
|
+
{
|
|
5267
|
+
type: "version",
|
|
5268
|
+
code: "VER",
|
|
5269
|
+
label: "Version",
|
|
5270
|
+
value: decodeResult.raw.version
|
|
5271
|
+
}
|
|
5272
|
+
];
|
|
5273
|
+
if (decodeResult.raw.groundStation) {
|
|
5274
|
+
if (decodeResult.raw.groundStation.icaoCode && decodeResult.raw.groundStation.number) {
|
|
5275
|
+
decodeResult.formatted.items.push({
|
|
5276
|
+
type: "ground_station",
|
|
5277
|
+
code: "GNDSTN",
|
|
5278
|
+
label: "Ground Station",
|
|
5279
|
+
value: `${decodeResult.raw.groundStation.icaoCode}${decodeResult.raw.groundStation.number}`
|
|
5280
|
+
});
|
|
5281
|
+
}
|
|
5282
|
+
if (decodeResult.raw.groundStation.iataCode) {
|
|
5283
|
+
decodeResult.formatted.items.push({
|
|
5284
|
+
type: "iataCode",
|
|
5285
|
+
code: "IATA",
|
|
5286
|
+
label: "IATA",
|
|
5287
|
+
value: decodeResult.raw.groundStation.iataCode
|
|
5288
|
+
});
|
|
5289
|
+
}
|
|
5290
|
+
if (decodeResult.raw.groundStation.icaoCode) {
|
|
5291
|
+
decodeResult.formatted.items.push({
|
|
5292
|
+
type: "icaoCode",
|
|
5293
|
+
code: "ICAO",
|
|
5294
|
+
label: "ICAO",
|
|
5295
|
+
value: decodeResult.raw.groundStation.icaoCode
|
|
5296
|
+
});
|
|
5297
|
+
}
|
|
5298
|
+
if (decodeResult.raw.groundStation.coordinates.latitude) {
|
|
5299
|
+
decodeResult.formatted.items.push({
|
|
5300
|
+
type: "coordinates",
|
|
5301
|
+
code: "COORD",
|
|
5302
|
+
label: "Ground Station Location",
|
|
5303
|
+
value: `${decodeResult.raw.groundStation.coordinates.latitude}, ${decodeResult.raw.groundStation.coordinates.longitude}`
|
|
5304
|
+
});
|
|
5305
|
+
}
|
|
5306
|
+
if (decodeResult.raw.groundStation.airport) {
|
|
5307
|
+
decodeResult.formatted.items.push({
|
|
5308
|
+
type: "airport",
|
|
5309
|
+
code: "APT",
|
|
5310
|
+
label: "Airport",
|
|
5311
|
+
value: `${decodeResult.raw.groundStation.airport.name} (${decodeResult.raw.groundStation.airport.icao}) in ${decodeResult.raw.groundStation.airport.location}`
|
|
5312
|
+
});
|
|
5313
|
+
}
|
|
5314
|
+
}
|
|
5315
|
+
if (decodeResult.raw.vdlFrequency) {
|
|
5316
|
+
decodeResult.formatted.items.push({
|
|
5317
|
+
type: "vdlFrequency",
|
|
5318
|
+
code: "VDLFRQ",
|
|
5319
|
+
label: "VDL Frequency",
|
|
5320
|
+
value: `${decodeResult.raw.vdlFrequency} MHz`
|
|
5321
|
+
});
|
|
5322
|
+
}
|
|
5323
|
+
decodeResult.decoded = true;
|
|
5324
|
+
decodeResult.decoder.decodeLevel = "full";
|
|
5325
|
+
return decodeResult;
|
|
5326
|
+
}
|
|
5327
|
+
};
|
|
5328
|
+
|
|
5329
|
+
// lib/plugins/Label_QR.ts
|
|
5330
|
+
var Label_QR = class extends DecoderPlugin {
|
|
5331
|
+
name = "label-qr";
|
|
5332
|
+
qualifiers() {
|
|
5333
|
+
return {
|
|
5334
|
+
labels: ["QR"]
|
|
5335
|
+
};
|
|
5336
|
+
}
|
|
5337
|
+
decode(message, options = {}) {
|
|
5338
|
+
const decodeResult = this.defaultResult();
|
|
5339
|
+
decodeResult.decoder.name = this.name;
|
|
5340
|
+
decodeResult.formatted.description = "ON Report";
|
|
5341
|
+
ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
|
|
5342
|
+
ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
|
|
5343
|
+
ResultFormatter.on(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
|
|
5344
|
+
ResultFormatter.unknown(decodeResult, message.text.substring(12));
|
|
5345
|
+
decodeResult.decoded = true;
|
|
5346
|
+
if (!decodeResult.remaining.text)
|
|
5347
|
+
decodeResult.decoder.decodeLevel = "full";
|
|
5348
|
+
else
|
|
5349
|
+
decodeResult.decoder.decodeLevel = "partial";
|
|
5350
|
+
return decodeResult;
|
|
5351
|
+
}
|
|
5352
|
+
};
|
|
5353
|
+
|
|
5354
|
+
// lib/plugins/Label_QP.ts
|
|
5355
|
+
var Label_QP = class extends DecoderPlugin {
|
|
5356
|
+
name = "label-qp";
|
|
5357
|
+
qualifiers() {
|
|
5358
|
+
return {
|
|
5359
|
+
labels: ["QP"]
|
|
5360
|
+
};
|
|
5361
|
+
}
|
|
5362
|
+
decode(message, options = {}) {
|
|
5363
|
+
const decodeResult = this.defaultResult();
|
|
5364
|
+
decodeResult.decoder.name = this.name;
|
|
5365
|
+
decodeResult.formatted.description = "OUT Report";
|
|
5366
|
+
ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
|
|
5367
|
+
ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
|
|
5368
|
+
ResultFormatter.out(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
|
|
5369
|
+
ResultFormatter.unknown(decodeResult, message.text.substring(12));
|
|
5370
|
+
decodeResult.decoded = true;
|
|
5371
|
+
if (!decodeResult.remaining.text)
|
|
5372
|
+
decodeResult.decoder.decodeLevel = "full";
|
|
5373
|
+
else
|
|
5374
|
+
decodeResult.decoder.decodeLevel = "partial";
|
|
5375
|
+
return decodeResult;
|
|
5376
|
+
}
|
|
5377
|
+
};
|
|
5378
|
+
|
|
5379
|
+
// lib/plugins/Label_QS.ts
|
|
5380
|
+
var Label_QS = class extends DecoderPlugin {
|
|
5381
|
+
name = "label-qs";
|
|
5382
|
+
qualifiers() {
|
|
5383
|
+
return {
|
|
5384
|
+
labels: ["QS"]
|
|
5385
|
+
};
|
|
5386
|
+
}
|
|
5387
|
+
decode(message, options = {}) {
|
|
5388
|
+
const decodeResult = this.defaultResult();
|
|
5389
|
+
decodeResult.decoder.name = this.name;
|
|
5390
|
+
decodeResult.formatted.description = "IN Report";
|
|
5391
|
+
ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
|
|
5392
|
+
ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
|
|
5393
|
+
ResultFormatter.in(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
|
|
5394
|
+
ResultFormatter.unknown(decodeResult, message.text.substring(12));
|
|
5395
|
+
decodeResult.decoded = true;
|
|
5396
|
+
if (!decodeResult.remaining.text)
|
|
5397
|
+
decodeResult.decoder.decodeLevel = "full";
|
|
5398
|
+
else
|
|
5399
|
+
decodeResult.decoder.decodeLevel = "partial";
|
|
5400
|
+
return decodeResult;
|
|
5401
|
+
}
|
|
5402
|
+
};
|
|
5403
|
+
|
|
5404
|
+
// lib/plugins/Label_QQ.ts
|
|
5405
|
+
var Label_QQ = class extends DecoderPlugin {
|
|
5406
|
+
name = "label-qq";
|
|
5407
|
+
qualifiers() {
|
|
5408
|
+
return {
|
|
5409
|
+
labels: ["QQ"]
|
|
5410
|
+
};
|
|
5411
|
+
}
|
|
5412
|
+
decode(message, options = {}) {
|
|
5413
|
+
const decodeResult = this.defaultResult();
|
|
5414
|
+
decodeResult.decoder.name = this.name;
|
|
5415
|
+
decodeResult.message = message;
|
|
5416
|
+
decodeResult.formatted.description = "OFF Report";
|
|
5417
|
+
ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
|
|
5418
|
+
ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
|
|
5419
|
+
if (message.text.substring(12, 19) === "\r\n001FE") {
|
|
5420
|
+
decodeResult.raw.day = message.text.substring(19, 21);
|
|
5421
|
+
ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(21, 27)));
|
|
5422
|
+
let latdir = message.text.substring(27, 28);
|
|
5423
|
+
let latdeg = Number(message.text.substring(28, 30));
|
|
5424
|
+
let latmin = Number(message.text.substring(30, 34));
|
|
5425
|
+
let londir = message.text.substring(34, 35);
|
|
5426
|
+
let londeg = Number(message.text.substring(35, 38));
|
|
5427
|
+
let lonmin = Number(message.text.substring(38, 42));
|
|
5428
|
+
let pos = {
|
|
5429
|
+
latitude: (latdeg + latmin / 60) * (latdir === "N" ? 1 : -1),
|
|
5430
|
+
longitude: (londeg + lonmin / 60) * (londir === "E" ? 1 : -1)
|
|
5431
|
+
};
|
|
5432
|
+
ResultFormatter.unknown(decodeResult, message.text.substring(42, 45));
|
|
5433
|
+
ResultFormatter.position(decodeResult, pos);
|
|
5434
|
+
if (decodeResult.remaining.text !== "---") {
|
|
5435
|
+
ResultFormatter.groundspeed(decodeResult, Number(message.text.substring(45, 48)));
|
|
5436
|
+
} else {
|
|
5437
|
+
ResultFormatter.unknown(decodeResult, message.text.substring(45, 48));
|
|
5438
|
+
}
|
|
5439
|
+
ResultFormatter.unknown(decodeResult, message.text.substring(48));
|
|
5440
|
+
} else {
|
|
5441
|
+
ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12) + "00"));
|
|
5442
|
+
ResultFormatter.unknown(decodeResult, message.text.substring(12));
|
|
5443
|
+
}
|
|
5444
|
+
decodeResult.decoded = true;
|
|
5445
|
+
if (!decodeResult.remaining.text)
|
|
5446
|
+
decodeResult.decoder.decodeLevel = "full";
|
|
5447
|
+
else
|
|
5448
|
+
decodeResult.decoder.decodeLevel = "partial";
|
|
5449
|
+
return decodeResult;
|
|
5450
|
+
}
|
|
5451
|
+
};
|
|
5452
|
+
|
|
5332
5453
|
// lib/MessageDecoder.ts
|
|
5333
5454
|
var MessageDecoder = class {
|
|
5334
5455
|
name;
|
|
@@ -5396,6 +5517,7 @@ var MessageDecoder = class {
|
|
|
5396
5517
|
this.registerPlugin(new Label_83(this));
|
|
5397
5518
|
this.registerPlugin(new Label_8E(this));
|
|
5398
5519
|
this.registerPlugin(new Label_1M_Slash(this));
|
|
5520
|
+
this.registerPlugin(new Label_MA(this));
|
|
5399
5521
|
this.registerPlugin(new Label_SQ(this));
|
|
5400
5522
|
this.registerPlugin(new Label_QP(this));
|
|
5401
5523
|
this.registerPlugin(new Label_QQ(this));
|
|
@@ -5408,18 +5530,6 @@ var MessageDecoder = class {
|
|
|
5408
5530
|
return true;
|
|
5409
5531
|
}
|
|
5410
5532
|
decode(message, options = {}) {
|
|
5411
|
-
if (message.label === "MA") {
|
|
5412
|
-
const decodeResult = MIAMCoreUtils.parse(message.text);
|
|
5413
|
-
if (decodeResult.decoded && decodeResult.message.data !== void 0 && decodeResult.message.data.crcOk && decodeResult.message.data.complete && decodeResult.message.data.acars !== void 0) {
|
|
5414
|
-
message = {
|
|
5415
|
-
...message,
|
|
5416
|
-
label: decodeResult.message.data.acars.label,
|
|
5417
|
-
...decodeResult.message.data.acars.sublabel ? { sublabel: decodeResult.message.data.acars.sublabel } : {},
|
|
5418
|
-
...decodeResult.message.data.acars.mfi ? { mfi: decodeResult.message.data.acars.mfi } : {},
|
|
5419
|
-
...decodeResult.message.data.acars.text ? { text: decodeResult.message.data.acars.text } : {}
|
|
5420
|
-
};
|
|
5421
|
-
}
|
|
5422
|
-
}
|
|
5423
5533
|
const usablePlugins = this.plugins.filter((plugin) => {
|
|
5424
5534
|
const qualifiers = plugin.qualifiers();
|
|
5425
5535
|
if (qualifiers.labels.includes(message.label)) {
|
|
@@ -5469,11 +5579,6 @@ var MessageDecoder = class {
|
|
|
5469
5579
|
}
|
|
5470
5580
|
return result;
|
|
5471
5581
|
}
|
|
5472
|
-
lookupAirportByIata(iata) {
|
|
5473
|
-
const airportsArray = [];
|
|
5474
|
-
const airport = airportsArray.filter((e) => e.iata === iata);
|
|
5475
|
-
return airport;
|
|
5476
|
-
}
|
|
5477
5582
|
};
|
|
5478
5583
|
// Annotate the CommonJS export names for ESM import in node:
|
|
5479
5584
|
0 && (module.exports = {
|