#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub struct Config {
pub channel: UwbChannel,
pub sfd_sequence: SfdSequence,
pub pulse_repetition_frequency: PulseRepetitionFrequency,
pub preamble_length: PreambleLength,
pub bitrate: BitRate,
pub frame_filtering: bool,
pub ranging_enable: bool,
pub sts_mode: StsMode,
pub sts_len: StsLen,
pub sfd_timeout: u32,
pub tx_preamble_code: Option<u8>,
pub rx_preamble_code: Option<u8>,
pub phr_mode: PhrMode,
pub phr_rate: PhrRate,
pub pdoa_mode: PdoaMode,
}
impl Default for Config {
fn default() -> Self {
Config {
channel: Default::default(),
sfd_sequence: Default::default(),
pulse_repetition_frequency: Default::default(),
preamble_length: Default::default(),
bitrate: Default::default(),
frame_filtering: false,
ranging_enable: false,
sts_mode: Default::default(), sts_len: Default::default(),
sfd_timeout: 129,
tx_preamble_code: None,
rx_preamble_code: None,
phr_mode: Default::default(),
phr_rate: Default::default(),
pdoa_mode: Default::default(),
}
}
}
#[derive(Copy, Clone, Debug, Eq, PartialEq, Default)]
pub enum BitRate {
#[default]
Kbps850 = 0,
Kbps6800 = 1,
}
#[derive(Copy, Clone, Debug, Eq, PartialEq, Default)]
pub enum PulseRepetitionFrequency {
Mhz16 = 0b01,
#[default]
Mhz64 = 0b10,
}
impl PulseRepetitionFrequency {
pub fn get_recommended_rx_tune_en(&self) -> u8 {
match self {
PulseRepetitionFrequency::Mhz16 => 0,
PulseRepetitionFrequency::Mhz64 => 1,
}
}
}
#[derive(Copy, Clone, Debug, Eq, PartialEq, Default)]
pub enum PreambleLength {
Symbols64 = 0b0001,
Symbols1024 = 0b0010,
Symbols4096 = 0b0011,
Symbols32 = 0b0100,
#[default]
Symbols128 = 0b0101,
Symbols1536 = 0b0110,
Symbols256 = 0b1001,
Symbols2048 = 0b1010,
Symbols512 = 0b1101,
Symbols72 = 0b0111,
}
impl PreambleLength {
pub fn get_recommended_pac_size(&self) -> u8 {
match self {
PreambleLength::Symbols32 => 3, PreambleLength::Symbols64 => 0, PreambleLength::Symbols128 => 1, PreambleLength::Symbols256 => 1,
PreambleLength::Symbols512 => 1,
PreambleLength::Symbols1024 => 1,
PreambleLength::Symbols1536 => 1,
PreambleLength::Symbols2048 => 1,
PreambleLength::Symbols4096 => 1,
PreambleLength::Symbols72 => 1, }
}
pub fn get_num_of_symbols(&self) -> usize {
match self {
PreambleLength::Symbols32 => 32,
PreambleLength::Symbols64 => 64,
PreambleLength::Symbols128 => 128,
PreambleLength::Symbols256 => 256,
PreambleLength::Symbols512 => 512,
PreambleLength::Symbols1024 => 1024,
PreambleLength::Symbols1536 => 1536,
PreambleLength::Symbols2048 => 2048,
PreambleLength::Symbols4096 => 4096,
PreambleLength::Symbols72 => 72,
}
}
}
#[derive(Copy, Clone, Debug, Eq, PartialEq, Default)]
pub enum SfdSequence {
#[default]
IeeeShort = 0b00,
Decawave8 = 0b01,
Decawave16 = 0b10,
Ieee = 0b11,
}
#[derive(Copy, Clone, Debug, Eq, PartialEq, Default)]
pub enum UwbChannel {
#[default]
Channel5 = 0,
Channel9 = 1,
}
impl UwbChannel {
pub fn get_recommended_preamble_code(&self, prf_value: PulseRepetitionFrequency) -> u8 {
match (self, prf_value) {
(UwbChannel::Channel5, PulseRepetitionFrequency::Mhz16) => 4, (UwbChannel::Channel9, PulseRepetitionFrequency::Mhz16) => 4, (UwbChannel::Channel5, PulseRepetitionFrequency::Mhz64) => 9, (UwbChannel::Channel9, PulseRepetitionFrequency::Mhz64) => 9, }
}
pub fn get_recommended_rf_tx_ctrl_2(&self) -> u32 {
match self {
UwbChannel::Channel5 => 0x1C071134,
UwbChannel::Channel9 => 0x1C010034,
}
}
pub fn get_recommended_pll_conf(&self) -> u16 {
match self {
UwbChannel::Channel5 => 0x1F3C,
UwbChannel::Channel9 => 0x0F3C,
}
}
pub fn get_recommended_dgc_lut_0(&self) -> u32 {
match self {
UwbChannel::Channel5 => 0x0001C0FD,
UwbChannel::Channel9 => 0x0002A8FE,
}
}
pub fn get_recommended_dgc_lut_1(&self) -> u32 {
match self {
UwbChannel::Channel5 => 0x0001C43E,
UwbChannel::Channel9 => 0x0002AC36,
}
}
pub fn get_recommended_dgc_lut_2(&self) -> u32 {
match self {
UwbChannel::Channel5 => 0x0001C6BE,
UwbChannel::Channel9 => 0x0002A5FE,
}
}
pub fn get_recommended_dgc_lut_3(&self) -> u32 {
match self {
UwbChannel::Channel5 => 0x0001C77E,
UwbChannel::Channel9 => 0x0002AF3E,
}
}
pub fn get_recommended_dgc_lut_4(&self) -> u32 {
match self {
UwbChannel::Channel5 => 0x0001CF36,
UwbChannel::Channel9 => 0x0002AF7D,
}
}
pub fn get_recommended_dgc_lut_5(&self) -> u32 {
match self {
UwbChannel::Channel5 => 0x0001CFB5,
UwbChannel::Channel9 => 0x0002AFB5,
}
}
pub fn get_recommended_dgc_lut_6(&self) -> u32 {
match self {
UwbChannel::Channel5 => 0x0001CFF5,
UwbChannel::Channel9 => 0x0002AFB5,
}
}
}
#[derive(Copy, Clone, Debug, Eq, PartialEq, Default)]
#[repr(u8)]
pub enum StsMode {
#[default]
StsModeOff = 0,
StsMode1 = 1,
StsMode2 = 2,
StsModeND = 3,
}
#[derive(Copy, Clone, Debug, Eq, PartialEq, Default)]
pub enum StsLen {
StsLen32 = 4,
#[default]
StsLen64 = 8,
StsLen128 = 16,
StsLen256 = 32,
StsLen512 = 64,
StsLen1024 = 128,
StsLn2048 = 256,
}
impl StsLen {
pub fn get_sts_length(&self) -> u16 {
match self {
StsLen::StsLen32 => 32,
StsLen::StsLen64 => 64,
StsLen::StsLen128 => 128,
StsLen::StsLen256 => 256,
StsLen::StsLen512 => 512,
StsLen::StsLen1024 => 1024,
StsLen::StsLn2048 => 2048,
}
}
pub fn get_sts_mnth(&self, pdoa_mode: PdoaMode) -> u16 {
let sts_length_8 = match self {
StsLen::StsLen32 => 4,
StsLen::StsLen64 => 8,
StsLen::StsLen128 => 16,
StsLen::StsLen256 => 32,
StsLen::StsLen512 => 64,
StsLen::StsLen1024 => 128,
StsLen::StsLn2048 => 256,
};
let y = match pdoa_mode {
PdoaMode::Mode0 | PdoaMode::Mode1 => 8,
PdoaMode::Mode3 => 16,
};
let squared = 0x10 * 0x10 * sts_length_8 / y;
let sqrt = |x: u32| -> u32 {
let mut z = (x + 1) / 2;
let mut y = x;
while z < y {
y = z;
z = (x / z + z) / 2;
}
y
};
sqrt(squared as u32) as u16
}
}
#[derive(Copy, Clone, Debug, Eq, PartialEq, Default)]
pub enum PhrMode {
#[default]
Standard = 0,
Extended = 1,
}
#[derive(Copy, Clone, Debug, Eq, PartialEq, Default)]
#[repr(u8)]
pub enum PdoaMode {
#[default]
Mode0 = 0x0,
Mode1 = 0x1,
Mode3 = 0x3,
}
#[derive(Copy, Clone, Debug, Eq, PartialEq, Default)]
#[repr(u8)]
pub enum PhrRate {
#[default]
Standard = 0,
DataRate = 1,
}