Move Mode C altitude calc into mode A/C message decoding.
If SPI is set, it cannot be mode C.
This commit is contained in:
parent
85aa200947
commit
7a58e3cdc5
43
mode_ac.c
43
mode_ac.c
|
@ -75,28 +75,37 @@ int ModeAToModeC(unsigned int ModeA)
|
||||||
//=========================================================================
|
//=========================================================================
|
||||||
//
|
//
|
||||||
void decodeModeAMessage(struct modesMessage *mm, int ModeA)
|
void decodeModeAMessage(struct modesMessage *mm, int ModeA)
|
||||||
{
|
{
|
||||||
mm->msgtype = 32; // Valid Mode S DF's are DF-00 to DF-31.
|
mm->msgtype = 32; // Valid Mode S DF's are DF-00 to DF-31.
|
||||||
// so use 32 to indicate Mode A/C
|
// so use 32 to indicate Mode A/C
|
||||||
|
|
||||||
mm->msgbits = 16; // Fudge up a Mode S style data stream
|
mm->msgbits = 16; // Fudge up a Mode S style data stream
|
||||||
mm->msg[0] = (ModeA >> 8);
|
mm->msg[0] = (ModeA >> 8);
|
||||||
mm->msg[1] = (ModeA);
|
mm->msg[1] = (ModeA);
|
||||||
|
|
||||||
// Fudge an address based on Mode A (remove the Ident bit)
|
// Fudge an address based on Mode A (remove the Ident bit)
|
||||||
mm->addr = (ModeA & 0x0000FF7F) | MODES_NON_ICAO_ADDRESS;
|
mm->addr = (ModeA & 0x0000FF7F) | MODES_NON_ICAO_ADDRESS;
|
||||||
|
|
||||||
// Set the Identity field to ModeA
|
// Set the Identity field to ModeA
|
||||||
mm->modeA = ModeA & 0x7777;
|
mm->modeA = ModeA & 0x7777;
|
||||||
mm->bFlags |= MODES_ACFLAGS_SQUAWK_VALID;
|
mm->bFlags |= MODES_ACFLAGS_SQUAWK_VALID;
|
||||||
|
|
||||||
// Flag ident in flight status
|
// Flag ident in flight status
|
||||||
mm->fs = ModeA & 0x0080;
|
mm->fs = ModeA & 0x0080;
|
||||||
|
|
||||||
// Not much else we can tell from a Mode A/C reply.
|
// Decode an altitude if this looks like a possible mode C
|
||||||
// Just fudge up a few bits to keep other code happy
|
if (!mm->fs) {
|
||||||
mm->correctedbits = 0;
|
int modeC = ModeAToModeC(ModeA);
|
||||||
}
|
if (modeC >= -12) {
|
||||||
|
mm->altitude = modeC * 100;
|
||||||
|
mm->bFlags |= MODES_ACFLAGS_ALTITUDE_VALID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Not much else we can tell from a Mode A/C reply.
|
||||||
|
// Just fudge up a few bits to keep other code happy
|
||||||
|
mm->correctedbits = 0;
|
||||||
|
}
|
||||||
//
|
//
|
||||||
// ===================== Mode A/C detection and decoding ===================
|
// ===================== Mode A/C detection and decoding ===================
|
||||||
//
|
//
|
||||||
|
|
6
track.c
6
track.c
|
@ -73,13 +73,9 @@ struct aircraft *trackCreateAircraft(struct modesMessage *mm) {
|
||||||
// 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;
|
||||||
if (modeC < -12) {
|
if (!(mm->bFlags & MODES_ACFLAGS_ALTITUDE_VALID)) {
|
||||||
a->modeACflags |= MODEAC_MSG_MODEA_ONLY;
|
a->modeACflags |= MODEAC_MSG_MODEA_ONLY;
|
||||||
} else {
|
|
||||||
mm->altitude = modeC * 100;
|
|
||||||
mm->bFlags |= MODES_ACFLAGS_ALTITUDE_VALID;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue