use bitflags::bitflags;
use core::convert::Infallible;
use crate::{Command, NoParameters, ToByteArray};
bitflags! {
#[derive(Debug, Clone, Copy)]
pub struct SleepConfig: u8 {
const WARM_START = 1 << 2;
const RTC_WAKEUP = 1;
}
}
impl ToByteArray for SleepConfig {
type Error = Infallible;
type Array = [u8; 1];
fn to_bytes(self) -> Result<Self::Array, Self::Error> {
Ok([self.bits()])
}
}
#[derive(Debug, Clone)]
pub struct SetSleep {
pub config: SleepConfig,
}
impl Command for SetSleep {
type IdType = u8;
type CommandParameters = SleepConfig;
type ResponseParameters = NoParameters;
fn id() -> Self::IdType {
0x84
}
fn invoking_parameters(self) -> Self::CommandParameters {
self.config
}
}
#[derive(Debug, Clone, Copy)]
pub enum StandbyConfig {
Rc = 0,
Xosc = 1,
}
impl ToByteArray for StandbyConfig {
type Error = Infallible;
type Array = [u8; 1];
fn to_bytes(self) -> Result<Self::Array, Self::Error> {
Ok([self as u8])
}
}
#[derive(Debug, Clone)]
pub struct SetStandby {
pub config: StandbyConfig,
}
impl Command for SetStandby {
type IdType = u8;
type CommandParameters = StandbyConfig;
type ResponseParameters = NoParameters;
fn id() -> Self::IdType {
0x80
}
fn invoking_parameters(self) -> Self::CommandParameters {
self.config
}
}
#[derive(Debug, Clone)]
pub struct SetFs;
impl Command for SetFs {
type IdType = u8;
type CommandParameters = NoParameters;
type ResponseParameters = NoParameters;
fn id() -> Self::IdType {
0xC1
}
fn invoking_parameters(self) -> Self::CommandParameters {
NoParameters::default()
}
}
#[derive(Debug, Clone, Copy)]
pub struct Timeout(pub u32);
impl ToByteArray for Timeout {
type Error = Infallible;
type Array = [u8; 3];
fn to_bytes(self) -> Result<Self::Array, Self::Error> {
let mut bytes = [0u8; 3];
bytes.copy_from_slice(&self.0.to_be_bytes()[1..4]);
Ok(bytes)
}
}
#[derive(Debug, Clone)]
pub struct SetTx {
pub timeout: Timeout,
}
impl Command for SetTx {
type IdType = u8;
type CommandParameters = Timeout;
type ResponseParameters = NoParameters;
fn id() -> Self::IdType {
0x83
}
fn invoking_parameters(self) -> Self::CommandParameters {
self.timeout
}
}
#[derive(Debug, Clone, Copy)]
pub enum RxMode {
Single,
Continuous,
Timed(u32),
}
impl From<RxMode> for Timeout {
fn from(mode: RxMode) -> Self {
match mode {
RxMode::Single => Timeout(0x000000),
RxMode::Continuous => Timeout(0xFFFFFF),
RxMode::Timed(timeout) => Timeout(timeout),
}
}
}
#[derive(Debug, Clone)]
pub struct SetRx {
pub mode: RxMode,
}
impl Command for SetRx {
type IdType = u8;
type CommandParameters = Timeout;
type ResponseParameters = NoParameters;
fn id() -> Self::IdType {
0x82
}
fn invoking_parameters(self) -> Self::CommandParameters {
self.mode.into()
}
}
bitflags! {
#[derive(Debug, Clone, Copy)]
pub struct StopTimerOnPreambleConfig: u8 {
const STOP_ON_PREAMBLE = 1;
}
}
impl ToByteArray for StopTimerOnPreambleConfig {
type Error = Infallible;
type Array = [u8; 1];
fn to_bytes(self) -> Result<Self::Array, Self::Error> {
Ok([self.bits()])
}
}
#[derive(Debug, Clone)]
pub struct StopTimerOnPreamble {
pub config: StopTimerOnPreambleConfig,
}
impl Command for StopTimerOnPreamble {
type IdType = u8;
type CommandParameters = StopTimerOnPreambleConfig;
type ResponseParameters = NoParameters;
fn id() -> Self::IdType {
0x9F
}
fn invoking_parameters(self) -> Self::CommandParameters {
self.config
}
}
#[derive(Debug, Clone, Copy)]
pub struct RxDutyCycleConfig {
pub rx_period: u32,
pub sleep_period: u32,
}
impl ToByteArray for RxDutyCycleConfig {
type Error = Infallible;
type Array = [u8; 8];
fn to_bytes(self) -> Result<Self::Array, Self::Error> {
let mut bytes = [0u8; 8];
bytes[0..4].copy_from_slice(&self.rx_period.to_be_bytes());
bytes[4..8].copy_from_slice(&self.sleep_period.to_be_bytes());
Ok(bytes)
}
}
#[derive(Debug, Clone)]
pub struct SetRxDutyCycle {
pub config: RxDutyCycleConfig,
}
impl Command for SetRxDutyCycle {
type IdType = u8;
type CommandParameters = RxDutyCycleConfig;
type ResponseParameters = NoParameters;
fn id() -> Self::IdType {
0x94
}
fn invoking_parameters(self) -> Self::CommandParameters {
self.config
}
}
#[derive(Debug, Clone)]
pub struct SetCad;
impl Command for SetCad {
type IdType = u8;
type CommandParameters = NoParameters;
type ResponseParameters = NoParameters;
fn id() -> Self::IdType {
0xC5
}
fn invoking_parameters(self) -> Self::CommandParameters {
NoParameters::default()
}
}
#[derive(Debug, Clone)]
pub struct SetTxContinuousWave;
impl Command for SetTxContinuousWave {
type IdType = u8;
type CommandParameters = NoParameters;
type ResponseParameters = NoParameters;
fn id() -> Self::IdType {
0xD1
}
fn invoking_parameters(self) -> Self::CommandParameters {
NoParameters::default()
}
}
#[derive(Debug, Clone)]
pub struct SetTxInfinitePreamble;
impl Command for SetTxInfinitePreamble {
type IdType = u8;
type CommandParameters = NoParameters;
type ResponseParameters = NoParameters;
fn id() -> Self::IdType {
0xD2
}
fn invoking_parameters(self) -> Self::CommandParameters {
NoParameters::default()
}
}
#[derive(Debug, Clone, Copy)]
pub enum RegulatorMode {
LdoOnly = 0,
DcDcLdo = 1,
}
impl ToByteArray for RegulatorMode {
type Error = Infallible;
type Array = [u8; 1];
fn to_bytes(self) -> Result<Self::Array, Self::Error> {
Ok([self as u8])
}
}
#[derive(Debug, Clone)]
pub struct SetRegulatorMode {
pub mode: RegulatorMode,
}
impl Command for SetRegulatorMode {
type IdType = u8;
type CommandParameters = RegulatorMode;
type ResponseParameters = NoParameters;
fn id() -> Self::IdType {
0x96
}
fn invoking_parameters(self) -> Self::CommandParameters {
self.mode
}
}
bitflags! {
#[derive(Debug, Clone, Copy)]
pub struct CalibrationConfig: u8 {
const RC64K = 1 << 0;
const RC13M = 1 << 1;
const PLL = 1 << 2;
const ADC_PULSE = 1 << 3;
const ADC_BULK_N = 1 << 4;
const ADC_BULK_P = 1 << 5;
const IMAGE = 1 << 6;
}
}
impl ToByteArray for CalibrationConfig {
type Error = Infallible;
type Array = [u8; 1];
fn to_bytes(self) -> Result<Self::Array, Self::Error> {
Ok([self.bits()])
}
}
#[derive(Debug, Clone)]
pub struct Calibrate {
pub config: CalibrationConfig,
}
impl Command for Calibrate {
type IdType = u8;
type CommandParameters = CalibrationConfig;
type ResponseParameters = NoParameters;
fn id() -> Self::IdType {
0x89
}
fn invoking_parameters(self) -> Self::CommandParameters {
self.config
}
}
#[derive(Debug, Clone, Copy)]
pub struct ImageCalibConfig {
pub freq1: u8,
pub freq2: u8,
}
impl ToByteArray for ImageCalibConfig {
type Error = Infallible;
type Array = [u8; 2];
fn to_bytes(self) -> Result<Self::Array, Self::Error> {
Ok([self.freq1, self.freq2])
}
}
#[derive(Debug, Clone)]
pub struct CalibrateImage {
pub config: ImageCalibConfig,
}
impl Command for CalibrateImage {
type IdType = u8;
type CommandParameters = ImageCalibConfig;
type ResponseParameters = NoParameters;
fn id() -> Self::IdType {
0x98
}
fn invoking_parameters(self) -> Self::CommandParameters {
self.config
}
}
#[derive(Debug, Clone, Copy)]
pub enum DeviceSelect {
Sx1262 = 0,
Sx1261 = 1,
}
#[derive(Debug, Clone, Copy)]
pub struct PaConfig {
pub duty_cycle: u8,
pub hp_max: u8,
pub device_sel: DeviceSelect,
pub pa_lut: u8,
}
impl ToByteArray for PaConfig {
type Error = Infallible;
type Array = [u8; 4];
fn to_bytes(self) -> Result<Self::Array, Self::Error> {
Ok([
self.duty_cycle,
self.hp_max,
self.device_sel as u8,
self.pa_lut,
])
}
}
#[derive(Debug, Clone)]
pub struct SetPaConfig {
pub config: PaConfig,
}
impl Command for SetPaConfig {
type IdType = u8;
type CommandParameters = PaConfig;
type ResponseParameters = NoParameters;
fn id() -> Self::IdType {
0x95
}
fn invoking_parameters(self) -> Self::CommandParameters {
self.config
}
}
#[derive(Debug, Clone, Copy)]
pub enum FallbackMode {
Fs = 0x40,
StdbyXosc = 0x30,
StdbyRc = 0x20,
}
impl ToByteArray for FallbackMode {
type Error = Infallible;
type Array = [u8; 1];
fn to_bytes(self) -> Result<Self::Array, Self::Error> {
Ok([self as u8])
}
}
#[derive(Debug, Clone)]
pub struct SetRxTxFallbackMode {
pub mode: FallbackMode,
}
impl Command for SetRxTxFallbackMode {
type IdType = u8;
type CommandParameters = FallbackMode;
type ResponseParameters = NoParameters;
fn id() -> Self::IdType {
0x93
}
fn invoking_parameters(self) -> Self::CommandParameters {
self.mode
}
}