@@ -18,7 +18,7 @@ use crate::{
1818
1919pub struct EspModem < ' d , T >
2020where
21- T : BorrowMut < UartDriver < ' d > > ,
21+ T : BorrowMut < UartDriver < ' d > > + Send ,
2222{
2323 serial : T ,
2424 status : Arc < mutex:: Mutex < ModemDriverStatus > > ,
5959 self . netif. handle( ) as * mut core:: ffi:: c_void,
6060 )
6161 } ) ?;
62- esp ! ( unsafe {
63- esp_event_handler_register(
64- NETIF_PPP_STATUS ,
65- ESP_EVENT_ANY_ID as _,
66- Some ( Self :: raw_on_ppp_changed) ,
67- self . netif. handle( ) as * mut core:: ffi:: c_void,
68- )
69- } ) ?;
62+
7063 let ( mut tx, rx) = self . serial . borrow_mut ( ) . split ( ) ;
7164 let driver = EspNetifDriver :: new_nonstatic (
7265 & mut self . netif ,
@@ -201,23 +194,21 @@ where
201194 ) {
202195 Self :: on_ip_event ( event_id as _ , event_data)
203196 }
197+ }
204198
205- fn on_ppp_changed ( event_id : u32 , _event_data : * mut :: core:: ffi:: c_void ) {
206- use log:: info;
207- info ! ( "Got event id ppp changed: {}" , event_id) ;
208-
209- if event_id == esp_netif_ppp_status_event_t_NETIF_PPP_ERRORUSER {
210- info ! ( "user interrupted event from netif" ) ;
211- }
212- }
213-
214- unsafe extern "C" fn raw_on_ppp_changed (
215- _event_handler_arg : * mut :: core:: ffi:: c_void ,
216- _event_base : esp_event_base_t ,
217- event_id : i32 ,
218- event_data : * mut :: core:: ffi:: c_void ,
219- ) {
220- Self :: on_ppp_changed ( event_id as _ , event_data)
199+ impl < ' d , T > Drop for EspModem < ' d , T >
200+ where
201+ T : BorrowMut < UartDriver < ' d > > + Send ,
202+ {
203+ fn drop ( & mut self ) {
204+ esp ! ( unsafe {
205+ esp_event_handler_unregister(
206+ IP_EVENT ,
207+ ESP_EVENT_ANY_ID as _,
208+ Some ( Self :: raw_on_ip_event) ,
209+ )
210+ } )
211+ . unwrap ( ) ;
221212 }
222213}
223214
@@ -278,7 +269,6 @@ pub mod sim {
278269 //!
279270 //! Models a modem device with a sim card able to serve as a
280271 //! network interface for the host.
281- use esp_idf_hal:: uart:: UartDriver ;
282272
283273 /// The generic device trait. Implementations of this trait should provide
284274 /// relevant AT commands and confirm the modem replies to drive the modem
@@ -288,7 +278,11 @@ pub mod sim {
288278 fn get_mode ( & self ) -> & CommunicationMode ;
289279
290280 /// Initialise the remote modem so that it is in PPPoS mode.
291- fn negotiate ( & mut self , comm : & mut UartDriver , buffer : [ u8 ; 64 ] ) -> Result < ( ) , ModemError > ;
281+ fn negotiate < T : embedded_svc:: io:: Write + embedded_svc:: io:: Read > (
282+ & mut self ,
283+ comm : & mut T ,
284+ buffer : [ u8 ; 64 ] ,
285+ ) -> Result < ( ) , ModemError > ;
292286 }
293287
294288 /// State of the modem.
@@ -337,7 +331,7 @@ pub mod sim {
337331 use core:: fmt:: Display ;
338332
339333 use at_commands:: { builder:: CommandBuilder , parser:: CommandParser } ;
340- use esp_idf_hal:: { delay:: TickType , uart:: UartDriver } ;
334+ use esp_idf_hal:: { delay:: TickType , io :: BufReader , uart:: UartDriver } ;
341335
342336 use super :: { CommunicationMode , ModemError , SimModem } ;
343337 pub struct SIM7600 ( CommunicationMode ) ;
@@ -483,32 +477,33 @@ pub mod sim {
483477 }
484478
485479 impl SimModem for SIM7600 {
486- fn negotiate (
480+ fn negotiate < T : embedded_svc :: io :: Write + embedded_svc :: io :: Read > (
487481 & mut self ,
488- comm : & mut UartDriver ,
482+ comm : & mut T ,
489483 mut buffer : [ u8 ; 64 ] ,
490484 ) -> Result < ( ) , ModemError > {
485+ let mut read_buf = BufReader :: new ( T ) ;
491486 reset ( comm, & mut buffer) ?;
492487
493- //disable echo
494- set_echo ( comm, & mut buffer, false ) ?;
488+ // // disable echo
489+ // set_echo(comm, &mut buffer, false)?;
495490
496- // get signal quality
497- let ( rssi, ber) = get_signal_quality ( comm, & mut buffer) ?;
498- log:: info!( "RSSI = {rssi}" ) ;
499- log:: info!( "BER = {ber}" ) ;
500- // get iccid
501- let iccid = get_iccid ( comm, & mut buffer) ?;
502- log:: info!( "ICCID = [{}]" , iccid) ;
491+ // // get signal quality
492+ // let (rssi, ber) = get_signal_quality(comm, &mut buffer)?;
493+ // log::info!("RSSI = {rssi}");
494+ // log::info!("BER = {ber}");
495+ // // get iccid
496+ // let iccid = get_iccid(comm, &mut buffer)?;
497+ // log::info!("ICCID = [{}]", iccid);
503498
504- // check pdp network reg
505- read_gprs_registration_status ( comm, & mut buffer) ?;
499+ // // check pdp network reg
500+ // read_gprs_registration_status(comm, &mut buffer)?;
506501
507- //configure apn
508- set_pdp_context ( comm, & mut buffer) ?;
502+ // // configure apn
503+ // set_pdp_context(comm, &mut buffer)?;
509504
510- // start ppp
511- set_data_mode ( comm, & mut buffer) ?;
505+ // // start ppp
506+ // set_data_mode(comm, &mut buffer)?;
512507
513508 self . 0 = CommunicationMode :: Data ;
514509 Ok ( ( ) )
@@ -570,105 +565,108 @@ pub mod sim {
570565 Ok ( heapless:: String :: try_from ( ccid) . unwrap ( ) )
571566 }
572567
573- fn reset ( comm : & mut UartDriver , buff : & mut [ u8 ] ) -> Result < ( ) , ModemError > {
568+ fn reset < T : embedded_svc:: io:: Write + embedded_svc:: io:: Read > (
569+ comm : & mut T ,
570+ buff : & mut [ u8 ] ,
571+ ) -> Result < ( ) , ModemError > {
574572 let cmd = CommandBuilder :: create_execute ( buff, false )
575573 . named ( "ATZ0" )
576574 . finish ( ) ?;
577575 log:: info!( "Send Reset" ) ;
578576
579577 comm. write ( cmd) . map_err ( |_| ModemError :: IO ) ?;
580578
581- let len = comm
582- . read ( buff, TickType :: new_millis ( 1000 ) . ticks ( ) )
583- . map_err ( |_| ModemError :: IO ) ?;
584- log:: info!( "got response{:?}" , std:: str :: from_utf8( & buff[ ..len] ) ) ;
585- CommandParser :: parse ( & buff[ ..len] )
586- . expect_identifier ( b"ATZ0\r " )
587- . expect_identifier ( b"\r \n OK\r \n " )
588- . finish ( ) ?;
589- Ok ( ( ) )
590- }
591-
592- fn set_echo ( comm : & mut UartDriver , buff : & mut [ u8 ] , echo : bool ) -> Result < ( ) , ModemError > {
593- let cmd = CommandBuilder :: create_execute ( buff, false )
594- . named ( format ! ( "ATE{}" , i32 :: from( echo) ) )
595- . finish ( ) ?;
596- log:: info!( "Set echo " ) ;
597- comm. write ( cmd) . map_err ( |_| ModemError :: IO ) ?;
598- let len = comm
599- . read ( buff, TickType :: new_millis ( 1000 ) . ticks ( ) )
600- . map_err ( |_| ModemError :: IO ) ?;
601- log:: info!( "got response{:?}" , std:: str :: from_utf8( & buff[ ..len] ) ) ;
602-
603- CommandParser :: parse ( & buff[ ..len] )
604- . expect_identifier ( b"ATE0\r " )
605- . expect_identifier ( b"\r \n OK\r \n " )
606- . finish ( ) ?;
607- Ok ( ( ) )
608- }
609-
610- fn read_gprs_registration_status (
611- comm : & mut UartDriver ,
612- buff : & mut [ u8 ] ,
613- ) -> Result < ( i32 , i32 , Option < i32 > , Option < i32 > ) , ModemError > {
614- let cmd = CommandBuilder :: create_query ( buff, true )
615- . named ( "+CGREG" )
616- . finish ( ) ?;
617- log:: info!( "Get Registration Status" ) ;
618- comm. write ( cmd) . map_err ( |_| ModemError :: IO ) ?;
619- let len = comm
620- . read ( buff, TickType :: new_millis ( 1000 ) . ticks ( ) )
621- . map_err ( |_| ModemError :: IO ) ?;
622- log:: info!( "got response{:?}" , std:: str :: from_utf8( & buff[ ..len] ) ) ;
623-
624- Ok ( CommandParser :: parse ( & buff[ ..len] )
625- . expect_identifier ( b"\r \n +CGREG: " )
626- . expect_int_parameter ( )
627- . expect_int_parameter ( )
628- . expect_optional_int_parameter ( )
629- . expect_optional_int_parameter ( )
630- . expect_identifier ( b"\r \n \r \n OK\r \n " )
631- . finish ( ) ?)
632- }
633-
634- fn set_pdp_context ( comm : & mut UartDriver , buff : & mut [ u8 ] ) -> Result < ( ) , ModemError > {
635- let cmd = CommandBuilder :: create_set ( buff, true )
636- . named ( "+CGDCONT" )
637- . with_int_parameter ( 1 ) // context id
638- . with_string_parameter ( "IP" ) // pdp type
639- . with_string_parameter ( "flolive.net" ) // apn
640- . finish ( ) ?;
641- log:: info!( "Set PDP Context" ) ;
642- comm. write ( cmd) . map_err ( |_| ModemError :: IO ) ?;
643- let len = comm
644- . read ( buff, TickType :: new_millis ( 1000 ) . ticks ( ) )
645- . map_err ( |_| ModemError :: IO ) ?;
646- log:: info!( "got response{:?}" , std:: str :: from_utf8( & buff[ ..len] ) ) ;
647-
648- CommandParser :: parse ( & buff[ ..len] )
649- . expect_identifier ( b"\r \n OK\r \n " )
650- . finish ( ) ?;
579+ // let len = comm
580+ // .read(buff, TickType::new_millis(1000).ticks())
581+ // .map_err(|_| ModemError::IO)?;
582+ // log::info!("got response{:?}", std::str::from_utf8(&buff[..len]));
583+ // CommandParser::parse(&buff[..len])
584+ // .expect_identifier(b"ATZ0\r")
585+ // .expect_identifier(b"\r\nOK\r\n")
586+ // .finish()?;
651587 Ok ( ( ) )
652588 }
653589
654- fn set_data_mode ( comm : & mut UartDriver , buff : & mut [ u8 ] ) -> Result < ( ) , ModemError > {
655- let cmd = CommandBuilder :: create_execute ( buff, false )
656- . named ( "ATD*99#" )
657- . finish ( ) ?;
658- log:: info!( "Set Data mode" ) ;
659- comm. write ( cmd) . map_err ( |_| ModemError :: IO ) ?;
660- let len = comm
661- . read ( buff, TickType :: new_millis ( 1000 ) . ticks ( ) )
662- . map_err ( |_| ModemError :: IO ) ?;
663- log:: info!( "got response{:?}" , std:: str :: from_utf8( & buff[ ..len] ) ) ;
664-
665- let ( connect_parm, ) = CommandParser :: parse ( & buff[ ..len] )
666- . expect_identifier ( b"\r \n CONNECT " )
667- . expect_optional_raw_string ( )
668- . expect_identifier ( b"\r \n " )
669- . finish ( ) ?;
670- log:: info!( "connect {:?}" , connect_parm) ;
671- Ok ( ( ) )
672- }
590+ // fn set_echo(comm: &mut UartDriver, buff: &mut [u8], echo: bool) -> Result<(), ModemError> {
591+ // let cmd = CommandBuilder::create_execute(buff, false)
592+ // .named(format!("ATE{}", i32::from(echo)))
593+ // .finish()?;
594+ // log::info!("Set echo ");
595+ // comm.write(cmd).map_err(|_| ModemError::IO)?;
596+ // let len = comm
597+ // .read(buff, TickType::new_millis(1000).ticks())
598+ // .map_err(|_| ModemError::IO)?;
599+ // log::info!("got response{:?}", std::str::from_utf8(&buff[..len]));
600+
601+ // CommandParser::parse(&buff[..len])
602+ // .expect_identifier(b"ATE0\r")
603+ // .expect_identifier(b"\r\nOK\r\n")
604+ // .finish()?;
605+ // Ok(())
606+ // }
607+
608+ // fn read_gprs_registration_status(
609+ // comm: &mut UartDriver,
610+ // buff: &mut [u8],
611+ // ) -> Result<(i32, i32, Option<i32>, Option<i32>), ModemError> {
612+ // let cmd = CommandBuilder::create_query(buff, true)
613+ // .named("+CGREG")
614+ // .finish()?;
615+ // log::info!("Get Registration Status");
616+ // comm.write(cmd).map_err(|_| ModemError::IO)?;
617+ // let len = comm
618+ // .read(buff, TickType::new_millis(1000).ticks())
619+ // .map_err(|_| ModemError::IO)?;
620+ // log::info!("got response{:?}", std::str::from_utf8(&buff[..len]));
621+
622+ // Ok(CommandParser::parse(&buff[..len])
623+ // .expect_identifier(b"\r\n+CGREG: ")
624+ // .expect_int_parameter()
625+ // .expect_int_parameter()
626+ // .expect_optional_int_parameter()
627+ // .expect_optional_int_parameter()
628+ // .expect_identifier(b"\r\n\r\nOK\r\n")
629+ // .finish()?)
630+ // }
631+
632+ // fn set_pdp_context(comm: &mut UartDriver, buff: &mut [u8]) -> Result<(), ModemError> {
633+ // let cmd = CommandBuilder::create_set(buff, true)
634+ // .named("+CGDCONT")
635+ // .with_int_parameter(1) // context id
636+ // .with_string_parameter("IP") // pdp type
637+ // .with_string_parameter("flolive.net") // apn
638+ // .finish()?;
639+ // log::info!("Set PDP Context");
640+ // comm.write(cmd).map_err(|_| ModemError::IO)?;
641+ // let len = comm
642+ // .read(buff, TickType::new_millis(1000).ticks())
643+ // .map_err(|_| ModemError::IO)?;
644+ // log::info!("got response{:?}", std::str::from_utf8(&buff[..len]));
645+
646+ // CommandParser::parse(&buff[..len])
647+ // .expect_identifier(b"\r\nOK\r\n")
648+ // .finish()?;
649+ // Ok(())
650+ // }
651+
652+ // fn set_data_mode(comm: &mut UartDriver, buff: &mut [u8]) -> Result<(), ModemError> {
653+ // let cmd = CommandBuilder::create_execute(buff, false)
654+ // .named("ATD*99#")
655+ // .finish()?;
656+ // log::info!("Set Data mode");
657+ // comm.write(cmd).map_err(|_| ModemError::IO)?;
658+ // let len = comm
659+ // .read(buff, TickType::new_millis(1000).ticks())
660+ // .map_err(|_| ModemError::IO)?;
661+ // log::info!("got response{:?}", std::str::from_utf8(&buff[..len]));
662+
663+ // let (connect_parm,) = CommandParser::parse(&buff[..len])
664+ // .expect_identifier(b"\r\nCONNECT ")
665+ // .expect_optional_raw_string()
666+ // .expect_identifier(b"\r\n")
667+ // .finish()?;
668+ // log::info!("connect {:?}", connect_parm);
669+ // Ok(())
670+ // }
673671 }
674672}
0 commit comments