33//! Currently implemented Timer and UART wakeup sources.
44
55use esp_idf_sys:: * ;
6- use std :: time:: Duration ;
6+ use core :: time:: Duration ;
77
8- #[ derive( Debug ) ]
8+ const MAX_WAKEUP_SOURCES : usize = 10 ;
9+
10+ #[ derive( Default , Debug ) ]
911pub enum WakeupSource {
12+ #[ default]
13+ None ,
1014 Timer { dur : Duration } ,
1115 Uart { uart_num : i32 , threshold : i32 } ,
1216 // TODO: add more sources
@@ -15,6 +19,7 @@ pub enum WakeupSource {
1519impl WakeupSource {
1620 pub fn apply ( & self ) -> Result < ( ) , EspError > {
1721 match * self {
22+ WakeupSource :: None => { }
1823 WakeupSource :: Timer { dur } => {
1924 esp ! ( unsafe { esp_sleep_enable_timer_wakeup( dur. as_micros( ) as u64 ) } ) ?;
2025 }
@@ -48,7 +53,8 @@ pub trait Sleep {
4853
4954#[ derive( Default , Debug ) ]
5055pub struct LightSleep {
51- wakeup_sources : Vec < WakeupSource > ,
56+ wakeup_sources : [ WakeupSource ; MAX_WAKEUP_SOURCES ] ,
57+ n_wakeup_sources : usize ,
5258}
5359
5460impl LightSleep {
@@ -63,7 +69,11 @@ impl LightSleep {
6369
6470impl Sleep for LightSleep {
6571 fn add_wakeup_source ( & mut self , wakeup : WakeupSource ) -> Result < ( ) , EspError > {
66- self . wakeup_sources . push ( wakeup) ;
72+ if self . n_wakeup_sources >= MAX_WAKEUP_SOURCES {
73+ return Err ( EspError :: from_infallible :: < ESP_FAIL > ( ) )
74+ }
75+ self . wakeup_sources [ self . n_wakeup_sources ] = wakeup;
76+ self . n_wakeup_sources += 1 ;
6777 Ok ( ( ) )
6878 }
6979
@@ -77,7 +87,8 @@ impl Sleep for LightSleep {
7787
7888#[ derive( Default , Debug ) ]
7989pub struct DeepSleep {
80- wakeup_sources : Vec < WakeupSource > ,
90+ wakeup_sources : [ WakeupSource ; MAX_WAKEUP_SOURCES ] ,
91+ n_wakeup_sources : usize ,
8192}
8293
8394impl DeepSleep {
@@ -95,12 +106,18 @@ impl Sleep for DeepSleep {
95106 if matches ! ( wakeup, WakeupSource :: Uart { .. } ) {
96107 return Err ( EspError :: from_infallible :: < ESP_ERR_INVALID_ARG > ( ) ) ;
97108 }
98- self . wakeup_sources . push ( wakeup) ;
109+
110+ if self . n_wakeup_sources >= MAX_WAKEUP_SOURCES {
111+ return Err ( EspError :: from_infallible :: < ESP_FAIL > ( ) )
112+ }
113+ self . wakeup_sources [ self . n_wakeup_sources ] = wakeup;
114+ self . n_wakeup_sources += 1 ;
115+
99116 Ok ( ( ) )
100117 }
101118
102119 fn sleep ( & self ) -> Result < ( ) , EspError > {
103- self . apply_wakeup_sources ( & self . wakeup_sources ) ?;
120+ self . apply_wakeup_sources ( & self . wakeup_sources [ 0 .. self . n_wakeup_sources ] ) ?;
104121
105122 unsafe { esp_deep_sleep_start ( ) } ;
106123 #[ allow( unreachable_code) ]
0 commit comments