diff --git a/track.c b/track.c index a2f010c..e1bae95 100644 --- a/track.c +++ b/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; } diff --git a/track.h b/track.h index 0342762..dc4f851 100644 --- a/track.h +++ b/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)