-use crate::address::{encode_address, Address};
+use crate::{
+ address::{encode_address, Address},
+ bits::BitsMut,
+};
pub(crate) const LSF_SYNC: [i8; 8] = [1, 1, 1, 1, -1, -1, 1, -1];
pub(crate) const BERT_SYNC: [i8; 8] = [-1, 1, -1, -1, 1, 1, 1, 1];
pub(crate) const STREAM_SYNC: [i8; 8] = [-1, -1, -1, -1, 1, 1, -1, 1];
pub(crate) const PACKET_SYNC: [i8; 8] = [1, -1, 1, 1, -1, -1, -1, -1];
+pub(crate) const PREAMBLE: [i8; 8] = [1, -1, 1, -1, 1, -1, 1, -1];
+pub(crate) const END_OF_TRANSMISSION: [i8; 8] = [1, 1, 1, 1, 1, 1, -1, 1];
#[derive(Debug, Clone, PartialEq, Eq, Copy)]
pub enum Mode {
pub struct LsfFrame(pub [u8; 30]);
impl LsfFrame {
+ pub fn new_voice(source: &Address, destination: &Address) -> Self {
+ let mut out = Self([0u8; 30]);
+ out.set_source(source);
+ out.set_destination(destination);
+ out.set_mode(Mode::Stream);
+ out.set_data_type(DataType::Voice);
+ out.set_encryption_type(EncryptionType::None);
+ out
+ }
+
pub fn new_packet(source: &Address, destination: &Address) -> Self {
let mut out = Self([0u8; 30]);
out.set_source(source);
self.recalculate_crc();
}
+ pub fn set_channel_access_number(&mut self, number: u8) {
+ let mut bits = BitsMut::new(&mut self.0);
+ bits.set_bit(12 * 8 + 5, (number >> 3) & 1);
+ bits.set_bit(12 * 8 + 6, (number >> 2) & 1);
+ bits.set_bit(12 * 8 + 7, (number >> 1) & 1);
+ bits.set_bit(13 * 8 + 0, number & 1);
+ self.recalculate_crc();
+ }
+
fn recalculate_crc(&mut self) {
let new_crc = crate::crc::m17_crc(&self.0[0..28]);
self.0[28..30].copy_from_slice(&new_crc.to_be_bytes());
Self::new()
}
}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn set_can() {
+ let mut frame = LsfFrame([0u8; 30]);
+ frame.set_channel_access_number(11);
+ assert_eq!(frame.channel_access_number(), 11);
+ }
+}