Merge pull request #55 from wiedehopf/cpr_fix
CPR / Position update fix / improvement
This commit is contained in:
commit
201cb2f466
29
track.c
29
track.c
|
|
@ -540,8 +540,12 @@ static void updatePosition(struct aircraft *a, struct modesMessage *mm)
|
||||||
// Nonfatal, try again later.
|
// Nonfatal, try again later.
|
||||||
Modes.stats_current.cpr_global_skipped++;
|
Modes.stats_current.cpr_global_skipped++;
|
||||||
} else {
|
} else {
|
||||||
Modes.stats_current.cpr_global_ok++;
|
if (accept_data(&a->position_valid, mm->source)) {
|
||||||
combine_validity(&a->position_valid, &a->cpr_even_valid, &a->cpr_odd_valid);
|
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) {
|
if (location_result == -1) {
|
||||||
location_result = doLocalCPR(a, mm, &new_lat, &new_lon, &new_nic, &new_rc);
|
location_result = doLocalCPR(a, mm, &new_lat, &new_lon, &new_nic, &new_rc);
|
||||||
|
|
||||||
if (location_result < 0) {
|
if (location_result == 0 && accept_data(&a->position_valid, mm->source)) {
|
||||||
Modes.stats_current.cpr_local_skipped++;
|
|
||||||
} else {
|
|
||||||
Modes.stats_current.cpr_local_ok++;
|
Modes.stats_current.cpr_local_ok++;
|
||||||
mm->cpr_relative = 1;
|
mm->cpr_relative = 1;
|
||||||
|
} else {
|
||||||
if (mm->cpr_odd) {
|
Modes.stats_current.cpr_local_skipped++;
|
||||||
a->position_valid = a->cpr_odd_valid;
|
location_result = -1;
|
||||||
} else {
|
|
||||||
a->position_valid = a->cpr_even_valid;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -895,6 +894,8 @@ static int altitude_to_feet(int raw, altitude_unit_t unit)
|
||||||
struct aircraft *trackUpdateFromMessage(struct modesMessage *mm)
|
struct aircraft *trackUpdateFromMessage(struct modesMessage *mm)
|
||||||
{
|
{
|
||||||
struct aircraft *a;
|
struct aircraft *a;
|
||||||
|
unsigned int cpr_new = 0;
|
||||||
|
|
||||||
|
|
||||||
if (mm->msgtype == 32) {
|
if (mm->msgtype == 32) {
|
||||||
// Mode A/C, just count it (we ignore SPI)
|
// 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_lat = mm->cpr_lat;
|
||||||
a->cpr_even_lon = mm->cpr_lon;
|
a->cpr_even_lon = mm->cpr_lon;
|
||||||
compute_nic_rc_from_message(mm, a, &a->cpr_even_nic, &a->cpr_even_rc);
|
compute_nic_rc_from_message(mm, a, &a->cpr_even_nic, &a->cpr_even_rc);
|
||||||
|
cpr_new = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// CPR, odd
|
// CPR, odd
|
||||||
|
|
@ -1148,6 +1150,7 @@ struct aircraft *trackUpdateFromMessage(struct modesMessage *mm)
|
||||||
a->cpr_odd_lat = mm->cpr_lat;
|
a->cpr_odd_lat = mm->cpr_lat;
|
||||||
a->cpr_odd_lon = mm->cpr_lon;
|
a->cpr_odd_lon = mm->cpr_lon;
|
||||||
compute_nic_rc_from_message(mm, a, &a->cpr_odd_nic, &a->cpr_odd_rc);
|
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)) {
|
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);
|
combine_validity(&a->altitude_geom_valid, &a->altitude_baro_valid, &a->geom_delta_valid);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we've got a new cprlat or cprlon
|
// If we've got a new cpr_odd or cpr_even
|
||||||
if (mm->cpr_valid) {
|
if (cpr_new) {
|
||||||
updatePosition(a, mm);
|
updatePosition(a, mm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue