@squawk/mode-s 0.1.0 → 0.3.0
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/README.md +32 -9
- package/dist/flight-status.d.ts +10 -0
- package/dist/flight-status.d.ts.map +1 -0
- package/dist/flight-status.js +28 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/message.d.ts.map +1 -1
- package/dist/message.js +23 -6
- package/dist/types/acas.d.ts +1 -81
- package/dist/types/acas.d.ts.map +1 -1
- package/dist/types/emergency-status.d.ts +1 -5
- package/dist/types/emergency-status.d.ts.map +1 -1
- package/dist/types/flight-status.d.ts +13 -0
- package/dist/types/flight-status.d.ts.map +1 -0
- package/dist/types/flight-status.js +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/message.d.ts +20 -2
- package/dist/types/message.d.ts.map +1 -1
- package/dist/types/target-state-status.d.ts +1 -33
- package/dist/types/target-state-status.d.ts.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -5,13 +5,14 @@
|
|
|
5
5
|
Decodes raw Mode-S/ADS-B messages: downlink format and CRC extraction, CPR
|
|
6
6
|
position, airborne velocity, aircraft identification, altitude (both the
|
|
7
7
|
ADS-B position-message field and legacy Gillham-coded surveillance replies),
|
|
8
|
-
squawk identity,
|
|
9
|
-
|
|
10
|
-
Comm-B registers (selected
|
|
11
|
-
speed). Transport-agnostic -
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
built on top of this package,
|
|
8
|
+
squawk identity, Flight Status alert/ident flags, emergency status,
|
|
9
|
+
ACAS/TCAS Resolution Advisories, target state and status, aircraft
|
|
10
|
+
operational status, and Enhanced Surveillance Comm-B registers (selected
|
|
11
|
+
vertical intention, track and turn, heading and speed). Transport-agnostic -
|
|
12
|
+
it operates on already-framed message bytes and has no opinion about where
|
|
13
|
+
they came from (a live Beast feed, a logged capture, or any other source).
|
|
14
|
+
For a Beast binary parser and live TCP client built on top of this package,
|
|
15
|
+
see [`@squawk/beast`](../beast).
|
|
15
16
|
|
|
16
17
|
Part of the [@squawk](https://www.npmjs.com/org/squawk) aviation library suite. See all packages on npm.
|
|
17
18
|
|
|
@@ -34,7 +35,8 @@ import { decodeModeSMessage } from '@squawk/mode-s';
|
|
|
34
35
|
|
|
35
36
|
const decoded = decodeModeSMessage(rawMessageBytes); // 7 or 14 raw bytes
|
|
36
37
|
if (decoded?.kind === 'extendedSquitterPosition') {
|
|
37
|
-
console.log(decoded.icaoHex, decoded.latCpr, decoded.lonCpr
|
|
38
|
+
console.log(decoded.icaoHex, decoded.latCpr, decoded.lonCpr);
|
|
39
|
+
console.log(decoded.baroAltitudeFt, decoded.geoAltitudeFt); // exactly one is populated, or neither for a type-code-0 no-fix / surface message
|
|
38
40
|
}
|
|
39
41
|
```
|
|
40
42
|
|
|
@@ -69,6 +71,8 @@ package doesn't perform that cross-check itself. DF20/21 (`'commBAltitudeReply'`
|
|
|
69
71
|
carry the same altitude/squawk payload as DF4/5 plus a 56-bit MB field,
|
|
70
72
|
decoded into `commBRegisters` - see
|
|
71
73
|
[Enhanced Surveillance Comm-B registers](#enhanced-surveillance-comm-b-registers).
|
|
74
|
+
DF4/5/20/21 additionally carry `identActive`/`squawkAlert` - see
|
|
75
|
+
[Flight Status (alert/ident)](#flight-status-alertident).
|
|
72
76
|
|
|
73
77
|
### Resolving CPR position
|
|
74
78
|
|
|
@@ -95,7 +99,8 @@ position to resolve the correct hemisphere and longitude quadrant.
|
|
|
95
99
|
|
|
96
100
|
An airborne position message with type code 0 signals that no position fix
|
|
97
101
|
is currently available - `latCpr`/`lonCpr` are undefined in that case even
|
|
98
|
-
though `
|
|
102
|
+
though `baroAltitudeFt` may still be populated (type code 0 shares its
|
|
103
|
+
altitude field layout with the barometric type codes 9-18, never GNSS-height).
|
|
99
104
|
|
|
100
105
|
### ACAS / TCAS Resolution Advisories
|
|
101
106
|
|
|
@@ -207,6 +212,23 @@ if (decoded?.kind === 'commBAltitudeReply') {
|
|
|
207
212
|
`inferCommBRegisters(mb)` is also exported directly for callers working with
|
|
208
213
|
a raw MB field outside of `decodeModeSMessage`'s DF20/21 dispatch.
|
|
209
214
|
|
|
215
|
+
### Flight Status (alert/ident)
|
|
216
|
+
|
|
217
|
+
DF4/5/20/21 carry a 3-bit Flight Status (FS) field with the transponder's
|
|
218
|
+
Alert (recent squawk change) and Ident (SPI) flags:
|
|
219
|
+
|
|
220
|
+
```typescript
|
|
221
|
+
const decoded = decodeModeSMessage(rawMessageBytes);
|
|
222
|
+
if (decoded?.kind === 'surveillanceAltitudeReply') {
|
|
223
|
+
console.log(decoded.identActive, decoded.squawkAlert);
|
|
224
|
+
}
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
Both fields are undefined for the two reserved FS values (6, 7), where
|
|
228
|
+
alert/ident status is not defined - `decodeFlightStatus(fsField)` is also
|
|
229
|
+
exported directly for callers working with a raw FS field outside of
|
|
230
|
+
`decodeModeSMessage`'s dispatch.
|
|
231
|
+
|
|
210
232
|
### Mode A/C
|
|
211
233
|
|
|
212
234
|
Mode A/C predates Mode-S and carries no ICAO address, so it has no natural
|
|
@@ -232,6 +254,7 @@ console.log(reply.squawk, reply.identActive, reply.altitudeFt);
|
|
|
232
254
|
- `decodeAltitudeCode(altitudeCode)`, `decodeAdsbPositionAltitude(field)`, `decodeAdsbGnssAltitude(field)` - altitude decoding.
|
|
233
255
|
- `decodeSurfaceMovement(field)` - ground speed from a surface position message's movement field.
|
|
234
256
|
- `decodeEmergencyState(rawState)` - emergency/priority state from an ADS-B aircraft status message.
|
|
257
|
+
- `decodeFlightStatus(fsField)` - Alert/Ident flags from a DF4/5/20/21 Flight Status field.
|
|
235
258
|
- `decodeAcasResolutionAdvisory(payload)` - ACAS/TCAS Resolution Advisory report from a DF16 MV field or a type-code-28 subtype-2 ME field.
|
|
236
259
|
- `decodeTargetStateAndStatus(me)` - target state and status from a type-29 ME field.
|
|
237
260
|
- `decodeAircraftOperationalStatus(me)` - operational status from a type-31 ME field.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { FlightStatus } from './types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Decodes the 3-bit Flight Status (FS) field of a DF4/5/20/21 Mode-S
|
|
4
|
+
* surveillance reply.
|
|
5
|
+
*
|
|
6
|
+
* @param fsField - The raw 3-bit field, 0-7.
|
|
7
|
+
* @returns The decoded Alert and Ident status.
|
|
8
|
+
*/
|
|
9
|
+
export declare function decodeFlightStatus(fsField: number): FlightStatus;
|
|
10
|
+
//# sourceMappingURL=flight-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flight-status.d.ts","sourceRoot":"","sources":["../src/flight-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAsBrD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAEhE"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alert and Ident (SPI) status per Flight Status (FS) field value, 0-7, per
|
|
3
|
+
* ICAO Annex 10 Vol. IV / RTCA DO-260 - cross-checked against dump1090-fa's
|
|
4
|
+
* own `mode_s.c` FS decode (the reference decoder this package already
|
|
5
|
+
* treats as ground truth for wire-format behavior; see the package README).
|
|
6
|
+
* FS 6 and 7 are reserved: neither alert nor Ident status is defined for
|
|
7
|
+
* them, so both fields are left undefined rather than guessed at false.
|
|
8
|
+
*/
|
|
9
|
+
const FLIGHT_STATUSES = [
|
|
10
|
+
{ identActive: false, squawkAlert: false }, // 0: no alert, no ident
|
|
11
|
+
{ identActive: false, squawkAlert: false }, // 1: no alert, no ident
|
|
12
|
+
{ identActive: false, squawkAlert: true }, // 2: alert, no ident
|
|
13
|
+
{ identActive: false, squawkAlert: true }, // 3: alert, no ident
|
|
14
|
+
{ identActive: true, squawkAlert: true }, // 4: alert, ident
|
|
15
|
+
{ identActive: true, squawkAlert: false }, // 5: no alert, ident
|
|
16
|
+
];
|
|
17
|
+
/** Returned for the reserved FS values (6, 7), where alert/Ident status is not defined. */
|
|
18
|
+
const RESERVED_FLIGHT_STATUS = { identActive: undefined, squawkAlert: undefined };
|
|
19
|
+
/**
|
|
20
|
+
* Decodes the 3-bit Flight Status (FS) field of a DF4/5/20/21 Mode-S
|
|
21
|
+
* surveillance reply.
|
|
22
|
+
*
|
|
23
|
+
* @param fsField - The raw 3-bit field, 0-7.
|
|
24
|
+
* @returns The decoded Alert and Ident status.
|
|
25
|
+
*/
|
|
26
|
+
export function decodeFlightStatus(fsField) {
|
|
27
|
+
return FLIGHT_STATUSES[fsField] ?? RESERVED_FLIGHT_STATUS;
|
|
28
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ export { decodeAdsbGnssAltitude, decodeAdsbPositionAltitude, decodeAltitudeCode,
|
|
|
11
11
|
export { decodeHeadingAndSpeedReport, decodeSelectedVerticalIntention, decodeTrackAndTurnReport, inferCommBRegisters, } from './comm-b.js';
|
|
12
12
|
export { cprNumLongitudeZones, decodeAirborneCprPair, decodeAirborneCprWithReference, decodeSurfaceCprPair, decodeSurfaceCprWithReference, } from './cpr.js';
|
|
13
13
|
export { decodeEmergencyState } from './emergency-status.js';
|
|
14
|
+
export { decodeFlightStatus } from './flight-status.js';
|
|
14
15
|
export { extractDownlinkFormat, computeCrc24, parseModeSFrame } from './frame.js';
|
|
15
16
|
export { decodeIdentification } from './identification.js';
|
|
16
17
|
export { decodeIdentityCode } from './identity.js';
|
|
@@ -25,6 +26,7 @@ export type { TargetStateAndStatus } from './types/index.js';
|
|
|
25
26
|
export type { CommBRegister, HeadingAndSpeedReport, SelectedVerticalIntention, TrackAndTurnReport, } from './types/index.js';
|
|
26
27
|
export type { AcasResolutionAdvisoryReport, AcasThreat, AcasThreatAltitudeRangeBearing, AcasThreatIcaoAddress, AcasThreatNone, AcasThreatType, ResolutionAdvisoryType, } from './types/index.js';
|
|
27
28
|
export type { EmergencyState } from './types/index.js';
|
|
29
|
+
export type { FlightStatus } from './types/index.js';
|
|
28
30
|
export type { AircraftIdentification } from './types/index.js';
|
|
29
31
|
export type { AirborneVelocity, AirborneVelocityCommon, AirSpeedVelocity, GroundSpeedVelocity, } from './types/index.js';
|
|
30
32
|
export type { CprPosition, CprReference, ModeSMessageEnvelope } from './types/index.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,4BAA4B,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EACL,sBAAsB,EACtB,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,2BAA2B,EAC3B,+BAA+B,EAC/B,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,8BAA8B,EAC9B,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,YAAY,EACV,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,+BAA+B,EAC/B,sBAAsB,EACtB,+BAA+B,EAC/B,8BAA8B,EAC9B,iCAAiC,EACjC,wBAAwB,EACxB,oCAAoC,EACpC,wBAAwB,EACxB,2BAA2B,EAC3B,aAAa,EACb,4BAA4B,EAC5B,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAClE,YAAY,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,YAAY,EACV,aAAa,EACb,qBAAqB,EACrB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,4BAA4B,EAC5B,UAAU,EACV,8BAA8B,EAC9B,qBAAqB,EACrB,cAAc,EACd,cAAc,EACd,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,YAAY,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC/D,YAAY,EACV,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxF,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,4BAA4B,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EACL,sBAAsB,EACtB,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,2BAA2B,EAC3B,+BAA+B,EAC/B,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,8BAA8B,EAC9B,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,YAAY,EACV,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,+BAA+B,EAC/B,sBAAsB,EACtB,+BAA+B,EAC/B,8BAA8B,EAC9B,iCAAiC,EACjC,wBAAwB,EACxB,oCAAoC,EACpC,wBAAwB,EACxB,2BAA2B,EAC3B,aAAa,EACb,4BAA4B,EAC5B,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAClE,YAAY,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,YAAY,EACV,aAAa,EACb,qBAAqB,EACrB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,4BAA4B,EAC5B,UAAU,EACV,8BAA8B,EAC9B,qBAAqB,EACrB,cAAc,EACd,cAAc,EACd,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,YAAY,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC/D,YAAY,EACV,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxF,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -11,6 +11,7 @@ export { decodeAdsbGnssAltitude, decodeAdsbPositionAltitude, decodeAltitudeCode,
|
|
|
11
11
|
export { decodeHeadingAndSpeedReport, decodeSelectedVerticalIntention, decodeTrackAndTurnReport, inferCommBRegisters, } from './comm-b.js';
|
|
12
12
|
export { cprNumLongitudeZones, decodeAirborneCprPair, decodeAirborneCprWithReference, decodeSurfaceCprPair, decodeSurfaceCprWithReference, } from './cpr.js';
|
|
13
13
|
export { decodeEmergencyState } from './emergency-status.js';
|
|
14
|
+
export { decodeFlightStatus } from './flight-status.js';
|
|
14
15
|
export { extractDownlinkFormat, computeCrc24, parseModeSFrame } from './frame.js';
|
|
15
16
|
export { decodeIdentification } from './identification.js';
|
|
16
17
|
export { decodeIdentityCode } from './identity.js';
|
package/dist/message.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../src/message.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../src/message.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACV,mBAAmB,EAGpB,MAAM,kBAAkB,CAAC;AAuN1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,mBAAmB,GAAG,SAAS,CAiGrF"}
|
package/dist/message.js
CHANGED
|
@@ -3,6 +3,7 @@ import { decodeAdsbGnssAltitude, decodeAdsbPositionAltitude, decodeAltitudeCode,
|
|
|
3
3
|
import { extractBits, formatHexAddress } from './bits.js';
|
|
4
4
|
import { inferCommBRegisters } from './comm-b.js';
|
|
5
5
|
import { decodeEmergencyState } from './emergency-status.js';
|
|
6
|
+
import { decodeFlightStatus } from './flight-status.js';
|
|
6
7
|
import { parseModeSFrame } from './frame.js';
|
|
7
8
|
import { decodeIdentification } from './identification.js';
|
|
8
9
|
import { decodeIdentityCode } from './identity.js';
|
|
@@ -84,7 +85,8 @@ function decodePositionMessage(me, icaoHex, messageSource, hasPosition, category
|
|
|
84
85
|
const cprFormat = extractBits(me, 21, 1) === 1 ? 'odd' : 'even';
|
|
85
86
|
const latCpr = hasPosition ? extractBits(me, 22, 17) : undefined;
|
|
86
87
|
const lonCpr = hasPosition ? extractBits(me, 39, 17) : undefined;
|
|
87
|
-
let
|
|
88
|
+
let baroAltitudeFt;
|
|
89
|
+
let geoAltitudeFt;
|
|
88
90
|
let groundSpeedKt;
|
|
89
91
|
let trueTrackDeg;
|
|
90
92
|
if (isSurface) {
|
|
@@ -99,10 +101,12 @@ function decodePositionMessage(me, icaoHex, messageSource, hasPosition, category
|
|
|
99
101
|
}
|
|
100
102
|
else {
|
|
101
103
|
const altitudeField = extractBits(me, 8, 12);
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
104
|
+
if (category === 'airborneBaroPosition') {
|
|
105
|
+
baroAltitudeFt = decodeAdsbPositionAltitude(altitudeField);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
geoAltitudeFt = decodeAdsbGnssAltitude(altitudeField);
|
|
109
|
+
}
|
|
106
110
|
}
|
|
107
111
|
return {
|
|
108
112
|
kind: 'extendedSquitterPosition',
|
|
@@ -112,7 +116,8 @@ function decodePositionMessage(me, icaoHex, messageSource, hasPosition, category
|
|
|
112
116
|
cprFormat,
|
|
113
117
|
latCpr,
|
|
114
118
|
lonCpr,
|
|
115
|
-
|
|
119
|
+
baroAltitudeFt,
|
|
120
|
+
geoAltitudeFt,
|
|
116
121
|
groundSpeedKt,
|
|
117
122
|
trueTrackDeg,
|
|
118
123
|
};
|
|
@@ -257,35 +262,47 @@ export function decodeModeSMessage(bytes) {
|
|
|
257
262
|
}
|
|
258
263
|
if (envelope.downlinkFormat === 4) {
|
|
259
264
|
const acField = extractBits(bytes, 19, 13);
|
|
265
|
+
const flightStatus = decodeFlightStatus(extractBits(bytes, 5, 3));
|
|
260
266
|
return {
|
|
261
267
|
kind: 'surveillanceAltitudeReply',
|
|
262
268
|
candidateIcaoHex: formatHexAddress(envelope.crcRemainder),
|
|
263
269
|
altitudeFt: decodeAltitudeCode(acField),
|
|
270
|
+
identActive: flightStatus.identActive,
|
|
271
|
+
squawkAlert: flightStatus.squawkAlert,
|
|
264
272
|
};
|
|
265
273
|
}
|
|
266
274
|
if (envelope.downlinkFormat === 20) {
|
|
267
275
|
const acField = extractBits(bytes, 19, 13);
|
|
276
|
+
const flightStatus = decodeFlightStatus(extractBits(bytes, 5, 3));
|
|
268
277
|
return {
|
|
269
278
|
kind: 'commBAltitudeReply',
|
|
270
279
|
candidateIcaoHex: formatHexAddress(envelope.crcRemainder),
|
|
271
280
|
altitudeFt: decodeAltitudeCode(acField),
|
|
281
|
+
identActive: flightStatus.identActive,
|
|
282
|
+
squawkAlert: flightStatus.squawkAlert,
|
|
272
283
|
commBRegisters: inferCommBRegisters(bytes.slice(4, 11)),
|
|
273
284
|
};
|
|
274
285
|
}
|
|
275
286
|
if (envelope.downlinkFormat === 5) {
|
|
276
287
|
const idField = extractBits(bytes, 19, 13);
|
|
288
|
+
const flightStatus = decodeFlightStatus(extractBits(bytes, 5, 3));
|
|
277
289
|
return {
|
|
278
290
|
kind: 'surveillanceIdentityReply',
|
|
279
291
|
candidateIcaoHex: formatHexAddress(envelope.crcRemainder),
|
|
280
292
|
squawk: decodeIdentityCode(idField),
|
|
293
|
+
identActive: flightStatus.identActive,
|
|
294
|
+
squawkAlert: flightStatus.squawkAlert,
|
|
281
295
|
};
|
|
282
296
|
}
|
|
283
297
|
if (envelope.downlinkFormat === 21) {
|
|
284
298
|
const idField = extractBits(bytes, 19, 13);
|
|
299
|
+
const flightStatus = decodeFlightStatus(extractBits(bytes, 5, 3));
|
|
285
300
|
return {
|
|
286
301
|
kind: 'commBIdentityReply',
|
|
287
302
|
candidateIcaoHex: formatHexAddress(envelope.crcRemainder),
|
|
288
303
|
squawk: decodeIdentityCode(idField),
|
|
304
|
+
identActive: flightStatus.identActive,
|
|
305
|
+
squawkAlert: flightStatus.squawkAlert,
|
|
289
306
|
commBRegisters: inferCommBRegisters(bytes.slice(4, 11)),
|
|
290
307
|
};
|
|
291
308
|
}
|
package/dist/types/acas.d.ts
CHANGED
|
@@ -1,82 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* The named Resolution Advisory type for a single-threat encounter, derived
|
|
3
|
-
* from the corrective/sense/rate/crossing/reversal flags per RTCA DO-185B
|
|
4
|
-
* Table 2-16 (reproduced as Table 3 in the FAA's "Introduction to TCAS II
|
|
5
|
-
* v7.1"). "Maintain Climb"/"Maintain Descend" and "Crossing Maintain
|
|
6
|
-
* Climb"/"Crossing Maintain Descend" are not distinct wire values - they
|
|
7
|
-
* are the same broadcast RA as `climb`/`descend` (or their crossing
|
|
8
|
-
* variants), annunciated differently by the receiving aircraft's own TCAS
|
|
9
|
-
* unit depending on whether it was already climbing/descending faster than
|
|
10
|
-
* the initially-commanded rate.
|
|
11
|
-
*/
|
|
12
|
-
export type ResolutionAdvisoryType = 'climb' | 'descend' | 'crossingClimb' | 'crossingDescend' | 'increaseClimb' | 'increaseDescent' | 'reduceClimb' | 'reduceDescent' | 'doNotClimb' | 'doNotDescend' | 'reversalToClimb' | 'reversalToDescend';
|
|
13
|
-
/** No threat-identity data (Threat Type Indicator 0). */
|
|
14
|
-
export interface AcasThreatNone {
|
|
15
|
-
/** Discriminant tag - no threat-identity data follows. */
|
|
16
|
-
threatType: 'none';
|
|
17
|
-
}
|
|
18
|
-
/** The threat identified by its 24-bit ICAO address (Threat Type Indicator 1). */
|
|
19
|
-
export interface AcasThreatIcaoAddress {
|
|
20
|
-
/** Discriminant tag - the threat is identified by ICAO address. */
|
|
21
|
-
threatType: 'icaoAddress';
|
|
22
|
-
/** The threat aircraft's 24-bit ICAO hex address. */
|
|
23
|
-
threatIcaoHex: string;
|
|
24
|
-
}
|
|
25
|
-
/** The threat identified by relative altitude, range, and bearing (Threat Type Indicator 2). */
|
|
26
|
-
export interface AcasThreatAltitudeRangeBearing {
|
|
27
|
-
/** Discriminant tag - the threat is identified by altitude/range/bearing. */
|
|
28
|
-
threatType: 'altitudeRangeBearing';
|
|
29
|
-
/** The threat's altitude in feet, or undefined if the field is unavailable. */
|
|
30
|
-
threatAltitudeFt: number | undefined;
|
|
31
|
-
/** The threat's range in nautical miles, or undefined if the field is unavailable. */
|
|
32
|
-
threatRangeNm: number | undefined;
|
|
33
|
-
/** The threat's bearing in degrees relative to own aircraft, or undefined if the field is unavailable. */
|
|
34
|
-
threatBearingDeg: number | undefined;
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* The identity of the threat an ACAS Resolution Advisory report responds
|
|
38
|
-
* to, discriminated by `threatType` (the 2-bit Threat Type Indicator, TTI).
|
|
39
|
-
*/
|
|
40
|
-
export type AcasThreat = AcasThreatNone | AcasThreatIcaoAddress | AcasThreatAltitudeRangeBearing;
|
|
41
|
-
/** Which kind of threat-identity data an ACAS Resolution Advisory report carries - the `threatType` discriminant of {@link AcasThreat}. */
|
|
42
|
-
export type AcasThreatType = AcasThreat['threatType'];
|
|
43
|
-
/**
|
|
44
|
-
* A decoded ACAS/TCAS Resolution Advisory report - BDS 3,0 content, carried
|
|
45
|
-
* either in a DF16 long air-air surveillance reply's MV field, or in a
|
|
46
|
-
* DF17/18 type-code-28 subtype-2 ME field (the ADS-B RA broadcast, which
|
|
47
|
-
* carries the identical content so aircraft without interrogation
|
|
48
|
-
* capability can still see an active RA).
|
|
49
|
-
*/
|
|
50
|
-
export interface AcasResolutionAdvisoryReport {
|
|
51
|
-
/** Whether a Resolution Advisory is currently active. False (with every other field still populated) means no advisory is presently in effect. */
|
|
52
|
-
active: boolean;
|
|
53
|
-
/** The named RA type for a single-threat encounter, derived from `corrective`/`downwardSense`/`increasedRate`/`senseReversal`/`altitudeCrossing`. Undefined when `active` is false, or when the flag combination has no defined single-threat RA type (e.g. some multi-threat composites - see `doNotPassBelow`/`doNotPassAbove`/`doNotTurnLeft`/`doNotTurnRight`). */
|
|
54
|
-
advisoryType: ResolutionAdvisoryType | undefined;
|
|
55
|
-
/** True if own aircraft must change its current vertical speed to comply; false if the RA is preventive (own aircraft is already in conformance and must only avoid certain rates). */
|
|
56
|
-
corrective: boolean;
|
|
57
|
-
/** True when the RA's sense is downward (descend-family); false when upward (climb-family). */
|
|
58
|
-
downwardSense: boolean;
|
|
59
|
-
/** True once own aircraft has been told to accelerate its climb/descent beyond the initial RA's target rate. */
|
|
60
|
-
increasedRate: boolean;
|
|
61
|
-
/** True when this RA reverses the sense of a previously issued RA for the same encounter. */
|
|
62
|
-
senseReversal: boolean;
|
|
63
|
-
/** True when this RA requires own aircraft to cross through the threat's altitude. */
|
|
64
|
-
altitudeCrossing: boolean;
|
|
65
|
-
/** True for a positive RA (a specific target climb/descend rate); false for a negative/Vertical-Speed-Limit RA (a rate to avoid). */
|
|
66
|
-
positive: boolean;
|
|
67
|
-
/** Resolution Advisory Complement: restricts own aircraft from descending below its current altitude. Primarily meaningful in multi-threat encounters. */
|
|
68
|
-
doNotPassBelow: boolean;
|
|
69
|
-
/** Resolution Advisory Complement: restricts own aircraft from climbing above its current altitude. Primarily meaningful in multi-threat encounters. */
|
|
70
|
-
doNotPassAbove: boolean;
|
|
71
|
-
/** Resolution Advisory Complement: reserved for a horizontal-maneuver capability TCAS II does not implement (TCAS II issues vertical RAs only) - expected to always be false in practice, decoded for completeness. */
|
|
72
|
-
doNotTurnLeft: boolean;
|
|
73
|
-
/** Resolution Advisory Complement: reserved for a horizontal-maneuver capability TCAS II does not implement (TCAS II issues vertical RAs only) - expected to always be false in practice, decoded for completeness. */
|
|
74
|
-
doNotTurnRight: boolean;
|
|
75
|
-
/** True for up to 18 seconds after an RA ends, indicating it is no longer displayed to the pilot. */
|
|
76
|
-
terminated: boolean;
|
|
77
|
-
/** True when this report resolves more than one simultaneous threat. */
|
|
78
|
-
multipleThreat: boolean;
|
|
79
|
-
/** The threat this report responds to - narrow on `threat.threatType` to access the identity fields for that kind. */
|
|
80
|
-
threat: AcasThreat;
|
|
81
|
-
}
|
|
1
|
+
export type { AcasResolutionAdvisoryReport, AcasThreat, AcasThreatAltitudeRangeBearing, AcasThreatIcaoAddress, AcasThreatNone, AcasThreatType, ResolutionAdvisoryType, } from '@squawk/types';
|
|
82
2
|
//# sourceMappingURL=acas.d.ts.map
|
package/dist/types/acas.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acas.d.ts","sourceRoot":"","sources":["../../src/types/acas.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"acas.d.ts","sourceRoot":"","sources":["../../src/types/acas.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,4BAA4B,EAC5B,UAAU,EACV,8BAA8B,EAC9B,qBAAqB,EACrB,cAAc,EACd,cAAc,EACd,sBAAsB,GACvB,MAAM,eAAe,CAAC"}
|
|
@@ -1,6 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* Emergency/priority state carried by an ADS-B aircraft status message
|
|
3
|
-
* (BDS 6,1 subtype 1, type code 28), per the 3-bit emergency state field.
|
|
4
|
-
*/
|
|
5
|
-
export type EmergencyState = 'none' | 'general' | 'lifeguardMedical' | 'minimumFuel' | 'noCommunications' | 'unlawfulInterference' | 'downed' | 'reserved';
|
|
1
|
+
export type { EmergencyState } from '@squawk/types';
|
|
6
2
|
//# sourceMappingURL=emergency-status.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emergency-status.d.ts","sourceRoot":"","sources":["../../src/types/emergency-status.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"emergency-status.d.ts","sourceRoot":"","sources":["../../src/types/emergency-status.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decoded 3-bit Flight Status (FS) subfield of a DF4/5/20/21 Mode-S
|
|
3
|
+
* surveillance reply - the Alert (recent squawk change) and Ident (SPI)
|
|
4
|
+
* flags. Ground/airborne status is also nominally packed into this field
|
|
5
|
+
* but is not decoded here - see {@link decodeFlightStatus}.
|
|
6
|
+
*/
|
|
7
|
+
export interface FlightStatus {
|
|
8
|
+
/** True when the transponder's Ident (SPI) pulse is active. Undefined for a reserved FS value (6 or 7), where Ident status is not defined. */
|
|
9
|
+
identActive: boolean | undefined;
|
|
10
|
+
/** True when the transponder is flagging a recent squawk code change. Undefined for a reserved FS value (6 or 7), where alert status is not defined. */
|
|
11
|
+
squawkAlert: boolean | undefined;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=flight-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flight-status.d.ts","sourceRoot":"","sources":["../../src/types/flight-status.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,8IAA8I;IAC9I,WAAW,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,wJAAwJ;IACxJ,WAAW,EAAE,OAAO,GAAG,SAAS,CAAC;CAClC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC"}
|
package/dist/types/index.js
CHANGED
package/dist/types/message.d.ts
CHANGED
|
@@ -47,8 +47,10 @@ export interface ExtendedSquitterPosition extends ExtendedSquitterCommon {
|
|
|
47
47
|
latCpr: number | undefined;
|
|
48
48
|
/** Raw 17-bit CPR-encoded longitude field, or undefined for a type-code-0 airborne position message (no position information available - altitude may still be valid). */
|
|
49
49
|
lonCpr: number | undefined;
|
|
50
|
-
/**
|
|
51
|
-
|
|
50
|
+
/** Barometric altitude in feet, decoded from a type-code 9-18 (or type-code-0, no-fix) airborne position message. Always undefined for a surface position and for a type-code 20-22 GNSS-height position message (see `geoAltitudeFt`). */
|
|
51
|
+
baroAltitudeFt: number | undefined;
|
|
52
|
+
/** Geometric (GNSS-height) altitude in feet, decoded from a type-code 20-22 airborne position message. Always undefined for a surface position and for any barometric (type-code 9-18 or 0) position message (see `baroAltitudeFt`). */
|
|
53
|
+
geoAltitudeFt: number | undefined;
|
|
52
54
|
/** Ground speed in knots, decoded from the movement field. Always undefined for an airborne position - airborne messages carry altitude in the same bits instead. */
|
|
53
55
|
groundSpeedKt: number | undefined;
|
|
54
56
|
/** Track over ground in degrees true. Always undefined for an airborne position, and for a surface position whose track status bit is unset (no valid track available). */
|
|
@@ -143,6 +145,10 @@ export interface SurveillanceAltitudeReply {
|
|
|
143
145
|
candidateIcaoHex: string;
|
|
144
146
|
/** Decoded altitude in feet, or undefined if the AC field is empty or invalid. */
|
|
145
147
|
altitudeFt: number | undefined;
|
|
148
|
+
/** True when the transponder's Ident (SPI) pulse is active, from the Flight Status field. Undefined for a reserved Flight Status value. */
|
|
149
|
+
identActive: boolean | undefined;
|
|
150
|
+
/** True when the transponder is flagging a recent squawk code change, from the Flight Status field. Undefined for a reserved Flight Status value. */
|
|
151
|
+
squawkAlert: boolean | undefined;
|
|
146
152
|
}
|
|
147
153
|
/**
|
|
148
154
|
* A DF20 Comm-B altitude reply - the same altitude payload as
|
|
@@ -160,6 +166,10 @@ export interface CommBAltitudeReply {
|
|
|
160
166
|
candidateIcaoHex: string;
|
|
161
167
|
/** Decoded altitude in feet, or undefined if the AC field is empty or invalid. */
|
|
162
168
|
altitudeFt: number | undefined;
|
|
169
|
+
/** True when the transponder's Ident (SPI) pulse is active, from the Flight Status field. Undefined for a reserved Flight Status value. */
|
|
170
|
+
identActive: boolean | undefined;
|
|
171
|
+
/** True when the transponder is flagging a recent squawk code change, from the Flight Status field. Undefined for a reserved Flight Status value. */
|
|
172
|
+
squawkAlert: boolean | undefined;
|
|
163
173
|
/** Every Enhanced Surveillance Comm-B register the MB field plausibly holds - see {@link inferCommBRegisters}. Empty if none matched. */
|
|
164
174
|
commBRegisters: CommBRegister[];
|
|
165
175
|
}
|
|
@@ -177,6 +187,10 @@ export interface SurveillanceIdentityReply {
|
|
|
177
187
|
candidateIcaoHex: string;
|
|
178
188
|
/** The decoded 4-digit octal squawk code. */
|
|
179
189
|
squawk: string;
|
|
190
|
+
/** True when the transponder's Ident (SPI) pulse is active, from the Flight Status field. Undefined for a reserved Flight Status value. */
|
|
191
|
+
identActive: boolean | undefined;
|
|
192
|
+
/** True when the transponder is flagging a recent squawk code change, from the Flight Status field. Undefined for a reserved Flight Status value. */
|
|
193
|
+
squawkAlert: boolean | undefined;
|
|
180
194
|
}
|
|
181
195
|
/**
|
|
182
196
|
* A DF21 Comm-B identity reply - the same squawk payload as
|
|
@@ -194,6 +208,10 @@ export interface CommBIdentityReply {
|
|
|
194
208
|
candidateIcaoHex: string;
|
|
195
209
|
/** The decoded 4-digit octal squawk code. */
|
|
196
210
|
squawk: string;
|
|
211
|
+
/** True when the transponder's Ident (SPI) pulse is active, from the Flight Status field. Undefined for a reserved Flight Status value. */
|
|
212
|
+
identActive: boolean | undefined;
|
|
213
|
+
/** True when the transponder is flagging a recent squawk code change, from the Flight Status field. Undefined for a reserved Flight Status value. */
|
|
214
|
+
squawkAlert: boolean | undefined;
|
|
197
215
|
/** Every Enhanced Surveillance Comm-B register the MB field plausibly holds - see {@link inferCommBRegisters}. Empty if none matched. */
|
|
198
216
|
commBRegisters: CommBRegister[];
|
|
199
217
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/types/message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,aAAa,GACvB,YAAY,GAAG,iBAAiB,GAAG,UAAU,GAAG,eAAe,GAAG,MAAM,CAAC;AAE3E,wEAAwE;AACxE,MAAM,WAAW,sBAAsB;IACrC;;;;;OAKG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,4FAA4F;IAC5F,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,wEAAwE;AACxE,MAAM,WAAW,wBAAyB,SAAQ,sBAAsB;IACtE,2FAA2F;IAC3F,IAAI,EAAE,0BAA0B,CAAC;IACjC,0EAA0E;IAC1E,OAAO,EAAE,OAAO,CAAC;IACjB,yDAAyD;IACzD,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC;IAC1B,yKAAyK;IACzK,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,0KAA0K;IAC1K,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,
|
|
1
|
+
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/types/message.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,34 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* Decoded ADS-B Target State and Status (BDS 6,2, type code 29) - the
|
|
3
|
-
* pilot's selected altitude/heading targets, altimeter setting, and
|
|
4
|
-
* active autopilot/nav modes, per RTCA DO-260B section 2.2.3.2.7.1.
|
|
5
|
-
*/
|
|
6
|
-
export interface TargetStateAndStatus {
|
|
7
|
-
/** Source of the selected altitude target - undefined when `selectedAltitudeFt` is unavailable. */
|
|
8
|
-
selectedAltitudeSource: 'mcpFcu' | 'fms' | undefined;
|
|
9
|
-
/** MCP/FCU or FMS selected altitude target, in feet. Undefined if not available. */
|
|
10
|
-
selectedAltitudeFt: number | undefined;
|
|
11
|
-
/** Barometric pressure (altimeter) setting, in millibars/hectopascals. Undefined if not available. */
|
|
12
|
-
baroPressureSettingMb: number | undefined;
|
|
13
|
-
/** Selected heading/track angle, in degrees. Undefined if not available. */
|
|
14
|
-
selectedHeadingDeg: number | undefined;
|
|
15
|
-
/** Navigation Accuracy Category for Position, 0-15 (higher is more accurate). */
|
|
16
|
-
navAccuracyCategoryPosition: number;
|
|
17
|
-
/** Whether the reported altitude source meets the Navigation Integrity Category barometric requirement. */
|
|
18
|
-
nicBaro: boolean;
|
|
19
|
-
/** Source Integrity Level, 0-3 (higher is more reliable). */
|
|
20
|
-
sourceIntegrityLevel: number;
|
|
21
|
-
/** Whether the autopilot is engaged. Undefined when mode status is not reported. */
|
|
22
|
-
autopilotEngaged: boolean | undefined;
|
|
23
|
-
/** Whether VNAV mode is active. Undefined when mode status is not reported. */
|
|
24
|
-
vnavModeActive: boolean | undefined;
|
|
25
|
-
/** Whether altitude-hold mode is active. Undefined when mode status is not reported. */
|
|
26
|
-
altitudeHoldModeActive: boolean | undefined;
|
|
27
|
-
/** Whether approach mode is active. Undefined when mode status is not reported. */
|
|
28
|
-
approachModeActive: boolean | undefined;
|
|
29
|
-
/** Whether LNAV mode is active. Undefined when mode status is not reported. */
|
|
30
|
-
lnavModeActive: boolean | undefined;
|
|
31
|
-
/** Whether ACAS/TCAS is operational (not inhibited or failed). Always reported, regardless of mode status. */
|
|
32
|
-
tcasOperational: boolean;
|
|
33
|
-
}
|
|
1
|
+
export type { TargetStateAndStatus } from '@squawk/types';
|
|
34
2
|
//# sourceMappingURL=target-state-status.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"target-state-status.d.ts","sourceRoot":"","sources":["../../src/types/target-state-status.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"target-state-status.d.ts","sourceRoot":"","sources":["../../src/types/target-state-status.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@squawk/mode-s",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Decode raw Mode-S/ADS-B messages: DF/CRC parsing, CPR position, velocity, identification, and altitude",
|
|
6
6
|
"author": "Neil Cochran",
|
|
@@ -41,10 +41,10 @@
|
|
|
41
41
|
"api:report": "api-extractor run --local --verbose"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@squawk/types": "^0.
|
|
44
|
+
"@squawk/types": "^0.9.0"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
|
-
"@types/node": "^
|
|
47
|
+
"@types/node": "^26.4.0"
|
|
48
48
|
},
|
|
49
49
|
"keywords": [
|
|
50
50
|
"aviation",
|