X-Git-Url: https://code.octet-stream.net/m17rt/blobdiff_plain/f9af623dd10c967733af7bfb5efa20fbc7033072..9058451e46e4d36264282abe381aa9b6fd2c773f:/m17core/src/decode.rs diff --git a/m17core/src/decode.rs b/m17core/src/decode.rs index de13124..76c40d3 100755 --- a/m17core/src/decode.rs +++ b/m17core/src/decode.rs @@ -94,7 +94,7 @@ pub(crate) fn parse_lsf(frame: &[f32] /* length 192 */) -> Option { None => return None, }; debug!("full lsf: {:?}", lsf.0); - let crc = lsf.crc(); + let crc = lsf.check_crc(); debug!("recv crc: {:04X}", crc); debug!("destination: {:?}", lsf.destination()); debug!("source: {:?}", lsf.source()); @@ -106,20 +106,6 @@ pub(crate) fn parse_lsf(frame: &[f32] /* length 192 */) -> Option { Some(lsf) } -pub(crate) fn try_lich_decode(type2_bits: &[u8]) -> Option<(u8, [u8; 5])> { - let mut decoded = 0u64; - for (input_idx, input_bytes) in type2_bits.chunks(3).enumerate() { - let mut input: u32 = 0; - for (idx, byte) in input_bytes.iter().enumerate() { - input |= (*byte as u32) << (16 - (8 * idx)); - } - let (val, _dist) = cai_golay::extended::decode(input)?; - decoded |= (val as u64) << ((3 - input_idx) * 12); - } - let b = decoded.to_be_bytes(); - Some((b[7] >> 5, [b[2], b[3], b[4], b[5], b[6]])) -} - pub(crate) fn parse_stream(frame: &[f32] /* length 192 */) -> Option { let deinterleaved = frame_initial_decode(frame); let stream_part = &deinterleaved[12..]; @@ -132,8 +118,11 @@ pub(crate) fn parse_stream(frame: &[f32] /* length 192 */) -> Option Option packet, None => return None, }; - let final_frame = (packet[25] & 0x80) > 0; - let number = (packet[25] >> 2) & 0x01f; + // TODO: the spec is inconsistent about which bit in packet[25] is EOF + // https://github.com/M17-Project/M17_spec/issues/147 + let final_frame = (packet[25] & 0x04) > 0; + let number = packet[25] >> 3; let counter = if final_frame { PacketFrameCounter::FinalFrame { payload_len: number as usize, @@ -168,3 +159,30 @@ pub(crate) fn parse_packet(frame: &[f32] /* length 192 */) -> Option Option<(u8, [u8; 5])> { + let mut decoded = 0u64; + for (input_idx, input_bytes) in type2_bits.chunks(3).enumerate() { + let mut input: u32 = 0; + for (idx, byte) in input_bytes.iter().enumerate() { + input |= (*byte as u32) << (16 - (8 * idx)); + } + let (val, _dist) = cai_golay::extended::decode(input)?; + decoded |= (val as u64) << ((3 - input_idx) * 12); + } + let b = decoded.to_be_bytes(); + Some((b[7] >> 5, [b[2], b[3], b[4], b[5], b[6]])) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_lich_decode() { + let input = [221, 82, 162, 16, 85, 200, 5, 14, 254, 4, 13, 153]; + let expected_counter = 2; + let expected_part = [221, 81, 5, 5, 0]; + assert_eq!(decode_lich(&input), Some((expected_counter, expected_part))); + } +}