Tidy up ModeA/C mm and a structure

If --modeac is specified, then the program will be building an aircraft
list. Calculate the altitude when we create the aircraft structure (a) ,
and then back copy it into the mm structure. This avoids us having to do
a second ModeAtoModeC conversion in the list output display.

Also - bug fix in the ns_vel calculation.
This commit is contained in:
Malcolm Robb 2013-05-09 16:40:04 +01:00
parent fc7d1e27c9
commit f011f07e9f

View file

@ -1548,7 +1548,7 @@ void decodeModesMessage(struct modesMessage *mm, unsigned char *msg) {
int ew_raw = ((msg[5] & 0x03) << 8) | msg[6]; int ew_raw = ((msg[5] & 0x03) << 8) | msg[6];
int ew_vel = ew_raw - 1; int ew_vel = ew_raw - 1;
int ns_raw = ((msg[7] & 0x7F) << 3) | (msg[8] >> 5); int ns_raw = ((msg[7] & 0x7F) << 3) | (msg[8] >> 5);
int ns_vel = ew_raw - 1; int ns_vel = ns_raw - 1;
if (mesub == 2) { // If (supersonic) unit is 4 kts if (mesub == 2) { // If (supersonic) unit is 4 kts
ns_vel = ns_vel << 2; ns_vel = ns_vel << 2;
@ -1785,10 +1785,9 @@ void displayModesMessage(struct modesMessage *mm) {
if (mm->fs & 0x0080) { if (mm->fs & 0x0080) {
printf(" Mode A : %04x IDENT\n", mm->modeA); printf(" Mode A : %04x IDENT\n", mm->modeA);
} else { } else {
int modeC = ModeAToModeC(mm->modeA);
printf(" Mode A : %04x\n", mm->modeA); printf(" Mode A : %04x\n", mm->modeA);
if (modeC >= -13) if (mm->bFlags & MODES_ACFLAGS_ALTITUDE_VALID)
{printf(" Mode C : %d feet\n", (modeC * 100));} {printf(" Mode C : %d feet\n", mm->altitude);}
} }
} else { } else {
@ -2242,22 +2241,26 @@ struct aircraft *interactiveCreateAircraft(struct modesMessage *mm) {
memset(a, 0, sizeof(*a)); memset(a, 0, sizeof(*a));
// Now initialise things that should not be 0/NULL to their defaults // Now initialise things that should not be 0/NULL to their defaults
a->addr = mm->addr;
a->addr = mm->addr; a->lat = a->lon = 0.0;
memset(a->signalLevel, mm->signalLevel, 8); // First time, initialise everything memset(a->signalLevel, mm->signalLevel, 8); // First time, initialise everything
// to the first signal strength // to the first signal strength
a->lat = a->lon = 0.0;
// mm->msgtype 32 is used to represent Mode A/C. These values can never change, so // mm->msgtype 32 is used to represent Mode A/C. These values can never change, so
// set them once here during initialisation, and don't bother to set them every // set them once here during initialisation, and don't bother to set them every
// time this ModeA/C is received again in the future // time this ModeA/C is received again in the future
if (mm->msgtype == 32) { if (mm->msgtype == 32) {
int modeC = ModeAToModeC(mm->modeA | mm->fs);
a->modeACflags = MODEAC_MSG_FLAG; a->modeACflags = MODEAC_MSG_FLAG;
a->modeA = mm->modeA; a->modeA = mm->modeA;
a->modeC = ModeAToModeC(mm->modeA | mm->fs); a->bFlags = mm->bFlags;
a->altitude = a->modeC * 100; if (modeC < -12) {
if (a->modeC < -12) a->modeACflags |= MODEAC_MSG_MODEA_ONLY;
{a->modeACflags |= MODEAC_MSG_MODEA_ONLY;} } else {
a->modeC = modeC;
a->altitude = modeC * 100;
a->bFlags |= MODES_ACFLAGS_ALTITUDE_VALID;
}
} }
return (a); return (a);
} }
@ -2700,6 +2703,10 @@ struct aircraft *interactiveReceiveData(struct modesMessage *mm) {
a->messages = 1; a->messages = 1;
} }
if (a->bFlags & MODES_ACFLAGS_ALTITUDE_VALID) {
mm->altitude = a->altitude;
mm->bFlags |= MODES_ACFLAGS_ALTITUDE_VALID;
}
} }
return a; return a;
} }