Change Squawk/ModeA code

The original code stores the squawk as a decimal (base 10) value. Change
this to a hex value to reduce the amount of maths required to convert
the input binary value..

Rename all the variables used to store the squawk to "modeA", rather
than variously identity, squawk and modeA.
This commit is contained in:
Malcolm Robb 2013-04-25 23:22:34 +01:00
parent f9c1dc1da5
commit 25f92e54ba

View file

@ -142,6 +142,7 @@ struct aircraft {
int track; /* Angle of flight. */ int track; /* Angle of flight. */
time_t seen; /* Time at which the last packet was received. */ time_t seen; /* Time at which the last packet was received. */
long messages; /* Number of Mode S messages received. */ long messages; /* Number of Mode S messages received. */
int modeA; /* Squawk */
int modeC; /* Altitude */ int modeC; /* Altitude */
long modeAcount; /* Mode A Squawk hit Count */ long modeAcount; /* Mode A Squawk hit Count */
long modeCcount; /* Mode C Altitude hit Count */ long modeCcount; /* Mode C Altitude hit Count */
@ -155,7 +156,6 @@ struct aircraft {
double lat, lon; /* Coordinated obtained from CPR encoded data. */ double lat, lon; /* Coordinated obtained from CPR encoded data. */
int sbsflags; int sbsflags;
uint64_t odd_cprtime, even_cprtime; uint64_t odd_cprtime, even_cprtime;
int squawk;
struct aircraft *next; /* Next aircraft in our linked list. */ struct aircraft *next; /* Next aircraft in our linked list. */
}; };
@ -284,7 +284,7 @@ struct modesMessage {
int fs; /* Flight status for DF4,5,20,21 */ int fs; /* Flight status for DF4,5,20,21 */
int dr; /* Request extraction of downlink request. */ int dr; /* Request extraction of downlink request. */
int um; /* Request extraction of downlink request. */ int um; /* Request extraction of downlink request. */
int identity; /* 13 bits identity (Squawk). */ int modeA; /* 13 bits identity (Squawk). */
// DF32 ModeA & Mode C // DF32 ModeA & Mode C
int modeC; /* Decoded Mode C */ int modeC; /* Decoded Mode C */
@ -1056,11 +1056,8 @@ void decodeModeAMessage(struct modesMessage *mm, int ModeA)
// Use an upper address byte of FF, since this is ICAO unallocated // Use an upper address byte of FF, since this is ICAO unallocated
mm->addr = 0x00FF0000 | (ModeA & 0x0000FF7F); mm->addr = 0x00FF0000 | (ModeA & 0x0000FF7F);
// Set the Identity field to decimal ModeA // Set the Identity field to ModeA
mm->identity = (ModeA & 7) mm->modeA = ModeA & 0x7777;
+ (((ModeA >> 4) & 7) * 10)
+ (((ModeA >> 8) & 7) * 100)
+ (((ModeA >> 12) & 7) * 1000);
// Flag ident in flight status // Flag ident in flight status
mm->fs = ModeA & 0x0080; mm->fs = ModeA & 0x0080;
@ -1494,31 +1491,31 @@ void decodeModesMessage(struct modesMessage *mm, unsigned char *msg) {
* from 0 to 7. * from 0 to 7.
* *
* The actual meaning is just 4 octal numbers, but we convert it * The actual meaning is just 4 octal numbers, but we convert it
* into a base ten number tha happens to represent the four * into a hex number tha happens to represent the four
* octal numbers. * octal numbers.
* *
* For more info: http://en.wikipedia.org/wiki/Gillham_code */ * For more info: http://en.wikipedia.org/wiki/Gillham_code */
{ {
int decIdentity = 0; int hexSquawk = 0;
unsigned char rawIdentity; unsigned char rawSquawk;
rawIdentity = msg[2]; rawSquawk = msg[2];
if (rawIdentity & 0x01) {decIdentity += 40;} // C4 if (rawSquawk & 0x01) {hexSquawk |= 0x0040;} // C4
if (rawIdentity & 0x02) {decIdentity += 2000;} // A2 if (rawSquawk & 0x02) {hexSquawk |= 0x2000;} // A2
if (rawIdentity & 0x04) {decIdentity += 20;} // C2 if (rawSquawk & 0x04) {hexSquawk |= 0x0020;} // C2
if (rawIdentity & 0x08) {decIdentity += 1000;} // A1 if (rawSquawk & 0x08) {hexSquawk |= 0x1000;} // A1
if (rawIdentity & 0x10) {decIdentity += 10;} // C1 if (rawSquawk & 0x10) {hexSquawk |= 0x0010;} // C1
rawIdentity = msg[3]; rawSquawk = msg[3];
if (rawIdentity & 0x01) {decIdentity += 4;} // D4 if (rawSquawk & 0x01) {hexSquawk |= 0x0004;} // D4
if (rawIdentity & 0x02) {decIdentity += 400;} // B4 if (rawSquawk & 0x02) {hexSquawk |= 0x0400;} // B4
if (rawIdentity & 0x04) {decIdentity += 2;} // D2 if (rawSquawk & 0x04) {hexSquawk |= 0x0002;} // D2
if (rawIdentity & 0x08) {decIdentity += 200;} // B2 if (rawSquawk & 0x08) {hexSquawk |= 0x0200;} // B2
if (rawIdentity & 0x10) {decIdentity += 1;} // D1 if (rawSquawk & 0x10) {hexSquawk |= 0x0001;} // D1
if (rawIdentity & 0x20) {decIdentity += 100;} // B1 if (rawSquawk & 0x20) {hexSquawk |= 0x0100;} // B1
if (rawIdentity & 0x80) {decIdentity += 4000;} // A4 if (rawSquawk & 0x80) {hexSquawk |= 0x4000;} // A4
mm->identity = decIdentity; mm->modeA = hexSquawk;
} }
/* DF 11 & 17: try to populate our ICAO addresses whitelist. /* DF 11 & 17: try to populate our ICAO addresses whitelist.
@ -1678,7 +1675,7 @@ void displayModesMessage(struct modesMessage *mm) {
printf(" Flight Status : %s\n", fs_str[mm->fs]); printf(" Flight Status : %s\n", fs_str[mm->fs]);
printf(" DR : %d\n", mm->dr); printf(" DR : %d\n", mm->dr);
printf(" UM : %d\n", mm->um); printf(" UM : %d\n", mm->um);
printf(" Squawk : %d\n", mm->identity); printf(" Squawk : %x\n", mm->modeA);
printf(" ICAO Address : %06x\n", mm->addr); printf(" ICAO Address : %06x\n", mm->addr);
if (mm->msgtype == 21) { if (mm->msgtype == 21) {
@ -1688,7 +1685,7 @@ void displayModesMessage(struct modesMessage *mm) {
/* DF 11 */ /* DF 11 */
printf("DF 11: All Call Reply.\n"); printf("DF 11: All Call Reply.\n");
printf(" Capability : %s\n", ca_str[mm->ca]); printf(" Capability : %s\n", ca_str[mm->ca]);
printf(" ICAO Address %06x\n", mm->addr); printf(" ICAO Address: %06x\n", mm->addr);
if (mm->iid > 16) if (mm->iid > 16)
{printf(" IID : SI-%02d\n", mm->iid-16);} {printf(" IID : SI-%02d\n", mm->iid-16);}
else else
@ -1743,11 +1740,11 @@ void displayModesMessage(struct modesMessage *mm) {
// DF 32 is special code we use for Mode A/C // DF 32 is special code we use for Mode A/C
printf("SSR : Mode A/C Reply.\n"); printf("SSR : Mode A/C Reply.\n");
if (mm->fs & 0x0080) { if (mm->fs & 0x0080) {
printf(" Mode A : %04d IDENT\n", mm->identity); printf(" Mode A : %04x IDENT\n", mm->modeA);
} else { } else {
printf(" Mode A : %04d\n", mm->identity); printf(" Mode A : %04x\n", mm->modeA);
if (mm->altitude >= -1300) if (mm->altitude >= -1300)
{printf(" Mode C : %d feet\n",mm->altitude);} {printf(" Mode C : %d feet\n", mm->altitude);}
} }
} else { } else {
@ -2160,7 +2157,6 @@ struct aircraft *interactiveCreateAircraft(struct modesMessage *mm) {
a->addr = mm->addr; a->addr = mm->addr;
a->flight[0] = '\0'; a->flight[0] = '\0';
a->altitude = 0;
a->speed = 0; a->speed = 0;
a->track = 0; a->track = 0;
a->odd_cprlat = 0; a->odd_cprlat = 0;
@ -2174,11 +2170,12 @@ struct aircraft *interactiveCreateAircraft(struct modesMessage *mm) {
a->sbsflags = 0; a->sbsflags = 0;
a->seen = time(NULL); a->seen = time(NULL);
a->messages = 0; a->messages = 0;
a->squawk = 0; a->modeACflags = 0;
a->modeACflags = 0; a->modeA = 0;
a->modeC = 0;
a->altitude = 0;
a->modeAcount = 0; a->modeAcount = 0;
a->modeCcount = 0; a->modeCcount = 0;
a->modeC = 0;
a->next = NULL; a->next = NULL;
return (a); return (a);
} }
@ -2225,16 +2222,15 @@ void interactiveUpdateAircraftModeA(struct aircraft *a) {
if ((b->modeACflags & MODEAC_MSG_FLAG) == 0) {// skip any fudged ICAO records if ((b->modeACflags & MODEAC_MSG_FLAG) == 0) {// skip any fudged ICAO records
// First check for Mode-A <=> Mode-S Squawk matches // First check for Mode-A <=> Mode-S Squawk matches
if (a->squawk == b->squawk) { // If a 'real' Mode-S ICAO exists using this Mode-A Squawk if (a->modeA == b->modeA) { // If a 'real' Mode-S ICAO exists using this Mode-A Squawk
b->modeAcount++; b->modeAcount++;
if ( (b->modeAcount > 0) && if ( (b->modeAcount > 0) &&
((b->modeCcount > 1) || (a->modeC < -12)) ) ((b->modeCcount > 1) || (a->modeC < -12)) )
{a->modeACflags |= MODEAC_MSG_MODES_HIT;} // flag this ModeA/C probably belongs to a known Mode S {a->modeACflags |= MODEAC_MSG_MODES_HIT;} // flag this ModeA/C probably belongs to a known Mode S
} }
// Next check for Mode-C <=> Mode-S Altitude matches // Next check for Mode-C <=> Mode-S Altitude matches
if (a->modeC == b->modeC) // If a 'real' Mode S ICAO exists at this Mode-C Altitude if (a->modeC == b->modeC) { // If a 'real' Mode S ICAO exists at this Mode-C Altitude
{
b->modeCcount++; b->modeCcount++;
if ((b->modeAcount > 0) && (b->modeCcount > 1)) if ((b->modeAcount > 0) && (b->modeCcount > 1))
{a->modeACflags |= MODEAC_MSG_MODES_HIT;} // flag this ModeA/C probably belongs to a known Mode S {a->modeACflags |= MODEAC_MSG_MODES_HIT;} // flag this ModeA/C probably belongs to a known Mode S
@ -2499,10 +2495,10 @@ struct aircraft *interactiveReceiveData(struct modesMessage *mm) {
a->altitude = mm->altitude; a->altitude = mm->altitude;
a->modeC = mm->modeC; a->modeC = mm->modeC;
} else if(mm->msgtype == 5 || mm->msgtype == 21) { } else if(mm->msgtype == 5 || mm->msgtype == 21) {
if (a->squawk != mm->identity) { if (a->modeA != mm->modeA) {
a->modeAcount = 0; // Squawk has changed, so zero the hit count a->modeAcount = 0; // Squawk has changed, so zero the hit count
} }
a->squawk = mm->identity; a->modeA = mm->modeA;
} else if (mm->msgtype == 17) { } else if (mm->msgtype == 17) {
if (mm->metype >= 1 && mm->metype <= 4) { if (mm->metype >= 1 && mm->metype <= 4) {
memcpy(a->flight, mm->flight, sizeof(a->flight)); memcpy(a->flight, mm->flight, sizeof(a->flight));
@ -2539,7 +2535,7 @@ struct aircraft *interactiveReceiveData(struct modesMessage *mm) {
} }
} else if(mm->msgtype == 32) { } else if(mm->msgtype == 32) {
a->modeACflags = MODEAC_MSG_FLAG; a->modeACflags = MODEAC_MSG_FLAG;
a->squawk = mm->identity; a->modeA = mm->modeA;
a->modeC = mm->modeC; a->modeC = mm->modeC;
a->altitude = mm->altitude; a->altitude = mm->altitude;
interactiveUpdateAircraftModeA(a); interactiveUpdateAircraftModeA(a);
@ -2593,8 +2589,8 @@ void interactiveShowData(void) {
altitude = -9999; altitude = -9999;
} }
if (a->squawk > 0 && a->squawk <= 7777) { if (a->modeA) {
sprintf(squawk, "%04d", a->squawk); sprintf(squawk, "%04x", a->modeA);
} }
if (msgs > 99999) { if (msgs > 99999) {
@ -2875,10 +2871,8 @@ void modesSendSBSOutput(struct modesMessage *mm, struct aircraft *a) {
struct tm stTime; struct tm stTime;
if (mm->msgtype == 4 || mm->msgtype == 5 || mm->msgtype == 21) { if (mm->msgtype == 4 || mm->msgtype == 5 || mm->msgtype == 21) {
/* Node: identity is calculated/kept in base10 but is actually if (mm->modeA == 0x7500 || mm->modeA == 0x7600 ||
* octal (07500 is represented as 7500) */ mm->modeA == 0x7700) emergency = -1;
if (mm->identity == 7500 || mm->identity == 7600 ||
mm->identity == 7700) emergency = -1;
if (mm->fs == 1 || mm->fs == 3) ground = -1; if (mm->fs == 1 || mm->fs == 3) ground = -1;
if (mm->fs == 2 || mm->fs == 3 || mm->fs == 4) alert = -1; if (mm->fs == 2 || mm->fs == 3 || mm->fs == 4) alert = -1;
if (mm->fs == 4 || mm->fs == 5) spi = -1; if (mm->fs == 4 || mm->fs == 5) spi = -1;
@ -2916,7 +2910,7 @@ void modesSendSBSOutput(struct modesMessage *mm, struct aircraft *a) {
p += sprintf(p, "MSG,5,%s,,%d,,,,,,,%d,%d,%d,%d", strCommon, mm->altitude, alert, emergency, spi, ground); p += sprintf(p, "MSG,5,%s,,%d,,,,,,,%d,%d,%d,%d", strCommon, mm->altitude, alert, emergency, spi, ground);
} else if (mm->msgtype == 5) { } else if (mm->msgtype == 5) {
p += sprintf(p, "MSG,6,%s,,,,,,,,%d,%d,%d,%d,%d", strCommon, mm->identity, alert, emergency, spi, ground); p += sprintf(p, "MSG,6,%s,,,,,,,,%x,%d,%d,%d,%d", strCommon, mm->modeA, alert, emergency, spi, ground);
} else if (mm->msgtype == 11) { } else if (mm->msgtype == 11) {
p += sprintf(p, "MSG,8,%s,,,,,,,,,,,,", strCommon); p += sprintf(p, "MSG,8,%s,,,,,,,,,,,,", strCommon);
@ -2938,7 +2932,7 @@ void modesSendSBSOutput(struct modesMessage *mm, struct aircraft *a) {
p += sprintf(p, "MSG,4,%s,,,%d,%d,,,%i,,0,0,0,0", strCommon, mm->velocity, mm->heading, vr); p += sprintf(p, "MSG,4,%s,,,%d,%d,,,%i,,0,0,0,0", strCommon, mm->velocity, mm->heading, vr);
} else if (mm->msgtype == 21) { } else if (mm->msgtype == 21) {
p += sprintf(p, "MSG,6,%s,,,,,,,,%d,%d,%d,%d,%d", strCommon, mm->identity, alert, emergency, spi, ground); p += sprintf(p, "MSG,6,%s,,,,,,,,%x,%d,%d,%d,%d", strCommon, mm->modeA, alert, emergency, spi, ground);
} else { } else {
return; return;