simple example of wifi AP scanning, sending scan-results over radio link

Dependencies:   lr1110 sx12xx_hal

End device for testing Wifi geolocation.

Use with radio shield for europe
or radio shield for USA
which is programmed with trx firmware from updater tool.


Press USER_BUTTON to scan wifi access points and send results over radio link to gateway, which posts to geolocation provider, which then reply's with coordinates.

Long press user button (half second) to only scan wifi, to print out on 9600bps UART, and not transmit scan results for geolocation resolving. Short press and release (under 500ms) will wifi scan and transmit for geolocation resolving.

Use this project with lr1110_wifi_geolocation_gateway to receive the message from this project and resolve the location from geolocation server

notice

This project is not using LoRaWAN, instead just LoRa transceiver directly to geolocation provider

Committer:
Wayne Roberts
Date:
Tue Feb 09 10:47:25 2021 -0800
Revision:
1:416ed16806fc
add source file

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wayne Roberts 1:416ed16806fc 1 #include "radio.h"
Wayne Roberts 1:416ed16806fc 2
Wayne Roberts 1:416ed16806fc 3 #define TX_DBM 20
Wayne Roberts 1:416ed16806fc 4 #define BW_KHZ 500
Wayne Roberts 1:416ed16806fc 5 #define SPREADING_FACTOR 11
Wayne Roberts 1:416ed16806fc 6 #define CF_HZ 919000000
Wayne Roberts 1:416ed16806fc 7
Wayne Roberts 1:416ed16806fc 8 #define HEADER_LENGTH 10 /* for chipEUI and extra reserved */
Wayne Roberts 1:416ed16806fc 9 #define WIFI_MAX_RESULTS 20
Wayne Roberts 1:416ed16806fc 10 #define LORA_RX_TIME_MS 20000 /* how long for cloud to reply with resolved location? */
Wayne Roberts 1:416ed16806fc 11
Wayne Roberts 1:416ed16806fc 12 /**********************************************************************/
Wayne Roberts 1:416ed16806fc 13 bool wifiResultFormatBasic; /* false, TODO get basic results functional */
Wayne Roberts 1:416ed16806fc 14 EventQueue queue(4 * EVENTS_EVENT_SIZE);
Wayne Roberts 1:416ed16806fc 15
Wayne Roberts 1:416ed16806fc 16 unsigned packet_len;
Wayne Roberts 1:416ed16806fc 17 uint8_t chip_eui[8];
Wayne Roberts 1:416ed16806fc 18
Wayne Roberts 1:416ed16806fc 19 InterruptIn ub(USER_BUTTON); /* released = hi, pressed = lo */
Wayne Roberts 1:416ed16806fc 20 void button_released(void);
Wayne Roberts 1:416ed16806fc 21 int wifi_scan_id, long_press_id;
Wayne Roberts 1:416ed16806fc 22 bool long_pressed;
Wayne Roberts 1:416ed16806fc 23
Wayne Roberts 1:416ed16806fc 24 uint64_t wifi_start_at, wifi_scan_dur;
Wayne Roberts 1:416ed16806fc 25
Wayne Roberts 1:416ed16806fc 26 static void cfg_lora()
Wayne Roberts 1:416ed16806fc 27 {
Wayne Roberts 1:416ed16806fc 28 /* after wifi scan, lora is gone */
Wayne Roberts 1:416ed16806fc 29 Radio::LoRaModemConfig(BW_KHZ, SPREADING_FACTOR, 1);
Wayne Roberts 1:416ed16806fc 30 Radio::SetChannel(CF_HZ);
Wayne Roberts 1:416ed16806fc 31
Wayne Roberts 1:416ed16806fc 32 Radio::set_tx_dbm(TX_DBM);
Wayne Roberts 1:416ed16806fc 33
Wayne Roberts 1:416ed16806fc 34 // preambleLen, fixLen, crcOn, invIQ
Wayne Roberts 1:416ed16806fc 35 Radio::LoRaPacketConfig(8, false, true, false);
Wayne Roberts 1:416ed16806fc 36 }
Wayne Roberts 1:416ed16806fc 37
Wayne Roberts 1:416ed16806fc 38 void wifi_scan()
Wayne Roberts 1:416ed16806fc 39 {
Wayne Roberts 1:416ed16806fc 40 uint8_t wifiScan_buf[9];
Wayne Roberts 1:416ed16806fc 41
Wayne Roberts 1:416ed16806fc 42 { /* wifi scan defaults, see LR1110 user manual section 10.2 */
Wayne Roberts 1:416ed16806fc 43 unsigned chanmask = 0x0421; // ch1, ch6, ch11
Wayne Roberts 1:416ed16806fc 44 unsigned timeout = 105; // in milliseconds, 100 wifi TUs (beacon interval)
Wayne Roberts 1:416ed16806fc 45
Wayne Roberts 1:416ed16806fc 46 wifiScan_buf[0] = 0x01; // wifi type
Wayne Roberts 1:416ed16806fc 47 wifiScan_buf[2] = chanmask; // chanmask-lo
Wayne Roberts 1:416ed16806fc 48 chanmask >>= 8;
Wayne Roberts 1:416ed16806fc 49 wifiScan_buf[1] = chanmask; // chanmask-hi
Wayne Roberts 1:416ed16806fc 50 wifiScan_buf[3] = 0x02; // acqMode
Wayne Roberts 1:416ed16806fc 51 wifiScan_buf[4] = WIFI_MAX_RESULTS; // NbMaxRes
Wayne Roberts 1:416ed16806fc 52 wifiScan_buf[5] = 0x10; // NbScanPerChan
Wayne Roberts 1:416ed16806fc 53 wifiScan_buf[7] = timeout; // Timeout-lo
Wayne Roberts 1:416ed16806fc 54 timeout >>= 8;
Wayne Roberts 1:416ed16806fc 55 wifiScan_buf[6] = timeout; // Timeout-hi
Wayne Roberts 1:416ed16806fc 56 wifiScan_buf[8] = 0x00; // AbortOnTimeout
Wayne Roberts 1:416ed16806fc 57 }
Wayne Roberts 1:416ed16806fc 58
Wayne Roberts 1:416ed16806fc 59 Radio::radio.xfer(OPCODE_WIFI_SCAN, 9, 0, wifiScan_buf);
Wayne Roberts 1:416ed16806fc 60 wifi_start_at = Kernel::get_ms_count();
Wayne Roberts 1:416ed16806fc 61 printf("wifiScan...\r\n");
Wayne Roberts 1:416ed16806fc 62 }
Wayne Roberts 1:416ed16806fc 63
Wayne Roberts 1:416ed16806fc 64 void long_press()
Wayne Roberts 1:416ed16806fc 65 {
Wayne Roberts 1:416ed16806fc 66 long_pressed = true;
Wayne Roberts 1:416ed16806fc 67 wifi_scan();
Wayne Roberts 1:416ed16806fc 68 }
Wayne Roberts 1:416ed16806fc 69
Wayne Roberts 1:416ed16806fc 70 void button_pressed()
Wayne Roberts 1:416ed16806fc 71 {
Wayne Roberts 1:416ed16806fc 72 ub.rise(button_released);
Wayne Roberts 1:416ed16806fc 73 queue.cancel(wifi_scan_id);
Wayne Roberts 1:416ed16806fc 74 long_pressed = false;
Wayne Roberts 1:416ed16806fc 75 long_press_id = queue.call_in(500, long_press);
Wayne Roberts 1:416ed16806fc 76 }
Wayne Roberts 1:416ed16806fc 77
Wayne Roberts 1:416ed16806fc 78 void button_released()
Wayne Roberts 1:416ed16806fc 79 {
Wayne Roberts 1:416ed16806fc 80 ub.fall(button_pressed);
Wayne Roberts 1:416ed16806fc 81 if (!long_pressed) {
Wayne Roberts 1:416ed16806fc 82 wifi_scan_id = queue.call_in(20, wifi_scan);
Wayne Roberts 1:416ed16806fc 83 queue.cancel(long_press_id);
Wayne Roberts 1:416ed16806fc 84 }
Wayne Roberts 1:416ed16806fc 85 }
Wayne Roberts 1:416ed16806fc 86
Wayne Roberts 1:416ed16806fc 87 void txDoneCB()
Wayne Roberts 1:416ed16806fc 88 {
Wayne Roberts 1:416ed16806fc 89 Radio::Rx(0);
Wayne Roberts 1:416ed16806fc 90 queue.call_in(LORA_RX_TIME_MS, Radio::Standby);
Wayne Roberts 1:416ed16806fc 91 }
Wayne Roberts 1:416ed16806fc 92
Wayne Roberts 1:416ed16806fc 93 void rxDoneCB(uint8_t size, float rssi, float snr)
Wayne Roberts 1:416ed16806fc 94 {
Wayne Roberts 1:416ed16806fc 95 unsigned i;
Wayne Roberts 1:416ed16806fc 96 printf("%.1fdBm snr:%.1fdB\t", rssi, snr);
Wayne Roberts 1:416ed16806fc 97
Wayne Roberts 1:416ed16806fc 98 /*
Wayne Roberts 1:416ed16806fc 99 for (i = 0; i < size; i++) {
Wayne Roberts 1:416ed16806fc 100 printf("%02x ", Radio::radio.rx_buf[i]);
Wayne Roberts 1:416ed16806fc 101 }
Wayne Roberts 1:416ed16806fc 102 printf("\r\n");*/
Wayne Roberts 1:416ed16806fc 103
Wayne Roberts 1:416ed16806fc 104 if (memcmp(Radio::radio.rx_buf, chip_eui, 8) == 0) {
Wayne Roberts 1:416ed16806fc 105 /* print resolved coordinates from cloud */
Wayne Roberts 1:416ed16806fc 106 printf(">> %s\r\n", Radio::radio.rx_buf + HEADER_LENGTH);
Wayne Roberts 1:416ed16806fc 107 }
Wayne Roberts 1:416ed16806fc 108 }
Wayne Roberts 1:416ed16806fc 109
Wayne Roberts 1:416ed16806fc 110 struct wifidr {
Wayne Roberts 1:416ed16806fc 111 const char *txt;
Wayne Roberts 1:416ed16806fc 112 float Mbps;
Wayne Roberts 1:416ed16806fc 113 };
Wayne Roberts 1:416ed16806fc 114
Wayne Roberts 1:416ed16806fc 115 const struct wifidr wifiDatarates[] = {
Wayne Roberts 1:416ed16806fc 116 /* 0 */ { NULL, 0},
Wayne Roberts 1:416ed16806fc 117 /* 1 */ { "DBPSK", 1},
Wayne Roberts 1:416ed16806fc 118 /* 2 */ { "DQPSK", 2},
Wayne Roberts 1:416ed16806fc 119 /* 3 */ { "BPSK", 6},
Wayne Roberts 1:416ed16806fc 120 /* 4 */ { "BPSK", 9},
Wayne Roberts 1:416ed16806fc 121 /* 5 */ { "QPSK", 12},
Wayne Roberts 1:416ed16806fc 122 /* 6 */ { "QPSK", 18},
Wayne Roberts 1:416ed16806fc 123 /* 7 */ { "16-QAM", 24},
Wayne Roberts 1:416ed16806fc 124 /* 8 */ { "16-QAM", 36},
Wayne Roberts 1:416ed16806fc 125 /* 9 */ { "(9)", 0},
Wayne Roberts 1:416ed16806fc 126 /* 10 */ { "(10)", 0},
Wayne Roberts 1:416ed16806fc 127 /* 11 */ { "BPSK", 6.5},
Wayne Roberts 1:416ed16806fc 128 /* 12 */ { "QPSK", 13},
Wayne Roberts 1:416ed16806fc 129 /* 13 */ { "QPSK", 19.5},
Wayne Roberts 1:416ed16806fc 130 /* 14 */ { "16-QAM", 26},
Wayne Roberts 1:416ed16806fc 131 /* 15 */ { "16-QAM", 39},
Wayne Roberts 1:416ed16806fc 132 /* 16 */ { "(16)", 0},
Wayne Roberts 1:416ed16806fc 133 /* 17 */ { "(17)", 0},
Wayne Roberts 1:416ed16806fc 134 /* 18 */ { "(18)", 0},
Wayne Roberts 1:416ed16806fc 135 /* 19 */ { "BPSK", 7.2},
Wayne Roberts 1:416ed16806fc 136 /* 20 */ { "QPSK", 14.4},
Wayne Roberts 1:416ed16806fc 137 /* 21 */ { "QPSK", 21.7},
Wayne Roberts 1:416ed16806fc 138 /* 22 */ { "16-QAM", 28.9},
Wayne Roberts 1:416ed16806fc 139 /* 23 */ { "16-QAM", 43.3},
Wayne Roberts 1:416ed16806fc 140 };
Wayne Roberts 1:416ed16806fc 141
Wayne Roberts 1:416ed16806fc 142 void print_wifi_result(const uint8_t *result)
Wayne Roberts 1:416ed16806fc 143 {
Wayne Roberts 1:416ed16806fc 144 char out[96];
Wayne Roberts 1:416ed16806fc 145 char str[24];
Wayne Roberts 1:416ed16806fc 146 unsigned n, macStart;
Wayne Roberts 1:416ed16806fc 147 wifiType_t wt;
Wayne Roberts 1:416ed16806fc 148 wifiChanInfo_t ci;
Wayne Roberts 1:416ed16806fc 149 wt.octet = result[0];
Wayne Roberts 1:416ed16806fc 150 ci.octet = result[1];
Wayne Roberts 1:416ed16806fc 151 out[0] = 0;
Wayne Roberts 1:416ed16806fc 152 strcat(out, "802.11");
Wayne Roberts 1:416ed16806fc 153 switch (wt.bits.signal) {
Wayne Roberts 1:416ed16806fc 154 case 1: strcat(out, "b"); break;
Wayne Roberts 1:416ed16806fc 155 case 2: strcat(out, "g"); break;
Wayne Roberts 1:416ed16806fc 156 case 3: strcat(out, "n"); break;
Wayne Roberts 1:416ed16806fc 157 }
Wayne Roberts 1:416ed16806fc 158 sprintf(str, " %s %.1fMbps", wifiDatarates[wt.bits.datarate].txt, wifiDatarates[wt.bits.datarate].Mbps);
Wayne Roberts 1:416ed16806fc 159 strcat(out, str);
Wayne Roberts 1:416ed16806fc 160 strcat(out, " ");
Wayne Roberts 1:416ed16806fc 161
Wayne Roberts 1:416ed16806fc 162 sprintf(str, "ch%u ", ci.bits.channelID);
Wayne Roberts 1:416ed16806fc 163 strcat(out, str);
Wayne Roberts 1:416ed16806fc 164 switch (ci.bits.channelID) {
Wayne Roberts 1:416ed16806fc 165 // table 10-5
Wayne Roberts 1:416ed16806fc 166 }
Wayne Roberts 1:416ed16806fc 167 strcat(out, " ");
Wayne Roberts 1:416ed16806fc 168 sprintf(str, "mv:%u ", ci.bits.macValidationID);
Wayne Roberts 1:416ed16806fc 169 strcat(out, str);
Wayne Roberts 1:416ed16806fc 170 switch (ci.bits.macValidationID) {
Wayne Roberts 1:416ed16806fc 171 case 1: strcat(out, "gateway"); break;
Wayne Roberts 1:416ed16806fc 172 case 2: strcat(out, "phone"); break;
Wayne Roberts 1:416ed16806fc 173 case 3: strcat(out, "?"); break;
Wayne Roberts 1:416ed16806fc 174 // table 10.8
Wayne Roberts 1:416ed16806fc 175 }
Wayne Roberts 1:416ed16806fc 176
Wayne Roberts 1:416ed16806fc 177 strcat(out, " ");
Wayne Roberts 1:416ed16806fc 178
Wayne Roberts 1:416ed16806fc 179 if (wifiResultFormatBasic) {
Wayne Roberts 1:416ed16806fc 180 macStart = 3;
Wayne Roberts 1:416ed16806fc 181 } else {
Wayne Roberts 1:416ed16806fc 182 macStart = 4;
Wayne Roberts 1:416ed16806fc 183 }
Wayne Roberts 1:416ed16806fc 184 for (n = 0; n < 6; n++) {
Wayne Roberts 1:416ed16806fc 185 sprintf(str, "%02x", result[n+macStart]);
Wayne Roberts 1:416ed16806fc 186 strcat(out, str);
Wayne Roberts 1:416ed16806fc 187 if (n < 5)
Wayne Roberts 1:416ed16806fc 188 strcat(out, ":");
Wayne Roberts 1:416ed16806fc 189 }
Wayne Roberts 1:416ed16806fc 190
Wayne Roberts 1:416ed16806fc 191 sprintf(str, " rssi:%d ", (int8_t)result[2]);
Wayne Roberts 1:416ed16806fc 192 strcat(out, str);
Wayne Roberts 1:416ed16806fc 193
Wayne Roberts 1:416ed16806fc 194 if (!wifiResultFormatBasic) {
Wayne Roberts 1:416ed16806fc 195 sprintf(str, "frameCtrl:%02x ", result[3]);
Wayne Roberts 1:416ed16806fc 196 strcat(out, str);
Wayne Roberts 1:416ed16806fc 197 }
Wayne Roberts 1:416ed16806fc 198 printf("%s\r\n", out);
Wayne Roberts 1:416ed16806fc 199 }
Wayne Roberts 1:416ed16806fc 200
Wayne Roberts 1:416ed16806fc 201 static void service()
Wayne Roberts 1:416ed16806fc 202 {
Wayne Roberts 1:416ed16806fc 203 irq_t irq;
Wayne Roberts 1:416ed16806fc 204 irq.dword = Radio::radio.service();
Wayne Roberts 1:416ed16806fc 205 if (irq.bits.WifiDone) {
Wayne Roberts 1:416ed16806fc 206 unsigned n;
Wayne Roberts 1:416ed16806fc 207 stat_t stat;
Wayne Roberts 1:416ed16806fc 208 uint8_t nbResults;
Wayne Roberts 1:416ed16806fc 209 stat.word = Radio::radio.xfer(OPCODE_GET_WIFI_NB_RESULTS, 0, 0, NULL);
Wayne Roberts 1:416ed16806fc 210 stat.word = Radio::radio.xfer(0x0000, 0, 1, &nbResults);
Wayne Roberts 1:416ed16806fc 211 if (stat.bits.cmdStatus != CMD_DAT) {
Wayne Roberts 1:416ed16806fc 212 printf("get-nbResult-fail\r\n");
Wayne Roberts 1:416ed16806fc 213 return;
Wayne Roberts 1:416ed16806fc 214 }
Wayne Roberts 1:416ed16806fc 215 packet_len = HEADER_LENGTH;
Wayne Roberts 1:416ed16806fc 216 printf("%ums nbResults:%u\r\n", (unsigned)wifi_scan_dur, nbResults);
Wayne Roberts 1:416ed16806fc 217 for (n = 0; n < nbResults; n++) {
Wayne Roberts 1:416ed16806fc 218 uint8_t buf[3];
Wayne Roberts 1:416ed16806fc 219 uint8_t resultBuf[22];
Wayne Roberts 1:416ed16806fc 220 buf[0] = n;
Wayne Roberts 1:416ed16806fc 221 buf[1] = 1; // number of results in this read
Wayne Roberts 1:416ed16806fc 222 buf[2] = wifiResultFormatBasic ? 4 : 1;
Wayne Roberts 1:416ed16806fc 223 stat.word = Radio::radio.xfer(OPCODE_WIFI_READ_RESULTS, 3, 0, buf);
Wayne Roberts 1:416ed16806fc 224 // basic = 9byte length
Wayne Roberts 1:416ed16806fc 225 // full = 22byte length
Wayne Roberts 1:416ed16806fc 226 stat.word = Radio::radio.xfer(0x0000, 0, wifiResultFormatBasic ? 9 : 22, resultBuf);
Wayne Roberts 1:416ed16806fc 227
Wayne Roberts 1:416ed16806fc 228 if (stat.bits.cmdStatus == CMD_DAT) {
Wayne Roberts 1:416ed16806fc 229 unsigned n, macStart;
Wayne Roberts 1:416ed16806fc 230 wifiChanInfo_t ci;
Wayne Roberts 1:416ed16806fc 231 ci.octet = resultBuf[1];
Wayne Roberts 1:416ed16806fc 232 if (ci.bits.macValidationID == 1) { // gateway (AP)
Wayne Roberts 1:416ed16806fc 233 macStart = wifiResultFormatBasic ? 3 : 4;
Wayne Roberts 1:416ed16806fc 234 for (n = 0; n < 6; n++) {
Wayne Roberts 1:416ed16806fc 235 Radio::radio.tx_buf[packet_len++] = resultBuf[n+macStart];
Wayne Roberts 1:416ed16806fc 236 printf("%02x", resultBuf[n+macStart]);
Wayne Roberts 1:416ed16806fc 237 if (n < 5)
Wayne Roberts 1:416ed16806fc 238 printf(":");
Wayne Roberts 1:416ed16806fc 239 }
Wayne Roberts 1:416ed16806fc 240 printf(" rssi:%d\r\n", (int8_t)resultBuf[2]);
Wayne Roberts 1:416ed16806fc 241 Radio::radio.tx_buf[packet_len++] = resultBuf[2];
Wayne Roberts 1:416ed16806fc 242 }
Wayne Roberts 1:416ed16806fc 243 } else
Wayne Roberts 1:416ed16806fc 244 printf("readResult:%s\r\n", Radio::radio.cmdStatus_toString(stat.bits.cmdStatus));
Wayne Roberts 1:416ed16806fc 245 }
Wayne Roberts 1:416ed16806fc 246
Wayne Roberts 1:416ed16806fc 247 if (!long_pressed) {
Wayne Roberts 1:416ed16806fc 248 unsigned n;
Wayne Roberts 1:416ed16806fc 249 cfg_lora();
Wayne Roberts 1:416ed16806fc 250 for (n = 0; n < 8; n++)
Wayne Roberts 1:416ed16806fc 251 Radio::radio.tx_buf[n] = chip_eui[n];
Wayne Roberts 1:416ed16806fc 252
Wayne Roberts 1:416ed16806fc 253 Radio::radio.tx_buf[n++] = 0; // rfu
Wayne Roberts 1:416ed16806fc 254 Radio::radio.tx_buf[n++] = 0; // rfu
Wayne Roberts 1:416ed16806fc 255 printf("pktLen:%u\r\n", packet_len);
Wayne Roberts 1:416ed16806fc 256 Radio::Send(packet_len, 0, 0, 0); /* begin transmission */
Wayne Roberts 1:416ed16806fc 257 }
Wayne Roberts 1:416ed16806fc 258 } // ..if (irq.bits.WifiDone)
Wayne Roberts 1:416ed16806fc 259
Wayne Roberts 1:416ed16806fc 260 if (irq.bits.TxDone) {
Wayne Roberts 1:416ed16806fc 261 printf("main-TxDone\r\n");
Wayne Roberts 1:416ed16806fc 262 }
Wayne Roberts 1:416ed16806fc 263 }
Wayne Roberts 1:416ed16806fc 264
Wayne Roberts 1:416ed16806fc 265 void radio_irq_callback()
Wayne Roberts 1:416ed16806fc 266 {
Wayne Roberts 1:416ed16806fc 267 wifi_scan_dur = Kernel::get_ms_count() - wifi_start_at;
Wayne Roberts 1:416ed16806fc 268 queue.call(service);
Wayne Roberts 1:416ed16806fc 269 }
Wayne Roberts 1:416ed16806fc 270
Wayne Roberts 1:416ed16806fc 271 const RadioEvents_t rev = {
Wayne Roberts 1:416ed16806fc 272 /* DioPin_top_half */ radio_irq_callback,
Wayne Roberts 1:416ed16806fc 273 /* TxDone_topHalf */ NULL,
Wayne Roberts 1:416ed16806fc 274 /* TxDone_botHalf */ txDoneCB,
Wayne Roberts 1:416ed16806fc 275 /* TxTimeout */ NULL,
Wayne Roberts 1:416ed16806fc 276 /* RxDone */ rxDoneCB,
Wayne Roberts 1:416ed16806fc 277 /* RxTimeout */ NULL,
Wayne Roberts 1:416ed16806fc 278 /* RxError */ NULL,
Wayne Roberts 1:416ed16806fc 279 /* FhssChangeChannel */NULL,
Wayne Roberts 1:416ed16806fc 280 /* CadDone */ NULL
Wayne Roberts 1:416ed16806fc 281 };
Wayne Roberts 1:416ed16806fc 282
Wayne Roberts 1:416ed16806fc 283 int main()
Wayne Roberts 1:416ed16806fc 284 {
Wayne Roberts 1:416ed16806fc 285 Radio::Init(&rev);
Wayne Roberts 1:416ed16806fc 286
Wayne Roberts 1:416ed16806fc 287 Radio::Standby();
Wayne Roberts 1:416ed16806fc 288 cfg_lora();
Wayne Roberts 1:416ed16806fc 289
Wayne Roberts 1:416ed16806fc 290 {
Wayne Roberts 1:416ed16806fc 291 uint8_t buf[9];
Wayne Roberts 1:416ed16806fc 292 stat_t stat;
Wayne Roberts 1:416ed16806fc 293 stat.word = Radio::radio.xfer(OPCODE_GET_VERSION, 0, 0, NULL);
Wayne Roberts 1:416ed16806fc 294 stat.word = Radio::radio.xfer(0x0000, 0, 4, buf);
Wayne Roberts 1:416ed16806fc 295 if (stat.bits.cmdStatus == CMD_DAT) {
Wayne Roberts 1:416ed16806fc 296 printf("LR1110 chip:%02x use:%02x fw-v%u.%u\r\n",
Wayne Roberts 1:416ed16806fc 297 buf[0], /* silicon rev */
Wayne Roberts 1:416ed16806fc 298 buf[1], /* use case */
Wayne Roberts 1:416ed16806fc 299 buf[2], /* firmware major */
Wayne Roberts 1:416ed16806fc 300 buf[3] /* firmware minor */
Wayne Roberts 1:416ed16806fc 301 );
Wayne Roberts 1:416ed16806fc 302 }
Wayne Roberts 1:416ed16806fc 303
Wayne Roberts 1:416ed16806fc 304 stat.word = Radio::radio.xfer(OPCODE_GET_DEVEUI, 0, 0, NULL);
Wayne Roberts 1:416ed16806fc 305 stat.word = Radio::radio.xfer(0x0000, 0, 9, buf);
Wayne Roberts 1:416ed16806fc 306 memcpy(chip_eui, buf+1, 8);
Wayne Roberts 1:416ed16806fc 307 for (unsigned i = 0; i < 9; i++)
Wayne Roberts 1:416ed16806fc 308 printf("%02x ", buf[i]);
Wayne Roberts 1:416ed16806fc 309 printf("\r\n");
Wayne Roberts 1:416ed16806fc 310 }
Wayne Roberts 1:416ed16806fc 311
Wayne Roberts 1:416ed16806fc 312 #ifdef AUTO_TX
Wayne Roberts 1:416ed16806fc 313 queue.call_in(500, tx_test);
Wayne Roberts 1:416ed16806fc 314 #endif /* AUTO_TX */
Wayne Roberts 1:416ed16806fc 315
Wayne Roberts 1:416ed16806fc 316 if (ub.read())
Wayne Roberts 1:416ed16806fc 317 ub.fall(button_pressed);
Wayne Roberts 1:416ed16806fc 318 else
Wayne Roberts 1:416ed16806fc 319 ub.rise(button_released);
Wayne Roberts 1:416ed16806fc 320
Wayne Roberts 1:416ed16806fc 321 queue.dispatch();
Wayne Roberts 1:416ed16806fc 322 }
Wayne Roberts 1:416ed16806fc 323