![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
May 2021 test
Dependencies: sx128x sx12xx_hal
main.cpp@6:685b7d053c43, 2021-05-09 (annotated)
- Committer:
- lightshow
- Date:
- Sun May 09 19:26:59 2021 +0000
- Revision:
- 6:685b7d053c43
- Parent:
- 5:5ac152096add
May 2021 Test
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
grit | 4:a645b6a6fa1f | 1 | #include "mbed.h" |
Wayne Roberts |
3:f81d64ff0164 | 2 | #include "radio.h" |
grit | 4:a645b6a6fa1f | 3 | |
grit | 4:a645b6a6fa1f | 4 | #include "mbed-trace/mbed_trace.h" |
grit | 4:a645b6a6fa1f | 5 | #define TRACE_GROUP "slav" |
grit | 4:a645b6a6fa1f | 6 | |
grit | 4:a645b6a6fa1f | 7 | static Mutex serialOutMutex; |
grit | 4:a645b6a6fa1f | 8 | static void serial_out_mutex_wait() |
grit | 4:a645b6a6fa1f | 9 | { |
grit | 4:a645b6a6fa1f | 10 | serialOutMutex.lock(); |
grit | 4:a645b6a6fa1f | 11 | } |
grit | 4:a645b6a6fa1f | 12 | |
grit | 4:a645b6a6fa1f | 13 | static void serial_out_mutex_release() |
grit | 4:a645b6a6fa1f | 14 | { |
grit | 4:a645b6a6fa1f | 15 | osStatus s = serialOutMutex.unlock(); |
grit | 4:a645b6a6fa1f | 16 | MBED_ASSERT(s == osOK); |
grit | 4:a645b6a6fa1f | 17 | } |
dudmuck | 0:b6ec8db2edbf | 18 | |
dudmuck | 0:b6ec8db2edbf | 19 | DigitalOut myled(LED1); |
dudmuck | 2:bf201940a9db | 20 | |
Wayne Roberts |
3:f81d64ff0164 | 21 | #if defined(SX127x_H) || defined(SX126x_H) |
Wayne Roberts |
3:f81d64ff0164 | 22 | #define BW_KHZ 500 |
Wayne Roberts |
3:f81d64ff0164 | 23 | #define SPREADING_FACTOR 11 |
Wayne Roberts |
3:f81d64ff0164 | 24 | #define CF_HZ 910800000 |
Wayne Roberts |
3:f81d64ff0164 | 25 | #elif defined(SX128x_H) |
Wayne Roberts |
3:f81d64ff0164 | 26 | #define BW_KHZ 200 |
Wayne Roberts |
3:f81d64ff0164 | 27 | #define SPREADING_FACTOR 11 |
Wayne Roberts |
3:f81d64ff0164 | 28 | #define CF_HZ 2487000000 |
Wayne Roberts |
3:f81d64ff0164 | 29 | #endif |
Wayne Roberts |
3:f81d64ff0164 | 30 | |
Wayne Roberts |
3:f81d64ff0164 | 31 | #ifdef TARGET_DISCO_L072CZ_LRWAN1 |
grit | 5:5ac152096add | 32 | DigitalOut pinCommandExecute(PB_2); |
grit | 4:a645b6a6fa1f | 33 | DigitalOut pin0(PB_5); |
grit | 4:a645b6a6fa1f | 34 | DigitalOut pin1(PB_6); |
grit | 4:a645b6a6fa1f | 35 | DigitalOut pin2(PB_8); |
grit | 4:a645b6a6fa1f | 36 | DigitalOut pin3(PB_9); |
grit | 4:a645b6a6fa1f | 37 | DigitalOut pin4(PB_12); |
grit | 4:a645b6a6fa1f | 38 | DigitalOut pin5(PB_13); |
grit | 4:a645b6a6fa1f | 39 | DigitalOut pin6(PB_14); |
grit | 4:a645b6a6fa1f | 40 | DigitalOut pin7(PB_15); |
dudmuck | 2:bf201940a9db | 41 | #else |
grit | 4:a645b6a6fa1f | 42 | DigitalOut pin4(PC_3); |
grit | 4:a645b6a6fa1f | 43 | DigitalOut pin5(PC_2); |
grit | 4:a645b6a6fa1f | 44 | DigitalOut pin6(PC_6); |
grit | 4:a645b6a6fa1f | 45 | DigitalOut pin7(PC_8); |
dudmuck | 2:bf201940a9db | 46 | #endif /* !TARGET_DISCO_L072CZ_LRWAN1 */ |
dudmuck | 2:bf201940a9db | 47 | |
grit | 4:a645b6a6fa1f | 48 | Timeout timeoutOutputDelay; |
grit | 5:5ac152096add | 49 | Timeout timeoutCommandExecuteSignal; |
grit | 4:a645b6a6fa1f | 50 | static uint8_t command = 0; |
dudmuck | 0:b6ec8db2edbf | 51 | |
dudmuck | 1:6a3a48d657a9 | 52 | #define PIN_ASSERT_us 500000 |
grit | 5:5ac152096add | 53 | #define COMMAND_EXECUTE_SIGNAL_PERIOD 200000 |
dudmuck | 1:6a3a48d657a9 | 54 | |
dudmuck | 0:b6ec8db2edbf | 55 | |
Wayne Roberts |
3:f81d64ff0164 | 56 | /**********************************************************************/ |
Wayne Roberts |
3:f81d64ff0164 | 57 | |
dudmuck | 0:b6ec8db2edbf | 58 | void alarm_pin_clr() |
dudmuck | 0:b6ec8db2edbf | 59 | { |
grit | 4:a645b6a6fa1f | 60 | |
dudmuck | 0:b6ec8db2edbf | 61 | } |
dudmuck | 0:b6ec8db2edbf | 62 | |
grit | 5:5ac152096add | 63 | |
grit | 4:a645b6a6fa1f | 64 | static bool commandWrittenFlag = false; |
grit | 5:5ac152096add | 65 | static bool commandAssertedFlag = false; |
grit | 5:5ac152096add | 66 | |
grit | 5:5ac152096add | 67 | void onCommandExecuteSignalTimeout(void) |
grit | 5:5ac152096add | 68 | { |
grit | 5:5ac152096add | 69 | pinCommandExecute = false; |
grit | 5:5ac152096add | 70 | commandAssertedFlag = true; |
grit | 5:5ac152096add | 71 | } |
grit | 4:a645b6a6fa1f | 72 | |
grit | 4:a645b6a6fa1f | 73 | void writeCommandToDigitalOuts(void) |
dudmuck | 0:b6ec8db2edbf | 74 | { |
grit | 4:a645b6a6fa1f | 75 | pin0 = command & 0b00000001; |
grit | 4:a645b6a6fa1f | 76 | pin1 = command & 0b00000010; |
grit | 4:a645b6a6fa1f | 77 | pin2 = command & 0b00000100; |
grit | 4:a645b6a6fa1f | 78 | pin3 = command & 0b00001000; |
grit | 4:a645b6a6fa1f | 79 | pin4 = command & 0b00010000; |
grit | 4:a645b6a6fa1f | 80 | pin5 = command & 0b00100000; |
grit | 4:a645b6a6fa1f | 81 | pin6 = command & 0b01000000; |
grit | 4:a645b6a6fa1f | 82 | pin7 = command & 0b10000000; |
grit | 5:5ac152096add | 83 | pinCommandExecute = true; |
grit | 4:a645b6a6fa1f | 84 | commandWrittenFlag = true; |
grit | 5:5ac152096add | 85 | timeoutCommandExecuteSignal.attach_us(onCommandExecuteSignalTimeout, COMMAND_EXECUTE_SIGNAL_PERIOD); |
dudmuck | 0:b6ec8db2edbf | 86 | } |
dudmuck | 0:b6ec8db2edbf | 87 | |
dudmuck | 0:b6ec8db2edbf | 88 | static uint16_t crc_ccitt( uint8_t *buffer, uint16_t length ) |
dudmuck | 0:b6ec8db2edbf | 89 | { |
grit | 4:a645b6a6fa1f | 90 | tr_debug(__FUNCTION__); |
grit | 4:a645b6a6fa1f | 91 | const uint16_t polynom = 0x1021; // The CRC calculation follows CCITT |
grit | 4:a645b6a6fa1f | 92 | uint16_t crc = 0x0000; // CRC initial value |
dudmuck | 0:b6ec8db2edbf | 93 | |
dudmuck | 0:b6ec8db2edbf | 94 | if( buffer == NULL ) |
dudmuck | 0:b6ec8db2edbf | 95 | { |
grit | 4:a645b6a6fa1f | 96 | tr_debug("NULL Buffer"); |
dudmuck | 0:b6ec8db2edbf | 97 | return 0; |
dudmuck | 0:b6ec8db2edbf | 98 | } |
dudmuck | 0:b6ec8db2edbf | 99 | |
grit | 4:a645b6a6fa1f | 100 | for(uint16_t i = 0; i < length; ++i) |
dudmuck | 0:b6ec8db2edbf | 101 | { |
dudmuck | 0:b6ec8db2edbf | 102 | crc ^= ( uint16_t ) buffer[i] << 8; |
dudmuck | 0:b6ec8db2edbf | 103 | for( uint16_t j = 0; j < 8; ++j ) |
dudmuck | 0:b6ec8db2edbf | 104 | { |
dudmuck | 0:b6ec8db2edbf | 105 | crc = ( crc & 0x8000 ) ? ( crc << 1 ) ^ polynom : ( crc << 1 ); |
dudmuck | 0:b6ec8db2edbf | 106 | } |
dudmuck | 0:b6ec8db2edbf | 107 | } |
dudmuck | 0:b6ec8db2edbf | 108 | return crc; |
dudmuck | 0:b6ec8db2edbf | 109 | } |
dudmuck | 0:b6ec8db2edbf | 110 | |
dudmuck | 0:b6ec8db2edbf | 111 | void get_alarm() |
dudmuck | 0:b6ec8db2edbf | 112 | { |
grit | 4:a645b6a6fa1f | 113 | tr_debug(__FUNCTION__); |
grit | 4:a645b6a6fa1f | 114 | |
Wayne Roberts |
3:f81d64ff0164 | 115 | uint16_t rx_crc, crc = crc_ccitt(Radio::radio.rx_buf, 5); |
Wayne Roberts |
3:f81d64ff0164 | 116 | rx_crc = Radio::radio.rx_buf[5]; |
dudmuck | 0:b6ec8db2edbf | 117 | rx_crc <<= 8; |
Wayne Roberts |
3:f81d64ff0164 | 118 | rx_crc += Radio::radio.rx_buf[6]; |
grit | 4:a645b6a6fa1f | 119 | //tr_debug("%u) crc rx:%04x, calc:%04x\r\n", lora.RegRxNbBytes, rx_crc, crc); |
grit | 4:a645b6a6fa1f | 120 | |
grit | 4:a645b6a6fa1f | 121 | if (crc != rx_crc) |
grit | 4:a645b6a6fa1f | 122 | { |
grit | 4:a645b6a6fa1f | 123 | tr_debug("crc fail %04x, %04x\r\n", rx_crc, crc); |
grit | 4:a645b6a6fa1f | 124 | return; |
grit | 4:a645b6a6fa1f | 125 | } |
grit | 4:a645b6a6fa1f | 126 | |
grit | 4:a645b6a6fa1f | 127 | CriticalSectionLock::enable(); |
grit | 4:a645b6a6fa1f | 128 | command = Radio::radio.rx_buf[0]; |
grit | 4:a645b6a6fa1f | 129 | CriticalSectionLock::disable(); |
grit | 4:a645b6a6fa1f | 130 | |
grit | 4:a645b6a6fa1f | 131 | unsigned delay; |
grit | 4:a645b6a6fa1f | 132 | delay = Radio::radio.rx_buf[1]; |
grit | 4:a645b6a6fa1f | 133 | delay <<= 8; |
grit | 4:a645b6a6fa1f | 134 | delay += Radio::radio.rx_buf[2]; |
grit | 4:a645b6a6fa1f | 135 | delay <<= 8; |
grit | 4:a645b6a6fa1f | 136 | delay += Radio::radio.rx_buf[3]; |
grit | 4:a645b6a6fa1f | 137 | delay <<= 8; |
grit | 4:a645b6a6fa1f | 138 | delay += Radio::radio.rx_buf[4]; |
grit | 4:a645b6a6fa1f | 139 | |
grit | 4:a645b6a6fa1f | 140 | timeoutOutputDelay.attach_us(writeCommandToDigitalOuts, delay); |
grit | 4:a645b6a6fa1f | 141 | tr_debug("output delay:%u\r\n", delay); |
dudmuck | 0:b6ec8db2edbf | 142 | } |
Wayne Roberts |
3:f81d64ff0164 | 143 | |
Wayne Roberts |
3:f81d64ff0164 | 144 | void txDoneCB() |
Wayne Roberts |
3:f81d64ff0164 | 145 | { |
Wayne Roberts |
3:f81d64ff0164 | 146 | } |
Wayne Roberts |
3:f81d64ff0164 | 147 | |
Wayne Roberts |
3:f81d64ff0164 | 148 | void rxDoneCB(uint8_t size, float Rssi, float Snr) |
Wayne Roberts |
3:f81d64ff0164 | 149 | { |
Wayne Roberts |
3:f81d64ff0164 | 150 | get_alarm(); |
grit | 4:a645b6a6fa1f | 151 | tr_debug("%.1fdBm snr:%.1fdB ", Rssi, Snr); |
Wayne Roberts |
3:f81d64ff0164 | 152 | } |
Wayne Roberts |
3:f81d64ff0164 | 153 | |
grit | 4:a645b6a6fa1f | 154 | const RadioEvents_t rev = |
grit | 4:a645b6a6fa1f | 155 | { |
Wayne Roberts |
3:f81d64ff0164 | 156 | /* Dio0_top_half */ NULL, |
Wayne Roberts |
3:f81d64ff0164 | 157 | /* TxDone_topHalf */ NULL, |
Wayne Roberts |
3:f81d64ff0164 | 158 | /* TxDone_botHalf */ txDoneCB, |
Wayne Roberts |
3:f81d64ff0164 | 159 | /* TxTimeout */ NULL, |
Wayne Roberts |
3:f81d64ff0164 | 160 | /* RxDone */ rxDoneCB, |
Wayne Roberts |
3:f81d64ff0164 | 161 | /* RxTimeout */ NULL, |
Wayne Roberts |
3:f81d64ff0164 | 162 | /* RxError */ NULL, |
Wayne Roberts |
3:f81d64ff0164 | 163 | /* FhssChangeChannel */NULL, |
Wayne Roberts |
3:f81d64ff0164 | 164 | /* CadDone */ NULL |
Wayne Roberts |
3:f81d64ff0164 | 165 | }; |
Wayne Roberts |
3:f81d64ff0164 | 166 | |
dudmuck | 0:b6ec8db2edbf | 167 | |
dudmuck | 0:b6ec8db2edbf | 168 | int main() |
dudmuck | 0:b6ec8db2edbf | 169 | { |
grit | 4:a645b6a6fa1f | 170 | mbed_trace_mutex_wait_function_set( serial_out_mutex_wait ); |
grit | 4:a645b6a6fa1f | 171 | mbed_trace_mutex_release_function_set( serial_out_mutex_release ); |
grit | 4:a645b6a6fa1f | 172 | mbed_trace_init(); |
grit | 4:a645b6a6fa1f | 173 | tr_debug(__FUNCTION__); |
Wayne Roberts |
3:f81d64ff0164 | 174 | |
Wayne Roberts |
3:f81d64ff0164 | 175 | Radio::Init(&rev); |
Wayne Roberts |
3:f81d64ff0164 | 176 | Radio::Standby(); |
Wayne Roberts |
3:f81d64ff0164 | 177 | Radio::LoRaModemConfig(BW_KHZ, SPREADING_FACTOR, 1); |
Wayne Roberts |
3:f81d64ff0164 | 178 | Radio::LoRaPacketConfig(8, false, true, false); // preambleLen, fixLen, crcOn, invIQ |
Wayne Roberts |
3:f81d64ff0164 | 179 | Radio::SetChannel(CF_HZ); |
Wayne Roberts |
3:f81d64ff0164 | 180 | Radio::Rx(0); |
dudmuck | 0:b6ec8db2edbf | 181 | |
grit | 4:a645b6a6fa1f | 182 | while(true) |
grit | 4:a645b6a6fa1f | 183 | { |
Wayne Roberts |
3:f81d64ff0164 | 184 | Radio::service(); |
grit | 4:a645b6a6fa1f | 185 | if(commandWrittenFlag) |
grit | 4:a645b6a6fa1f | 186 | { |
grit | 4:a645b6a6fa1f | 187 | tr_debug("Command Written: %d", command); |
grit | 4:a645b6a6fa1f | 188 | CriticalSectionLock::enable(); |
grit | 4:a645b6a6fa1f | 189 | commandWrittenFlag = false; |
grit | 4:a645b6a6fa1f | 190 | CriticalSectionLock::disable(); |
grit | 4:a645b6a6fa1f | 191 | } |
grit | 5:5ac152096add | 192 | if(commandAssertedFlag) |
grit | 5:5ac152096add | 193 | { |
grit | 5:5ac152096add | 194 | tr_debug("Command Asserted: %d", command); |
grit | 5:5ac152096add | 195 | CriticalSectionLock::enable(); |
grit | 5:5ac152096add | 196 | commandAssertedFlag = false; |
grit | 5:5ac152096add | 197 | CriticalSectionLock::disable(); |
grit | 5:5ac152096add | 198 | } |
dudmuck | 0:b6ec8db2edbf | 199 | } |
dudmuck | 0:b6ec8db2edbf | 200 | } |