# LoRa physical layer (the rustaceous radio) [![CI](https://github.com/lora-rs/lora-rs/actions/workflows/rust.yml/badge.svg)](https://github.com/lora-rs/lora-rs/actions/workflows/rust.yml) ## Why? - provide one straight-forward LoRa physical layer API which supports both LoRaWAN and point-to-point (P2P) use cases; - support a variety of microcontroller unit (MCU) and LoRa chip combinations behind one API; - enable LoRa features for any embedded framework which supports embedded-hal-async for the desired MCU/LoRa chip combination. ## How? - separate out modulation parameters and packet parameters as separate concerns to address the nuances in LoRa chip support and to allow flexible specification of various LoRaWAN and P2P send/receive channels, even in the same use case; - allow the user to specify a LoRa chip kind (for example, Sx1261/2) and specific LoRa board type (for example, Stm32wlSx1262) and hide the control of that LoRa board behind the LoRa physical layer API; - provide a minimal trait which must be implemented for each desired embedded framework/MCU type/LoRa chip type to allow this crate to interface to the LoRa chip within the embedded framework. ## Wheretofore? - while the current examples use the Embassy embedded framework, nrf52840, rp pico, stm32l0, and stm32wl MCUs, and Sx127x/Sx126x chips, this crate provides a path forward for other embedded frameworks, MCU types, and LoRa chips in a Rust development environment. ## Examples Please see [examples](https://github.com/lora-rs/lora-rs/tree/main/examples) for usage. ## Chat A public chat on LoRa/LoRaWAN topics using Rust is here: - Matrix room ## LoRa physical layer API For users wishing to implement a LoRaWAN or P2P solution, the following implementation files provide the necessary context for lora-phy version 2. - the API itself; - pertinent ancillary information. Examples of API usage: - stm32wl P2P send and sleep; - stm32wl LoRaWAN using rust-lorawan; - stm32l0 P2P receive continuous; - nrf52840 duty cycle receive; - nrf52840 channel activity detection; - rp pico P2P send and sleep using the second core. ## Embedded framework/MCU support For embedded framework developers wishing to add LoRa support as a feature for one or more MCU/LoRa chip combinations: - the InterfaceVariant trait, which enables this lora-phy crate to interface to a specific embedded framework/MCU/LoRa chip combination. Example InterfaceVariant implementations: - Implementations based on `embedded-hal` and `embedded-hal-async` traits. These are usable with any HAL crate that implements the `embedded-hal` traits. - STM32WL + Embassy implementation. STM32WL is special because LoRa uses an internal SPI, this implementation shows how to use it with `embassy-stm32`. ## LoRa chip support For developers wishing to add support for new LoRa chips or enhance support for existing chips: - the RadioKind trait, which must be implemented for each kind of LoRa chip for access through the lora-phy crate API; - the interface implementation, which captures the three key read/write operations allowing control of the LoRa chip from this crate through either opcode or register operations. Example RadioKind implementations and ancillary information: - the Sx1261/2 radio kind; - the Sx1276/7/8/9 radio kind. ## LoRa board-specific support Board-specific configuration can be handled via the chip driver specific Config struct.