Improve CAN bus error handling and logging
- Enhanced error detection with detailed status logging for bus-off, error warning, and passive errors. - Added line breaks to CAN and RX error logs for better readability. - Refined CAN transmission logic and error feedback, including buffer overflow handling. - Simplified firmware timestamp frame creation and ensured successful sending.
This commit is contained in:
@@ -415,7 +415,7 @@ async fn can_task(
|
||||
Timer::after_millis(100).await;
|
||||
}
|
||||
let mut msg: heapless::String<128> = heapless::String::new();
|
||||
let _ = write!(&mut msg, "rx err {:?}", err);
|
||||
let _ = write!(&mut msg, "rx err {:?} \r\n", err);
|
||||
log(msg);
|
||||
}
|
||||
}
|
||||
@@ -429,14 +429,25 @@ async fn can_task(
|
||||
}
|
||||
}
|
||||
|
||||
// Check CAN error status register for bus-off condition
|
||||
if hal::pac::CAN1.errsr().read().boff() {
|
||||
blink_error_loop(info, warn, 3, 3).await; // Bus-off error
|
||||
}
|
||||
|
||||
|
||||
while let Ok(mut frame) = CAN_TX_CH.try_receive() {
|
||||
match can.transmit(&mut frame) {
|
||||
Ok(..) => {
|
||||
Ok(_ok) => {
|
||||
let status = hal::pac::CAN1.errsr().read();
|
||||
|
||||
// Check CAN error status register for bus-off condition
|
||||
if status.boff() || status.ewgf() || status.epvf() {
|
||||
let mut msg: heapless::String<128> = heapless::String::new();
|
||||
let _ = write!(&mut msg, "canbus status {} {} {} \r\n", status.boff(), status.ewgf(), status.epvf());
|
||||
log(msg);
|
||||
for _ in 0..2 {
|
||||
warn.set_high();
|
||||
Timer::after_millis(100).await;
|
||||
warn.set_low();
|
||||
Timer::after_millis(100).await;
|
||||
}
|
||||
}
|
||||
}
|
||||
Err(nb::Error::WouldBlock) => {
|
||||
for _ in 0..2 {
|
||||
@@ -446,7 +457,7 @@ async fn can_task(
|
||||
Timer::after_millis(100).await;
|
||||
}
|
||||
let mut msg: heapless::String<128> = heapless::String::new();
|
||||
let _ = write!(&mut msg, "canbus out buffer full");
|
||||
let _ = write!(&mut msg, "canbus out buffer full \r\n");
|
||||
log(msg);
|
||||
}
|
||||
Err(nb::Error::Other(err)) => {
|
||||
@@ -457,7 +468,7 @@ async fn can_task(
|
||||
Timer::after_millis(100).await;
|
||||
}
|
||||
let mut msg: heapless::String<128> = heapless::String::new();
|
||||
let _ = write!(&mut msg, "tx err {:?}", err);
|
||||
let _ = write!(&mut msg, "tx err {:?} \r\n", err);
|
||||
log(msg);
|
||||
}
|
||||
}
|
||||
@@ -516,7 +527,7 @@ async fn worker(
|
||||
loop {
|
||||
let mut total_pulses: u32 = 0;
|
||||
|
||||
for _ in 0..AVG_WINDOWS {
|
||||
for _window in 0..AVG_WINDOWS {
|
||||
// Count rising edges of Q in a 100 ms window
|
||||
let start = Instant::now();
|
||||
let mut pulses: u32 = 0;
|
||||
@@ -586,9 +597,8 @@ async fn worker(
|
||||
|
||||
// Send firmware build timestamp after each measurement so the controller
|
||||
// always has up-to-date build info without requiring an identify request.
|
||||
if let Some(build_frame) = CanFrame::new(firmware_build_id, &FIRMWARE_BUILD_MINUTES.to_be_bytes()) {
|
||||
CAN_TX_CH.send(build_frame).await;
|
||||
}
|
||||
let firmware = CanFrame::new(firmware_build_id, &FIRMWARE_BUILD_MINUTES.to_be_bytes()).unwrap();
|
||||
CAN_TX_CH.send(firmware).await;
|
||||
|
||||
// Wait for the other slot to measure, plus gaps to ensure no overlap
|
||||
// After A finishes measuring: wait 50ms (gap) + 400ms (B measures) + 50ms (gap) = 500ms
|
||||
|
||||
Reference in New Issue
Block a user