11use at_commands:: { builder:: CommandBuilder , parser:: CommandParser } ;
22use atat:: { self , AtatCmd } ;
33use core:: { borrow:: BorrowMut , ffi:: c_void, marker:: PhantomData } ;
4- use esp_idf_hal:: { delay:: TickType , uart:: UartDriver } ;
4+ use esp_idf_hal:: {
5+ delay:: { TickType , BLOCK } ,
6+ uart:: { UartDriver , UartTxDriver } ,
7+ } ;
58
69use crate :: {
710 handle:: RawHandle ,
8- netif:: { EspNetif , NetifStack } ,
11+ netif:: { EspNetif , EspNetifDriver , NetifStack } ,
912 sys:: * ,
1013} ;
1114
12- pub struct PppNetif < ' d , T >
13- where
14- T : BorrowMut < UartDriver < ' d > > ,
15- {
16- serial : T ,
17- base : esp_netif_driver_base_t ,
18- netif : EspNetif ,
19- _d : PhantomData < & ' d ( ) > ,
20- }
21-
22- impl < ' d , T > PppNetif < ' d , T >
23- where
24- T : BorrowMut < UartDriver < ' d > > ,
25- {
26- pub fn new ( serial : T ) -> Result < Self , EspError > {
27- let netif = EspNetif :: new ( NetifStack :: Ppp ) ?;
28- let mut base = esp_netif_driver_base_t {
29- netif : netif. handle ( ) ,
30- post_attach : Some ( Self :: post_attach) ,
31- } ;
32- let base_ptr: * mut c_void = & mut base as * mut _ as * mut c_void ;
33- esp ! ( unsafe { esp_netif_attach( netif. handle( ) , base_ptr) } ) ?;
34- Ok ( Self {
35- serial,
36- netif,
37- base,
38- _d : PhantomData ,
39- } )
40- }
41-
42- unsafe extern "C" fn post_attach ( netif : * mut esp_netif_obj , args : * mut c_void ) -> i32 {
43- let driver= unsafe { std:: ptr:: slice_from_raw_parts_mut ( args, size_of :: < ppp_netif_driver ( ) ) }
44- let ifconfig = esp_netif_driver_ifconfig_t { handle}
45- }
46- }
47-
4815pub struct EspModem < ' d , T >
4916where
5017 T : BorrowMut < UartDriver < ' d > > ,
5623
5724impl < ' d , T > EspModem < ' d , T >
5825where
59- T : BorrowMut < UartDriver < ' d > > ,
26+ T : BorrowMut < UartDriver < ' d > > + Send ,
6027{
6128 pub fn new ( serial : T ) -> Self {
6229 Self {
@@ -107,11 +74,27 @@ where
10774 self . set_data_mode ( ) ?;
10875
10976 // now in ppp mode.
110- // self.netif.
77+ let netif = EspNetif :: new ( NetifStack :: Ppp ) ?;
78+
79+ let ( mut tx, rx) = self . serial . borrow_mut ( ) . split ( ) ;
80+ let driver = EspNetifDriver :: new_ppp ( netif, move |x| Self :: tx ( & mut tx, x) ) ?;
81+
82+ let mut buff = [ 0u8 ; 64 ] ;
83+ loop {
84+ let len = rx. read ( & mut buff, BLOCK ) ?;
85+ if len > 0 {
86+ driver. rx ( & buff) ?;
87+ }
88+ }
11189
11290 Ok ( ( ) )
11391 }
11492
93+ fn tx ( writer : & mut UartTxDriver , data : & [ u8 ] ) -> Result < ( ) , EspError > {
94+ writer. write ( data) ?;
95+ Ok ( ( ) )
96+ }
97+
11598 fn get_signal_quality ( & mut self ) -> Result < ( ) , EspError > {
11699 let mut buff = [ 0u8 ; 64 ] ;
117100 let cmd = CommandBuilder :: create_execute ( & mut buff, true )
@@ -142,7 +125,7 @@ where
142125 let cmd = CommandBuilder :: create_execute ( & mut buff, false )
143126 . named ( "ATZ0" )
144127 . finish ( )
145- . unwrap ( ) ;
128+ . map_err ( |_w| EspError :: from_infallible :: < ESP_FAIL > ( ) ) ? ;
146129 self . serial . borrow_mut ( ) . write ( cmd) ?;
147130 let len = self
148131 . serial
@@ -153,7 +136,7 @@ where
153136 . expect_identifier ( b"ATZ0\r " )
154137 . expect_identifier ( b"\r \n OK\r \n " )
155138 . finish ( )
156- . unwrap ( ) ;
139+ . map_err ( |_w| EspError :: from_infallible :: < ESP_FAIL > ( ) ) ? ;
157140 Ok ( ( ) )
158141 }
159142
@@ -162,7 +145,7 @@ where
162145 let cmd = CommandBuilder :: create_execute ( & mut buff, false )
163146 . named ( format ! ( "ATE{}" , i32 :: from( echo) ) )
164147 . finish ( )
165- . unwrap ( ) ;
148+ . map_err ( |_w| EspError :: from_infallible :: < ESP_FAIL > ( ) ) ? ;
166149 self . serial . borrow_mut ( ) . write ( cmd) ?;
167150 let len = self
168151 . serial
@@ -174,7 +157,7 @@ where
174157 . expect_identifier ( b"ATE0\r " )
175158 . expect_identifier ( b"\r \n OK\r \n " )
176159 . finish ( )
177- . unwrap ( ) ;
160+ . map_err ( |_w| EspError :: from_infallible :: < ESP_FAIL > ( ) ) ? ;
178161 Ok ( ( ) )
179162 }
180163
@@ -183,7 +166,7 @@ where
183166 let cmd = CommandBuilder :: create_query ( & mut buff, true )
184167 . named ( "+CGREG" )
185168 . finish ( )
186- . unwrap ( ) ;
169+ . map_err ( |_w| EspError :: from_infallible :: < ESP_FAIL > ( ) ) ? ;
187170 self . serial . borrow_mut ( ) . write ( cmd) ?;
188171 let len = self
189172 . serial
@@ -199,7 +182,7 @@ where
199182 . expect_optional_int_parameter ( )
200183 . expect_identifier ( b"\r \n \r \n OK\r \n " )
201184 . finish ( )
202- . unwrap ( ) ;
185+ . map_err ( |_w| EspError :: from_infallible :: < ESP_FAIL > ( ) ) ? ;
203186 log:: info!(
204187 "CGREG: n: {}stat: {}, lac: {:?}, ci: {:?} " ,
205188 n,
@@ -216,9 +199,9 @@ where
216199 . named ( "+CGDCONT" )
217200 . with_int_parameter ( 1 ) // context id
218201 . with_string_parameter ( "IP" ) // pdp type
219- . with_string_parameter ( "internet" )
202+ . with_string_parameter ( "flowlive.net" ) // apn
220203 . finish ( )
221- . unwrap ( ) ;
204+ . map_err ( |_w| EspError :: from_infallible :: < ESP_FAIL > ( ) ) ? ;
222205 self . serial . borrow_mut ( ) . write ( cmd) ?;
223206 let len = self
224207 . serial
@@ -229,8 +212,7 @@ where
229212 CommandParser :: parse ( & buff[ ..len] )
230213 . expect_identifier ( b"\r \n OK\r \n " )
231214 . finish ( )
232- . unwrap ( ) ;
233-
215+ . map_err ( |_w| EspError :: from_infallible :: < ESP_FAIL > ( ) ) ?;
234216 Ok ( ( ) )
235217 }
236218
@@ -239,7 +221,7 @@ where
239221 let cmd = CommandBuilder :: create_execute ( & mut buff, false )
240222 . named ( "ATD*99#" )
241223 . finish ( )
242- . unwrap ( ) ;
224+ . map_err ( |_w| EspError :: from_infallible :: < ESP_FAIL > ( ) ) ? ;
243225 self . serial . borrow_mut ( ) . write ( cmd) ?;
244226 let len = self
245227 . serial
@@ -252,7 +234,7 @@ where
252234 . expect_optional_raw_string ( )
253235 . expect_identifier ( b"\r \n " )
254236 . finish ( )
255- . unwrap ( ) ;
237+ . map_err ( |_w| EspError :: from_infallible :: < ESP_FAIL > ( ) ) ? ;
256238 log:: info!( "connect {:?}" , connect_parm) ;
257239 Ok ( ( ) )
258240 }
0 commit comments