#[repr(u8)]
#[derive(Clone, Copy)]
#[allow(dead_code)]
pub enum GfskPulseShape {
NoFilter = 0x00,
GaussianBt0_3 = 0x08,
GaussianBt0_5 = 0x09,
GaussianBt0_7 = 0x0A,
GaussianBt1 = 0x0B,
}
#[repr(u8)]
#[derive(Clone, Copy)]
#[allow(dead_code)]
pub enum GfskBandwidth {
B48 = 0x1f,
B58 = 0x17,
B73 = 0x0f,
B97 = 0x1e,
}
#[repr(u8)]
#[derive(Clone, Copy)]
#[allow(dead_code)]
pub enum LoraSpreadingFactor {
SF5 = 0x05,
SF6 = 0x06,
SF7 = 0x07,
SF8 = 0x08,
SF9 = 0x09,
SF10 = 0x0A,
SF11 = 0x0B,
SF12 = 0x0C,
}
impl LoraSpreadingFactor {
pub fn val_8x(&self) -> u8 {
match self {
Self::SF5 => 0x50,
Self::SF6 => 0x60,
Self::SF7 => 0x70,
Self::SF8 => 0x80,
Self::SF9 => 0x90,
Self::SF10 => 0xA0,
Self::SF11 => 0xB0,
Self::SF12 => 0xC0,
}
}
}
#[repr(u8)]
#[derive(Clone, Copy, PartialEq)]
#[allow(non_camel_case_types, dead_code)]
pub enum LoraBandwidth6x {
BW_7 = 0x00,
BW_10 = 0x08,
BW_15 = 0x01,
BW_20 = 0x09,
BW_31 = 0x02,
BW_41 = 0x0A,
BW_62 = 0x03,
BW_125 = 0x04,
BW_250 = 0x05,
BW_500 = 0x06,
}
#[repr(u8)]
#[derive(Clone, Copy, PartialEq)]
#[allow(non_camel_case_types, dead_code)]
pub enum LoraBandwidth8x {
BW_1600 = 0x0a,
BW_800 = 0x18,
BW_400 = 0x26,
BW_200 = 0x34,
}
#[repr(u8)]
#[derive(Clone, Copy)]
#[allow(non_camel_case_types, dead_code)]
pub enum LoraCodingRate {
CR_4_5 = 1,
CR_4_6 = 2,
CR_4_7 = 3,
CR_4_8 = 4,
CR_LI_4_5 = 5,
CR_LI_4_6 = 6,
CR_LI_4_8 = 7,
}
#[repr(u8)]
#[derive(Clone, Copy)]
#[allow(dead_code)]
pub enum LoraLdrOptimization {
Disabled = 0,
Enabled = 1,
}
#[repr(u8)]
#[derive(Clone, Copy)]
#[allow(non_camel_case_types, dead_code)]
pub enum FlrcBitrate {
BR_1_3 = 0x45,
BR_1_0 = 0x69,
BR_0_6 = 0x86,
BR_0_5 = 0xaa,
BR_0_3 = 0xc7,
BR_0_2 = 0xeb,
}
#[repr(u8)]
#[derive(Clone, Copy)]
#[allow(non_camel_case_types, dead_code)]
pub enum FlrcCodingRate {
CR_1_2 = 0x00,
CR_3_4 = 0x02,
CR1_1 = 0x04,
}
#[repr(u8)]
#[derive(Clone, Copy)]
#[allow(non_camel_case_types, dead_code)]
pub enum FlrcBt {
Disabled = 0x00,
BT_1 = 0x10,
BT_0_5 = 0x20,
}
#[derive(Clone)]
pub enum ModulationParams8x {
Lora(ModulationParamsLora8x),
Flrc(ModulationParamsFlrc),
}
impl Default for ModulationParams8x {
fn default() -> Self {
Self::Lora(Default::default())
}
}
#[derive(Clone)]
pub struct ModulationParamsLora6x {
pub mod_bandwidth: LoraBandwidth6x,
pub spreading_factor: LoraSpreadingFactor,
pub coding_rate: LoraCodingRate,
pub low_data_rate_optimization: LoraLdrOptimization,
}
impl Default for ModulationParamsLora6x {
fn default() -> Self {
Self {
mod_bandwidth: LoraBandwidth6x::BW_500,
spreading_factor: LoraSpreadingFactor::SF5,
coding_rate: LoraCodingRate::CR_4_5,
low_data_rate_optimization: LoraLdrOptimization::Disabled,
}
}
}
#[derive(Clone)]
pub struct ModulationParamsLora8x {
pub mod_bandwidth: LoraBandwidth8x,
pub spreading_factor: LoraSpreadingFactor,
pub coding_rate: LoraCodingRate,
}
impl Default for ModulationParamsLora8x {
fn default() -> Self {
Self {
mod_bandwidth: LoraBandwidth8x::BW_800,
spreading_factor: LoraSpreadingFactor::SF5,
coding_rate: LoraCodingRate::CR_LI_4_6,
}
}
}
#[derive(Clone)]
pub struct ModulationParamsFlrc {
pub bitrate: FlrcBitrate,
pub coding_rate: FlrcCodingRate,
pub bt: FlrcBt,
}
impl Default for ModulationParamsFlrc {
fn default() -> Self {
Self {
bitrate: FlrcBitrate::BR_0_6,
coding_rate: FlrcCodingRate::CR_1_2,
bt: FlrcBt::BT_1,
}
}
}
#[derive(Clone, Copy)]
pub enum LoraHeaderType {
VariableLength,
FixedLength,
}
impl LoraHeaderType {
pub fn val_6x(&self) -> u8 {
match self {
Self::VariableLength => 0x00,
Self::FixedLength => 0x01,
}
}
pub fn val_8x(&self) -> u8 {
match self {
Self::VariableLength => 0x00,
Self::FixedLength => 0x80,
}
}
}
#[repr(u8)]
#[derive(Clone, Copy)]
#[allow(non_camel_case_types, dead_code)]
pub enum FlrcPreambleLen {
P8 = 0x10,
P12 = 0x20,
P16 = 0x30,
P20 = 0x40,
P24 = 0x50,
P28 = 0x60,
P32 = 0x70,
}
#[repr(u8)]
#[derive(Clone, Copy)]
#[allow(non_camel_case_types, dead_code)]
pub enum FlrcSyncWordLen {
NoSync = 0x00,
P32 = 0x04,
}
#[repr(u8)]
#[derive(Clone, Copy)]
#[allow(non_camel_case_types, dead_code)]
pub enum FlrcSyncWordCombo {
Disabled = 0x00,
SyncWord1 = 0x10,
SyncWord2 = 0x20,
SyncWord1Or2 = 0x30,
SyncWord3 = 0x40,
SyncWord1Or3 = 0x50,
SyncWord2Or3 = 0x60,
SyncWord1Or2Or3 = 0x70,
}
#[repr(u8)]
#[derive(Clone, Copy)]
#[allow(non_camel_case_types, dead_code)]
pub enum FlrcPacketType {
LenFixed = 0x00,
LenVariable = 0x20,
}
#[repr(u8)]
#[derive(Clone, Copy)]
#[allow(non_camel_case_types, dead_code)]
pub enum FlrcCrc {
CrcOff = 0x00,
Crc2Byte = 0x10,
Crc3Byte = 0x20,
Crc4Byte = 0x30,
}
#[repr(u8)]
#[derive(Clone, Copy)]
pub enum CrcEnabled {
Disabled,
Enabled,
}
impl CrcEnabled {
pub fn val_6x(&self) -> u8 {
match self {
Self::Disabled => 0,
Self::Enabled => 1,
}
}
pub fn val_8x(&self) -> u8 {
match self {
Self::Disabled => 0,
Self::Enabled => 0x20,
}
}
}
#[repr(u8)]
#[derive(Clone, Copy)]
pub enum InvertIq {
Standard,
Inverted,
}
impl InvertIq {
pub fn val_6x(&self) -> u8 {
match self {
Self::Standard => 0,
Self::Inverted => 1,
}
}
pub fn val_8x(&self) -> u8 {
match self {
Self::Standard => 0x40,
Self::Inverted => 0,
}
}
}
#[derive(Clone)]
pub enum PacketParams {
Lora(PacketParamsLora),
Flrc(PacketParamsFlrc),
}
impl Default for PacketParams {
fn default() -> Self {
Self::Lora(Default::default())
}
}
#[derive(Clone)]
pub struct PacketParamsLora {
pub preamble_len: u16,
pub header_type: LoraHeaderType,
pub payload_len: u8,
pub crc_enabled: CrcEnabled,
pub invert_iq: InvertIq,
}
impl Default for PacketParamsLora {
fn default() -> Self {
Self {
preamble_len: 12, header_type: LoraHeaderType::VariableLength,
payload_len: 0, crc_enabled: CrcEnabled::Enabled,
invert_iq: InvertIq::Standard,
}
}
}
#[derive(Clone)]
pub struct PacketParamsFlrc {
pub preamble_len: FlrcPreambleLen,
pub sync_word_len: FlrcSyncWordLen,
pub sync_word_combo: FlrcSyncWordCombo,
pub packet_type: FlrcPacketType,
pub payload_len: u8,
pub crc: FlrcCrc,
}
impl Default for PacketParamsFlrc {
fn default() -> Self {
Self {
preamble_len: FlrcPreambleLen::P16, sync_word_len: FlrcSyncWordLen::NoSync, sync_word_combo: FlrcSyncWordCombo::Disabled,
packet_type: FlrcPacketType::LenVariable, payload_len: 0,
crc: FlrcCrc::CrcOff,
}
}
}