Skip to content

Commit 49c1f26

Browse files
ivmarkovCopilot
andcommitted
Apply code review feedback
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent c452d1a commit 49c1f26

File tree

4 files changed

+75
-37
lines changed

4 files changed

+75
-37
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@ members = [
88
exclude = ["examples", "xtask"]
99

1010
[patch.crates-io]
11-
esp-hal = { git = "https://github.com/ivmarkov/esp-hal", rev = "e156b5453a8adc123b7a8b6aa08e0698ec87dfe8" }
11+
esp-hal = { git = "https://github.com/esp-rs/esp-hal", rev = "e156b5453a8adc123b7a8b6aa08e0698ec87dfe8" }

examples/esp/Cargo.toml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,13 @@ esp32c6 = ["esp-rtos/esp32c6", "esp-radio/esp32c6", "esp-backtrace/esp32c6", "es
3131
esp32h2 = ["esp-rtos/esp32h2", "esp-radio/esp32h2", "esp-backtrace/esp32h2", "esp-println/esp32h2", "esp-bootloader-esp-idf/esp32h2"]
3232

3333
[patch.crates-io]
34-
esp-hal = { git = "https://github.com/ivmarkov/esp-hal", rev = "e156b5453a8adc123b7a8b6aa08e0698ec87dfe8" }
35-
esp-rtos = { git = "https://github.com/ivmarkov/esp-hal", rev = "e156b5453a8adc123b7a8b6aa08e0698ec87dfe8" }
36-
esp-alloc = { git = "https://github.com/ivmarkov/esp-hal", rev = "e156b5453a8adc123b7a8b6aa08e0698ec87dfe8" }
37-
esp-backtrace = { git = "https://github.com/ivmarkov/esp-hal", rev = "e156b5453a8adc123b7a8b6aa08e0698ec87dfe8" }
38-
esp-println = { git = "https://github.com/ivmarkov/esp-hal", rev = "e156b5453a8adc123b7a8b6aa08e0698ec87dfe8" }
39-
esp-radio = { git = "https://github.com/ivmarkov/esp-hal", rev = "e156b5453a8adc123b7a8b6aa08e0698ec87dfe8" }
40-
esp-bootloader-esp-idf = { git = "https://github.com/ivmarkov/esp-hal", rev = "e156b5453a8adc123b7a8b6aa08e0698ec87dfe8" }
34+
esp-hal = { git = "https://github.com/esp-rs/esp-hal", rev = "e156b5453a8adc123b7a8b6aa08e0698ec87dfe8" }
35+
esp-rtos = { git = "https://github.com/esp-rs/esp-hal", rev = "e156b5453a8adc123b7a8b6aa08e0698ec87dfe8" }
36+
esp-alloc = { git = "https://github.com/esp-rs/esp-hal", rev = "e156b5453a8adc123b7a8b6aa08e0698ec87dfe8" }
37+
esp-backtrace = { git = "https://github.com/esp-rs/esp-hal", rev = "e156b5453a8adc123b7a8b6aa08e0698ec87dfe8" }
38+
esp-println = { git = "https://github.com/esp-rs/esp-hal", rev = "e156b5453a8adc123b7a8b6aa08e0698ec87dfe8" }
39+
esp-radio = { git = "https://github.com/esp-rs/esp-hal", rev = "e156b5453a8adc123b7a8b6aa08e0698ec87dfe8" }
40+
esp-bootloader-esp-idf = { git = "https://github.com/esp-rs/esp-hal", rev = "e156b5453a8adc123b7a8b6aa08e0698ec87dfe8" }
4141

4242
[dependencies]
4343
embassy-executor = "0.9"

openthread/src/esp.rs

Lines changed: 64 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ impl<'a> EspRadio<'a> {
6363
pan_id: config.pan_id,
6464
short_addr: config.short_addr,
6565
ext_addr: config.ext_addr,
66+
// The default of 10 is too small for OpenThread,
67+
// which can have bursts of incoming frames, so we increase it to 50.
68+
// TODO: See if we can get by with a smaller number to save memory.
6669
rx_queue_size: 50,
6770
..Default::default()
6871
};
@@ -110,7 +113,7 @@ impl Radio for EspRadio<'_> {
110113
TX_SIGNAL.reset();
111114

112115
trace!(
113-
"802.15.4 TX: {} bytes ch{}",
116+
"802.15.4: About to TX {} bytes ch{}",
114117
psdu.len(),
115118
self.config.channel
116119
);
@@ -122,48 +125,61 @@ impl Radio for EspRadio<'_> {
122125
let success = TX_SIGNAL.wait().await;
123126

124127
if success {
125-
trace!("ESP Radio, transmission done");
128+
trace!("802.15.4: TX done");
126129

127130
if let Some(ack_psdu_buf) = ack_psdu_buf {
128131
// After tx_done signal received, get the ACK frame:
129132
if let Some(ack_frame) = self.driver.get_ack_frame() {
130-
let ack_psdu_len =
131-
(ack_frame.data.len() - 1).min((ack_frame.data[0] & 0x7f) as usize);
132-
ack_psdu_buf[..ack_psdu_len]
133-
.copy_from_slice(&ack_frame.data[1..][..ack_psdu_len]);
134-
135-
trace!(
136-
"ESP Radio, received ACK: {} on channel {}",
137-
Bytes(&ack_psdu_buf[..ack_psdu_len]),
138-
ack_frame.channel
139-
);
140-
141-
let rssi = ack_frame.data[1..][ack_psdu_len] as i8;
142-
143-
return Ok(Some(PsduMeta {
144-
len: ack_psdu_len,
145-
channel: ack_frame.channel,
146-
rssi: Some(rssi),
147-
}));
133+
if ack_frame.data.len() >= 1 {
134+
// Must have at least 1 byte for PSDU
135+
let ack_psdu_len =
136+
(ack_frame.data.len() - 1).min((ack_frame.data[0] & 0x7f) as usize);
137+
138+
if ack_psdu_len <= ack_psdu_buf.len() {
139+
ack_psdu_buf[..ack_psdu_len]
140+
.copy_from_slice(&ack_frame.data[1..][..ack_psdu_len]);
141+
142+
trace!(
143+
"802.15.4: ACK: {} on ch{}",
144+
Bytes(&ack_psdu_buf[..ack_psdu_len]),
145+
ack_frame.channel
146+
);
147+
148+
// Only read RSSI if there is at least one byte after the PSDU.
149+
let rssi = if ack_frame.data.len() > 1 + ack_psdu_len {
150+
Some(ack_frame.data[1..][ack_psdu_len] as i8)
151+
} else {
152+
None
153+
};
154+
155+
return Ok(Some(PsduMeta {
156+
len: ack_psdu_len,
157+
channel: ack_frame.channel,
158+
rssi,
159+
}));
160+
} else {
161+
trace!(
162+
"802.15.4: ACK frame too large for provided buffer: {} bytes",
163+
ack_psdu_len
164+
);
165+
}
166+
}
148167
}
149168
}
150169

151170
Ok(None)
152171
} else {
153-
trace!("ESP Radio, transmission failed");
172+
trace!("802.15.4: TX failed");
154173

155-
// Report as NoAck error so OpenThread SubMac retries
174+
// Report as a failure so OpenThread SubMac retries
156175
Err(RadioErrorKind::TxFailed)
157176
}
158177
}
159178

160179
async fn receive(&mut self, psdu_buf: &mut [u8]) -> Result<PsduMeta, Self::Error> {
161180
RX_SIGNAL.reset();
162181

163-
trace!(
164-
"ESP Radio, about to receive on channel {}",
165-
self.config.channel
166-
);
182+
trace!("802.15.4: About to RX on ch{}", self.config.channel);
167183

168184
self.driver.start_receive();
169185

@@ -175,13 +191,32 @@ impl Radio for EspRadio<'_> {
175191
RX_SIGNAL.wait().await;
176192
};
177193

194+
if raw.data.len() < 1 {
195+
// Must have at least 1 byte for PSDU
196+
return Err(RadioErrorKind::Other);
197+
}
198+
178199
let psdu_len = (raw.data.len() - 1).min((raw.data[0] & 0x7f) as usize);
200+
if psdu_len > psdu_buf.len() {
201+
// PSDU length is larger than the provided buffer
202+
trace!(
203+
"802.15.4: Received frame too large for provided buffer: {} bytes",
204+
psdu_len
205+
);
206+
return Err(RadioErrorKind::Other);
207+
}
208+
179209
psdu_buf[..psdu_len].copy_from_slice(&raw.data[1..][..psdu_len]);
180210

181-
let rssi = raw.data[1..][psdu_len] as i8;
211+
// Only read RSSI if there is at least one byte after the PSDU.
212+
let rssi = if raw.data.len() > 1 + psdu_len {
213+
Some(raw.data[1..][psdu_len] as i8)
214+
} else {
215+
None
216+
};
182217

183218
trace!(
184-
"802.15.4 RX: {} bytes ch{} rssi={}",
219+
"802.15.4: RX {} bytes ch{} rssi={:?}",
185220
psdu_len,
186221
raw.channel,
187222
rssi
@@ -190,7 +225,7 @@ impl Radio for EspRadio<'_> {
190225
Ok(PsduMeta {
191226
len: psdu_len,
192227
channel: raw.channel,
193-
rssi: Some(rssi),
228+
rssi,
194229
})
195230
}
196231
}

openthread/src/radio.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,10 +168,13 @@ impl Config {
168168
pub const fn new() -> Self {
169169
Self {
170170
channel: 11,
171+
// Run with max power by default
172+
// TODO: Figure out how to have this specified by the user
171173
power: 20,
172174
cca: Cca::Carrier,
173175
sfd: 0,
174176
promiscuous: false,
177+
// OpenThread can have bursts of incoming frames, so we need to receive during idle state to not miss them.
175178
rx_when_idle: true,
176179
pan_id: None,
177180
short_addr: None,

0 commit comments

Comments
 (0)