Skip to content

Commit a9b4c6e

Browse files
committed
Improve surface status decoding
1 parent 07ff26d commit a9b4c6e

File tree

4 files changed

+74
-9
lines changed

4 files changed

+74
-9
lines changed

src/main/java/aero/t2s/modes/Track.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ public class Track {
6767
private String wtc = "";
6868
private String registration;
6969
private String operator;
70+
private Angle horizontalSource = Angle.UNAVAILABLE;
7071

7172
public Track(String icao) {
7273
this.icao = icao;
@@ -548,4 +549,12 @@ public String toString() {
548549
lon
549550
);
550551
}
552+
553+
public void setHorizontalSource(Angle horizontalSource) {
554+
this.horizontalSource = horizontalSource;
555+
}
556+
557+
public Angle getHorizontalSource() {
558+
return horizontalSource;
559+
}
551560
}

src/main/java/aero/t2s/modes/decoder/df/df17/AircraftOperationalStatusVersion2Surface.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,23 +21,27 @@ public AircraftOperationalStatusVersion2Surface(short[] data) {
2121

2222
@Override
2323
public AircraftOperationalStatusVersion2Surface decode() {
24-
verison = Version.VERSION2;
25-
surfaceCapability = new SurfaceCapability((data[5] << 4) | (data[6] & 0b11110000) >>> 4, verison);
24+
version = Version.VERSION2;
25+
surfaceCapability = new SurfaceCapability((data[5] << 4) | (data[6] & 0b11110000) >>> 4, version);
2626
lengthWidthCode = LengthWidthCode.from(data[6] & 0b00001111);
2727
operationalMode = new SurfaceOperationalMode((data[7] << 8) | data[8]);
2828

29-
SIL = SourceIntegrityLevel.from((data[10] & 0b000110000) >>> 4);
30-
SILsupp = SourceIntegrityLevelSupplement.from((data[10] & 0b00000010) >>> 1);
31-
3229
int NICsuppA = (data[9] & 0b00010000) >>> 4;
3330
int NACp = (data[9] & 0b00001111);
34-
NICp = NavigationIntegrityCategory.surface(NACp, NICsuppA);
31+
int GVA = (data[10] & 0b11000000) >>> 6;
32+
int SIL = (data[10] & 0b00110000) >>> 4;
33+
34+
int SILsupp = (data[10] & 0b00000010) >>> 1;
35+
36+
this.SIL = SourceIntegrityLevel.from(SIL);
37+
this.SILsupp = SourceIntegrityLevelSupplement.from(SILsupp);
38+
this.NICp = NavigationIntegrityCategory.surface(NACp, NICsuppA);
3539

3640
if ((data[10] & 0b00001000) != 0) {
3741
if ((data[10] & 0b00000100) != 0) {
38-
horizontalSource = Angle.TRUE_TRACK;
39-
} else {
4042
horizontalSource = Angle.MAGNETIC_TRACK;
43+
} else {
44+
horizontalSource = Angle.TRUE_TRACK;
4145
}
4246
} else {
4347
if ((data[10] & 0b00000100) != 0) {
@@ -53,6 +57,7 @@ public AircraftOperationalStatusVersion2Surface decode() {
5357
@Override
5458
public void apply(Track track) {
5559
track.setVersion(Version.VERSION2);
60+
track.setHorizontalSource(horizontalSource);
5661
}
5762

5863
public SurfaceCapability getSurfaceCapability() {

src/main/java/aero/t2s/modes/decoder/df/df17/SurfacePosition.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import aero.t2s.modes.CprPosition;
44
import aero.t2s.modes.Track;
5+
import aero.t2s.modes.constants.Angle;
56

67
public class SurfacePosition extends ExtendedSquitter {
78
private final String address;
@@ -69,7 +70,14 @@ public void apply(Track track) {
6970
}
7071

7172
if (trackAvailable) {
72-
track.setTrueHeading(this.track);
73+
if (track.getHorizontalSource() == Angle.TRUE_TRACK) {
74+
track.setTrueHeading(this.track);
75+
} else if (track.getHorizontalSource() == Angle.MAGNETIC_HEADING) {
76+
track.setMagneticHeading(this.track);
77+
} else {
78+
track.setTrueHeading(this.track);
79+
track.setMagneticHeading(this.track);
80+
}
7381
}
7482
}
7583

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package aero.t2s.modes.decoder.df.df17;
2+
3+
import aero.t2s.modes.BinaryHelper;
4+
import aero.t2s.modes.constants.*;
5+
import aero.t2s.modes.decoder.df.df17.data.SurfaceOperationalMode;
6+
import org.junit.jupiter.api.Assertions;
7+
import org.junit.jupiter.api.Test;
8+
9+
public class AircraftOperationalStatusMessageTest {
10+
@Test
11+
public void it_decodes_surface_version1_message() {
12+
AircraftOperationalStatusMessage message = new AircraftOperationalStatusMessage(BinaryHelper.stringToByteArray("8F40622DF900260283493839FD1F")).decode();
13+
14+
Assertions.assertInstanceOf(AircraftOperationalStatusVersion2.class, message);
15+
Assertions.assertInstanceOf(AircraftOperationalStatusVersion2Surface.class, message);
16+
17+
AircraftOperationalStatusVersion2Surface surface = (AircraftOperationalStatusVersion2Surface) message;
18+
Assertions.assertEquals(Version.VERSION2, surface.getVersion());
19+
Assertions.assertEquals(LengthWidthCode.CAT6, surface.getLengthWidthCode());
20+
21+
Assertions.assertFalse(surface.getSurfaceCapability().isCockpitDisplayOfTraffic());
22+
Assertions.assertFalse(surface.getSurfaceCapability().isUatReceive());
23+
Assertions.assertFalse(surface.getSurfaceCapability().isLowB2Power());
24+
Assertions.assertFalse(surface.getSurfaceCapability().isPositionOffsetApplied());
25+
Assertions.assertFalse(surface.getSurfaceCapability().isReceive1090ES());
26+
Assertions.assertEquals(NavigationUncertaintyCategory.NUC1, surface.getSurfaceCapability().getNACv());
27+
Assertions.assertEquals(0, surface.getSurfaceCapability().getNICsuppC());
28+
29+
Assertions.assertFalse(surface.getOperationalMode().isAcasIdent());
30+
Assertions.assertTrue(surface.getOperationalMode().isGpsLateralOffsetAvailable());
31+
Assertions.assertFalse(surface.getOperationalMode().isSingleAntennaFlag());
32+
Assertions.assertTrue(surface.getOperationalMode().isGpsLongitudinalOffsetAvailable());
33+
Assertions.assertFalse(surface.getOperationalMode().isGpsLongitudinalOffsetAppliedBySensor());
34+
Assertions.assertEquals(AcasState.RA_NOT_ACTIVE, surface.getOperationalMode().getAcasRA());
35+
Assertions.assertEquals(0, surface.getOperationalMode().getGpsLateralOffset());
36+
Assertions.assertEquals(0, surface.getOperationalMode().getGpsLateralOffset());
37+
Assertions.assertEquals(4, surface.getOperationalMode().getGpsLongitudinalOffset());
38+
Assertions.assertEquals(SourceIntegrityLevel.LESS_THEN_ONE_PER_HUNDRED_THOUSAND, surface.getOperationalMode().getSystemDesignAssurance());
39+
40+
Assertions.assertEquals(NavigationIntegrityCategory.RC_75_M, surface.getNICp());
41+
Assertions.assertEquals(Angle.TRUE_TRACK, surface.getHorizontalSource());
42+
}
43+
}

0 commit comments

Comments
 (0)