Skip to main content

leodos_protocols/coding/
proximity1.rs

1//! Proximity-1 Coding and Synchronization (CCSDS 211.2-B-3).
2//!
3//! Composes existing coding primitives into the Proximity-1 coding
4//! pipeline: randomizer → convolutional FEC (rate 1/2, K=7) →
5//! 24-bit ASM framing.
6//!
7//! The write pipeline accepts a Proximity-1 transfer frame and
8//! produces a coded PLTU (Proximity Link Transmission Unit) ready
9//! for GMSK modulation. The read pipeline reverses this.
10
11use crate::coding::fec::convolutional::ConvolutionalEncoder;
12use crate::coding::fec::convolutional::ViterbiDecoder;
13use crate::coding::framing::cadu::AsmDeframer;
14use crate::coding::framing::cadu::AsmFramer;
15use crate::coding::pipeline::CodingReader;
16use crate::coding::pipeline::CodingWriter;
17use crate::coding::randomizer::TcRandomizer;
18use crate::physical::PhysicalRead;
19use crate::physical::PhysicalWrite;
20
21/// Maximum Proximity-1 transfer frame size (2048 octets per spec).
22pub const MAX_FRAME_SIZE: usize = 2048;
23
24/// PLTU buffer size: frame (2048) × 2 (rate 1/2 FEC) + ASM (3) + margin.
25const PLTU_BUF: usize = 8192;
26
27/// Default hard-decision LLR magnitude for Viterbi decoding.
28const LLR_MAG: i16 = 127;
29
30/// Creates a Proximity-1 coding write pipeline.
31///
32/// Pipeline: randomizer → convolutional (rate 1/2) → 24-bit ASM → writer.
33pub fn writer<W: PhysicalWrite>(
34    writer: W,
35) -> CodingWriter<TcRandomizer, ConvolutionalEncoder, AsmFramer, W, PLTU_BUF> {
36    CodingWriter::new(
37        TcRandomizer::new(),
38        ConvolutionalEncoder,
39        AsmFramer::proximity1(),
40        writer,
41    )
42}
43
44/// Creates a Proximity-1 coding read pipeline.
45///
46/// Pipeline: reader → 24-bit ASM sync → Viterbi → derandomizer.
47pub fn reader<R: PhysicalRead>(
48    reader: R,
49    frame_len: usize,
50) -> CodingReader<TcRandomizer, AsmDeframer, ViterbiDecoder, R, PLTU_BUF> {
51    CodingReader::new(
52        TcRandomizer::new(),
53        AsmDeframer::proximity1(frame_len),
54        ViterbiDecoder::new(LLR_MAG),
55        reader,
56    )
57}