use crate::error::{Error, Result};
use crate::rtps::Locator;
pub mod cc1101;
pub mod hc12;
pub mod lora;
pub mod mesh;
pub mod nrf24;
pub mod udp;
pub use cc1101::{Cc1101Band, Cc1101Config, Cc1101DataRate, Cc1101Power, Cc1101Transport};
pub use mesh::{MeshConfig, MeshHeader, MeshStats, MeshTransport};
pub use nrf24::{Nrf24Config, Nrf24DataRate, Nrf24Power, Nrf24Transport};
pub trait Transport {
fn init(&mut self) -> Result<()>;
fn send(&mut self, data: &[u8], dest: &Locator) -> Result<usize>;
fn recv(&mut self, buf: &mut [u8]) -> Result<(usize, Locator)>;
fn try_recv(&mut self, buf: &mut [u8]) -> Result<(usize, Locator)>;
fn local_locator(&self) -> Locator;
fn mtu(&self) -> usize;
fn last_rssi(&self) -> Option<i16> {
None
}
fn shutdown(&mut self) -> Result<()>;
}
pub struct NullTransport {
local_locator: Locator,
}
impl NullTransport {
pub const fn new(local_locator: Locator) -> Self {
Self { local_locator }
}
}
impl Default for NullTransport {
fn default() -> Self {
Self {
local_locator: Locator::udpv4([127, 0, 0, 1], 7400),
}
}
}
impl Transport for NullTransport {
fn init(&mut self) -> Result<()> {
Ok(())
}
fn send(&mut self, data: &[u8], _dest: &Locator) -> Result<usize> {
Ok(data.len())
}
fn recv(&mut self, _buf: &mut [u8]) -> Result<(usize, Locator)> {
Err(Error::TransportError)
}
fn try_recv(&mut self, _buf: &mut [u8]) -> Result<(usize, Locator)> {
Err(Error::ResourceExhausted)
}
fn local_locator(&self) -> Locator {
self.local_locator
}
fn mtu(&self) -> usize {
1024
}
fn shutdown(&mut self) -> Result<()> {
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_null_transport() {
let mut transport = NullTransport::default();
transport.init().unwrap();
let data = b"hello";
let dest = Locator::udpv4([192, 168, 1, 100], 7400);
let sent = transport.send(data, &dest).unwrap();
assert_eq!(sent, data.len());
let mut buf = [0u8; 64];
let result = transport.try_recv(&mut buf);
assert_eq!(result, Err(Error::ResourceExhausted));
}
}