viterbi 0.2.0

Pure-Rust, no-unsafe convolutional encoder + Viterbi (MLSE) decoder — CCSDS inner FEC: hard & soft-decision (LLR), rate 1/2 & 1/3, puncturing (2/3–7/8), generic constraint length K<=9.
Documentation
// Author: BolivarTech
// Version: 1.0.0
// Date: 2026-07-02
//! End-to-end example: encode a payload, flip one channel bit, and recover it
//! with the CCSDS K=7 R=1/2 hard-decision Viterbi decoder.
//!
//! Run with: `cargo run --example roundtrip`

use viterbi::{CcsdsViterbiDecoder, CodeParams, ViterbiEncoder};

fn main() {
    // Encoder and decoder built from the first-class CCSDS profile.
    let encoder = ViterbiEncoder::new(CodeParams::ccsds_r1_2()).expect("valid CCSDS params");
    let mut decoder =
        CcsdsViterbiDecoder::new(CodeParams::ccsds_r1_2(), 4096).expect("valid decoder config");

    let payload = b"hello, viterbi";

    // Transmit path: encode into a packed coded block.
    let mut coded = encoder.encode(payload).expect("encode succeeds");

    // Channel: simulate a single bit flip in the coded stream.
    coded.bytes[2] ^= 0b0000_0100;

    // Receive path: Viterbi maximum-likelihood decode recovers the payload.
    let decoded = decoder.decode_block(&coded).expect("decode succeeds");

    assert_eq!(
        &decoded.bytes, payload,
        "decoder must correct the injected bit flip"
    );

    println!("recovered: {}", String::from_utf8_lossy(&decoded.bytes));
}