diff --git a/track.c b/track.c index f6168bd..a2f010c 100644 --- a/track.c +++ b/track.c @@ -540,8 +540,12 @@ static void updatePosition(struct aircraft *a, struct modesMessage *mm) // Nonfatal, try again later. Modes.stats_current.cpr_global_skipped++; } else { - Modes.stats_current.cpr_global_ok++; - combine_validity(&a->position_valid, &a->cpr_even_valid, &a->cpr_odd_valid); + if (accept_data(&a->position_valid, mm->source)) { + Modes.stats_current.cpr_global_ok++; + } else { + Modes.stats_current.cpr_global_skipped++; + location_result = -2; + } } } @@ -549,17 +553,12 @@ static void updatePosition(struct aircraft *a, struct modesMessage *mm) if (location_result == -1) { location_result = doLocalCPR(a, mm, &new_lat, &new_lon, &new_nic, &new_rc); - if (location_result < 0) { - Modes.stats_current.cpr_local_skipped++; - } else { + if (location_result == 0 && accept_data(&a->position_valid, mm->source)) { Modes.stats_current.cpr_local_ok++; mm->cpr_relative = 1; - - if (mm->cpr_odd) { - a->position_valid = a->cpr_odd_valid; - } else { - a->position_valid = a->cpr_even_valid; - } + } else { + Modes.stats_current.cpr_local_skipped++; + location_result = -1; } } @@ -895,6 +894,8 @@ static int altitude_to_feet(int raw, altitude_unit_t unit) struct aircraft *trackUpdateFromMessage(struct modesMessage *mm) { struct aircraft *a; + unsigned int cpr_new = 0; + if (mm->msgtype == 32) { // Mode A/C, just count it (we ignore SPI) @@ -1140,6 +1141,7 @@ struct aircraft *trackUpdateFromMessage(struct modesMessage *mm) a->cpr_even_lat = mm->cpr_lat; a->cpr_even_lon = mm->cpr_lon; compute_nic_rc_from_message(mm, a, &a->cpr_even_nic, &a->cpr_even_rc); + cpr_new = 1; } // CPR, odd @@ -1148,6 +1150,7 @@ struct aircraft *trackUpdateFromMessage(struct modesMessage *mm) a->cpr_odd_lat = mm->cpr_lat; a->cpr_odd_lon = mm->cpr_lon; compute_nic_rc_from_message(mm, a, &a->cpr_odd_nic, &a->cpr_odd_rc); + cpr_new = 1; } if (mm->accuracy.sda_valid && accept_data(&a->sda_valid, mm->source)) { @@ -1199,8 +1202,8 @@ struct aircraft *trackUpdateFromMessage(struct modesMessage *mm) combine_validity(&a->altitude_geom_valid, &a->altitude_baro_valid, &a->geom_delta_valid); } - // If we've got a new cprlat or cprlon - if (mm->cpr_valid) { + // If we've got a new cpr_odd or cpr_even + if (cpr_new) { updatePosition(a, mm); }