Skip to content

Commit

Permalink
refactor(embassy): Allow building net without a backend for docs and …
Browse files Browse the repository at this point in the history
…linting
  • Loading branch information
chrysn committed Oct 29, 2024
1 parent 552d553 commit a8488ce
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 5 deletions.
20 changes: 15 additions & 5 deletions src/riot-rs-embassy/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -68,11 +68,18 @@ pub mod reexports {

pub use embassy_executor::Spawner;

#[cfg(feature = "usb-ethernet")]
use usb::ethernet::NetworkDevice;

#[cfg(feature = "wifi")]
use wifi::NetworkDevice;
#[cfg(feature = "net")]
cfg_if::cfg_if! {
if #[cfg(feature = "usb-ethernet")] {
use usb::ethernet::NetworkDevice;
} else if #[cfg(feature = "wifi")] {
use wifi::NetworkDevice;
} else if #[cfg(context = "riot-rs")] {
compile_error!("no backend for net is active");
} else {
type NetworkDevice = network::DummyDriver;
}
}

#[cfg(feature = "net")]
pub use network::NetworkStack;
Expand Down Expand Up @@ -264,6 +271,9 @@ async fn init_task(mut peripherals: arch::OptionalPeripherals) {
#[cfg(feature = "wifi-esp")]
let device = arch::wifi::esp_wifi::init(&mut peripherals, spawner);

#[cfg(not(any(feature = "wifi-esp", feature = "wifi-cyw43", feature = "usb-ethernet")))]
let device = panic!();

#[cfg(feature = "net")]
{
use embassy_net::StackResources;
Expand Down
58 changes: 58 additions & 0 deletions src/riot-rs-embassy/src/network.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,61 @@ pub(crate) fn config() -> embassy_net::Config {
unsafe { riot_rs_network_config() }
}
}

/// An uninhabited type that stands in for a network driver in documentation and linting.
///
/// It also doubles as the infallible type for its own associated types.
// FIXME: This should be core::convert::Infallible as soon as embassy-net implements the traits on
// that.
pub(crate) enum DummyDriver {}

impl embassy_net::driver::Driver for DummyDriver {
type RxToken<'a> = Self
where
Self: 'a;

type TxToken<'a> = Self
where
Self: 'a;

fn receive(
&mut self,
_cx: &mut core::task::Context,
) -> Option<(Self::RxToken<'_>, Self::TxToken<'_>)> {
match *self {}
}

fn transmit(&mut self, _cx: &mut core::task::Context) -> Option<Self::TxToken<'_>> {
match *self {}
}

fn link_state(&mut self, _cx: &mut core::task::Context) -> embassy_net::driver::LinkState {
match *self {}
}

fn capabilities(&self) -> embassy_net::driver::Capabilities {
match *self {}
}

fn hardware_address(&self) -> embassy_net::driver::HardwareAddress {
match *self {}
}
}

impl embassy_net::driver::TxToken for DummyDriver {
fn consume<R, F>(self, _len: usize, _f: F) -> R
where
F: FnOnce(&mut [u8]) -> R,
{
match self {}
}
}

impl embassy_net::driver::RxToken for DummyDriver {
fn consume<R, F>(self, _f: F) -> R
where
F: FnOnce(&mut [u8]) -> R,
{
match self {}
}
}

0 comments on commit a8488ce

Please sign in to comment.