use core::future::Future;
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
#[derive(Debug, PartialEq, Clone, Copy)]
pub enum Error {
CcaBackoff(u16),
CcaFailed,
AckRetry(u16),
AckFailed,
InvalidDeviceStructure,
InvalidIEEEStructure,
RadioError,
}
pub trait Driver {
fn transmit(&self) -> impl Future<Output = FrameBuffer>;
fn received(&self, buffer: FrameBuffer) -> impl Future<Output = ()>;
fn error(&self, error: Error) -> impl Future<Output = ()>;
}
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
#[derive(Debug, Clone, PartialEq)]
pub struct FrameBuffer {
pub buffer: [u8; 128],
pub dirty: bool,
}
impl Default for FrameBuffer {
fn default() -> Self {
Self {
buffer: [0u8; 128],
dirty: false,
}
}
}
#[cfg(test)]
pub mod tests {
use crate::sync::channel::{Channel, Receiver, Sender};
use super::*;
pub enum TestDriverEvent {
TxProcessed,
RxAvailable,
NewError,
}
#[derive(Default)]
pub struct TestDriverChannel {
pub tx: Channel<FrameBuffer>,
pub rx: Channel<FrameBuffer>,
pub errors: Channel<Error>,
}
impl TestDriverChannel {
pub fn new() -> Self {
Self {
tx: Channel::new(),
rx: Channel::new(),
errors: Channel::new(),
}
}
pub fn split(&mut self) -> (TestDriver<'_>, TestDriverMonitor<'_>) {
let (tx_send, tx_recv) = self.tx.split();
let (rx_send, rx_recv) = self.rx.split();
let (errors_send, errors_recv) = self.errors.split();
(
TestDriver {
tx: tx_recv,
rx: rx_send,
errors: errors_send,
},
TestDriverMonitor {
tx: tx_send,
rx: rx_recv,
errors: errors_recv,
},
)
}
}
pub struct TestDriverMonitor<'a> {
pub tx: Sender<'a, FrameBuffer>,
pub rx: Receiver<'a, FrameBuffer>,
pub errors: Receiver<'a, Error>,
}
pub struct TestDriver<'a> {
tx: Receiver<'a, FrameBuffer>,
rx: Sender<'a, FrameBuffer>,
errors: Sender<'a, Error>,
}
impl Driver for TestDriver<'_> {
async fn transmit(&self) -> FrameBuffer {
self.tx.receive().await
}
async fn received(&self, buffer: FrameBuffer) {
self.rx.send(buffer);
}
async fn error(&self, error: Error) {
self.errors.send(error);
}
}
}