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), Init(String), IoError(std::io::Error), BadInputs(String), BadMessage(String, Option<usize>), Timeout(String), ChipMalfunction(String), BufferOverflow(usize), Unrecoverable(String), }
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 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}
63pub 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, Verbose(u8),
149}
150
151pub enum Void {}