point-2-point demo

Dependencies:   sx12xx_hal

radio chip selection

Radio chip driver is not included, because these options are available.
If you're using SX1272 or SX1276, then import sx127x driver into your program.
if you're using SX1261 or SX1262, then import sx126x driver into your program.
if you're using SX1280, then import sx1280 driver into your program.
If you're using NAmote72 or Murata discovery, then you must import only sx127x driver.

TX trigger selection

Edit main.h to define DIGITAL_TRIGGER or ANALOG_TRIGGER to chose whether transmit is initiated by digital pin (button/jumper) or analog pin(s) level change.

This project is intended to be used on two LoRa shields.

Each board sits in continuous RX mode, waiting for request packet.
If the received packet has good CRC, the packet is acknowledged along with read of ADC sample from the replying device.
The original request packet also contains instruction to set level of output pin.

Both sides of the link are running the same code, and each can initiate a transmission at any time.
No addressing is used, so only two nodes can operate on the radio channel.

Committer:
Wayne Roberts
Date:
Tue Jul 17 14:32:29 2018 -0700
Revision:
4:b5dd459ac390
Parent:
3:cd312fc32558
Child:
5:e35b1b281466
use HAL to support all radio devices

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wayne Roberts 4:b5dd459ac390 1 #include "radio.h"
dudmuck 1:d95d135a4fb4 2 #include "uart_cmds.h"
dudmuck 0:1d8d218c5cc5 3
Wayne Roberts 3:cd312fc32558 4 //#define ANALOG_TX_TRIGGER
Wayne Roberts 3:cd312fc32558 5
Wayne Roberts 4:b5dd459ac390 6 #if defined(SX127x_H) || defined(SX126x_H)
Wayne Roberts 4:b5dd459ac390 7 #define BW_KHZ 500
Wayne Roberts 4:b5dd459ac390 8 #define SPREADING_FACTOR 9
Wayne Roberts 4:b5dd459ac390 9 #define CF_HZ 917300000
Wayne Roberts 4:b5dd459ac390 10 #ifdef SX127x_H
Wayne Roberts 4:b5dd459ac390 11 AnalogIn a1(A1);
Wayne Roberts 4:b5dd459ac390 12 #else
Wayne Roberts 4:b5dd459ac390 13 /* arduino analog pins used by radio shield */
Wayne Roberts 4:b5dd459ac390 14 AnalogIn a1(PC_3); // PC_2 and PC_4 also available
Wayne Roberts 4:b5dd459ac390 15 #endif
Wayne Roberts 4:b5dd459ac390 16 #elif defined(SX128x_H)
Wayne Roberts 4:b5dd459ac390 17 #define BW_KHZ 400
Wayne Roberts 4:b5dd459ac390 18 #define SPREADING_FACTOR 9
Wayne Roberts 4:b5dd459ac390 19 #define CF_HZ 2487000000
Wayne Roberts 4:b5dd459ac390 20 /* arduino analog pins used by radio shield */
Wayne Roberts 4:b5dd459ac390 21 AnalogIn a1(PC_3); // PC_2 and PC_4 also available
Wayne Roberts 4:b5dd459ac390 22 #endif
Wayne Roberts 4:b5dd459ac390 23
dudmuck 0:1d8d218c5cc5 24 DigitalOut myled(LED1);
dudmuck 0:1d8d218c5cc5 25
dudmuck 0:1d8d218c5cc5 26
dudmuck 0:1d8d218c5cc5 27 Timer t;
dudmuck 0:1d8d218c5cc5 28 Ticker ticker;
Wayne Roberts 4:b5dd459ac390 29 volatile bool tx_done;
Wayne Roberts 4:b5dd459ac390 30 InterruptIn user_button(USER_BUTTON);
dudmuck 0:1d8d218c5cc5 31 DigitalOut pc6_out(PC_6);
dudmuck 0:1d8d218c5cc5 32
Wayne Roberts 3:cd312fc32558 33 #ifndef ANALOG_TX_TRIGGER
Wayne Roberts 4:b5dd459ac390 34 #define AIN_REST_THRESHOLD 96 // 12bit left justified
Wayne Roberts 4:b5dd459ac390 35 DigitalOut jumper_out(PC_10);
Wayne Roberts 4:b5dd459ac390 36 InterruptIn jumper_in(PC_12);
Wayne Roberts 4:b5dd459ac390 37 volatile bool start_tx;
Wayne Roberts 3:cd312fc32558 38 #endif /* !ANALOG_TX_TRIGGER */
dudmuck 0:1d8d218c5cc5 39
Wayne Roberts 4:b5dd459ac390 40 #define RX_TIMEOUT_US 200000
dudmuck 0:1d8d218c5cc5 41 /**********************************************************************/
dudmuck 0:1d8d218c5cc5 42
dudmuck 0:1d8d218c5cc5 43 uint8_t out_pin_state;
dudmuck 0:1d8d218c5cc5 44
Wayne Roberts 4:b5dd459ac390 45 void txDoneCB()
Wayne Roberts 4:b5dd459ac390 46 {
Wayne Roberts 4:b5dd459ac390 47 tx_done = true;
Wayne Roberts 4:b5dd459ac390 48 }
dudmuck 0:1d8d218c5cc5 49
dudmuck 0:1d8d218c5cc5 50 static uint16_t crc16( uint8_t *buffer, uint16_t length )
dudmuck 0:1d8d218c5cc5 51 {
dudmuck 0:1d8d218c5cc5 52 uint16_t i;
dudmuck 0:1d8d218c5cc5 53 // The CRC calculation follows CCITT
dudmuck 0:1d8d218c5cc5 54 const uint16_t polynom = 0x1021;
dudmuck 0:1d8d218c5cc5 55 // CRC initial value
dudmuck 0:1d8d218c5cc5 56 uint16_t crc = 0x0000;
dudmuck 0:1d8d218c5cc5 57
dudmuck 0:1d8d218c5cc5 58 if( buffer == NULL )
dudmuck 0:1d8d218c5cc5 59 {
dudmuck 0:1d8d218c5cc5 60 return 0;
dudmuck 0:1d8d218c5cc5 61 }
dudmuck 0:1d8d218c5cc5 62
dudmuck 0:1d8d218c5cc5 63 for( i = 0; i < length; ++i )
dudmuck 0:1d8d218c5cc5 64 {
dudmuck 0:1d8d218c5cc5 65 uint16_t j;
dudmuck 0:1d8d218c5cc5 66 crc ^= ( uint16_t ) buffer[i] << 8;
dudmuck 0:1d8d218c5cc5 67 for( j = 0; j < 8; ++j )
dudmuck 0:1d8d218c5cc5 68 {
dudmuck 0:1d8d218c5cc5 69 crc = ( crc & 0x8000 ) ? ( crc << 1 ) ^ polynom : ( crc << 1 );
dudmuck 0:1d8d218c5cc5 70 }
dudmuck 0:1d8d218c5cc5 71 }
dudmuck 0:1d8d218c5cc5 72
dudmuck 0:1d8d218c5cc5 73 return crc;
dudmuck 0:1d8d218c5cc5 74 }
dudmuck 0:1d8d218c5cc5 75
dudmuck 0:1d8d218c5cc5 76 void tx_ack()
dudmuck 0:1d8d218c5cc5 77 {
dudmuck 0:1d8d218c5cc5 78 uint8_t n = 0;
dudmuck 0:1d8d218c5cc5 79 uint16_t crc;
dudmuck 0:1d8d218c5cc5 80
Wayne Roberts 4:b5dd459ac390 81 if (Radio::radio.rx_buf[0] == CMD_OUT_PIN) {
dudmuck 0:1d8d218c5cc5 82 uint16_t ain = a1.read_u16();
Wayne Roberts 4:b5dd459ac390 83 Radio::radio.tx_buf[n++] = CMD_OUT_PIN_ACK;
dudmuck 0:1d8d218c5cc5 84 /* TODO read analog pin and digital input pin */
Wayne Roberts 4:b5dd459ac390 85 Radio::radio.tx_buf[n++] = ain;
Wayne Roberts 4:b5dd459ac390 86 Radio::radio.tx_buf[n++] = ain >> 8;
dudmuck 0:1d8d218c5cc5 87 } else
Wayne Roberts 4:b5dd459ac390 88 Radio::radio.tx_buf[n++] = 0xff;
Wayne Roberts 4:b5dd459ac390 89
Wayne Roberts 4:b5dd459ac390 90 crc = crc16(Radio::radio.tx_buf, n);
Wayne Roberts 4:b5dd459ac390 91 Radio::radio.tx_buf[n++] = crc;
Wayne Roberts 4:b5dd459ac390 92 Radio::radio.tx_buf[n++] = crc >> 8;
dudmuck 0:1d8d218c5cc5 93
Wayne Roberts 4:b5dd459ac390 94 tx_done = false;
Wayne Roberts 4:b5dd459ac390 95 Radio::Send(n, 0, 0, 0);
Wayne Roberts 4:b5dd459ac390 96 printf("tx_ack\r\n");
Wayne Roberts 4:b5dd459ac390 97
Wayne Roberts 4:b5dd459ac390 98 while (!tx_done)
Wayne Roberts 4:b5dd459ac390 99 Radio::service();
Wayne Roberts 4:b5dd459ac390 100
Wayne Roberts 4:b5dd459ac390 101 Radio::Rx(0);
Wayne Roberts 4:b5dd459ac390 102 }
dudmuck 0:1d8d218c5cc5 103
Wayne Roberts 4:b5dd459ac390 104 volatile struct _rx_ {
Wayne Roberts 4:b5dd459ac390 105 uint8_t length;
Wayne Roberts 4:b5dd459ac390 106 float rssi;
Wayne Roberts 4:b5dd459ac390 107 float snr;
Wayne Roberts 4:b5dd459ac390 108 } rx;
dudmuck 0:1d8d218c5cc5 109
Wayne Roberts 4:b5dd459ac390 110 void rxDoneCB(uint8_t size, float Rssi, float Snr)
Wayne Roberts 4:b5dd459ac390 111 {
Wayne Roberts 4:b5dd459ac390 112 rx.length = size;
Wayne Roberts 4:b5dd459ac390 113 rx.rssi = Rssi;
Wayne Roberts 4:b5dd459ac390 114 rx.snr = Snr;
dudmuck 0:1d8d218c5cc5 115 }
dudmuck 0:1d8d218c5cc5 116
dudmuck 1:d95d135a4fb4 117 void radio_tx(uint8_t* payload, uint8_t payload_len)
dudmuck 0:1d8d218c5cc5 118 {
dudmuck 0:1d8d218c5cc5 119 int i;
dudmuck 1:d95d135a4fb4 120 uint8_t n = 0;
dudmuck 1:d95d135a4fb4 121 uint16_t crc;
dudmuck 1:d95d135a4fb4 122
dudmuck 1:d95d135a4fb4 123 while (payload_len > 0) {
dudmuck 1:d95d135a4fb4 124 //printf("n%u, paylen%u\r\n", n, payload_len);
dudmuck 1:d95d135a4fb4 125 payload_len--;
Wayne Roberts 4:b5dd459ac390 126 Radio::radio.tx_buf[payload_len] = payload[payload_len];
dudmuck 1:d95d135a4fb4 127 n++;
dudmuck 1:d95d135a4fb4 128 }
dudmuck 1:d95d135a4fb4 129
Wayne Roberts 4:b5dd459ac390 130 crc = crc16(Radio::radio.tx_buf, n);
Wayne Roberts 4:b5dd459ac390 131 Radio::radio.tx_buf[n++] = crc;
Wayne Roberts 4:b5dd459ac390 132 Radio::radio.tx_buf[n++] = crc >> 8;
dudmuck 0:1d8d218c5cc5 133
dudmuck 0:1d8d218c5cc5 134 for (i = 0; i < 3; i++) {
dudmuck 0:1d8d218c5cc5 135 int rx_timeout_at;
Wayne Roberts 4:b5dd459ac390 136 int rx_start_at;
dudmuck 0:1d8d218c5cc5 137
Wayne Roberts 4:b5dd459ac390 138 tx_done = false;
Wayne Roberts 4:b5dd459ac390 139 Radio::Send(n, 0, 0, 0);
dudmuck 0:1d8d218c5cc5 140
Wayne Roberts 4:b5dd459ac390 141 while (!tx_done)
Wayne Roberts 4:b5dd459ac390 142 Radio::service();
dudmuck 0:1d8d218c5cc5 143
Wayne Roberts 4:b5dd459ac390 144 rx_start_at = t.read_us();
Wayne Roberts 4:b5dd459ac390 145 rx_timeout_at = rx_start_at + RX_TIMEOUT_US;
Wayne Roberts 4:b5dd459ac390 146
Wayne Roberts 4:b5dd459ac390 147 Radio::Rx(0);
Wayne Roberts 4:b5dd459ac390 148 rx.length = 0;
dudmuck 0:1d8d218c5cc5 149
dudmuck 0:1d8d218c5cc5 150 while (t.read_us() < rx_timeout_at) {
Wayne Roberts 4:b5dd459ac390 151 Radio::service();
Wayne Roberts 4:b5dd459ac390 152 if (rx.length > 0) {
dudmuck 0:1d8d218c5cc5 153 uint16_t rx_crc;
Wayne Roberts 4:b5dd459ac390 154 printf(" rssi:%.1fdBm snr:%.1fdB ", rx.rssi, rx.snr);
Wayne Roberts 4:b5dd459ac390 155 rx_crc = Radio::radio.rx_buf[rx.length-2];
Wayne Roberts 4:b5dd459ac390 156 rx_crc |= Radio::radio.rx_buf[rx.length-1] << 8;
Wayne Roberts 4:b5dd459ac390 157 crc = crc16(Radio::radio.rx_buf, rx.length-2);
dudmuck 0:1d8d218c5cc5 158 if (crc == rx_crc) {
dudmuck 0:1d8d218c5cc5 159 printf("crcOk %u\r\n", i);
Wayne Roberts 4:b5dd459ac390 160 if (Radio::radio.rx_buf[0] == CMD_OUT_PIN_ACK) {
Wayne Roberts 4:b5dd459ac390 161 uint16_t ain = Radio::radio.rx_buf[1];
Wayne Roberts 4:b5dd459ac390 162 ain |= Radio::radio.rx_buf[2] << 8;
dudmuck 0:1d8d218c5cc5 163 printf("ain %u\r\n", ain);
dudmuck 0:1d8d218c5cc5 164 }
Wayne Roberts 4:b5dd459ac390 165 rx.length = 0;
dudmuck 0:1d8d218c5cc5 166 return;
dudmuck 0:1d8d218c5cc5 167 } else
dudmuck 0:1d8d218c5cc5 168 printf("crcFail %04x != %04x\r\n", crc, rx_crc);
Wayne Roberts 4:b5dd459ac390 169 rx.length = 0;
dudmuck 0:1d8d218c5cc5 170 }
dudmuck 0:1d8d218c5cc5 171 }
Wayne Roberts 4:b5dd459ac390 172 printf("rx-timeout %u, %u\r\n", i, t.read_us() - rx_start_at);
dudmuck 0:1d8d218c5cc5 173 } // ..for()
dudmuck 0:1d8d218c5cc5 174 }
dudmuck 0:1d8d218c5cc5 175
Wayne Roberts 3:cd312fc32558 176 #ifndef ANALOG_TX_TRIGGER
dudmuck 0:1d8d218c5cc5 177 void button_isr()
dudmuck 0:1d8d218c5cc5 178 {
dudmuck 0:1d8d218c5cc5 179 if (!jumper_in.read())
dudmuck 0:1d8d218c5cc5 180 start_tx = true;
dudmuck 0:1d8d218c5cc5 181 }
dudmuck 0:1d8d218c5cc5 182
dudmuck 0:1d8d218c5cc5 183 void auto_tx()
dudmuck 0:1d8d218c5cc5 184 {
dudmuck 0:1d8d218c5cc5 185 if (jumper_in.read())
dudmuck 0:1d8d218c5cc5 186 start_tx = true;
dudmuck 0:1d8d218c5cc5 187 else
dudmuck 0:1d8d218c5cc5 188 ticker.detach();
dudmuck 0:1d8d218c5cc5 189 }
Wayne Roberts 3:cd312fc32558 190 #endif /* !ANALOG_TX_TRIGGER */
dudmuck 0:1d8d218c5cc5 191
Wayne Roberts 4:b5dd459ac390 192
Wayne Roberts 4:b5dd459ac390 193 const RadioEvents_t rev = {
Wayne Roberts 4:b5dd459ac390 194 /* Dio0_top_half */ NULL,
Wayne Roberts 4:b5dd459ac390 195 /* TxDone_topHalf */ NULL,
Wayne Roberts 4:b5dd459ac390 196 /* TxDone_botHalf */ txDoneCB,
Wayne Roberts 4:b5dd459ac390 197 /* TxTimeout */ NULL,
Wayne Roberts 4:b5dd459ac390 198 /* RxDone */ rxDoneCB,
Wayne Roberts 4:b5dd459ac390 199 /* RxTimeout */ NULL,
Wayne Roberts 4:b5dd459ac390 200 /* RxError */ NULL,
Wayne Roberts 4:b5dd459ac390 201 /* FhssChangeChannel */NULL,
Wayne Roberts 4:b5dd459ac390 202 /* CadDone */ NULL
Wayne Roberts 4:b5dd459ac390 203 };
Wayne Roberts 4:b5dd459ac390 204
dudmuck 0:1d8d218c5cc5 205 int main()
dudmuck 0:1d8d218c5cc5 206 {
Wayne Roberts 3:cd312fc32558 207 #ifdef ANALOG_TX_TRIGGER
Wayne Roberts 3:cd312fc32558 208 uint16_t prev_ain;
Wayne Roberts 3:cd312fc32558 209 int8_t ain_movement;
Wayne Roberts 3:cd312fc32558 210 bool ain_sent;
Wayne Roberts 3:cd312fc32558 211 #else
dudmuck 0:1d8d218c5cc5 212 bool jin = false;
dudmuck 0:1d8d218c5cc5 213
dudmuck 0:1d8d218c5cc5 214 jumper_out = 1;
dudmuck 0:1d8d218c5cc5 215 jumper_in.mode(PullDown);
dudmuck 0:1d8d218c5cc5 216
dudmuck 0:1d8d218c5cc5 217 while (!user_button) {
dudmuck 0:1d8d218c5cc5 218 printf("button-lo\r\n");
dudmuck 0:1d8d218c5cc5 219 wait(0.01);
dudmuck 0:1d8d218c5cc5 220 }
dudmuck 0:1d8d218c5cc5 221 user_button.fall(&button_isr);
Wayne Roberts 3:cd312fc32558 222 #endif /* !ANALOG_TX_TRIGGER */
Wayne Roberts 3:cd312fc32558 223 printf("\r\n2reset\r\n");
dudmuck 0:1d8d218c5cc5 224 t.start();
dudmuck 0:1d8d218c5cc5 225
Wayne Roberts 4:b5dd459ac390 226 Radio::Init(&rev);
Wayne Roberts 4:b5dd459ac390 227
Wayne Roberts 4:b5dd459ac390 228 Radio::Standby();
Wayne Roberts 4:b5dd459ac390 229 Radio::LoRaModemConfig(BW_KHZ, SPREADING_FACTOR, 1);
Wayne Roberts 4:b5dd459ac390 230 Radio::LoRaPacketConfig(8, false, true, false); // preambleLen, fixLen, crcOn, invIQ
Wayne Roberts 4:b5dd459ac390 231 Radio::SetChannel(CF_HZ);
dudmuck 0:1d8d218c5cc5 232
Wayne Roberts 4:b5dd459ac390 233 Radio::Rx(0);
dudmuck 0:1d8d218c5cc5 234
Wayne Roberts 3:cd312fc32558 235 #ifdef ANALOG_TX_TRIGGER
Wayne Roberts 3:cd312fc32558 236 prev_ain = a1.read_u16();
Wayne Roberts 3:cd312fc32558 237 ain_movement = 0;
Wayne Roberts 3:cd312fc32558 238 ain_sent = false;
Wayne Roberts 3:cd312fc32558 239 #endif /* ANALOG_TX_TRIGGER */
dudmuck 0:1d8d218c5cc5 240 for (;;) {
Wayne Roberts 3:cd312fc32558 241 #ifdef ANALOG_TX_TRIGGER
Wayne Roberts 3:cd312fc32558 242 uint16_t ain = a1.read_u16();
Wayne Roberts 3:cd312fc32558 243 uint16_t diff = abs(ain-prev_ain);
Wayne Roberts 3:cd312fc32558 244 if (diff > AIN_REST_THRESHOLD) {
Wayne Roberts 3:cd312fc32558 245 ain_sent = false;
Wayne Roberts 3:cd312fc32558 246 if (ain_movement < 1)
Wayne Roberts 3:cd312fc32558 247 ain_movement = 1;
Wayne Roberts 3:cd312fc32558 248 else {
Wayne Roberts 3:cd312fc32558 249 if (++ain_movement > 16)
Wayne Roberts 3:cd312fc32558 250 ain_movement = 16;
Wayne Roberts 3:cd312fc32558 251 }
Wayne Roberts 3:cd312fc32558 252 } else {
Wayne Roberts 3:cd312fc32558 253 /* steady state */
Wayne Roberts 3:cd312fc32558 254 if (ain_movement > 0)
Wayne Roberts 3:cd312fc32558 255 ain_movement = 0;
Wayne Roberts 3:cd312fc32558 256 else {
Wayne Roberts 3:cd312fc32558 257 if (--ain_movement < -16) {
Wayne Roberts 3:cd312fc32558 258 ain_movement = -16;
Wayne Roberts 3:cd312fc32558 259 if (!ain_sent) {
Wayne Roberts 3:cd312fc32558 260 uint8_t buf[4];
Wayne Roberts 3:cd312fc32558 261 printf("## %02x ##\r\n", ain >> 8);
Wayne Roberts 3:cd312fc32558 262 buf[0] = CMD_PWM;
Wayne Roberts 3:cd312fc32558 263 buf[1] = 120; // Hz
Wayne Roberts 3:cd312fc32558 264 buf[2] = ain >> 8; // duty
Wayne Roberts 3:cd312fc32558 265 radio_tx(buf, 3);
Wayne Roberts 3:cd312fc32558 266 ain_sent = true;
Wayne Roberts 3:cd312fc32558 267 }
Wayne Roberts 3:cd312fc32558 268 }
Wayne Roberts 3:cd312fc32558 269 }
Wayne Roberts 3:cd312fc32558 270 }
Wayne Roberts 3:cd312fc32558 271 //printf("%05u diff:%04u move:%d\r\n", ain, diff, ain_movement);
Wayne Roberts 3:cd312fc32558 272 prev_ain = ain;
Wayne Roberts 3:cd312fc32558 273 wait_us(5000);
Wayne Roberts 3:cd312fc32558 274
Wayne Roberts 3:cd312fc32558 275 #else
dudmuck 0:1d8d218c5cc5 276
dudmuck 0:1d8d218c5cc5 277 if (jumper_in.read()) {
dudmuck 0:1d8d218c5cc5 278 if (!jin) {
dudmuck 0:1d8d218c5cc5 279 ticker.attach(auto_tx, 0.5);
dudmuck 0:1d8d218c5cc5 280 jin = true;
dudmuck 0:1d8d218c5cc5 281 }
dudmuck 0:1d8d218c5cc5 282 } else {
dudmuck 0:1d8d218c5cc5 283 jin = false;
dudmuck 0:1d8d218c5cc5 284 }
dudmuck 0:1d8d218c5cc5 285
dudmuck 0:1d8d218c5cc5 286 if (start_tx) {
dudmuck 1:d95d135a4fb4 287 start_tx = false;
dudmuck 1:d95d135a4fb4 288
dudmuck 1:d95d135a4fb4 289 uint8_t buf[2];
dudmuck 0:1d8d218c5cc5 290 out_pin_state ^= 1;
dudmuck 1:d95d135a4fb4 291 buf[0] = CMD_OUT_PIN;
dudmuck 1:d95d135a4fb4 292 buf[1] = out_pin_state;
dudmuck 1:d95d135a4fb4 293 radio_tx(buf, 2);
dudmuck 0:1d8d218c5cc5 294 }
Wayne Roberts 3:cd312fc32558 295 #endif /* !ANALOG_TX_TRIGGER */
Wayne Roberts 4:b5dd459ac390 296 if (rx.length > 0) {
dudmuck 0:1d8d218c5cc5 297 uint16_t crc, rx_crc;
dudmuck 0:1d8d218c5cc5 298 int i;
Wayne Roberts 4:b5dd459ac390 299 for (i = 0; i < rx.length; i++) {
Wayne Roberts 4:b5dd459ac390 300 printf("%02x ", Radio::radio.rx_buf[i]);
dudmuck 0:1d8d218c5cc5 301 }
Wayne Roberts 4:b5dd459ac390 302 printf(" rssi:%.1fdBm, snr:%.1fdB\r\n", rx.rssi, rx.snr);
Wayne Roberts 4:b5dd459ac390 303 rx_crc = Radio::radio.rx_buf[rx.length-2];
Wayne Roberts 4:b5dd459ac390 304 rx_crc |= Radio::radio.rx_buf[rx.length-1] << 8;
Wayne Roberts 4:b5dd459ac390 305 crc = crc16(Radio::radio.rx_buf, rx.length-2);
dudmuck 0:1d8d218c5cc5 306 if (crc == rx_crc) {
Wayne Roberts 4:b5dd459ac390 307 bool sendAck = false;
Wayne Roberts 4:b5dd459ac390 308 bool parsed = parse_radio_rx(Radio::radio.rx_buf);
dudmuck 0:1d8d218c5cc5 309 printf("crcOk\r\n");
Wayne Roberts 4:b5dd459ac390 310 if (!parsed && Radio::radio.rx_buf[0] == CMD_OUT_PIN) {
Wayne Roberts 4:b5dd459ac390 311 pc6_out.write(Radio::radio.rx_buf[1]);
Wayne Roberts 4:b5dd459ac390 312 printf("out pin state: %u", Radio::radio.rx_buf[1]);
Wayne Roberts 4:b5dd459ac390 313 sendAck = true;
Wayne Roberts 4:b5dd459ac390 314 } else if (parsed)
Wayne Roberts 4:b5dd459ac390 315 sendAck = true;
Wayne Roberts 4:b5dd459ac390 316
dudmuck 0:1d8d218c5cc5 317 printf("\r\n");
Wayne Roberts 4:b5dd459ac390 318
Wayne Roberts 4:b5dd459ac390 319 if (sendAck)
Wayne Roberts 4:b5dd459ac390 320 tx_ack();
dudmuck 0:1d8d218c5cc5 321 } else
dudmuck 0:1d8d218c5cc5 322 printf("crc %04x != %04x\r\n", crc, rx_crc);
Wayne Roberts 4:b5dd459ac390 323
Wayne Roberts 4:b5dd459ac390 324 rx.length = 0;
dudmuck 0:1d8d218c5cc5 325 } // ..if something received
dudmuck 1:d95d135a4fb4 326
dudmuck 1:d95d135a4fb4 327 uart_service();
Wayne Roberts 4:b5dd459ac390 328
Wayne Roberts 4:b5dd459ac390 329 Radio::service();
dudmuck 0:1d8d218c5cc5 330 } // ..for (;;)
dudmuck 0:1d8d218c5cc5 331 }
dudmuck 0:1d8d218c5cc5 332