fn rf_channel_freq(rf_channel: u8) -> u16 {
2402 + u16::from(rf_channel) * 2
}
fn whitening_iv(channel_idx: u8) -> u8 {
debug_assert!(channel_idx <= 39);
0b01000000 | channel_idx
}
#[derive(Copy, Clone, Debug)]
pub struct AdvertisingChannel(u8);
impl AdvertisingChannel {
pub fn first() -> Self {
AdvertisingChannel(37)
}
pub fn iter_all() -> impl Iterator<Item = Self> {
[
AdvertisingChannel(37),
AdvertisingChannel(38),
AdvertisingChannel(39),
]
.iter()
.cloned()
}
pub fn cycle(&self) -> Self {
if self.0 == 39 {
AdvertisingChannel(37)
} else {
AdvertisingChannel(self.0 + 1)
}
}
pub fn channel(&self) -> u8 {
self.0
}
pub fn rf_channel(&self) -> u8 {
match self.0 {
37 => 0,
38 => 12,
39 => 39,
_ => unreachable!(),
}
}
pub fn freq(&self) -> u16 {
rf_channel_freq(self.rf_channel())
}
pub fn whitening_iv(&self) -> u8 {
whitening_iv(self.0)
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct DataChannel(u8);
impl DataChannel {
pub fn new(index: u8) -> Self {
assert!(index <= 36);
DataChannel(index)
}
pub fn index(&self) -> u8 {
self.0
}
pub fn rf_channel(&self) -> u8 {
match self.0 {
ch @ 0..=10 => ch + 1,
ch @ 11..=36 => ch + 2,
_ => unreachable!(),
}
}
pub fn freq(&self) -> u16 {
rf_channel_freq(self.rf_channel())
}
pub fn whitening_iv(&self) -> u8 {
whitening_iv(self.0)
}
}
pub trait Radio {
fn transmit(&mut self, buf: &mut [u8], freq: u16);
}