X-Git-Url: https://code.octet-stream.net/m17rt/blobdiff_plain/5fe056d1599b4feff228ae0a398e427b2487dc9a..99f4fcbee0b9774a24ef2428ddce71889e602e3b:/m17core/src/encode.rs diff --git a/m17core/src/encode.rs b/m17core/src/encode.rs index 54f5bc2..0ba20d7 100644 --- a/m17core/src/encode.rs +++ b/m17core/src/encode.rs @@ -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]