Fix GPS nav epoch recovery and document debug levels
This commit is contained in:
@@ -1112,6 +1112,9 @@ static void gps_process_tracking_nav_solve(const gps_isr_event_t* event)
|
||||
trck_ip_no, tow_week, tow_sec);
|
||||
return;
|
||||
}
|
||||
uint64_t previous_epoch = gps_nav_epoch_assembly.epoch_id;
|
||||
uint32_t previous_expected = gps_nav_epoch_assembly.expected_mask;
|
||||
uint32_t previous_received = gps_nav_epoch_assembly.received_mask;
|
||||
gps_nav_epoch_event_result_t assembly_result =
|
||||
gps_nav_epoch_assembly_push(
|
||||
&gps_nav_epoch_assembly, epoch_id, trck_ip_no,
|
||||
@@ -1127,14 +1130,16 @@ static void gps_process_tracking_nav_solve(const gps_isr_event_t* event)
|
||||
trck_ip_no, (unsigned long)epoch_id,
|
||||
(unsigned long)gps_nav_epoch_assembly.epoch_id);
|
||||
}
|
||||
else if(assembly_result == GPS_NAV_EPOCH_EVENT_FUTURE)
|
||||
else if(assembly_result == GPS_NAV_EPOCH_EVENT_RESTARTED)
|
||||
{
|
||||
/* The previous snapshot is no longer the active assembly. Do not
|
||||
* let an already-pending foreground hand-off consume mixed nodes. */
|
||||
gps_nav_solve_period_pending = false;
|
||||
GPS_LOG(DEBUG_WARNING, GPS_LOG_CAT_NAV,
|
||||
"future nav epoch blocked by incomplete epoch: trk=%u epoch=%lu active=%lu expected=0x%x received=0x%x\r\n",
|
||||
trck_ip_no, (unsigned long)epoch_id,
|
||||
(unsigned long)gps_nav_epoch_assembly.epoch_id,
|
||||
gps_nav_epoch_assembly.expected_mask,
|
||||
gps_nav_epoch_assembly.received_mask);
|
||||
"NAV epoch restarted by newer interrupt: old=%lu expected=0x%x received=0x%x new=%lu first_trk=%u\r\n",
|
||||
(unsigned long)previous_epoch,
|
||||
previous_expected, previous_received,
|
||||
(unsigned long)epoch_id, trck_ip_no);
|
||||
}
|
||||
GPS_LOG(DEBUG_TRACE, GPS_LOG_CAT_TRK,
|
||||
"nav solve: trk=%u abs_raw=%u rem=%u abs=%.6f timer=%u count=%u dt=%.6f tow=%f seq=%u\r\n",
|
||||
|
||||
@@ -241,29 +241,36 @@ gps_nav_epoch_event_result_t gps_nav_epoch_assembly_push(
|
||||
}
|
||||
|
||||
uint32_t channel_mask = 1u << channel;
|
||||
uint32_t valid_mask =
|
||||
(1u << GPS_NAV_EPOCH_MAX_CANDIDATES) - 1u;
|
||||
ready_mask &= valid_mask;
|
||||
if((ready_mask & channel_mask) == 0u)
|
||||
{
|
||||
return GPS_NAV_EPOCH_EVENT_INVALID;
|
||||
}
|
||||
|
||||
bool restarted = false;
|
||||
if(assembly->active)
|
||||
{
|
||||
if(epoch_id < assembly->epoch_id)
|
||||
{
|
||||
return GPS_NAV_EPOCH_EVENT_STALE;
|
||||
}
|
||||
if(epoch_id > assembly->epoch_id)
|
||||
{
|
||||
gps_nav_epoch_assembly_reset(assembly);
|
||||
restarted = true;
|
||||
}
|
||||
}
|
||||
|
||||
if(!assembly->active)
|
||||
{
|
||||
uint32_t valid_mask =
|
||||
(1u << GPS_NAV_EPOCH_MAX_CANDIDATES) - 1u;
|
||||
ready_mask &= valid_mask;
|
||||
if((ready_mask & channel_mask) == 0u)
|
||||
{
|
||||
return GPS_NAV_EPOCH_EVENT_INVALID;
|
||||
}
|
||||
assembly->epoch_id = epoch_id;
|
||||
assembly->expected_mask = ready_mask;
|
||||
assembly->received_mask = 0u;
|
||||
assembly->active = true;
|
||||
}
|
||||
|
||||
if(epoch_id < assembly->epoch_id)
|
||||
{
|
||||
return GPS_NAV_EPOCH_EVENT_STALE;
|
||||
}
|
||||
if(epoch_id > assembly->epoch_id)
|
||||
{
|
||||
return GPS_NAV_EPOCH_EVENT_FUTURE;
|
||||
}
|
||||
if((assembly->expected_mask & channel_mask) == 0u)
|
||||
{
|
||||
return GPS_NAV_EPOCH_EVENT_INVALID;
|
||||
@@ -274,8 +281,12 @@ gps_nav_epoch_event_result_t gps_nav_epoch_assembly_push(
|
||||
}
|
||||
|
||||
assembly->received_mask |= channel_mask;
|
||||
return gps_nav_epoch_assembly_complete(assembly) ?
|
||||
GPS_NAV_EPOCH_EVENT_COMPLETE :
|
||||
if(gps_nav_epoch_assembly_complete(assembly))
|
||||
{
|
||||
return GPS_NAV_EPOCH_EVENT_COMPLETE;
|
||||
}
|
||||
return restarted ?
|
||||
GPS_NAV_EPOCH_EVENT_RESTARTED :
|
||||
GPS_NAV_EPOCH_EVENT_ACCEPTED;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user