Skip to content

Commit b8def6f

Browse files
committed
Addressed AI comments.
1 parent 0d5d24b commit b8def6f

4 files changed

Lines changed: 73 additions & 15 deletions

File tree

feather_async/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ version = "0.1.0"
88
harness = false
99

1010
[dependencies]
11-
cortex-m = { version = "0.7.7", features = ["critical-section-single-core"] }
11+
cortex-m = { version = "0.7.3", features = ["critical-section-single-core"] }
1212
cortex-m-rt = "0.7.5"
1313
defmt = "0.3"
1414
defmt-rtt = "0.4"

feather_async/examples/bypass_mode.rs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,10 @@ async fn wait_for_dhcp(stack: &Stack<'static>) -> Result<(), AppError> {
6060
loop {
6161
if let Some(config) = stack.config_v4() {
6262
let ip: [u8; MAX_IP_BYTES] = config.address.address().octets();
63-
let gateway: [u8; MAX_IP_BYTES] = config.gateway.unwrap().octets();
63+
let gateway: [u8; MAX_IP_BYTES] = config
64+
.gateway
65+
.ok_or(AppError::WincError(StackError::InvalidResponse))?
66+
.octets();
6467
let mask: [u8; MAX_IP_BYTES] = config.address.netmask().octets();
6568
defmt::info!("IP address: {}.{}.{}.{}", ip[0], ip[1], ip[2], ip[3]);
6669
defmt::info!(
@@ -98,8 +101,11 @@ async fn wait_for_dhcp(stack: &Stack<'static>) -> Result<(), AppError> {
98101
#[embassy_executor::task]
99102
async fn ping_task(stack: Stack<'static>, destination_ip: Ipv4Addr, count: u16) -> ! {
100103
// Wait for DHCP
101-
if let Err(_) = wait_for_dhcp(&stack).await {
102-
loop {}
104+
if let Err(err) = wait_for_dhcp(&stack).await {
105+
defmt::error!("DHCP error: {:?}", err);
106+
loop {
107+
Timer::after(Duration::from_secs(1)).await
108+
}
103109
}
104110

105111
// Then we can use it!
@@ -142,7 +148,9 @@ async fn ping_task(stack: Stack<'static>, destination_ip: Ipv4Addr, count: u16)
142148
}
143149
}
144150

145-
loop {}
151+
loop {
152+
embassy_time::Timer::after_secs(3600).await
153+
}
146154
}
147155

148156
/// Main Program
@@ -155,7 +163,7 @@ async fn program(spwaner: Spawner) -> Result<(), AppError> {
155163
let test_ip: Ipv4Addr =
156164
Ipv4Addr::from_str(test_ip).map_err(|_| StackError::InvalidParameters)?;
157165
let test_count = option_env!("TEST_COUNT").unwrap_or(DEFAULT_TEST_COUNT);
158-
let test_count = u16::from_str(test_count).unwrap();
166+
let test_count = u16::from_str(test_count).map_err(|_| StackError::InvalidParameters)?;
159167

160168
let ssid = Ssid::from(option_env!("TEST_SSID").unwrap_or(DEFAULT_TEST_SSID))
161169
.map_err(|_| StackError::InvalidParameters)?;

winc-rs/src/async_client/ethernet.rs

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ impl<X: Xfer> AsyncClient<'_, X> {
1414
/// # Arguments
1515
///
1616
/// * `buffer` - A mutable slice used to store the received Ethernet packet.
17-
/// * `timeout` - An optional duration to wait for a packet.
17+
/// * `timeout` - An optional duration to wait for an Ethernet packet.
1818
/// If `None`, the default timeout value `ETHERNET_RX_TIMEOUT_MSEC` is used.
1919
///
2020
/// # Returns
@@ -23,11 +23,11 @@ impl<X: Xfer> AsyncClient<'_, X> {
2323
/// * `Err(StackError)` - If an error occurs while reading the ethernet packet.
2424
pub async fn read_ethernet_packet(
2525
&mut self,
26-
buffer: Option<&mut [u8]>,
26+
buffer: &mut [u8],
2727
timeout: Option<Duration>,
2828
) -> Result<usize, StackError> {
2929
let timeout_ms: Option<u32> = timeout.map(|d| d.as_millis().min(u32::MAX as u128) as u32);
30-
let mut op = RxEthernetPacketInfo::new(buffer, timeout_ms);
30+
let mut op = RxEthernetPacketInfo::new(Some(buffer), timeout_ms);
3131
self.poll_op(&mut op).await
3232
}
3333

@@ -53,7 +53,7 @@ impl<X: Xfer> AsyncClient<'_, X> {
5353

5454
#[cfg(feature = "embassy-net")]
5555
mod embassy_net {
56-
use super::{AsyncClient, Xfer};
56+
use super::{AsyncClient, StackError, Xfer};
5757
use crate::error;
5858
use crate::manager::{Manager, MAX_OCTETS_IN_MAC_ADDRESS, SOCKET_BUFFER_MAX_LENGTH};
5959
use crate::ops::net_ops::ethernet_receive::RxEthernetPacketInfo;
@@ -93,7 +93,7 @@ mod embassy_net {
9393
/// Construct a token pair consisting of one receive token and one transmit token.
9494
fn receive(
9595
&mut self,
96-
_cx: &mut Context<'_>,
96+
cx: &mut Context<'_>,
9797
) -> Option<(Self::RxToken<'_>, Self::TxToken<'_>)> {
9898
// poll for new events
9999
let _ = self.heartbeat();
@@ -102,10 +102,27 @@ mod embassy_net {
102102
let mut rx_op = RxEthernetPacketInfo::new(None, Some(ETH_RECV_TIMEOUT_MSEC));
103103
let result = self.poll_once(&mut rx_op);
104104

105-
let Ok(read_length) = result else {
106-
return None;
105+
let read_length = match result {
106+
Ok(length) => length,
107+
Err(e) => {
108+
if e == StackError::GeneralTimeout {
109+
error!("Ethernet receive timeout");
110+
}
111+
// register the waker if no packet is available
112+
if let Err(e) = self
113+
.manager
114+
.borrow_mut()
115+
.register_waker_if_new(cx.waker().clone())
116+
{
117+
error!("Too many wakers registered: {:?}", e);
118+
}
119+
return None;
120+
}
107121
};
108122

123+
// Got a packet - remove the waker.
124+
self.manager.borrow_mut().unregister_waker(&cx.waker());
125+
109126
let rx_token = WincRxToken {
110127
callback: &self.callbacks,
111128
read_length,
@@ -234,7 +251,7 @@ mod tests {
234251
let mut client = make_test_client();
235252
*client.debug_callback.borrow_mut() = Some(&mut my_debug);
236253
client
237-
.read_ethernet_packet(Some(rx_buffer.as_mut_slice()), None)
254+
.read_ethernet_packet(rx_buffer.as_mut_slice(), None)
238255
.await
239256
};
240257

@@ -248,7 +265,7 @@ mod tests {
248265
let timeout = Some(Duration::from_millis(1000));
249266

250267
let result = client
251-
.read_ethernet_packet(Some(rx_buffer.as_mut_slice()), timeout)
268+
.read_ethernet_packet(rx_buffer.as_mut_slice(), timeout)
252269
.await;
253270

254271
assert_eq!(result, Err(StackError::GeneralTimeout));

winc-rs/src/manager.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -874,6 +874,39 @@ impl<X: Xfer> Manager<X> {
874874
}
875875
}
876876

877+
/// Registers a waker only if it is not already registered.
878+
///
879+
/// # Arguments
880+
///
881+
/// * `waker` - The task waker to register.
882+
///
883+
/// # Returns
884+
///
885+
/// * `Ok(())` - If the waker was registered or was already registered.
886+
/// * `StackError` - If too many wakers are already registered.
887+
#[cfg(all(feature = "async", feature = "embassy-net"))]
888+
pub(crate) fn register_waker_if_new(
889+
&mut self,
890+
waker: core::task::Waker,
891+
) -> Result<(), crate::StackError> {
892+
// Already registered?
893+
for slot in &self.wakers {
894+
if let Some(ref stored) = slot {
895+
if stored.will_wake(&waker) {
896+
return Ok(());
897+
}
898+
}
899+
}
900+
// Find empty slot
901+
for slot in &mut self.wakers {
902+
if slot.is_none() {
903+
*slot = Some(waker);
904+
return Ok(());
905+
}
906+
}
907+
Err(crate::StackError::TooManyWakers)
908+
}
909+
877910
/// Sets the timeout (countdown) for the current Async/Sync operation.
878911
///
879912
/// # Arguments

0 commit comments

Comments
 (0)