use super::{ConvCode, LdpcCode, PunctureRate};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct FramePacket {
pub metadata: FrameMetadata,
pub payload: Vec<u8>,
}
impl FramePacket {
pub fn new(metadata: FrameMetadata, payload: Vec<u8>) -> Self {
Self { metadata, payload }
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub struct FrameMetadata {
pub sequence_num: u32,
pub mcs_index: u8,
pub flags: u8,
}
impl FrameMetadata {
pub fn new(sequence_num: u32, mcs_index: u8) -> Self {
Self {
sequence_num,
mcs_index,
flags: 0,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, thiserror::Error)]
pub enum RxError {
#[error("no preamble found")]
PreambleTimeout,
#[error("malformed frame header")]
MalformedHeader,
#[error("header CRC mismatch")]
HeaderCrcMismatch,
#[error("payload CRC mismatch")]
CrcMismatch,
#[error("FEC uncorrectable")]
FecUncorrectable,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum OuterFec {
#[default]
None,
Bch { t: usize },
ReedSolomon { n: usize, n_parity: usize },
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum InnerFec {
#[default]
None,
Ldpc(LdpcCode),
Convolutional { rate: PunctureRate, code: ConvCode },
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum InterleaverKind {
#[default]
None,
Block { rows: usize, cols: usize },
Convolutional { branches: usize, depth: usize },
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum CrcKind {
None,
Crc16,
#[default]
Crc32,
}
impl CrcKind {
pub fn len_bytes(self) -> usize {
match self {
CrcKind::None => 0,
CrcKind::Crc16 => 2,
CrcKind::Crc32 => 4,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SeedMode {
Fixed(u32),
PerFrameRandom,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum ScramblerKind {
#[default]
None,
Additive {
poly: u32,
width: u8,
seed: SeedMode,
},
DvbTEnergyDispersal,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum ScramblerPos {
#[default]
BeforeOuterFec,
AfterInnerFec,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum HeaderFormat {
#[default]
OrionSdr,
NoHeader,
DvbTps,
}
impl HeaderFormat {
pub fn has_header_block(self) -> bool {
matches!(self, HeaderFormat::OrionSdr)
}
}