SX1272Lib updated in order to be RTOS aware

Fork of SX1272Lib by Semtech

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

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__