HelloWorld_IDS01A4 mbed application for Spirit1 P2P demo.

Dependencies:   mbed

Fork of HelloWorld_IDS01A5_Program by rosarium pila

mbed 2.0 (a.k.a classic) HelloWorld example for Spirit1 to transfer data from one node to another.
To send the predefined data packet from the sender to the receiver, user needs to press User Button on the board. The LED on the receiver expansion board will toggle on reception of data successfully.
Data packets sent and received can be seen on USB serial terminal.

EVALUATION BOARDS RF FREQUENCY DESCRIPTION :
X-NUCLEO-IDS01A4 868 MHz 868 MHz RF expansion board based on SPIRIT1

Committer:
rosarium
Date:
Thu May 25 16:38:55 2017 +0000
Revision:
0:2ddc0583bcec
First draft version of HelloWorld_IDS01A5

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rosarium 0:2ddc0583bcec 1 /*** Mbed Includes ***/
rosarium 0:2ddc0583bcec 2 #include "mbed.h"
rosarium 0:2ddc0583bcec 3 #include "mbed_debug.h"
rosarium 0:2ddc0583bcec 4
rosarium 0:2ddc0583bcec 5
rosarium 0:2ddc0583bcec 6 /*** Cube Includes ***/
rosarium 0:2ddc0583bcec 7 #include "SPIRIT_Radio.h"
rosarium 0:2ddc0583bcec 8 #include "SPIRIT_Management.h"
rosarium 0:2ddc0583bcec 9 #include "SPIRIT_Commands.h"
rosarium 0:2ddc0583bcec 10 #include "MCU_Interface.h"
rosarium 0:2ddc0583bcec 11
rosarium 0:2ddc0583bcec 12
rosarium 0:2ddc0583bcec 13 /*** Contiki Lib Includes ***/
rosarium 0:2ddc0583bcec 14 #include "spirit1.h"
rosarium 0:2ddc0583bcec 15 #include "spirit1-config.h"
rosarium 0:2ddc0583bcec 16 #include "spirit1-const.h"
rosarium 0:2ddc0583bcec 17
rosarium 0:2ddc0583bcec 18
rosarium 0:2ddc0583bcec 19 // betzw: enable beyond macro if you want debug messages also from IRQ handler
rosarium 0:2ddc0583bcec 20 // #define DEBUG_IRQ
rosarium 0:2ddc0583bcec 21
rosarium 0:2ddc0583bcec 22
rosarium 0:2ddc0583bcec 23 /*** Macros from Cube Implementation ***/
rosarium 0:2ddc0583bcec 24 #define CLEAR_TXBUF() (spirit_tx_len = 0)
rosarium 0:2ddc0583bcec 25 #define IS_RXBUF_EMPTY() (spirit_rx_len == 0)
rosarium 0:2ddc0583bcec 26 #define CLEAR_RXBUF() do { \
rosarium 0:2ddc0583bcec 27 spirit_rx_len = 0; \
rosarium 0:2ddc0583bcec 28 _spirit_rx_pos = 0; \
rosarium 0:2ddc0583bcec 29 } while(0)
rosarium 0:2ddc0583bcec 30
rosarium 0:2ddc0583bcec 31
rosarium 0:2ddc0583bcec 32 /*** Macros from Cube Implementation ***/
rosarium 0:2ddc0583bcec 33 /* transceiver state. */
rosarium 0:2ddc0583bcec 34 #define ON 0
rosarium 0:2ddc0583bcec 35 #define OFF 1
rosarium 0:2ddc0583bcec 36
rosarium 0:2ddc0583bcec 37
rosarium 0:2ddc0583bcec 38 /*** Missing Cube External Declarations ***/
rosarium 0:2ddc0583bcec 39 extern "C" void SpiritManagementSetFrequencyBase(uint32_t);
rosarium 0:2ddc0583bcec 40
rosarium 0:2ddc0583bcec 41
rosarium 0:2ddc0583bcec 42 /*** UnlockedSPI for Performance (due to singleton) ***/
rosarium 0:2ddc0583bcec 43 class UnlockedSPI : public mbed::SPI{
rosarium 0:2ddc0583bcec 44 public:
rosarium 0:2ddc0583bcec 45 UnlockedSPI(PinName mosi, PinName miso, PinName sclk) :
rosarium 0:2ddc0583bcec 46 SPI(mosi, miso, sclk) { }
rosarium 0:2ddc0583bcec 47 virtual ~UnlockedSPI() {}
rosarium 0:2ddc0583bcec 48 virtual void lock() { }
rosarium 0:2ddc0583bcec 49 virtual void unlock() { }
rosarium 0:2ddc0583bcec 50 };
rosarium 0:2ddc0583bcec 51
rosarium 0:2ddc0583bcec 52
rosarium 0:2ddc0583bcec 53 /*** A Simple Spirit1 Class ***/
rosarium 0:2ddc0583bcec 54 // NOTE: must be a singleton (due to mix of MBED/CUBE code)!!!
rosarium 0:2ddc0583bcec 55 // NOTE: implementation is IRQ-save but (intentionally) NOT thread-safe!!!
rosarium 0:2ddc0583bcec 56 class SimpleSpirit1 {
rosarium 0:2ddc0583bcec 57 protected:
rosarium 0:2ddc0583bcec 58 static SimpleSpirit1 *_singleton;
rosarium 0:2ddc0583bcec 59
rosarium 0:2ddc0583bcec 60 /** Communication Interface Instance Variables **/
rosarium 0:2ddc0583bcec 61 UnlockedSPI _spi; // betzw - NOTE: Morpho/Zio pins are valid only for NUCLEO-F401RE
rosarium 0:2ddc0583bcec 62 // mosi: PA_7 (D11)
rosarium 0:2ddc0583bcec 63 // miso: PA_6 (D12)
rosarium 0:2ddc0583bcec 64 // sclk: PB_3 (D3) or
rosarium 0:2ddc0583bcec 65 // PA_5 (D13) (only in case you unmount R4 & mount R7,
rosarium 0:2ddc0583bcec 66 // (note: in this case you may not use LED1 on some platforms)
rosarium 0:2ddc0583bcec 67 // bits: 8-bit
rosarium 0:2ddc0583bcec 68 // mode: 0
rosarium 0:2ddc0583bcec 69 // ordr: MSB
rosarium 0:2ddc0583bcec 70 // freq: max 10MHz
rosarium 0:2ddc0583bcec 71 InterruptIn _irq; // PC_7 (D9) (falling)
rosarium 0:2ddc0583bcec 72 DigitalOut _chip_select; // PB_6 (D10) ('1' == chip unselected)
rosarium 0:2ddc0583bcec 73 DigitalOut _shut_down; // PA_10 (D2) ('1' == shut_down)
rosarium 0:2ddc0583bcec 74 DigitalOut _led; // PB_4 (D5) (optional)
rosarium 0:2ddc0583bcec 75
rosarium 0:2ddc0583bcec 76 Callback<void(int)> _current_irq_callback;
rosarium 0:2ddc0583bcec 77 Timeout _rx_receiving_timeout;
rosarium 0:2ddc0583bcec 78
rosarium 0:2ddc0583bcec 79 void rx_timeout_handler(void) {
rosarium 0:2ddc0583bcec 80 set_ready_state();
rosarium 0:2ddc0583bcec 81 cmd_strobe(SPIRIT1_STROBE_RX);
rosarium 0:2ddc0583bcec 82 #ifdef DEBUG_IRQ
rosarium 0:2ddc0583bcec 83 debug("\n\r%s (%d)\n\r", __func__, __LINE__);
rosarium 0:2ddc0583bcec 84 #endif
rosarium 0:2ddc0583bcec 85 }
rosarium 0:2ddc0583bcec 86
rosarium 0:2ddc0583bcec 87 void start_rx_timeout(void) {
rosarium 0:2ddc0583bcec 88 _rx_receiving_timeout.attach_us(Callback<void()>(this, &SimpleSpirit1::rx_timeout_handler), 100 * 1000); // 100ms
rosarium 0:2ddc0583bcec 89 }
rosarium 0:2ddc0583bcec 90
rosarium 0:2ddc0583bcec 91 void stop_rx_timeout(void) {
rosarium 0:2ddc0583bcec 92 _rx_receiving_timeout.detach();
rosarium 0:2ddc0583bcec 93 }
rosarium 0:2ddc0583bcec 94
rosarium 0:2ddc0583bcec 95 /** Static Variables from Cube Implementation **/
rosarium 0:2ddc0583bcec 96 /*
rosarium 0:2ddc0583bcec 97 * The buffers which hold incoming data.
rosarium 0:2ddc0583bcec 98 * The +1 because of the first byte,
rosarium 0:2ddc0583bcec 99 * which will contain the length of the packet.
rosarium 0:2ddc0583bcec 100 */
rosarium 0:2ddc0583bcec 101 volatile uint16_t spirit_tx_len;
rosarium 0:2ddc0583bcec 102 volatile bool _spirit_tx_started;
rosarium 0:2ddc0583bcec 103 volatile uint16_t spirit_rx_len;
rosarium 0:2ddc0583bcec 104 volatile uint16_t _spirit_rx_pos;
rosarium 0:2ddc0583bcec 105 volatile bool _spirit_rx_err;
rosarium 0:2ddc0583bcec 106 uint8_t spirit_rx_buf[MAX_PACKET_LEN];
rosarium 0:2ddc0583bcec 107 volatile bool _is_receiving;
rosarium 0:2ddc0583bcec 108
rosarium 0:2ddc0583bcec 109 /** Status Variables from Cube Implementation **/
rosarium 0:2ddc0583bcec 110 unsigned int spirit_on;
rosarium 0:2ddc0583bcec 111 uint8_t last_rssi; //MGR
rosarium 0:2ddc0583bcec 112 uint8_t last_sqi; //MGR
rosarium 0:2ddc0583bcec 113
rosarium 0:2ddc0583bcec 114 /** Low Level Instance Variables **/
rosarium 0:2ddc0583bcec 115 unsigned int _nr_of_irq_disables;
rosarium 0:2ddc0583bcec 116
rosarium 0:2ddc0583bcec 117 /** Low Level Instance Methods **/
rosarium 0:2ddc0583bcec 118 void disable_spirit_irq(void) {
rosarium 0:2ddc0583bcec 119 _irq.disable_irq();
rosarium 0:2ddc0583bcec 120 _nr_of_irq_disables++;
rosarium 0:2ddc0583bcec 121 #ifndef NDEBUG
rosarium 0:2ddc0583bcec 122 debug_if(_nr_of_irq_disables == 0, "\n\rassert failed in: %s (%d)\n\r", __func__, __LINE__);
rosarium 0:2ddc0583bcec 123 #endif
rosarium 0:2ddc0583bcec 124 }
rosarium 0:2ddc0583bcec 125
rosarium 0:2ddc0583bcec 126 void enable_spirit_irq(void) {
rosarium 0:2ddc0583bcec 127 #ifndef NDEBUG
rosarium 0:2ddc0583bcec 128 debug_if(_nr_of_irq_disables == 0, "\n\rassert failed in: %s (%d)\n\r", __func__, __LINE__);
rosarium 0:2ddc0583bcec 129 #endif
rosarium 0:2ddc0583bcec 130 if(--_nr_of_irq_disables == 0)
rosarium 0:2ddc0583bcec 131 _irq.enable_irq();
rosarium 0:2ddc0583bcec 132 }
rosarium 0:2ddc0583bcec 133
rosarium 0:2ddc0583bcec 134 void chip_select() { _chip_select = 0; }
rosarium 0:2ddc0583bcec 135 void chip_unselect() { _chip_select = 1; }
rosarium 0:2ddc0583bcec 136
rosarium 0:2ddc0583bcec 137 void enter_shutdown() {
rosarium 0:2ddc0583bcec 138 _shut_down = 1;
rosarium 0:2ddc0583bcec 139 wait_ms(5); // wait 5 milliseconds (to allow Spirit1 to shut down)
rosarium 0:2ddc0583bcec 140 }
rosarium 0:2ddc0583bcec 141
rosarium 0:2ddc0583bcec 142 void exit_shutdown() {
rosarium 0:2ddc0583bcec 143 _shut_down = 0;
rosarium 0:2ddc0583bcec 144 wait_ms(10); // wait 10 milliseconds (to allow Spirit1 a proper boot-up sequence)
rosarium 0:2ddc0583bcec 145 }
rosarium 0:2ddc0583bcec 146
rosarium 0:2ddc0583bcec 147 void cs_to_sclk_delay(void) {
rosarium 0:2ddc0583bcec 148 wait_us(1); // heuristic value
rosarium 0:2ddc0583bcec 149 }
rosarium 0:2ddc0583bcec 150
rosarium 0:2ddc0583bcec 151 /**
rosarium 0:2ddc0583bcec 152 * @brief Write and read a buffer to/from the SPI peripheral device at the same time
rosarium 0:2ddc0583bcec 153 * in 8-bit data mode using synchronous SPI communication.
rosarium 0:2ddc0583bcec 154 * @param[in] pBufferToWrite pointer to the buffer of data to send.
rosarium 0:2ddc0583bcec 155 * @param[out] pBufferToRead pointer to the buffer to read data into.
rosarium 0:2ddc0583bcec 156 * @param[in] NumBytes number of bytes to read and write.
rosarium 0:2ddc0583bcec 157 * @retval 0 if ok.
rosarium 0:2ddc0583bcec 158 * @retval -1 if data format error.
rosarium 0:2ddc0583bcec 159 * @note When using the SPI in Interrupt-mode, remember to disable interrupts
rosarium 0:2ddc0583bcec 160 * before calling this function and to enable them again after.
rosarium 0:2ddc0583bcec 161 */
rosarium 0:2ddc0583bcec 162 void spi_write_read(uint8_t* pBufferToWrite, uint8_t* pBufferToRead, uint16_t NumBytes)
rosarium 0:2ddc0583bcec 163 {
rosarium 0:2ddc0583bcec 164 /* Read and write data at the same time. */
rosarium 0:2ddc0583bcec 165 for (int i = 0; i < NumBytes; i++) {
rosarium 0:2ddc0583bcec 166 pBufferToRead[i] = _spi.write(pBufferToWrite[i]);
rosarium 0:2ddc0583bcec 167 }
rosarium 0:2ddc0583bcec 168 }
rosarium 0:2ddc0583bcec 169
rosarium 0:2ddc0583bcec 170 /** Radio Instance Methods **/
rosarium 0:2ddc0583bcec 171 void radio_set_xtal_freq(uint32_t freq) {
rosarium 0:2ddc0583bcec 172 SpiritRadioSetXtalFrequency(freq);
rosarium 0:2ddc0583bcec 173 }
rosarium 0:2ddc0583bcec 174
rosarium 0:2ddc0583bcec 175 void radio_set_pa_level_dbm(uint8_t cIndex, float fPowerdBm) {
rosarium 0:2ddc0583bcec 176 SpiritRadioSetPALeveldBm(cIndex, fPowerdBm);
rosarium 0:2ddc0583bcec 177 }
rosarium 0:2ddc0583bcec 178
rosarium 0:2ddc0583bcec 179 void radio_set_pa_level_max_index(uint8_t cIndex) {
rosarium 0:2ddc0583bcec 180 SpiritRadioSetPALevelMaxIndex(cIndex);
rosarium 0:2ddc0583bcec 181 }
rosarium 0:2ddc0583bcec 182
rosarium 0:2ddc0583bcec 183 uint8_t radio_init(SRadioInit *init_struct) {
rosarium 0:2ddc0583bcec 184 return SpiritRadioInit(init_struct);
rosarium 0:2ddc0583bcec 185 }
rosarium 0:2ddc0583bcec 186
rosarium 0:2ddc0583bcec 187 void radio_persistent_rx(SpiritFunctionalState xNewState) {
rosarium 0:2ddc0583bcec 188 SpiritRadioPersistenRx(xNewState);
rosarium 0:2ddc0583bcec 189 }
rosarium 0:2ddc0583bcec 190
rosarium 0:2ddc0583bcec 191 void radio_afc_freeze_on_sync(SpiritFunctionalState xNewState) {
rosarium 0:2ddc0583bcec 192 SpiritRadioAFCFreezeOnSync(xNewState);
rosarium 0:2ddc0583bcec 193 }
rosarium 0:2ddc0583bcec 194
rosarium 0:2ddc0583bcec 195 /** Packet System Instance Methods **/
rosarium 0:2ddc0583bcec 196 void pkt_basic_init(PktBasicInit* pxPktBasicInit) {
rosarium 0:2ddc0583bcec 197 SpiritPktBasicInit(pxPktBasicInit);
rosarium 0:2ddc0583bcec 198 }
rosarium 0:2ddc0583bcec 199
rosarium 0:2ddc0583bcec 200 void pkt_basic_set_payload_length(uint16_t nPayloadLength) {
rosarium 0:2ddc0583bcec 201 SpiritPktBasicSetPayloadLength(nPayloadLength);
rosarium 0:2ddc0583bcec 202 }
rosarium 0:2ddc0583bcec 203
rosarium 0:2ddc0583bcec 204 uint16_t pkt_basic_get_received_pkt_length(void) {
rosarium 0:2ddc0583bcec 205 return SpiritPktBasicGetReceivedPktLength();
rosarium 0:2ddc0583bcec 206 }
rosarium 0:2ddc0583bcec 207
rosarium 0:2ddc0583bcec 208 /** IRQ Instance Methods **/
rosarium 0:2ddc0583bcec 209 void irq_de_init(SpiritIrqs* pxIrqInit) {
rosarium 0:2ddc0583bcec 210 SpiritIrqDeInit(pxIrqInit);
rosarium 0:2ddc0583bcec 211 }
rosarium 0:2ddc0583bcec 212
rosarium 0:2ddc0583bcec 213 void irq_clear_status(void) {
rosarium 0:2ddc0583bcec 214 SpiritIrqClearStatus();
rosarium 0:2ddc0583bcec 215 }
rosarium 0:2ddc0583bcec 216
rosarium 0:2ddc0583bcec 217 void irq_set_status(IrqList xIrq, SpiritFunctionalState xNewState) {
rosarium 0:2ddc0583bcec 218 SpiritIrq(xIrq, xNewState);
rosarium 0:2ddc0583bcec 219 }
rosarium 0:2ddc0583bcec 220
rosarium 0:2ddc0583bcec 221 void irq_get_status(SpiritIrqs* pxIrqStatus) {
rosarium 0:2ddc0583bcec 222 SpiritIrqGetStatus(pxIrqStatus);
rosarium 0:2ddc0583bcec 223 }
rosarium 0:2ddc0583bcec 224
rosarium 0:2ddc0583bcec 225 /** Management Instance Methods **/
rosarium 0:2ddc0583bcec 226 void mgmt_set_freq_base(uint32_t freq) {
rosarium 0:2ddc0583bcec 227 SpiritManagementSetFrequencyBase(freq);
rosarium 0:2ddc0583bcec 228 }
rosarium 0:2ddc0583bcec 229
rosarium 0:2ddc0583bcec 230 void mgmt_refresh_status(void) {
rosarium 0:2ddc0583bcec 231 SpiritRefreshStatus();
rosarium 0:2ddc0583bcec 232 }
rosarium 0:2ddc0583bcec 233
rosarium 0:2ddc0583bcec 234 /** Spirit GPIO Instance Methods **/
rosarium 0:2ddc0583bcec 235 void spirit_gpio_init(SGpioInit* pxGpioInitStruct) {
rosarium 0:2ddc0583bcec 236 SpiritGpioInit(pxGpioInitStruct);
rosarium 0:2ddc0583bcec 237 }
rosarium 0:2ddc0583bcec 238
rosarium 0:2ddc0583bcec 239 /** Qi Instance Methods **/
rosarium 0:2ddc0583bcec 240 void qi_set_sqi_threshold(SqiThreshold xSqiThr) {
rosarium 0:2ddc0583bcec 241 SpiritQiSetSqiThreshold(xSqiThr);
rosarium 0:2ddc0583bcec 242 }
rosarium 0:2ddc0583bcec 243
rosarium 0:2ddc0583bcec 244 void qi_sqi_check(SpiritFunctionalState xNewState) {
rosarium 0:2ddc0583bcec 245 SpiritQiSqiCheck(xNewState);
rosarium 0:2ddc0583bcec 246 }
rosarium 0:2ddc0583bcec 247
rosarium 0:2ddc0583bcec 248 void qi_set_rssi_threshold_dbm(int nDbmValue) {
rosarium 0:2ddc0583bcec 249 SpiritQiSetRssiThresholddBm(nDbmValue);
rosarium 0:2ddc0583bcec 250 }
rosarium 0:2ddc0583bcec 251
rosarium 0:2ddc0583bcec 252 float qi_get_rssi_dbm() {
rosarium 0:2ddc0583bcec 253 last_rssi = qi_get_rssi();
rosarium 0:2ddc0583bcec 254 return get_last_rssi_dbm();
rosarium 0:2ddc0583bcec 255 }
rosarium 0:2ddc0583bcec 256
rosarium 0:2ddc0583bcec 257 uint8_t qi_get_rssi() {
rosarium 0:2ddc0583bcec 258 return SpiritQiGetRssi();
rosarium 0:2ddc0583bcec 259 }
rosarium 0:2ddc0583bcec 260
rosarium 0:2ddc0583bcec 261 uint8_t qi_get_sqi() {
rosarium 0:2ddc0583bcec 262 return SpiritQiGetSqi();
rosarium 0:2ddc0583bcec 263 }
rosarium 0:2ddc0583bcec 264
rosarium 0:2ddc0583bcec 265 /** Timer Instance Methods **/
rosarium 0:2ddc0583bcec 266 void timer_set_rx_timeout_stop_condition(RxTimeoutStopCondition xStopCondition) {
rosarium 0:2ddc0583bcec 267 SpiritTimerSetRxTimeoutStopCondition(xStopCondition);
rosarium 0:2ddc0583bcec 268 }
rosarium 0:2ddc0583bcec 269
rosarium 0:2ddc0583bcec 270 void timer_set_rx_timeout_counter(uint8_t cCounter) {
rosarium 0:2ddc0583bcec 271 SpiritTimerSetRxTimeoutCounter(cCounter);
rosarium 0:2ddc0583bcec 272 }
rosarium 0:2ddc0583bcec 273
rosarium 0:2ddc0583bcec 274 void timer_set_infinite_rx_timeout(void) {
rosarium 0:2ddc0583bcec 275 timer_set_rx_timeout_counter(0);
rosarium 0:2ddc0583bcec 276 }
rosarium 0:2ddc0583bcec 277
rosarium 0:2ddc0583bcec 278 /** CSMA/CA Instance Methods **/
rosarium 0:2ddc0583bcec 279 void csma_ca_state(SpiritFunctionalState xNewState) {
rosarium 0:2ddc0583bcec 280 SpiritCsma(xNewState);
rosarium 0:2ddc0583bcec 281 }
rosarium 0:2ddc0583bcec 282
rosarium 0:2ddc0583bcec 283 void csma_ca_init(CsmaInit* pxCsmaInit) {
rosarium 0:2ddc0583bcec 284 csma_ca_state(S_DISABLE); // Disabled at init
rosarium 0:2ddc0583bcec 285 SpiritCsmaInit(pxCsmaInit);
rosarium 0:2ddc0583bcec 286 SpiritCsmaSeedReloadMode(S_DISABLE); // always disable seed reload
rosarium 0:2ddc0583bcec 287 }
rosarium 0:2ddc0583bcec 288
rosarium 0:2ddc0583bcec 289 /** Command Instance Methods**/
rosarium 0:2ddc0583bcec 290 void cmd_strobe(uint8_t cmd) {
rosarium 0:2ddc0583bcec 291 SpiritCmdStrobeCommand((SpiritCmd)cmd);
rosarium 0:2ddc0583bcec 292 }
rosarium 0:2ddc0583bcec 293
rosarium 0:2ddc0583bcec 294 void cmd_strobe_flush_rx_fifo() {
rosarium 0:2ddc0583bcec 295 SpiritCmdStrobeCommand(CMD_FLUSHRXFIFO);
rosarium 0:2ddc0583bcec 296 }
rosarium 0:2ddc0583bcec 297
rosarium 0:2ddc0583bcec 298 /** SPI Instance Methods **/
rosarium 0:2ddc0583bcec 299 StatusBytes spi_write_linear_fifo(uint8_t cNbBytes, uint8_t* pcBuffer) {
rosarium 0:2ddc0583bcec 300 return SdkEvalSpiWriteFifo(cNbBytes, pcBuffer);
rosarium 0:2ddc0583bcec 301 }
rosarium 0:2ddc0583bcec 302
rosarium 0:2ddc0583bcec 303 StatusBytes spi_read_linear_fifo(uint8_t cNbBytes, uint8_t* pcBuffer) {
rosarium 0:2ddc0583bcec 304 return SdkEvalSpiReadFifo(cNbBytes, pcBuffer);
rosarium 0:2ddc0583bcec 305 }
rosarium 0:2ddc0583bcec 306
rosarium 0:2ddc0583bcec 307 /** Linear FIFO Instance Methods **/
rosarium 0:2ddc0583bcec 308 uint8_t linear_fifo_read_num_elements_rx_fifo(void) {
rosarium 0:2ddc0583bcec 309 return SpiritLinearFifoReadNumElementsRxFifo();
rosarium 0:2ddc0583bcec 310 }
rosarium 0:2ddc0583bcec 311
rosarium 0:2ddc0583bcec 312 uint8_t linear_fifo_read_num_elements_tx_fifo(void) {
rosarium 0:2ddc0583bcec 313 return SpiritLinearFifoReadNumElementsTxFifo();
rosarium 0:2ddc0583bcec 314 }
rosarium 0:2ddc0583bcec 315
rosarium 0:2ddc0583bcec 316 void linear_fifo_set_almost_full_thr_rx(uint8_t cThrRxFifo) {
rosarium 0:2ddc0583bcec 317 SpiritLinearFifoSetAlmostFullThresholdRx(cThrRxFifo);
rosarium 0:2ddc0583bcec 318 }
rosarium 0:2ddc0583bcec 319
rosarium 0:2ddc0583bcec 320 /** Calibration Instance Methods **/
rosarium 0:2ddc0583bcec 321 void calibration_rco(SpiritFunctionalState xNewState) {
rosarium 0:2ddc0583bcec 322 SpiritCalibrationRco(xNewState);
rosarium 0:2ddc0583bcec 323 }
rosarium 0:2ddc0583bcec 324
rosarium 0:2ddc0583bcec 325 /** Internal Spirit Methods */
rosarium 0:2ddc0583bcec 326 void set_ready_state(void);
rosarium 0:2ddc0583bcec 327 uint8_t refresh_state(void);
rosarium 0:2ddc0583bcec 328
rosarium 0:2ddc0583bcec 329 /** Friend Functions **/
rosarium 0:2ddc0583bcec 330 friend StatusBytes SdkEvalSpiWriteRegisters(uint8_t cRegAddress, uint8_t cNbBytes, uint8_t* pcBuffer);
rosarium 0:2ddc0583bcec 331 friend StatusBytes SdkEvalSpiReadRegisters(uint8_t cRegAddress, uint8_t cNbBytes, uint8_t* pcBuffer);
rosarium 0:2ddc0583bcec 332 friend StatusBytes SdkEvalSpiCommandStrobes(uint8_t cCommandCode);
rosarium 0:2ddc0583bcec 333 friend StatusBytes SdkEvalSpiWriteFifo(uint8_t cNbBytes, uint8_t* pcBuffer);
rosarium 0:2ddc0583bcec 334 friend StatusBytes SdkEvalSpiReadFifo(uint8_t cNbBytes, uint8_t* pcBuffer);
rosarium 0:2ddc0583bcec 335
rosarium 0:2ddc0583bcec 336 /** Sdk Instance Methods **/
rosarium 0:2ddc0583bcec 337 StatusBytes SdkEvalSpiWriteRegisters(uint8_t cRegAddress, uint8_t cNbBytes, uint8_t* pcBuffer);
rosarium 0:2ddc0583bcec 338 StatusBytes SdkEvalSpiReadRegisters(uint8_t cRegAddress, uint8_t cNbBytes, uint8_t* pcBuffer);
rosarium 0:2ddc0583bcec 339 StatusBytes SdkEvalSpiCommandStrobes(uint8_t cCommandCode);
rosarium 0:2ddc0583bcec 340 StatusBytes SdkEvalSpiWriteFifo(uint8_t cNbBytes, uint8_t* pcBuffer);
rosarium 0:2ddc0583bcec 341 StatusBytes SdkEvalSpiReadFifo(uint8_t cNbBytes, uint8_t* pcBuffer);
rosarium 0:2ddc0583bcec 342
rosarium 0:2ddc0583bcec 343 /** Helper Instance Methods **/
rosarium 0:2ddc0583bcec 344 void chip_sync_select() {
rosarium 0:2ddc0583bcec 345 disable_spirit_irq();
rosarium 0:2ddc0583bcec 346 chip_select();
rosarium 0:2ddc0583bcec 347 cs_to_sclk_delay();
rosarium 0:2ddc0583bcec 348 }
rosarium 0:2ddc0583bcec 349
rosarium 0:2ddc0583bcec 350 void chip_sync_unselect() {
rosarium 0:2ddc0583bcec 351 chip_unselect();
rosarium 0:2ddc0583bcec 352 enable_spirit_irq();
rosarium 0:2ddc0583bcec 353 }
rosarium 0:2ddc0583bcec 354
rosarium 0:2ddc0583bcec 355 /** Init Instance Method **/
rosarium 0:2ddc0583bcec 356 void init();
rosarium 0:2ddc0583bcec 357
rosarium 0:2ddc0583bcec 358 /** Spirit Irq Callback */
rosarium 0:2ddc0583bcec 359 void IrqHandler();
rosarium 0:2ddc0583bcec 360
rosarium 0:2ddc0583bcec 361 /** Constructor **/
rosarium 0:2ddc0583bcec 362 SimpleSpirit1(PinName mosi, PinName miso, PinName sclk,
rosarium 0:2ddc0583bcec 363 PinName irq, PinName cs, PinName sdn,
rosarium 0:2ddc0583bcec 364 PinName led);
rosarium 0:2ddc0583bcec 365
rosarium 0:2ddc0583bcec 366 /** Destructor **/
rosarium 0:2ddc0583bcec 367 ~SimpleSpirit1(void); // should never be called!
rosarium 0:2ddc0583bcec 368
rosarium 0:2ddc0583bcec 369 public:
rosarium 0:2ddc0583bcec 370 enum {
rosarium 0:2ddc0583bcec 371 RX_DONE,
rosarium 0:2ddc0583bcec 372 TX_DONE,
rosarium 0:2ddc0583bcec 373 TX_ERR
rosarium 0:2ddc0583bcec 374 };
rosarium 0:2ddc0583bcec 375
rosarium 0:2ddc0583bcec 376 static SimpleSpirit1& CreateInstance(PinName mosi, PinName miso, PinName sclk,
rosarium 0:2ddc0583bcec 377 PinName irq, PinName cs, PinName sdn,
rosarium 0:2ddc0583bcec 378 PinName led = NC) {
rosarium 0:2ddc0583bcec 379
rosarium 0:2ddc0583bcec 380 if(_singleton == NULL) {
rosarium 0:2ddc0583bcec 381 _singleton = new SimpleSpirit1(mosi, miso, sclk,
rosarium 0:2ddc0583bcec 382 irq, cs, sdn, led);
rosarium 0:2ddc0583bcec 383 _singleton->init();
rosarium 0:2ddc0583bcec 384 } else {
rosarium 0:2ddc0583bcec 385 error("SimpleSpirit1 singleton already created!\n");
rosarium 0:2ddc0583bcec 386 }
rosarium 0:2ddc0583bcec 387
rosarium 0:2ddc0583bcec 388 return *_singleton;
rosarium 0:2ddc0583bcec 389 }
rosarium 0:2ddc0583bcec 390
rosarium 0:2ddc0583bcec 391 static SimpleSpirit1& Instance() {
rosarium 0:2ddc0583bcec 392 if(_singleton == NULL) {
rosarium 0:2ddc0583bcec 393 error("SimpleSpirit1 must be created before used!\n");
rosarium 0:2ddc0583bcec 394 }
rosarium 0:2ddc0583bcec 395
rosarium 0:2ddc0583bcec 396 return *_singleton;
rosarium 0:2ddc0583bcec 397 }
rosarium 0:2ddc0583bcec 398
rosarium 0:2ddc0583bcec 399 /** Attach a function to be called by the Spirit Irq handler when packet has arrived
rosarium 0:2ddc0583bcec 400 *
rosarium 0:2ddc0583bcec 401 * @param func A void() callback, or 0 to set as none
rosarium 0:2ddc0583bcec 402 *
rosarium 0:2ddc0583bcec 403 * @note Function 'func' will be executed in interrupt context!
rosarium 0:2ddc0583bcec 404 */
rosarium 0:2ddc0583bcec 405 void attach_irq_callback(Callback<void(int)> func) {
rosarium 0:2ddc0583bcec 406 _current_irq_callback = func;
rosarium 0:2ddc0583bcec 407 }
rosarium 0:2ddc0583bcec 408
rosarium 0:2ddc0583bcec 409 /** Switch Radio On/Off **/
rosarium 0:2ddc0583bcec 410 int on(void);
rosarium 0:2ddc0583bcec 411 int off(void);
rosarium 0:2ddc0583bcec 412
rosarium 0:2ddc0583bcec 413 /** Set Channel **/
rosarium 0:2ddc0583bcec 414 void set_channel(uint8_t channel) {
rosarium 0:2ddc0583bcec 415 SpiritRadioSetChannel(channel);
rosarium 0:2ddc0583bcec 416 }
rosarium 0:2ddc0583bcec 417
rosarium 0:2ddc0583bcec 418 /** Send a Buffer **/
rosarium 0:2ddc0583bcec 419 int send(const void *payload, unsigned int payload_len);
rosarium 0:2ddc0583bcec 420
rosarium 0:2ddc0583bcec 421 /** Read into Buffer **/
rosarium 0:2ddc0583bcec 422 int read(void *buf, unsigned int bufsize);
rosarium 0:2ddc0583bcec 423
rosarium 0:2ddc0583bcec 424 /** Perform a Clear-Channel Assessment (CCA) to find out if there is
rosarium 0:2ddc0583bcec 425 a packet in the air or not.
rosarium 0:2ddc0583bcec 426 Returns 1 if packet has been seen.
rosarium 0:2ddc0583bcec 427 */
rosarium 0:2ddc0583bcec 428 int channel_clear(void);
rosarium 0:2ddc0583bcec 429
rosarium 0:2ddc0583bcec 430 /** Check if the radio driver has just received a packet **/
rosarium 0:2ddc0583bcec 431 int get_pending_packet(void);
rosarium 0:2ddc0583bcec 432
rosarium 0:2ddc0583bcec 433 /** Is radio currently receiving **/
rosarium 0:2ddc0583bcec 434 bool is_receiving(void) {
rosarium 0:2ddc0583bcec 435 return _is_receiving;
rosarium 0:2ddc0583bcec 436 }
rosarium 0:2ddc0583bcec 437
rosarium 0:2ddc0583bcec 438 /** Get latest value of RSSI (in dBm) **/
rosarium 0:2ddc0583bcec 439 float get_last_rssi_dbm(void) {
rosarium 0:2ddc0583bcec 440 get_last_rssi_raw();
rosarium 0:2ddc0583bcec 441 return (-120.0+((float)(last_rssi-20))/2);
rosarium 0:2ddc0583bcec 442 }
rosarium 0:2ddc0583bcec 443
rosarium 0:2ddc0583bcec 444 /** Get latest value of RSSI (as Spirit1 raw value) **/
rosarium 0:2ddc0583bcec 445 uint8_t get_last_rssi_raw(void) {
rosarium 0:2ddc0583bcec 446 if(last_rssi == 0) {
rosarium 0:2ddc0583bcec 447 last_rssi = qi_get_rssi();
rosarium 0:2ddc0583bcec 448 }
rosarium 0:2ddc0583bcec 449 return last_rssi;
rosarium 0:2ddc0583bcec 450 }
rosarium 0:2ddc0583bcec 451
rosarium 0:2ddc0583bcec 452 /** Get latest value of LQI (scaled to 8-bit) **/
rosarium 0:2ddc0583bcec 453 uint8_t get_last_sqi(void) {
rosarium 0:2ddc0583bcec 454 const uint8_t max_sqi = 8 * ((SYNC_LENGTH>>1)+1);
rosarium 0:2ddc0583bcec 455 if(last_sqi == 0) {
rosarium 0:2ddc0583bcec 456 last_sqi = qi_get_sqi();
rosarium 0:2ddc0583bcec 457 }
rosarium 0:2ddc0583bcec 458 if(last_sqi > max_sqi) last_sqi = max_sqi;
rosarium 0:2ddc0583bcec 459
rosarium 0:2ddc0583bcec 460 return (last_sqi * 255 / max_sqi);
rosarium 0:2ddc0583bcec 461 }
rosarium 0:2ddc0583bcec 462
rosarium 0:2ddc0583bcec 463 /** Reset Board **/
rosarium 0:2ddc0583bcec 464 void reset_board() {
rosarium 0:2ddc0583bcec 465 init();
rosarium 0:2ddc0583bcec 466 }
rosarium 0:2ddc0583bcec 467 };