@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.mjs
CHANGED
|
@@ -140,7 +140,6 @@ var CoordinateUtils = class _CoordinateUtils {
|
|
|
140
140
|
* @returns An object with latitude and longitude properties
|
|
141
141
|
*/
|
|
142
142
|
static decodeStringCoordinates(stringCoords) {
|
|
143
|
-
var results = {};
|
|
144
143
|
const firstChar = stringCoords.substring(0, 1);
|
|
145
144
|
let middleChar = stringCoords.substring(6, 7);
|
|
146
145
|
let longitudeChars = stringCoords.substring(7, 13);
|
|
@@ -149,12 +148,12 @@ var CoordinateUtils = class _CoordinateUtils {
|
|
|
149
148
|
longitudeChars = stringCoords.substring(8, 14);
|
|
150
149
|
}
|
|
151
150
|
if ((firstChar === "N" || firstChar === "S") && (middleChar === "W" || middleChar === "E")) {
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
151
|
+
return {
|
|
152
|
+
latitude: Number(stringCoords.substring(1, 6)) / 1e3 * _CoordinateUtils.getDirection(firstChar),
|
|
153
|
+
longitude: Number(longitudeChars) / 1e3 * _CoordinateUtils.getDirection(middleChar)
|
|
154
|
+
};
|
|
156
155
|
}
|
|
157
|
-
return
|
|
156
|
+
return void 0;
|
|
158
157
|
}
|
|
159
158
|
/**
|
|
160
159
|
* Decode a string of coordinates into an object with latitude and longitude in degrees and decimal minutes
|
|
@@ -163,7 +162,6 @@ var CoordinateUtils = class _CoordinateUtils {
|
|
|
163
162
|
* @returns An object with latitude and longitude properties
|
|
164
163
|
*/
|
|
165
164
|
static decodeStringCoordinatesDecimalMinutes(stringCoords) {
|
|
166
|
-
var results = {};
|
|
167
165
|
const firstChar = stringCoords.substring(0, 1);
|
|
168
166
|
let middleChar = stringCoords.substring(6, 7);
|
|
169
167
|
let longitudeChars = stringCoords.substring(7, 13);
|
|
@@ -176,12 +174,12 @@ var CoordinateUtils = class _CoordinateUtils {
|
|
|
176
174
|
const lonDeg = Math.trunc(Number(longitudeChars) / 1e3);
|
|
177
175
|
const lonMin = Number(longitudeChars) % 1e3 / 10;
|
|
178
176
|
if ((firstChar === "N" || firstChar === "S") && (middleChar === "W" || middleChar === "E")) {
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
177
|
+
return {
|
|
178
|
+
latitude: (latDeg + latMin / 60) * _CoordinateUtils.getDirection(firstChar),
|
|
179
|
+
longitude: (lonDeg + lonMin / 60) * _CoordinateUtils.getDirection(middleChar)
|
|
180
|
+
};
|
|
183
181
|
}
|
|
184
|
-
return
|
|
182
|
+
return void 0;
|
|
185
183
|
}
|
|
186
184
|
static coordinateString(coords) {
|
|
187
185
|
const latDir = coords.latitude > 0 ? "N" : "S";
|
|
@@ -732,6 +730,24 @@ var ResultFormatter = class {
|
|
|
732
730
|
value: `v${decodeResult.raw.version.toFixed(1)}`
|
|
733
731
|
});
|
|
734
732
|
}
|
|
733
|
+
static label(decodeResult, value) {
|
|
734
|
+
decodeResult.raw.label = value;
|
|
735
|
+
decodeResult.formatted.items.push({
|
|
736
|
+
type: "label",
|
|
737
|
+
code: "LABEL",
|
|
738
|
+
label: "Message Label",
|
|
739
|
+
value: `${decodeResult.raw.label}`
|
|
740
|
+
});
|
|
741
|
+
}
|
|
742
|
+
static sublabel(decodeResult, value) {
|
|
743
|
+
decodeResult.raw.sublabel = value;
|
|
744
|
+
decodeResult.formatted.items.push({
|
|
745
|
+
type: "sublabel",
|
|
746
|
+
code: "SUBLABEL",
|
|
747
|
+
label: "Message Sublabel",
|
|
748
|
+
value: `${decodeResult.raw.sublabel}`
|
|
749
|
+
});
|
|
750
|
+
}
|
|
735
751
|
static unknown(decodeResult, value, sep = ",") {
|
|
736
752
|
if (!decodeResult.remaining.text)
|
|
737
753
|
decodeResult.remaining.text = value;
|
|
@@ -4258,252 +4274,54 @@ var Label_HX = class extends DecoderPlugin {
|
|
|
4258
4274
|
}
|
|
4259
4275
|
};
|
|
4260
4276
|
|
|
4261
|
-
// lib/plugins/Label_SQ.ts
|
|
4262
|
-
var Label_SQ = class extends DecoderPlugin {
|
|
4263
|
-
name = "label-sq";
|
|
4264
|
-
qualifiers() {
|
|
4265
|
-
return {
|
|
4266
|
-
labels: ["SQ"]
|
|
4267
|
-
};
|
|
4268
|
-
}
|
|
4269
|
-
decode(message, options = {}) {
|
|
4270
|
-
const decodeResult = this.defaultResult();
|
|
4271
|
-
decodeResult.decoder.name = this.name;
|
|
4272
|
-
decodeResult.raw.preamble = message.text.substring(0, 4);
|
|
4273
|
-
decodeResult.raw.version = message.text.substring(1, 2);
|
|
4274
|
-
decodeResult.raw.network = message.text.substring(3, 4);
|
|
4275
|
-
if (decodeResult.raw.version === "2") {
|
|
4276
|
-
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+)\/.*/;
|
|
4277
|
-
const result = message.text.match(regex);
|
|
4278
|
-
if (result?.groups && result.length >= 8) {
|
|
4279
|
-
decodeResult.raw.groundStation = {
|
|
4280
|
-
number: result.groups.station,
|
|
4281
|
-
iataCode: result.groups.iata,
|
|
4282
|
-
icaoCode: result.groups.icao,
|
|
4283
|
-
coordinates: {
|
|
4284
|
-
latitude: Number(result.groups.lat) / 100 * (result.groups.latd === "S" ? -1 : 1),
|
|
4285
|
-
longitude: Number(result.groups.lng) / 100 * (result.groups.lngd === "W" ? -1 : 1)
|
|
4286
|
-
}
|
|
4287
|
-
};
|
|
4288
|
-
decodeResult.raw.vdlFrequency = Number(result.groups.vfreq) / 1e3;
|
|
4289
|
-
}
|
|
4290
|
-
}
|
|
4291
|
-
decodeResult.formatted.description = "Ground Station Squitter";
|
|
4292
|
-
var formattedNetwork = "Unknown";
|
|
4293
|
-
if (decodeResult.raw.network == "A") {
|
|
4294
|
-
formattedNetwork = "ARINC";
|
|
4295
|
-
} else if (decodeResult.raw.network == "S") {
|
|
4296
|
-
formattedNetwork = "SITA";
|
|
4297
|
-
}
|
|
4298
|
-
decodeResult.formatted.items = [
|
|
4299
|
-
{
|
|
4300
|
-
type: "network",
|
|
4301
|
-
code: "NETT",
|
|
4302
|
-
label: "Network",
|
|
4303
|
-
value: formattedNetwork
|
|
4304
|
-
},
|
|
4305
|
-
{
|
|
4306
|
-
type: "version",
|
|
4307
|
-
code: "VER",
|
|
4308
|
-
label: "Version",
|
|
4309
|
-
value: decodeResult.raw.version
|
|
4310
|
-
}
|
|
4311
|
-
];
|
|
4312
|
-
if (decodeResult.raw.groundStation) {
|
|
4313
|
-
if (decodeResult.raw.groundStation.icaoCode && decodeResult.raw.groundStation.number) {
|
|
4314
|
-
decodeResult.formatted.items.push({
|
|
4315
|
-
type: "ground_station",
|
|
4316
|
-
code: "GNDSTN",
|
|
4317
|
-
label: "Ground Station",
|
|
4318
|
-
value: `${decodeResult.raw.groundStation.icaoCode}${decodeResult.raw.groundStation.number}`
|
|
4319
|
-
});
|
|
4320
|
-
}
|
|
4321
|
-
if (decodeResult.raw.groundStation.iataCode) {
|
|
4322
|
-
decodeResult.formatted.items.push({
|
|
4323
|
-
type: "iataCode",
|
|
4324
|
-
code: "IATA",
|
|
4325
|
-
label: "IATA",
|
|
4326
|
-
value: decodeResult.raw.groundStation.iataCode
|
|
4327
|
-
});
|
|
4328
|
-
}
|
|
4329
|
-
if (decodeResult.raw.groundStation.icaoCode) {
|
|
4330
|
-
decodeResult.formatted.items.push({
|
|
4331
|
-
type: "icaoCode",
|
|
4332
|
-
code: "ICAO",
|
|
4333
|
-
label: "ICAO",
|
|
4334
|
-
value: decodeResult.raw.groundStation.icaoCode
|
|
4335
|
-
});
|
|
4336
|
-
}
|
|
4337
|
-
if (decodeResult.raw.groundStation.coordinates.latitude) {
|
|
4338
|
-
decodeResult.formatted.items.push({
|
|
4339
|
-
type: "coordinates",
|
|
4340
|
-
code: "COORD",
|
|
4341
|
-
label: "Ground Station Location",
|
|
4342
|
-
value: `${decodeResult.raw.groundStation.coordinates.latitude}, ${decodeResult.raw.groundStation.coordinates.longitude}`
|
|
4343
|
-
});
|
|
4344
|
-
}
|
|
4345
|
-
if (decodeResult.raw.groundStation.airport) {
|
|
4346
|
-
decodeResult.formatted.items.push({
|
|
4347
|
-
type: "airport",
|
|
4348
|
-
code: "APT",
|
|
4349
|
-
label: "Airport",
|
|
4350
|
-
value: `${decodeResult.raw.groundStation.airport.name} (${decodeResult.raw.groundStation.airport.icao}) in ${decodeResult.raw.groundStation.airport.location}`
|
|
4351
|
-
});
|
|
4352
|
-
}
|
|
4353
|
-
}
|
|
4354
|
-
if (decodeResult.raw.vdlFrequency) {
|
|
4355
|
-
decodeResult.formatted.items.push({
|
|
4356
|
-
type: "vdlFrequency",
|
|
4357
|
-
code: "VDLFRQ",
|
|
4358
|
-
label: "VDL Frequency",
|
|
4359
|
-
value: `${decodeResult.raw.vdlFrequency} MHz`
|
|
4360
|
-
});
|
|
4361
|
-
}
|
|
4362
|
-
decodeResult.decoded = true;
|
|
4363
|
-
decodeResult.decoder.decodeLevel = "full";
|
|
4364
|
-
return decodeResult;
|
|
4365
|
-
}
|
|
4366
|
-
};
|
|
4367
|
-
|
|
4368
|
-
// lib/plugins/Label_QR.ts
|
|
4369
|
-
var Label_QR = class extends DecoderPlugin {
|
|
4370
|
-
name = "label-qr";
|
|
4371
|
-
qualifiers() {
|
|
4372
|
-
return {
|
|
4373
|
-
labels: ["QR"]
|
|
4374
|
-
};
|
|
4375
|
-
}
|
|
4376
|
-
decode(message, options = {}) {
|
|
4377
|
-
const decodeResult = this.defaultResult();
|
|
4378
|
-
decodeResult.decoder.name = this.name;
|
|
4379
|
-
decodeResult.formatted.description = "ON Report";
|
|
4380
|
-
ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
|
|
4381
|
-
ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
|
|
4382
|
-
ResultFormatter.on(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
|
|
4383
|
-
ResultFormatter.unknown(decodeResult, message.text.substring(12));
|
|
4384
|
-
decodeResult.decoded = true;
|
|
4385
|
-
if (!decodeResult.remaining.text)
|
|
4386
|
-
decodeResult.decoder.decodeLevel = "full";
|
|
4387
|
-
else
|
|
4388
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
4389
|
-
return decodeResult;
|
|
4390
|
-
}
|
|
4391
|
-
};
|
|
4392
|
-
|
|
4393
|
-
// lib/plugins/Label_QP.ts
|
|
4394
|
-
var Label_QP = class extends DecoderPlugin {
|
|
4395
|
-
name = "label-qp";
|
|
4396
|
-
qualifiers() {
|
|
4397
|
-
return {
|
|
4398
|
-
labels: ["QP"]
|
|
4399
|
-
};
|
|
4400
|
-
}
|
|
4401
|
-
decode(message, options = {}) {
|
|
4402
|
-
const decodeResult = this.defaultResult();
|
|
4403
|
-
decodeResult.decoder.name = this.name;
|
|
4404
|
-
decodeResult.formatted.description = "OUT Report";
|
|
4405
|
-
ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
|
|
4406
|
-
ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
|
|
4407
|
-
ResultFormatter.out(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
|
|
4408
|
-
ResultFormatter.unknown(decodeResult, message.text.substring(12));
|
|
4409
|
-
decodeResult.decoded = true;
|
|
4410
|
-
if (!decodeResult.remaining.text)
|
|
4411
|
-
decodeResult.decoder.decodeLevel = "full";
|
|
4412
|
-
else
|
|
4413
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
4414
|
-
return decodeResult;
|
|
4415
|
-
}
|
|
4416
|
-
};
|
|
4417
|
-
|
|
4418
|
-
// lib/plugins/Label_QS.ts
|
|
4419
|
-
var Label_QS = class extends DecoderPlugin {
|
|
4420
|
-
name = "label-qs";
|
|
4421
|
-
qualifiers() {
|
|
4422
|
-
return {
|
|
4423
|
-
labels: ["QS"]
|
|
4424
|
-
};
|
|
4425
|
-
}
|
|
4426
|
-
decode(message, options = {}) {
|
|
4427
|
-
const decodeResult = this.defaultResult();
|
|
4428
|
-
decodeResult.decoder.name = this.name;
|
|
4429
|
-
decodeResult.formatted.description = "IN Report";
|
|
4430
|
-
ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
|
|
4431
|
-
ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
|
|
4432
|
-
ResultFormatter.in(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
|
|
4433
|
-
ResultFormatter.unknown(decodeResult, message.text.substring(12));
|
|
4434
|
-
decodeResult.decoded = true;
|
|
4435
|
-
if (!decodeResult.remaining.text)
|
|
4436
|
-
decodeResult.decoder.decodeLevel = "full";
|
|
4437
|
-
else
|
|
4438
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
4439
|
-
return decodeResult;
|
|
4440
|
-
}
|
|
4441
|
-
};
|
|
4442
|
-
|
|
4443
|
-
// lib/plugins/Label_QQ.ts
|
|
4444
|
-
var Label_QQ = class extends DecoderPlugin {
|
|
4445
|
-
name = "label-qq";
|
|
4446
|
-
qualifiers() {
|
|
4447
|
-
return {
|
|
4448
|
-
labels: ["QQ"]
|
|
4449
|
-
};
|
|
4450
|
-
}
|
|
4451
|
-
decode(message, options = {}) {
|
|
4452
|
-
const decodeResult = this.defaultResult();
|
|
4453
|
-
decodeResult.decoder.name = this.name;
|
|
4454
|
-
decodeResult.message = message;
|
|
4455
|
-
decodeResult.formatted.description = "OFF Report";
|
|
4456
|
-
ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
|
|
4457
|
-
ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
|
|
4458
|
-
if (message.text.substring(12, 19) === "\r\n001FE") {
|
|
4459
|
-
decodeResult.raw.day = message.text.substring(19, 21);
|
|
4460
|
-
ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(21, 27)));
|
|
4461
|
-
let latdir = message.text.substring(27, 28);
|
|
4462
|
-
let latdeg = Number(message.text.substring(28, 30));
|
|
4463
|
-
let latmin = Number(message.text.substring(30, 34));
|
|
4464
|
-
let londir = message.text.substring(34, 35);
|
|
4465
|
-
let londeg = Number(message.text.substring(35, 38));
|
|
4466
|
-
let lonmin = Number(message.text.substring(38, 42));
|
|
4467
|
-
let pos = {
|
|
4468
|
-
latitude: (latdeg + latmin / 60) * (latdir === "N" ? 1 : -1),
|
|
4469
|
-
longitude: (londeg + lonmin / 60) * (londir === "E" ? 1 : -1)
|
|
4470
|
-
};
|
|
4471
|
-
ResultFormatter.unknown(decodeResult, message.text.substring(42, 45));
|
|
4472
|
-
ResultFormatter.position(decodeResult, pos);
|
|
4473
|
-
if (decodeResult.remaining.text !== "---") {
|
|
4474
|
-
ResultFormatter.groundspeed(decodeResult, Number(message.text.substring(45, 48)));
|
|
4475
|
-
} else {
|
|
4476
|
-
ResultFormatter.unknown(decodeResult, message.text.substring(45, 48));
|
|
4477
|
-
}
|
|
4478
|
-
ResultFormatter.unknown(decodeResult, message.text.substring(48));
|
|
4479
|
-
} else {
|
|
4480
|
-
ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12) + "00"));
|
|
4481
|
-
ResultFormatter.unknown(decodeResult, message.text.substring(12));
|
|
4482
|
-
}
|
|
4483
|
-
decodeResult.decoded = true;
|
|
4484
|
-
if (!decodeResult.remaining.text)
|
|
4485
|
-
decodeResult.decoder.decodeLevel = "full";
|
|
4486
|
-
else
|
|
4487
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
4488
|
-
return decodeResult;
|
|
4489
|
-
}
|
|
4490
|
-
};
|
|
4491
|
-
|
|
4492
4277
|
// lib/utils/miam.ts
|
|
4493
4278
|
import * as Base85 from "base85";
|
|
4494
4279
|
import * as zlib2 from "minizlib";
|
|
4495
4280
|
import { Buffer as Buffer3 } from "buffer";
|
|
4281
|
+
var MIAMVersion = /* @__PURE__ */ ((MIAMVersion2) => {
|
|
4282
|
+
MIAMVersion2[MIAMVersion2["V1"] = 1] = "V1";
|
|
4283
|
+
MIAMVersion2[MIAMVersion2["V2"] = 2] = "V2";
|
|
4284
|
+
return MIAMVersion2;
|
|
4285
|
+
})(MIAMVersion || {});
|
|
4286
|
+
var MIAMFid = /* @__PURE__ */ ((MIAMFid2) => {
|
|
4287
|
+
MIAMFid2["SingleTransfer"] = "T";
|
|
4288
|
+
MIAMFid2["FileTransferRequest"] = "F";
|
|
4289
|
+
MIAMFid2["FileTransferAccept"] = "K";
|
|
4290
|
+
MIAMFid2["FileSegment"] = "S";
|
|
4291
|
+
MIAMFid2["FileTransferAbort"] = "A";
|
|
4292
|
+
MIAMFid2["XOFFIndication"] = "Y";
|
|
4293
|
+
MIAMFid2["XONIndication"] = "X";
|
|
4294
|
+
return MIAMFid2;
|
|
4295
|
+
})(MIAMFid || {});
|
|
4296
|
+
var MIAMCorePdu = /* @__PURE__ */ ((MIAMCorePdu2) => {
|
|
4297
|
+
MIAMCorePdu2[MIAMCorePdu2["Data"] = 0] = "Data";
|
|
4298
|
+
MIAMCorePdu2[MIAMCorePdu2["Ack"] = 1] = "Ack";
|
|
4299
|
+
MIAMCorePdu2[MIAMCorePdu2["Aloha"] = 2] = "Aloha";
|
|
4300
|
+
MIAMCorePdu2[MIAMCorePdu2["AlohaReply"] = 3] = "AlohaReply";
|
|
4301
|
+
return MIAMCorePdu2;
|
|
4302
|
+
})(MIAMCorePdu || {});
|
|
4303
|
+
var MIAMCoreApp = /* @__PURE__ */ ((MIAMCoreApp2) => {
|
|
4304
|
+
MIAMCoreApp2[MIAMCoreApp2["ACARS2Char"] = 0] = "ACARS2Char";
|
|
4305
|
+
MIAMCoreApp2[MIAMCoreApp2["ACARS4Char"] = 1] = "ACARS4Char";
|
|
4306
|
+
MIAMCoreApp2[MIAMCoreApp2["ACARS6Char"] = 2] = "ACARS6Char";
|
|
4307
|
+
MIAMCoreApp2[MIAMCoreApp2["NonACARS6Char"] = 3] = "NonACARS6Char";
|
|
4308
|
+
return MIAMCoreApp2;
|
|
4309
|
+
})(MIAMCoreApp || {});
|
|
4496
4310
|
var MIAMCoreV1CRCLength = 4;
|
|
4497
4311
|
var MIAMCoreV2CRCLength = 2;
|
|
4312
|
+
var isMIAMVersion = (x) => Object.values(MIAMVersion).includes(x);
|
|
4313
|
+
var isMIAMFid = (x) => Object.values(MIAMFid).includes(x);
|
|
4314
|
+
var isMIAMCoreApp = (x) => Object.values(MIAMCoreApp).includes(x);
|
|
4315
|
+
var isMIAMCorePdu = (x) => Object.values(MIAMCorePdu).includes(x);
|
|
4498
4316
|
var MIAMCoreUtils = class {
|
|
4499
4317
|
static AppTypeToAppIdLenTable = {
|
|
4500
|
-
1: {
|
|
4318
|
+
[1 /* V1 */]: {
|
|
4501
4319
|
[0 /* ACARS2Char */]: 2,
|
|
4502
4320
|
[1 /* ACARS4Char */]: 4,
|
|
4503
4321
|
[2 /* ACARS6Char */]: 6,
|
|
4504
4322
|
[3 /* NonACARS6Char */]: 6
|
|
4505
4323
|
},
|
|
4506
|
-
2: {
|
|
4324
|
+
[2 /* V2 */]: {
|
|
4507
4325
|
[0 /* ACARS2Char */]: 2,
|
|
4508
4326
|
[1 /* ACARS4Char */]: 4,
|
|
4509
4327
|
[2 /* ACARS6Char */]: 6,
|
|
@@ -4569,21 +4387,34 @@ var MIAMCoreUtils = class {
|
|
|
4569
4387
|
hdr = hdr.subarray(0, hdr.length - hpad);
|
|
4570
4388
|
const version = hdr.readUInt8(0) & 15;
|
|
4571
4389
|
const pduType = hdr.readUInt8(0) >> 4 & 15;
|
|
4572
|
-
|
|
4573
|
-
|
|
4390
|
+
if (isMIAMVersion(version) && isMIAMCorePdu(pduType)) {
|
|
4391
|
+
const versionPduHandler = this.VersionPduHandlerTable[version][pduType];
|
|
4392
|
+
return versionPduHandler(hdr, body);
|
|
4393
|
+
} else {
|
|
4574
4394
|
return {
|
|
4575
4395
|
decoded: false,
|
|
4576
4396
|
error: "Invalid version and PDU type combination: v=" + version + ", pdu=" + pduType
|
|
4577
4397
|
};
|
|
4578
4398
|
}
|
|
4579
|
-
return versionPduHandler(hdr, body);
|
|
4580
4399
|
},
|
|
4581
|
-
["F" /* FileTransferRequest */]:
|
|
4582
|
-
|
|
4583
|
-
|
|
4584
|
-
["
|
|
4585
|
-
|
|
4586
|
-
|
|
4400
|
+
["F" /* FileTransferRequest */]: () => {
|
|
4401
|
+
return { decoded: false, error: "File Transfer Request not implemented" };
|
|
4402
|
+
},
|
|
4403
|
+
["K" /* FileTransferAccept */]: () => {
|
|
4404
|
+
return { decoded: false, error: "File Transfer Accept not implemented" };
|
|
4405
|
+
},
|
|
4406
|
+
["S" /* FileSegment */]: () => {
|
|
4407
|
+
return { decoded: false, error: "File Segment not implemented" };
|
|
4408
|
+
},
|
|
4409
|
+
["A" /* FileTransferAbort */]: () => {
|
|
4410
|
+
return { decoded: false, error: "File Transfer Abort not implemented" };
|
|
4411
|
+
},
|
|
4412
|
+
["Y" /* XOFFIndication */]: () => {
|
|
4413
|
+
return { decoded: false, error: "XOFF Indication not implemented" };
|
|
4414
|
+
},
|
|
4415
|
+
["X" /* XONIndication */]: () => {
|
|
4416
|
+
return { decoded: false, error: "XON Indication not implemented" };
|
|
4417
|
+
}
|
|
4587
4418
|
};
|
|
4588
4419
|
static arincCrc16(buf, seed) {
|
|
4589
4420
|
const crctable = [
|
|
@@ -5117,14 +4948,15 @@ var MIAMCoreUtils = class {
|
|
|
5117
4948
|
}
|
|
5118
4949
|
static parse(txt) {
|
|
5119
4950
|
const fidType = txt[0];
|
|
5120
|
-
|
|
5121
|
-
|
|
4951
|
+
if (isMIAMFid(fidType)) {
|
|
4952
|
+
const handler = this.FidHandlerTable[fidType];
|
|
4953
|
+
return handler(txt.substring(1));
|
|
4954
|
+
} else {
|
|
5122
4955
|
return {
|
|
5123
4956
|
decoded: false,
|
|
5124
4957
|
error: "Unsupported FID type: " + fidType
|
|
5125
4958
|
};
|
|
5126
4959
|
}
|
|
5127
|
-
return handler(txt.substring(1));
|
|
5128
4960
|
}
|
|
5129
4961
|
static corePduDataHandler(version, minHdrSize, crcLen, hdr, body) {
|
|
5130
4962
|
if (hdr.length < minHdrSize) {
|
|
@@ -5139,14 +4971,14 @@ var MIAMCoreUtils = class {
|
|
|
5139
4971
|
let pduAppType = 0;
|
|
5140
4972
|
let pduAppId = "";
|
|
5141
4973
|
let pduCrc = 0;
|
|
5142
|
-
let pduData =
|
|
4974
|
+
let pduData = null;
|
|
5143
4975
|
let pduCrcIsOk = false;
|
|
5144
4976
|
let pduIsComplete = true;
|
|
5145
4977
|
let pduErrors = [];
|
|
5146
4978
|
let tail = void 0;
|
|
5147
4979
|
let msgNum = 0;
|
|
5148
4980
|
let ackOptions = 0;
|
|
5149
|
-
if (version === 1) {
|
|
4981
|
+
if (version === 1 /* V1 */) {
|
|
5150
4982
|
pduSize = hdr.readUInt8(1) << 16 | hdr.readUInt8(2) << 8 | hdr.readUInt8(3);
|
|
5151
4983
|
const msgSize = hdr.length + (body === void 0 ? 0 : body.length);
|
|
5152
4984
|
if (pduSize > msgSize) {
|
|
@@ -5156,7 +4988,7 @@ var MIAMCoreUtils = class {
|
|
|
5156
4988
|
hdr = hdr.subarray(4);
|
|
5157
4989
|
tail = hdr.subarray(0, 7).toString("ascii");
|
|
5158
4990
|
hdr = hdr.subarray(7);
|
|
5159
|
-
} else if (version === 2) {
|
|
4991
|
+
} else if (version === 2 /* V2 */) {
|
|
5160
4992
|
hdr = hdr.subarray(1);
|
|
5161
4993
|
}
|
|
5162
4994
|
msgNum = hdr.readUInt8(0) >> 1 & 127;
|
|
@@ -5166,9 +4998,11 @@ var MIAMCoreUtils = class {
|
|
|
5166
4998
|
pduEncoding = hdr.readUInt8(1) >> 4 & 3;
|
|
5167
4999
|
pduAppType = hdr.readUInt8(1) & 15;
|
|
5168
5000
|
hdr = hdr.subarray(2);
|
|
5169
|
-
let appIdLen
|
|
5170
|
-
if (
|
|
5171
|
-
|
|
5001
|
+
let appIdLen;
|
|
5002
|
+
if (isMIAMCoreApp(pduAppType)) {
|
|
5003
|
+
appIdLen = this.AppTypeToAppIdLenTable[version][pduAppType];
|
|
5004
|
+
} else {
|
|
5005
|
+
if (version === 2 /* V2 */ && (pduAppType & 8) !== 0 && pduAppType !== 13) {
|
|
5172
5006
|
appIdLen = (pduAppType & 7) + 1;
|
|
5173
5007
|
} else {
|
|
5174
5008
|
return {
|
|
@@ -5178,9 +5012,6 @@ var MIAMCoreUtils = class {
|
|
|
5178
5012
|
}
|
|
5179
5013
|
}
|
|
5180
5014
|
const pduIsACARS = [
|
|
5181
|
-
0 /* ACARS2Char */,
|
|
5182
|
-
1 /* ACARS4Char */,
|
|
5183
|
-
2 /* ACARS6Char */,
|
|
5184
5015
|
0 /* ACARS2Char */,
|
|
5185
5016
|
1 /* ACARS4Char */,
|
|
5186
5017
|
2 /* ACARS6Char */
|
|
@@ -5202,7 +5033,7 @@ var MIAMCoreUtils = class {
|
|
|
5202
5033
|
if (body !== void 0 && body.length > 0) {
|
|
5203
5034
|
if ([1 /* Deflate */, 1 /* Deflate */].indexOf(pduCompression) >= 0) {
|
|
5204
5035
|
try {
|
|
5205
|
-
const decompress = new zlib2.InflateRaw({
|
|
5036
|
+
const decompress = new zlib2.InflateRaw({});
|
|
5206
5037
|
decompress.write(body);
|
|
5207
5038
|
decompress.flush(zlib2.constants.Z_SYNC_FLUSH);
|
|
5208
5039
|
pduData = decompress.read();
|
|
@@ -5214,18 +5045,18 @@ var MIAMCoreUtils = class {
|
|
|
5214
5045
|
} else {
|
|
5215
5046
|
pduErrors.push("Unsupported v" + version + " compression type: " + pduCompression);
|
|
5216
5047
|
}
|
|
5217
|
-
if (pduData !==
|
|
5048
|
+
if (pduData !== null) {
|
|
5218
5049
|
const crcAlgoHandlerByVersion = {
|
|
5219
|
-
1: (buf, seed) => {
|
|
5050
|
+
[1 /* V1 */]: (buf, seed) => {
|
|
5220
5051
|
return ~this.arinc665Crc32(buf, seed);
|
|
5221
5052
|
},
|
|
5222
|
-
2: this.arincCrc16
|
|
5053
|
+
[2 /* V2 */]: this.arincCrc16
|
|
5223
5054
|
};
|
|
5224
5055
|
const crcAlgoHandler = crcAlgoHandlerByVersion[version];
|
|
5225
5056
|
if (crcAlgoHandler === void 0) {
|
|
5226
5057
|
return {
|
|
5227
5058
|
decoded: false,
|
|
5228
|
-
|
|
5059
|
+
error: "No CRC handler for v" + version
|
|
5229
5060
|
};
|
|
5230
5061
|
}
|
|
5231
5062
|
const crcCheck = crcAlgoHandler(pduData, 4294967295);
|
|
@@ -5273,25 +5104,315 @@ var MIAMCoreUtils = class {
|
|
|
5273
5104
|
};
|
|
5274
5105
|
}
|
|
5275
5106
|
static VersionPduHandlerTable = {
|
|
5276
|
-
1: {
|
|
5107
|
+
[1 /* V1 */]: {
|
|
5277
5108
|
[0 /* Data */]: (hdr, body) => {
|
|
5278
|
-
return this.corePduDataHandler(1
|
|
5109
|
+
return this.corePduDataHandler(1 /* V1 */, 20, MIAMCoreV1CRCLength, hdr, body);
|
|
5279
5110
|
},
|
|
5280
|
-
[1 /* Ack */]:
|
|
5281
|
-
|
|
5282
|
-
|
|
5111
|
+
[1 /* Ack */]: () => {
|
|
5112
|
+
return { decoded: false, error: "v1 Ack PDU not implemented" };
|
|
5113
|
+
},
|
|
5114
|
+
[2 /* Aloha */]: () => {
|
|
5115
|
+
return { decoded: false, error: "v1 Aloha PDU not implemented" };
|
|
5116
|
+
},
|
|
5117
|
+
[3 /* AlohaReply */]: () => {
|
|
5118
|
+
return { decoded: false, error: "v1 AlohaReply PDU not implemented" };
|
|
5119
|
+
}
|
|
5283
5120
|
},
|
|
5284
|
-
2: {
|
|
5121
|
+
[2 /* V2 */]: {
|
|
5285
5122
|
[0 /* Data */]: (hdr, body) => {
|
|
5286
|
-
return this.corePduDataHandler(2
|
|
5123
|
+
return this.corePduDataHandler(2 /* V2 */, 7, MIAMCoreV2CRCLength, hdr, body);
|
|
5124
|
+
},
|
|
5125
|
+
[1 /* Ack */]: () => {
|
|
5126
|
+
return { decoded: false, error: "v2 Ack PDU not implemented" };
|
|
5127
|
+
},
|
|
5128
|
+
[2 /* Aloha */]: () => {
|
|
5129
|
+
return { decoded: false, error: "v2 Aloha PDU not implemented" };
|
|
5287
5130
|
},
|
|
5288
|
-
[
|
|
5289
|
-
|
|
5290
|
-
|
|
5131
|
+
[3 /* AlohaReply */]: () => {
|
|
5132
|
+
return { decoded: false, error: "v2 Aloha reply PDU not implemented" };
|
|
5133
|
+
}
|
|
5291
5134
|
}
|
|
5292
5135
|
};
|
|
5293
5136
|
};
|
|
5294
5137
|
|
|
5138
|
+
// lib/plugins/Label_MA.ts
|
|
5139
|
+
var Label_MA = class extends DecoderPlugin {
|
|
5140
|
+
name = "label-ma";
|
|
5141
|
+
qualifiers() {
|
|
5142
|
+
return {
|
|
5143
|
+
labels: ["MA"]
|
|
5144
|
+
};
|
|
5145
|
+
}
|
|
5146
|
+
decode(message, options = {}) {
|
|
5147
|
+
let decodeResult = this.defaultResult();
|
|
5148
|
+
decodeResult.decoder.name = this.name;
|
|
5149
|
+
decodeResult.message = message;
|
|
5150
|
+
const miamResult = MIAMCoreUtils.parse(message.text);
|
|
5151
|
+
if (miamResult.decoded && miamResult.message.data !== void 0 && miamResult.message.data.crcOk && miamResult.message.data.complete && miamResult.message.data.acars !== void 0) {
|
|
5152
|
+
decodeResult.decoded = true;
|
|
5153
|
+
decodeResult.decoder.decodeLevel = "partial";
|
|
5154
|
+
ResultFormatter.label(decodeResult, miamResult.message.data.acars.label);
|
|
5155
|
+
if (miamResult.message.data.acars.sublabel) {
|
|
5156
|
+
ResultFormatter.sublabel(decodeResult, miamResult.message.data.acars.sublabel);
|
|
5157
|
+
}
|
|
5158
|
+
if (miamResult.message.data.acars.tail) {
|
|
5159
|
+
ResultFormatter.tail(decodeResult, miamResult.message.data.acars.tail);
|
|
5160
|
+
}
|
|
5161
|
+
const messageText = miamResult.message.data.acars.text;
|
|
5162
|
+
if (messageText) {
|
|
5163
|
+
const decoded = this.decoder.decode({
|
|
5164
|
+
label: miamResult.message.data.acars.label,
|
|
5165
|
+
sublabel: miamResult.message.data.acars.sublabel,
|
|
5166
|
+
text: messageText
|
|
5167
|
+
}, options);
|
|
5168
|
+
if (decoded.decoded) {
|
|
5169
|
+
decodeResult.decoder.decodeLevel = decoded.decoder.decodeLevel;
|
|
5170
|
+
decodeResult.raw = { ...decodeResult.raw, ...decoded.raw };
|
|
5171
|
+
decodeResult.formatted.items.push(...decoded.formatted.items);
|
|
5172
|
+
} else {
|
|
5173
|
+
ResultFormatter.text(decodeResult, messageText);
|
|
5174
|
+
}
|
|
5175
|
+
message.text = messageText;
|
|
5176
|
+
}
|
|
5177
|
+
message.label = miamResult.message.data.acars.label;
|
|
5178
|
+
message.sublabel = miamResult.message.data.acars.sublabel;
|
|
5179
|
+
return decodeResult;
|
|
5180
|
+
}
|
|
5181
|
+
return decodeResult;
|
|
5182
|
+
}
|
|
5183
|
+
};
|
|
5184
|
+
|
|
5185
|
+
// lib/plugins/Label_SQ.ts
|
|
5186
|
+
var Label_SQ = class extends DecoderPlugin {
|
|
5187
|
+
name = "label-sq";
|
|
5188
|
+
qualifiers() {
|
|
5189
|
+
return {
|
|
5190
|
+
labels: ["SQ"]
|
|
5191
|
+
};
|
|
5192
|
+
}
|
|
5193
|
+
decode(message, options = {}) {
|
|
5194
|
+
const decodeResult = this.defaultResult();
|
|
5195
|
+
decodeResult.decoder.name = this.name;
|
|
5196
|
+
decodeResult.raw.preamble = message.text.substring(0, 4);
|
|
5197
|
+
decodeResult.raw.version = message.text.substring(1, 2);
|
|
5198
|
+
decodeResult.raw.network = message.text.substring(3, 4);
|
|
5199
|
+
if (decodeResult.raw.version === "2") {
|
|
5200
|
+
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+)\/.*/;
|
|
5201
|
+
const result = message.text.match(regex);
|
|
5202
|
+
if (result?.groups && result.length >= 8) {
|
|
5203
|
+
decodeResult.raw.groundStation = {
|
|
5204
|
+
number: result.groups.station,
|
|
5205
|
+
iataCode: result.groups.iata,
|
|
5206
|
+
icaoCode: result.groups.icao,
|
|
5207
|
+
coordinates: {
|
|
5208
|
+
latitude: Number(result.groups.lat) / 100 * (result.groups.latd === "S" ? -1 : 1),
|
|
5209
|
+
longitude: Number(result.groups.lng) / 100 * (result.groups.lngd === "W" ? -1 : 1)
|
|
5210
|
+
}
|
|
5211
|
+
};
|
|
5212
|
+
decodeResult.raw.vdlFrequency = Number(result.groups.vfreq) / 1e3;
|
|
5213
|
+
}
|
|
5214
|
+
}
|
|
5215
|
+
decodeResult.formatted.description = "Ground Station Squitter";
|
|
5216
|
+
var formattedNetwork = "Unknown";
|
|
5217
|
+
if (decodeResult.raw.network == "A") {
|
|
5218
|
+
formattedNetwork = "ARINC";
|
|
5219
|
+
} else if (decodeResult.raw.network == "S") {
|
|
5220
|
+
formattedNetwork = "SITA";
|
|
5221
|
+
}
|
|
5222
|
+
decodeResult.formatted.items = [
|
|
5223
|
+
{
|
|
5224
|
+
type: "network",
|
|
5225
|
+
code: "NETT",
|
|
5226
|
+
label: "Network",
|
|
5227
|
+
value: formattedNetwork
|
|
5228
|
+
},
|
|
5229
|
+
{
|
|
5230
|
+
type: "version",
|
|
5231
|
+
code: "VER",
|
|
5232
|
+
label: "Version",
|
|
5233
|
+
value: decodeResult.raw.version
|
|
5234
|
+
}
|
|
5235
|
+
];
|
|
5236
|
+
if (decodeResult.raw.groundStation) {
|
|
5237
|
+
if (decodeResult.raw.groundStation.icaoCode && decodeResult.raw.groundStation.number) {
|
|
5238
|
+
decodeResult.formatted.items.push({
|
|
5239
|
+
type: "ground_station",
|
|
5240
|
+
code: "GNDSTN",
|
|
5241
|
+
label: "Ground Station",
|
|
5242
|
+
value: `${decodeResult.raw.groundStation.icaoCode}${decodeResult.raw.groundStation.number}`
|
|
5243
|
+
});
|
|
5244
|
+
}
|
|
5245
|
+
if (decodeResult.raw.groundStation.iataCode) {
|
|
5246
|
+
decodeResult.formatted.items.push({
|
|
5247
|
+
type: "iataCode",
|
|
5248
|
+
code: "IATA",
|
|
5249
|
+
label: "IATA",
|
|
5250
|
+
value: decodeResult.raw.groundStation.iataCode
|
|
5251
|
+
});
|
|
5252
|
+
}
|
|
5253
|
+
if (decodeResult.raw.groundStation.icaoCode) {
|
|
5254
|
+
decodeResult.formatted.items.push({
|
|
5255
|
+
type: "icaoCode",
|
|
5256
|
+
code: "ICAO",
|
|
5257
|
+
label: "ICAO",
|
|
5258
|
+
value: decodeResult.raw.groundStation.icaoCode
|
|
5259
|
+
});
|
|
5260
|
+
}
|
|
5261
|
+
if (decodeResult.raw.groundStation.coordinates.latitude) {
|
|
5262
|
+
decodeResult.formatted.items.push({
|
|
5263
|
+
type: "coordinates",
|
|
5264
|
+
code: "COORD",
|
|
5265
|
+
label: "Ground Station Location",
|
|
5266
|
+
value: `${decodeResult.raw.groundStation.coordinates.latitude}, ${decodeResult.raw.groundStation.coordinates.longitude}`
|
|
5267
|
+
});
|
|
5268
|
+
}
|
|
5269
|
+
if (decodeResult.raw.groundStation.airport) {
|
|
5270
|
+
decodeResult.formatted.items.push({
|
|
5271
|
+
type: "airport",
|
|
5272
|
+
code: "APT",
|
|
5273
|
+
label: "Airport",
|
|
5274
|
+
value: `${decodeResult.raw.groundStation.airport.name} (${decodeResult.raw.groundStation.airport.icao}) in ${decodeResult.raw.groundStation.airport.location}`
|
|
5275
|
+
});
|
|
5276
|
+
}
|
|
5277
|
+
}
|
|
5278
|
+
if (decodeResult.raw.vdlFrequency) {
|
|
5279
|
+
decodeResult.formatted.items.push({
|
|
5280
|
+
type: "vdlFrequency",
|
|
5281
|
+
code: "VDLFRQ",
|
|
5282
|
+
label: "VDL Frequency",
|
|
5283
|
+
value: `${decodeResult.raw.vdlFrequency} MHz`
|
|
5284
|
+
});
|
|
5285
|
+
}
|
|
5286
|
+
decodeResult.decoded = true;
|
|
5287
|
+
decodeResult.decoder.decodeLevel = "full";
|
|
5288
|
+
return decodeResult;
|
|
5289
|
+
}
|
|
5290
|
+
};
|
|
5291
|
+
|
|
5292
|
+
// lib/plugins/Label_QR.ts
|
|
5293
|
+
var Label_QR = class extends DecoderPlugin {
|
|
5294
|
+
name = "label-qr";
|
|
5295
|
+
qualifiers() {
|
|
5296
|
+
return {
|
|
5297
|
+
labels: ["QR"]
|
|
5298
|
+
};
|
|
5299
|
+
}
|
|
5300
|
+
decode(message, options = {}) {
|
|
5301
|
+
const decodeResult = this.defaultResult();
|
|
5302
|
+
decodeResult.decoder.name = this.name;
|
|
5303
|
+
decodeResult.formatted.description = "ON Report";
|
|
5304
|
+
ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
|
|
5305
|
+
ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
|
|
5306
|
+
ResultFormatter.on(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
|
|
5307
|
+
ResultFormatter.unknown(decodeResult, message.text.substring(12));
|
|
5308
|
+
decodeResult.decoded = true;
|
|
5309
|
+
if (!decodeResult.remaining.text)
|
|
5310
|
+
decodeResult.decoder.decodeLevel = "full";
|
|
5311
|
+
else
|
|
5312
|
+
decodeResult.decoder.decodeLevel = "partial";
|
|
5313
|
+
return decodeResult;
|
|
5314
|
+
}
|
|
5315
|
+
};
|
|
5316
|
+
|
|
5317
|
+
// lib/plugins/Label_QP.ts
|
|
5318
|
+
var Label_QP = class extends DecoderPlugin {
|
|
5319
|
+
name = "label-qp";
|
|
5320
|
+
qualifiers() {
|
|
5321
|
+
return {
|
|
5322
|
+
labels: ["QP"]
|
|
5323
|
+
};
|
|
5324
|
+
}
|
|
5325
|
+
decode(message, options = {}) {
|
|
5326
|
+
const decodeResult = this.defaultResult();
|
|
5327
|
+
decodeResult.decoder.name = this.name;
|
|
5328
|
+
decodeResult.formatted.description = "OUT Report";
|
|
5329
|
+
ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
|
|
5330
|
+
ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
|
|
5331
|
+
ResultFormatter.out(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
|
|
5332
|
+
ResultFormatter.unknown(decodeResult, message.text.substring(12));
|
|
5333
|
+
decodeResult.decoded = true;
|
|
5334
|
+
if (!decodeResult.remaining.text)
|
|
5335
|
+
decodeResult.decoder.decodeLevel = "full";
|
|
5336
|
+
else
|
|
5337
|
+
decodeResult.decoder.decodeLevel = "partial";
|
|
5338
|
+
return decodeResult;
|
|
5339
|
+
}
|
|
5340
|
+
};
|
|
5341
|
+
|
|
5342
|
+
// lib/plugins/Label_QS.ts
|
|
5343
|
+
var Label_QS = class extends DecoderPlugin {
|
|
5344
|
+
name = "label-qs";
|
|
5345
|
+
qualifiers() {
|
|
5346
|
+
return {
|
|
5347
|
+
labels: ["QS"]
|
|
5348
|
+
};
|
|
5349
|
+
}
|
|
5350
|
+
decode(message, options = {}) {
|
|
5351
|
+
const decodeResult = this.defaultResult();
|
|
5352
|
+
decodeResult.decoder.name = this.name;
|
|
5353
|
+
decodeResult.formatted.description = "IN Report";
|
|
5354
|
+
ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
|
|
5355
|
+
ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
|
|
5356
|
+
ResultFormatter.in(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
|
|
5357
|
+
ResultFormatter.unknown(decodeResult, message.text.substring(12));
|
|
5358
|
+
decodeResult.decoded = true;
|
|
5359
|
+
if (!decodeResult.remaining.text)
|
|
5360
|
+
decodeResult.decoder.decodeLevel = "full";
|
|
5361
|
+
else
|
|
5362
|
+
decodeResult.decoder.decodeLevel = "partial";
|
|
5363
|
+
return decodeResult;
|
|
5364
|
+
}
|
|
5365
|
+
};
|
|
5366
|
+
|
|
5367
|
+
// lib/plugins/Label_QQ.ts
|
|
5368
|
+
var Label_QQ = class extends DecoderPlugin {
|
|
5369
|
+
name = "label-qq";
|
|
5370
|
+
qualifiers() {
|
|
5371
|
+
return {
|
|
5372
|
+
labels: ["QQ"]
|
|
5373
|
+
};
|
|
5374
|
+
}
|
|
5375
|
+
decode(message, options = {}) {
|
|
5376
|
+
const decodeResult = this.defaultResult();
|
|
5377
|
+
decodeResult.decoder.name = this.name;
|
|
5378
|
+
decodeResult.message = message;
|
|
5379
|
+
decodeResult.formatted.description = "OFF Report";
|
|
5380
|
+
ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
|
|
5381
|
+
ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
|
|
5382
|
+
if (message.text.substring(12, 19) === "\r\n001FE") {
|
|
5383
|
+
decodeResult.raw.day = message.text.substring(19, 21);
|
|
5384
|
+
ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(21, 27)));
|
|
5385
|
+
let latdir = message.text.substring(27, 28);
|
|
5386
|
+
let latdeg = Number(message.text.substring(28, 30));
|
|
5387
|
+
let latmin = Number(message.text.substring(30, 34));
|
|
5388
|
+
let londir = message.text.substring(34, 35);
|
|
5389
|
+
let londeg = Number(message.text.substring(35, 38));
|
|
5390
|
+
let lonmin = Number(message.text.substring(38, 42));
|
|
5391
|
+
let pos = {
|
|
5392
|
+
latitude: (latdeg + latmin / 60) * (latdir === "N" ? 1 : -1),
|
|
5393
|
+
longitude: (londeg + lonmin / 60) * (londir === "E" ? 1 : -1)
|
|
5394
|
+
};
|
|
5395
|
+
ResultFormatter.unknown(decodeResult, message.text.substring(42, 45));
|
|
5396
|
+
ResultFormatter.position(decodeResult, pos);
|
|
5397
|
+
if (decodeResult.remaining.text !== "---") {
|
|
5398
|
+
ResultFormatter.groundspeed(decodeResult, Number(message.text.substring(45, 48)));
|
|
5399
|
+
} else {
|
|
5400
|
+
ResultFormatter.unknown(decodeResult, message.text.substring(45, 48));
|
|
5401
|
+
}
|
|
5402
|
+
ResultFormatter.unknown(decodeResult, message.text.substring(48));
|
|
5403
|
+
} else {
|
|
5404
|
+
ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12) + "00"));
|
|
5405
|
+
ResultFormatter.unknown(decodeResult, message.text.substring(12));
|
|
5406
|
+
}
|
|
5407
|
+
decodeResult.decoded = true;
|
|
5408
|
+
if (!decodeResult.remaining.text)
|
|
5409
|
+
decodeResult.decoder.decodeLevel = "full";
|
|
5410
|
+
else
|
|
5411
|
+
decodeResult.decoder.decodeLevel = "partial";
|
|
5412
|
+
return decodeResult;
|
|
5413
|
+
}
|
|
5414
|
+
};
|
|
5415
|
+
|
|
5295
5416
|
// lib/MessageDecoder.ts
|
|
5296
5417
|
var MessageDecoder = class {
|
|
5297
5418
|
name;
|
|
@@ -5359,6 +5480,7 @@ var MessageDecoder = class {
|
|
|
5359
5480
|
this.registerPlugin(new Label_83(this));
|
|
5360
5481
|
this.registerPlugin(new Label_8E(this));
|
|
5361
5482
|
this.registerPlugin(new Label_1M_Slash(this));
|
|
5483
|
+
this.registerPlugin(new Label_MA(this));
|
|
5362
5484
|
this.registerPlugin(new Label_SQ(this));
|
|
5363
5485
|
this.registerPlugin(new Label_QP(this));
|
|
5364
5486
|
this.registerPlugin(new Label_QQ(this));
|
|
@@ -5371,18 +5493,6 @@ var MessageDecoder = class {
|
|
|
5371
5493
|
return true;
|
|
5372
5494
|
}
|
|
5373
5495
|
decode(message, options = {}) {
|
|
5374
|
-
if (message.label === "MA") {
|
|
5375
|
-
const decodeResult = MIAMCoreUtils.parse(message.text);
|
|
5376
|
-
if (decodeResult.decoded && decodeResult.message.data !== void 0 && decodeResult.message.data.crcOk && decodeResult.message.data.complete && decodeResult.message.data.acars !== void 0) {
|
|
5377
|
-
message = {
|
|
5378
|
-
...message,
|
|
5379
|
-
label: decodeResult.message.data.acars.label,
|
|
5380
|
-
...decodeResult.message.data.acars.sublabel ? { sublabel: decodeResult.message.data.acars.sublabel } : {},
|
|
5381
|
-
...decodeResult.message.data.acars.mfi ? { mfi: decodeResult.message.data.acars.mfi } : {},
|
|
5382
|
-
...decodeResult.message.data.acars.text ? { text: decodeResult.message.data.acars.text } : {}
|
|
5383
|
-
};
|
|
5384
|
-
}
|
|
5385
|
-
}
|
|
5386
5496
|
const usablePlugins = this.plugins.filter((plugin) => {
|
|
5387
5497
|
const qualifiers = plugin.qualifiers();
|
|
5388
5498
|
if (qualifiers.labels.includes(message.label)) {
|
|
@@ -5432,11 +5542,6 @@ var MessageDecoder = class {
|
|
|
5432
5542
|
}
|
|
5433
5543
|
return result;
|
|
5434
5544
|
}
|
|
5435
|
-
lookupAirportByIata(iata) {
|
|
5436
|
-
const airportsArray = [];
|
|
5437
|
-
const airport = airportsArray.filter((e) => e.iata === iata);
|
|
5438
|
-
return airport;
|
|
5439
|
-
}
|
|
5440
5545
|
};
|
|
5441
5546
|
export {
|
|
5442
5547
|
IcaoDecoder,
|