Fix Rc comparison logic
This commit is contained in:
parent
cdba7566fd
commit
b327848d75
22
track.c
22
track.c
|
@ -302,6 +302,18 @@ static int speed_check(struct aircraft *a, double lat, double lon, int surface)
|
||||||
return inrange;
|
return inrange;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// return 1 if left_rc is worse (less accurate) than right_rc
|
||||||
|
static int rcIsWorse(int left_rc, int right_rc)
|
||||||
|
{
|
||||||
|
if (left_rc == 0 && right_rc == 0) // both unknown
|
||||||
|
return 0;
|
||||||
|
if (left_rc == 0)
|
||||||
|
return 1; // left unknown < right known
|
||||||
|
if (right_rc == 0)
|
||||||
|
return 0; // left known > right unknown
|
||||||
|
return (left_rc > right_rc);
|
||||||
|
}
|
||||||
|
|
||||||
static int doGlobalCPR(struct aircraft *a, struct modesMessage *mm, double *lat, double *lon, unsigned *nic, unsigned *rc)
|
static int doGlobalCPR(struct aircraft *a, struct modesMessage *mm, double *lat, double *lon, unsigned *nic, unsigned *rc)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
|
@ -309,9 +321,9 @@ static int doGlobalCPR(struct aircraft *a, struct modesMessage *mm, double *lat,
|
||||||
int surface = (mm->cpr_type == CPR_SURFACE);
|
int surface = (mm->cpr_type == CPR_SURFACE);
|
||||||
|
|
||||||
// derive NIC, Rc from the worse of the two position
|
// derive NIC, Rc from the worse of the two position
|
||||||
// smaller NIC is worse; larger Rc is worse
|
// smaller NIC is worse
|
||||||
*nic = (a->cpr_even_nic < a->cpr_odd_nic ? a->cpr_even_nic : a->cpr_odd_nic);
|
*nic = (a->cpr_even_nic < a->cpr_odd_nic ? a->cpr_even_nic : a->cpr_odd_nic);
|
||||||
*rc = (a->cpr_even_rc > a->cpr_odd_rc ? a->cpr_even_rc : a->cpr_odd_rc);
|
*rc = (rcIsWorse(a->cpr_even_rc, a->cpr_odd_rc) ? a->cpr_even_rc : a->cpr_odd_rc);
|
||||||
|
|
||||||
if (surface) {
|
if (surface) {
|
||||||
// surface global CPR
|
// surface global CPR
|
||||||
|
@ -372,7 +384,7 @@ static int doGlobalCPR(struct aircraft *a, struct modesMessage *mm, double *lat,
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
// check speed limit
|
// check speed limit
|
||||||
if (trackDataValid(&a->position_valid) && a->pos_nic >= *nic && a->pos_rc <= *rc && !speed_check(a, *lat, *lon, surface)) {
|
if (trackDataValid(&a->position_valid) && a->pos_nic >= *nic && !rcIsWorse(a->pos_rc, *rc) && !speed_check(a, *lat, *lon, surface)) {
|
||||||
Modes.stats_current.cpr_global_speed_checks++;
|
Modes.stats_current.cpr_global_speed_checks++;
|
||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
|
@ -404,7 +416,7 @@ static int doLocalCPR(struct aircraft *a, struct modesMessage *mm, double *lat,
|
||||||
|
|
||||||
if (a->pos_nic < *nic)
|
if (a->pos_nic < *nic)
|
||||||
*nic = a->pos_nic;
|
*nic = a->pos_nic;
|
||||||
if (a->pos_rc < *rc)
|
if (rcIsWorse(a->pos_rc, *rc))
|
||||||
*rc = a->pos_rc;
|
*rc = a->pos_rc;
|
||||||
|
|
||||||
range_limit = 50e3;
|
range_limit = 50e3;
|
||||||
|
@ -454,7 +466,7 @@ static int doLocalCPR(struct aircraft *a, struct modesMessage *mm, double *lat,
|
||||||
}
|
}
|
||||||
|
|
||||||
// check speed limit
|
// check speed limit
|
||||||
if (trackDataValid(&a->position_valid) && a->pos_nic >= *nic && a->pos_rc <= *rc && !speed_check(a, *lat, *lon, surface)) {
|
if (trackDataValid(&a->position_valid) && a->pos_nic >= *nic && !rcIsWorse(a->pos_rc, *rc) && !speed_check(a, *lat, *lon, surface)) {
|
||||||
#ifdef DEBUG_CPR_CHECKS
|
#ifdef DEBUG_CPR_CHECKS
|
||||||
fprintf(stderr, "Speed check for %06X with local decoding failed\n", a->addr);
|
fprintf(stderr, "Speed check for %06X with local decoding failed\n", a->addr);
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue