Keep fused location streaming through GPS rejects
This commit is contained in:
@@ -83,6 +83,36 @@ static void assembly_waits_for_every_ready_channel(void)
|
||||
"assembly lost a ready-channel interrupt");
|
||||
}
|
||||
|
||||
static void busy_unlocked_channel_does_not_block_epoch(void)
|
||||
{
|
||||
gps_nav_epoch_assembly_t assembly;
|
||||
gps_nav_epoch_assembly_reset(&assembly);
|
||||
|
||||
/* Model the board failure: channels 0..8 are allocated and busy, but
|
||||
* channel 4 has lost lock and therefore cannot produce this NAV epoch. */
|
||||
const uint32_t allocated_busy_mask = 0x1ffu;
|
||||
const uint32_t locked_mask = allocated_busy_mask & ~(1u << 4);
|
||||
const uint32_t ready_mask = allocated_busy_mask & locked_mask;
|
||||
|
||||
for(unsigned int channel = 0u ; channel < 9u ; channel++)
|
||||
{
|
||||
if((ready_mask & (1u << channel)) == 0u)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
gps_nav_epoch_event_result_t result =
|
||||
gps_nav_epoch_assembly_push(
|
||||
&assembly, 1500u, channel, ready_mask);
|
||||
bool last = channel == 8u;
|
||||
CHECK((result == GPS_NAV_EPOCH_EVENT_COMPLETE) == last,
|
||||
"busy unlocked channel blocked a complete locked-channel epoch");
|
||||
}
|
||||
CHECK(assembly.expected_mask == 0x1efu,
|
||||
"busy unlocked channel entered the ready mask");
|
||||
CHECK(assembly.received_mask == assembly.expected_mask,
|
||||
"locked channels did not complete the epoch");
|
||||
}
|
||||
|
||||
static void assembly_handles_duplicates_and_epoch_order(void)
|
||||
{
|
||||
gps_nav_epoch_assembly_t assembly;
|
||||
@@ -458,6 +488,7 @@ int main(void)
|
||||
{
|
||||
epoch_id_rounding_and_week_wrap();
|
||||
assembly_waits_for_every_ready_channel();
|
||||
busy_unlocked_channel_does_not_block_epoch();
|
||||
assembly_handles_duplicates_and_epoch_order();
|
||||
assembly_disconnect_and_reconnect();
|
||||
channel_join_does_not_expand_active_epoch();
|
||||
|
||||
Reference in New Issue
Block a user