boards/kakute-f7-mini-v3: don't hard-fail on telemetry based errors

Signed-off-by: Onur Özkan <work@onurozkan.dev>
This commit is contained in:
Onur Özkan committed 2026-07-19 23:20:56 +03:00
1 parent 3738bf4fda
commit 954a230e65
1 file changed
+16 -31
+16 -31
View File
@@ -177,16 +177,10 @@ mod app {
async fn imu_worker(context: imu_worker::Context) { async fn imu_worker(context: imu_worker::Context) {
let events = IMU_EVENTS.swap(0, Ordering::AcqRel); let events = IMU_EVENTS.swap(0, Ordering::AcqRel);
if events & IMU_EVENT_TRANSFER_FAULT != 0 { if events & IMU_EVENT_TRANSFER_FAULT != 0 {
if !matches!( let _ = context
context
.local .local
.imu .imu
.on_transfer_complete(SpiCompletion::TransferFault), .on_transfer_complete(SpiCompletion::TransferFault);
ImuEvent::Fault(_)
) {
panic!("SPI fault without an active MPU transaction");
}
panic!("SPI DMA transfer fault");
} }
if events & IMU_EVENT_TRANSFER_COMPLETE != 0 { if events & IMU_EVENT_TRANSFER_COMPLETE != 0 {
match context match context
@@ -198,24 +192,19 @@ mod app {
SAMPLES.publish(sample); SAMPLES.publish(sample);
schedule_telemetry(TELEMETRY_EVENT_SAMPLE); schedule_telemetry(TELEMETRY_EVENT_SAMPLE);
} }
ImuEvent::Fault(_) => panic!("MPU transfer failed"), ImuEvent::Fault(_) | ImuEvent::Initialized | ImuEvent::Idle => {}
ImuEvent::Initialized | ImuEvent::Idle => {}
} }
} }
if events & IMU_EVENT_TIMER != 0 if events & IMU_EVENT_TIMER != 0 {
&& matches!(context.local.imu.on_periodic_tick(), ImuEvent::Fault(_)) let _ = context.local.imu.on_periodic_tick();
{
panic!("MPU initialization failed");
} }
if events & IMU_EVENT_DRDY != 0 if events & IMU_EVENT_DRDY != 0 {
&& matches!(context.local.imu.on_data_ready(), ImuEvent::Fault(_)) let _ = context.local.imu.on_data_ready();
{
panic!("MPU sample submission failed");
} }
IMU_QUEUED.store(false, Ordering::Release); IMU_QUEUED.store(false, Ordering::Release);
if IMU_EVENTS.load(Ordering::Acquire) != 0 && !IMU_QUEUED.swap(true, Ordering::AcqRel) { if IMU_EVENTS.load(Ordering::Acquire) != 0 && !IMU_QUEUED.swap(true, Ordering::AcqRel) {
if imu_worker::spawn().is_err() { if imu_worker::spawn().is_err() {
panic!("IMU worker reschedule failed"); IMU_QUEUED.store(false, Ordering::Release);
} }
} }
} }
@@ -229,24 +218,20 @@ mod app {
2 => TxCompletion::TransferFault, 2 => TxCompletion::TransferFault,
_ => TxCompletion::NotPending, _ => TxCompletion::NotPending,
}; };
if context.local.telemetry.on_dma_complete(completion).is_err() { context.local.telemetry.on_dma_complete(completion);
panic!("telemetry DMA failed");
}
} }
if events & TELEMETRY_EVENT_SAMPLE != 0 { if events & TELEMETRY_EVENT_SAMPLE != 0 {
if let Some(sample) = SAMPLES.take_newer(context.local.observed_sample) { if let Some(sample) = SAMPLES.take_newer(context.local.observed_sample) {
if context.local.telemetry.publish_sample(&sample).is_err() { // Telemetry never blocks flight work. A later sample or
panic!("RAW_IMU publication failed"); // heartbeat gives the bounded queue another chance to send.
} let _ = context.local.telemetry.publish_sample(&sample);
} }
} }
if events & TELEMETRY_EVENT_HEARTBEAT != 0 { if events & TELEMETRY_EVENT_HEARTBEAT != 0 {
*context.local.heartbeat_divider = context.local.heartbeat_divider.wrapping_add(1); *context.local.heartbeat_divider = context.local.heartbeat_divider.wrapping_add(1);
if *context.local.heartbeat_divider == 10 { if *context.local.heartbeat_divider == 10 {
*context.local.heartbeat_divider = 0; *context.local.heartbeat_divider = 0;
if context.local.telemetry.publish_heartbeat().is_err() { let _ = context.local.telemetry.publish_heartbeat();
panic!("heartbeat publication failed");
}
context.local.led.toggle(); context.local.led.toggle();
} }
} }
@@ -255,7 +240,7 @@ mod app {
&& !TELEMETRY_QUEUED.swap(true, Ordering::AcqRel) && !TELEMETRY_QUEUED.swap(true, Ordering::AcqRel)
{ {
if telemetry_worker::spawn().is_err() { if telemetry_worker::spawn().is_err() {
panic!("telemetry worker reschedule failed"); TELEMETRY_QUEUED.store(false, Ordering::Release);
} }
} }
} }
@@ -263,14 +248,14 @@ mod app {
fn schedule_imu(event: u8) { fn schedule_imu(event: u8) {
IMU_EVENTS.fetch_or(event, Ordering::Release); IMU_EVENTS.fetch_or(event, Ordering::Release);
if !IMU_QUEUED.swap(true, Ordering::AcqRel) && imu_worker::spawn().is_err() { if !IMU_QUEUED.swap(true, Ordering::AcqRel) && imu_worker::spawn().is_err() {
panic!("IMU worker schedule failed"); IMU_QUEUED.store(false, Ordering::Release);
} }
} }
fn schedule_telemetry(event: u8) { fn schedule_telemetry(event: u8) {
TELEMETRY_EVENTS.fetch_or(event, Ordering::Release); TELEMETRY_EVENTS.fetch_or(event, Ordering::Release);
if !TELEMETRY_QUEUED.swap(true, Ordering::AcqRel) && telemetry_worker::spawn().is_err() { if !TELEMETRY_QUEUED.swap(true, Ordering::AcqRel) && telemetry_worker::spawn().is_err() {
panic!("telemetry worker schedule failed"); TELEMETRY_QUEUED.store(false, Ordering::Release);
} }
} }