16a47a0ad9
This crate contains async radio drivers for various lora drivers that work with embassy timers. The code is imported from Drogue Device ( https://github.com/drogue-iot/drogue-device) The radio drivers integrate with the async LoRaWAN MAC layer in the lorawan-device crate. Also added is an example for the STM32WL55 and for STM32L0 (requires the LoRa Discovery board) for LoRaWAN. Future work is to make the underlying radio drivers using fully async SPI when communicating with the peripheral.
225 lines
5.2 KiB
Rust
225 lines
5.2 KiB
Rust
#![macro_use]
|
|
#![allow(unused_macros)]
|
|
|
|
#[cfg(all(feature = "defmt", feature = "log"))]
|
|
compile_error!("You may not enable both `defmt` and `log` features.");
|
|
|
|
macro_rules! assert {
|
|
($($x:tt)*) => {
|
|
{
|
|
#[cfg(not(feature = "defmt"))]
|
|
::core::assert!($($x)*);
|
|
#[cfg(feature = "defmt")]
|
|
::defmt::assert!($($x)*);
|
|
}
|
|
};
|
|
}
|
|
|
|
macro_rules! assert_eq {
|
|
($($x:tt)*) => {
|
|
{
|
|
#[cfg(not(feature = "defmt"))]
|
|
::core::assert_eq!($($x)*);
|
|
#[cfg(feature = "defmt")]
|
|
::defmt::assert_eq!($($x)*);
|
|
}
|
|
};
|
|
}
|
|
|
|
macro_rules! assert_ne {
|
|
($($x:tt)*) => {
|
|
{
|
|
#[cfg(not(feature = "defmt"))]
|
|
::core::assert_ne!($($x)*);
|
|
#[cfg(feature = "defmt")]
|
|
::defmt::assert_ne!($($x)*);
|
|
}
|
|
};
|
|
}
|
|
|
|
macro_rules! debug_assert {
|
|
($($x:tt)*) => {
|
|
{
|
|
#[cfg(not(feature = "defmt"))]
|
|
::core::debug_assert!($($x)*);
|
|
#[cfg(feature = "defmt")]
|
|
::defmt::debug_assert!($($x)*);
|
|
}
|
|
};
|
|
}
|
|
|
|
macro_rules! debug_assert_eq {
|
|
($($x:tt)*) => {
|
|
{
|
|
#[cfg(not(feature = "defmt"))]
|
|
::core::debug_assert_eq!($($x)*);
|
|
#[cfg(feature = "defmt")]
|
|
::defmt::debug_assert_eq!($($x)*);
|
|
}
|
|
};
|
|
}
|
|
|
|
macro_rules! debug_assert_ne {
|
|
($($x:tt)*) => {
|
|
{
|
|
#[cfg(not(feature = "defmt"))]
|
|
::core::debug_assert_ne!($($x)*);
|
|
#[cfg(feature = "defmt")]
|
|
::defmt::debug_assert_ne!($($x)*);
|
|
}
|
|
};
|
|
}
|
|
|
|
macro_rules! todo {
|
|
($($x:tt)*) => {
|
|
{
|
|
#[cfg(not(feature = "defmt"))]
|
|
::core::todo!($($x)*);
|
|
#[cfg(feature = "defmt")]
|
|
::defmt::todo!($($x)*);
|
|
}
|
|
};
|
|
}
|
|
|
|
macro_rules! unreachable {
|
|
($($x:tt)*) => {
|
|
{
|
|
#[cfg(not(feature = "defmt"))]
|
|
::core::unreachable!($($x)*);
|
|
#[cfg(feature = "defmt")]
|
|
::defmt::unreachable!($($x)*);
|
|
}
|
|
};
|
|
}
|
|
|
|
macro_rules! panic {
|
|
($($x:tt)*) => {
|
|
{
|
|
#[cfg(not(feature = "defmt"))]
|
|
::core::panic!($($x)*);
|
|
#[cfg(feature = "defmt")]
|
|
::defmt::panic!($($x)*);
|
|
}
|
|
};
|
|
}
|
|
|
|
macro_rules! trace {
|
|
($s:literal $(, $x:expr)* $(,)?) => {
|
|
{
|
|
#[cfg(feature = "log")]
|
|
::log::trace!($s $(, $x)*);
|
|
#[cfg(feature = "defmt")]
|
|
::defmt::trace!($s $(, $x)*);
|
|
#[cfg(not(any(feature = "log", feature="defmt")))]
|
|
let _ = ($( & $x ),*);
|
|
}
|
|
};
|
|
}
|
|
|
|
macro_rules! debug {
|
|
($s:literal $(, $x:expr)* $(,)?) => {
|
|
{
|
|
#[cfg(feature = "log")]
|
|
::log::debug!($s $(, $x)*);
|
|
#[cfg(feature = "defmt")]
|
|
::defmt::debug!($s $(, $x)*);
|
|
#[cfg(not(any(feature = "log", feature="defmt")))]
|
|
let _ = ($( & $x ),*);
|
|
}
|
|
};
|
|
}
|
|
|
|
macro_rules! info {
|
|
($s:literal $(, $x:expr)* $(,)?) => {
|
|
{
|
|
#[cfg(feature = "log")]
|
|
::log::info!($s $(, $x)*);
|
|
#[cfg(feature = "defmt")]
|
|
::defmt::info!($s $(, $x)*);
|
|
#[cfg(not(any(feature = "log", feature="defmt")))]
|
|
let _ = ($( & $x ),*);
|
|
}
|
|
};
|
|
}
|
|
|
|
macro_rules! warn {
|
|
($s:literal $(, $x:expr)* $(,)?) => {
|
|
{
|
|
#[cfg(feature = "log")]
|
|
::log::warn!($s $(, $x)*);
|
|
#[cfg(feature = "defmt")]
|
|
::defmt::warn!($s $(, $x)*);
|
|
#[cfg(not(any(feature = "log", feature="defmt")))]
|
|
let _ = ($( & $x ),*);
|
|
}
|
|
};
|
|
}
|
|
|
|
macro_rules! error {
|
|
($s:literal $(, $x:expr)* $(,)?) => {
|
|
{
|
|
#[cfg(feature = "log")]
|
|
::log::error!($s $(, $x)*);
|
|
#[cfg(feature = "defmt")]
|
|
::defmt::error!($s $(, $x)*);
|
|
#[cfg(not(any(feature = "log", feature="defmt")))]
|
|
let _ = ($( & $x ),*);
|
|
}
|
|
};
|
|
}
|
|
|
|
#[cfg(feature = "defmt")]
|
|
macro_rules! unwrap {
|
|
($($x:tt)*) => {
|
|
::defmt::unwrap!($($x)*)
|
|
};
|
|
}
|
|
|
|
#[cfg(not(feature = "defmt"))]
|
|
macro_rules! unwrap {
|
|
($arg:expr) => {
|
|
match $crate::fmt::Try::into_result($arg) {
|
|
::core::result::Result::Ok(t) => t,
|
|
::core::result::Result::Err(e) => {
|
|
::core::panic!("unwrap of `{}` failed: {:?}", ::core::stringify!($arg), e);
|
|
}
|
|
}
|
|
};
|
|
($arg:expr, $($msg:expr),+ $(,)? ) => {
|
|
match $crate::fmt::Try::into_result($arg) {
|
|
::core::result::Result::Ok(t) => t,
|
|
::core::result::Result::Err(e) => {
|
|
::core::panic!("unwrap of `{}` failed: {}: {:?}", ::core::stringify!($arg), ::core::format_args!($($msg,)*), e);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
|
|
pub struct NoneError;
|
|
|
|
pub trait Try {
|
|
type Ok;
|
|
type Error;
|
|
fn into_result(self) -> Result<Self::Ok, Self::Error>;
|
|
}
|
|
|
|
impl<T> Try for Option<T> {
|
|
type Ok = T;
|
|
type Error = NoneError;
|
|
|
|
#[inline]
|
|
fn into_result(self) -> Result<T, NoneError> {
|
|
self.ok_or(NoneError)
|
|
}
|
|
}
|
|
|
|
impl<T, E> Try for Result<T, E> {
|
|
type Ok = T;
|
|
type Error = E;
|
|
|
|
#[inline]
|
|
fn into_result(self) -> Self {
|
|
self
|
|
}
|
|
}
|