ham/
lib.rs

1use std::thread;
2use std::time::{Duration, Instant};
3
4#[cfg(feature = "hp-sleep")]
5use spin_sleep;
6
7pub mod rfm69;
8
9#[derive(Debug)]
10pub enum Error {
11    GpioError(gpio_cdev::errors::Error), // error with Gpio device
12    Init(String),                        // error initializing device TODO: should this be removed
13    IoError(std::io::Error),             // IO error, typically SPI
14    BadInputs(String),                   // input given to message was bad
15    BadMessage(String, Option<usize>),   // a mangled message was received
16    Timeout(String),                     //
17    ChipMalfunction(String),             // chip is behaving unexpectedly
18    BufferOverflow(usize),               // a buffer that was passed was to small
19    Unrecoverable(String),               // device is unrecoverable state
20}
21impl From<gpio_cdev::errors::Error> for Error {
22    fn from(v: gpio_cdev::errors::Error) -> Self {
23        Error::GpioError(v)
24    }
25}
26impl From<std::io::Error> for Error {
27    fn from(v: std::io::Error) -> Self {
28        Error::IoError(v)
29    }
30}
31
32#[inline]
33fn sleep(dur: Duration) {
34    // a high persision sleep version
35    if cfg!(feature = "hp-sleep") {
36        spin_sleep::sleep(dur)
37    } else {
38        thread::sleep(dur)
39    }
40}
41
42#[inline]
43fn bit(byte: u8, bit: u8) -> bool {
44    byte & (1 << bit) != 0
45}
46#[inline]
47fn set_bit(byte: u8, bit: u8) -> u8 {
48    byte | (1 << bit)
49}
50#[inline]
51fn unset_bit(byte: u8, bit: u8) -> u8 {
52    byte & 0xFE_u8.rotate_left(bit as u32)
53}
54#[inline]
55fn cond_set_bit(byte: u8, bit: u8, cond: bool) -> u8 {
56    byte | ((1 << bit) * (cond as u8))
57}
58
59#[inline]
60fn set_bit_to(byte: u8, bit: u8, val: bool) -> u8 {
61    cond_set_bit(unset_bit(byte, bit), bit, val)
62}
63/// The methods required by a packet receiver.
64///
65///
66pub trait PacketReceiver {
67    fn cur_time(&self) -> u32;
68    fn last_time(&self) -> u32;
69    fn recv_pkt(&mut self) -> Result<Vec<u8>, Error>;
70    fn recv_pkt_to(&mut self, timeout: Duration) -> Result<Vec<u8>, Error>;
71    #[inline]
72    fn try_recv_pkt(&mut self) -> Result<Vec<u8>, Error> {
73        self.recv_pkt_to(Duration::from_secs(0))
74    }
75    fn start(&mut self) -> Result<(), Error>;
76    fn pause(&mut self) -> Result<(), Error>;
77    fn mtu(&self) -> usize;
78    fn try_iter(&mut self) -> TryIter<'_, Self>
79    where
80        Self: Sized,
81    {
82        TryIter { recv: self }
83    }
84}
85
86pub struct TryIter<'a, T: PacketReceiver> {
87    recv: &'a mut T,
88}
89impl<T: PacketReceiver> Iterator for TryIter<'_, T> {
90    type Item = Vec<u8>;
91    fn next(&mut self) -> Option<Vec<u8>> {
92        self.recv.try_recv_pkt().ok()
93    }
94}
95pub trait IntoPacketReceiver {
96    type Recv: PacketReceiver;
97    fn into_packet_receiver(self) -> Result<Self::Recv, Error>;
98}
99impl<T: PacketReceiver> IntoPacketReceiver for T {
100    type Recv = T;
101    #[inline]
102    fn into_packet_receiver(self) -> Result<Self::Recv, Error> {
103        Ok(self)
104    }
105}
106
107trait NetworkPacketReceiver<N>: PacketReceiver {
108    fn set_network(&mut self, netaddr: N) -> Result<(), Error>;
109}
110trait AddressPacketReceiver<N, A>: NetworkPacketReceiver<N> {
111    fn recv_pkt_addr(&mut self) -> Result<(Vec<u8>, u8), Error>;
112    fn recv_pkt_to_addr(&mut self, timeout: Duration) -> Result<(Vec<u8>, u8), Error>;
113    fn set_addr(&mut self, addr: A) -> Result<(), Error>;
114}
115trait BroadcastPacketReceiver<N, A>: AddressPacketReceiver<N, A> {
116    fn set_broadcast(&mut self, addr: A) -> Result<(), Error>;
117}
118trait VerifiedPacketReceiver: PacketReceiver {
119    fn recv_v_packet(&mut self, bytes: &mut [u8]) -> Result<usize, Error>;
120}
121pub trait PacketSender {
122    fn send_packet(&mut self, msg: &[u8], start_time: u32) -> Result<(), Error>;
123    fn mtu(&self) -> usize;
124}
125pub trait IntoPacketSender {
126    type Send: PacketSender;
127    fn into_packet_sender(self, msg_buf: usize) -> Result<Self::Send, Error>;
128}
129pub trait NetworkPacketSender<N>: PacketSender {
130    fn set_network(&mut self, netaddr: N) -> Result<(), Error>;
131}
132trait AddressPacketSender<N, A>: NetworkPacketSender<N> {
133    fn send_packet_to(&mut self, addr: A) -> Result<(), Error>;
134}
135trait VerifiedPacketSender: PacketSender {
136    fn send_v_packet(&self) -> Result<(), Error>;
137}
138
139enum ConfigMessage<N, A> {
140    SetNetwork(N),
141    SetAddr(A),
142    SetBroadcast(A),
143    SendMessage(Vec<u8>, Instant),
144    Terminate,
145    Pause,
146    Start,
147    Alive, // intended to do nothing, just validate thread is running
148    Verbose(u8),
149}
150
151pub enum Void {}