7ad6280e65
Based on the HAL from stm32wl, the peripheral driver has been modified to fit into embassy, using the embassy APIs, providing operation of the radio peripheral. The initial version does not offer any async APIs, but the example shows how the radio IRQ can be used to perform async TX of the radio.
167 lines
4.8 KiB
Rust
167 lines
4.8 KiB
Rust
/// Power amplifier ramp time for FSK, MSK, and LoRa modulation.
|
|
///
|
|
/// Argument of [`set_ramp_time`][`crate::subghz::TxParams::set_ramp_time`].
|
|
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
|
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
|
#[repr(u8)]
|
|
pub enum RampTime {
|
|
/// 10µs
|
|
Micros10 = 0x00,
|
|
/// 20µs
|
|
Micros20 = 0x01,
|
|
/// 40µs
|
|
Micros40 = 0x02,
|
|
/// 80µs
|
|
Micros80 = 0x03,
|
|
/// 200µs
|
|
Micros200 = 0x04,
|
|
/// 800µs
|
|
Micros800 = 0x05,
|
|
/// 1.7ms
|
|
Micros1700 = 0x06,
|
|
/// 3.4ms
|
|
Micros3400 = 0x07,
|
|
}
|
|
|
|
impl From<RampTime> for u8 {
|
|
fn from(rt: RampTime) -> Self {
|
|
rt as u8
|
|
}
|
|
}
|
|
|
|
impl From<RampTime> for core::time::Duration {
|
|
fn from(rt: RampTime) -> Self {
|
|
match rt {
|
|
RampTime::Micros10 => core::time::Duration::from_micros(10),
|
|
RampTime::Micros20 => core::time::Duration::from_micros(20),
|
|
RampTime::Micros40 => core::time::Duration::from_micros(40),
|
|
RampTime::Micros80 => core::time::Duration::from_micros(80),
|
|
RampTime::Micros200 => core::time::Duration::from_micros(200),
|
|
RampTime::Micros800 => core::time::Duration::from_micros(800),
|
|
RampTime::Micros1700 => core::time::Duration::from_micros(1700),
|
|
RampTime::Micros3400 => core::time::Duration::from_micros(3400),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl From<RampTime> for embassy::time::Duration {
|
|
fn from(rt: RampTime) -> Self {
|
|
match rt {
|
|
RampTime::Micros10 => embassy::time::Duration::from_micros(10),
|
|
RampTime::Micros20 => embassy::time::Duration::from_micros(20),
|
|
RampTime::Micros40 => embassy::time::Duration::from_micros(40),
|
|
RampTime::Micros80 => embassy::time::Duration::from_micros(80),
|
|
RampTime::Micros200 => embassy::time::Duration::from_micros(200),
|
|
RampTime::Micros800 => embassy::time::Duration::from_micros(800),
|
|
RampTime::Micros1700 => embassy::time::Duration::from_micros(1700),
|
|
RampTime::Micros3400 => embassy::time::Duration::from_micros(3400),
|
|
}
|
|
}
|
|
}
|
|
/// Transmit parameters, output power and power amplifier ramp up time.
|
|
///
|
|
/// Argument of [`set_tx_params`][`crate::subghz::SubGhz::set_tx_params`].
|
|
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
|
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
|
pub struct TxParams {
|
|
buf: [u8; 3],
|
|
}
|
|
|
|
impl TxParams {
|
|
/// Create a new `TxParams` struct.
|
|
///
|
|
/// This is the same as `default`, but in a `const` function.
|
|
///
|
|
/// # Example
|
|
///
|
|
/// ```
|
|
/// use stm32wl_hal::subghz::TxParams;
|
|
///
|
|
/// const TX_PARAMS: TxParams = TxParams::new();
|
|
/// assert_eq!(TX_PARAMS, TxParams::default());
|
|
/// ```
|
|
pub const fn new() -> TxParams {
|
|
TxParams {
|
|
buf: [super::OpCode::SetTxParams as u8, 0x00, 0x00],
|
|
}
|
|
}
|
|
|
|
/// Set the output power.
|
|
///
|
|
/// For low power selected in [`set_pa_config`]:
|
|
///
|
|
/// * 0x0E: +14 dB
|
|
/// * ...
|
|
/// * 0x00: 0 dB
|
|
/// * ...
|
|
/// * 0xEF: -17 dB
|
|
/// * Others: reserved
|
|
///
|
|
/// For high power selected in [`set_pa_config`]:
|
|
///
|
|
/// * 0x16: +22 dB
|
|
/// * ...
|
|
/// * 0x00: 0 dB
|
|
/// * ...
|
|
/// * 0xF7: -9 dB
|
|
/// * Others: reserved
|
|
///
|
|
/// # Example
|
|
///
|
|
/// Set the output power to 0 dB.
|
|
///
|
|
/// ```
|
|
/// use stm32wl_hal::subghz::{RampTime, TxParams};
|
|
///
|
|
/// const TX_PARAMS: TxParams = TxParams::new().set_power(0x00);
|
|
/// # assert_eq!(TX_PARAMS.as_slice()[1], 0x00);
|
|
/// ```
|
|
///
|
|
/// [`set_pa_config`]: crate::subghz::SubGhz::set_pa_config
|
|
#[must_use = "set_power returns a modified TxParams"]
|
|
pub const fn set_power(mut self, power: u8) -> TxParams {
|
|
self.buf[1] = power;
|
|
self
|
|
}
|
|
|
|
/// Set the Power amplifier ramp time for FSK, MSK, and LoRa modulation.
|
|
///
|
|
/// # Example
|
|
///
|
|
/// Set the ramp time to 200 microseconds.
|
|
///
|
|
/// ```
|
|
/// use stm32wl_hal::subghz::{RampTime, TxParams};
|
|
///
|
|
/// const TX_PARAMS: TxParams = TxParams::new().set_ramp_time(RampTime::Micros200);
|
|
/// # assert_eq!(TX_PARAMS.as_slice()[2], 0x04);
|
|
/// ```
|
|
#[must_use = "set_ramp_time returns a modified TxParams"]
|
|
pub const fn set_ramp_time(mut self, rt: RampTime) -> TxParams {
|
|
self.buf[2] = rt as u8;
|
|
self
|
|
}
|
|
|
|
/// Extracts a slice containing the packet.
|
|
///
|
|
/// # Example
|
|
///
|
|
/// ```
|
|
/// use stm32wl_hal::subghz::{RampTime, TxParams};
|
|
///
|
|
/// const TX_PARAMS: TxParams = TxParams::new()
|
|
/// .set_ramp_time(RampTime::Micros80)
|
|
/// .set_power(0x0E);
|
|
/// assert_eq!(TX_PARAMS.as_slice(), &[0x8E, 0x0E, 0x03]);
|
|
/// ```
|
|
pub const fn as_slice(&self) -> &[u8] {
|
|
&self.buf
|
|
}
|
|
}
|
|
|
|
impl Default for TxParams {
|
|
fn default() -> Self {
|
|
Self::new()
|
|
}
|
|
}
|