Track ADS-B version separately for direct ADS-B, TIS-B, ADS-R
(both because direct vs ground station might be different, and to avoid characterizing ADS-R or TIS-B aircraft as being DO-260B when they're not)
This commit is contained in:
parent
886b0d3f81
commit
d471249f17
34
track.c
34
track.c
|
|
@ -949,9 +949,28 @@ struct aircraft *trackUpdateFromMessage(struct modesMessage *mm)
|
|||
if (mm->addrtype < a->addrtype)
|
||||
a->addrtype = mm->addrtype;
|
||||
|
||||
// if we saw some direct ADS-B for the first time, assume version 0
|
||||
if (mm->source == SOURCE_ADSB && a->adsb_version < 0)
|
||||
a->adsb_version = 0;
|
||||
// decide on where to stash the version
|
||||
int dummy_version = -1; // used for non-adsb/adsr/tisb messages
|
||||
int *message_version;
|
||||
|
||||
switch (mm->source) {
|
||||
case SOURCE_ADSB:
|
||||
message_version = &a->adsb_version;
|
||||
break;
|
||||
case SOURCE_TISB:
|
||||
message_version = &a->tisb_version;
|
||||
break;
|
||||
case SOURCE_ADSR:
|
||||
message_version = &a->adsr_version;
|
||||
break;
|
||||
default:
|
||||
message_version = &dummy_version;
|
||||
break;
|
||||
}
|
||||
|
||||
// assume version 0 until we see something else
|
||||
if (*message_version < 0)
|
||||
*message_version = 0;
|
||||
|
||||
// category shouldn't change over time, don't bother with metadata
|
||||
if (mm->category_valid) {
|
||||
|
|
@ -961,7 +980,8 @@ struct aircraft *trackUpdateFromMessage(struct modesMessage *mm)
|
|||
// operational status message
|
||||
// done early to update version / HRD / TAH
|
||||
if (mm->opstatus.valid) {
|
||||
a->adsb_version = mm->opstatus.version;
|
||||
*message_version = mm->opstatus.version;
|
||||
|
||||
if (mm->opstatus.hrd != HEADING_INVALID) {
|
||||
a->adsb_hrd = mm->opstatus.hrd;
|
||||
}
|
||||
|
|
@ -971,7 +991,7 @@ struct aircraft *trackUpdateFromMessage(struct modesMessage *mm)
|
|||
}
|
||||
|
||||
// fill in ADS-B v0 NACp, SIL from position message type
|
||||
if (a->adsb_version == 0 && !mm->accuracy.nac_p_valid) {
|
||||
if (*message_version == 0 && !mm->accuracy.nac_p_valid) {
|
||||
int computed_nacp = compute_v0_nacp(mm);
|
||||
if (computed_nacp != -1) {
|
||||
mm->accuracy.nac_p_valid = 1;
|
||||
|
|
@ -979,7 +999,7 @@ struct aircraft *trackUpdateFromMessage(struct modesMessage *mm)
|
|||
}
|
||||
}
|
||||
|
||||
if (a->adsb_version == 0 && mm->accuracy.sil_type == SIL_INVALID) {
|
||||
if (*message_version == 0 && mm->accuracy.sil_type == SIL_INVALID) {
|
||||
int computed_sil = compute_v0_sil(mm);
|
||||
if (computed_sil != -1) {
|
||||
mm->accuracy.sil_type = SIL_UNKNOWN;
|
||||
|
|
@ -1070,7 +1090,7 @@ struct aircraft *trackUpdateFromMessage(struct modesMessage *mm)
|
|||
}
|
||||
|
||||
if (mm->gs_valid) {
|
||||
mm->gs.selected = (a->adsb_version == 2 ? mm->gs.v2 : mm->gs.v0);
|
||||
mm->gs.selected = (*message_version == 2 ? mm->gs.v2 : mm->gs.v0);
|
||||
if (accept_data(&a->gs_valid, mm->source)) {
|
||||
a->gs = mm->gs.selected;
|
||||
}
|
||||
|
|
|
|||
4
track.h
4
track.h
|
|
@ -195,12 +195,14 @@ struct aircraft {
|
|||
unsigned cpr_even_rc;
|
||||
|
||||
data_validity position_valid;
|
||||
double lat, lon; // Coordinated obtained from CPR encoded data
|
||||
double lat, lon; // Coordinates obtained from CPR encoded data
|
||||
unsigned pos_nic; // NIC of last computed position
|
||||
unsigned pos_rc; // Rc of last computed position
|
||||
|
||||
// data extracted from opstatus etc
|
||||
int adsb_version; // ADS-B version (from ADS-B operational status); -1 means no ADS-B messages seen
|
||||
int adsr_version; // As above, for ADS-R messages
|
||||
int tisb_version; // As above, for TIS-B messages
|
||||
heading_type_t adsb_hrd; // Heading Reference Direction setting (from ADS-B operational status)
|
||||
heading_type_t adsb_tah; // Track Angle / Heading setting (from ADS-B operational status)
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue