]> code.octet-stream.net Git - m17rt/blobdiff - m17core/src/encode.rs
fast demod bin
[m17rt] / m17core / src / encode.rs
index 54f5bc2db2d6c7928c9e87087221e8df8a0cbdb6..0ba20d78b8d500d11e7bf499bc0e74f4ef1b481c 100644 (file)
@@ -3,7 +3,7 @@ use crate::{
     fec::{self, p_1, p_2, p_3},
     interleave::interleave,
     protocol::{
-        LsfFrame, PacketFrame, PacketFrameCounter, StreamFrame, LSF_SYNC, PACKET_SYNC, STREAM_SYNC,
+        LSF_SYNC, LsfFrame, PACKET_SYNC, PacketFrame, PacketFrameCounter, STREAM_SYNC, StreamFrame,
     },
     random::random_xor,
 };
@@ -31,17 +31,40 @@ pub(crate) fn encode_packet(frame: &PacketFrame) -> [f32; 192] {
     match frame.counter {
         PacketFrameCounter::Frame { index } => {
             type1[0..25].copy_from_slice(&frame.payload);
-            type1[25] = (index as u8) << 3;
+            type1[25] = (index as u8) << 2;
         }
         PacketFrameCounter::FinalFrame { payload_len } => {
             type1[0..payload_len].copy_from_slice(&frame.payload[0..payload_len]);
-            type1[25] = (payload_len as u8) << 3 | 0x04;
+            type1[25] = ((payload_len as u8) << 2) | 0x80;
         }
     }
     let type3 = fec::encode(&type1, 206, p_3);
     interleave_to_dibits(type3, PACKET_SYNC)
 }
 
+/// Generate a preamble suitable for placement before an LSF frame.
+///
+/// Polarity needs to be flipped for BERT, however we don't support this yet.
+/// STREAM and PACKET don't need to be considered as they are an invalid way to
+/// begin a transmission.
+pub(crate) fn generate_preamble() -> [f32; 192] {
+    // TODO: should all these encode/generate functions return owning iterators?
+    // Then I could avoid making this array which I'm just going to have to copy anyway
+    let mut out = [1.0f32; 192];
+    for n in out.iter_mut().skip(1).step_by(2) {
+        *n = -1.0;
+    }
+    out
+}
+
+pub(crate) fn generate_end_of_transmission() -> [f32; 192] {
+    let mut out = [1.0f32; 192];
+    for n in out.iter_mut().skip(6).step_by(8) {
+        *n = -1.0;
+    }
+    out
+}
+
 pub(crate) fn encode_lich(counter: u8, part: &[u8; 5]) -> [u8; 12] {
     let mut out = [0u8; 12];
     let to_encode = [
@@ -90,7 +113,7 @@ mod tests {
         ]);
         let encoded = encode_lsf(&lsf);
         let decoded = crate::decode::parse_lsf(&encoded);
-        assert_eq!(decoded, Some(lsf));
+        assert!(matches!(decoded, Some((frame, _)) if frame == lsf));
     }
 
     #[test]
@@ -104,7 +127,7 @@ mod tests {
         };
         let encoded = encode_stream(&stream);
         let decoded = crate::decode::parse_stream(&encoded);
-        assert_eq!(decoded, Some(stream));
+        assert!(matches!(decoded, Some((frame, _)) if frame == stream));
     }
 
     #[test]
@@ -115,7 +138,7 @@ mod tests {
         };
         let encoded = encode_packet(&packet);
         let decoded = crate::decode::parse_packet(&encoded);
-        assert_eq!(decoded, Some(packet));
+        assert!(matches!(decoded, Some((frame, _)) if frame == packet));
 
         let packet = PacketFrame {
             payload: [0u8; 25],
@@ -123,7 +146,7 @@ mod tests {
         };
         let encoded = encode_packet(&packet);
         let decoded = crate::decode::parse_packet(&encoded);
-        assert_eq!(decoded, Some(packet));
+        assert!(matches!(decoded, Some((frame, _)) if frame == packet));
     }
 
     #[test]