@@ -20,9 +20,6 @@ use structs::ConnSettings;
2020use utils:: { logger:: FkmLogger , set_brownout_detection} ;
2121use ws_framer:: { WsUrl , WsUrlOwned } ;
2222
23- #[ cfg( feature = "esp_now" ) ]
24- use esp_radio:: esp_now:: { EspNowManager , EspNowSender } ;
25-
2623mod battery;
2724mod bluetooth;
2825mod board;
@@ -56,19 +53,6 @@ pub fn custom_rng(buf: &mut [u8]) -> Result<(), getrandom::Error> {
5653 Ok ( ( ) )
5754}
5855getrandom:: register_custom_getrandom!( custom_rng) ;
59-
60- #[ cfg( feature = "esp_now" ) ]
61- const ESP_NOW_DST : & [ u8 ; 6 ] = & [ 156 , 158 , 110 , 52 , 70 , 200 ] ;
62- #[ cfg( feature = "esp_now" ) ]
63- macro_rules! mk_static {
64- ( $t: ty, $val: expr) => { {
65- static STATIC_CELL : static_cell:: StaticCell <$t> = static_cell:: StaticCell :: new( ) ;
66- #[ deny( unused_attributes) ]
67- let x = STATIC_CELL . uninit( ) . write( ( $val) ) ;
68- x
69- } } ;
70- }
71-
7256esp_bootloader_esp_idf:: esp_app_desc!( ) ;
7357
7458#[ esp_rtos:: main]
@@ -183,165 +167,122 @@ async fn main(spawner: Spawner) {
183167 }
184168 }
185169 }
170+ let wifi_res = esp_hal_wifimanager:: init_wm (
171+ wm_settings,
172+ & spawner,
173+ #[ cfg( feature = "qa" ) ]
174+ None ,
175+ #[ cfg( not( feature = "qa" ) ) ]
176+ Some ( & nvs) ,
177+ board. rng ,
178+ board. wifi ,
179+ unsafe { board. bt . clone_unchecked ( ) } ,
180+ Some ( wifi_setup_sig) ,
181+ )
182+ . await ;
183+
184+ let Ok ( mut wifi_res) = wifi_res else {
185+ log:: error!( "WifiManager failed!!! Restarting in 1s!" ) ;
186+ Timer :: after_millis ( 1000 ) . await ;
187+ esp_hal:: system:: software_reset ( ) ;
188+ } ;
186189
187- #[ cfg( feature = "esp_now" ) ]
188- {
189- let init = & * mk_static ! (
190- esp_wifi:: EspWifiController <' static >,
191- esp_wifi:: init( board. timg0. timer0, board. rng. clone( ) , board. radio_clk)
192- . expect( "EXPERIMENT" )
193- ) ;
194-
195- let ( manager, tx, mut rx) = esp_wifi:: esp_now:: EspNow :: new ( & init, board. wifi )
196- . expect ( "EXPERIMENT" )
197- . split ( ) ;
198-
199- _ = manager. set_power_saving ( esp_wifi:: config:: PowerSaveMode :: None ) ;
200- //_ = manager.set_rate(esp_wifi::esp_now::WifiPhyRate::RateMax);
201- _ = manager. set_pmk ( & [ 69 , 4 , 2 , 0 , 1 , 2 , 3 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ) ;
202-
203- spawner. must_spawn ( bc_test_task ( tx, manager) ) ;
204- let mut last_counter = 0 ;
205- loop {
206- let recv = rx. receive_async ( ) . await ;
207- log:: info!( "ESP_NOW frame recv: {:?}" , recv. info) ;
208- log:: info!( "{:?}" , recv. data( ) ) ;
209-
210- if & recv. info . dst_address == ESP_NOW_DST {
211- if recv. data ( ) . len ( ) == 16 {
212- let counter = u128:: from_be_bytes ( recv. data ( ) . try_into ( ) . expect ( "EXPERIMENT" ) ) ;
213- if counter - last_counter == 0 {
214- log:: warn!( "First packet?" ) ;
215- } else if counter - last_counter > 1 {
216- log:: error!( "PACKET LOST!" ) ;
217- }
218-
219- last_counter = counter;
220- }
221- }
222- }
223- }
224-
225- #[ cfg( not( feature = "esp_now" ) ) ]
226- {
227- let wifi_res = esp_hal_wifimanager:: init_wm (
228- wm_settings,
229- & spawner,
230- #[ cfg( feature = "qa" ) ]
231- None ,
232- #[ cfg( not( feature = "qa" ) ) ]
233- Some ( & nvs) ,
234- board. rng ,
235- board. wifi ,
236- unsafe { board. bt . clone_unchecked ( ) } ,
237- Some ( wifi_setup_sig) ,
238- )
239- . await ;
240-
241- let Ok ( mut wifi_res) = wifi_res else {
242- log:: error!( "WifiManager failed!!! Restarting in 1s!" ) ;
243- Timer :: after_millis ( 1000 ) . await ;
244- esp_hal:: system:: software_reset ( ) ;
190+ #[ cfg( feature = "qa" ) ]
191+ crate :: qa:: send_qa_resp ( crate :: qa:: QaSignal :: WifiSetup ) ;
192+
193+ let conn_settings: ConnSettings = wifi_res
194+ . data
195+ . take ( )
196+ . and_then ( |d| serde_json:: from_value ( d) . ok ( ) )
197+ . unwrap_or_default ( ) ;
198+
199+ let mut parse_retry_count = 0 ;
200+ let ws_url = loop {
201+ let url = if conn_settings. mdns || conn_settings. ws_url . is_none ( ) || parse_retry_count > 0 {
202+ log:: info!( "Starting mdns lookup..." ) ;
203+ global_state. state . lock ( ) . await . scene = Scene :: MdnsWait ;
204+ let mdns_res = mdns:: mdns_query ( wifi_res. sta_stack ) . await ;
205+ log:: info!( "Mdns result: {mdns_res:?}" ) ;
206+
207+ mdns_res. to_string ( )
208+ } else {
209+ conn_settings. ws_url . clone ( ) . unwrap_or_default ( )
245210 } ;
246211
247- #[ cfg( feature = "qa" ) ]
248- crate :: qa:: send_qa_resp ( crate :: qa:: QaSignal :: WifiSetup ) ;
249-
250- let conn_settings: ConnSettings = wifi_res
251- . data
252- . take ( )
253- . and_then ( |d| serde_json:: from_value ( d) . ok ( ) )
254- . unwrap_or_default ( ) ;
255-
256- let mut parse_retry_count = 0 ;
257- let ws_url = loop {
258- let url =
259- if conn_settings. mdns || conn_settings. ws_url . is_none ( ) || parse_retry_count > 0 {
260- log:: info!( "Starting mdns lookup..." ) ;
261- global_state. state . lock ( ) . await . scene = Scene :: MdnsWait ;
262- let mdns_res = mdns:: mdns_query ( wifi_res. sta_stack ) . await ;
263- log:: info!( "Mdns result: {mdns_res:?}" ) ;
264-
265- mdns_res. to_string ( )
266- } else {
267- conn_settings. ws_url . clone ( ) . unwrap_or_default ( )
268- } ;
269-
270- let ws_url = WsUrl :: from_str ( & url) ;
271- match ws_url {
272- Some ( ws_url) => break WsUrlOwned :: new ( & ws_url) ,
273- None => {
274- parse_retry_count += 1 ;
275- log:: error!( "Mdns parse failed! Retry ({parse_retry_count}).." ) ;
212+ let ws_url = WsUrl :: from_str ( & url) ;
213+ match ws_url {
214+ Some ( ws_url) => break WsUrlOwned :: new ( & ws_url) ,
215+ None => {
216+ parse_retry_count += 1 ;
217+ log:: error!( "Mdns parse failed! Retry ({parse_retry_count}).." ) ;
218+ Timer :: after_millis ( 1000 ) . await ;
219+ if parse_retry_count > 3 {
220+ log:: error!( "Cannot parse wsurl! Reseting wifi configuration!" ) ;
221+ _ = nvs. invalidate_key ( WIFI_NVS_KEY ) . await ;
276222 Timer :: after_millis ( 1000 ) . await ;
277- if parse_retry_count > 3 {
278- log:: error!( "Cannot parse wsurl! Reseting wifi configuration!" ) ;
279- _ = nvs. invalidate_key ( WIFI_NVS_KEY ) . await ;
280- Timer :: after_millis ( 1000 ) . await ;
281223
282- esp_hal:: system:: software_reset ( ) ;
283- }
284-
285- continue ;
224+ esp_hal:: system:: software_reset ( ) ;
286225 }
287- }
288- } ;
289226
290- utils:: backtrace_store:: read_saved_backtrace ( ) . await ;
291- // TODO: test disable usb
292- /*
293- esp_hal::gpio::Input::new(
294- board.usb_dp,
295- esp_hal::gpio::InputConfig::default().with_pull(esp_hal::gpio::Pull::None),
296- );
297- esp_hal::gpio::Input::new(
298- board.usb_dm,
299- esp_hal::gpio::InputConfig::default().with_pull(esp_hal::gpio::Pull::None),
300- );
301- */
302-
303- let ws_sleep_sig = Rc :: new ( Signal :: new ( ) ) ;
304- spawner. must_spawn ( ws:: ws_task (
305- wifi_res. sta_stack ,
306- ws_url,
307- global_state. clone ( ) ,
308- ws_sleep_sig. clone ( ) ,
309- ) ) ;
310- spawner. must_spawn ( logger_task ( global_state. clone ( ) ) ) ;
311-
312- let ble_sleep_sig = Rc :: new ( Signal :: new ( ) ) ;
313- spawner. must_spawn ( bluetooth:: bluetooth_timer_task (
314- wifi_res. wifi_init ,
315- board. bt ,
316- global_state. clone ( ) ,
317- ble_sleep_sig. clone ( ) ,
318- ) ) ;
319-
320- set_brownout_detection ( true ) ;
321- global_state. state . lock ( ) . await . scene = Scene :: WaitingForCompetitor ;
322- if let Some ( saved_state) = SavedGlobalState :: from_nvs ( & nvs) . await {
323- global_state
324- . state
325- . lock ( )
326- . await
327- . parse_saved_state ( saved_state) ;
227+ continue ;
228+ }
328229 }
230+ } ;
329231
330- let mut last_sleep = false ;
331- loop {
332- Timer :: after_millis ( 100 ) . await ;
333- if sleep_state ( ) != last_sleep {
334- last_sleep = sleep_state ( ) ;
335- ws_sleep_sig. signal ( last_sleep) ;
336- ble_sleep_sig. signal ( last_sleep) ;
337-
338- match last_sleep {
339- true => {
340- unsafe { crate :: state:: TRUST_SERVER = false } ;
341- wifi_res. stop_radio ( )
342- }
343- false => wifi_res. restart_radio ( ) ,
232+ utils:: backtrace_store:: read_saved_backtrace ( ) . await ;
233+ // TODO: test disable usb
234+ /*
235+ esp_hal::gpio::Input::new(
236+ board.usb_dp,
237+ esp_hal::gpio::InputConfig::default().with_pull(esp_hal::gpio::Pull::None),
238+ );
239+ esp_hal::gpio::Input::new(
240+ board.usb_dm,
241+ esp_hal::gpio::InputConfig::default().with_pull(esp_hal::gpio::Pull::None),
242+ );
243+ */
244+
245+ let ws_sleep_sig = Rc :: new ( Signal :: new ( ) ) ;
246+ spawner. must_spawn ( ws:: ws_task (
247+ wifi_res. sta_stack ,
248+ ws_url,
249+ global_state. clone ( ) ,
250+ ws_sleep_sig. clone ( ) ,
251+ ) ) ;
252+ spawner. must_spawn ( logger_task ( global_state. clone ( ) ) ) ;
253+
254+ let ble_sleep_sig = Rc :: new ( Signal :: new ( ) ) ;
255+ spawner. must_spawn ( bluetooth:: bluetooth_timer_task (
256+ wifi_res. wifi_init ,
257+ board. bt ,
258+ global_state. clone ( ) ,
259+ ble_sleep_sig. clone ( ) ,
260+ ) ) ;
261+
262+ set_brownout_detection ( true ) ;
263+ global_state. state . lock ( ) . await . scene = Scene :: WaitingForCompetitor ;
264+ if let Some ( saved_state) = SavedGlobalState :: from_nvs ( & nvs) . await {
265+ global_state
266+ . state
267+ . lock ( )
268+ . await
269+ . parse_saved_state ( saved_state) ;
270+ }
271+
272+ let mut last_sleep = false ;
273+ loop {
274+ Timer :: after_millis ( 100 ) . await ;
275+ if sleep_state ( ) != last_sleep {
276+ last_sleep = sleep_state ( ) ;
277+ ws_sleep_sig. signal ( last_sleep) ;
278+ ble_sleep_sig. signal ( last_sleep) ;
279+
280+ match last_sleep {
281+ true => {
282+ unsafe { crate :: state:: TRUST_SERVER = false } ;
283+ wifi_res. stop_radio ( )
344284 }
285+ false => wifi_res. restart_radio ( ) ,
345286 }
346287 }
347288 }
@@ -384,25 +325,3 @@ async fn logger_task(global_state: GlobalState) {
384325 }
385326 }
386327}
387-
388- #[ cfg( feature = "esp_now" ) ]
389- #[ embassy_executor:: task]
390- async fn bc_test_task ( mut tx : EspNowSender < ' static > , manager : EspNowManager < ' static > ) {
391- let mut counter = 0u128 ;
392- loop {
393- manager
394- . add_peer ( esp_wifi:: esp_now:: PeerInfo {
395- peer_address : * ESP_NOW_DST ,
396- lmk : None ,
397- channel : None ,
398- encrypt : false ,
399- } )
400- . expect ( "EXPERIMENT" ) ;
401-
402- let r = tx. send_async ( ESP_NOW_DST , & counter. to_be_bytes ( ) ) . await ;
403- manager. remove_peer ( ESP_NOW_DST ) . expect ( "EXPERIMENT" ) ;
404-
405- counter += 1 ;
406- Timer :: after_millis ( 1000 ) . await ;
407- }
408- }
0 commit comments