Skip to content

Commit 9202dbf

Browse files
bors[bot]Ulf Lilleengen
andauthored
Merge #1369
1369: Lora AFIT r=Dirbaio a=Dirbaio Extracted out of #1367 Probably we should wait until `rust-lorawan` is merged+released? Co-authored-by: Ulf Lilleengen <lulf@redhat.com>
2 parents 6acc361 + 4044d72 commit 9202dbf

File tree

10 files changed

+145
-189
lines changed

10 files changed

+145
-189
lines changed

embassy-lora/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,5 @@ futures = { version = "0.3.17", default-features = false, features = [ "async-aw
3838
embedded-hal = { version = "0.2", features = ["unproven"] }
3939
bit_field = { version = "0.10" }
4040

41-
lorawan-device = { version = "0.8.0", default-features = false, features = ["async"] }
42-
lorawan = { version = "0.7.1", default-features = false }
41+
lorawan-device = { version = "0.9.0", default-features = false, features = ["async"] }
42+
lorawan = { version = "0.7.2", default-features = false }

embassy-lora/src/lib.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#![no_std]
2-
#![feature(type_alias_impl_trait)]
2+
#![feature(async_fn_in_trait, impl_trait_projections)]
3+
#![allow(incomplete_features)]
34
//! embassy-lora is a collection of async radio drivers that integrate with the lorawan-device
45
//! crate's async LoRaWAN MAC implementation.
56
@@ -34,13 +35,11 @@ impl lorawan_device::async_device::radio::Timer for LoraTimer {
3435
self.start = Instant::now();
3536
}
3637

37-
type AtFuture<'m> = impl core::future::Future<Output = ()> + 'm;
38-
fn at<'m>(&'m mut self, millis: u64) -> Self::AtFuture<'m> {
39-
Timer::at(self.start + Duration::from_millis(millis))
38+
async fn at(&mut self, millis: u64) {
39+
Timer::at(self.start + Duration::from_millis(millis)).await
4040
}
4141

42-
type DelayFuture<'m> = impl core::future::Future<Output = ()> + 'm;
43-
fn delay_ms<'m>(&'m mut self, millis: u64) -> Self::DelayFuture<'m> {
44-
Timer::after(Duration::from_millis(millis))
42+
async fn delay_ms(&mut self, millis: u64) {
43+
Timer::after(Duration::from_millis(millis)).await
4544
}
4645
}

embassy-lora/src/stm32wl/mod.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//! A radio driver integration for the radio found on STM32WL family devices.
2-
use core::future::{poll_fn, Future};
2+
use core::future::poll_fn;
33
use core::task::Poll;
44

55
use embassy_hal_common::{into_ref, Peripheral, PeripheralRef};
@@ -241,14 +241,12 @@ fn configure_radio(radio: &mut SubGhz<'_, NoDma, NoDma>, config: SubGhzRadioConf
241241
impl<'d, RS: RadioSwitch> PhyRxTx for SubGhzRadio<'d, RS> {
242242
type PhyError = RadioError;
243243

244-
type TxFuture<'m> = impl Future<Output = Result<u32, Self::PhyError>> + 'm where Self: 'm;
245-
fn tx<'m>(&'m mut self, config: TxConfig, buf: &'m [u8]) -> Self::TxFuture<'m> {
246-
async move { self.do_tx(config, buf).await }
244+
async fn tx(&mut self, config: TxConfig, buf: &[u8]) -> Result<u32, Self::PhyError> {
245+
self.do_tx(config, buf).await
247246
}
248247

249-
type RxFuture<'m> = impl Future<Output = Result<(usize, RxQuality), Self::PhyError>> + 'm where Self: 'm;
250-
fn rx<'m>(&'m mut self, config: RfConfig, buf: &'m mut [u8]) -> Self::RxFuture<'m> {
251-
async move { self.do_rx(config, buf).await }
248+
async fn rx(&mut self, config: RfConfig, buf: &mut [u8]) -> Result<(usize, RxQuality), Self::PhyError> {
249+
self.do_rx(config, buf).await
252250
}
253251
}
254252

embassy-lora/src/sx126x/mod.rs

Lines changed: 58 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use core::future::Future;
2-
31
use defmt::Format;
42
use embedded_hal::digital::v2::OutputPin;
53
use embedded_hal_async::digital::Wait;
@@ -71,83 +69,69 @@ where
7169
{
7270
type PhyError = RadioError<BUS>;
7371

74-
type TxFuture<'m> = impl Future<Output = Result<u32, Self::PhyError>> + 'm
75-
where
76-
SPI: 'm,
77-
CTRL: 'm,
78-
WAIT: 'm,
79-
BUS: 'm;
80-
81-
fn tx<'m>(&'m mut self, config: TxConfig, buffer: &'m [u8]) -> Self::TxFuture<'m> {
72+
async fn tx(&mut self, config: TxConfig, buffer: &[u8]) -> Result<u32, Self::PhyError> {
8273
trace!("TX START");
83-
async move {
84-
self.lora
85-
.set_tx_config(
86-
config.pw,
87-
config.rf.spreading_factor.into(),
88-
config.rf.bandwidth.into(),
89-
config.rf.coding_rate.into(),
90-
8,
91-
false,
92-
true,
93-
false,
94-
0,
95-
false,
96-
)
97-
.await?;
98-
self.lora.set_max_payload_length(buffer.len() as u8).await?;
99-
self.lora.set_channel(config.rf.frequency).await?;
100-
self.lora.send(buffer, 0xffffff).await?;
101-
self.lora.process_irq(None, None, None).await?;
102-
trace!("TX DONE");
103-
return Ok(0);
104-
}
74+
self.lora
75+
.set_tx_config(
76+
config.pw,
77+
config.rf.spreading_factor.into(),
78+
config.rf.bandwidth.into(),
79+
config.rf.coding_rate.into(),
80+
8,
81+
false,
82+
true,
83+
false,
84+
0,
85+
false,
86+
)
87+
.await?;
88+
self.lora.set_max_payload_length(buffer.len() as u8).await?;
89+
self.lora.set_channel(config.rf.frequency).await?;
90+
self.lora.send(buffer, 0xffffff).await?;
91+
self.lora.process_irq(None, None, None).await?;
92+
trace!("TX DONE");
93+
return Ok(0);
10594
}
10695

107-
type RxFuture<'m> = impl Future<Output = Result<(usize, RxQuality), Self::PhyError>> + 'm
108-
where
109-
SPI: 'm,
110-
CTRL: 'm,
111-
WAIT: 'm,
112-
BUS: 'm;
113-
114-
fn rx<'m>(&'m mut self, config: RfConfig, receiving_buffer: &'m mut [u8]) -> Self::RxFuture<'m> {
96+
async fn rx(
97+
&mut self,
98+
config: RfConfig,
99+
receiving_buffer: &mut [u8],
100+
) -> Result<(usize, RxQuality), Self::PhyError> {
115101
trace!("RX START");
116-
async move {
117-
self.lora
118-
.set_rx_config(
119-
config.spreading_factor.into(),
120-
config.bandwidth.into(),
121-
config.coding_rate.into(),
122-
8,
123-
4,
124-
false,
125-
0u8,
126-
true,
127-
false,
128-
0,
129-
true,
130-
true,
131-
)
132-
.await?;
133-
self.lora.set_max_payload_length(receiving_buffer.len() as u8).await?;
134-
self.lora.set_channel(config.frequency).await?;
135-
self.lora.rx(90 * 1000).await?;
136-
let mut received_len = 0u8;
137-
self.lora
138-
.process_irq(Some(receiving_buffer), Some(&mut received_len), None)
139-
.await?;
140-
trace!("RX DONE");
141-
142-
let packet_status = self.lora.get_latest_packet_status();
143-
let mut rssi = 0i16;
144-
let mut snr = 0i8;
145-
if packet_status.is_some() {
146-
rssi = packet_status.unwrap().rssi as i16;
147-
snr = packet_status.unwrap().snr;
148-
}
102+
self.lora
103+
.set_rx_config(
104+
config.spreading_factor.into(),
105+
config.bandwidth.into(),
106+
config.coding_rate.into(),
107+
8,
108+
4,
109+
false,
110+
0u8,
111+
true,
112+
false,
113+
0,
114+
true,
115+
true,
116+
)
117+
.await?;
118+
self.lora.set_max_payload_length(receiving_buffer.len() as u8).await?;
119+
self.lora.set_channel(config.frequency).await?;
120+
self.lora.rx(90 * 1000).await?;
121+
let mut received_len = 0u8;
122+
self.lora
123+
.process_irq(Some(receiving_buffer), Some(&mut received_len), None)
124+
.await?;
125+
trace!("RX DONE");
149126

150-
Ok((received_len as usize, RxQuality::new(rssi, snr)))
127+
let packet_status = self.lora.get_latest_packet_status();
128+
let mut rssi = 0i16;
129+
let mut snr = 0i8;
130+
if packet_status.is_some() {
131+
rssi = packet_status.unwrap().rssi as i16;
132+
snr = packet_status.unwrap().snr;
151133
}
134+
135+
Ok((received_len as usize, RxQuality::new(rssi, snr)))
152136
}
153137
}

embassy-lora/src/sx127x/mod.rs

Lines changed: 66 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use core::future::Future;
2-
31
use embedded_hal::digital::v2::OutputPin;
42
use embedded_hal_async::digital::Wait;
53
use embedded_hal_async::spi::*;
@@ -88,101 +86,78 @@ where
8886
{
8987
type PhyError = Sx127xError;
9088

91-
type TxFuture<'m> = impl Future<Output = Result<u32, Self::PhyError>> + 'm
92-
where
93-
SPI: 'm,
94-
CS: 'm,
95-
RESET: 'm,
96-
E: 'm,
97-
I: 'm,
98-
RFS: 'm;
99-
100-
fn tx<'m>(&'m mut self, config: TxConfig, buf: &'m [u8]) -> Self::TxFuture<'m> {
89+
async fn tx(&mut self, config: TxConfig, buf: &[u8]) -> Result<u32, Self::PhyError> {
10190
trace!("TX START");
102-
async move {
91+
self.radio.set_mode(RadioMode::Stdby).await.ok().unwrap();
92+
self.rfs.set_tx();
93+
self.radio.set_tx_power(14, 0).await?;
94+
self.radio.set_frequency(config.rf.frequency).await?;
95+
// TODO: Modify radio to support other coding rates
96+
self.radio.set_coding_rate_4(5).await?;
97+
self.radio
98+
.set_signal_bandwidth(bandwidth_to_i64(config.rf.bandwidth))
99+
.await?;
100+
self.radio
101+
.set_spreading_factor(spreading_factor_to_u8(config.rf.spreading_factor))
102+
.await?;
103+
104+
self.radio.set_preamble_length(8).await?;
105+
self.radio.set_lora_pa_ramp().await?;
106+
self.radio.set_lora_sync_word().await?;
107+
self.radio.set_invert_iq(false).await?;
108+
self.radio.set_crc(true).await?;
109+
110+
self.radio.set_dio0_tx_done().await?;
111+
112+
self.radio.transmit_start(buf).await?;
113+
114+
loop {
115+
self.irq.wait_for_rising_edge().await.unwrap();
103116
self.radio.set_mode(RadioMode::Stdby).await.ok().unwrap();
104-
self.rfs.set_tx();
105-
self.radio.set_tx_power(14, 0).await?;
106-
self.radio.set_frequency(config.rf.frequency).await?;
107-
// TODO: Modify radio to support other coding rates
108-
self.radio.set_coding_rate_4(5).await?;
109-
self.radio
110-
.set_signal_bandwidth(bandwidth_to_i64(config.rf.bandwidth))
111-
.await?;
112-
self.radio
113-
.set_spreading_factor(spreading_factor_to_u8(config.rf.spreading_factor))
114-
.await?;
115-
116-
self.radio.set_preamble_length(8).await?;
117-
self.radio.set_lora_pa_ramp().await?;
118-
self.radio.set_lora_sync_word().await?;
119-
self.radio.set_invert_iq(false).await?;
120-
self.radio.set_crc(true).await?;
121-
122-
self.radio.set_dio0_tx_done().await?;
123-
124-
self.radio.transmit_start(buf).await?;
125-
126-
loop {
127-
self.irq.wait_for_rising_edge().await.unwrap();
128-
self.radio.set_mode(RadioMode::Stdby).await.ok().unwrap();
129-
let irq = self.radio.clear_irq().await.ok().unwrap();
130-
if (irq & IRQ::IrqTxDoneMask.addr()) != 0 {
131-
trace!("TX DONE");
132-
return Ok(0);
133-
}
117+
let irq = self.radio.clear_irq().await.ok().unwrap();
118+
if (irq & IRQ::IrqTxDoneMask.addr()) != 0 {
119+
trace!("TX DONE");
120+
return Ok(0);
134121
}
135122
}
136123
}
137124

138-
type RxFuture<'m> = impl Future<Output = Result<(usize, RxQuality), Self::PhyError>> + 'm
139-
where
140-
SPI: 'm,
141-
CS: 'm,
142-
RESET: 'm,
143-
E: 'm,
144-
I: 'm,
145-
RFS: 'm;
146-
147-
fn rx<'m>(&'m mut self, config: RfConfig, buf: &'m mut [u8]) -> Self::RxFuture<'m> {
148-
trace!("RX START");
149-
async move {
150-
self.rfs.set_rx();
151-
self.radio.reset_payload_length().await?;
152-
self.radio.set_frequency(config.frequency).await?;
153-
// TODO: Modify radio to support other coding rates
154-
self.radio.set_coding_rate_4(5).await?;
155-
self.radio
156-
.set_signal_bandwidth(bandwidth_to_i64(config.bandwidth))
157-
.await?;
158-
self.radio
159-
.set_spreading_factor(spreading_factor_to_u8(config.spreading_factor))
160-
.await?;
161-
162-
self.radio.set_preamble_length(8).await?;
163-
self.radio.set_lora_sync_word().await?;
164-
self.radio.set_invert_iq(true).await?;
165-
self.radio.set_crc(true).await?;
166-
167-
self.radio.set_dio0_rx_done().await?;
168-
self.radio.set_mode(RadioMode::RxContinuous).await?;
169-
170-
loop {
171-
self.irq.wait_for_rising_edge().await.unwrap();
172-
self.radio.set_mode(RadioMode::Stdby).await.ok().unwrap();
173-
let irq = self.radio.clear_irq().await.ok().unwrap();
174-
if (irq & IRQ::IrqRxDoneMask.addr()) != 0 {
175-
let rssi = self.radio.get_packet_rssi().await.unwrap_or(0) as i16;
176-
let snr = self.radio.get_packet_snr().await.unwrap_or(0.0) as i8;
177-
let response = if let Ok(size) = self.radio.read_packet_size().await {
178-
self.radio.read_packet(buf).await?;
179-
Ok((size, RxQuality::new(rssi, snr)))
180-
} else {
181-
Ok((0, RxQuality::new(rssi, snr)))
182-
};
183-
trace!("RX DONE");
184-
return response;
185-
}
125+
async fn rx(&mut self, config: RfConfig, buf: &mut [u8]) -> Result<(usize, RxQuality), Self::PhyError> {
126+
self.rfs.set_rx();
127+
self.radio.reset_payload_length().await?;
128+
self.radio.set_frequency(config.frequency).await?;
129+
// TODO: Modify radio to support other coding rates
130+
self.radio.set_coding_rate_4(5).await?;
131+
self.radio
132+
.set_signal_bandwidth(bandwidth_to_i64(config.bandwidth))
133+
.await?;
134+
self.radio
135+
.set_spreading_factor(spreading_factor_to_u8(config.spreading_factor))
136+
.await?;
137+
138+
self.radio.set_preamble_length(8).await?;
139+
self.radio.set_lora_sync_word().await?;
140+
self.radio.set_invert_iq(true).await?;
141+
self.radio.set_crc(true).await?;
142+
143+
self.radio.set_dio0_rx_done().await?;
144+
self.radio.set_mode(RadioMode::RxContinuous).await?;
145+
146+
loop {
147+
self.irq.wait_for_rising_edge().await.unwrap();
148+
self.radio.set_mode(RadioMode::Stdby).await.ok().unwrap();
149+
let irq = self.radio.clear_irq().await.ok().unwrap();
150+
if (irq & IRQ::IrqRxDoneMask.addr()) != 0 {
151+
let rssi = self.radio.get_packet_rssi().await.unwrap_or(0) as i16;
152+
let snr = self.radio.get_packet_snr().await.unwrap_or(0.0) as i8;
153+
let response = if let Ok(size) = self.radio.read_packet_size().await {
154+
self.radio.read_packet(buf).await?;
155+
Ok((size, RxQuality::new(rssi, snr)))
156+
} else {
157+
Ok((0, RxQuality::new(rssi, snr)))
158+
};
159+
trace!("RX DONE");
160+
return response;
186161
}
187162
}
188163
}

examples/nrf52840/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ embassy-usb = { version = "0.1.0", path = "../../embassy-usb", features = ["defm
2020
embedded-io = "0.4.0"
2121
embassy-lora = { version = "0.1.0", path = "../../embassy-lora", features = ["sx126x", "time", "defmt"], optional = true }
2222

23-
lorawan-device = { version = "0.8.0", default-features = false, features = ["async"], optional = true }
24-
lorawan = { version = "0.7.1", default-features = false, features = ["default-crypto"], optional = true }
23+
lorawan-device = { version = "0.9.0", default-features = false, features = ["async"], optional = true }
24+
lorawan = { version = "0.7.2", default-features = false, features = ["default-crypto"], optional = true }
2525

2626
defmt = "0.3"
2727
defmt-rtt = "0.4"

0 commit comments

Comments
 (0)