SX1272Lib updated in order to be RTOS aware
Fork of SX1272Lib by
Since Semtech original SX1272 library used InterruptIn and Timout mbed-os classes, whose ISRs are not allowed to lock RTOS mutexes, any SPI-related operation was doomed to fail. Indeed, SPI transactions functions are always nested inside a spi-level mutex lock/unlock pair in order to provide for thread access safety. A typical case occurs for example when radio is set to sleep state after a RX timeout.
This fork solves such problems by mean of a EventQueue/Thread pair, where any InterruptIn and Timeout ISRs actually enqueue callback calls.
Take a look at usage example at https://github.com/maiorfi/mbedos_lablet_lora_1
Diff: sx1272/sx1272.h
- Revision:
- 8:1002d3025eaa
- Parent:
- 7:b988b60083a1
- Child:
- 10:bd29cdff8f3e
--- a/sx1272/sx1272.h Mon Apr 24 09:26:08 2017 +0000 +++ b/sx1272/sx1272.h Sat Feb 10 08:58:42 2018 +0100 @@ -97,6 +97,12 @@ RadioSettings_t settings; static const FskBandwidth_t FskBandwidths[]; + + // <RTOS> + Thread _thread_events_queue; + EventQueue _eq_events; + // </RTOS> + protected: /*! @@ -498,6 +504,36 @@ * \retval regValue Bandwidth register value. */ static uint8_t GetFskBandwidthRegValue( uint32_t bandwidth ); + + // Inizio nuova parte per RTOS + + virtual void enqueueOnTimeoutIrq(); + + virtual void enqueueRadioEvent_RxTimeout(); + virtual void enqueueRadioEvent_TxTimeout(); + virtual void enqueueRadioEvent_RxError(); + virtual void enqueueRadioEvent_RxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr); + virtual void enqueueRadioEvent_TxDone(); + virtual void enqueueRadioEvent_FhssChangeChannel(uint8_t currentChannel); + virtual void enqueueRadioEvent_CadDone(bool channelActivityDetected); + virtual void enqueueOnDio0Irq(); + virtual void enqueueOnDio1Irq(); + virtual void enqueueOnDio2Irq(); + virtual void enqueueOnDio3Irq(); + virtual void enqueueOnDio4Irq(); + virtual void enqueueOnDio5Irq(); + +private: + + void radioEvent_RxTimeout(); + void radioEvent_TxTimeout(); + void radioEvent_RxError(); + void radioEvent_RxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr); + void radioEvent_TxDone(); + void radioEvent_FhssChangeChannel(uint8_t currentChannel); + void radioEvent_CadDone(bool channelActivityDetected); + + // Fine nuova parte per RTOS }; #endif // __SX1272_H__