X-Git-Url: https://code.octet-stream.net/m17rt/blobdiff_plain/d5f46a2d5d294c5a4287780dd609475fa73df9a8..608ca7e33ab51d812607ddcc3429bfa9aa3c34b0:/m17core/src/protocol.rs?ds=sidebyside diff --git a/m17core/src/protocol.rs b/m17core/src/protocol.rs index e4b3b15..669e3a0 100755 --- a/m17core/src/protocol.rs +++ b/m17core/src/protocol.rs @@ -1,4 +1,7 @@ -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]; @@ -167,12 +170,12 @@ impl LsfFrame { } pub fn set_destination(&mut self, destination: &Address) { - self.0[0..6].copy_from_slice(&encode_address(&destination)); + self.0[0..6].copy_from_slice(&encode_address(destination)); self.recalculate_crc(); } pub fn set_source(&mut self, source: &Address) { - self.0[6..12].copy_from_slice(&encode_address(&source)); + self.0[6..12].copy_from_slice(&encode_address(source)); self.recalculate_crc(); } @@ -209,6 +212,15 @@ impl LsfFrame { 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, 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()); @@ -295,3 +307,15 @@ impl Default for LichCollection { 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); + } +}