diff --git a/components/boards/src/nk3am.rs b/components/boards/src/nk3am.rs index 0a469ae8..6b644592 100644 --- a/components/boards/src/nk3am.rs +++ b/components/boards/src/nk3am.rs @@ -264,7 +264,7 @@ pub fn power_handler(power: &mut POWER) { } } -pub fn init_watchdog(wdt: WDT) -> wdt::Parts<(WatchdogHandle,)> { +pub fn init_watchdog(wdt: WDT) -> Result,)>, WDT> { const WDT_FREQUENCY: u32 = 32_768; // Watchdog triggers after 3 minutes const DURATION_SECONS: u32 = 3 * 60; @@ -274,15 +274,14 @@ pub fn init_watchdog(wdt: WDT) -> wdt::Parts<(WatchdogHandle,)> { Ok(mut watchdog) => { watchdog.set_lfosc_ticks(TICKS); watchdog.enable_interrupt(); - let parts = watchdog.activate::(); + let mut parts = watchdog.activate::(); parts.handles.0.pet(); - parts + Ok(parts) } Err(wdt) => { - let parts = Watchdog::try_recover::(wdt) - .expect("Recover should always work for one handle"); + let mut parts = Watchdog::try_recover::(wdt)?; parts.handles.0.pet(); - parts + Ok(parts) } } } diff --git a/runners/embedded/src/bin/app-nrf.rs b/runners/embedded/src/bin/app-nrf.rs index 3901bfcf..3f34df3c 100644 --- a/runners/embedded/src/bin/app-nrf.rs +++ b/runners/embedded/src/bin/app-nrf.rs @@ -21,7 +21,7 @@ mod app { use nrf52840_hal::{ gpiote::Gpiote, rng::Rng, - wdt::{self, handles::Hdl0, Watchdog, WatchdogHandle}, + wdt::{self, handles::Hdl0, WatchdogHandle}, }; use embedded_runner_lib::{VERSION, VERSION_STRING}; @@ -43,8 +43,7 @@ mod app { struct LocalResources { gpiote: Gpiote, power: nrf52840_pac::POWER, - watchdog_handle: WatchdogHandle, - _watchdog: Watchdog, + watchdog_parts: Option>>, } #[monotonic(binds = RTC0, default = true)] @@ -147,14 +146,16 @@ mod app { LocalResources { gpiote: board_gpio.gpiote, power: ctx.device.POWER, - watchdog_handle: wdt_parts.handles.0, - _watchdog: wdt_parts.watchdog, + watchdog_parts: wdt_parts.ok().map(|parts| wdt::Parts { + watchdog: parts.watchdog, + handles: parts.handles.0, + }), }, init::Monotonics(rtc_mono), ) } - #[idle(shared = [apps, apdu_dispatch, ctaphid_dispatch, usb_classes], local = [watchdog_handle])] + #[idle(shared = [apps, apdu_dispatch, ctaphid_dispatch, usb_classes], local = [watchdog_parts])] fn idle(ctx: idle::Context) -> ! { let idle::SharedResources { mut apps, @@ -168,7 +169,10 @@ mod app { // cortex_m::asm::wfi(); loop { - ctx.local.watchdog_handle.pet(); + ctx.local + .watchdog_parts + .as_mut() + .map(|mut parts| parts.handles.pet()); #[cfg(not(feature = "no-delog"))] boards::init::Delogger::flush();