From c4d6ed45f1f57e92be21142b81a1fd2b52a5924f Mon Sep 17 00:00:00 2001 From: Philipp_EndevourOS Date: Tue, 14 Oct 2025 14:35:25 +0200 Subject: [PATCH] updated panic handler --- Cargo.lock | 11 ++++++----- Cargo.toml | 1 + src/init/hardware.rs | 40 ++++++++++++++++++++++++++++++++++++---- 3 files changed, 43 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5bd03f4..cb43f93 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -78,9 +78,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.1" +version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" [[package]] name = "bleps" @@ -714,7 +714,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3887eda2917deef3d99e7a5c324f9190714e99055361ad36890dffd0a995b49" dependencies = [ "bitfield 0.19.1", - "bitflags 2.9.1", + "bitflags 2.9.4", "bytemuck", "cfg-if", "critical-section", @@ -1058,6 +1058,7 @@ dependencies = [ name = "fw-anwesenheit" version = "0.1.0" dependencies = [ + "bitflags 2.9.4", "bleps", "chrono", "critical-section", @@ -1412,7 +1413,7 @@ source = "git+https://github.com/sammhicks/picoserve.git?rev=400df53f61137e1bb28 dependencies = [ "const-sha1", "embassy-net", - "embassy-time 0.4.0", + "embassy-time 0.5.0", "embedded-io-async", "heapless", "log", @@ -1531,7 +1532,7 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "679341d22c78c6c649893cbd6c3278dcbe9fc4faa62fea3a9296ae2b50c14625" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "memchr", "unicase", ] diff --git a/Cargo.toml b/Cargo.toml index 7ed32b2..d1cc5d5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -70,6 +70,7 @@ embedded-sdmmc = "0.8.0" embedded-hal-bus = "0.3.0" serde_json = { version = "1.0.143", default-features = false, features = ["alloc"]} embassy-futures = { version = "0.1.2", features = ["log"] } +bitflags = "2.9.4" [profile.dev] # Rust debug is too slow. diff --git a/src/init/hardware.rs b/src/init/hardware.rs index 3ffdbc5..56b0b9d 100644 --- a/src/init/hardware.rs +++ b/src/init/hardware.rs @@ -1,4 +1,6 @@ use core::cell::RefCell; +use core::sync::atomic::{AtomicU8, Ordering}; +use alloc::string::ToString; use critical_section::Mutex; use embassy_executor::Spawner; use embassy_net::Stack; @@ -26,9 +28,12 @@ use esp_hal_smartled::{SmartLedsAdapterAsync, buffer_size_async}; use esp_println::logger::init_logger; use log::{debug, error}; +use crate::FEEDBACK_STATE; +use crate::feedback:: FeedbackState; use crate::init::network; use crate::init::sd_card::{SDCardPersistence, setup_sdcard}; use crate::init::wifi; +use bitflags::bitflags; /************************************************* * GPIO Pinout Xiao Esp32c6 @@ -52,11 +57,38 @@ pub const LED_BUFFER_SIZE: usize = NUM_LEDS * 25; static SD_DET: Mutex>> = Mutex::new(RefCell::new(None)); +static ERR_FLAGS: AtomicU8 = AtomicU8::new(0); + +bitflags! { + struct Flags: u8 { + const ERR_FLG_FEEDBACK = 0b00000001; + const ERR_FLG_SDCARD = 0b00000010; + } +} + #[panic_handler] fn panic(info: &core::panic::PanicInfo) -> ! { - loop { - error!("PANIC: {info}"); + + error!("PANIC: {info}"); + + let ordering: Ordering = Ordering::Relaxed; + let bits = ERR_FLAGS.load(ordering); + let flags = Flags::from_bits_truncate(bits); + + + if !flags.contains(Flags::ERR_FLG_FEEDBACK) { + FEEDBACK_STATE.signal(FeedbackState::Error); } + ERR_FLAGS.fetch_or(Flags::ERR_FLG_FEEDBACK.bits(), ordering); + + + if !flags.contains(Flags::ERR_FLG_SDCARD) { + let info_str = info.to_string(); + // TODO: save error string to SD Card + } + ERR_FLAGS.fetch_or(Flags::ERR_FLG_SDCARD.bits(), ordering); + + loop {} } esp_bootloader_esp_idf::esp_app_desc!(); @@ -137,9 +169,9 @@ fn setup_uart( uart_tx: GPIO16<'static>, uart_rx: GPIO17<'static>, ) -> Uart<'static, Async> { - let uard_device = Uart::new(uart1, esp_hal::uart::Config::default().with_baudrate(9600)); + let uart_device = Uart::new(uart1, esp_hal::uart::Config::default().with_baudrate(9600)); - match uard_device { + match uart_device { Ok(block) => block.with_rx(uart_rx).with_tx(uart_tx).into_async(), Err(e) => { error!("Failed to initialize UART: {e}");