@@ -190,6 +190,25 @@ async fn ws_loop(
190190 . send ( WsFrameOwned :: Ping ( alloc:: vec:: Vec :: new ( ) ) )
191191 . await ;
192192
193+ #[ cfg( feature = "auto_add" ) ]
194+ {
195+ if !global_state
196+ . state
197+ . lock ( )
198+ . await
199+ . device_added
200+ . unwrap_or ( false )
201+ {
202+ crate :: ws:: send_packet ( crate :: structs:: TimerPacket {
203+ tag : None ,
204+ data : crate :: structs:: TimerPacketInner :: Add {
205+ firmware : alloc:: string:: ToString :: to_string ( crate :: version:: FIRMWARE ) ,
206+ } ,
207+ } )
208+ . await ;
209+ }
210+ }
211+
193212 loop {
194213 let res = ws_rw (
195214 & mut rx_framer,
@@ -216,29 +235,46 @@ async fn ws_loop(
216235 }
217236}
218237
238+ #[ derive( Debug ) ]
239+ #[ allow( dead_code) ]
240+ enum WsRwError {
241+ OtaError ( esp_hal_ota:: OtaError ) ,
242+ TaggedPublisherError ,
243+ SocketWriteError ,
244+ SocketReadError ,
245+ Other ,
246+ }
247+
219248async fn ws_rw (
220249 framer_rx : & mut WsRxFramer < ' _ > ,
221250 framer_tx : & mut WsTxFramer < ' _ > ,
222251 global_state : GlobalState ,
223252 socket : & mut WsSocket < ' _ , ' _ > ,
224- ) -> Result < ( ) , ( ) > {
225- let mut ota = Ota :: new ( FlashStorage :: new ( ) ) . map_err ( |_| ( ) ) ?;
226- let tagged_publisher = TAGGED_RETURN . publisher ( ) . map_err ( |_| ( ) ) ?;
253+ ) -> Result < ( ) , WsRwError > {
254+ let mut ota = Ota :: new ( FlashStorage :: new ( ) ) . map_err ( WsRwError :: OtaError ) ?;
255+ let tagged_publisher = TAGGED_RETURN
256+ . publisher ( )
257+ . map_err ( |_| WsRwError :: TaggedPublisherError ) ?;
227258 let recv = FRAME_CHANNEL . receiver ( ) ;
228259
229260 loop {
230261 let read_fut = socket. read ( framer_rx. mut_buf ( ) ) ;
231262 let write_fut = recv. receive ( ) ;
232263
233264 let n = match embassy_futures:: select:: select ( read_fut, write_fut) . await {
234- embassy_futures:: select:: Either :: First ( read_res) => read_res,
265+ embassy_futures:: select:: Either :: First ( read_res) => {
266+ read_res. map_err ( |_| WsRwError :: SocketReadError )
267+ }
235268 embassy_futures:: select:: Either :: Second ( write_frame) => {
236269 let mut offset = 0 ;
237270 let frame_ref = write_frame. into_ref ( ) ;
238271
239272 loop {
240273 let ( data, finish) = framer_tx. partial_frame ( & frame_ref, & mut offset) ;
241- socket. write_all ( data) . await . map_err ( |_| ( ) ) ?;
274+ socket
275+ . write_all ( data)
276+ . await
277+ . map_err ( |_| WsRwError :: SocketWriteError ) ?;
242278 if !finish {
243279 break ;
244280 }
@@ -252,7 +288,7 @@ async fn ws_rw(
252288
253289 if n == 0 {
254290 log:: warn!( "read_n: 0" ) ;
255- return Err ( ( ) ) ;
291+ return Err ( WsRwError :: Other ) ;
256292 }
257293
258294 framer_rx. revolve_write_offset ( n) ;
@@ -315,7 +351,7 @@ async fn ws_rw(
315351
316352 log:: info!( "Start update: {firmware}/{version}" ) ;
317353 log:: info!( "Begin update size: {size} crc: {crc}" ) ;
318- ota. ota_begin ( size, crc) . map_err ( |_| ( ) ) ?;
354+ ota. ota_begin ( size, crc) . map_err ( WsRwError :: OtaError ) ?;
319355 unsafe {
320356 crate :: state:: OTA_STATE = true ;
321357 }
0 commit comments