센서보드 RF IRQ 테스트 중

Fork of stm-spirit1-rf-driver by ST

Committer:
jmhong
Date:
Thu Sep 20 04:46:49 2018 +0000
Revision:
85:4ca74d007fe7
Parent:
84:45b9ff78a066
Environmental test.. temp, etc...

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wolfgang Betz 34:edda6a7238ec 1 /*** Mbed Includes ***/
Wolfgang Betz 34:edda6a7238ec 2 #include "mbed.h"
Wolfgang Betz 34:edda6a7238ec 3 #include "mbed_debug.h"
Wolfgang Betz 34:edda6a7238ec 4
Wolfgang Betz 34:edda6a7238ec 5
Wolfgang Betz 34:edda6a7238ec 6 /*** Cube Includes ***/
Wolfgang Betz 34:edda6a7238ec 7 #include "SPIRIT_Radio.h"
Wolfgang Betz 34:edda6a7238ec 8 #include "SPIRIT_Management.h"
Wolfgang Betz 34:edda6a7238ec 9 #include "SPIRIT_Commands.h"
Wolfgang Betz 34:edda6a7238ec 10 #include "MCU_Interface.h"
Wolfgang Betz 34:edda6a7238ec 11
Wolfgang Betz 34:edda6a7238ec 12
Wolfgang Betz 34:edda6a7238ec 13 /*** Contiki Lib Includes ***/
Wolfgang Betz 34:edda6a7238ec 14 #include "spirit1.h"
Wolfgang Betz 34:edda6a7238ec 15 #include "spirit1-config.h"
Wolfgang Betz 34:edda6a7238ec 16 #include "spirit1-const.h"
Wolfgang Betz 34:edda6a7238ec 17
Wolfgang Betz 34:edda6a7238ec 18
Wolfgang Betz 34:edda6a7238ec 19 // betzw: enable beyond macro if you want debug messages also from IRQ handler
Wolfgang Betz 51:d46b4cc970c5 20 // #define DEBUG_IRQ
Wolfgang Betz 34:edda6a7238ec 21
Wolfgang Betz 34:edda6a7238ec 22
Wolfgang Betz 34:edda6a7238ec 23 /*** Macros from Cube Implementation ***/
Wolfgang Betz 34:edda6a7238ec 24 #define CLEAR_TXBUF() (spirit_tx_len = 0)
Wolfgang Betz 34:edda6a7238ec 25 #define IS_RXBUF_EMPTY() (spirit_rx_len == 0)
Wolfgang Betz 34:edda6a7238ec 26 #define CLEAR_RXBUF() do { \
Wolfgang Betz 34:edda6a7238ec 27 spirit_rx_len = 0; \
Wolfgang Betz 34:edda6a7238ec 28 _spirit_rx_pos = 0; \
Wolfgang Betz 34:edda6a7238ec 29 } while(0)
Wolfgang Betz 34:edda6a7238ec 30
Wolfgang Betz 34:edda6a7238ec 31
Wolfgang Betz 34:edda6a7238ec 32 /*** Macros from Cube Implementation ***/
Wolfgang Betz 34:edda6a7238ec 33 /* transceiver state. */
Wolfgang Betz 34:edda6a7238ec 34 #define ON 0
Wolfgang Betz 34:edda6a7238ec 35 #define OFF 1
Wolfgang Betz 34:edda6a7238ec 36
Wolfgang Betz 34:edda6a7238ec 37
Wolfgang Betz 72:413cb97ac077 38 /*** Macros for Spirit1 API ***/
Wolfgang Betz 72:413cb97ac077 39 /* max payload */
Wolfgang Betz 72:413cb97ac077 40 #define SPIRIT1_MAX_PAYLOAD (MAX_PACKET_LEN)
Wolfgang Betz 72:413cb97ac077 41
jmhong 84:45b9ff78a066 42 //180619 HJM : init 재시작을 위한 OnOff 변수
jmhong 84:45b9ff78a066 43 // : 15:22, 일단 안해보고 해보기로.. spi init을 두번해도 상관 없는 거면 뭐
jmhong 84:45b9ff78a066 44 //static volatile bool isItDoItRFInit;
jmhong 84:45b9ff78a066 45 //static volatile bool isItDoItSPIInit;
jmhong 84:45b9ff78a066 46
jmhong 84:45b9ff78a066 47
jmhong 84:45b9ff78a066 48
Wolfgang Betz 72:413cb97ac077 49
Wolfgang Betz 34:edda6a7238ec 50 /*** Missing Cube External Declarations ***/
Wolfgang Betz 34:edda6a7238ec 51 extern "C" void SpiritManagementSetFrequencyBase(uint32_t);
Wolfgang Betz 34:edda6a7238ec 52
Wolfgang Betz 34:edda6a7238ec 53
Wolfgang Betz 57:8cc871dc6cac 54 /*** UnlockedSPI for Usage in IRQ context ***/
jmhong 84:45b9ff78a066 55 class UnlockedSPI : public SPI
jmhong 84:45b9ff78a066 56 {
Wolfgang Betz 34:edda6a7238ec 57 public:
Wolfgang Betz 34:edda6a7238ec 58 UnlockedSPI(PinName mosi, PinName miso, PinName sclk) :
Wolfgang Betz 34:edda6a7238ec 59 SPI(mosi, miso, sclk) { }
Wolfgang Betz 34:edda6a7238ec 60 virtual ~UnlockedSPI() {}
Wolfgang Betz 34:edda6a7238ec 61 virtual void lock() { }
Wolfgang Betz 34:edda6a7238ec 62 virtual void unlock() { }
Wolfgang Betz 34:edda6a7238ec 63 };
Wolfgang Betz 34:edda6a7238ec 64
Wolfgang Betz 34:edda6a7238ec 65
Wolfgang Betz 34:edda6a7238ec 66 /*** A Simple Spirit1 Class ***/
Wolfgang Betz 34:edda6a7238ec 67 // NOTE: must be a singleton (due to mix of MBED/CUBE code)!!!
Wolfgang Betz 34:edda6a7238ec 68 // NOTE: implementation is IRQ-save but (intentionally) NOT thread-safe!!!
Wolfgang Betz 73:a1342eb7974c 69 /** Simple Spirit1 Class
Wolfgang Betz 73:a1342eb7974c 70 *
Wolfgang Betz 73:a1342eb7974c 71 * @Note Synchronization level: implementation is IRQ-save but (intentionally) NOT thread-safe!!!
Wolfgang Betz 73:a1342eb7974c 72 *
Wolfgang Betz 73:a1342eb7974c 73 * Example:
Wolfgang Betz 73:a1342eb7974c 74 * @code
Wolfgang Betz 73:a1342eb7974c 75 * #include "mbed.h"
Wolfgang Betz 73:a1342eb7974c 76 * #include "SimpleSpirit1.h"
Wolfgang Betz 73:a1342eb7974c 77 *
Wolfgang Betz 74:7672516efa2a 78 * static char send_buf[] = "Hello World!";
Wolfgang Betz 73:a1342eb7974c 79 *
Wolfgang Betz 73:a1342eb7974c 80 * static SimpleSpirit1 &myspirit = SimpleSpirit1::CreateInstance(D11, D12, D3, D9, D10, D2);
Wolfgang Betz 73:a1342eb7974c 81 *
Wolfgang Betz 73:a1342eb7974c 82 * static volatile bool tx_done_flag = false;
Wolfgang Betz 73:a1342eb7974c 83 *
Wolfgang Betz 73:a1342eb7974c 84 * static void callback_func(int event)
Wolfgang Betz 73:a1342eb7974c 85 * {
Wolfgang Betz 73:a1342eb7974c 86 * if (event == SimpleSpirit1::TX_DONE) {
Wolfgang Betz 73:a1342eb7974c 87 * tx_done_flag = true;
Wolfgang Betz 73:a1342eb7974c 88 * }
Wolfgang Betz 73:a1342eb7974c 89 * }
Wolfgang Betz 73:a1342eb7974c 90 *
Wolfgang Betz 73:a1342eb7974c 91 * int main()
Wolfgang Betz 73:a1342eb7974c 92 * {
Wolfgang Betz 74:7672516efa2a 93 * myspirit.attach_irq_callback(callback_func);
Wolfgang Betz 73:a1342eb7974c 94 * myspirit.on();
Wolfgang Betz 73:a1342eb7974c 95 *
Wolfgang Betz 73:a1342eb7974c 96 * while(1)
Wolfgang Betz 73:a1342eb7974c 97 * {
Wolfgang Betz 73:a1342eb7974c 98 * size_t curr_len = strlen((const char*)send_buf);
Wolfgang Betz 73:a1342eb7974c 99 * myspirit.send(send_buf, curr_len);
Wolfgang Betz 73:a1342eb7974c 100 *
Wolfgang Betz 73:a1342eb7974c 101 * while(!tx_done_flag);
Wolfgang Betz 73:a1342eb7974c 102 * tx_done_flag = false;
Wolfgang Betz 73:a1342eb7974c 103 * }
Wolfgang Betz 73:a1342eb7974c 104 * }
Wolfgang Betz 73:a1342eb7974c 105 * @endcode
Wolfgang Betz 73:a1342eb7974c 106 */
jmhong 84:45b9ff78a066 107 class SimpleSpirit1
jmhong 84:45b9ff78a066 108 {
Wolfgang Betz 34:edda6a7238ec 109 protected:
Wolfgang Betz 34:edda6a7238ec 110 static SimpleSpirit1 *_singleton;
Wolfgang Betz 34:edda6a7238ec 111
Wolfgang Betz 34:edda6a7238ec 112 /** Communication Interface Instance Variables **/
Wolfgang Betz 37:bc043030b55a 113 UnlockedSPI _spi; // betzw - NOTE: Morpho/Zio pins are valid only for NUCLEO-F401RE
Wolfgang Betz 34:edda6a7238ec 114 // mosi: PA_7 (D11)
Wolfgang Betz 34:edda6a7238ec 115 // miso: PA_6 (D12)
Wolfgang Betz 34:edda6a7238ec 116 // sclk: PB_3 (D3) or
Wolfgang Betz 34:edda6a7238ec 117 // PA_5 (D13) (only in case you unmount R4 & mount R7,
Wolfgang Betz 34:edda6a7238ec 118 // (note: in this case you may not use LED1 on some platforms)
Wolfgang Betz 34:edda6a7238ec 119 // bits: 8-bit
Wolfgang Betz 34:edda6a7238ec 120 // mode: 0
Wolfgang Betz 34:edda6a7238ec 121 // ordr: MSB
Wolfgang Betz 34:edda6a7238ec 122 // freq: max 10MHz
Wolfgang Betz 34:edda6a7238ec 123 InterruptIn _irq; // PC_7 (D9) (falling)
Wolfgang Betz 34:edda6a7238ec 124 DigitalOut _chip_select; // PB_6 (D10) ('1' == chip unselected)
Wolfgang Betz 34:edda6a7238ec 125 DigitalOut _shut_down; // PA_10 (D2) ('1' == shut_down)
Wolfgang Betz 34:edda6a7238ec 126 DigitalOut _led; // PB_4 (D5) (optional)
Wolfgang Betz 34:edda6a7238ec 127
Wolfgang Betz 34:edda6a7238ec 128 Callback<void(int)> _current_irq_callback;
Wolfgang Betz 34:edda6a7238ec 129 Timeout _rx_receiving_timeout;
Wolfgang Betz 34:edda6a7238ec 130
jmhong 84:45b9ff78a066 131 void rx_timeout_handler(void)
jmhong 84:45b9ff78a066 132 {
Wolfgang Betz 34:edda6a7238ec 133 set_ready_state();
Wolfgang Betz 34:edda6a7238ec 134 cmd_strobe(SPIRIT1_STROBE_RX);
Wolfgang Betz 34:edda6a7238ec 135 #ifdef DEBUG_IRQ
Wolfgang Betz 68:247fd6e0ab66 136 debug("\r\n%s (%d)\r\n", __func__, __LINE__);
Wolfgang Betz 34:edda6a7238ec 137 #endif
Wolfgang Betz 34:edda6a7238ec 138 }
Wolfgang Betz 34:edda6a7238ec 139
jmhong 84:45b9ff78a066 140 void start_rx_timeout(void)
jmhong 84:45b9ff78a066 141 {
Wolfgang Betz 37:bc043030b55a 142 _rx_receiving_timeout.attach_us(Callback<void()>(this, &SimpleSpirit1::rx_timeout_handler), 100 * 1000); // 100ms
Wolfgang Betz 34:edda6a7238ec 143 }
Wolfgang Betz 34:edda6a7238ec 144
jmhong 84:45b9ff78a066 145 void stop_rx_timeout(void)
jmhong 84:45b9ff78a066 146 {
Wolfgang Betz 34:edda6a7238ec 147 _rx_receiving_timeout.detach();
Wolfgang Betz 34:edda6a7238ec 148 }
Wolfgang Betz 34:edda6a7238ec 149
Wolfgang Betz 34:edda6a7238ec 150 /** Static Variables from Cube Implementation **/
Wolfgang Betz 34:edda6a7238ec 151 /*
Wolfgang Betz 34:edda6a7238ec 152 * The buffers which hold incoming data.
Wolfgang Betz 34:edda6a7238ec 153 * The +1 because of the first byte,
Wolfgang Betz 34:edda6a7238ec 154 * which will contain the length of the packet.
Wolfgang Betz 34:edda6a7238ec 155 */
Wolfgang Betz 34:edda6a7238ec 156 volatile uint16_t spirit_tx_len;
Wolfgang Betz 34:edda6a7238ec 157 volatile bool _spirit_tx_started;
Wolfgang Betz 34:edda6a7238ec 158 volatile uint16_t spirit_rx_len;
Wolfgang Betz 34:edda6a7238ec 159 volatile uint16_t _spirit_rx_pos;
Wolfgang Betz 34:edda6a7238ec 160 volatile bool _spirit_rx_err;
Wolfgang Betz 34:edda6a7238ec 161 uint8_t spirit_rx_buf[MAX_PACKET_LEN];
Wolfgang Betz 34:edda6a7238ec 162 volatile bool _is_receiving;
jmhong 84:45b9ff78a066 163
jmhong 84:45b9ff78a066 164
Wolfgang Betz 34:edda6a7238ec 165
Wolfgang Betz 34:edda6a7238ec 166 /** Status Variables from Cube Implementation **/
Wolfgang Betz 34:edda6a7238ec 167 unsigned int spirit_on;
Wolfgang Betz 34:edda6a7238ec 168 uint8_t last_rssi; //MGR
Wolfgang Betz 34:edda6a7238ec 169 uint8_t last_sqi; //MGR
Wolfgang Betz 34:edda6a7238ec 170
Wolfgang Betz 34:edda6a7238ec 171 /** Low Level Instance Variables **/
Wolfgang Betz 34:edda6a7238ec 172 unsigned int _nr_of_irq_disables;
Wolfgang Betz 34:edda6a7238ec 173
jmhong 84:45b9ff78a066 174 //HJM : SPI 셋팅 변수
jmhong 84:45b9ff78a066 175 volatile uint32_t _uint32SpiClkSettingValue;
jmhong 84:45b9ff78a066 176
jmhong 84:45b9ff78a066 177
jmhong 84:45b9ff78a066 178
Wolfgang Betz 34:edda6a7238ec 179 /** Low Level Instance Methods **/
jmhong 83:54b207156a91 180 void disable_spirit_irq(void)
jmhong 83:54b207156a91 181 {
Wolfgang Betz 34:edda6a7238ec 182 _irq.disable_irq();
Wolfgang Betz 34:edda6a7238ec 183 _nr_of_irq_disables++;
Wolfgang Betz 34:edda6a7238ec 184 #ifndef NDEBUG
Wolfgang Betz 68:247fd6e0ab66 185 debug_if(_nr_of_irq_disables == 0, "\r\nassert failed in: %s (%d)\r\n", __func__, __LINE__);
Wolfgang Betz 34:edda6a7238ec 186 #endif
Wolfgang Betz 34:edda6a7238ec 187 }
Wolfgang Betz 34:edda6a7238ec 188
jmhong 84:45b9ff78a066 189 void enable_spirit_irq(void)
jmhong 84:45b9ff78a066 190 {
Wolfgang Betz 34:edda6a7238ec 191 #ifndef NDEBUG
Wolfgang Betz 68:247fd6e0ab66 192 debug_if(_nr_of_irq_disables == 0, "\r\nassert failed in: %s (%d)\r\n", __func__, __LINE__);
Wolfgang Betz 34:edda6a7238ec 193 #endif
Wolfgang Betz 34:edda6a7238ec 194 if(--_nr_of_irq_disables == 0)
Wolfgang Betz 34:edda6a7238ec 195 _irq.enable_irq();
Wolfgang Betz 34:edda6a7238ec 196 }
Wolfgang Betz 34:edda6a7238ec 197
Wolfgang Betz 34:edda6a7238ec 198 void chip_select() { _chip_select = 0; }
Wolfgang Betz 34:edda6a7238ec 199 void chip_unselect() { _chip_select = 1; }
Wolfgang Betz 34:edda6a7238ec 200
Wolfgang Betz 34:edda6a7238ec 201 void enter_shutdown() {
Wolfgang Betz 34:edda6a7238ec 202 _shut_down = 1;
Wolfgang Betz 34:edda6a7238ec 203 wait_ms(5); // wait 5 milliseconds (to allow Spirit1 to shut down)
Wolfgang Betz 34:edda6a7238ec 204 }
Wolfgang Betz 34:edda6a7238ec 205
Wolfgang Betz 34:edda6a7238ec 206 void exit_shutdown() {
Wolfgang Betz 34:edda6a7238ec 207 _shut_down = 0;
Wolfgang Betz 34:edda6a7238ec 208 wait_ms(10); // wait 10 milliseconds (to allow Spirit1 a proper boot-up sequence)
Wolfgang Betz 34:edda6a7238ec 209 }
Wolfgang Betz 34:edda6a7238ec 210
jmhong 84:45b9ff78a066 211 void cs_to_sclk_delay(void)
jmhong 84:45b9ff78a066 212 {
Wolfgang Betz 34:edda6a7238ec 213 wait_us(1); // heuristic value
Wolfgang Betz 34:edda6a7238ec 214 }
Wolfgang Betz 34:edda6a7238ec 215
Wolfgang Betz 34:edda6a7238ec 216 /**
Wolfgang Betz 34:edda6a7238ec 217 * @brief Write and read a buffer to/from the SPI peripheral device at the same time
Wolfgang Betz 34:edda6a7238ec 218 * in 8-bit data mode using synchronous SPI communication.
Wolfgang Betz 34:edda6a7238ec 219 * @param[in] pBufferToWrite pointer to the buffer of data to send.
Wolfgang Betz 34:edda6a7238ec 220 * @param[out] pBufferToRead pointer to the buffer to read data into.
Wolfgang Betz 34:edda6a7238ec 221 * @param[in] NumBytes number of bytes to read and write.
Wolfgang Betz 34:edda6a7238ec 222 * @retval 0 if ok.
Wolfgang Betz 34:edda6a7238ec 223 * @retval -1 if data format error.
Wolfgang Betz 34:edda6a7238ec 224 * @note When using the SPI in Interrupt-mode, remember to disable interrupts
Wolfgang Betz 34:edda6a7238ec 225 * before calling this function and to enable them again after.
Wolfgang Betz 34:edda6a7238ec 226 */
Wolfgang Betz 34:edda6a7238ec 227 void spi_write_read(uint8_t* pBufferToWrite, uint8_t* pBufferToRead, uint16_t NumBytes)
Wolfgang Betz 34:edda6a7238ec 228 {
Wolfgang Betz 34:edda6a7238ec 229 /* Read and write data at the same time. */
Wolfgang Betz 34:edda6a7238ec 230 for (int i = 0; i < NumBytes; i++) {
Wolfgang Betz 34:edda6a7238ec 231 pBufferToRead[i] = _spi.write(pBufferToWrite[i]);
Wolfgang Betz 34:edda6a7238ec 232 }
Wolfgang Betz 34:edda6a7238ec 233 }
Wolfgang Betz 34:edda6a7238ec 234
Wolfgang Betz 34:edda6a7238ec 235 /** Radio Instance Methods **/
Wolfgang Betz 34:edda6a7238ec 236 void radio_set_xtal_freq(uint32_t freq) {
Wolfgang Betz 34:edda6a7238ec 237 SpiritRadioSetXtalFrequency(freq);
Wolfgang Betz 34:edda6a7238ec 238 }
Wolfgang Betz 34:edda6a7238ec 239
Wolfgang Betz 34:edda6a7238ec 240 void radio_set_pa_level_dbm(uint8_t cIndex, float fPowerdBm) {
Wolfgang Betz 34:edda6a7238ec 241 SpiritRadioSetPALeveldBm(cIndex, fPowerdBm);
Wolfgang Betz 34:edda6a7238ec 242 }
Wolfgang Betz 34:edda6a7238ec 243
Wolfgang Betz 34:edda6a7238ec 244 void radio_set_pa_level_max_index(uint8_t cIndex) {
Wolfgang Betz 34:edda6a7238ec 245 SpiritRadioSetPALevelMaxIndex(cIndex);
Wolfgang Betz 34:edda6a7238ec 246 }
Wolfgang Betz 34:edda6a7238ec 247
Wolfgang Betz 34:edda6a7238ec 248 uint8_t radio_init(SRadioInit *init_struct) {
Wolfgang Betz 34:edda6a7238ec 249 return SpiritRadioInit(init_struct);
Wolfgang Betz 34:edda6a7238ec 250 }
Wolfgang Betz 34:edda6a7238ec 251
Wolfgang Betz 34:edda6a7238ec 252 void radio_persistent_rx(SpiritFunctionalState xNewState) {
Wolfgang Betz 34:edda6a7238ec 253 SpiritRadioPersistenRx(xNewState);
Wolfgang Betz 34:edda6a7238ec 254 }
Wolfgang Betz 34:edda6a7238ec 255
Wolfgang Betz 34:edda6a7238ec 256 void radio_afc_freeze_on_sync(SpiritFunctionalState xNewState) {
Wolfgang Betz 34:edda6a7238ec 257 SpiritRadioAFCFreezeOnSync(xNewState);
Wolfgang Betz 34:edda6a7238ec 258 }
Wolfgang Betz 34:edda6a7238ec 259
Wolfgang Betz 34:edda6a7238ec 260 /** Packet System Instance Methods **/
Wolfgang Betz 34:edda6a7238ec 261 void pkt_basic_init(PktBasicInit* pxPktBasicInit) {
Wolfgang Betz 34:edda6a7238ec 262 SpiritPktBasicInit(pxPktBasicInit);
Wolfgang Betz 34:edda6a7238ec 263 }
Wolfgang Betz 34:edda6a7238ec 264
Wolfgang Betz 34:edda6a7238ec 265 void pkt_basic_set_payload_length(uint16_t nPayloadLength) {
Wolfgang Betz 34:edda6a7238ec 266 SpiritPktBasicSetPayloadLength(nPayloadLength);
Wolfgang Betz 34:edda6a7238ec 267 }
Wolfgang Betz 34:edda6a7238ec 268
Wolfgang Betz 34:edda6a7238ec 269 uint16_t pkt_basic_get_received_pkt_length(void) {
Wolfgang Betz 34:edda6a7238ec 270 return SpiritPktBasicGetReceivedPktLength();
Wolfgang Betz 34:edda6a7238ec 271 }
Wolfgang Betz 34:edda6a7238ec 272
Wolfgang Betz 34:edda6a7238ec 273 /** IRQ Instance Methods **/
Wolfgang Betz 34:edda6a7238ec 274 void irq_de_init(SpiritIrqs* pxIrqInit) {
Wolfgang Betz 34:edda6a7238ec 275 SpiritIrqDeInit(pxIrqInit);
Wolfgang Betz 34:edda6a7238ec 276 }
Wolfgang Betz 34:edda6a7238ec 277
Wolfgang Betz 34:edda6a7238ec 278 void irq_clear_status(void) {
Wolfgang Betz 34:edda6a7238ec 279 SpiritIrqClearStatus();
Wolfgang Betz 34:edda6a7238ec 280 }
Wolfgang Betz 34:edda6a7238ec 281
Wolfgang Betz 34:edda6a7238ec 282 void irq_set_status(IrqList xIrq, SpiritFunctionalState xNewState) {
Wolfgang Betz 34:edda6a7238ec 283 SpiritIrq(xIrq, xNewState);
Wolfgang Betz 34:edda6a7238ec 284 }
Wolfgang Betz 34:edda6a7238ec 285
Wolfgang Betz 34:edda6a7238ec 286 void irq_get_status(SpiritIrqs* pxIrqStatus) {
Wolfgang Betz 34:edda6a7238ec 287 SpiritIrqGetStatus(pxIrqStatus);
Wolfgang Betz 34:edda6a7238ec 288 }
Wolfgang Betz 34:edda6a7238ec 289
Wolfgang Betz 34:edda6a7238ec 290 /** Management Instance Methods **/
Wolfgang Betz 34:edda6a7238ec 291 void mgmt_set_freq_base(uint32_t freq) {
Wolfgang Betz 34:edda6a7238ec 292 SpiritManagementSetFrequencyBase(freq);
Wolfgang Betz 34:edda6a7238ec 293 }
Wolfgang Betz 34:edda6a7238ec 294
Wolfgang Betz 34:edda6a7238ec 295 void mgmt_refresh_status(void) {
Wolfgang Betz 34:edda6a7238ec 296 SpiritRefreshStatus();
Wolfgang Betz 34:edda6a7238ec 297 }
Wolfgang Betz 34:edda6a7238ec 298
Wolfgang Betz 34:edda6a7238ec 299 /** Spirit GPIO Instance Methods **/
Wolfgang Betz 34:edda6a7238ec 300 void spirit_gpio_init(SGpioInit* pxGpioInitStruct) {
Wolfgang Betz 34:edda6a7238ec 301 SpiritGpioInit(pxGpioInitStruct);
Wolfgang Betz 34:edda6a7238ec 302 }
Wolfgang Betz 34:edda6a7238ec 303
Wolfgang Betz 34:edda6a7238ec 304 /** Qi Instance Methods **/
Wolfgang Betz 34:edda6a7238ec 305 void qi_set_sqi_threshold(SqiThreshold xSqiThr) {
Wolfgang Betz 34:edda6a7238ec 306 SpiritQiSetSqiThreshold(xSqiThr);
Wolfgang Betz 34:edda6a7238ec 307 }
Wolfgang Betz 34:edda6a7238ec 308
Wolfgang Betz 34:edda6a7238ec 309 void qi_sqi_check(SpiritFunctionalState xNewState) {
Wolfgang Betz 34:edda6a7238ec 310 SpiritQiSqiCheck(xNewState);
Wolfgang Betz 34:edda6a7238ec 311 }
Wolfgang Betz 34:edda6a7238ec 312
Wolfgang Betz 34:edda6a7238ec 313 void qi_set_rssi_threshold_dbm(int nDbmValue) {
Wolfgang Betz 34:edda6a7238ec 314 SpiritQiSetRssiThresholddBm(nDbmValue);
Wolfgang Betz 34:edda6a7238ec 315 }
Wolfgang Betz 34:edda6a7238ec 316
Wolfgang Betz 34:edda6a7238ec 317 float qi_get_rssi_dbm() {
Wolfgang Betz 34:edda6a7238ec 318 last_rssi = qi_get_rssi();
Wolfgang Betz 34:edda6a7238ec 319 return get_last_rssi_dbm();
Wolfgang Betz 34:edda6a7238ec 320 }
Wolfgang Betz 34:edda6a7238ec 321
Wolfgang Betz 34:edda6a7238ec 322 uint8_t qi_get_rssi() {
Wolfgang Betz 34:edda6a7238ec 323 return SpiritQiGetRssi();
Wolfgang Betz 34:edda6a7238ec 324 }
Wolfgang Betz 34:edda6a7238ec 325
Wolfgang Betz 34:edda6a7238ec 326 uint8_t qi_get_sqi() {
Wolfgang Betz 34:edda6a7238ec 327 return SpiritQiGetSqi();
Wolfgang Betz 34:edda6a7238ec 328 }
Wolfgang Betz 34:edda6a7238ec 329
Wolfgang Betz 34:edda6a7238ec 330 /** Timer Instance Methods **/
Wolfgang Betz 34:edda6a7238ec 331 void timer_set_rx_timeout_stop_condition(RxTimeoutStopCondition xStopCondition) {
Wolfgang Betz 34:edda6a7238ec 332 SpiritTimerSetRxTimeoutStopCondition(xStopCondition);
Wolfgang Betz 34:edda6a7238ec 333 }
Wolfgang Betz 34:edda6a7238ec 334
Wolfgang Betz 34:edda6a7238ec 335 void timer_set_rx_timeout_counter(uint8_t cCounter) {
Wolfgang Betz 34:edda6a7238ec 336 SpiritTimerSetRxTimeoutCounter(cCounter);
Wolfgang Betz 34:edda6a7238ec 337 }
Wolfgang Betz 34:edda6a7238ec 338
Wolfgang Betz 34:edda6a7238ec 339 void timer_set_infinite_rx_timeout(void) {
Wolfgang Betz 34:edda6a7238ec 340 timer_set_rx_timeout_counter(0);
Wolfgang Betz 34:edda6a7238ec 341 }
Wolfgang Betz 34:edda6a7238ec 342
Wolfgang Betz 34:edda6a7238ec 343 /** CSMA/CA Instance Methods **/
Wolfgang Betz 34:edda6a7238ec 344 void csma_ca_state(SpiritFunctionalState xNewState) {
Wolfgang Betz 34:edda6a7238ec 345 SpiritCsma(xNewState);
Wolfgang Betz 34:edda6a7238ec 346 }
Wolfgang Betz 34:edda6a7238ec 347
Wolfgang Betz 34:edda6a7238ec 348 void csma_ca_init(CsmaInit* pxCsmaInit) {
Wolfgang Betz 34:edda6a7238ec 349 csma_ca_state(S_DISABLE); // Disabled at init
Wolfgang Betz 34:edda6a7238ec 350 SpiritCsmaInit(pxCsmaInit);
Wolfgang Betz 34:edda6a7238ec 351 SpiritCsmaSeedReloadMode(S_DISABLE); // always disable seed reload
Wolfgang Betz 34:edda6a7238ec 352 }
Wolfgang Betz 34:edda6a7238ec 353
Wolfgang Betz 34:edda6a7238ec 354 /** Command Instance Methods**/
Wolfgang Betz 34:edda6a7238ec 355 void cmd_strobe(uint8_t cmd) {
Wolfgang Betz 34:edda6a7238ec 356 SpiritCmdStrobeCommand((SpiritCmd)cmd);
Wolfgang Betz 34:edda6a7238ec 357 }
Wolfgang Betz 34:edda6a7238ec 358
Wolfgang Betz 34:edda6a7238ec 359 void cmd_strobe_flush_rx_fifo() {
Wolfgang Betz 34:edda6a7238ec 360 SpiritCmdStrobeCommand(CMD_FLUSHRXFIFO);
Wolfgang Betz 34:edda6a7238ec 361 }
Wolfgang Betz 34:edda6a7238ec 362
Wolfgang Betz 34:edda6a7238ec 363 /** SPI Instance Methods **/
Wolfgang Betz 34:edda6a7238ec 364 StatusBytes spi_write_linear_fifo(uint8_t cNbBytes, uint8_t* pcBuffer) {
Wolfgang Betz 34:edda6a7238ec 365 return SdkEvalSpiWriteFifo(cNbBytes, pcBuffer);
Wolfgang Betz 34:edda6a7238ec 366 }
Wolfgang Betz 34:edda6a7238ec 367
Wolfgang Betz 34:edda6a7238ec 368 StatusBytes spi_read_linear_fifo(uint8_t cNbBytes, uint8_t* pcBuffer) {
Wolfgang Betz 34:edda6a7238ec 369 return SdkEvalSpiReadFifo(cNbBytes, pcBuffer);
Wolfgang Betz 34:edda6a7238ec 370 }
Wolfgang Betz 34:edda6a7238ec 371
Wolfgang Betz 34:edda6a7238ec 372 /** Linear FIFO Instance Methods **/
Wolfgang Betz 34:edda6a7238ec 373 uint8_t linear_fifo_read_num_elements_rx_fifo(void) {
Wolfgang Betz 34:edda6a7238ec 374 return SpiritLinearFifoReadNumElementsRxFifo();
Wolfgang Betz 34:edda6a7238ec 375 }
Wolfgang Betz 34:edda6a7238ec 376
Wolfgang Betz 34:edda6a7238ec 377 uint8_t linear_fifo_read_num_elements_tx_fifo(void) {
Wolfgang Betz 34:edda6a7238ec 378 return SpiritLinearFifoReadNumElementsTxFifo();
Wolfgang Betz 34:edda6a7238ec 379 }
Wolfgang Betz 34:edda6a7238ec 380
Wolfgang Betz 34:edda6a7238ec 381 void linear_fifo_set_almost_full_thr_rx(uint8_t cThrRxFifo) {
Wolfgang Betz 34:edda6a7238ec 382 SpiritLinearFifoSetAlmostFullThresholdRx(cThrRxFifo);
Wolfgang Betz 34:edda6a7238ec 383 }
Wolfgang Betz 34:edda6a7238ec 384
Wolfgang Betz 34:edda6a7238ec 385 /** Calibration Instance Methods **/
Wolfgang Betz 34:edda6a7238ec 386 void calibration_rco(SpiritFunctionalState xNewState) {
Wolfgang Betz 34:edda6a7238ec 387 SpiritCalibrationRco(xNewState);
Wolfgang Betz 34:edda6a7238ec 388 }
Wolfgang Betz 34:edda6a7238ec 389
Wolfgang Betz 34:edda6a7238ec 390 /** Internal Spirit Methods */
jmhong 84:45b9ff78a066 391 int set_ready_state(void);
Wolfgang Betz 34:edda6a7238ec 392 uint8_t refresh_state(void);
Wolfgang Betz 34:edda6a7238ec 393
Wolfgang Betz 34:edda6a7238ec 394 /** Friend Functions **/
Wolfgang Betz 34:edda6a7238ec 395 friend StatusBytes SdkEvalSpiWriteRegisters(uint8_t cRegAddress, uint8_t cNbBytes, uint8_t* pcBuffer);
Wolfgang Betz 34:edda6a7238ec 396 friend StatusBytes SdkEvalSpiReadRegisters(uint8_t cRegAddress, uint8_t cNbBytes, uint8_t* pcBuffer);
Wolfgang Betz 34:edda6a7238ec 397 friend StatusBytes SdkEvalSpiCommandStrobes(uint8_t cCommandCode);
Wolfgang Betz 34:edda6a7238ec 398 friend StatusBytes SdkEvalSpiWriteFifo(uint8_t cNbBytes, uint8_t* pcBuffer);
Wolfgang Betz 34:edda6a7238ec 399 friend StatusBytes SdkEvalSpiReadFifo(uint8_t cNbBytes, uint8_t* pcBuffer);
Wolfgang Betz 34:edda6a7238ec 400
Wolfgang Betz 34:edda6a7238ec 401 /** Sdk Instance Methods **/
Wolfgang Betz 34:edda6a7238ec 402 StatusBytes SdkEvalSpiWriteRegisters(uint8_t cRegAddress, uint8_t cNbBytes, uint8_t* pcBuffer);
Wolfgang Betz 34:edda6a7238ec 403 StatusBytes SdkEvalSpiReadRegisters(uint8_t cRegAddress, uint8_t cNbBytes, uint8_t* pcBuffer);
Wolfgang Betz 34:edda6a7238ec 404 StatusBytes SdkEvalSpiCommandStrobes(uint8_t cCommandCode);
Wolfgang Betz 34:edda6a7238ec 405 StatusBytes SdkEvalSpiWriteFifo(uint8_t cNbBytes, uint8_t* pcBuffer);
Wolfgang Betz 34:edda6a7238ec 406 StatusBytes SdkEvalSpiReadFifo(uint8_t cNbBytes, uint8_t* pcBuffer);
Wolfgang Betz 34:edda6a7238ec 407
Wolfgang Betz 34:edda6a7238ec 408 /** Helper Instance Methods **/
Wolfgang Betz 34:edda6a7238ec 409 void chip_sync_select() {
Wolfgang Betz 34:edda6a7238ec 410 disable_spirit_irq();
Wolfgang Betz 34:edda6a7238ec 411 chip_select();
Wolfgang Betz 34:edda6a7238ec 412 cs_to_sclk_delay();
Wolfgang Betz 34:edda6a7238ec 413 }
Wolfgang Betz 34:edda6a7238ec 414
Wolfgang Betz 34:edda6a7238ec 415 void chip_sync_unselect() {
Wolfgang Betz 34:edda6a7238ec 416 chip_unselect();
Wolfgang Betz 34:edda6a7238ec 417 enable_spirit_irq();
Wolfgang Betz 34:edda6a7238ec 418 }
Wolfgang Betz 34:edda6a7238ec 419
Wolfgang Betz 34:edda6a7238ec 420 /** Init Instance Method **/
Wolfgang Betz 34:edda6a7238ec 421 void init();
Wolfgang Betz 34:edda6a7238ec 422
Wolfgang Betz 34:edda6a7238ec 423 /** Spirit Irq Callback */
Wolfgang Betz 34:edda6a7238ec 424 void IrqHandler();
Wolfgang Betz 34:edda6a7238ec 425
jmhong 84:45b9ff78a066 426
jmhong 84:45b9ff78a066 427
Wolfgang Betz 34:edda6a7238ec 428 /** Constructor **/
Wolfgang Betz 34:edda6a7238ec 429 SimpleSpirit1(PinName mosi, PinName miso, PinName sclk,
Wolfgang Betz 34:edda6a7238ec 430 PinName irq, PinName cs, PinName sdn,
jmhong 84:45b9ff78a066 431 PinName led,
jmhong 84:45b9ff78a066 432 uint32_t uint32SClkSettingValue);
Wolfgang Betz 34:edda6a7238ec 433
Wolfgang Betz 34:edda6a7238ec 434 /** Destructor **/
Wolfgang Betz 34:edda6a7238ec 435 ~SimpleSpirit1(void); // should never be called!
Wolfgang Betz 34:edda6a7238ec 436
jmhong 84:45b9ff78a066 437
jmhong 84:45b9ff78a066 438
jmhong 84:45b9ff78a066 439
jmhong 84:45b9ff78a066 440
jmhong 84:45b9ff78a066 441
jmhong 84:45b9ff78a066 442
jmhong 84:45b9ff78a066 443
jmhong 84:45b9ff78a066 444
jmhong 84:45b9ff78a066 445
jmhong 84:45b9ff78a066 446
jmhong 84:45b9ff78a066 447
Wolfgang Betz 34:edda6a7238ec 448 public:
jmhong 84:45b9ff78a066 449 enum
jmhong 84:45b9ff78a066 450 {
Wolfgang Betz 34:edda6a7238ec 451 RX_DONE,
Wolfgang Betz 34:edda6a7238ec 452 TX_DONE,
Wolfgang Betz 34:edda6a7238ec 453 TX_ERR
Wolfgang Betz 34:edda6a7238ec 454 };
jmhong 84:45b9ff78a066 455
jmhong 84:45b9ff78a066 456
jmhong 84:45b9ff78a066 457
jmhong 84:45b9ff78a066 458
jmhong 84:45b9ff78a066 459
Wolfgang Betz 34:edda6a7238ec 460
Wolfgang Betz 72:413cb97ac077 461 /** Create singleton instance of 'SimpleSpirit1'
Wolfgang Betz 72:413cb97ac077 462 *
Wolfgang Betz 72:413cb97ac077 463 * @param mosi 'PinName' of mosi pin to use
Wolfgang Betz 72:413cb97ac077 464 * @param miso 'PinName' of miso pin to use
Wolfgang Betz 72:413cb97ac077 465 * @param sclk 'PinName' of clock pin to use
Wolfgang Betz 72:413cb97ac077 466 * @param irq 'PinName' of interrupt pin to use
Wolfgang Betz 72:413cb97ac077 467 * @param cs 'PinName' of chip-select pin pin to use
Wolfgang Betz 72:413cb97ac077 468 * @param sdn 'PinName' of pin to use for device shutdown
Wolfgang Betz 72:413cb97ac077 469 *
Wolfgang Betz 72:413cb97ac077 470 * @returns reference to singleton instance
Wolfgang Betz 72:413cb97ac077 471 */
jmhong 84:45b9ff78a066 472 static SimpleSpirit1& CreateInstance(
jmhong 84:45b9ff78a066 473 PinName mosi, PinName miso, PinName sclk,
jmhong 84:45b9ff78a066 474 PinName irq, PinName cs, PinName sdn,
jmhong 84:45b9ff78a066 475 PinName led = NC,
jmhong 84:45b9ff78a066 476 uint32_t uint32SClkSettingValue = 6500000 //6.5Mhz, SPI CLK speed 초기값, 최고 속도
jmhong 84:45b9ff78a066 477 )
jmhong 84:45b9ff78a066 478 {
jmhong 84:45b9ff78a066 479 if(_singleton == NULL)
jmhong 84:45b9ff78a066 480 {
Wolfgang Betz 34:edda6a7238ec 481 _singleton = new SimpleSpirit1(mosi, miso, sclk,
jmhong 84:45b9ff78a066 482 irq, cs, sdn, led, uint32SClkSettingValue);
jmhong 84:45b9ff78a066 483 printf("[INIT_REVISE] init start..\n");
jmhong 84:45b9ff78a066 484 // isItDoItRFInit = false;
jmhong 84:45b9ff78a066 485 // isItDoItSPIInit = false;
jmhong 84:45b9ff78a066 486 wait(0.1);
Wolfgang Betz 34:edda6a7238ec 487 _singleton->init();
jmhong 84:45b9ff78a066 488 printf("[INIT_REVISE] init end..\n");
jmhong 84:45b9ff78a066 489 }
jmhong 84:45b9ff78a066 490 else
jmhong 84:45b9ff78a066 491 {
Wolfgang Betz 34:edda6a7238ec 492 error("SimpleSpirit1 singleton already created!\n");
Wolfgang Betz 34:edda6a7238ec 493 }
Wolfgang Betz 34:edda6a7238ec 494
Wolfgang Betz 34:edda6a7238ec 495 return *_singleton;
Wolfgang Betz 34:edda6a7238ec 496 }
jmhong 84:45b9ff78a066 497
jmhong 84:45b9ff78a066 498
jmhong 84:45b9ff78a066 499
jmhong 84:45b9ff78a066 500
Wolfgang Betz 34:edda6a7238ec 501
Wolfgang Betz 82:a18c22d2b83a 502 /** Get singleton instance of 'SimpleSpirit1'
Wolfgang Betz 72:413cb97ac077 503 *
Wolfgang Betz 72:413cb97ac077 504 * @returns reference to singleton instance
Wolfgang Betz 72:413cb97ac077 505 */
jmhong 84:45b9ff78a066 506 static SimpleSpirit1& Instance()
jmhong 84:45b9ff78a066 507 {
jmhong 84:45b9ff78a066 508 if(_singleton == NULL)
jmhong 84:45b9ff78a066 509 {
Wolfgang Betz 34:edda6a7238ec 510 error("SimpleSpirit1 must be created before used!\n");
Wolfgang Betz 34:edda6a7238ec 511 }
Wolfgang Betz 34:edda6a7238ec 512
Wolfgang Betz 34:edda6a7238ec 513 return *_singleton;
Wolfgang Betz 34:edda6a7238ec 514 }
jmhong 84:45b9ff78a066 515
jmhong 84:45b9ff78a066 516
jmhong 84:45b9ff78a066 517
jmhong 84:45b9ff78a066 518
jmhong 84:45b9ff78a066 519
jmhong 84:45b9ff78a066 520
jmhong 84:45b9ff78a066 521
jmhong 84:45b9ff78a066 522
jmhong 84:45b9ff78a066 523
jmhong 84:45b9ff78a066 524
jmhong 84:45b9ff78a066 525
jmhong 84:45b9ff78a066 526
Wolfgang Betz 34:edda6a7238ec 527
Wolfgang Betz 72:413cb97ac077 528 /** Attach a function to be called by the Spirit Irq handler when an event has occurred
Wolfgang Betz 34:edda6a7238ec 529 *
Wolfgang Betz 72:413cb97ac077 530 * @param func A void(int) callback, or 0 to set as none
Wolfgang Betz 34:edda6a7238ec 531 *
Wolfgang Betz 34:edda6a7238ec 532 * @note Function 'func' will be executed in interrupt context!
Wolfgang Betz 72:413cb97ac077 533 * @note Function 'func' will be call with either 'RX_DONE', 'TX_DONE', or 'TX_ERR' as parameter
Wolfgang Betz 72:413cb97ac077 534 * to indicate which event has occurred.
Wolfgang Betz 34:edda6a7238ec 535 */
jmhong 84:45b9ff78a066 536 void attach_irq_callback(Callback<void(int)> func)
jmhong 84:45b9ff78a066 537 {
Wolfgang Betz 34:edda6a7238ec 538 _current_irq_callback = func;
Wolfgang Betz 34:edda6a7238ec 539 }
Wolfgang Betz 34:edda6a7238ec 540
Wolfgang Betz 72:413cb97ac077 541 /** Switch Radio On
Wolfgang Betz 72:413cb97ac077 542 */
Wolfgang Betz 34:edda6a7238ec 543 int on(void);
Wolfgang Betz 82:a18c22d2b83a 544
Wolfgang Betz 72:413cb97ac077 545 /** Switch Radio Off
Wolfgang Betz 72:413cb97ac077 546 */
Wolfgang Betz 34:edda6a7238ec 547 int off(void);
Wolfgang Betz 34:edda6a7238ec 548
Wolfgang Betz 72:413cb97ac077 549 /** Set Channel
Wolfgang Betz 72:413cb97ac077 550 */
Wolfgang Betz 34:edda6a7238ec 551 void set_channel(uint8_t channel) {
Wolfgang Betz 34:edda6a7238ec 552 SpiritRadioSetChannel(channel);
Wolfgang Betz 34:edda6a7238ec 553 }
Wolfgang Betz 34:edda6a7238ec 554
Wolfgang Betz 72:413cb97ac077 555 /** Send a Buffer
Wolfgang Betz 72:413cb97ac077 556 *
Wolfgang Betz 72:413cb97ac077 557 * @param payload pointer to buffer to be send
Wolfgang Betz 72:413cb97ac077 558 * @param payload_len length of payload buffer in bytes
Wolfgang Betz 72:413cb97ac077 559 * @param use_csma_ca should CSMA/CA be enabled for transmission
Wolfgang Betz 72:413cb97ac077 560 *
Wolfgang Betz 72:413cb97ac077 561 * @returns zero in case of success, non-zero error code otherwise
Wolfgang Betz 72:413cb97ac077 562 *
Wolfgang Betz 72:413cb97ac077 563 * @note the maximum payload size in bytes allowed is defined by macro 'SPIRIT1_MAX_PAYLOAD'
Wolfgang Betz 72:413cb97ac077 564 */
Wolfgang Betz 64:28ef790e4ef7 565 int send(const void *payload, unsigned int payload_len, bool use_csma_ca = true);
Wolfgang Betz 34:edda6a7238ec 566
Wolfgang Betz 72:413cb97ac077 567 /** Copy received data into buffer
Wolfgang Betz 72:413cb97ac077 568 *
Wolfgang Betz 72:413cb97ac077 569 * @param buf pointer to buffer to be filled
Wolfgang Betz 72:413cb97ac077 570 * @param bufsize size of buffer
Wolfgang Betz 72:413cb97ac077 571 *
Wolfgang Betz 72:413cb97ac077 572 * @returns number of bytes copied into the buffer
Wolfgang Betz 72:413cb97ac077 573 *
Wolfgang Betz 72:413cb97ac077 574 * @note the buffer should be (at least) of size 'SPIRIT1_MAX_PAYLOAD' (in bytes).
Wolfgang Betz 72:413cb97ac077 575 */
Wolfgang Betz 34:edda6a7238ec 576 int read(void *buf, unsigned int bufsize);
Wolfgang Betz 34:edda6a7238ec 577
Wolfgang Betz 82:a18c22d2b83a 578 /** Perform a Clear-Channel Assessment (CCA) to find out whether the medium is idle or not.
Wolfgang Betz 72:413cb97ac077 579 *
Wolfgang Betz 82:a18c22d2b83a 580 * @returns 1 if the medium is busy.
Wolfgang Betz 72:413cb97ac077 581 */
Wolfgang Betz 34:edda6a7238ec 582 int channel_clear(void);
Wolfgang Betz 34:edda6a7238ec 583
Wolfgang Betz 72:413cb97ac077 584 /** Check if the radio driver has just received a packet
Wolfgang Betz 72:413cb97ac077 585 */
Wolfgang Betz 34:edda6a7238ec 586 int get_pending_packet(void);
Wolfgang Betz 34:edda6a7238ec 587
Wolfgang Betz 72:413cb97ac077 588 /** Is radio currently receiving
Wolfgang Betz 72:413cb97ac077 589 */
Wolfgang Betz 34:edda6a7238ec 590 bool is_receiving(void) {
Wolfgang Betz 34:edda6a7238ec 591 return _is_receiving;
Wolfgang Betz 34:edda6a7238ec 592 }
Wolfgang Betz 34:edda6a7238ec 593
Wolfgang Betz 72:413cb97ac077 594 /** Get latest value of RSSI (in dBm)
Wolfgang Betz 72:413cb97ac077 595 */
Wolfgang Betz 34:edda6a7238ec 596 float get_last_rssi_dbm(void) {
Wolfgang Betz 34:edda6a7238ec 597 get_last_rssi_raw();
Wolfgang Betz 34:edda6a7238ec 598 return (-120.0+((float)(last_rssi-20))/2);
Wolfgang Betz 34:edda6a7238ec 599 }
Wolfgang Betz 34:edda6a7238ec 600
Wolfgang Betz 72:413cb97ac077 601 /** Get latest value of RSSI (as Spirit1 raw value)
Wolfgang Betz 72:413cb97ac077 602 */
Wolfgang Betz 34:edda6a7238ec 603 uint8_t get_last_rssi_raw(void) {
Wolfgang Betz 34:edda6a7238ec 604 if(last_rssi == 0) {
Wolfgang Betz 34:edda6a7238ec 605 last_rssi = qi_get_rssi();
Wolfgang Betz 34:edda6a7238ec 606 }
Wolfgang Betz 34:edda6a7238ec 607 return last_rssi;
Wolfgang Betz 34:edda6a7238ec 608 }
Wolfgang Betz 34:edda6a7238ec 609
Wolfgang Betz 72:413cb97ac077 610 /** Get latest value of LQI (scaled to 8-bit)
Wolfgang Betz 72:413cb97ac077 611 */
Wolfgang Betz 34:edda6a7238ec 612 uint8_t get_last_sqi(void) {
Wolfgang Betz 34:edda6a7238ec 613 const uint8_t max_sqi = 8 * ((SYNC_LENGTH>>1)+1);
Wolfgang Betz 34:edda6a7238ec 614 if(last_sqi == 0) {
Wolfgang Betz 34:edda6a7238ec 615 last_sqi = qi_get_sqi();
Wolfgang Betz 34:edda6a7238ec 616 }
Wolfgang Betz 34:edda6a7238ec 617 if(last_sqi > max_sqi) last_sqi = max_sqi;
Wolfgang Betz 34:edda6a7238ec 618
Wolfgang Betz 34:edda6a7238ec 619 return (last_sqi * 255 / max_sqi);
Wolfgang Betz 34:edda6a7238ec 620 }
Wolfgang Betz 34:edda6a7238ec 621
Wolfgang Betz 72:413cb97ac077 622 /** Reset Board
Wolfgang Betz 72:413cb97ac077 623 */
jmhong 84:45b9ff78a066 624 void reset_board()
jmhong 84:45b9ff78a066 625 {
jmhong 84:45b9ff78a066 626 printf("[INIT_REVISE]reset board ...\n");
Wolfgang Betz 34:edda6a7238ec 627 init();
jmhong 84:45b9ff78a066 628 printf("[INIT_REVISE]reset board end.\n");
Wolfgang Betz 34:edda6a7238ec 629 }
jmhong 84:45b9ff78a066 630
jmhong 84:45b9ff78a066 631
jmhong 84:45b9ff78a066 632
jmhong 84:45b9ff78a066 633
jmhong 84:45b9ff78a066 634
jmhong 84:45b9ff78a066 635
jmhong 84:45b9ff78a066 636
jmhong 84:45b9ff78a066 637
jmhong 84:45b9ff78a066 638
jmhong 84:45b9ff78a066 639
jmhong 84:45b9ff78a066 640
jmhong 84:45b9ff78a066 641
jmhong 84:45b9ff78a066 642
jmhong 84:45b9ff78a066 643
jmhong 84:45b9ff78a066 644
jmhong 84:45b9ff78a066 645 //*************************************************************************************
jmhong 84:45b9ff78a066 646 //HJM SUDO code : SPI 클럭 셋팅 가능 함수
jmhong 84:45b9ff78a066 647 //*************************************************************************************
jmhong 84:45b9ff78a066 648 /** Set SPI Clock
jmhong 84:45b9ff78a066 649 */
jmhong 84:45b9ff78a066 650 void set_spi_clock(uint32_t )
jmhong 84:45b9ff78a066 651 {
jmhong 84:45b9ff78a066 652
jmhong 84:45b9ff78a066 653 }
jmhong 84:45b9ff78a066 654
jmhong 84:45b9ff78a066 655
jmhong 84:45b9ff78a066 656
jmhong 84:45b9ff78a066 657
jmhong 84:45b9ff78a066 658
jmhong 84:45b9ff78a066 659 //*************************************************************************************
jmhong 84:45b9ff78a066 660
jmhong 84:45b9ff78a066 661
jmhong 84:45b9ff78a066 662
jmhong 84:45b9ff78a066 663
Wolfgang Betz 34:edda6a7238ec 664 };
jmhong 84:45b9ff78a066 665
jmhong 84:45b9ff78a066 666
jmhong 84:45b9ff78a066 667
jmhong 84:45b9ff78a066 668
jmhong 84:45b9ff78a066 669 /*
jmhong 84:45b9ff78a066 670 HJM SUDO code : 고려 상황 정리
jmhong 84:45b9ff78a066 671 1. 올바르지 않은 행동을 할 인스턴스가 생성 되었을 시는 어떻게 하나??
jmhong 84:45b9ff78a066 672 -> 생성자를 사용했을 시 포인터를 반환 하도록 해서, 올바르지 않은 인스턴스가 만들어졌을 시에는 반환 객체 주소 값을 반환하지 않도록 하면 된다.
jmhong 84:45b9ff78a066 673 => ex>
jmhong 84:45b9ff78a066 674 test *t;
jmhong 84:45b9ff78a066 675 t = new test();
jmhong 84:45b9ff78a066 676 if(NULL == t)
jmhong 84:45b9ff78a066 677 {
jmhong 84:45b9ff78a066 678 printf("올바르지 않은 객체가 생성되었습니다!\n");
jmhong 84:45b9ff78a066 679 return;
jmhong 84:45b9ff78a066 680 }
jmhong 84:45b9ff78a066 681
jmhong 84:45b9ff78a066 682
jmhong 84:45b9ff78a066 683
jmhong 84:45b9ff78a066 684
jmhong 84:45b9ff78a066 685
jmhong 84:45b9ff78a066 686 */
jmhong 84:45b9ff78a066 687
jmhong 84:45b9ff78a066 688
jmhong 84:45b9ff78a066 689