Text menu driven ANSI/VT100 console test utility for LoRa transceivers

radio chip selection

Radio chip driver is not included, allowing choice of radio device.
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 LR1110, then import LR1110 driver into your program.
If you're using NAmote72 or Murata discovery, then you must import only sx127x driver.
If you're using Type1SJ select target DISCO_L072CZ_LRWAN1 and import sx126x driver into your program.

This is VT100 text-based menu driven test program for SX12xx transceiver devices.
Serial console is divided into horizontally into top half and bottom half.
The bottom half serves as scrolling area to log activity.
The top half serves as menu, to configure the radio.
For all devices, the serial console operates at 115200 8N1, and requires terminal with ANSI-VT100 capability, such as putty/teraterm/minicom etc.
Use program only with keyboard up/down/left/right keys. Enter to change an item, or number for value item. Some items are single bit, requiring only enter key to toggle. Others with fixed choices give a drop-down menu.

Committer:
Wayne Roberts
Date:
Wed Aug 22 09:50:32 2018 -0700
Revision:
2:ea9245bb1c53
Parent:
1:0817a150122b
Child:
3:56fc764dee0a
add LoRa CAD function

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wayne Roberts 1:0817a150122b 1 #include "radio.h"
Wayne Roberts 1:0817a150122b 2 #ifdef SX128x_H
Wayne Roberts 1:0817a150122b 3
Wayne Roberts 1:0817a150122b 4 #include <float.h>
Wayne Roberts 1:0817a150122b 5
Wayne Roberts 1:0817a150122b 6 #ifdef TARGET_FF_ARDUINO /* pins of SX126xDVK1xAS board */
Wayne Roberts 1:0817a150122b 7 #define NRST_PIN A0
Wayne Roberts 1:0817a150122b 8 SPI spi(D11, D12, D13); // mosi, miso, sclk
Wayne Roberts 1:0817a150122b 9 // spi, nss, busy, dio1
Wayne Roberts 1:0817a150122b 10 SX128x Radio::radio(spi, D7, D3, D5, NRST_PIN);
Wayne Roberts 1:0817a150122b 11
Wayne Roberts 1:0817a150122b 12 #define LED_ON 1
Wayne Roberts 1:0817a150122b 13 #define LED_OFF 0
Wayne Roberts 1:0817a150122b 14 DigitalOut tx_led(A4);
Wayne Roberts 1:0817a150122b 15 DigitalOut rx_led(A5);
Wayne Roberts 1:0817a150122b 16
Wayne Roberts 1:0817a150122b 17
Wayne Roberts 1:0817a150122b 18 DigitalOut ant_sw(A3);
Wayne Roberts 1:0817a150122b 19 DigitalOut cps(D6); // SE2436L
Wayne Roberts 1:0817a150122b 20
Wayne Roberts 1:0817a150122b 21 bool fe_enable; // SE2436L
Wayne Roberts 1:0817a150122b 22
Wayne Roberts 1:0817a150122b 23 void Radio::chipModeChange()
Wayne Roberts 1:0817a150122b 24 {
Wayne Roberts 1:0817a150122b 25 if (radio.chipMode == CHIPMODE_NONE) {
Wayne Roberts 1:0817a150122b 26 cps = 0;
Wayne Roberts 1:0817a150122b 27 tx_led = LED_OFF;
Wayne Roberts 1:0817a150122b 28 rx_led = LED_OFF;
Wayne Roberts 1:0817a150122b 29 } else if (radio.chipMode == CHIPMODE_TX) {
Wayne Roberts 1:0817a150122b 30 cps = fe_enable;
Wayne Roberts 1:0817a150122b 31 tx_led = LED_ON;
Wayne Roberts 1:0817a150122b 32 rx_led = LED_OFF;
Wayne Roberts 1:0817a150122b 33 } else if (radio.chipMode == CHIPMODE_RX) {
Wayne Roberts 1:0817a150122b 34 cps = fe_enable;
Wayne Roberts 1:0817a150122b 35 tx_led = LED_OFF;
Wayne Roberts 1:0817a150122b 36 rx_led = LED_ON;
Wayne Roberts 1:0817a150122b 37 }
Wayne Roberts 1:0817a150122b 38 }
Wayne Roberts 1:0817a150122b 39 #endif /* TARGET_FF_ARDUINO */
Wayne Roberts 1:0817a150122b 40
Wayne Roberts 1:0817a150122b 41 const char* const Radio::chipNum_str = "SX1280";
Wayne Roberts 1:0817a150122b 42
Wayne Roberts 1:0817a150122b 43 uint8_t Radio::tx_param_buf[2];
Wayne Roberts 1:0817a150122b 44
Wayne Roberts 1:0817a150122b 45 ModulationParams_t Radio::Radio::mpFLRC, Radio::Radio::mpBLE_GFSK, Radio::mpLORA;
Wayne Roberts 1:0817a150122b 46 PacketParams_t Radio::ppGFSK, Radio::ppFLRC, Radio::ppLORA, Radio::ppBLE;
Wayne Roberts 1:0817a150122b 47
Wayne Roberts 1:0817a150122b 48 const RadioEvents_t* Radio::RadioEvents;
Wayne Roberts 1:0817a150122b 49 LowPowerTimer Radio::lpt;
Wayne Roberts 1:0817a150122b 50 uint8_t Radio::pktType;
Wayne Roberts 1:0817a150122b 51
Wayne Roberts 1:0817a150122b 52 const char* const Radio::pktType_strs[] = {
Wayne Roberts 1:0817a150122b 53 "GFSK ",
Wayne Roberts 1:0817a150122b 54 "LORA ",
Wayne Roberts 1:0817a150122b 55 "RANGING",
Wayne Roberts 1:0817a150122b 56 "FLRC ",
Wayne Roberts 1:0817a150122b 57 "BLE ",
Wayne Roberts 1:0817a150122b 58 NULL
Wayne Roberts 1:0817a150122b 59 };
Wayne Roberts 1:0817a150122b 60
Wayne Roberts 2:ea9245bb1c53 61 unsigned Radio::pktType_read(bool fw)
Wayne Roberts 1:0817a150122b 62 {
Wayne Roberts 1:0817a150122b 63 return radio.getPacketType();
Wayne Roberts 1:0817a150122b 64 }
Wayne Roberts 1:0817a150122b 65
Wayne Roberts 2:ea9245bb1c53 66 menuMode_e Radio::pktType_write(unsigned idx)
Wayne Roberts 1:0817a150122b 67 {
Wayne Roberts 1:0817a150122b 68 radio.setPacketType(idx);
Wayne Roberts 1:0817a150122b 69 return MENUMODE_REINIT_MENU;
Wayne Roberts 1:0817a150122b 70 }
Wayne Roberts 1:0817a150122b 71
Wayne Roberts 1:0817a150122b 72 const char* Radio::tx_ramp_strs[] = {
Wayne Roberts 1:0817a150122b 73 "2 ", // 0
Wayne Roberts 1:0817a150122b 74 "4 ", // 1
Wayne Roberts 1:0817a150122b 75 "6 ", // 2
Wayne Roberts 1:0817a150122b 76 "8 ", // 3
Wayne Roberts 1:0817a150122b 77 "10", // 4
Wayne Roberts 1:0817a150122b 78 "12", // 5
Wayne Roberts 1:0817a150122b 79 "16", // 6
Wayne Roberts 1:0817a150122b 80 "20", // 7
Wayne Roberts 1:0817a150122b 81 NULL
Wayne Roberts 1:0817a150122b 82 };
Wayne Roberts 1:0817a150122b 83
Wayne Roberts 2:ea9245bb1c53 84 unsigned Radio::tx_ramp_read(bool fw)
Wayne Roberts 1:0817a150122b 85 {
Wayne Roberts 1:0817a150122b 86 PaPwrCtrl_t PaPwrCtrl;
Wayne Roberts 1:0817a150122b 87 PaPwrCtrl.octet = radio.readReg(REG_ADDR_PA_PWR_CTRL, 1);
Wayne Roberts 1:0817a150122b 88
Wayne Roberts 1:0817a150122b 89 switch (PaPwrCtrl.bits.ramp_time) {
Wayne Roberts 1:0817a150122b 90 case 0: tx_param_buf[1] = RADIO_RAMP_02_US; break;
Wayne Roberts 1:0817a150122b 91 case 1: tx_param_buf[1] = RADIO_RAMP_04_US; break;
Wayne Roberts 1:0817a150122b 92 case 2: tx_param_buf[1] = RADIO_RAMP_06_US; break;
Wayne Roberts 1:0817a150122b 93 case 3: tx_param_buf[1] = RADIO_RAMP_08_US; break;
Wayne Roberts 1:0817a150122b 94 case 4: tx_param_buf[1] = RADIO_RAMP_10_US; break;
Wayne Roberts 1:0817a150122b 95 case 5: tx_param_buf[1] = RADIO_RAMP_12_US; break;
Wayne Roberts 1:0817a150122b 96 case 6: tx_param_buf[1] = RADIO_RAMP_16_US; break;
Wayne Roberts 1:0817a150122b 97 case 7: tx_param_buf[1] = RADIO_RAMP_20_US; break;
Wayne Roberts 1:0817a150122b 98 }
Wayne Roberts 1:0817a150122b 99
Wayne Roberts 1:0817a150122b 100 return PaPwrCtrl.bits.ramp_time;
Wayne Roberts 1:0817a150122b 101 }
Wayne Roberts 1:0817a150122b 102
Wayne Roberts 2:ea9245bb1c53 103 menuMode_e Radio::tx_ramp_write(unsigned val)
Wayne Roberts 1:0817a150122b 104 {
Wayne Roberts 1:0817a150122b 105 switch (val) {
Wayne Roberts 1:0817a150122b 106 case 0: tx_param_buf[1] = RADIO_RAMP_02_US; break;
Wayne Roberts 1:0817a150122b 107 case 1: tx_param_buf[1] = RADIO_RAMP_04_US; break;
Wayne Roberts 1:0817a150122b 108 case 2: tx_param_buf[1] = RADIO_RAMP_06_US; break;
Wayne Roberts 1:0817a150122b 109 case 3: tx_param_buf[1] = RADIO_RAMP_08_US; break;
Wayne Roberts 1:0817a150122b 110 case 4: tx_param_buf[1] = RADIO_RAMP_10_US; break;
Wayne Roberts 1:0817a150122b 111 case 5: tx_param_buf[1] = RADIO_RAMP_12_US; break;
Wayne Roberts 1:0817a150122b 112 case 6: tx_param_buf[1] = RADIO_RAMP_16_US; break;
Wayne Roberts 1:0817a150122b 113 case 7: tx_param_buf[1] = RADIO_RAMP_20_US; break;
Wayne Roberts 1:0817a150122b 114 }
Wayne Roberts 1:0817a150122b 115
Wayne Roberts 1:0817a150122b 116 radio.xfer(OPCODE_SET_TX_PARAMS, 2, 0, tx_param_buf);
Wayne Roberts 1:0817a150122b 117
Wayne Roberts 1:0817a150122b 118 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 119 }
Wayne Roberts 1:0817a150122b 120
Wayne Roberts 1:0817a150122b 121 #define TX_PWR_OFFSET 18
Wayne Roberts 1:0817a150122b 122
Wayne Roberts 1:0817a150122b 123 void Radio::tx_dbm_print()
Wayne Roberts 1:0817a150122b 124 {
Wayne Roberts 1:0817a150122b 125 PaPwrCtrl_t PaPwrCtrl;
Wayne Roberts 1:0817a150122b 126
Wayne Roberts 1:0817a150122b 127 PaPwrCtrl.octet = radio.readReg(REG_ADDR_PA_PWR_CTRL, 1);
Wayne Roberts 1:0817a150122b 128 pc.printf("%d", PaPwrCtrl.bits.tx_pwr - TX_PWR_OFFSET);
Wayne Roberts 1:0817a150122b 129
Wayne Roberts 1:0817a150122b 130 tx_param_buf[0] = PaPwrCtrl.bits.tx_pwr;
Wayne Roberts 1:0817a150122b 131 }
Wayne Roberts 1:0817a150122b 132
Wayne Roberts 1:0817a150122b 133 bool Radio::tx_dbm_write(const char* str)
Wayne Roberts 1:0817a150122b 134 {
Wayne Roberts 1:0817a150122b 135 int dbm;
Wayne Roberts 1:0817a150122b 136 sscanf(str, "%d", &dbm);
Wayne Roberts 1:0817a150122b 137
Wayne Roberts 1:0817a150122b 138 tx_param_buf[0] = dbm + TX_PWR_OFFSET;
Wayne Roberts 1:0817a150122b 139 radio.xfer(OPCODE_SET_TX_PARAMS, 2, 0, tx_param_buf);
Wayne Roberts 1:0817a150122b 140 return false;
Wayne Roberts 1:0817a150122b 141 }
Wayne Roberts 1:0817a150122b 142
Wayne Roberts 1:0817a150122b 143 const uint8_t ramp_us[] = {
Wayne Roberts 1:0817a150122b 144 2, // 0
Wayne Roberts 1:0817a150122b 145 4, // 1
Wayne Roberts 1:0817a150122b 146 6, // 2
Wayne Roberts 1:0817a150122b 147 8, // 3
Wayne Roberts 1:0817a150122b 148 10, // 4
Wayne Roberts 1:0817a150122b 149 12, // 5
Wayne Roberts 1:0817a150122b 150 16, // 6
Wayne Roberts 1:0817a150122b 151 20 // 7
Wayne Roberts 1:0817a150122b 152 };
Wayne Roberts 1:0817a150122b 153
Wayne Roberts 1:0817a150122b 154 const char* const Radio::opmode_status_strs[] = {
Wayne Roberts 1:0817a150122b 155 "<0> ", // 0
Wayne Roberts 1:0817a150122b 156 "<1> ", // 1
Wayne Roberts 1:0817a150122b 157 "STDBY_RC ", // 2
Wayne Roberts 1:0817a150122b 158 "STDBY_XOSC", // 3
Wayne Roberts 1:0817a150122b 159 "FS ", // 4
Wayne Roberts 1:0817a150122b 160 "RX ", // 5
Wayne Roberts 1:0817a150122b 161 "TX ", // 6
Wayne Roberts 1:0817a150122b 162 "<7> ", // 7
Wayne Roberts 1:0817a150122b 163 NULL
Wayne Roberts 1:0817a150122b 164 };
Wayne Roberts 1:0817a150122b 165
Wayne Roberts 1:0817a150122b 166 const char* const Radio::opmode_select_strs[] = {
Wayne Roberts 1:0817a150122b 167 "SLEEP ", // 0
Wayne Roberts 1:0817a150122b 168 "STDBY_RC ", // 1
Wayne Roberts 1:0817a150122b 169 "STDBY_XOSC", // 2
Wayne Roberts 1:0817a150122b 170 "FS ", // 3
Wayne Roberts 1:0817a150122b 171 "RX ", // 4
Wayne Roberts 1:0817a150122b 172 "TX ", // 5
Wayne Roberts 1:0817a150122b 173 NULL
Wayne Roberts 1:0817a150122b 174 };
Wayne Roberts 1:0817a150122b 175
Wayne Roberts 2:ea9245bb1c53 176 unsigned Radio::opmode_read(bool forWriting)
Wayne Roberts 1:0817a150122b 177 {
Wayne Roberts 1:0817a150122b 178 status_t status;
Wayne Roberts 1:0817a150122b 179 status.octet = radio.xfer(OPCODE_GET_STATUS, 0, 0, NULL);
Wayne Roberts 1:0817a150122b 180
Wayne Roberts 1:0817a150122b 181 if (forWriting) {
Wayne Roberts 1:0817a150122b 182 /* translate opmode_status_strs to opmode_select_strs */
Wayne Roberts 1:0817a150122b 183 switch (status.bits.chipMode) {
Wayne Roberts 1:0817a150122b 184 case 2: return 1; // STDBY_RC
Wayne Roberts 1:0817a150122b 185 case 3: return 2; //STDBY_XOSC
Wayne Roberts 1:0817a150122b 186 case 4: return 3; //FS
Wayne Roberts 1:0817a150122b 187 case 5: return 4; // RX
Wayne Roberts 1:0817a150122b 188 case 6: return 5; // TX
Wayne Roberts 1:0817a150122b 189 default: return 0;
Wayne Roberts 1:0817a150122b 190 }
Wayne Roberts 1:0817a150122b 191 } else
Wayne Roberts 1:0817a150122b 192 return status.bits.chipMode;
Wayne Roberts 1:0817a150122b 193 }
Wayne Roberts 1:0817a150122b 194
Wayne Roberts 2:ea9245bb1c53 195 menuMode_e Radio::opmode_write(unsigned sel)
Wayne Roberts 1:0817a150122b 196 {
Wayne Roberts 1:0817a150122b 197 switch (sel) {
Wayne Roberts 1:0817a150122b 198 case 0: // SLEEP
Wayne Roberts 1:0817a150122b 199 radio.setSleep(true);
Wayne Roberts 1:0817a150122b 200 break;
Wayne Roberts 1:0817a150122b 201 case 1: // STDBY_RC
Wayne Roberts 1:0817a150122b 202 radio.setStandby(STDBY_RC);
Wayne Roberts 1:0817a150122b 203 break;
Wayne Roberts 1:0817a150122b 204 case 2: // STDBY_XOSC
Wayne Roberts 1:0817a150122b 205 radio.setStandby(STDBY_XOSC);
Wayne Roberts 1:0817a150122b 206 break; case 3: // FS
Wayne Roberts 1:0817a150122b 207 radio.setFS();
Wayne Roberts 1:0817a150122b 208 break;
Wayne Roberts 1:0817a150122b 209 case 4: // RX
Wayne Roberts 1:0817a150122b 210 radio.start_rx(0);
Wayne Roberts 1:0817a150122b 211 break;
Wayne Roberts 1:0817a150122b 212 case 5: // TX
Wayne Roberts 1:0817a150122b 213 {
Wayne Roberts 1:0817a150122b 214 uint8_t buf[3];
Wayne Roberts 1:0817a150122b 215 buf[0] = radio.periodBase;
Wayne Roberts 1:0817a150122b 216 buf[0] = 0;
Wayne Roberts 1:0817a150122b 217 buf[1] = 0;
Wayne Roberts 1:0817a150122b 218 radio.xfer(OPCODE_SET_TX, 3, 0, buf);
Wayne Roberts 1:0817a150122b 219 }
Wayne Roberts 1:0817a150122b 220 break;
Wayne Roberts 1:0817a150122b 221 } // ..switch (menuState.sel_idx)
Wayne Roberts 1:0817a150122b 222
Wayne Roberts 1:0817a150122b 223 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 224 }
Wayne Roberts 1:0817a150122b 225
Wayne Roberts 1:0817a150122b 226 uint8_t Radio::get_payload_length()
Wayne Roberts 1:0817a150122b 227 {
Wayne Roberts 1:0817a150122b 228 uint8_t reg8;
Wayne Roberts 1:0817a150122b 229
Wayne Roberts 1:0817a150122b 230 pktType = radio.getPacketType();
Wayne Roberts 1:0817a150122b 231
Wayne Roberts 1:0817a150122b 232 switch (pktType) {
Wayne Roberts 1:0817a150122b 233 case PACKET_TYPE_FLRC:
Wayne Roberts 1:0817a150122b 234 case PACKET_TYPE_GFSK:
Wayne Roberts 1:0817a150122b 235 reg8 = radio.readReg(REG_ADDR_PAYLOAD_LEN, 1);
Wayne Roberts 1:0817a150122b 236 ppGFSK.gfskFLRC.PayloadLength = reg8;
Wayne Roberts 1:0817a150122b 237 ppFLRC.gfskFLRC.PayloadLength = reg8;
Wayne Roberts 1:0817a150122b 238 return ppFLRC.gfskFLRC.PayloadLength;
Wayne Roberts 1:0817a150122b 239 case PACKET_TYPE_RANGING:
Wayne Roberts 1:0817a150122b 240 case PACKET_TYPE_LORA:
Wayne Roberts 1:0817a150122b 241 ppLORA.lora.PayloadLength = radio.readReg(REG_ADDR_LORA_TX_PAYLOAD_LENGTH, 1);
Wayne Roberts 1:0817a150122b 242 return ppLORA.lora.PayloadLength;
Wayne Roberts 1:0817a150122b 243 case PACKET_TYPE_BLE:
Wayne Roberts 1:0817a150122b 244 return 0; // TODO BLE
Wayne Roberts 1:0817a150122b 245 }
Wayne Roberts 1:0817a150122b 246
Wayne Roberts 1:0817a150122b 247 return 0;
Wayne Roberts 1:0817a150122b 248 }
Wayne Roberts 1:0817a150122b 249
Wayne Roberts 1:0817a150122b 250 void Radio::set_payload_length(uint8_t len)
Wayne Roberts 1:0817a150122b 251 {
Wayne Roberts 1:0817a150122b 252 pktType = radio.getPacketType();
Wayne Roberts 1:0817a150122b 253
Wayne Roberts 1:0817a150122b 254 switch (pktType) {
Wayne Roberts 1:0817a150122b 255 case PACKET_TYPE_FLRC:
Wayne Roberts 1:0817a150122b 256 ppFLRC.gfskFLRC.PayloadLength = len;
Wayne Roberts 1:0817a150122b 257 ppGFSK.gfskFLRC.PayloadLength = len;
Wayne Roberts 1:0817a150122b 258 radio.xfer(OPCODE_SET_PACKET_PARAMS, 7, 0, ppFLRC.buf);
Wayne Roberts 1:0817a150122b 259 break;
Wayne Roberts 1:0817a150122b 260 case PACKET_TYPE_GFSK:
Wayne Roberts 1:0817a150122b 261 ppFLRC.gfskFLRC.PayloadLength = len;
Wayne Roberts 1:0817a150122b 262 ppGFSK.gfskFLRC.PayloadLength = len;
Wayne Roberts 1:0817a150122b 263 radio.xfer(OPCODE_SET_PACKET_PARAMS, 7, 0, ppGFSK.buf);
Wayne Roberts 1:0817a150122b 264 break;
Wayne Roberts 1:0817a150122b 265 case PACKET_TYPE_RANGING:
Wayne Roberts 1:0817a150122b 266 case PACKET_TYPE_LORA:
Wayne Roberts 1:0817a150122b 267 ppLORA.lora.PayloadLength = len;
Wayne Roberts 1:0817a150122b 268 radio.xfer(OPCODE_SET_PACKET_PARAMS, 5, 0, ppLORA.buf);
Wayne Roberts 1:0817a150122b 269 break;
Wayne Roberts 1:0817a150122b 270 case PACKET_TYPE_BLE:
Wayne Roberts 1:0817a150122b 271 // TODO BLE
Wayne Roberts 1:0817a150122b 272 break;
Wayne Roberts 1:0817a150122b 273 }
Wayne Roberts 1:0817a150122b 274 }
Wayne Roberts 1:0817a150122b 275
Wayne Roberts 1:0817a150122b 276 void Radio::tx_payload_length_print()
Wayne Roberts 1:0817a150122b 277 {
Wayne Roberts 1:0817a150122b 278 pc.printf("%u", get_payload_length());
Wayne Roberts 1:0817a150122b 279 }
Wayne Roberts 1:0817a150122b 280
Wayne Roberts 1:0817a150122b 281 bool Radio::tx_payload_length_write(const char* txt)
Wayne Roberts 1:0817a150122b 282 {
Wayne Roberts 1:0817a150122b 283 unsigned len;
Wayne Roberts 1:0817a150122b 284
Wayne Roberts 1:0817a150122b 285 sscanf(txt, "%u", &len);
Wayne Roberts 1:0817a150122b 286
Wayne Roberts 1:0817a150122b 287 set_payload_length(len);
Wayne Roberts 1:0817a150122b 288
Wayne Roberts 1:0817a150122b 289 return false;
Wayne Roberts 1:0817a150122b 290 }
Wayne Roberts 1:0817a150122b 291
Wayne Roberts 1:0817a150122b 292 void Radio::hw_reset()
Wayne Roberts 1:0817a150122b 293 {
Wayne Roberts 1:0817a150122b 294 radio.hw_reset();
Wayne Roberts 1:0817a150122b 295 }
Wayne Roberts 1:0817a150122b 296
Wayne Roberts 1:0817a150122b 297 void Radio::clearIrqFlags()
Wayne Roberts 1:0817a150122b 298 {
Wayne Roberts 1:0817a150122b 299 uint8_t buf[2];
Wayne Roberts 1:0817a150122b 300 buf[0] = 0xff;
Wayne Roberts 1:0817a150122b 301 buf[1] = 0xff;
Wayne Roberts 1:0817a150122b 302 radio.xfer(OPCODE_CLEAR_IRQ_STATUS, 2, 0, buf);
Wayne Roberts 1:0817a150122b 303 }
Wayne Roberts 1:0817a150122b 304
Wayne Roberts 1:0817a150122b 305 void Radio::readChip()
Wayne Roberts 1:0817a150122b 306 {
Wayne Roberts 1:0817a150122b 307 uint8_t reg8;
Wayne Roberts 1:0817a150122b 308
Wayne Roberts 1:0817a150122b 309 reg8 = radio.readReg(REG_ADDR_PKTCTRL0, 1);
Wayne Roberts 1:0817a150122b 310 ppGFSK.gfskFLRC.HeaderType = reg8 & 0x20;
Wayne Roberts 1:0817a150122b 311 ppFLRC.gfskFLRC.HeaderType = reg8 & 0x20;
Wayne Roberts 1:0817a150122b 312
Wayne Roberts 1:0817a150122b 313 reg8 = radio.readReg(REG_ADDR_PKTCTRL1, 1);
Wayne Roberts 1:0817a150122b 314 ppGFSK.gfskFLRC.PreambleLength = reg8 & 0x70;
Wayne Roberts 1:0817a150122b 315 ppFLRC.gfskFLRC.PreambleLength = reg8 & 0x70;
Wayne Roberts 1:0817a150122b 316 ppGFSK.gfskFLRC.SyncWordLength = reg8 & 0x0e;
Wayne Roberts 1:0817a150122b 317 ppFLRC.gfskFLRC.SyncWordLength = reg8 & 0x06;
Wayne Roberts 1:0817a150122b 318 if (ppFLRC.gfskFLRC.SyncWordLength == 0x06)
Wayne Roberts 1:0817a150122b 319 ppFLRC.gfskFLRC.SyncWordLength = FLRC_SYNC_WORD_LEN_P32S;
Wayne Roberts 1:0817a150122b 320
Wayne Roberts 1:0817a150122b 321 reg8 = radio.readReg(REG_ADDR_PKT_SYNC_ADRS_CTRL, 1);
Wayne Roberts 1:0817a150122b 322 ppGFSK.gfskFLRC.SyncWordMatch = reg8 & 0x70;
Wayne Roberts 1:0817a150122b 323 ppFLRC.gfskFLRC.SyncWordMatch = reg8 & 0x70;
Wayne Roberts 1:0817a150122b 324
Wayne Roberts 1:0817a150122b 325 reg8 = radio.readReg(REG_ADDR_PAYLOAD_LEN, 1);
Wayne Roberts 1:0817a150122b 326 ppGFSK.gfskFLRC.PayloadLength = reg8;
Wayne Roberts 1:0817a150122b 327 ppFLRC.gfskFLRC.PayloadLength = reg8;
Wayne Roberts 1:0817a150122b 328
Wayne Roberts 1:0817a150122b 329 reg8 = radio.readReg(REG_ADDR_PKT_TX_HEADER, 1); // TODO hi bit of payload length
Wayne Roberts 1:0817a150122b 330 ppBLE.ble.ConnectionState = reg8 & 0xe0;
Wayne Roberts 1:0817a150122b 331 ppBLE.ble.BleTestPayload = reg8 & 0x1c;
Wayne Roberts 1:0817a150122b 332
Wayne Roberts 1:0817a150122b 333 reg8 = radio.readReg(REG_ADDR_PKT_BITSTREAM_CTRL, 1);
Wayne Roberts 1:0817a150122b 334 ppBLE.ble.CrcLength = reg8 & 0x30;
Wayne Roberts 1:0817a150122b 335 ppBLE.ble.Whitening = reg8 & 0x08;
Wayne Roberts 1:0817a150122b 336 ppGFSK.gfskFLRC.CRCLength = reg8 & 0x30;
Wayne Roberts 1:0817a150122b 337 ppFLRC.gfskFLRC.CRCLength = reg8 & 0x30;
Wayne Roberts 1:0817a150122b 338 ppGFSK.gfskFLRC.Whitening = reg8 & 0x08;
Wayne Roberts 1:0817a150122b 339 ppFLRC.gfskFLRC.Whitening = reg8 & 0x08;
Wayne Roberts 1:0817a150122b 340
Wayne Roberts 1:0817a150122b 341 {
Wayne Roberts 1:0817a150122b 342 LoRaPktPar0_t LoRaPktPar0;
Wayne Roberts 1:0817a150122b 343 LoRaPktPar0.octet = radio.readReg(REG_ADDR_LORA_PKTPAR0, 1);
Wayne Roberts 1:0817a150122b 344 switch (LoRaPktPar0.bits.modem_bw) {
Wayne Roberts 1:0817a150122b 345 case 2: mpLORA.lora.bandwidth = LORA_BW_200; break;
Wayne Roberts 1:0817a150122b 346 case 3: mpLORA.lora.bandwidth = LORA_BW_400; break;
Wayne Roberts 1:0817a150122b 347 case 4: mpLORA.lora.bandwidth = LORA_BW_800; break;
Wayne Roberts 1:0817a150122b 348 case 5: mpLORA.lora.bandwidth = LORA_BW_1600; break;
Wayne Roberts 1:0817a150122b 349 }
Wayne Roberts 1:0817a150122b 350 mpLORA.lora.spreadingFactor = LoRaPktPar0.bits.modem_sf << 4;
Wayne Roberts 1:0817a150122b 351 }
Wayne Roberts 1:0817a150122b 352
Wayne Roberts 1:0817a150122b 353 {
Wayne Roberts 1:0817a150122b 354 LoRaPktPar1_t LoRaPktPar1;
Wayne Roberts 1:0817a150122b 355 LoRaPktPar1.octet = radio.readReg(REG_ADDR_LORA_PKTPAR1, 1);
Wayne Roberts 1:0817a150122b 356 mpLORA.lora.codingRate = LoRaPktPar1.bits.coding_rate;
Wayne Roberts 1:0817a150122b 357 ppLORA.lora.InvertIQ = LoRaPktPar1.bits.rxinvert_iq ? LORA_IQ_INVERTED : LORA_IQ_STD;
Wayne Roberts 1:0817a150122b 358 ppLORA.lora.HeaderType = LoRaPktPar1.bits.implicit_header ? IMPLICIT_HEADER : EXPLICIT_HEADER;
Wayne Roberts 1:0817a150122b 359 // LoRaPktPar1.bits.ppm_offset
Wayne Roberts 1:0817a150122b 360 }
Wayne Roberts 1:0817a150122b 361
Wayne Roberts 1:0817a150122b 362 {
Wayne Roberts 1:0817a150122b 363 LoRaPreambleReg_t LoRaPreambleReg;
Wayne Roberts 1:0817a150122b 364 LoRaPreambleReg.octet = radio.readReg(REG_ADDR_LORA_PREAMBLE, 1);
Wayne Roberts 1:0817a150122b 365 ppLORA.lora.PreambleLength = LoRaPreambleReg.bits.preamble_symb1_nb * (1 << LoRaPreambleReg.bits.preamble_symb_nb_exp);
Wayne Roberts 1:0817a150122b 366 }
Wayne Roberts 1:0817a150122b 367 ppLORA.lora.PayloadLength = radio.readReg(REG_ADDR_LORA_TX_PAYLOAD_LENGTH, 1);
Wayne Roberts 1:0817a150122b 368
Wayne Roberts 1:0817a150122b 369 {
Wayne Roberts 1:0817a150122b 370 LoRaLrCtl_t LoRaLrCtl;
Wayne Roberts 1:0817a150122b 371 LoRaLrCtl.octet = radio.readReg(REG_ADDR_LORA_LRCTL, 1);
Wayne Roberts 1:0817a150122b 372 ppLORA.lora.crc = LoRaLrCtl.octet & 0x20; // LoRaLrCtl.bits.crc_en
Wayne Roberts 1:0817a150122b 373 }
Wayne Roberts 1:0817a150122b 374
Wayne Roberts 1:0817a150122b 375 {
Wayne Roberts 1:0817a150122b 376 RegRxBw_t RegRxBw;
Wayne Roberts 1:0817a150122b 377 unsigned bps;
Wayne Roberts 1:0817a150122b 378 FloraPreambleHi_t FloraPreambleHi;
Wayne Roberts 1:0817a150122b 379 float mi, fdev_hz;
Wayne Roberts 1:0817a150122b 380 unsigned freqDev;
Wayne Roberts 1:0817a150122b 381 FskModDfH_t FskModDfH;
Wayne Roberts 1:0817a150122b 382 FskModDfH.octet = radio.readReg(REG_ADDR_FSK_MODDFH, 1);
Wayne Roberts 1:0817a150122b 383 freqDev = FskModDfH.bits.freqDev;
Wayne Roberts 1:0817a150122b 384 freqDev <<= 8;
Wayne Roberts 1:0817a150122b 385 freqDev |= radio.readReg(REG_ADDR_FSK_MODDFL, 1);
Wayne Roberts 1:0817a150122b 386 //printf("freqDev %x, %x\r\n", freqDev, freqDev);
Wayne Roberts 1:0817a150122b 387 fdev_hz = freqDev * PLL_STEP_HZ;
Wayne Roberts 1:0817a150122b 388 //printf("fdev hz:%f\r\n", fdev_hz);
Wayne Roberts 1:0817a150122b 389
Wayne Roberts 1:0817a150122b 390 FloraPreambleHi.octet = radio.readReg(REG_ADDR_FLORA_PREAMBLE_HI, 1);
Wayne Roberts 1:0817a150122b 391 switch (FloraPreambleHi.bits.data_rate) {
Wayne Roberts 1:0817a150122b 392 case 0:
Wayne Roberts 1:0817a150122b 393 bps = 2.0e6;
Wayne Roberts 1:0817a150122b 394 //mpFLRC.flrc.bitrateBandwidth = ??; // 2.6
Wayne Roberts 1:0817a150122b 395 break;
Wayne Roberts 1:0817a150122b 396 case 1:
Wayne Roberts 1:0817a150122b 397 bps = 1.6e6;
Wayne Roberts 1:0817a150122b 398 //mpFLRC.flrc.bitrateBandwidth = ??; // 2.08
Wayne Roberts 1:0817a150122b 399 break;
Wayne Roberts 1:0817a150122b 400 case 2:
Wayne Roberts 1:0817a150122b 401 bps = 1.0e6;
Wayne Roberts 1:0817a150122b 402 mpFLRC.flrc.bitrateBandwidth = FLRC_BR_1_300_BW_1_2; // 1.3
Wayne Roberts 1:0817a150122b 403 break;
Wayne Roberts 1:0817a150122b 404 case 3:
Wayne Roberts 1:0817a150122b 405 bps = 0.8e6;
Wayne Roberts 1:0817a150122b 406 mpFLRC.flrc.bitrateBandwidth = FLRC_BR_1_000_BW_1_2; // 1.04
Wayne Roberts 1:0817a150122b 407 break;
Wayne Roberts 1:0817a150122b 408 case 4:
Wayne Roberts 1:0817a150122b 409 bps = 0.5e6;
Wayne Roberts 1:0817a150122b 410 mpFLRC.flrc.bitrateBandwidth = FLRC_BR_0_650_BW_0_6; // 0.65
Wayne Roberts 1:0817a150122b 411 break;
Wayne Roberts 1:0817a150122b 412 case 5:
Wayne Roberts 1:0817a150122b 413 bps = 0.4e6;
Wayne Roberts 1:0817a150122b 414 mpFLRC.flrc.bitrateBandwidth = FLRC_BR_0_520_BW_0_6; // 0.52
Wayne Roberts 1:0817a150122b 415 break;
Wayne Roberts 1:0817a150122b 416 case 6:
Wayne Roberts 1:0817a150122b 417 bps = 0.25e6;
Wayne Roberts 1:0817a150122b 418 mpFLRC.flrc.bitrateBandwidth = FLRC_BR_0_325_BW_0_3; // 0.325
Wayne Roberts 1:0817a150122b 419 break;
Wayne Roberts 1:0817a150122b 420 case 7:
Wayne Roberts 1:0817a150122b 421 bps = 0.125e6;
Wayne Roberts 1:0817a150122b 422 mpFLRC.flrc.bitrateBandwidth = FLRC_BR_0_260_BW_0_3; // 0.26
Wayne Roberts 1:0817a150122b 423 break;
Wayne Roberts 1:0817a150122b 424 }
Wayne Roberts 1:0817a150122b 425
Wayne Roberts 1:0817a150122b 426 mi = (fdev_hz * 2.0) / bps;
Wayne Roberts 1:0817a150122b 427 if (mi > 0.35) {
Wayne Roberts 1:0817a150122b 428 mi -= 0.5;
Wayne Roberts 1:0817a150122b 429 mi /= 0.25;
Wayne Roberts 1:0817a150122b 430 mpBLE_GFSK.gfskBle.ModulationIndex = ((uint8_t)mi) + 1;
Wayne Roberts 1:0817a150122b 431 } else
Wayne Roberts 1:0817a150122b 432 mpBLE_GFSK.gfskBle.ModulationIndex = 0;
Wayne Roberts 1:0817a150122b 433
Wayne Roberts 1:0817a150122b 434 RegRxBw.octet = radio.readReg(REG_ADDR_RXBW, 1);
Wayne Roberts 1:0817a150122b 435
Wayne Roberts 1:0817a150122b 436 //printf("rx ");
Wayne Roberts 1:0817a150122b 437 switch (RegRxBw.bits.bw) {
Wayne Roberts 1:0817a150122b 438 case 0:
Wayne Roberts 1:0817a150122b 439 //printf("2.4");
Wayne Roberts 1:0817a150122b 440 if (FloraPreambleHi.bits.data_rate == 0)
Wayne Roberts 1:0817a150122b 441 mpBLE_GFSK.gfskBle.bitrateBandwidth = GFSK_BLE_BR_2_000_BW_2_4;
Wayne Roberts 1:0817a150122b 442 if (FloraPreambleHi.bits.data_rate == 1)
Wayne Roberts 1:0817a150122b 443 mpBLE_GFSK.gfskBle.bitrateBandwidth = GFSK_BLE_BR_1_600_BW_2_4;
Wayne Roberts 1:0817a150122b 444 if (FloraPreambleHi.bits.data_rate == 2)
Wayne Roberts 1:0817a150122b 445 mpBLE_GFSK.gfskBle.bitrateBandwidth = GFSK_BLE_BR_1_000_BW_2_4;
Wayne Roberts 1:0817a150122b 446 if (FloraPreambleHi.bits.data_rate == 3)
Wayne Roberts 1:0817a150122b 447 mpBLE_GFSK.gfskBle.bitrateBandwidth = GFSK_BLE_BR_0_800_BW_2_4;
Wayne Roberts 1:0817a150122b 448 break;
Wayne Roberts 1:0817a150122b 449 case 1:
Wayne Roberts 1:0817a150122b 450 //printf("1.2");
Wayne Roberts 1:0817a150122b 451 if (FloraPreambleHi.bits.data_rate == 2)
Wayne Roberts 1:0817a150122b 452 mpBLE_GFSK.gfskBle.bitrateBandwidth = GFSK_BLE_BR_1_000_BW_1_2;
Wayne Roberts 1:0817a150122b 453 if (FloraPreambleHi.bits.data_rate == 3)
Wayne Roberts 1:0817a150122b 454 mpBLE_GFSK.gfskBle.bitrateBandwidth = GFSK_BLE_BR_0_800_BW_1_2;
Wayne Roberts 1:0817a150122b 455 if (FloraPreambleHi.bits.data_rate == 4)
Wayne Roberts 1:0817a150122b 456 mpBLE_GFSK.gfskBle.bitrateBandwidth = GFSK_BLE_BR_0_500_BW_1_2;
Wayne Roberts 1:0817a150122b 457 if (FloraPreambleHi.bits.data_rate == 5)
Wayne Roberts 1:0817a150122b 458 mpBLE_GFSK.gfskBle.bitrateBandwidth = GFSK_BLE_BR_0_400_BW_1_2;
Wayne Roberts 1:0817a150122b 459 break;
Wayne Roberts 1:0817a150122b 460 case 2:
Wayne Roberts 1:0817a150122b 461 //printf("0.6");
Wayne Roberts 1:0817a150122b 462 if (FloraPreambleHi.bits.data_rate == 4)
Wayne Roberts 1:0817a150122b 463 mpBLE_GFSK.gfskBle.bitrateBandwidth = GFSK_BLE_BR_0_500_BW_0_6;
Wayne Roberts 1:0817a150122b 464 if (FloraPreambleHi.bits.data_rate == 5)
Wayne Roberts 1:0817a150122b 465 mpBLE_GFSK.gfskBle.bitrateBandwidth = GFSK_BLE_BR_0_400_BW_0_6;
Wayne Roberts 1:0817a150122b 466 if (FloraPreambleHi.bits.data_rate == 6)
Wayne Roberts 1:0817a150122b 467 mpBLE_GFSK.gfskBle.bitrateBandwidth = GFSK_BLE_BR_0_250_BW_0_6;
Wayne Roberts 1:0817a150122b 468 break;
Wayne Roberts 1:0817a150122b 469 case 3:
Wayne Roberts 1:0817a150122b 470 //printf("0.3");
Wayne Roberts 1:0817a150122b 471 if (FloraPreambleHi.bits.data_rate == 6)
Wayne Roberts 1:0817a150122b 472 mpBLE_GFSK.gfskBle.bitrateBandwidth = GFSK_BLE_BR_0_250_BW_0_3;
Wayne Roberts 1:0817a150122b 473 if (FloraPreambleHi.bits.data_rate == 7)
Wayne Roberts 1:0817a150122b 474 mpBLE_GFSK.gfskBle.bitrateBandwidth = GFSK_BLE_BR_0_125_BW_0_3;
Wayne Roberts 1:0817a150122b 475 break;
Wayne Roberts 1:0817a150122b 476 }
Wayne Roberts 1:0817a150122b 477 //printf("MHz bw:%u\r\n", RegRxBw.bits.bw);
Wayne Roberts 1:0817a150122b 478 mpBLE_GFSK.gfskBle.bitrateBandwidth = reg8;
Wayne Roberts 1:0817a150122b 479 }
Wayne Roberts 1:0817a150122b 480
Wayne Roberts 1:0817a150122b 481 {
Wayne Roberts 1:0817a150122b 482 FskCfg_t FskCfg;
Wayne Roberts 1:0817a150122b 483 FskCfg.octet = radio.readReg(REG_ADDR_FSK_CFG, 1);
Wayne Roberts 1:0817a150122b 484 //printf("gf_bt:%u\r\n", FskCfg.bits.gf_bt);
Wayne Roberts 1:0817a150122b 485 mpBLE_GFSK.gfskBle.ModulationShaping = FskCfg.bits.gf_bt << 4;
Wayne Roberts 1:0817a150122b 486 mpFLRC.flrc.ModulationShaping = mpBLE_GFSK.gfskBle.ModulationShaping;
Wayne Roberts 1:0817a150122b 487 }
Wayne Roberts 1:0817a150122b 488
Wayne Roberts 1:0817a150122b 489 {
Wayne Roberts 1:0817a150122b 490 PktBitStreamCtrl_t PktBitStreamCtrl;
Wayne Roberts 1:0817a150122b 491 PktBitStreamCtrl.octet = radio.readReg(REG_ADDR_PKT_BITSTREAM_CTRL, 1);
Wayne Roberts 1:0817a150122b 492 mpFLRC.flrc.CodingRate = PktBitStreamCtrl.octet & 0x06; // PktBitStreamCtrl.bits.flora_coding_rate
Wayne Roberts 1:0817a150122b 493 }
Wayne Roberts 1:0817a150122b 494
Wayne Roberts 1:0817a150122b 495 }
Wayne Roberts 1:0817a150122b 496
Wayne Roberts 1:0817a150122b 497 void Radio::rxDone(uint8_t size, const pktStatus_t* pktStatus)
Wayne Roberts 1:0817a150122b 498 {
Wayne Roberts 1:0817a150122b 499 float rssi, snr;
Wayne Roberts 1:0817a150122b 500
Wayne Roberts 1:0817a150122b 501 if (pktStatus->ble_gfsk_flrc.sync.syncAddrsCode == 0) {
Wayne Roberts 1:0817a150122b 502 int8_t s = pktStatus->lora.snr;
Wayne Roberts 1:0817a150122b 503 rssi = -pktStatus->lora.rssiSync / 2.0;
Wayne Roberts 1:0817a150122b 504 snr = s / 4.0;
Wayne Roberts 1:0817a150122b 505 } else {
Wayne Roberts 1:0817a150122b 506 rssi = -pktStatus->ble_gfsk_flrc.rssiSync / 2.0;
Wayne Roberts 1:0817a150122b 507 snr = FLT_MIN;
Wayne Roberts 1:0817a150122b 508 }
Wayne Roberts 1:0817a150122b 509
Wayne Roberts 1:0817a150122b 510 RadioEvents->RxDone(size, rssi, snr);
Wayne Roberts 1:0817a150122b 511 }
Wayne Roberts 1:0817a150122b 512
Wayne Roberts 1:0817a150122b 513 void Radio::txDoneBottom()
Wayne Roberts 1:0817a150122b 514 {
Wayne Roberts 1:0817a150122b 515 if (RadioEvents->TxDone_botHalf)
Wayne Roberts 1:0817a150122b 516 RadioEvents->TxDone_botHalf();
Wayne Roberts 1:0817a150122b 517 }
Wayne Roberts 1:0817a150122b 518
Wayne Roberts 2:ea9245bb1c53 519 void Radio::cadDone(bool det)
Wayne Roberts 2:ea9245bb1c53 520 {
Wayne Roberts 2:ea9245bb1c53 521 log_printf("cadDone ");
Wayne Roberts 2:ea9245bb1c53 522 if (det)
Wayne Roberts 2:ea9245bb1c53 523 pc.printf("CadDetected");
Wayne Roberts 2:ea9245bb1c53 524
Wayne Roberts 2:ea9245bb1c53 525 pc.printf("\r\n");
Wayne Roberts 2:ea9245bb1c53 526 }
Wayne Roberts 2:ea9245bb1c53 527
Wayne Roberts 1:0817a150122b 528 void Radio::boardInit(const RadioEvents_t* e)
Wayne Roberts 1:0817a150122b 529 {
Wayne Roberts 1:0817a150122b 530 hw_reset();
Wayne Roberts 1:0817a150122b 531
Wayne Roberts 1:0817a150122b 532 radio.txDone = txDoneBottom;
Wayne Roberts 1:0817a150122b 533 radio.rxDone = rxDone;
Wayne Roberts 2:ea9245bb1c53 534 radio.cadDone = cadDone;
Wayne Roberts 1:0817a150122b 535
Wayne Roberts 1:0817a150122b 536 radio.chipModeChange = chipModeChange;
Wayne Roberts 1:0817a150122b 537
Wayne Roberts 1:0817a150122b 538 readChip();
Wayne Roberts 1:0817a150122b 539
Wayne Roberts 1:0817a150122b 540 RadioEvents = e;
Wayne Roberts 1:0817a150122b 541
Wayne Roberts 1:0817a150122b 542 fe_enable = true;
Wayne Roberts 1:0817a150122b 543
Wayne Roberts 1:0817a150122b 544 lpt.start();
Wayne Roberts 1:0817a150122b 545 }
Wayne Roberts 1:0817a150122b 546
Wayne Roberts 1:0817a150122b 547 void Radio::tx_carrier()
Wayne Roberts 1:0817a150122b 548 {
Wayne Roberts 1:0817a150122b 549 radio.xfer(OPCODE_SET_TX_CARRIER, 0, 0, NULL);
Wayne Roberts 2:ea9245bb1c53 550
Wayne Roberts 2:ea9245bb1c53 551 radio.chipMode = CHIPMODE_TX;
Wayne Roberts 2:ea9245bb1c53 552 chipModeChange();
Wayne Roberts 1:0817a150122b 553 }
Wayne Roberts 1:0817a150122b 554
Wayne Roberts 1:0817a150122b 555 void Radio::tx_preamble()
Wayne Roberts 1:0817a150122b 556 {
Wayne Roberts 1:0817a150122b 557 radio.xfer(OPCODE_SET_TX_PREAMBLE, 0, 0, NULL);
Wayne Roberts 2:ea9245bb1c53 558
Wayne Roberts 2:ea9245bb1c53 559 radio.chipMode = CHIPMODE_TX;
Wayne Roberts 2:ea9245bb1c53 560 chipModeChange();
Wayne Roberts 1:0817a150122b 561 }
Wayne Roberts 1:0817a150122b 562
Wayne Roberts 1:0817a150122b 563 void Radio::txPkt()
Wayne Roberts 1:0817a150122b 564 {
Wayne Roberts 1:0817a150122b 565 uint8_t txlen = 0;
Wayne Roberts 1:0817a150122b 566
Wayne Roberts 1:0817a150122b 567 radio.setBufferBase(0, 0);
Wayne Roberts 1:0817a150122b 568
Wayne Roberts 1:0817a150122b 569 pktType = radio.getPacketType();
Wayne Roberts 1:0817a150122b 570
Wayne Roberts 1:0817a150122b 571 switch (pktType) {
Wayne Roberts 1:0817a150122b 572 case PACKET_TYPE_FLRC:
Wayne Roberts 1:0817a150122b 573 case PACKET_TYPE_GFSK:
Wayne Roberts 1:0817a150122b 574 txlen = radio.readReg(REG_ADDR_PAYLOAD_LEN, 1);
Wayne Roberts 1:0817a150122b 575 break;
Wayne Roberts 1:0817a150122b 576 case PACKET_TYPE_BLE:
Wayne Roberts 1:0817a150122b 577 return; // TODO BLE
Wayne Roberts 1:0817a150122b 578 case PACKET_TYPE_RANGING:
Wayne Roberts 1:0817a150122b 579 case PACKET_TYPE_LORA:
Wayne Roberts 1:0817a150122b 580 txlen = radio.readReg(REG_ADDR_LORA_TX_PAYLOAD_LENGTH, 1);
Wayne Roberts 1:0817a150122b 581 break;
Wayne Roberts 1:0817a150122b 582 }
Wayne Roberts 1:0817a150122b 583 log_printf("txPkt%u\r\n", txlen);
Wayne Roberts 1:0817a150122b 584
Wayne Roberts 1:0817a150122b 585 radio.start_tx(txlen, 0);
Wayne Roberts 1:0817a150122b 586
Wayne Roberts 1:0817a150122b 587 }
Wayne Roberts 1:0817a150122b 588
Wayne Roberts 1:0817a150122b 589 #define REGBW_2_4MHZ 0
Wayne Roberts 1:0817a150122b 590 #define REGBW_1_2MHZ 1
Wayne Roberts 1:0817a150122b 591 #define REGBW_0_6MHZ 2
Wayne Roberts 1:0817a150122b 592 #define REGBW_0_3MHZ 3
Wayne Roberts 1:0817a150122b 593
Wayne Roberts 2:ea9245bb1c53 594 unsigned Radio::gfsk_flrc_bpsbw_read(bool fw)
Wayne Roberts 1:0817a150122b 595 {
Wayne Roberts 1:0817a150122b 596 unsigned n = UINT_MAX;
Wayne Roberts 1:0817a150122b 597 RegRxBw_t RegRxBw;
Wayne Roberts 1:0817a150122b 598 FloraPreambleHi_t FloraPreambleHi;
Wayne Roberts 1:0817a150122b 599 pktType = radio.getPacketType();
Wayne Roberts 1:0817a150122b 600
Wayne Roberts 1:0817a150122b 601 FloraPreambleHi.octet = radio.readReg(REG_ADDR_FLORA_PREAMBLE_HI, 1);
Wayne Roberts 1:0817a150122b 602
Wayne Roberts 1:0817a150122b 603 RegRxBw.octet = radio.readReg(REG_ADDR_RXBW, 1);
Wayne Roberts 1:0817a150122b 604
Wayne Roberts 1:0817a150122b 605 if (pktType == PACKET_TYPE_GFSK) {
Wayne Roberts 1:0817a150122b 606 switch (FloraPreambleHi.bits.data_rate) {
Wayne Roberts 1:0817a150122b 607 case 0:
Wayne Roberts 1:0817a150122b 608 n = 0; // 2Mbps, 2.4MHz
Wayne Roberts 1:0817a150122b 609 break;
Wayne Roberts 1:0817a150122b 610 case 1:
Wayne Roberts 1:0817a150122b 611 n = 1; // 1.6Mbps, 2.4MHz
Wayne Roberts 1:0817a150122b 612 break;
Wayne Roberts 1:0817a150122b 613 case 2:
Wayne Roberts 1:0817a150122b 614 if (RegRxBw.bits.bw == REGBW_2_4MHZ)
Wayne Roberts 1:0817a150122b 615 n = 2;
Wayne Roberts 1:0817a150122b 616 else if (RegRxBw.bits.bw == REGBW_1_2MHZ)
Wayne Roberts 1:0817a150122b 617 n = 3;
Wayne Roberts 1:0817a150122b 618 break;
Wayne Roberts 1:0817a150122b 619 case 3:
Wayne Roberts 1:0817a150122b 620 if (RegRxBw.bits.bw == REGBW_2_4MHZ) // 0.8Mbps 2.4 2.4MHz
Wayne Roberts 1:0817a150122b 621 n = 4;
Wayne Roberts 1:0817a150122b 622 else if (RegRxBw.bits.bw == REGBW_1_2MHZ) // 0.8Mbps 1.2MHz
Wayne Roberts 1:0817a150122b 623 n = 5;
Wayne Roberts 1:0817a150122b 624 break;
Wayne Roberts 1:0817a150122b 625 case 4:
Wayne Roberts 1:0817a150122b 626 if (RegRxBw.bits.bw == REGBW_1_2MHZ) // 0.5Mbps 1.2MHz
Wayne Roberts 1:0817a150122b 627 n = 6;
Wayne Roberts 1:0817a150122b 628 else if (RegRxBw.bits.bw == REGBW_0_6MHZ) // 0.5Mbps 0.6MHz
Wayne Roberts 1:0817a150122b 629 n = 7;
Wayne Roberts 1:0817a150122b 630 break;
Wayne Roberts 1:0817a150122b 631 case 5:
Wayne Roberts 1:0817a150122b 632 if (RegRxBw.bits.bw == REGBW_1_2MHZ) // 0.4Mbps 1.2MHz
Wayne Roberts 1:0817a150122b 633 n = 8;
Wayne Roberts 1:0817a150122b 634 else if (RegRxBw.bits.bw == REGBW_0_6MHZ) // 0.4Mbps 0.6MHz
Wayne Roberts 1:0817a150122b 635 n = 9;
Wayne Roberts 1:0817a150122b 636 break;
Wayne Roberts 1:0817a150122b 637 case 6:
Wayne Roberts 1:0817a150122b 638 if (RegRxBw.bits.bw == REGBW_0_6MHZ) // 0.25Mbps 0.6MHz
Wayne Roberts 1:0817a150122b 639 n = 10;
Wayne Roberts 1:0817a150122b 640 else if (RegRxBw.bits.bw == REGBW_0_3MHZ) // 0.25Mbps 0.3MHz
Wayne Roberts 1:0817a150122b 641 n = 11;
Wayne Roberts 1:0817a150122b 642 break;
Wayne Roberts 1:0817a150122b 643 case 7:
Wayne Roberts 1:0817a150122b 644 n = 12; // 0.125Mbps, assume bw=0.3MHz
Wayne Roberts 1:0817a150122b 645 break;
Wayne Roberts 1:0817a150122b 646 } // ..switch (FloraPreambleHi.bits.data_rate)
Wayne Roberts 1:0817a150122b 647 } else if (pktType == PACKET_TYPE_FLRC) {
Wayne Roberts 1:0817a150122b 648 n = FloraPreambleHi.bits.data_rate;
Wayne Roberts 1:0817a150122b 649 // datarate, bits 5,6,7.. bw bits 0,1,2
Wayne Roberts 1:0817a150122b 650 switch (FloraPreambleHi.bits.data_rate) {
Wayne Roberts 1:0817a150122b 651 case 0:
Wayne Roberts 1:0817a150122b 652 break;
Wayne Roberts 1:0817a150122b 653 case 1:
Wayne Roberts 1:0817a150122b 654 break;
Wayne Roberts 1:0817a150122b 655 case 2:
Wayne Roberts 1:0817a150122b 656 mpFLRC.flrc.bitrateBandwidth = FLRC_BR_1_300_BW_1_2;
Wayne Roberts 1:0817a150122b 657 break;
Wayne Roberts 1:0817a150122b 658 case 3:
Wayne Roberts 1:0817a150122b 659 mpFLRC.flrc.bitrateBandwidth = FLRC_BR_1_000_BW_1_2;
Wayne Roberts 1:0817a150122b 660 break;
Wayne Roberts 1:0817a150122b 661 case 4:
Wayne Roberts 1:0817a150122b 662 mpFLRC.flrc.bitrateBandwidth = FLRC_BR_0_650_BW_0_6;
Wayne Roberts 1:0817a150122b 663 break;
Wayne Roberts 1:0817a150122b 664 case 5:
Wayne Roberts 1:0817a150122b 665 mpFLRC.flrc.bitrateBandwidth = FLRC_BR_0_520_BW_0_6;
Wayne Roberts 1:0817a150122b 666 break;
Wayne Roberts 1:0817a150122b 667 case 6:
Wayne Roberts 1:0817a150122b 668 mpFLRC.flrc.bitrateBandwidth = FLRC_BR_0_325_BW_0_3;
Wayne Roberts 1:0817a150122b 669 break;
Wayne Roberts 1:0817a150122b 670 case 7:
Wayne Roberts 1:0817a150122b 671 mpFLRC.flrc.bitrateBandwidth = FLRC_BR_0_260_BW_0_3;
Wayne Roberts 1:0817a150122b 672 break;
Wayne Roberts 1:0817a150122b 673 } // ..switch (FloraPreambleHi.bits.data_rate)
Wayne Roberts 1:0817a150122b 674 }
Wayne Roberts 1:0817a150122b 675
Wayne Roberts 1:0817a150122b 676 return n;
Wayne Roberts 1:0817a150122b 677 }
Wayne Roberts 1:0817a150122b 678
Wayne Roberts 2:ea9245bb1c53 679 menuMode_e Radio::gfsk_flrc_bpsbw_write(unsigned sidx)
Wayne Roberts 1:0817a150122b 680 {
Wayne Roberts 1:0817a150122b 681 pktType = radio.getPacketType();
Wayne Roberts 1:0817a150122b 682
Wayne Roberts 1:0817a150122b 683 if (pktType == PACKET_TYPE_GFSK) {
Wayne Roberts 1:0817a150122b 684 switch (sidx) {
Wayne Roberts 1:0817a150122b 685 case 0: mpBLE_GFSK.gfskBle.bitrateBandwidth = GFSK_BLE_BR_2_000_BW_2_4; break;
Wayne Roberts 1:0817a150122b 686 case 1: mpBLE_GFSK.gfskBle.bitrateBandwidth = GFSK_BLE_BR_1_600_BW_2_4; break;
Wayne Roberts 1:0817a150122b 687 case 2: mpBLE_GFSK.gfskBle.bitrateBandwidth = GFSK_BLE_BR_1_000_BW_2_4; break;
Wayne Roberts 1:0817a150122b 688 case 3: mpBLE_GFSK.gfskBle.bitrateBandwidth = GFSK_BLE_BR_1_000_BW_1_2; break;
Wayne Roberts 1:0817a150122b 689 case 4: mpBLE_GFSK.gfskBle.bitrateBandwidth = GFSK_BLE_BR_0_800_BW_2_4; break;
Wayne Roberts 1:0817a150122b 690 case 5: mpBLE_GFSK.gfskBle.bitrateBandwidth = GFSK_BLE_BR_0_800_BW_1_2; break;
Wayne Roberts 1:0817a150122b 691 case 6: mpBLE_GFSK.gfskBle.bitrateBandwidth = GFSK_BLE_BR_0_500_BW_1_2; break;
Wayne Roberts 1:0817a150122b 692 case 7: mpBLE_GFSK.gfskBle.bitrateBandwidth = GFSK_BLE_BR_0_500_BW_0_6; break;
Wayne Roberts 1:0817a150122b 693 case 8: mpBLE_GFSK.gfskBle.bitrateBandwidth = GFSK_BLE_BR_0_400_BW_1_2; break;
Wayne Roberts 1:0817a150122b 694 case 9: mpBLE_GFSK.gfskBle.bitrateBandwidth = GFSK_BLE_BR_0_400_BW_0_6; break;
Wayne Roberts 1:0817a150122b 695 case 10: mpBLE_GFSK.gfskBle.bitrateBandwidth = GFSK_BLE_BR_0_250_BW_0_6; break;
Wayne Roberts 1:0817a150122b 696 case 11: mpBLE_GFSK.gfskBle.bitrateBandwidth = GFSK_BLE_BR_0_250_BW_0_3; break;
Wayne Roberts 1:0817a150122b 697 case 12: mpBLE_GFSK.gfskBle.bitrateBandwidth = GFSK_BLE_BR_0_125_BW_0_3; break;
Wayne Roberts 1:0817a150122b 698 }
Wayne Roberts 1:0817a150122b 699 radio.xfer(OPCODE_SET_MODULATION_PARAMS, 3, 0, mpBLE_GFSK.buf);
Wayne Roberts 1:0817a150122b 700 } else if (pktType == PACKET_TYPE_FLRC) {
Wayne Roberts 1:0817a150122b 701 switch (sidx) {
Wayne Roberts 1:0817a150122b 702 case 2: mpFLRC.flrc.bitrateBandwidth = FLRC_BR_1_300_BW_1_2; break;
Wayne Roberts 1:0817a150122b 703 case 3: mpFLRC.flrc.bitrateBandwidth = FLRC_BR_1_000_BW_1_2; break;
Wayne Roberts 1:0817a150122b 704 case 4: mpFLRC.flrc.bitrateBandwidth = FLRC_BR_0_650_BW_0_6; break;
Wayne Roberts 1:0817a150122b 705 case 5: mpFLRC.flrc.bitrateBandwidth = FLRC_BR_0_520_BW_0_6; break;
Wayne Roberts 1:0817a150122b 706 case 6: mpFLRC.flrc.bitrateBandwidth = FLRC_BR_0_325_BW_0_3; break;
Wayne Roberts 1:0817a150122b 707 case 7: mpFLRC.flrc.bitrateBandwidth = FLRC_BR_0_260_BW_0_3; break;
Wayne Roberts 1:0817a150122b 708 default:
Wayne Roberts 1:0817a150122b 709 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 710 }
Wayne Roberts 1:0817a150122b 711 radio.xfer(OPCODE_SET_MODULATION_PARAMS, 3, 0, mpFLRC.buf);
Wayne Roberts 1:0817a150122b 712 }
Wayne Roberts 1:0817a150122b 713
Wayne Roberts 1:0817a150122b 714 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 715 }
Wayne Roberts 1:0817a150122b 716
Wayne Roberts 1:0817a150122b 717 static const char* gfsk_bpsbw[] = {
Wayne Roberts 1:0817a150122b 718 " 2.0Mbps 2.4MHz", //0 GFSK_BLE_BR_2_000_BW_2_4 0x04 // Mbps:2 bw:2.4MHz
Wayne Roberts 1:0817a150122b 719 " 1.6Mbps 2.4MHz", //1 GFSK_BLE_BR_1_600_BW_2_4 0x28 // Mbps:1.6 bw:2.4MHz
Wayne Roberts 1:0817a150122b 720 " 1.0Mbps 2.4MHz", //2 GFSK_BLE_BR_1_000_BW_2_4 0x4C // Mbps:1 bw:2.4MHz
Wayne Roberts 1:0817a150122b 721 " 1.0Mbps 1.2MHz", //3 GFSK_BLE_BR_1_000_BW_1_2 0x45 // Mbps:1 bw:1.2MHz
Wayne Roberts 1:0817a150122b 722 " 0.8Mbps 2.4MHz", //4 GFSK_BLE_BR_0_800_BW_2_4 0x70 // Mbps:0.8 bw:2.4MHz
Wayne Roberts 1:0817a150122b 723 " 0.8Mbps 1.2MHz", //5 GFSK_BLE_BR_0_800_BW_1_2 0x69 // Mbps:0.8 bw:1.2MHz
Wayne Roberts 1:0817a150122b 724 " 0.5Mbps 1.2MHz", //6 GFSK_BLE_BR_0_500_BW_1_2 0x8D // Mbps:0.5 bw:1.2MHz
Wayne Roberts 1:0817a150122b 725 " 0.5Mbps 0.6MHz", //7 GFSK_BLE_BR_0_500_BW_0_6 0x86 // Mbps:0.5 bw:0.6MHz
Wayne Roberts 1:0817a150122b 726 " 0.4Mbps 1.2MHz", //8 GFSK_BLE_BR_0_400_BW_1_2 0xB1 // Mbps:0.4 bw:1.2MHz
Wayne Roberts 1:0817a150122b 727 " 0.4Mbps 0.6MHz", //9 GFSK_BLE_BR_0_400_BW_0_6 0xAA // Mbps:0.4 bw:0.6MHz
Wayne Roberts 1:0817a150122b 728 " 0.25Mbps 0.6MHz", //10 GFSK_BLE_BR_0_250_BW_0_6 0xCE // Mbps:0.25 bw:0.6MHz
Wayne Roberts 1:0817a150122b 729 " 0.25Mbps 0.3MHz", //11 GFSK_BLE_BR_0_250_BW_0_3 0xC7 // Mbps:0.25 bw:0.3MHz
Wayne Roberts 1:0817a150122b 730 "0.125Mbps 0.3MHz", //12 GFSK_BLE_BR_0_125_BW_0_3 0xEF // Mbps:0.125 bw:0.3MHz
Wayne Roberts 1:0817a150122b 731 // 01234567890123456
Wayne Roberts 1:0817a150122b 732 NULL
Wayne Roberts 1:0817a150122b 733 };
Wayne Roberts 1:0817a150122b 734
Wayne Roberts 2:ea9245bb1c53 735 const dropdown_item_t Radio::gfsk_bitrate_item = { _ITEM_DROPDOWN, gfsk_bpsbw, gfsk_bpsbw, gfsk_flrc_bpsbw_read, gfsk_flrc_bpsbw_write};
Wayne Roberts 1:0817a150122b 736
Wayne Roberts 1:0817a150122b 737 void Radio::modindex_print()
Wayne Roberts 1:0817a150122b 738 {
Wayne Roberts 1:0817a150122b 739 float mi, Mbps, fdev_hz;
Wayne Roberts 1:0817a150122b 740 unsigned bps, freqDev;
Wayne Roberts 1:0817a150122b 741 FskModDfH_t FskModDfH;
Wayne Roberts 1:0817a150122b 742 FloraPreambleHi_t FloraPreambleHi;
Wayne Roberts 1:0817a150122b 743
Wayne Roberts 1:0817a150122b 744 FloraPreambleHi.octet = radio.readReg(REG_ADDR_FLORA_PREAMBLE_HI, 1);
Wayne Roberts 1:0817a150122b 745 switch (FloraPreambleHi.bits.data_rate) {
Wayne Roberts 1:0817a150122b 746 case 0: Mbps = 2.0; break;
Wayne Roberts 1:0817a150122b 747 case 1: Mbps = 1.6; break;
Wayne Roberts 1:0817a150122b 748 case 2: Mbps = 1.0; break;
Wayne Roberts 1:0817a150122b 749 case 3: Mbps = 0.8; break;
Wayne Roberts 1:0817a150122b 750 case 4: Mbps = 0.5; break;
Wayne Roberts 1:0817a150122b 751 case 5: Mbps = 0.4; break;
Wayne Roberts 1:0817a150122b 752 case 6: Mbps = 0.25; break;
Wayne Roberts 1:0817a150122b 753 case 7: Mbps = 0.125; break;
Wayne Roberts 1:0817a150122b 754 }
Wayne Roberts 1:0817a150122b 755
Wayne Roberts 1:0817a150122b 756 FskModDfH.octet = radio.readReg(REG_ADDR_FSK_MODDFH, 1);
Wayne Roberts 1:0817a150122b 757 freqDev = FskModDfH.bits.freqDev;
Wayne Roberts 1:0817a150122b 758 freqDev <<= 8;
Wayne Roberts 1:0817a150122b 759 freqDev |= radio.readReg(REG_ADDR_FSK_MODDFL, 1);
Wayne Roberts 1:0817a150122b 760
Wayne Roberts 1:0817a150122b 761 fdev_hz = freqDev * PLL_STEP_HZ;
Wayne Roberts 1:0817a150122b 762 bps = Mbps * 1e6;
Wayne Roberts 1:0817a150122b 763 mi = (fdev_hz * 2.0) / bps;
Wayne Roberts 1:0817a150122b 764
Wayne Roberts 1:0817a150122b 765 pc.printf("%.2f", mi);
Wayne Roberts 1:0817a150122b 766 }
Wayne Roberts 1:0817a150122b 767
Wayne Roberts 1:0817a150122b 768 bool Radio::modindex_write(const char* valStr)
Wayne Roberts 1:0817a150122b 769 {
Wayne Roberts 1:0817a150122b 770 float f;
Wayne Roberts 1:0817a150122b 771
Wayne Roberts 1:0817a150122b 772 if (sscanf(valStr, "%f", &f) == 1) {
Wayne Roberts 1:0817a150122b 773 log_printf("scanned %f from \"%s\"\r\n", f);
Wayne Roberts 1:0817a150122b 774 if (f > 0.35) {
Wayne Roberts 1:0817a150122b 775 f -= 0.5;
Wayne Roberts 1:0817a150122b 776 f /= 0.25;
Wayne Roberts 1:0817a150122b 777 log_printf("set modindex:%f\r\n", f);
Wayne Roberts 1:0817a150122b 778 mpBLE_GFSK.gfskBle.ModulationIndex = ((uint8_t)f) + 1;
Wayne Roberts 1:0817a150122b 779 log_printf("to set %02x\r\n", mpBLE_GFSK.gfskBle.ModulationIndex);
Wayne Roberts 1:0817a150122b 780 } else
Wayne Roberts 1:0817a150122b 781 mpBLE_GFSK.gfskBle.ModulationIndex = 0;
Wayne Roberts 1:0817a150122b 782
Wayne Roberts 1:0817a150122b 783 radio.xfer(OPCODE_SET_MODULATION_PARAMS, 3, 0, mpBLE_GFSK.buf);
Wayne Roberts 1:0817a150122b 784 }
Wayne Roberts 1:0817a150122b 785 return false;
Wayne Roberts 1:0817a150122b 786 }
Wayne Roberts 1:0817a150122b 787
Wayne Roberts 1:0817a150122b 788 const value_item_t Radio::gfsk_modindex_item = { _ITEM_VALUE, 7, modindex_print, modindex_write };
Wayne Roberts 1:0817a150122b 789
Wayne Roberts 1:0817a150122b 790 static const char* gfsk_flrc_bts[] = {
Wayne Roberts 1:0817a150122b 791 "off",
Wayne Roberts 1:0817a150122b 792 "1.0",
Wayne Roberts 1:0817a150122b 793 "0.5",
Wayne Roberts 1:0817a150122b 794 "0.3",
Wayne Roberts 1:0817a150122b 795 NULL
Wayne Roberts 1:0817a150122b 796 };
Wayne Roberts 1:0817a150122b 797
Wayne Roberts 2:ea9245bb1c53 798 unsigned Radio::gfsk_flrc_bt_read(bool fw)
Wayne Roberts 1:0817a150122b 799 {
Wayne Roberts 1:0817a150122b 800 FskCfg_t FskCfg;
Wayne Roberts 1:0817a150122b 801 FskCfg.octet = radio.readReg(REG_ADDR_FSK_CFG, 1);
Wayne Roberts 1:0817a150122b 802 return FskCfg.bits.gf_bt;
Wayne Roberts 1:0817a150122b 803 }
Wayne Roberts 1:0817a150122b 804
Wayne Roberts 2:ea9245bb1c53 805 menuMode_e Radio::gfsk_flrc_bt_write(unsigned sidx)
Wayne Roberts 1:0817a150122b 806 {
Wayne Roberts 1:0817a150122b 807 mpBLE_GFSK.gfskBle.ModulationShaping = sidx << 4;
Wayne Roberts 1:0817a150122b 808 radio.xfer(OPCODE_SET_MODULATION_PARAMS, 3, 0, mpBLE_GFSK.buf);
Wayne Roberts 1:0817a150122b 809 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 810 }
Wayne Roberts 1:0817a150122b 811
Wayne Roberts 2:ea9245bb1c53 812 const dropdown_item_t Radio::gfsk_flrc_bt_item = { _ITEM_DROPDOWN, gfsk_flrc_bts, gfsk_flrc_bts, gfsk_flrc_bt_read, gfsk_flrc_bt_write};
Wayne Roberts 1:0817a150122b 813
Wayne Roberts 1:0817a150122b 814 static const char* gfsk_flrc_pblLens[] = {
Wayne Roberts 1:0817a150122b 815 "4",
Wayne Roberts 1:0817a150122b 816 "8",
Wayne Roberts 1:0817a150122b 817 "12",
Wayne Roberts 1:0817a150122b 818 "16",
Wayne Roberts 1:0817a150122b 819 "20",
Wayne Roberts 1:0817a150122b 820 "24",
Wayne Roberts 1:0817a150122b 821 "28",
Wayne Roberts 1:0817a150122b 822 "32",
Wayne Roberts 1:0817a150122b 823 NULL,
Wayne Roberts 1:0817a150122b 824 };
Wayne Roberts 1:0817a150122b 825
Wayne Roberts 2:ea9245bb1c53 826 unsigned Radio::gfsk_flrc_pl_read(bool fw)
Wayne Roberts 1:0817a150122b 827 {
Wayne Roberts 1:0817a150122b 828 PktCtrl1_t PktCtrl1;
Wayne Roberts 1:0817a150122b 829 PktCtrl1.octet = radio.readReg(REG_ADDR_PKTCTRL1, 1);
Wayne Roberts 1:0817a150122b 830 ppFLRC.gfskFLRC.PreambleLength = PktCtrl1.octet & 0x70;
Wayne Roberts 1:0817a150122b 831 ppGFSK.gfskFLRC.PreambleLength = ppFLRC.gfskFLRC.PreambleLength;
Wayne Roberts 1:0817a150122b 832 return PktCtrl1.gfsk.preamble_len;
Wayne Roberts 1:0817a150122b 833 }
Wayne Roberts 1:0817a150122b 834
Wayne Roberts 2:ea9245bb1c53 835 menuMode_e Radio::gfsk_flrc_pl_write(unsigned sidx)
Wayne Roberts 1:0817a150122b 836 {
Wayne Roberts 1:0817a150122b 837 ppFLRC.gfskFLRC.PreambleLength = sidx << 4;
Wayne Roberts 1:0817a150122b 838 ppGFSK.gfskFLRC.PreambleLength = ppFLRC.gfskFLRC.PreambleLength;
Wayne Roberts 1:0817a150122b 839 radio.xfer(OPCODE_SET_PACKET_PARAMS, 7, 0, ppGFSK.buf);
Wayne Roberts 1:0817a150122b 840 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 841 }
Wayne Roberts 1:0817a150122b 842
Wayne Roberts 2:ea9245bb1c53 843 const dropdown_item_t Radio::gfsk_flrc_preamble_item = { _ITEM_DROPDOWN, gfsk_flrc_pblLens, gfsk_flrc_pblLens, gfsk_flrc_pl_read, gfsk_flrc_pl_write};
Wayne Roberts 1:0817a150122b 844
Wayne Roberts 1:0817a150122b 845 static const char* gfsk_syncLens[] = {
Wayne Roberts 1:0817a150122b 846 "1", // 0
Wayne Roberts 1:0817a150122b 847 "2", // 1
Wayne Roberts 1:0817a150122b 848 "3", // 2
Wayne Roberts 1:0817a150122b 849 "4", // 3
Wayne Roberts 1:0817a150122b 850 "5", // 4
Wayne Roberts 1:0817a150122b 851 NULL,
Wayne Roberts 1:0817a150122b 852 };
Wayne Roberts 1:0817a150122b 853
Wayne Roberts 2:ea9245bb1c53 854 unsigned Radio::gfsk_synclen_read(bool fw)
Wayne Roberts 1:0817a150122b 855 {
Wayne Roberts 1:0817a150122b 856 PktCtrl1_t PktCtrl1;
Wayne Roberts 1:0817a150122b 857 PktCtrl1.octet = radio.readReg(REG_ADDR_PKTCTRL1, 1);
Wayne Roberts 1:0817a150122b 858
Wayne Roberts 1:0817a150122b 859 ppGFSK.gfskFLRC.SyncWordLength = PktCtrl1.octet & 0x0e;
Wayne Roberts 1:0817a150122b 860 ppFLRC.gfskFLRC.SyncWordLength = PktCtrl1.octet & 0x06;
Wayne Roberts 1:0817a150122b 861
Wayne Roberts 1:0817a150122b 862 return PktCtrl1.gfsk.sync_adrs_len;
Wayne Roberts 1:0817a150122b 863 }
Wayne Roberts 1:0817a150122b 864
Wayne Roberts 2:ea9245bb1c53 865 menuMode_e Radio::gfsk_synclen_write(unsigned sidx)
Wayne Roberts 1:0817a150122b 866 {
Wayne Roberts 1:0817a150122b 867 ppGFSK.gfskFLRC.SyncWordLength = sidx << 1;
Wayne Roberts 1:0817a150122b 868 //log_printf("SWL %u %02x\r\n", sidx, ppGFSK.gfskFLRC.SyncWordLength);
Wayne Roberts 1:0817a150122b 869 radio.xfer(OPCODE_SET_PACKET_PARAMS, 7, 0, ppGFSK.buf);
Wayne Roberts 1:0817a150122b 870 //return MENUMODE_NONE;
Wayne Roberts 1:0817a150122b 871 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 872 }
Wayne Roberts 1:0817a150122b 873
Wayne Roberts 2:ea9245bb1c53 874 const dropdown_item_t Radio::gfsk_synclen_item = { _ITEM_DROPDOWN, gfsk_syncLens, gfsk_syncLens, gfsk_synclen_read, gfsk_synclen_write};
Wayne Roberts 1:0817a150122b 875
Wayne Roberts 1:0817a150122b 876 bool Radio::gfsk_flrc_fixvar_read()
Wayne Roberts 1:0817a150122b 877 {
Wayne Roberts 1:0817a150122b 878 PktCtrl0_t PktCtrl0;
Wayne Roberts 1:0817a150122b 879 PktCtrl0.octet = radio.readReg(REG_ADDR_PKTCTRL0, 1);
Wayne Roberts 1:0817a150122b 880
Wayne Roberts 1:0817a150122b 881 ppGFSK.gfskFLRC.HeaderType = PktCtrl0.octet & 0x20;
Wayne Roberts 1:0817a150122b 882 ppFLRC.gfskFLRC.HeaderType = PktCtrl0.octet & 0x20;
Wayne Roberts 1:0817a150122b 883
Wayne Roberts 1:0817a150122b 884 return PktCtrl0.bits.pkt_len_format;
Wayne Roberts 1:0817a150122b 885 }
Wayne Roberts 1:0817a150122b 886
Wayne Roberts 1:0817a150122b 887 bool Radio::gfsk_flrc_fixvar_push()
Wayne Roberts 1:0817a150122b 888 {
Wayne Roberts 1:0817a150122b 889 PacketParams_t* pp;
Wayne Roberts 1:0817a150122b 890 pktType = radio.getPacketType();
Wayne Roberts 1:0817a150122b 891
Wayne Roberts 1:0817a150122b 892 if (pktType == PACKET_TYPE_FLRC)
Wayne Roberts 1:0817a150122b 893 pp = &ppFLRC;
Wayne Roberts 1:0817a150122b 894 else if (pktType == PACKET_TYPE_GFSK)
Wayne Roberts 1:0817a150122b 895 pp = &ppGFSK;
Wayne Roberts 1:0817a150122b 896 else
Wayne Roberts 1:0817a150122b 897 return false;
Wayne Roberts 1:0817a150122b 898
Wayne Roberts 1:0817a150122b 899 if (pp->gfskFLRC.HeaderType == RADIO_PACKET_VARIABLE_LENGTH)
Wayne Roberts 1:0817a150122b 900 pp->gfskFLRC.HeaderType = RADIO_PACKET_FIXED_LENGTH;
Wayne Roberts 1:0817a150122b 901 else
Wayne Roberts 1:0817a150122b 902 pp->gfskFLRC.HeaderType = RADIO_PACKET_VARIABLE_LENGTH;
Wayne Roberts 1:0817a150122b 903
Wayne Roberts 1:0817a150122b 904 radio.xfer(OPCODE_SET_PACKET_PARAMS, 7, 0, pp->buf);
Wayne Roberts 1:0817a150122b 905
Wayne Roberts 1:0817a150122b 906 return pp->gfskFLRC.HeaderType == RADIO_PACKET_VARIABLE_LENGTH;
Wayne Roberts 1:0817a150122b 907 }
Wayne Roberts 1:0817a150122b 908
Wayne Roberts 1:0817a150122b 909 const toggle_item_t Radio::gfsk_flrc_fixvar_item = { _ITEM_TOGGLE,
Wayne Roberts 1:0817a150122b 910 "fixed ",
Wayne Roberts 1:0817a150122b 911 "variable",
Wayne Roberts 1:0817a150122b 912 gfsk_flrc_fixvar_read, gfsk_flrc_fixvar_push
Wayne Roberts 1:0817a150122b 913 };
Wayne Roberts 1:0817a150122b 914
Wayne Roberts 1:0817a150122b 915 static const char* gfsk_flrc_crclens[] = {
Wayne Roberts 1:0817a150122b 916 "0 off",
Wayne Roberts 1:0817a150122b 917 "1 byte",
Wayne Roberts 1:0817a150122b 918 "2 bytes",
Wayne Roberts 1:0817a150122b 919 NULL,
Wayne Roberts 1:0817a150122b 920 };
Wayne Roberts 1:0817a150122b 921
Wayne Roberts 2:ea9245bb1c53 922 unsigned Radio::gfsk_flrc_crclen_read(bool fw)
Wayne Roberts 1:0817a150122b 923 {
Wayne Roberts 1:0817a150122b 924 PktBitStreamCtrl_t PktBitStreamCtrl;
Wayne Roberts 1:0817a150122b 925 PktBitStreamCtrl.octet = radio.readReg(REG_ADDR_PKT_BITSTREAM_CTRL, 1);
Wayne Roberts 1:0817a150122b 926 ppGFSK.gfskFLRC.CRCLength = PktBitStreamCtrl.octet & 0x30;
Wayne Roberts 1:0817a150122b 927 return PktBitStreamCtrl.bits.crc_mode;
Wayne Roberts 1:0817a150122b 928 }
Wayne Roberts 1:0817a150122b 929
Wayne Roberts 2:ea9245bb1c53 930 menuMode_e Radio::gfsk_flrc_crclen_write(unsigned sidx)
Wayne Roberts 1:0817a150122b 931 {
Wayne Roberts 1:0817a150122b 932 pktType = radio.getPacketType();
Wayne Roberts 1:0817a150122b 933
Wayne Roberts 1:0817a150122b 934 ppGFSK.gfskFLRC.CRCLength = (sidx & 3) << 4;
Wayne Roberts 1:0817a150122b 935 ppFLRC.gfskFLRC.CRCLength = (sidx & 3) << 4;
Wayne Roberts 1:0817a150122b 936
Wayne Roberts 1:0817a150122b 937 if (pktType == PACKET_TYPE_GFSK)
Wayne Roberts 1:0817a150122b 938 radio.xfer(OPCODE_SET_PACKET_PARAMS, 7, 0, ppGFSK.buf);
Wayne Roberts 1:0817a150122b 939 else if (pktType == PACKET_TYPE_FLRC)
Wayne Roberts 1:0817a150122b 940 radio.xfer(OPCODE_SET_PACKET_PARAMS, 7, 0, ppFLRC.buf);
Wayne Roberts 1:0817a150122b 941
Wayne Roberts 1:0817a150122b 942 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 943 }
Wayne Roberts 1:0817a150122b 944
Wayne Roberts 2:ea9245bb1c53 945 const dropdown_item_t Radio::gfsk_flrc_crclen_item = { _ITEM_DROPDOWN, gfsk_flrc_crclens, gfsk_flrc_crclens, gfsk_flrc_crclen_read, gfsk_flrc_crclen_write};
Wayne Roberts 1:0817a150122b 946
Wayne Roberts 1:0817a150122b 947 bool Radio::gfsk_flrc_whit_read()
Wayne Roberts 1:0817a150122b 948 {
Wayne Roberts 1:0817a150122b 949 PktBitStreamCtrl_t PktBitStreamCtrl;
Wayne Roberts 1:0817a150122b 950 PktBitStreamCtrl.octet = radio.readReg(REG_ADDR_PKT_BITSTREAM_CTRL, 1);
Wayne Roberts 1:0817a150122b 951 ppGFSK.gfskFLRC.Whitening = PktBitStreamCtrl.octet & 0x08;
Wayne Roberts 1:0817a150122b 952 ppFLRC.gfskFLRC.Whitening = PktBitStreamCtrl.octet & 0x08;
Wayne Roberts 1:0817a150122b 953 return PktBitStreamCtrl.bits.whit_disable;
Wayne Roberts 1:0817a150122b 954 }
Wayne Roberts 1:0817a150122b 955
Wayne Roberts 1:0817a150122b 956 bool Radio::gfsk_flrc_whit_push()
Wayne Roberts 1:0817a150122b 957 {
Wayne Roberts 1:0817a150122b 958 pktType = radio.getPacketType();
Wayne Roberts 1:0817a150122b 959
Wayne Roberts 1:0817a150122b 960 if (ppGFSK.gfskFLRC.Whitening == WHITENING_DISABLE)
Wayne Roberts 1:0817a150122b 961 ppGFSK.gfskFLRC.Whitening = WHITENING_ENABLE;
Wayne Roberts 1:0817a150122b 962 else
Wayne Roberts 1:0817a150122b 963 ppGFSK.gfskFLRC.Whitening = WHITENING_DISABLE;
Wayne Roberts 1:0817a150122b 964
Wayne Roberts 1:0817a150122b 965 ppFLRC.gfskFLRC.Whitening = ppGFSK.gfskFLRC.Whitening;
Wayne Roberts 1:0817a150122b 966
Wayne Roberts 1:0817a150122b 967 if (pktType == PACKET_TYPE_GFSK)
Wayne Roberts 1:0817a150122b 968 radio.xfer(OPCODE_SET_PACKET_PARAMS, 7, 0, ppGFSK.buf);
Wayne Roberts 1:0817a150122b 969 else if (pktType == PACKET_TYPE_FLRC)
Wayne Roberts 1:0817a150122b 970 radio.xfer(OPCODE_SET_PACKET_PARAMS, 7, 0, ppFLRC.buf);
Wayne Roberts 1:0817a150122b 971
Wayne Roberts 1:0817a150122b 972 return ppGFSK.gfskFLRC.Whitening == WHITENING_DISABLE;
Wayne Roberts 1:0817a150122b 973 }
Wayne Roberts 1:0817a150122b 974
Wayne Roberts 1:0817a150122b 975 const toggle_item_t Radio::gfsk_flrc_whit_item = { _ITEM_TOGGLE,
Wayne Roberts 1:0817a150122b 976 "ENABLE ",
Wayne Roberts 1:0817a150122b 977 "DISABLE",
Wayne Roberts 1:0817a150122b 978 gfsk_flrc_whit_read, gfsk_flrc_whit_push
Wayne Roberts 1:0817a150122b 979 };
Wayne Roberts 1:0817a150122b 980
Wayne Roberts 1:0817a150122b 981 void Radio::gfsk_flrc_crcinit_print()
Wayne Roberts 1:0817a150122b 982 {
Wayne Roberts 1:0817a150122b 983 unsigned val = radio.readReg(0x9c8, 2);
Wayne Roberts 1:0817a150122b 984 pc.printf("0x%04x", val);
Wayne Roberts 1:0817a150122b 985 }
Wayne Roberts 1:0817a150122b 986
Wayne Roberts 1:0817a150122b 987 bool Radio::gfsk_flrc_crcinit_write(const char* txt)
Wayne Roberts 1:0817a150122b 988 {
Wayne Roberts 1:0817a150122b 989 unsigned val;
Wayne Roberts 1:0817a150122b 990 sscanf(txt, "%x", &val);
Wayne Roberts 1:0817a150122b 991 radio.writeReg(0x9c8, val, 2);
Wayne Roberts 1:0817a150122b 992 return false;
Wayne Roberts 1:0817a150122b 993 }
Wayne Roberts 1:0817a150122b 994
Wayne Roberts 1:0817a150122b 995 const value_item_t Radio::gfsk_flrc_crcinit_item = { _ITEM_VALUE, 7, gfsk_flrc_crcinit_print, gfsk_flrc_crcinit_write };
Wayne Roberts 1:0817a150122b 996
Wayne Roberts 1:0817a150122b 997 void Radio::gfsk_flrc_crcpoly_print(void)
Wayne Roberts 1:0817a150122b 998 {
Wayne Roberts 1:0817a150122b 999 unsigned val = radio.readReg(0x9c6, 2);
Wayne Roberts 1:0817a150122b 1000 pc.printf("0x%04x", val);
Wayne Roberts 1:0817a150122b 1001 }
Wayne Roberts 1:0817a150122b 1002
Wayne Roberts 1:0817a150122b 1003 bool Radio::gfsk_flrc_crcpoly_write(const char* txt)
Wayne Roberts 1:0817a150122b 1004 {
Wayne Roberts 1:0817a150122b 1005 unsigned val;
Wayne Roberts 1:0817a150122b 1006 sscanf(txt, "%x", &val);
Wayne Roberts 1:0817a150122b 1007 radio.writeReg(0x9c6, val, 2);
Wayne Roberts 1:0817a150122b 1008 return false;
Wayne Roberts 1:0817a150122b 1009 }
Wayne Roberts 1:0817a150122b 1010
Wayne Roberts 1:0817a150122b 1011 const value_item_t Radio::gfsk_flrc_crcpoly_item = { _ITEM_VALUE, 7, gfsk_flrc_crcpoly_print, gfsk_flrc_crcpoly_write };
Wayne Roberts 1:0817a150122b 1012
Wayne Roberts 1:0817a150122b 1013 bool Radio::gfsk_flrc_sync1en_read()
Wayne Roberts 1:0817a150122b 1014 {
Wayne Roberts 1:0817a150122b 1015 PktSyncAdrs_t PktSyncAdrs;
Wayne Roberts 1:0817a150122b 1016 PktSyncAdrs.octet = radio.readReg(REG_ADDR_PKT_SYNC_ADRS_CTRL, 1);
Wayne Roberts 1:0817a150122b 1017
Wayne Roberts 1:0817a150122b 1018 ppGFSK.gfskFLRC.SyncWordMatch = PktSyncAdrs.octet & 0x70;
Wayne Roberts 1:0817a150122b 1019 ppFLRC.gfskFLRC.SyncWordMatch = PktSyncAdrs.octet & 0x70;
Wayne Roberts 1:0817a150122b 1020
Wayne Roberts 1:0817a150122b 1021 return PktSyncAdrs.gfskflrc.sync_addr_mask & 1;
Wayne Roberts 1:0817a150122b 1022 }
Wayne Roberts 1:0817a150122b 1023
Wayne Roberts 1:0817a150122b 1024 bool Radio::gfsk_flrc_sync2en_read()
Wayne Roberts 1:0817a150122b 1025 {
Wayne Roberts 1:0817a150122b 1026 PktSyncAdrs_t PktSyncAdrs;
Wayne Roberts 1:0817a150122b 1027 PktSyncAdrs.octet = radio.readReg(REG_ADDR_PKT_SYNC_ADRS_CTRL, 1);
Wayne Roberts 1:0817a150122b 1028
Wayne Roberts 1:0817a150122b 1029 ppGFSK.gfskFLRC.SyncWordMatch = PktSyncAdrs.octet & 0x70;
Wayne Roberts 1:0817a150122b 1030 ppFLRC.gfskFLRC.SyncWordMatch = PktSyncAdrs.octet & 0x70;
Wayne Roberts 1:0817a150122b 1031
Wayne Roberts 1:0817a150122b 1032 return ppGFSK.gfskFLRC.SyncWordMatch & 0x20;
Wayne Roberts 1:0817a150122b 1033 }
Wayne Roberts 1:0817a150122b 1034
Wayne Roberts 1:0817a150122b 1035 bool Radio::gfsk_flrc_sync3en_read()
Wayne Roberts 1:0817a150122b 1036 {
Wayne Roberts 1:0817a150122b 1037 PktSyncAdrs_t PktSyncAdrs;
Wayne Roberts 1:0817a150122b 1038 PktSyncAdrs.octet = radio.readReg(REG_ADDR_PKT_SYNC_ADRS_CTRL, 1);
Wayne Roberts 1:0817a150122b 1039
Wayne Roberts 1:0817a150122b 1040 ppGFSK.gfskFLRC.SyncWordMatch = PktSyncAdrs.octet & 0x70;
Wayne Roberts 1:0817a150122b 1041 ppFLRC.gfskFLRC.SyncWordMatch = PktSyncAdrs.octet & 0x70;
Wayne Roberts 1:0817a150122b 1042
Wayne Roberts 1:0817a150122b 1043 return ppGFSK.gfskFLRC.SyncWordMatch & 0x40;
Wayne Roberts 1:0817a150122b 1044 //return PktSyncAdrs.gfskflrc.sync_addr_mask & 4;
Wayne Roberts 1:0817a150122b 1045 }
Wayne Roberts 1:0817a150122b 1046
Wayne Roberts 1:0817a150122b 1047 bool Radio::gfsk_flrc_sync1en_push()
Wayne Roberts 1:0817a150122b 1048 {
Wayne Roberts 1:0817a150122b 1049 if (ppGFSK.gfskFLRC.SyncWordMatch & 0x10)
Wayne Roberts 1:0817a150122b 1050 ppGFSK.gfskFLRC.SyncWordMatch &= ~0x10;
Wayne Roberts 1:0817a150122b 1051 else
Wayne Roberts 1:0817a150122b 1052 ppGFSK.gfskFLRC.SyncWordMatch |= 0x10;
Wayne Roberts 1:0817a150122b 1053
Wayne Roberts 1:0817a150122b 1054 radio.xfer(OPCODE_SET_PACKET_PARAMS, 7, 0, ppGFSK.buf);
Wayne Roberts 1:0817a150122b 1055
Wayne Roberts 1:0817a150122b 1056 ppFLRC.gfskFLRC.SyncWordMatch = ppGFSK.gfskFLRC.SyncWordMatch;
Wayne Roberts 1:0817a150122b 1057
Wayne Roberts 1:0817a150122b 1058 return ppGFSK.gfskFLRC.SyncWordMatch & 0x10;
Wayne Roberts 1:0817a150122b 1059 }
Wayne Roberts 1:0817a150122b 1060
Wayne Roberts 1:0817a150122b 1061 bool Radio::gfsk_flrc_sync2en_push()
Wayne Roberts 1:0817a150122b 1062 {
Wayne Roberts 1:0817a150122b 1063 if (ppGFSK.gfskFLRC.SyncWordMatch & 0x20)
Wayne Roberts 1:0817a150122b 1064 ppGFSK.gfskFLRC.SyncWordMatch &= ~0x20;
Wayne Roberts 1:0817a150122b 1065 else
Wayne Roberts 1:0817a150122b 1066 ppGFSK.gfskFLRC.SyncWordMatch |= 0x20;
Wayne Roberts 1:0817a150122b 1067
Wayne Roberts 1:0817a150122b 1068 radio.xfer(OPCODE_SET_PACKET_PARAMS, 7, 0, ppGFSK.buf);
Wayne Roberts 1:0817a150122b 1069
Wayne Roberts 1:0817a150122b 1070 ppFLRC.gfskFLRC.SyncWordMatch = ppGFSK.gfskFLRC.SyncWordMatch;
Wayne Roberts 1:0817a150122b 1071
Wayne Roberts 1:0817a150122b 1072 return ppGFSK.gfskFLRC.SyncWordMatch & 0x20;
Wayne Roberts 1:0817a150122b 1073 }
Wayne Roberts 1:0817a150122b 1074
Wayne Roberts 1:0817a150122b 1075 bool Radio::gfsk_flrc_sync3en_push()
Wayne Roberts 1:0817a150122b 1076 {
Wayne Roberts 1:0817a150122b 1077 if (ppGFSK.gfskFLRC.SyncWordMatch & 0x40)
Wayne Roberts 1:0817a150122b 1078 ppGFSK.gfskFLRC.SyncWordMatch &= ~0x40;
Wayne Roberts 1:0817a150122b 1079 else
Wayne Roberts 1:0817a150122b 1080 ppGFSK.gfskFLRC.SyncWordMatch |= 0x40;
Wayne Roberts 1:0817a150122b 1081
Wayne Roberts 1:0817a150122b 1082 radio.xfer(OPCODE_SET_PACKET_PARAMS, 7, 0, ppGFSK.buf);
Wayne Roberts 1:0817a150122b 1083
Wayne Roberts 1:0817a150122b 1084 ppFLRC.gfskFLRC.SyncWordMatch = ppGFSK.gfskFLRC.SyncWordMatch;
Wayne Roberts 1:0817a150122b 1085
Wayne Roberts 1:0817a150122b 1086 return ppGFSK.gfskFLRC.SyncWordMatch & 0x40;
Wayne Roberts 1:0817a150122b 1087 }
Wayne Roberts 1:0817a150122b 1088
Wayne Roberts 1:0817a150122b 1089 const toggle_item_t Radio::gfsk_flrc_sync1en_item = { _ITEM_TOGGLE, "off:", " ON:", gfsk_flrc_sync1en_read, gfsk_flrc_sync1en_push};
Wayne Roberts 1:0817a150122b 1090 const toggle_item_t Radio::gfsk_flrc_sync2en_item = { _ITEM_TOGGLE, "off:", " ON:", gfsk_flrc_sync2en_read, gfsk_flrc_sync2en_push};
Wayne Roberts 1:0817a150122b 1091 const toggle_item_t Radio::gfsk_flrc_sync3en_item = { _ITEM_TOGGLE, "off:", " ON:", gfsk_flrc_sync3en_read, gfsk_flrc_sync3en_push};
Wayne Roberts 1:0817a150122b 1092
Wayne Roberts 1:0817a150122b 1093 void Radio::gfsk_flrc_sync1_print(void)
Wayne Roberts 1:0817a150122b 1094 {
Wayne Roberts 1:0817a150122b 1095 uint64_t val;
Wayne Roberts 1:0817a150122b 1096 uint32_t val32 = radio.readReg(REG_ADDR_PKT_SYNC_ADRS_1+1, 4);
Wayne Roberts 1:0817a150122b 1097 uint32_t upper = radio.readReg(REG_ADDR_PKT_SYNC_ADRS_1, 1);
Wayne Roberts 1:0817a150122b 1098 val = upper;
Wayne Roberts 1:0817a150122b 1099 val <<= 32;
Wayne Roberts 1:0817a150122b 1100 val |= val32;
Wayne Roberts 1:0817a150122b 1101 pc.printf("%llx", val);
Wayne Roberts 1:0817a150122b 1102 }
Wayne Roberts 1:0817a150122b 1103
Wayne Roberts 1:0817a150122b 1104 void Radio::gfsk_flrc_sync2_print(void)
Wayne Roberts 1:0817a150122b 1105 {
Wayne Roberts 1:0817a150122b 1106 uint64_t val;
Wayne Roberts 1:0817a150122b 1107 uint32_t val32 = radio.readReg(REG_ADDR_PKT_SYNC_ADRS_2+1, 4);
Wayne Roberts 1:0817a150122b 1108 uint32_t upper = radio.readReg(REG_ADDR_PKT_SYNC_ADRS_2, 1);
Wayne Roberts 1:0817a150122b 1109 val = upper;
Wayne Roberts 1:0817a150122b 1110 val <<= 32;
Wayne Roberts 1:0817a150122b 1111 val |= val32;
Wayne Roberts 1:0817a150122b 1112 pc.printf("%llx", val);
Wayne Roberts 1:0817a150122b 1113 }
Wayne Roberts 1:0817a150122b 1114
Wayne Roberts 1:0817a150122b 1115 void Radio::gfsk_flrc_sync3_print(void)
Wayne Roberts 1:0817a150122b 1116 {
Wayne Roberts 1:0817a150122b 1117 uint64_t val;
Wayne Roberts 1:0817a150122b 1118 uint32_t val32 = radio.readReg(REG_ADDR_PKT_SYNC_ADRS_3+1, 4);
Wayne Roberts 1:0817a150122b 1119 uint32_t upper = radio.readReg(REG_ADDR_PKT_SYNC_ADRS_3, 1);
Wayne Roberts 1:0817a150122b 1120 val = upper;
Wayne Roberts 1:0817a150122b 1121 val <<= 32;
Wayne Roberts 1:0817a150122b 1122 val |= val32;
Wayne Roberts 1:0817a150122b 1123 pc.printf("%llx", val);
Wayne Roberts 1:0817a150122b 1124 }
Wayne Roberts 1:0817a150122b 1125
Wayne Roberts 1:0817a150122b 1126 bool Radio::gfsk_flrc_sync1_write(const char* txt)
Wayne Roberts 1:0817a150122b 1127 {
Wayne Roberts 1:0817a150122b 1128 uint32_t val32, upper;
Wayne Roberts 1:0817a150122b 1129 uint64_t val;
Wayne Roberts 1:0817a150122b 1130 sscanf(txt, "%llx", &val);
Wayne Roberts 1:0817a150122b 1131
Wayne Roberts 1:0817a150122b 1132 val32 = val;
Wayne Roberts 1:0817a150122b 1133 val >>= 32;
Wayne Roberts 1:0817a150122b 1134 upper = val;
Wayne Roberts 1:0817a150122b 1135
Wayne Roberts 1:0817a150122b 1136 radio.writeReg(REG_ADDR_PKT_SYNC_ADRS_1, upper, 1);
Wayne Roberts 1:0817a150122b 1137 radio.writeReg(REG_ADDR_PKT_SYNC_ADRS_1+1, val32, 4);
Wayne Roberts 1:0817a150122b 1138
Wayne Roberts 1:0817a150122b 1139 return false;
Wayne Roberts 1:0817a150122b 1140 }
Wayne Roberts 1:0817a150122b 1141
Wayne Roberts 1:0817a150122b 1142 bool Radio::gfsk_flrc_sync2_write(const char* txt)
Wayne Roberts 1:0817a150122b 1143 {
Wayne Roberts 1:0817a150122b 1144 uint32_t val32, upper;
Wayne Roberts 1:0817a150122b 1145 uint64_t val;
Wayne Roberts 1:0817a150122b 1146 sscanf(txt, "%llx", &val);
Wayne Roberts 1:0817a150122b 1147
Wayne Roberts 1:0817a150122b 1148 val32 = val;
Wayne Roberts 1:0817a150122b 1149 val >>= 32;
Wayne Roberts 1:0817a150122b 1150 upper = val;
Wayne Roberts 1:0817a150122b 1151
Wayne Roberts 1:0817a150122b 1152 radio.writeReg(REG_ADDR_PKT_SYNC_ADRS_2, upper, 1);
Wayne Roberts 1:0817a150122b 1153 radio.writeReg(REG_ADDR_PKT_SYNC_ADRS_2+1, val32, 4);
Wayne Roberts 1:0817a150122b 1154
Wayne Roberts 1:0817a150122b 1155 return false;
Wayne Roberts 1:0817a150122b 1156 }
Wayne Roberts 1:0817a150122b 1157
Wayne Roberts 1:0817a150122b 1158 bool Radio::gfsk_flrc_sync3_write(const char* txt)
Wayne Roberts 1:0817a150122b 1159 {
Wayne Roberts 1:0817a150122b 1160 uint32_t val32, upper;
Wayne Roberts 1:0817a150122b 1161 uint64_t val;
Wayne Roberts 1:0817a150122b 1162 sscanf(txt, "%llx", &val);
Wayne Roberts 1:0817a150122b 1163
Wayne Roberts 1:0817a150122b 1164 val32 = val;
Wayne Roberts 1:0817a150122b 1165 val >>= 32;
Wayne Roberts 1:0817a150122b 1166 upper = val;
Wayne Roberts 1:0817a150122b 1167
Wayne Roberts 1:0817a150122b 1168 radio.writeReg(REG_ADDR_PKT_SYNC_ADRS_3, upper, 1);
Wayne Roberts 1:0817a150122b 1169 radio.writeReg(REG_ADDR_PKT_SYNC_ADRS_3+1, val32, 4);
Wayne Roberts 1:0817a150122b 1170
Wayne Roberts 1:0817a150122b 1171 return false;
Wayne Roberts 1:0817a150122b 1172 }
Wayne Roberts 1:0817a150122b 1173
Wayne Roberts 1:0817a150122b 1174 const value_item_t Radio::gfsk_flrc_sync1_item = { _ITEM_VALUE, 10, gfsk_flrc_sync1_print, gfsk_flrc_sync1_write };
Wayne Roberts 1:0817a150122b 1175 const value_item_t Radio::gfsk_flrc_sync2_item = { _ITEM_VALUE, 10, gfsk_flrc_sync2_print, gfsk_flrc_sync2_write };
Wayne Roberts 1:0817a150122b 1176 const value_item_t Radio::gfsk_flrc_sync3_item = { _ITEM_VALUE, 10, gfsk_flrc_sync3_print, gfsk_flrc_sync3_write };
Wayne Roberts 1:0817a150122b 1177
Wayne Roberts 1:0817a150122b 1178
Wayne Roberts 1:0817a150122b 1179 const menu_t Radio::gfsk_menu[] = {
Wayne Roberts 1:0817a150122b 1180 { {FIRST_CHIP_MENU_ROW, 1}, NULL, &gfsk_bitrate_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1181 { {FIRST_CHIP_MENU_ROW, 19}, "mod index:", &gfsk_modindex_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1182 { {FIRST_CHIP_MENU_ROW, 35}, "BT:", &gfsk_flrc_bt_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1183 { {FIRST_CHIP_MENU_ROW, 43}, "PreambleLength:", &gfsk_flrc_preamble_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1184 { {FIRST_CHIP_MENU_ROW, 61}, "SyncLength:", &gfsk_synclen_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1185
Wayne Roberts 1:0817a150122b 1186 { {FIRST_CHIP_MENU_ROW+1, 1}, "Length:", &gfsk_flrc_fixvar_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1187 { {FIRST_CHIP_MENU_ROW+1, 18}, "crcLength:", &gfsk_flrc_crclen_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1188 { {FIRST_CHIP_MENU_ROW+1, 37}, "whitening:", &gfsk_flrc_whit_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1189 { {FIRST_CHIP_MENU_ROW+1, 57}, "crcInit:", &gfsk_flrc_crcinit_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1190 { {FIRST_CHIP_MENU_ROW+1, 72}, "poly:", &gfsk_flrc_crcpoly_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1191
Wayne Roberts 1:0817a150122b 1192 { {FIRST_CHIP_MENU_ROW+2, 1}, "sync1 ", &gfsk_flrc_sync1en_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1193 { {FIRST_CHIP_MENU_ROW+2, 15}, NULL, &gfsk_flrc_sync1_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1194 { {FIRST_CHIP_MENU_ROW+2, 27}, "sync2 ", &gfsk_flrc_sync2en_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1195 { {FIRST_CHIP_MENU_ROW+2, 41}, NULL, &gfsk_flrc_sync2_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1196 { {FIRST_CHIP_MENU_ROW+2, 53}, "sync3 ", &gfsk_flrc_sync3en_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1197 { {FIRST_CHIP_MENU_ROW+2, 65}, NULL, &gfsk_flrc_sync3_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1198
Wayne Roberts 1:0817a150122b 1199 { {0, 0}, NULL, NULL }
Wayne Roberts 1:0817a150122b 1200 };
Wayne Roberts 1:0817a150122b 1201
Wayne Roberts 1:0817a150122b 1202 static const char* flrc_bpsbw[] = {
Wayne Roberts 1:0817a150122b 1203 "2.6",
Wayne Roberts 1:0817a150122b 1204 "2.08",
Wayne Roberts 1:0817a150122b 1205 "1.3Mb/s 1.2MHz",
Wayne Roberts 1:0817a150122b 1206 "1.04Mb/s 1.2MHz",
Wayne Roberts 1:0817a150122b 1207 "0.65Mb/s 0.6MHz",
Wayne Roberts 1:0817a150122b 1208 "0.52Mb/s 0.6MHz",
Wayne Roberts 1:0817a150122b 1209 "0.325Mb/s 0.3MHz",
Wayne Roberts 1:0817a150122b 1210 "0.26Mb/s 0.3MHz",
Wayne Roberts 1:0817a150122b 1211 NULL
Wayne Roberts 1:0817a150122b 1212 };
Wayne Roberts 1:0817a150122b 1213
Wayne Roberts 2:ea9245bb1c53 1214 const dropdown_item_t Radio::flrc_bitrate_item = { _ITEM_DROPDOWN, flrc_bpsbw, flrc_bpsbw, gfsk_flrc_bpsbw_read, gfsk_flrc_bpsbw_write};
Wayne Roberts 1:0817a150122b 1215
Wayne Roberts 1:0817a150122b 1216 static const char* flrc_crs[] = {
Wayne Roberts 1:0817a150122b 1217 "1/2",
Wayne Roberts 1:0817a150122b 1218 "3/4",
Wayne Roberts 1:0817a150122b 1219 "1 ",
Wayne Roberts 1:0817a150122b 1220 NULL
Wayne Roberts 1:0817a150122b 1221 };
Wayne Roberts 2:ea9245bb1c53 1222 unsigned Radio::flrc_cr_read(bool fw)
Wayne Roberts 1:0817a150122b 1223 {
Wayne Roberts 1:0817a150122b 1224 PktBitStreamCtrl_t PktBitStreamCtrl;
Wayne Roberts 1:0817a150122b 1225 PktBitStreamCtrl.octet = radio.readReg(REG_ADDR_PKT_BITSTREAM_CTRL, 1);
Wayne Roberts 1:0817a150122b 1226
Wayne Roberts 1:0817a150122b 1227 mpFLRC.flrc.CodingRate = PktBitStreamCtrl.octet & 0x06; // PktBitStreamCtrl.bits.flora_coding_rate
Wayne Roberts 1:0817a150122b 1228
Wayne Roberts 1:0817a150122b 1229 return PktBitStreamCtrl.bits.flora_coding_rate;
Wayne Roberts 1:0817a150122b 1230 }
Wayne Roberts 1:0817a150122b 1231
Wayne Roberts 2:ea9245bb1c53 1232 menuMode_e Radio::flrc_cr_write(unsigned sidx)
Wayne Roberts 1:0817a150122b 1233 {
Wayne Roberts 1:0817a150122b 1234 mpFLRC.flrc.CodingRate = sidx << 1;
Wayne Roberts 1:0817a150122b 1235 radio.xfer(OPCODE_SET_MODULATION_PARAMS, 3, 0, mpFLRC.buf);
Wayne Roberts 1:0817a150122b 1236 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 1237 }
Wayne Roberts 1:0817a150122b 1238
Wayne Roberts 2:ea9245bb1c53 1239 const dropdown_item_t Radio::flrc_cr_item = { _ITEM_DROPDOWN, flrc_crs, flrc_crs, flrc_cr_read, flrc_cr_write};
Wayne Roberts 1:0817a150122b 1240
Wayne Roberts 1:0817a150122b 1241 static const char* flrc_syncLens[] = {
Wayne Roberts 1:0817a150122b 1242 "SYNC OFF ",
Wayne Roberts 1:0817a150122b 1243 "16BIT SYNC",
Wayne Roberts 1:0817a150122b 1244 "32BIT SYNC",
Wayne Roberts 1:0817a150122b 1245 NULL
Wayne Roberts 1:0817a150122b 1246 };
Wayne Roberts 1:0817a150122b 1247
Wayne Roberts 2:ea9245bb1c53 1248 unsigned Radio::flrc_synclen_read(bool fw)
Wayne Roberts 1:0817a150122b 1249 {
Wayne Roberts 1:0817a150122b 1250 PktCtrl1_t PktCtrl1;
Wayne Roberts 1:0817a150122b 1251 PktCtrl1.octet = radio.readReg(REG_ADDR_PKTCTRL1, 1);
Wayne Roberts 1:0817a150122b 1252 ppFLRC.gfskFLRC.SyncWordLength = PktCtrl1.octet & 0x06;
Wayne Roberts 1:0817a150122b 1253 if (ppFLRC.gfskFLRC.SyncWordLength == 0x06) {
Wayne Roberts 1:0817a150122b 1254 ppFLRC.gfskFLRC.SyncWordLength = FLRC_SYNC_WORD_LEN_P32S;
Wayne Roberts 1:0817a150122b 1255 return 2;
Wayne Roberts 1:0817a150122b 1256 }
Wayne Roberts 1:0817a150122b 1257
Wayne Roberts 1:0817a150122b 1258 return PktCtrl1.flrc.sync_adrs_len;
Wayne Roberts 1:0817a150122b 1259 }
Wayne Roberts 1:0817a150122b 1260
Wayne Roberts 2:ea9245bb1c53 1261 menuMode_e Radio::flrc_synclen_write(unsigned sidx)
Wayne Roberts 1:0817a150122b 1262 {
Wayne Roberts 1:0817a150122b 1263 ppFLRC.gfskFLRC.SyncWordLength = sidx << 1;
Wayne Roberts 1:0817a150122b 1264 radio.xfer(OPCODE_SET_PACKET_PARAMS, 7, 0, ppFLRC.buf);
Wayne Roberts 1:0817a150122b 1265 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 1266 }
Wayne Roberts 1:0817a150122b 1267
Wayne Roberts 2:ea9245bb1c53 1268 const dropdown_item_t Radio::flrc_synclen_item = { _ITEM_DROPDOWN, flrc_syncLens, flrc_syncLens, flrc_synclen_read, flrc_synclen_write};
Wayne Roberts 1:0817a150122b 1269
Wayne Roberts 1:0817a150122b 1270
Wayne Roberts 1:0817a150122b 1271 const menu_t Radio::flrc_menu[] = {
Wayne Roberts 1:0817a150122b 1272 { {FIRST_CHIP_MENU_ROW, 1}, NULL, &flrc_bitrate_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1273 { {FIRST_CHIP_MENU_ROW, 20}, "cr:", &flrc_cr_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1274 { {FIRST_CHIP_MENU_ROW, 27}, "BT:", &gfsk_flrc_bt_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1275 { {FIRST_CHIP_MENU_ROW, 34}, "PreambleLength:", &gfsk_flrc_preamble_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1276 { {FIRST_CHIP_MENU_ROW, 52}, "SyncLength:", &flrc_synclen_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1277
Wayne Roberts 1:0817a150122b 1278 { {FIRST_CHIP_MENU_ROW+1, 1}, "Length:", &gfsk_flrc_fixvar_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1279 { {FIRST_CHIP_MENU_ROW+1, 18}, "crcLength:", &gfsk_flrc_crclen_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1280 { {FIRST_CHIP_MENU_ROW+1, 38}, "whitening:", &gfsk_flrc_whit_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1281 { {FIRST_CHIP_MENU_ROW+1, 58}, "crcInit:", &gfsk_flrc_crcinit_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1282 { {FIRST_CHIP_MENU_ROW+1, 73}, "poly:", &gfsk_flrc_crcpoly_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1283
Wayne Roberts 1:0817a150122b 1284 { {FIRST_CHIP_MENU_ROW+2, 1}, "sync1 ", &gfsk_flrc_sync1en_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1285 { {FIRST_CHIP_MENU_ROW+2, 12}, NULL, &gfsk_flrc_sync1_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1286 { {FIRST_CHIP_MENU_ROW+2, 24}, "sync2 ", &gfsk_flrc_sync2en_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1287 { {FIRST_CHIP_MENU_ROW+2, 35}, NULL, &gfsk_flrc_sync2_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1288 { {FIRST_CHIP_MENU_ROW+2, 47}, "sync3 ", &gfsk_flrc_sync3en_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1289 { {FIRST_CHIP_MENU_ROW+2, 59}, NULL, &gfsk_flrc_sync3_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1290
Wayne Roberts 1:0817a150122b 1291 { {0, 0}, NULL, NULL }
Wayne Roberts 1:0817a150122b 1292 };
Wayne Roberts 1:0817a150122b 1293
Wayne Roberts 1:0817a150122b 1294 static const char* lora_bws[] = {
Wayne Roberts 1:0817a150122b 1295 " 50KHz", // 0
Wayne Roberts 1:0817a150122b 1296 " 100KHz", // 1
Wayne Roberts 1:0817a150122b 1297 " 200KHz", // 2
Wayne Roberts 1:0817a150122b 1298 " 400KHz", // 3
Wayne Roberts 1:0817a150122b 1299 " 800KHz", // 4
Wayne Roberts 1:0817a150122b 1300 "1600KHz", // 5
Wayne Roberts 1:0817a150122b 1301 NULL
Wayne Roberts 1:0817a150122b 1302 };
Wayne Roberts 1:0817a150122b 1303
Wayne Roberts 1:0817a150122b 1304 unsigned Radio::lora_bw_read(bool fw)
Wayne Roberts 1:0817a150122b 1305 {
Wayne Roberts 1:0817a150122b 1306 LoRaPktPar0_t LoRaPktPar0;
Wayne Roberts 1:0817a150122b 1307 LoRaPktPar0.octet = radio.readReg(REG_ADDR_LORA_PKTPAR0, 1);
Wayne Roberts 1:0817a150122b 1308
Wayne Roberts 1:0817a150122b 1309 return LoRaPktPar0.bits.modem_bw;
Wayne Roberts 1:0817a150122b 1310 }
Wayne Roberts 1:0817a150122b 1311
Wayne Roberts 1:0817a150122b 1312 menuMode_e Radio::lora_bw_write(unsigned sidx)
Wayne Roberts 1:0817a150122b 1313 {
Wayne Roberts 1:0817a150122b 1314 switch (sidx) {
Wayne Roberts 1:0817a150122b 1315 case 0: mpLORA.lora.bandwidth = LORA_BW_50; break;
Wayne Roberts 1:0817a150122b 1316 case 1: mpLORA.lora.bandwidth = LORA_BW_100; break;
Wayne Roberts 1:0817a150122b 1317 case 2: mpLORA.lora.bandwidth = LORA_BW_200; break;
Wayne Roberts 1:0817a150122b 1318 case 3: mpLORA.lora.bandwidth = LORA_BW_400; break;
Wayne Roberts 1:0817a150122b 1319 case 4: mpLORA.lora.bandwidth = LORA_BW_800; break;
Wayne Roberts 1:0817a150122b 1320 case 5: mpLORA.lora.bandwidth = LORA_BW_1600; break;
Wayne Roberts 1:0817a150122b 1321 }
Wayne Roberts 1:0817a150122b 1322 radio.xfer(OPCODE_SET_MODULATION_PARAMS, 3, 0, mpLORA.buf);
Wayne Roberts 1:0817a150122b 1323
Wayne Roberts 1:0817a150122b 1324 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 1325 }
Wayne Roberts 1:0817a150122b 1326
Wayne Roberts 1:0817a150122b 1327 const dropdown_item_t Radio::lora_bw_item = { _ITEM_DROPDOWN, lora_bws, lora_bws, lora_bw_read, lora_bw_write};
Wayne Roberts 1:0817a150122b 1328
Wayne Roberts 1:0817a150122b 1329 void Radio::lora_sf_print()
Wayne Roberts 1:0817a150122b 1330 {
Wayne Roberts 1:0817a150122b 1331 LoRaPktPar0_t LoRaPktPar0;
Wayne Roberts 1:0817a150122b 1332 LoRaPktPar0.octet = radio.readReg(REG_ADDR_LORA_PKTPAR0, 1);
Wayne Roberts 1:0817a150122b 1333
Wayne Roberts 1:0817a150122b 1334 pc.printf("%u", LoRaPktPar0.bits.modem_sf);
Wayne Roberts 1:0817a150122b 1335 }
Wayne Roberts 1:0817a150122b 1336
Wayne Roberts 1:0817a150122b 1337 bool Radio::lora_sf_write(const char* str)
Wayne Roberts 1:0817a150122b 1338 {
Wayne Roberts 1:0817a150122b 1339 unsigned n;
Wayne Roberts 1:0817a150122b 1340 if (sscanf(str, "%u", &n) == 1) {
Wayne Roberts 1:0817a150122b 1341 mpLORA.lora.spreadingFactor = n << 4;
Wayne Roberts 1:0817a150122b 1342 radio.xfer(OPCODE_SET_MODULATION_PARAMS, 3, 0, mpLORA.buf);
Wayne Roberts 1:0817a150122b 1343 }
Wayne Roberts 1:0817a150122b 1344 return false;
Wayne Roberts 1:0817a150122b 1345 }
Wayne Roberts 1:0817a150122b 1346
Wayne Roberts 1:0817a150122b 1347 const value_item_t Radio::lora_sf_item = { _ITEM_VALUE, 3, lora_sf_print, lora_sf_write };
Wayne Roberts 1:0817a150122b 1348
Wayne Roberts 1:0817a150122b 1349 static const char* lora_crs[] = {
Wayne Roberts 1:0817a150122b 1350 "4/5 ",
Wayne Roberts 1:0817a150122b 1351 "4/6 ",
Wayne Roberts 1:0817a150122b 1352 "4/7 ",
Wayne Roberts 1:0817a150122b 1353 "4/8 ",
Wayne Roberts 1:0817a150122b 1354 "4/5 LI",
Wayne Roberts 1:0817a150122b 1355 "4/6 LI",
Wayne Roberts 1:0817a150122b 1356 "4/7 LI",
Wayne Roberts 1:0817a150122b 1357 NULL
Wayne Roberts 1:0817a150122b 1358 };
Wayne Roberts 1:0817a150122b 1359
Wayne Roberts 2:ea9245bb1c53 1360 unsigned Radio::lora_cr_read(bool fw)
Wayne Roberts 1:0817a150122b 1361 {
Wayne Roberts 1:0817a150122b 1362 LoRaPktPar1_t LoRaPktPar1;
Wayne Roberts 1:0817a150122b 1363 LoRaPktPar1.octet = radio.readReg(REG_ADDR_LORA_PKTPAR1, 1);
Wayne Roberts 1:0817a150122b 1364 mpLORA.lora.codingRate = LoRaPktPar1.bits.coding_rate;
Wayne Roberts 1:0817a150122b 1365 return LoRaPktPar1.bits.coding_rate;
Wayne Roberts 1:0817a150122b 1366 }
Wayne Roberts 1:0817a150122b 1367
Wayne Roberts 2:ea9245bb1c53 1368 menuMode_e Radio::lora_cr_write(unsigned sidx)
Wayne Roberts 1:0817a150122b 1369 {
Wayne Roberts 1:0817a150122b 1370 mpLORA.lora.codingRate = sidx;
Wayne Roberts 1:0817a150122b 1371 radio.xfer(OPCODE_SET_MODULATION_PARAMS, 3, 0, mpLORA.buf);
Wayne Roberts 1:0817a150122b 1372 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 1373 }
Wayne Roberts 1:0817a150122b 1374
Wayne Roberts 2:ea9245bb1c53 1375 const dropdown_item_t Radio::lora_cr_item = { _ITEM_DROPDOWN, lora_crs, lora_crs, lora_cr_read, lora_cr_write};
Wayne Roberts 1:0817a150122b 1376
Wayne Roberts 1:0817a150122b 1377 void Radio::lora_pblLen_print()
Wayne Roberts 1:0817a150122b 1378 {
Wayne Roberts 1:0817a150122b 1379 LoRaPreambleReg_t LoRaPreambleReg;
Wayne Roberts 1:0817a150122b 1380 LoRaPreambleReg.octet = radio.readReg(REG_ADDR_LORA_PREAMBLE, 1);
Wayne Roberts 1:0817a150122b 1381 ppLORA.lora.PreambleLength = (1 << LoRaPreambleReg.bits.preamble_symb_nb_exp) * LoRaPreambleReg.bits.preamble_symb1_nb;
Wayne Roberts 1:0817a150122b 1382 pc.printf("%u", ppLORA.lora.PreambleLength);
Wayne Roberts 1:0817a150122b 1383 }
Wayne Roberts 1:0817a150122b 1384
Wayne Roberts 1:0817a150122b 1385 bool Radio::lora_pblLen_write(const char* str)
Wayne Roberts 1:0817a150122b 1386 {
Wayne Roberts 1:0817a150122b 1387 unsigned val, exp, mant;
Wayne Roberts 1:0817a150122b 1388 sscanf(str, "%u", &val);
Wayne Roberts 1:0817a150122b 1389
Wayne Roberts 1:0817a150122b 1390 for (exp = 0; exp < 16; exp++) {
Wayne Roberts 1:0817a150122b 1391 mant = val / (1 << exp);
Wayne Roberts 1:0817a150122b 1392 if (mant < 16)
Wayne Roberts 1:0817a150122b 1393 break;
Wayne Roberts 1:0817a150122b 1394 }
Wayne Roberts 1:0817a150122b 1395
Wayne Roberts 1:0817a150122b 1396 ppLORA.lora.PreambleLength = (exp << 4) + mant;
Wayne Roberts 1:0817a150122b 1397 radio.xfer(OPCODE_SET_PACKET_PARAMS, 5, 0, ppLORA.buf);
Wayne Roberts 1:0817a150122b 1398
Wayne Roberts 1:0817a150122b 1399 return false;
Wayne Roberts 1:0817a150122b 1400 }
Wayne Roberts 1:0817a150122b 1401
Wayne Roberts 1:0817a150122b 1402 const value_item_t Radio::lora_pblLen_item = { _ITEM_VALUE, 5, lora_pblLen_print, lora_pblLen_write};
Wayne Roberts 1:0817a150122b 1403
Wayne Roberts 1:0817a150122b 1404 bool Radio::lora_fixlen_read()
Wayne Roberts 1:0817a150122b 1405 {
Wayne Roberts 1:0817a150122b 1406 LoRaPktPar1_t LoRaPktPar1;
Wayne Roberts 1:0817a150122b 1407 LoRaPktPar1.octet = radio.readReg(REG_ADDR_LORA_PKTPAR1, 1);
Wayne Roberts 1:0817a150122b 1408 ppLORA.lora.HeaderType = LoRaPktPar1.bits.implicit_header ? IMPLICIT_HEADER : EXPLICIT_HEADER;
Wayne Roberts 1:0817a150122b 1409 return LoRaPktPar1.bits.implicit_header;
Wayne Roberts 1:0817a150122b 1410 }
Wayne Roberts 1:0817a150122b 1411
Wayne Roberts 1:0817a150122b 1412 bool Radio::lora_fixlen_push()
Wayne Roberts 1:0817a150122b 1413 {
Wayne Roberts 1:0817a150122b 1414 if (ppLORA.lora.HeaderType == EXPLICIT_HEADER)
Wayne Roberts 1:0817a150122b 1415 ppLORA.lora.HeaderType = IMPLICIT_HEADER;
Wayne Roberts 1:0817a150122b 1416 else
Wayne Roberts 1:0817a150122b 1417 ppLORA.lora.HeaderType = EXPLICIT_HEADER;
Wayne Roberts 1:0817a150122b 1418
Wayne Roberts 1:0817a150122b 1419 radio.xfer(OPCODE_SET_PACKET_PARAMS, 5, 0, ppLORA.buf);
Wayne Roberts 1:0817a150122b 1420 return ppLORA.lora.HeaderType == EXPLICIT_HEADER;
Wayne Roberts 1:0817a150122b 1421 }
Wayne Roberts 1:0817a150122b 1422
Wayne Roberts 1:0817a150122b 1423 const toggle_item_t Radio::lora_fixlen_item = { _ITEM_TOGGLE,
Wayne Roberts 1:0817a150122b 1424 "EXPLICIT", // 0
Wayne Roberts 1:0817a150122b 1425 "IMPLICIT", // 1
Wayne Roberts 1:0817a150122b 1426 lora_fixlen_read, lora_fixlen_push
Wayne Roberts 1:0817a150122b 1427 };
Wayne Roberts 1:0817a150122b 1428
Wayne Roberts 1:0817a150122b 1429 bool Radio::lora_crcon_read()
Wayne Roberts 1:0817a150122b 1430 {
Wayne Roberts 1:0817a150122b 1431 LoRaLrCtl_t LoRaLrCtl;
Wayne Roberts 1:0817a150122b 1432 LoRaLrCtl.octet = radio.readReg(REG_ADDR_LORA_LRCTL, 1);
Wayne Roberts 1:0817a150122b 1433 ppLORA.lora.crc = LoRaLrCtl.octet & 0x20; // LoRaLrCtl.bits.crc_en
Wayne Roberts 1:0817a150122b 1434 return LoRaLrCtl.bits.crc_en;
Wayne Roberts 1:0817a150122b 1435 }
Wayne Roberts 1:0817a150122b 1436
Wayne Roberts 1:0817a150122b 1437 bool Radio::lora_crcon_push()
Wayne Roberts 1:0817a150122b 1438 {
Wayne Roberts 1:0817a150122b 1439 if (ppLORA.lora.crc == LORA_CRC_ENABLE)
Wayne Roberts 1:0817a150122b 1440 ppLORA.lora.crc = LORA_CRC_DISABLE;
Wayne Roberts 1:0817a150122b 1441 else
Wayne Roberts 1:0817a150122b 1442 ppLORA.lora.crc = LORA_CRC_ENABLE;
Wayne Roberts 1:0817a150122b 1443
Wayne Roberts 1:0817a150122b 1444 radio.xfer(OPCODE_SET_PACKET_PARAMS, 5, 0, ppLORA.buf);
Wayne Roberts 1:0817a150122b 1445
Wayne Roberts 1:0817a150122b 1446 return ppLORA.lora.crc == LORA_CRC_ENABLE;
Wayne Roberts 1:0817a150122b 1447 }
Wayne Roberts 1:0817a150122b 1448
Wayne Roberts 1:0817a150122b 1449 const toggle_item_t Radio::lora_crcon_item = { _ITEM_TOGGLE,
Wayne Roberts 1:0817a150122b 1450 "CRC_DISABLE", // 0
Wayne Roberts 1:0817a150122b 1451 "CRC_ENABLE ", // 1
Wayne Roberts 1:0817a150122b 1452 lora_crcon_read, lora_crcon_push
Wayne Roberts 1:0817a150122b 1453 };
Wayne Roberts 1:0817a150122b 1454
Wayne Roberts 1:0817a150122b 1455 bool Radio::lora_iqinv_read()
Wayne Roberts 1:0817a150122b 1456 {
Wayne Roberts 1:0817a150122b 1457 LoRaPktPar1_t LoRaPktPar1;
Wayne Roberts 1:0817a150122b 1458 LoRaPktPar1.octet = radio.readReg(REG_ADDR_LORA_PKTPAR1, 1);
Wayne Roberts 1:0817a150122b 1459 ppLORA.lora.InvertIQ = LoRaPktPar1.bits.rxinvert_iq ? LORA_IQ_STD : LORA_IQ_INVERTED;
Wayne Roberts 1:0817a150122b 1460 return LoRaPktPar1.bits.rxinvert_iq ? 0 : 1;
Wayne Roberts 1:0817a150122b 1461 }
Wayne Roberts 1:0817a150122b 1462
Wayne Roberts 1:0817a150122b 1463 bool Radio::lora_iqinv_push()
Wayne Roberts 1:0817a150122b 1464 {
Wayne Roberts 1:0817a150122b 1465 if (ppLORA.lora.InvertIQ == LORA_IQ_STD)
Wayne Roberts 1:0817a150122b 1466 ppLORA.lora.InvertIQ = LORA_IQ_INVERTED;
Wayne Roberts 1:0817a150122b 1467 else
Wayne Roberts 1:0817a150122b 1468 ppLORA.lora.InvertIQ = LORA_IQ_STD;
Wayne Roberts 1:0817a150122b 1469
Wayne Roberts 1:0817a150122b 1470 radio.xfer(OPCODE_SET_PACKET_PARAMS, 5, 0, ppLORA.buf);
Wayne Roberts 1:0817a150122b 1471
Wayne Roberts 1:0817a150122b 1472 return ppLORA.lora.InvertIQ == LORA_IQ_STD;
Wayne Roberts 1:0817a150122b 1473 }
Wayne Roberts 1:0817a150122b 1474
Wayne Roberts 1:0817a150122b 1475 const toggle_item_t Radio::lora_iqinv_item = { _ITEM_TOGGLE,
Wayne Roberts 1:0817a150122b 1476 "IQ_STD", // 0
Wayne Roberts 1:0817a150122b 1477 "IQ_INV", // 1
Wayne Roberts 1:0817a150122b 1478 lora_iqinv_read, lora_iqinv_push
Wayne Roberts 1:0817a150122b 1479 };
Wayne Roberts 1:0817a150122b 1480
Wayne Roberts 2:ea9245bb1c53 1481 void Radio::cad_push()
Wayne Roberts 2:ea9245bb1c53 1482 {
Wayne Roberts 2:ea9245bb1c53 1483 radio.setCAD();
Wayne Roberts 2:ea9245bb1c53 1484 }
Wayne Roberts 2:ea9245bb1c53 1485
Wayne Roberts 2:ea9245bb1c53 1486 const button_item_t Radio::lora_cad_item = { _ITEM_BUTTON, "CAD", cad_push };
Wayne Roberts 2:ea9245bb1c53 1487
Wayne Roberts 2:ea9245bb1c53 1488 static const char* lora_cadsymbs[] = {
Wayne Roberts 2:ea9245bb1c53 1489 " 1",
Wayne Roberts 2:ea9245bb1c53 1490 " 2",
Wayne Roberts 2:ea9245bb1c53 1491 " 4",
Wayne Roberts 2:ea9245bb1c53 1492 " 8",
Wayne Roberts 2:ea9245bb1c53 1493 "16",
Wayne Roberts 2:ea9245bb1c53 1494 NULL
Wayne Roberts 2:ea9245bb1c53 1495 };
Wayne Roberts 2:ea9245bb1c53 1496
Wayne Roberts 2:ea9245bb1c53 1497 unsigned Radio::lora_cadsymbs_read(bool forWriting)
Wayne Roberts 2:ea9245bb1c53 1498 {
Wayne Roberts 2:ea9245bb1c53 1499 unsigned n = radio.readReg(REG_ADDR_LORA_FE_GAIN, 1);
Wayne Roberts 2:ea9245bb1c53 1500 return n >> 5;
Wayne Roberts 2:ea9245bb1c53 1501 }
Wayne Roberts 2:ea9245bb1c53 1502
Wayne Roberts 2:ea9245bb1c53 1503 menuMode_e Radio::lora_cadsymbs_write(unsigned sidx)
Wayne Roberts 2:ea9245bb1c53 1504 {
Wayne Roberts 2:ea9245bb1c53 1505 uint8_t buf = sidx << 5;
Wayne Roberts 2:ea9245bb1c53 1506 radio.xfer(OPCODE_SET_CAD_PARAM, 1, 0, &buf);
Wayne Roberts 2:ea9245bb1c53 1507 return MENUMODE_REDRAW;
Wayne Roberts 2:ea9245bb1c53 1508 }
Wayne Roberts 2:ea9245bb1c53 1509
Wayne Roberts 2:ea9245bb1c53 1510 const dropdown_item_t Radio::lora_cadsymbs_item = { _ITEM_DROPDOWN, lora_cadsymbs, lora_cadsymbs, lora_cadsymbs_read, lora_cadsymbs_write};
Wayne Roberts 2:ea9245bb1c53 1511
Wayne Roberts 1:0817a150122b 1512 const menu_t Radio::lora_menu[] = {
Wayne Roberts 1:0817a150122b 1513 { {FIRST_CHIP_MENU_ROW , 1}, NULL, &lora_bw_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1514 { {FIRST_CHIP_MENU_ROW , 12}, "sf:", &lora_sf_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1515 { {FIRST_CHIP_MENU_ROW , 20}, "cr:", &lora_cr_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1516 { {FIRST_CHIP_MENU_ROW , 30}, "PreambleLength:", &lora_pblLen_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1517 { {FIRST_CHIP_MENU_ROW+1, 1}, NULL, &lora_fixlen_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1518 { {FIRST_CHIP_MENU_ROW+1, 12}, NULL, &lora_crcon_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1519 { {FIRST_CHIP_MENU_ROW+1, 25}, NULL, &lora_iqinv_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 2:ea9245bb1c53 1520
Wayne Roberts 2:ea9245bb1c53 1521 { {FIRST_CHIP_MENU_ROW+2, 1}, NULL, &lora_cad_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 2:ea9245bb1c53 1522 { {FIRST_CHIP_MENU_ROW+2, 5}, "symbols:", &lora_cadsymbs_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 2:ea9245bb1c53 1523
Wayne Roberts 1:0817a150122b 1524 { {0, 0}, NULL, NULL }
Wayne Roberts 1:0817a150122b 1525 };
Wayne Roberts 1:0817a150122b 1526
Wayne Roberts 1:0817a150122b 1527 const menu_t Radio::common_menu[] = {
Wayne Roberts 1:0817a150122b 1528 { {0, 0}, NULL, NULL }
Wayne Roberts 1:0817a150122b 1529 };
Wayne Roberts 1:0817a150122b 1530
Wayne Roberts 1:0817a150122b 1531 const menu_t* Radio::get_modem_menu()
Wayne Roberts 1:0817a150122b 1532 {
Wayne Roberts 1:0817a150122b 1533 pktType = radio.getPacketType();
Wayne Roberts 1:0817a150122b 1534
Wayne Roberts 1:0817a150122b 1535 if (pktType == PACKET_TYPE_RANGING || pktType == PACKET_TYPE_LORA) {
Wayne Roberts 1:0817a150122b 1536 return lora_menu;
Wayne Roberts 1:0817a150122b 1537 } else if (pktType == PACKET_TYPE_FLRC) {
Wayne Roberts 1:0817a150122b 1538 return flrc_menu;
Wayne Roberts 1:0817a150122b 1539 } else if (pktType == PACKET_TYPE_GFSK) {
Wayne Roberts 1:0817a150122b 1540 return gfsk_menu;
Wayne Roberts 1:0817a150122b 1541 }
Wayne Roberts 1:0817a150122b 1542
Wayne Roberts 1:0817a150122b 1543 return NULL;
Wayne Roberts 1:0817a150122b 1544 }
Wayne Roberts 1:0817a150122b 1545
Wayne Roberts 1:0817a150122b 1546 const menu_t* Radio::get_modem_sub_menu() { return NULL; }
Wayne Roberts 1:0817a150122b 1547
Wayne Roberts 1:0817a150122b 1548 bool Radio::service(int8_t statusRow)
Wayne Roberts 1:0817a150122b 1549 {
Wayne Roberts 1:0817a150122b 1550 static pktStatus_t prevPktStatus;
Wayne Roberts 1:0817a150122b 1551 static IrqFlags_t prevIrqFlags;
Wayne Roberts 1:0817a150122b 1552 IrqFlags_t irqFlags;
Wayne Roberts 1:0817a150122b 1553 bool ret = false;
Wayne Roberts 1:0817a150122b 1554 static us_timestamp_t prev_now;
Wayne Roberts 1:0817a150122b 1555 us_timestamp_t now = lpt.read_us();
Wayne Roberts 1:0817a150122b 1556
Wayne Roberts 1:0817a150122b 1557 radio.service();
Wayne Roberts 1:0817a150122b 1558
Wayne Roberts 1:0817a150122b 1559 if (statusRow > 0 && now-prev_now > 50000) {
Wayne Roberts 1:0817a150122b 1560 int cmp = 0;
Wayne Roberts 1:0817a150122b 1561 pktStatus_t pktStatus;
Wayne Roberts 1:0817a150122b 1562 uint8_t buf[6];
Wayne Roberts 1:0817a150122b 1563 radio.xfer(OPCODE_GET_IRQ_STATUS, 0, 3, buf);
Wayne Roberts 1:0817a150122b 1564 irqFlags.word = buf[1] << 8;
Wayne Roberts 1:0817a150122b 1565 irqFlags.word |= buf[2];
Wayne Roberts 1:0817a150122b 1566
Wayne Roberts 1:0817a150122b 1567 if (rx_led == LED_ON) {
Wayne Roberts 1:0817a150122b 1568 uint8_t slen;
Wayne Roberts 1:0817a150122b 1569 if (pktType == PACKET_TYPE_LORA || pktType == PACKET_TYPE_RANGING)
Wayne Roberts 1:0817a150122b 1570 slen = 3;
Wayne Roberts 1:0817a150122b 1571 else
Wayne Roberts 1:0817a150122b 1572 slen = 6;
Wayne Roberts 1:0817a150122b 1573
Wayne Roberts 1:0817a150122b 1574 radio.xfer(OPCODE_GET_PACKET_STATUS, 0, slen, pktStatus.buf);
Wayne Roberts 2:ea9245bb1c53 1575 cmp = memcmp(prevPktStatus.buf, pktStatus.buf, slen);
Wayne Roberts 1:0817a150122b 1576 }
Wayne Roberts 1:0817a150122b 1577
Wayne Roberts 1:0817a150122b 1578 if (irqFlags.word != prevIrqFlags.word || cmp) {
Wayne Roberts 1:0817a150122b 1579 pc.printf("\e[%u;1f", statusRow); // set (force) cursor to row;column
Wayne Roberts 1:0817a150122b 1580
Wayne Roberts 1:0817a150122b 1581 if (cmp) {
Wayne Roberts 1:0817a150122b 1582 if (pktType == PACKET_TYPE_FLRC || pktType == PACKET_TYPE_BLE || pktType == PACKET_TYPE_GFSK) {
Wayne Roberts 1:0817a150122b 1583 if (pktStatus.ble_gfsk_flrc.errors.SyncError)
Wayne Roberts 1:0817a150122b 1584 pc.printf("SyncError ");
Wayne Roberts 1:0817a150122b 1585 if (pktStatus.ble_gfsk_flrc.errors.LengthError)
Wayne Roberts 1:0817a150122b 1586 pc.printf("LengthError ");
Wayne Roberts 1:0817a150122b 1587 if (pktStatus.ble_gfsk_flrc.errors.CrcError)
Wayne Roberts 1:0817a150122b 1588 pc.printf("CrcError ");
Wayne Roberts 1:0817a150122b 1589 if (pktStatus.ble_gfsk_flrc.errors.AbortErr)
Wayne Roberts 1:0817a150122b 1590 pc.printf("AbortErr ");
Wayne Roberts 1:0817a150122b 1591 if (pktStatus.ble_gfsk_flrc.errors.headerReceived)
Wayne Roberts 1:0817a150122b 1592 pc.printf("headerReceived ");
Wayne Roberts 1:0817a150122b 1593 if (pktStatus.ble_gfsk_flrc.errors.packetReceived)
Wayne Roberts 1:0817a150122b 1594 pc.printf("packetReceived ");
Wayne Roberts 1:0817a150122b 1595 if (pktStatus.ble_gfsk_flrc.errors.pktCtrlBusy)
Wayne Roberts 1:0817a150122b 1596 pc.printf("pktCtrlBusy ");
Wayne Roberts 1:0817a150122b 1597 }
Wayne Roberts 1:0817a150122b 1598 memcpy(prevPktStatus.buf, pktStatus.buf, sizeof(pktStatus_t));
Wayne Roberts 1:0817a150122b 1599 pc.printf(" | ");
Wayne Roberts 1:0817a150122b 1600 }
Wayne Roberts 1:0817a150122b 1601
Wayne Roberts 1:0817a150122b 1602 if (irqFlags.bits.TxDone)
Wayne Roberts 1:0817a150122b 1603 pc.printf("TxDone ");
Wayne Roberts 1:0817a150122b 1604 if (irqFlags.bits.RxDone)
Wayne Roberts 1:0817a150122b 1605 pc.printf("RxDone ");
Wayne Roberts 1:0817a150122b 1606 if (irqFlags.bits.SyncWordValid)
Wayne Roberts 1:0817a150122b 1607 pc.printf("SyncWordValid ");
Wayne Roberts 1:0817a150122b 1608 if (irqFlags.bits.SyncWordError)
Wayne Roberts 1:0817a150122b 1609 pc.printf("SyncWordError ");
Wayne Roberts 1:0817a150122b 1610 if (irqFlags.bits.HeaderValid)
Wayne Roberts 1:0817a150122b 1611 pc.printf("HeaderValid ");
Wayne Roberts 1:0817a150122b 1612 if (irqFlags.bits.HeaderError)
Wayne Roberts 1:0817a150122b 1613 pc.printf("HeaderError ");
Wayne Roberts 1:0817a150122b 1614 if (irqFlags.bits.CrcError)
Wayne Roberts 1:0817a150122b 1615 pc.printf("CrcError ");
Wayne Roberts 1:0817a150122b 1616 if (irqFlags.bits.RangingSlaveResponseDone)
Wayne Roberts 1:0817a150122b 1617 pc.printf("RangingSlaveResponseDone ");
Wayne Roberts 1:0817a150122b 1618 if (irqFlags.bits.RangingSlaveRequestDiscard)
Wayne Roberts 1:0817a150122b 1619 pc.printf("RangingSlaveRequestDiscard ");
Wayne Roberts 1:0817a150122b 1620 if (irqFlags.bits.RangingMasterResultValid)
Wayne Roberts 1:0817a150122b 1621 pc.printf("RangingMasterResultValid ");
Wayne Roberts 1:0817a150122b 1622 if (irqFlags.bits.RangingMasterTimeout)
Wayne Roberts 1:0817a150122b 1623 pc.printf("RangingMasterTimeout ");
Wayne Roberts 1:0817a150122b 1624 if (irqFlags.bits.RangingMasterRequestValid)
Wayne Roberts 1:0817a150122b 1625 pc.printf("RangingMasterRequestValid ");
Wayne Roberts 1:0817a150122b 1626 if (irqFlags.bits.CadDone)
Wayne Roberts 1:0817a150122b 1627 pc.printf("CadDone ");
Wayne Roberts 1:0817a150122b 1628 if (irqFlags.bits.CadDetected)
Wayne Roberts 1:0817a150122b 1629 pc.printf("CadDetected ");
Wayne Roberts 1:0817a150122b 1630 if (irqFlags.bits.RxTxTimeout)
Wayne Roberts 1:0817a150122b 1631 pc.printf("RxTxTimeout ");
Wayne Roberts 1:0817a150122b 1632 if (irqFlags.bits.PreambleDetected)
Wayne Roberts 1:0817a150122b 1633 pc.printf("PreambleDetected ");
Wayne Roberts 1:0817a150122b 1634
Wayne Roberts 1:0817a150122b 1635 pc.printf("\e[K");
Wayne Roberts 1:0817a150122b 1636 ret = true;
Wayne Roberts 1:0817a150122b 1637
Wayne Roberts 1:0817a150122b 1638 prevIrqFlags.word = irqFlags.word;
Wayne Roberts 1:0817a150122b 1639 }
Wayne Roberts 1:0817a150122b 1640
Wayne Roberts 1:0817a150122b 1641 prev_now = now;
Wayne Roberts 1:0817a150122b 1642 }
Wayne Roberts 1:0817a150122b 1643
Wayne Roberts 1:0817a150122b 1644 return ret;
Wayne Roberts 1:0817a150122b 1645 }
Wayne Roberts 1:0817a150122b 1646
Wayne Roberts 1:0817a150122b 1647 void Radio::Rx()
Wayne Roberts 1:0817a150122b 1648 {
Wayne Roberts 1:0817a150122b 1649 radio.start_rx(0);
Wayne Roberts 1:0817a150122b 1650 }
Wayne Roberts 1:0817a150122b 1651
Wayne Roberts 1:0817a150122b 1652 void Radio::setFS()
Wayne Roberts 1:0817a150122b 1653 {
Wayne Roberts 1:0817a150122b 1654 radio.setFS();
Wayne Roberts 1:0817a150122b 1655 }
Wayne Roberts 1:0817a150122b 1656
Wayne Roberts 1:0817a150122b 1657 void Radio::test() { }
Wayne Roberts 1:0817a150122b 1658
Wayne Roberts 1:0817a150122b 1659 #endif /* ..SX126x_H */