Skip to content

Commit 7801c39

Browse files
author
Dane Slattery
committed
Use EspNetifDriver and adjust lifetimes. Currently segfaults.
1 parent 48c6fe1 commit 7801c39

File tree

3 files changed

+51
-64
lines changed

3 files changed

+51
-64
lines changed

examples/lte_modem.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ fn main() -> anyhow::Result<()> {
2929
let nvs = EspDefaultNvsPartition::take()?;
3030
let serial = peripherals.uart2;
3131
let tx = peripherals.pins.gpio17;
32-
let rx = peripherals.pins.gpio16;
32+
let rx = peripherals.pins.gpio18;
3333
let mut serial = UartDriver::new(
3434
serial,
3535
tx,
@@ -42,7 +42,7 @@ fn main() -> anyhow::Result<()> {
4242
},
4343
)?;
4444
log::error!("Hello");
45-
let mut modem = EspModem::new(&mut serial)?;
45+
let mut modem = EspModem::new(&mut serial);
4646

4747
match modem.setup_data_mode() {
4848
Err(x) => log::error!("Error: {:?}", x),

src/modem.rs

Lines changed: 34 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,17 @@
11
use at_commands::{builder::CommandBuilder, parser::CommandParser};
22
use atat::{self, AtatCmd};
33
use 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

69
use 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-
4815
pub struct EspModem<'d, T>
4916
where
5017
T: BorrowMut<UartDriver<'d>>,
@@ -56,7 +23,7 @@ where
5623

5724
impl<'d, T> EspModem<'d, T>
5825
where
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\nOK\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\nOK\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\nOK\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\nOK\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
}

src/netif.rs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -873,20 +873,22 @@ where
873873
#[cfg(feature = "alloc")]
874874
mod driver {
875875
use core::borrow::Borrow;
876+
use core::marker::PhantomData;
876877

877878
use crate::handle::RawHandle;
878879
use crate::sys::*;
879880

880881
use super::EspNetif;
881882

882-
pub struct EspNetifDriver<T>
883+
pub struct EspNetifDriver<'d, T>
883884
where
884885
T: Borrow<EspNetif>,
885886
{
886-
inner: alloc::boxed::Box<EspNetifDriverInner<T>>,
887+
inner: alloc::boxed::Box<EspNetifDriverInner<'d, T>>,
888+
_d: PhantomData<&'d ()>,
887889
}
888890

889-
impl<T> EspNetifDriver<T>
891+
impl<'d, T> EspNetifDriver<'d, T>
890892
where
891893
T: Borrow<EspNetif>,
892894
{
@@ -900,7 +902,7 @@ mod driver {
900902
#[cfg(esp_idf_lwip_ppp_support)]
901903
pub fn new_ppp<F>(netif: T, tx: F) -> Result<Self, EspError>
902904
where
903-
F: FnMut(&[u8]) -> Result<(), EspError> + Send + 'static,
905+
F: FnMut(&[u8]) -> Result<(), EspError> + Send + 'd,
904906
{
905907
Self::new(
906908
netif,
@@ -950,7 +952,7 @@ mod driver {
950952
tx: F,
951953
) -> Result<Self, EspError>
952954
where
953-
F: FnMut(&[u8]) -> Result<(), EspError> + Send + 'static,
955+
F: FnMut(&[u8]) -> Result<(), EspError> + Send + 'd,
954956
P: FnMut(&EspNetif) -> Result<(), EspError> + Send + 'static,
955957
{
956958
let mut inner = alloc::boxed::Box::new(EspNetifDriverInner {
@@ -1000,7 +1002,10 @@ mod driver {
10001002
);
10011003
}
10021004

1003-
Ok(Self { inner })
1005+
Ok(Self {
1006+
inner,
1007+
_d: PhantomData,
1008+
})
10041009
}
10051010

10061011
/// Ingest a packet into the driver.
@@ -1018,7 +1023,7 @@ mod driver {
10181023
}
10191024
}
10201025

1021-
impl<T> Drop for EspNetifDriver<T>
1026+
impl<'d, T> Drop for EspNetifDriver<'d, T>
10221027
where
10231028
T: Borrow<EspNetif>,
10241029
{
@@ -1057,7 +1062,7 @@ mod driver {
10571062
}
10581063

10591064
#[repr(C)]
1060-
struct EspNetifDriverInner<T>
1065+
struct EspNetifDriverInner<'d, T>
10611066
where
10621067
T: Borrow<EspNetif>,
10631068
{
@@ -1066,12 +1071,12 @@ mod driver {
10661071
got_ip_event_id: Option<i32>,
10671072
lost_ip_event_id: Option<i32>,
10681073
#[allow(clippy::type_complexity)]
1069-
tx: alloc::boxed::Box<dyn FnMut(&[u8]) -> Result<(), EspError>>,
1074+
tx: alloc::boxed::Box<dyn FnMut(&[u8]) -> Result<(), EspError> + 'd>,
10701075
#[allow(clippy::type_complexity)]
10711076
post_attach_cfg: alloc::boxed::Box<dyn FnMut(&EspNetif) -> Result<(), EspError>>,
10721077
}
10731078

1074-
impl<T> EspNetifDriverInner<T>
1079+
impl<'d, T> EspNetifDriverInner<'d, T>
10751080
where
10761081
T: Borrow<EspNetif>,
10771082
{

0 commit comments

Comments
 (0)