Skip to content

Commit 6c55b0b

Browse files
author
Dane Slattery
committed
Stash changes to modem.rs
1 parent 09dac2b commit 6c55b0b

File tree

4 files changed

+145
-137
lines changed

4 files changed

+145
-137
lines changed

.cargo/config.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
[build]
2-
target = "riscv32imc-esp-espidf"
2+
# target = "riscv32imc-esp-espidf"
33
#target = "xtensa-esp32-espidf"
4+
target = "xtensa-esp32s3-espidf"
45

56
[target.xtensa-esp32-espidf]
67
linker = "ldproxy"

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ log = { version = "0.4", default-features = false }
5151
uncased = { version = "0.9.7", default-features = false }
5252
embedded-hal-async = { version = "1", default-features = false }
5353
embedded-svc = { version = "0.28", default-features = false }
54-
esp-idf-hal = { version = "0.44", default-features = false }
54+
# esp-idf-hal = { version = "0.44", default-features = false }
55+
esp-idf-hal ={path = "../esp-idf-hal"}
5556
embassy-time-driver = { version = "0.1", optional = true, features = [
5657
"tick-hz-1_000_000",
5758
] }

espflash.toml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,9 @@
11
partition_table = "partitions.csv"
2+
3+
[connection]
4+
5+
[[usb_device]]
6+
vid = "303a"
7+
pid = "1001"
8+
9+
[flash]

src/modem.rs

Lines changed: 133 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use crate::{
1818

1919
pub struct EspModem<'d, T>
2020
where
21-
T: BorrowMut<UartDriver<'d>>,
21+
T: BorrowMut<UartDriver<'d>> + Send,
2222
{
2323
serial: T,
2424
status: Arc<mutex::Mutex<ModemDriverStatus>>,
@@ -59,14 +59,7 @@ where
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\nOK\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\nOK\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\nOK\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\nOK\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\nCONNECT ")
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

Comments
 (0)