]> code.octet-stream.net Git - m17rt/blobdiff - m17core/src/protocol.rs
Fix timing bugs and add documentation
[m17rt] / m17core / src / protocol.rs
index f2e154ea944cb9c4e25517c9dfc1cfa7177b4fba..669e3a0342955f6d0f75f8a8c70442d8f9b2ceba 100755 (executable)
@@ -1,9 +1,14 @@
-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 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 {
 
 #[derive(Debug, Clone, PartialEq, Eq, Copy)]
 pub enum Mode {
@@ -165,12 +170,12 @@ impl LsfFrame {
     }
 
     pub fn set_destination(&mut self, destination: &Address) {
     }
 
     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.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();
     }
 
         self.recalculate_crc();
     }
 
@@ -207,6 +212,15 @@ impl LsfFrame {
         self.recalculate_crc();
     }
 
         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());
     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());
@@ -293,3 +307,15 @@ impl Default for LichCollection {
         Self::new()
     }
 }
         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);
+    }
+}