May 2021 test

Dependencies:   sx128x sx12xx_hal

Committer:
grit
Date:
Thu Nov 07 11:08:22 2019 +0000
Revision:
5:5ac152096add
Parent:
4:a645b6a6fa1f
Add assertion of command via 200ms pulse on PB2

Who changed what in which revision?

UserRevisionLine numberNew 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 }