Fix GPS nav epoch recovery and document debug levels

This commit is contained in:
2026-07-23 20:48:42 +03:00
parent 516016efb9
commit fc242b2883
7 changed files with 252 additions and 38 deletions
@@ -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",
+28 -17
View File
@@ -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;
}