@@ -23,24 +23,58 @@ static TAGGED_RETURN: PubSubChannel<CriticalSectionRawMutex, (u64, TimerPacket),
2323
2424#[ embassy_executor:: task]
2525pub async fn ws_task ( stack : Stack < ' static > , ws_url : String , global_state : GlobalState ) {
26- let ws_url = WsUrl :: from_str ( & ws_url) . unwrap ( ) ;
27-
28- let mut rx_buffer = [ 0 ; 8192 ] ;
29- let mut tx_buffer = [ 0 ; 8192 ] ;
26+ let ws_url = WsUrl :: from_str ( & ws_url) . expect ( "Ws url parse error" ) ;
3027
28+ let mut rx_buf = [ 0 ; 8192 ] ;
29+ let mut tx_buf = [ 0 ; 8192 ] ;
3130 let mut ws_rx_buf = alloc:: vec![ 0 ; 8192 ] ;
3231 let mut ws_tx_buf = alloc:: vec![ 0 ; 8192 ] ;
3332
3433 // tls buffers
35- let mut read_record_buffer = alloc:: vec:: Vec :: new ( ) ;
36- let mut write_record_buffer = alloc:: vec:: Vec :: new ( ) ;
34+ let mut ssl_rx_buf = alloc:: vec:: Vec :: new ( ) ;
35+ let mut ssl_tx_buf = alloc:: vec:: Vec :: new ( ) ;
3736
3837 #[ cfg( feature = "esp32c3" ) ]
3938 if ws_url. secure {
40- read_record_buffer. resize ( 16640 , 0 ) ;
41- write_record_buffer. resize ( 16640 , 0 ) ;
39+ ssl_rx_buf. resize ( 16640 , 0 ) ;
40+ ssl_tx_buf. resize ( 16640 , 0 ) ;
41+ }
42+
43+ loop {
44+ let res = ws_loop (
45+ & global_state,
46+ & ws_url,
47+ stack,
48+ & mut rx_buf,
49+ & mut tx_buf,
50+ & mut ws_rx_buf,
51+ & mut ws_tx_buf,
52+ & mut ssl_rx_buf,
53+ & mut ssl_tx_buf,
54+ )
55+ . await ;
56+
57+ if let Err ( e) = res {
58+ log:: error!( "Ws_loop errored! {e:?}" ) ;
59+ }
60+
61+ Timer :: after_millis ( 500 ) . await ;
4262 }
63+ }
4364
65+ // TODO: maybe make less args?
66+ #[ allow( clippy:: too_many_arguments) ]
67+ async fn ws_loop (
68+ global_state : & GlobalState ,
69+ ws_url : & WsUrl < ' _ > ,
70+ stack : Stack < ' static > ,
71+ rx_buf : & mut [ u8 ] ,
72+ tx_buf : & mut [ u8 ] ,
73+ ws_rx_buf : & mut [ u8 ] ,
74+ ws_tx_buf : & mut [ u8 ] ,
75+ ssl_rx_buf : & mut [ u8 ] ,
76+ ssl_tx_buf : & mut [ u8 ] ,
77+ ) -> Result < ( ) , ( ) > {
4478 loop {
4579 {
4680 global_state. state . lock ( ) . await . server_connected = Some ( false ) ;
@@ -53,25 +87,25 @@ pub async fn ws_task(stack: Stack<'static>, ws_url: String, global_state: Global
5387 let res = dns_resolver
5488 . query ( ws_url. ip , embassy_net:: dns:: DnsQueryType :: A )
5589 . await ;
56- if let Err ( e) = res {
57- log:: error!( "[WS]Dns resolver error: {e:?}" ) ;
90+
91+ let Ok ( res) = res else {
92+ log:: error!(
93+ "[WS]Dns resolver error: {:?}" ,
94+ res. expect_err( "Shouldnt fail" )
95+ ) ;
5896 Timer :: after_millis ( 1000 ) . await ;
5997 continue ;
60- }
98+ } ;
6199
62- let res = res. unwrap ( ) ;
63- let first = res. first ( ) ;
64- if first. is_none ( ) {
100+ let Some ( IpAddress :: Ipv4 ( addr) ) = res. first ( ) else {
65101 log:: error!( "[WS]Dns resolver empty vec" ) ;
66102 Timer :: after_millis ( 1000 ) . await ;
67103 continue ;
68- }
69-
70- let IpAddress :: Ipv4 ( addr) = first. unwrap ( ) ;
104+ } ;
71105 * addr
72106 } ;
73107
74- let mut socket = TcpSocket :: new ( stack, & mut rx_buffer , & mut tx_buffer ) ;
108+ let mut socket = TcpSocket :: new ( stack, rx_buf , tx_buf ) ;
75109 socket. set_timeout ( Some ( embassy_time:: Duration :: from_secs ( 15 ) ) ) ;
76110
77111 let remote_endpoint = ( ip, ws_url. port ) ;
@@ -83,14 +117,14 @@ pub async fn ws_task(stack: Stack<'static>, ws_url: String, global_state: Global
83117 }
84118
85119 let mut socket = if ws_url. secure {
86- let mut tls =
87- TlsConnection :: new ( socket, & mut read_record_buffer, & mut write_record_buffer) ;
120+ let mut tls = TlsConnection :: new ( socket, ssl_rx_buf, ssl_tx_buf) ;
88121
89122 let config: TlsConfig < ' _ , Aes128GcmSha256 > =
90123 TlsConfig :: new ( ) . with_server_name ( ws_url. host ) ;
91124 tls. open :: < OsRng , NoVerify > ( TlsContext :: new ( & config, & mut OsRng ) )
92125 . await
93- . expect ( "error establishing TLS connection" ) ;
126+ . map_err ( |_| ( ) ) ?;
127+
94128 WsSocket :: Tls ( tls)
95129 } else {
96130 WsSocket :: Raw ( socket)
@@ -101,8 +135,8 @@ pub async fn ws_task(stack: Stack<'static>, ws_url: String, global_state: Global
101135 }
102136
103137 log:: info!( "connected!" ) ;
104- let mut tx_framer = WsTxFramer :: new ( true , & mut ws_tx_buf) ;
105- let mut rx_framer = WsRxFramer :: new ( & mut ws_rx_buf) ;
138+ let mut tx_framer = WsTxFramer :: new ( true , ws_tx_buf) ;
139+ let mut rx_framer = WsRxFramer :: new ( ws_rx_buf) ;
106140
107141 let path = alloc:: format!(
108142 "{}?id={}&ver={}&chip={}&firmware={}" ,
@@ -116,10 +150,10 @@ pub async fn ws_task(stack: Stack<'static>, ws_url: String, global_state: Global
116150 socket
117151 . write_all ( tx_framer. generate_http_upgrade ( ws_url. host , & path, None ) )
118152 . await
119- . unwrap ( ) ;
153+ . map_err ( |_| ( ) ) ? ;
120154
121155 loop {
122- let n = socket. read ( rx_framer. mut_buf ( ) ) . await . unwrap ( ) ;
156+ let n = socket. read ( rx_framer. mut_buf ( ) ) . await . map_err ( |_| ( ) ) ? ;
123157 let res = rx_framer. process_http_response ( n) ;
124158
125159 if let Some ( code) = res {
@@ -141,8 +175,8 @@ pub async fn ws_task(stack: Stack<'static>, ws_url: String, global_state: Global
141175 )
142176 . await ;
143177
144- if res . is_err ( ) {
145- log:: error!( "ws: reader or writer err! " ) ;
178+ if let Err ( e ) = res {
179+ log:: error!( "ws_rw_error: {e:?} " ) ;
146180 Timer :: after_millis ( WS_RETRY_MS ) . await ;
147181 break ;
148182 }
@@ -164,22 +198,16 @@ async fn ws_rw(
164198 let read_fut = tls. read ( framer_rx. mut_buf ( ) ) ;
165199 let write_fut = recv. receive ( ) ;
166200
167- let res = match embassy_futures:: select:: select ( read_fut, write_fut) . await {
201+ let n = match embassy_futures:: select:: select ( read_fut, write_fut) . await {
168202 embassy_futures:: select:: Either :: First ( read_res) => read_res,
169203 embassy_futures:: select:: Either :: Second ( write_frame) => {
170204 let data = framer_tx. frame ( write_frame. into_ref ( ) ) ;
171205 tls. write_all ( data) . await . map_err ( |_| ( ) ) ?;
172206
173207 continue ;
174208 }
175- } ;
176-
177- if let Err ( e) = res {
178- log:: error!( "ws_read: {e:?}" ) ;
179- return Err ( ( ) ) ;
180- }
209+ } ?;
181210
182- let n = res. unwrap ( ) ;
183211 if n == 0 {
184212 log:: warn!( "read_n: 0" ) ;
185213 return Err ( ( ) ) ;
0 commit comments