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 SX126x_H
Wayne Roberts 1:0817a150122b 3
Wayne Roberts 1:0817a150122b 4 #ifdef TARGET_FF_ARDUINO
Wayne Roberts 1:0817a150122b 5 SPI spi(D11, D12, D13); // mosi, miso, sclk
Wayne Roberts 1:0817a150122b 6 //spi, nss, busy, dio1
Wayne Roberts 1:0817a150122b 7 SX126x Radio::radio(spi, D7, D3, D5);
Wayne Roberts 1:0817a150122b 8
Wayne Roberts 1:0817a150122b 9 DigitalOut antswPower(D8);
Wayne Roberts 1:0817a150122b 10 AnalogIn xtalSel(A3);
Wayne Roberts 1:0817a150122b 11
Wayne Roberts 1:0817a150122b 12 DigitalIn chipType(A2);
Wayne Roberts 1:0817a150122b 13 #define CHIP_TYPE_SX1262 0
Wayne Roberts 1:0817a150122b 14 #define CHIP_TYPE_SX1261 1
Wayne Roberts 1:0817a150122b 15
Wayne Roberts 1:0817a150122b 16 #define PINNAME_NRST A0
Wayne Roberts 1:0817a150122b 17
Wayne Roberts 1:0817a150122b 18 #define LED_ON 1
Wayne Roberts 1:0817a150122b 19 #define LED_OFF 0
Wayne Roberts 1:0817a150122b 20 DigitalOut tx_led(A4);
Wayne Roberts 1:0817a150122b 21 DigitalOut rx_led(A5);
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 tx_led = LED_OFF;
Wayne Roberts 1:0817a150122b 27 rx_led = LED_OFF;
Wayne Roberts 1:0817a150122b 28 } else if (radio.chipMode == CHIPMODE_TX) {
Wayne Roberts 1:0817a150122b 29 tx_led = LED_ON;
Wayne Roberts 1:0817a150122b 30 rx_led = LED_OFF;
Wayne Roberts 1:0817a150122b 31 } else if (radio.chipMode == CHIPMODE_RX) {
Wayne Roberts 1:0817a150122b 32 tx_led = LED_OFF;
Wayne Roberts 1:0817a150122b 33 rx_led = LED_ON;
Wayne Roberts 1:0817a150122b 34 }
Wayne Roberts 1:0817a150122b 35 }
Wayne Roberts 1:0817a150122b 36 #endif /* TARGET_FF_ARDUINO */
Wayne Roberts 1:0817a150122b 37
Wayne Roberts 1:0817a150122b 38 const char* const Radio::chipNum_str = "SX126x";
Wayne Roberts 1:0817a150122b 39
Wayne Roberts 1:0817a150122b 40 ModulationParams_t Radio::mpFSK, Radio::mpLORA;
Wayne Roberts 1:0817a150122b 41 PacketParams_t Radio::ppFSK, Radio::ppLORA;
Wayne Roberts 1:0817a150122b 42
Wayne Roberts 1:0817a150122b 43 const RadioEvents_t* Radio::RadioEvents;
Wayne Roberts 1:0817a150122b 44 LowPowerTimer Radio::lpt;
Wayne Roberts 1:0817a150122b 45 uint8_t Radio::pktType;
Wayne Roberts 1:0817a150122b 46 uint8_t Radio::bw_idx;
Wayne Roberts 2:ea9245bb1c53 47 uint8_t Radio::cadParams[7];
Wayne Roberts 1:0817a150122b 48
Wayne Roberts 1:0817a150122b 49 const char* opModes[] = {
Wayne Roberts 1:0817a150122b 50 "SLEEP ", // 0
Wayne Roberts 1:0817a150122b 51 "STBY_RC ", // 1
Wayne Roberts 1:0817a150122b 52 "STBY_XOSC", // 2
Wayne Roberts 1:0817a150122b 53 "FS ", // 3
Wayne Roberts 1:0817a150122b 54 "RX ", // 4
Wayne Roberts 1:0817a150122b 55 "TX " // 5
Wayne Roberts 1:0817a150122b 56 };
Wayne Roberts 1:0817a150122b 57
Wayne Roberts 1:0817a150122b 58 void Radio::readChip()
Wayne Roberts 1:0817a150122b 59 {
Wayne Roberts 1:0817a150122b 60 bwSel_t bwSel;
Wayne Roberts 1:0817a150122b 61 shapeCfg_t shapeCfg;
Wayne Roberts 1:0817a150122b 62 unsigned d = radio.readReg(REG_ADDR_BITRATE, 3);
Wayne Roberts 1:0817a150122b 63 pc.printf("%06x:%u->", d ,d);
Wayne Roberts 1:0817a150122b 64 pc.printf("bitrate %ubps\r\n", (32 * XTAL_FREQ_HZ) / d);
Wayne Roberts 1:0817a150122b 65 mpFSK.gfsk.bitrateHi = d >> 16;
Wayne Roberts 1:0817a150122b 66 mpFSK.gfsk.bitrateMid = d >> 8;
Wayne Roberts 1:0817a150122b 67 mpFSK.gfsk.bitrateLo = d;
Wayne Roberts 1:0817a150122b 68
Wayne Roberts 1:0817a150122b 69 d = radio.readReg(REG_ADDR_FREQDEV, 3);
Wayne Roberts 1:0817a150122b 70 pc.printf("fdev %fKHz\r\n", d / KHZ_TO_FRF);
Wayne Roberts 1:0817a150122b 71 mpFSK.gfsk.fdevHi = d >> 16;
Wayne Roberts 1:0817a150122b 72 mpFSK.gfsk.fdevMid = d >> 8;
Wayne Roberts 1:0817a150122b 73 mpFSK.gfsk.fdevLo = d;
Wayne Roberts 1:0817a150122b 74
Wayne Roberts 1:0817a150122b 75 shapeCfg.octet = radio.readReg(REG_ADDR_SHAPECFG, 1);
Wayne Roberts 1:0817a150122b 76 mpFSK.gfsk.PulseShape = shapeCfg.octet;
Wayne Roberts 1:0817a150122b 77
Wayne Roberts 1:0817a150122b 78 bwSel.octet = radio.readReg(REG_ADDR_BWSEL, 1);
Wayne Roberts 1:0817a150122b 79 // GFSK_RX_BW_*
Wayne Roberts 1:0817a150122b 80 pc.printf("bwsSel:%02x\r\n", bwSel.octet);
Wayne Roberts 1:0817a150122b 81 mpFSK.gfsk.bandwidth = bwSel.octet;
Wayne Roberts 1:0817a150122b 82
Wayne Roberts 1:0817a150122b 83 {
Wayne Roberts 1:0817a150122b 84 unsigned n = radio.readReg(REG_ADDR_FSK_PREAMBLE_TXLEN , 2);
Wayne Roberts 1:0817a150122b 85 ppFSK.gfsk.PreambleLengthHi = n << 8; // param1
Wayne Roberts 1:0817a150122b 86 ppFSK.gfsk.PreambleLengthLo = n;// param2
Wayne Roberts 1:0817a150122b 87 }
Wayne Roberts 1:0817a150122b 88
Wayne Roberts 1:0817a150122b 89 {
Wayne Roberts 1:0817a150122b 90 pktCtrl1_t pktCtrl1;
Wayne Roberts 1:0817a150122b 91 pktCtrl1.octet = radio.readReg(REG_ADDR_FSK_PKTCTRL1, 1);
Wayne Roberts 1:0817a150122b 92 ppFSK.gfsk.PreambleDetectorLength = pktCtrl1.octet & 0x07; // param3
Wayne Roberts 1:0817a150122b 93 }
Wayne Roberts 1:0817a150122b 94
Wayne Roberts 1:0817a150122b 95
Wayne Roberts 1:0817a150122b 96 ppFSK.gfsk.SyncWordLength = radio.readReg(REG_ADDR_FSK_SYNC_LEN, 1);// param4
Wayne Roberts 1:0817a150122b 97 ppFSK.gfsk.AddrComp = radio.readReg(REG_ADDR_NODEADDRCOMP, 1);// param5
Wayne Roberts 1:0817a150122b 98
Wayne Roberts 1:0817a150122b 99 {
Wayne Roberts 1:0817a150122b 100 pktCtrl0_t pktCtrl0;
Wayne Roberts 1:0817a150122b 101 pktCtrl0.octet = radio.readReg(REG_ADDR_FSK_PKTCTRL0, 1);
Wayne Roberts 1:0817a150122b 102 ppFSK.gfsk.PacketType = pktCtrl0.bits.pkt_len_format; // param6
Wayne Roberts 1:0817a150122b 103 }
Wayne Roberts 1:0817a150122b 104
Wayne Roberts 1:0817a150122b 105 ppFSK.gfsk.PayloadLength = radio.readReg(REG_ADDR_FSK_PAYLOAD_LEN, 1);// param7
Wayne Roberts 1:0817a150122b 106
Wayne Roberts 1:0817a150122b 107 {
Wayne Roberts 1:0817a150122b 108 pktCtrl2_t pktCtrl2;
Wayne Roberts 1:0817a150122b 109 pktCtrl2.octet = radio.readReg(REG_ADDR_FSK_PKTCTRL2, 1);
Wayne Roberts 1:0817a150122b 110 ppFSK.gfsk.CRCType = pktCtrl2.octet & 0x7; // param8
Wayne Roberts 1:0817a150122b 111 ppFSK.gfsk.Whitening = pktCtrl2.bits.whit_enable; // param9
Wayne Roberts 1:0817a150122b 112 }
Wayne Roberts 1:0817a150122b 113
Wayne Roberts 1:0817a150122b 114 /*******************************/
Wayne Roberts 1:0817a150122b 115
Wayne Roberts 1:0817a150122b 116 {
Wayne Roberts 1:0817a150122b 117 loraConfig0_t conf0;
Wayne Roberts 1:0817a150122b 118 conf0.octet = radio.readReg(REG_ADDR_LORA_CONFIG0, 1);
Wayne Roberts 1:0817a150122b 119 pc.printf("LoRa bw%u sf%u ", conf0.bits.modem_bw, conf0.bits.modem_sf);
Wayne Roberts 1:0817a150122b 120 mpLORA.lora.spreadingFactor = conf0.bits.modem_sf;
Wayne Roberts 1:0817a150122b 121 mpLORA.lora.bandwidth = conf0.bits.modem_bw;
Wayne Roberts 1:0817a150122b 122 }
Wayne Roberts 1:0817a150122b 123
Wayne Roberts 1:0817a150122b 124 {
Wayne Roberts 1:0817a150122b 125 loraConfig1_t conf1;
Wayne Roberts 1:0817a150122b 126 conf1.octet = radio.readReg(REG_ADDR_LORA_CONFIG1, 1);
Wayne Roberts 1:0817a150122b 127 mpLORA.lora.LowDatarateOptimize = conf1.bits.ppm_offset;
Wayne Roberts 1:0817a150122b 128 ppLORA.lora.HeaderType = conf1.bits.implicit_header;
Wayne Roberts 1:0817a150122b 129 ppLORA.lora.InvertIQ = conf1.bits.rx_invert_iq;
Wayne Roberts 1:0817a150122b 130 mpLORA.lora.codingRate = conf1.bits.tx_coding_rate;
Wayne Roberts 1:0817a150122b 131 }
Wayne Roberts 1:0817a150122b 132
Wayne Roberts 1:0817a150122b 133 {
Wayne Roberts 1:0817a150122b 134 loraConfig2_t conf2;
Wayne Roberts 1:0817a150122b 135 conf2.octet = radio.readReg(REG_ADDR_LORA_CONFIG2, 1);
Wayne Roberts 1:0817a150122b 136 ppLORA.lora.CRCType = conf2.bits.tx_payload_crc16_en;
Wayne Roberts 1:0817a150122b 137 }
Wayne Roberts 1:0817a150122b 138
Wayne Roberts 1:0817a150122b 139 {
Wayne Roberts 1:0817a150122b 140 uint32_t val = radio.readReg(REG_ADDR_LORA_PREAMBLE_SYMBNB, 2);
Wayne Roberts 1:0817a150122b 141 ppLORA.lora.PreambleLengthHi = val >> 8;
Wayne Roberts 1:0817a150122b 142 ppLORA.lora.PreambleLengthLo = val;
Wayne Roberts 1:0817a150122b 143 }
Wayne Roberts 1:0817a150122b 144
Wayne Roberts 1:0817a150122b 145 {
Wayne Roberts 1:0817a150122b 146 AnaCtrl6_t AnaCtrl6;
Wayne Roberts 1:0817a150122b 147 AnaCtrl7_t AnaCtrl7;
Wayne Roberts 1:0817a150122b 148 PaCtrl1b_t PaCtrl1b;
Wayne Roberts 1:0817a150122b 149
Wayne Roberts 1:0817a150122b 150 AnaCtrl6.octet = radio.readReg(REG_ADDR_ANACTRL6, 1);
Wayne Roberts 1:0817a150122b 151 pa_config_buf[0] = AnaCtrl6.bits.pa_dctrim_select_ana; // paDutyCycle
Wayne Roberts 1:0817a150122b 152
Wayne Roberts 1:0817a150122b 153 AnaCtrl7.octet = radio.readReg(REG_ADDR_ANACTRL7, 1);
Wayne Roberts 1:0817a150122b 154 pa_config_buf[1] = AnaCtrl7.bits.pa_hp_sel_ana; // hpMax
Wayne Roberts 1:0817a150122b 155
Wayne Roberts 1:0817a150122b 156 PaCtrl1b.octet = radio.readReg(REG_ADDR_PA_CTRL1B, 1);
Wayne Roberts 1:0817a150122b 157 pa_config_buf[2] = PaCtrl1b.bits.tx_mode_bat; // deviceSel
Wayne Roberts 1:0817a150122b 158
Wayne Roberts 1:0817a150122b 159 pa_config_buf[3] = 1; // paLut
Wayne Roberts 1:0817a150122b 160 }
Wayne Roberts 1:0817a150122b 161
Wayne Roberts 2:ea9245bb1c53 162 {
Wayne Roberts 2:ea9245bb1c53 163 cadParams[0] = radio.readReg(REG_ADDR_LORA_CONFIG9, 1);
Wayne Roberts 2:ea9245bb1c53 164 cadParams[0] >>= 5;
Wayne Roberts 2:ea9245bb1c53 165
Wayne Roberts 2:ea9245bb1c53 166 cadParams[1] = radio.readReg(REG_ADDR_LORA_CAD_PN_RATIO, 1);
Wayne Roberts 2:ea9245bb1c53 167 cadParams[2] = radio.readReg(REG_ADDR_LORA_CAD_MINPEAK, 1);
Wayne Roberts 2:ea9245bb1c53 168 }
Wayne Roberts 2:ea9245bb1c53 169
Wayne Roberts 1:0817a150122b 170 }
Wayne Roberts 1:0817a150122b 171
Wayne Roberts 1:0817a150122b 172 void Radio::hw_reset()
Wayne Roberts 1:0817a150122b 173 {
Wayne Roberts 1:0817a150122b 174 radio.hw_reset(PINNAME_NRST);
Wayne Roberts 1:0817a150122b 175 }
Wayne Roberts 1:0817a150122b 176
Wayne Roberts 1:0817a150122b 177 void Radio::clearIrqFlags()
Wayne Roberts 1:0817a150122b 178 {
Wayne Roberts 1:0817a150122b 179 uint8_t buf[2];
Wayne Roberts 1:0817a150122b 180 buf[0] = 0x03;
Wayne Roberts 1:0817a150122b 181 buf[1] = 0xff;
Wayne Roberts 1:0817a150122b 182 radio.xfer(OPCODE_CLEAR_IRQ_STATUS, 2, 0, buf);
Wayne Roberts 1:0817a150122b 183 }
Wayne Roberts 1:0817a150122b 184
Wayne Roberts 1:0817a150122b 185 uint8_t Radio::get_payload_length()
Wayne Roberts 1:0817a150122b 186 {
Wayne Roberts 1:0817a150122b 187 pktType = radio.getPacketType();
Wayne Roberts 1:0817a150122b 188
Wayne Roberts 1:0817a150122b 189 if (pktType == PACKET_TYPE_GFSK) {
Wayne Roberts 1:0817a150122b 190 ppFSK.gfsk.PayloadLength = radio.readReg(REG_ADDR_FSK_PAYLOAD_LEN, 1);
Wayne Roberts 1:0817a150122b 191 return ppFSK.gfsk.PayloadLength;
Wayne Roberts 1:0817a150122b 192 } else if (pktType == PACKET_TYPE_LORA) {
Wayne Roberts 1:0817a150122b 193 ppLORA.lora.PayloadLength = radio.readReg(REG_ADDR_LORA_TXPKTLEN, 1);
Wayne Roberts 1:0817a150122b 194 return ppLORA.lora.PayloadLength;
Wayne Roberts 1:0817a150122b 195 } else
Wayne Roberts 1:0817a150122b 196 return 0;
Wayne Roberts 1:0817a150122b 197 }
Wayne Roberts 1:0817a150122b 198
Wayne Roberts 1:0817a150122b 199 const char* const Radio::opmode_status_strs[] = {
Wayne Roberts 1:0817a150122b 200 "<0> ", // 0
Wayne Roberts 1:0817a150122b 201 "RFU ", // 1
Wayne Roberts 1:0817a150122b 202 "STBY_RC ", // 2
Wayne Roberts 1:0817a150122b 203 "STBY_XOSC", // 3
Wayne Roberts 1:0817a150122b 204 "FS ", // 4
Wayne Roberts 1:0817a150122b 205 "RX ", // 5
Wayne Roberts 1:0817a150122b 206 "TX ", // 6
Wayne Roberts 1:0817a150122b 207 "<7> ", // 7
Wayne Roberts 1:0817a150122b 208 NULL
Wayne Roberts 1:0817a150122b 209 };
Wayne Roberts 1:0817a150122b 210
Wayne Roberts 1:0817a150122b 211 const char* const Radio::opmode_select_strs[] = {
Wayne Roberts 1:0817a150122b 212 "SLEEP ", // 0
Wayne Roberts 1:0817a150122b 213 "STDBY_RC ", // 1
Wayne Roberts 1:0817a150122b 214 "STDBY_XOSC", // 2
Wayne Roberts 1:0817a150122b 215 "FS ", // 3
Wayne Roberts 1:0817a150122b 216 "RX ", // 4
Wayne Roberts 1:0817a150122b 217 "TX ", // 5
Wayne Roberts 1:0817a150122b 218 NULL
Wayne Roberts 1:0817a150122b 219 };
Wayne Roberts 1:0817a150122b 220
Wayne Roberts 2:ea9245bb1c53 221 unsigned Radio::opmode_read(bool forWriting)
Wayne Roberts 1:0817a150122b 222 {
Wayne Roberts 1:0817a150122b 223 status_t status;
Wayne Roberts 1:0817a150122b 224 radio.xfer(OPCODE_GET_STATUS, 0, 1, &status.octet);
Wayne Roberts 1:0817a150122b 225
Wayne Roberts 1:0817a150122b 226 if (forWriting) {
Wayne Roberts 1:0817a150122b 227 /* translate opmode_status_strs to opmode_select_strs */
Wayne Roberts 1:0817a150122b 228 switch (status.bits.chipMode) {
Wayne Roberts 1:0817a150122b 229 case 2: return 1; // STBY_RC
Wayne Roberts 1:0817a150122b 230 case 3: return 2; // STBY_XOSC
Wayne Roberts 1:0817a150122b 231 case 4: return 3; // FS
Wayne Roberts 1:0817a150122b 232 case 5: return 4; // RX
Wayne Roberts 1:0817a150122b 233 case 6: return 5; // TX
Wayne Roberts 1:0817a150122b 234 default: return 0;
Wayne Roberts 1:0817a150122b 235 }
Wayne Roberts 1:0817a150122b 236 } else
Wayne Roberts 1:0817a150122b 237 return status.bits.chipMode;
Wayne Roberts 1:0817a150122b 238 }
Wayne Roberts 1:0817a150122b 239
Wayne Roberts 2:ea9245bb1c53 240 menuMode_e Radio::opmode_write(unsigned sel)
Wayne Roberts 1:0817a150122b 241 {
Wayne Roberts 1:0817a150122b 242 switch (sel) {
Wayne Roberts 1:0817a150122b 243 case 0:
Wayne Roberts 1:0817a150122b 244 antswPower = 0;
Wayne Roberts 1:0817a150122b 245 radio.setSleep(true, false);
Wayne Roberts 1:0817a150122b 246 break;
Wayne Roberts 1:0817a150122b 247 case 1:
Wayne Roberts 1:0817a150122b 248 antswPower = 0;
Wayne Roberts 1:0817a150122b 249 radio.setStandby(STBY_RC);
Wayne Roberts 1:0817a150122b 250 break;
Wayne Roberts 1:0817a150122b 251 case 2:
Wayne Roberts 1:0817a150122b 252 antswPower = 0;
Wayne Roberts 1:0817a150122b 253 radio.setStandby(STBY_XOSC);
Wayne Roberts 1:0817a150122b 254 break;
Wayne Roberts 1:0817a150122b 255 case 3:
Wayne Roberts 1:0817a150122b 256 antswPower = 0;
Wayne Roberts 1:0817a150122b 257 radio.setFS();
Wayne Roberts 1:0817a150122b 258 break;
Wayne Roberts 1:0817a150122b 259 case 4:
Wayne Roberts 1:0817a150122b 260 antswPower = 1;
Wayne Roberts 1:0817a150122b 261 radio.start_rx(0);
Wayne Roberts 1:0817a150122b 262 break;
Wayne Roberts 1:0817a150122b 263 case 5:
Wayne Roberts 1:0817a150122b 264 antswPower = 1;
Wayne Roberts 1:0817a150122b 265 {
Wayne Roberts 1:0817a150122b 266 uint8_t buf[3];
Wayne Roberts 1:0817a150122b 267 buf[0] = 0;
Wayne Roberts 1:0817a150122b 268 buf[0] = 0;
Wayne Roberts 1:0817a150122b 269 buf[1] = 0;
Wayne Roberts 1:0817a150122b 270 radio.xfer(OPCODE_SET_TX, 3, 0, buf);
Wayne Roberts 1:0817a150122b 271 }
Wayne Roberts 1:0817a150122b 272 break;
Wayne Roberts 1:0817a150122b 273 }
Wayne Roberts 1:0817a150122b 274
Wayne Roberts 1:0817a150122b 275 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 276 }
Wayne Roberts 1:0817a150122b 277
Wayne Roberts 1:0817a150122b 278 void Radio::setFS()
Wayne Roberts 1:0817a150122b 279 {
Wayne Roberts 1:0817a150122b 280 radio.setFS();
Wayne Roberts 1:0817a150122b 281 }
Wayne Roberts 1:0817a150122b 282
Wayne Roberts 1:0817a150122b 283 const char* const Radio::pktType_strs[] = {
Wayne Roberts 1:0817a150122b 284 "GFSK ",
Wayne Roberts 1:0817a150122b 285 "LORA ",
Wayne Roberts 1:0817a150122b 286 NULL
Wayne Roberts 1:0817a150122b 287 };
Wayne Roberts 1:0817a150122b 288
Wayne Roberts 2:ea9245bb1c53 289 unsigned Radio::pktType_read(bool fw)
Wayne Roberts 1:0817a150122b 290 {
Wayne Roberts 1:0817a150122b 291 return radio.getPacketType();
Wayne Roberts 1:0817a150122b 292 }
Wayne Roberts 1:0817a150122b 293
Wayne Roberts 2:ea9245bb1c53 294 menuMode_e Radio::pktType_write(unsigned idx)
Wayne Roberts 1:0817a150122b 295 {
Wayne Roberts 1:0817a150122b 296 radio.setPacketType(idx);
Wayne Roberts 1:0817a150122b 297 return MENUMODE_REINIT_MENU;
Wayne Roberts 1:0817a150122b 298 }
Wayne Roberts 1:0817a150122b 299
Wayne Roberts 1:0817a150122b 300 void Radio::tx_carrier()
Wayne Roberts 1:0817a150122b 301 {
Wayne Roberts 1:0817a150122b 302 radio.xfer(OPCODE_SET_TX_CARRIER, 0, 0, NULL);
Wayne Roberts 1:0817a150122b 303 }
Wayne Roberts 1:0817a150122b 304
Wayne Roberts 1:0817a150122b 305 void Radio::tx_preamble()
Wayne Roberts 1:0817a150122b 306 {
Wayne Roberts 1:0817a150122b 307 radio.xfer(OPCODE_SET_TX_PREAMBLE, 0, 0, NULL);
Wayne Roberts 1:0817a150122b 308 }
Wayne Roberts 1:0817a150122b 309
Wayne Roberts 1:0817a150122b 310 void Radio::txPkt()
Wayne Roberts 1:0817a150122b 311 {
Wayne Roberts 1:0817a150122b 312 uint8_t txlen = get_payload_length();
Wayne Roberts 1:0817a150122b 313
Wayne Roberts 1:0817a150122b 314 radio.setBufferBase(0, 0);
Wayne Roberts 1:0817a150122b 315
Wayne Roberts 1:0817a150122b 316 {
Wayne Roberts 1:0817a150122b 317 uint8_t buf[8];
Wayne Roberts 1:0817a150122b 318 IrqFlags_t irqEnable;
Wayne Roberts 1:0817a150122b 319 irqEnable.word = 0;
Wayne Roberts 1:0817a150122b 320 irqEnable.bits.TxDone = 1;
Wayne Roberts 1:0817a150122b 321 irqEnable.bits.Timeout = 1;
Wayne Roberts 1:0817a150122b 322
Wayne Roberts 1:0817a150122b 323 buf[0] = irqEnable.word >> 8; // enable bits
Wayne Roberts 1:0817a150122b 324 buf[1] = irqEnable.word; // enable bits
Wayne Roberts 1:0817a150122b 325 buf[2] = irqEnable.word >> 8; // dio1
Wayne Roberts 1:0817a150122b 326 buf[3] = irqEnable.word; // dio1
Wayne Roberts 1:0817a150122b 327 buf[4] = 0; // dio2
Wayne Roberts 1:0817a150122b 328 buf[5] = 0; // dio2
Wayne Roberts 1:0817a150122b 329 buf[6] = 0; // dio3
Wayne Roberts 1:0817a150122b 330 buf[7] = 0; // dio3
Wayne Roberts 1:0817a150122b 331 radio.xfer(OPCODE_SET_DIO_IRQ_PARAMS, 8, 0, buf);
Wayne Roberts 1:0817a150122b 332 }
Wayne Roberts 1:0817a150122b 333
Wayne Roberts 1:0817a150122b 334 radio.start_tx(txlen);
Wayne Roberts 1:0817a150122b 335 }
Wayne Roberts 1:0817a150122b 336
Wayne Roberts 1:0817a150122b 337 uint8_t Radio::tx_param_buf[2];
Wayne Roberts 1:0817a150122b 338 uint8_t Radio::pa_config_buf[4];
Wayne Roberts 1:0817a150122b 339
Wayne Roberts 1:0817a150122b 340 void Radio::tx_dbm_print()
Wayne Roberts 1:0817a150122b 341 {
Wayne Roberts 1:0817a150122b 342 PwrCtrl_t PwrCtrl;
Wayne Roberts 1:0817a150122b 343 PaCtrl1b_t PaCtrl1b;
Wayne Roberts 1:0817a150122b 344
Wayne Roberts 1:0817a150122b 345 PwrCtrl.octet = radio.readReg(REG_ADDR_PWR_CTRL, 1);
Wayne Roberts 1:0817a150122b 346
Wayne Roberts 1:0817a150122b 347 PaCtrl1b.octet = radio.readReg(REG_ADDR_PA_CTRL1B, 1);
Wayne Roberts 1:0817a150122b 348 pa_config_buf[2] = PaCtrl1b.bits.tx_mode_bat; // deviceSel
Wayne Roberts 1:0817a150122b 349
Wayne Roberts 1:0817a150122b 350 if (PaCtrl1b.bits.tx_mode_bat)
Wayne Roberts 1:0817a150122b 351 pc.printf("%d", PwrCtrl.bits.tx_pwr - 17);
Wayne Roberts 1:0817a150122b 352 else
Wayne Roberts 1:0817a150122b 353 pc.printf("%d", PwrCtrl.bits.tx_pwr - 9);
Wayne Roberts 1:0817a150122b 354 }
Wayne Roberts 1:0817a150122b 355
Wayne Roberts 1:0817a150122b 356 bool Radio::tx_dbm_write(const char* str)
Wayne Roberts 1:0817a150122b 357 {
Wayne Roberts 1:0817a150122b 358 int dbm;
Wayne Roberts 1:0817a150122b 359
Wayne Roberts 1:0817a150122b 360 sscanf(str, "%d", &dbm);
Wayne Roberts 1:0817a150122b 361
Wayne Roberts 1:0817a150122b 362 tx_param_buf[0] = dbm;
Wayne Roberts 1:0817a150122b 363
Wayne Roberts 1:0817a150122b 364 radio.xfer(OPCODE_SET_TX_PARAMS, 2, 0, tx_param_buf);
Wayne Roberts 1:0817a150122b 365 return false;
Wayne Roberts 1:0817a150122b 366 }
Wayne Roberts 1:0817a150122b 367
Wayne Roberts 1:0817a150122b 368 const char* Radio::tx_ramp_strs[] = {
Wayne Roberts 1:0817a150122b 369 "10 ", // 0
Wayne Roberts 1:0817a150122b 370 "20 ", // 1
Wayne Roberts 1:0817a150122b 371 "80 ", // 2
Wayne Roberts 1:0817a150122b 372 "80 ", // 3
Wayne Roberts 1:0817a150122b 373 "200 ", // 4
Wayne Roberts 1:0817a150122b 374 "800 ", // 5
Wayne Roberts 1:0817a150122b 375 "1700", // 6
Wayne Roberts 1:0817a150122b 376 "3400", // 7
Wayne Roberts 1:0817a150122b 377 NULL
Wayne Roberts 1:0817a150122b 378 };
Wayne Roberts 1:0817a150122b 379
Wayne Roberts 2:ea9245bb1c53 380 unsigned Radio::tx_ramp_read(bool fw)
Wayne Roberts 1:0817a150122b 381 {
Wayne Roberts 1:0817a150122b 382 PwrCtrl_t PwrCtrl;
Wayne Roberts 1:0817a150122b 383 PwrCtrl.octet = radio.readReg(REG_ADDR_PWR_CTRL, 1);
Wayne Roberts 1:0817a150122b 384 tx_param_buf[1] = PwrCtrl.octet >> 5;
Wayne Roberts 1:0817a150122b 385 return PwrCtrl.bits.ramp_time;
Wayne Roberts 1:0817a150122b 386 }
Wayne Roberts 1:0817a150122b 387
Wayne Roberts 2:ea9245bb1c53 388 menuMode_e Radio::tx_ramp_write(unsigned sidx)
Wayne Roberts 1:0817a150122b 389 {
Wayne Roberts 1:0817a150122b 390 tx_param_buf[1] = sidx;
Wayne Roberts 1:0817a150122b 391 radio.xfer(OPCODE_SET_TX_PARAMS, 2, 0, tx_param_buf);
Wayne Roberts 1:0817a150122b 392 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 393 }
Wayne Roberts 1:0817a150122b 394
Wayne Roberts 1:0817a150122b 395 void Radio::set_payload_length(uint8_t len)
Wayne Roberts 1:0817a150122b 396 {
Wayne Roberts 1:0817a150122b 397 pktType = radio.getPacketType();
Wayne Roberts 1:0817a150122b 398
Wayne Roberts 1:0817a150122b 399 if (pktType == PACKET_TYPE_GFSK) {
Wayne Roberts 1:0817a150122b 400 ppFSK.gfsk.PayloadLength = len;
Wayne Roberts 1:0817a150122b 401 radio.xfer(OPCODE_SET_PACKET_PARAMS, 9, 0, ppFSK.buf);
Wayne Roberts 1:0817a150122b 402 } else if (pktType == PACKET_TYPE_LORA) {
Wayne Roberts 1:0817a150122b 403 ppLORA.lora.PayloadLength = len;
Wayne Roberts 1:0817a150122b 404 radio.xfer(OPCODE_SET_PACKET_PARAMS, 6, 0, ppLORA.buf);
Wayne Roberts 1:0817a150122b 405 }
Wayne Roberts 1:0817a150122b 406 }
Wayne Roberts 1:0817a150122b 407
Wayne Roberts 1:0817a150122b 408 void Radio::tx_payload_length_print()
Wayne Roberts 1:0817a150122b 409 {
Wayne Roberts 1:0817a150122b 410 pc.printf("%u", get_payload_length());
Wayne Roberts 1:0817a150122b 411 }
Wayne Roberts 1:0817a150122b 412
Wayne Roberts 1:0817a150122b 413 bool Radio::tx_payload_length_write(const char* txt)
Wayne Roberts 1:0817a150122b 414 {
Wayne Roberts 1:0817a150122b 415 unsigned len;
Wayne Roberts 1:0817a150122b 416
Wayne Roberts 1:0817a150122b 417 sscanf(txt, "%u", &len);
Wayne Roberts 1:0817a150122b 418
Wayne Roberts 1:0817a150122b 419 set_payload_length(len);
Wayne Roberts 1:0817a150122b 420
Wayne Roberts 1:0817a150122b 421 return false;
Wayne Roberts 1:0817a150122b 422 }
Wayne Roberts 1:0817a150122b 423
Wayne Roberts 1:0817a150122b 424 bool Radio::service(int8_t statusRow)
Wayne Roberts 1:0817a150122b 425 {
Wayne Roberts 1:0817a150122b 426 static uint8_t prevRxStatus;
Wayne Roberts 1:0817a150122b 427 static uint8_t prevPktCtrl0;
Wayne Roberts 1:0817a150122b 428 uint8_t buf[4];
Wayne Roberts 1:0817a150122b 429 static IrqFlags_t prevIrqFlags;
Wayne Roberts 1:0817a150122b 430 IrqFlags_t irqFlags;
Wayne Roberts 1:0817a150122b 431 bool ret = false;
Wayne Roberts 1:0817a150122b 432 static us_timestamp_t prev_now;
Wayne Roberts 1:0817a150122b 433 us_timestamp_t now = lpt.read_us();
Wayne Roberts 1:0817a150122b 434
Wayne Roberts 1:0817a150122b 435 radio.service();
Wayne Roberts 1:0817a150122b 436
Wayne Roberts 1:0817a150122b 437 if (statusRow > 0 && now-prev_now > 50000) {
Wayne Roberts 1:0817a150122b 438 uint8_t rxStatus, pktCtrl0;
Wayne Roberts 1:0817a150122b 439 bool chg = false;
Wayne Roberts 1:0817a150122b 440 radio.xfer(OPCODE_GET_IRQ_STATUS, 0, 3, buf);
Wayne Roberts 1:0817a150122b 441 irqFlags.word = buf[1] << 8;
Wayne Roberts 1:0817a150122b 442 irqFlags.word |= buf[2];
Wayne Roberts 1:0817a150122b 443
Wayne Roberts 1:0817a150122b 444 rxStatus = radio.readReg(0x6c9, 1);
Wayne Roberts 1:0817a150122b 445 if (rxStatus != prevRxStatus) {
Wayne Roberts 1:0817a150122b 446 chg = true;
Wayne Roberts 1:0817a150122b 447 prevRxStatus = rxStatus;
Wayne Roberts 1:0817a150122b 448 }
Wayne Roberts 1:0817a150122b 449
Wayne Roberts 1:0817a150122b 450 pktCtrl0 = radio.readReg(0x6b3, 1);
Wayne Roberts 1:0817a150122b 451 if (pktCtrl0 != prevPktCtrl0) {
Wayne Roberts 1:0817a150122b 452 chg = true;
Wayne Roberts 1:0817a150122b 453 prevPktCtrl0 = pktCtrl0;
Wayne Roberts 1:0817a150122b 454 }
Wayne Roberts 1:0817a150122b 455
Wayne Roberts 1:0817a150122b 456 if (irqFlags.word != prevIrqFlags.word && chg) {
Wayne Roberts 1:0817a150122b 457 pc.printf("\e[%u;1f", statusRow); // set (force) cursor to row;column
Wayne Roberts 1:0817a150122b 458
Wayne Roberts 1:0817a150122b 459 pc.printf("%02x ", rxStatus);
Wayne Roberts 1:0817a150122b 460 pc.printf("%02x ", pktCtrl0);
Wayne Roberts 1:0817a150122b 461
Wayne Roberts 1:0817a150122b 462 if (irqFlags.bits.TxDone)
Wayne Roberts 1:0817a150122b 463 pc.printf("TxDone ");
Wayne Roberts 1:0817a150122b 464 if (irqFlags.bits.RxDone)
Wayne Roberts 1:0817a150122b 465 pc.printf("RxDone ");
Wayne Roberts 1:0817a150122b 466 if (irqFlags.bits.PreambleDetected)
Wayne Roberts 1:0817a150122b 467 pc.printf("PreambleDetected ");
Wayne Roberts 1:0817a150122b 468 if (irqFlags.bits.SyncWordValid)
Wayne Roberts 1:0817a150122b 469 pc.printf("SyncWordValid ");
Wayne Roberts 1:0817a150122b 470 if (irqFlags.bits.HeaderValid)
Wayne Roberts 1:0817a150122b 471 pc.printf("HeaderValid ");
Wayne Roberts 1:0817a150122b 472 if (irqFlags.bits.HeaderErr)
Wayne Roberts 1:0817a150122b 473 pc.printf("HeaderErr ");
Wayne Roberts 1:0817a150122b 474 if (irqFlags.bits.CrCerr)
Wayne Roberts 1:0817a150122b 475 pc.printf("CrCerr ");
Wayne Roberts 1:0817a150122b 476 if (irqFlags.bits.CadDone)
Wayne Roberts 1:0817a150122b 477 pc.printf("CadDone ");
Wayne Roberts 1:0817a150122b 478 if (irqFlags.bits.CadDetected)
Wayne Roberts 1:0817a150122b 479 pc.printf("CadDetected ");
Wayne Roberts 1:0817a150122b 480 if (irqFlags.bits.Timeout)
Wayne Roberts 1:0817a150122b 481 pc.printf("Timeout ");
Wayne Roberts 1:0817a150122b 482
Wayne Roberts 1:0817a150122b 483 pc.printf("\e[K");
Wayne Roberts 1:0817a150122b 484 ret = true;
Wayne Roberts 1:0817a150122b 485
Wayne Roberts 1:0817a150122b 486 prevIrqFlags.word = irqFlags.word;
Wayne Roberts 1:0817a150122b 487 }
Wayne Roberts 1:0817a150122b 488
Wayne Roberts 1:0817a150122b 489 prev_now = now;
Wayne Roberts 1:0817a150122b 490 }
Wayne Roberts 1:0817a150122b 491
Wayne Roberts 1:0817a150122b 492 return ret;
Wayne Roberts 1:0817a150122b 493 }
Wayne Roberts 1:0817a150122b 494
Wayne Roberts 1:0817a150122b 495 void Radio::Rx()
Wayne Roberts 1:0817a150122b 496 {
Wayne Roberts 1:0817a150122b 497 antswPower = 1;
Wayne Roberts 1:0817a150122b 498
Wayne Roberts 1:0817a150122b 499 {
Wayne Roberts 1:0817a150122b 500 uint8_t buf[8];
Wayne Roberts 1:0817a150122b 501 IrqFlags_t irqEnable;
Wayne Roberts 1:0817a150122b 502 irqEnable.word = 0;
Wayne Roberts 1:0817a150122b 503 irqEnable.bits.RxDone = 1;
Wayne Roberts 1:0817a150122b 504 irqEnable.bits.Timeout = 1;
Wayne Roberts 1:0817a150122b 505
Wayne Roberts 1:0817a150122b 506 buf[0] = 3;//irqEnable.word >> 8; // enable bits
Wayne Roberts 1:0817a150122b 507 buf[1] = 0xff;//irqEnable.word; // enable bits
Wayne Roberts 1:0817a150122b 508 buf[2] = irqEnable.word >> 8; // dio1
Wayne Roberts 1:0817a150122b 509 buf[3] = irqEnable.word; // dio1
Wayne Roberts 1:0817a150122b 510 buf[4] = 0; // dio2
Wayne Roberts 1:0817a150122b 511 buf[5] = 0; // dio2
Wayne Roberts 1:0817a150122b 512 buf[6] = 0; // dio3
Wayne Roberts 1:0817a150122b 513 buf[7] = 0; // dio3
Wayne Roberts 1:0817a150122b 514 radio.xfer(OPCODE_SET_DIO_IRQ_PARAMS, 8, 0, buf);
Wayne Roberts 1:0817a150122b 515 }
Wayne Roberts 1:0817a150122b 516
Wayne Roberts 1:0817a150122b 517 radio.start_rx(RX_TIMEOUT_CONTINUOUS);
Wayne Roberts 1:0817a150122b 518 }
Wayne Roberts 1:0817a150122b 519
Wayne Roberts 1:0817a150122b 520 void Radio::rxDone(uint8_t size, float rssi, float snr)
Wayne Roberts 1:0817a150122b 521 {
Wayne Roberts 1:0817a150122b 522 if (pktType == PACKET_TYPE_GFSK) {
Wayne Roberts 1:0817a150122b 523 int16_t cfo = radio.readReg(REG_ADDR_FSK_DEMOD_CFO, 2);
Wayne Roberts 1:0817a150122b 524 // justify 12bit to 16bit signed
Wayne Roberts 1:0817a150122b 525 if (cfo & 0x0800)
Wayne Roberts 1:0817a150122b 526 cfo |= 0xf000;
Wayne Roberts 1:0817a150122b 527 log_printf("cfo:%d\r\n", cfo);
Wayne Roberts 1:0817a150122b 528 } else if (pktType == PACKET_TYPE_LORA) {
Wayne Roberts 1:0817a150122b 529 const float bwkhzs[] = {
Wayne Roberts 1:0817a150122b 530 7.81, 10.42, 15.63, 20.83, 31.25, 41.67, 62.5, 125, 250, 500
Wayne Roberts 1:0817a150122b 531 };
Wayne Roberts 1:0817a150122b 532 int hz;
Wayne Roberts 1:0817a150122b 533 int32_t fei;
Wayne Roberts 1:0817a150122b 534 loraStatus1_t loraStatus1;
Wayne Roberts 1:0817a150122b 535 loraStatus1.dword = radio.readReg(REG_ADDR_LORA_STATUS, 3);
Wayne Roberts 1:0817a150122b 536 if (loraStatus1.bits.est_freq_error & 0x80000)
Wayne Roberts 1:0817a150122b 537 fei = 0xfff00000 | loraStatus1.bits.est_freq_error;
Wayne Roberts 1:0817a150122b 538 else
Wayne Roberts 1:0817a150122b 539 fei = loraStatus1.bits.est_freq_error;
Wayne Roberts 1:0817a150122b 540
Wayne Roberts 1:0817a150122b 541 //hz = fei * HZ_TO_FRF * bwkhzs[bw_idx]/500;
Wayne Roberts 1:0817a150122b 542 hz = fei * -HZ_TO_FRF * bwkhzs[bw_idx]/1000;
Wayne Roberts 1:0817a150122b 543 log_printf("hz:%d\r\n", hz);
Wayne Roberts 1:0817a150122b 544 }
Wayne Roberts 1:0817a150122b 545
Wayne Roberts 1:0817a150122b 546 RadioEvents->RxDone(size, rssi, snr);
Wayne Roberts 1:0817a150122b 547 }
Wayne Roberts 1:0817a150122b 548
Wayne Roberts 1:0817a150122b 549 void Radio::txDoneBottom()
Wayne Roberts 1:0817a150122b 550 {
Wayne Roberts 1:0817a150122b 551 if (RadioEvents->TxDone_botHalf)
Wayne Roberts 1:0817a150122b 552 RadioEvents->TxDone_botHalf();
Wayne Roberts 1:0817a150122b 553 }
Wayne Roberts 1:0817a150122b 554
Wayne Roberts 2:ea9245bb1c53 555 void Radio::cadDone(bool det)
Wayne Roberts 2:ea9245bb1c53 556 {
Wayne Roberts 2:ea9245bb1c53 557 log_printf("cadDone ");
Wayne Roberts 2:ea9245bb1c53 558 if (det)
Wayne Roberts 2:ea9245bb1c53 559 pc.printf("CadDetected");
Wayne Roberts 2:ea9245bb1c53 560
Wayne Roberts 2:ea9245bb1c53 561 pc.printf("\r\n");
Wayne Roberts 2:ea9245bb1c53 562 }
Wayne Roberts 2:ea9245bb1c53 563
Wayne Roberts 1:0817a150122b 564 uint8_t ana_regs[128];
Wayne Roberts 1:0817a150122b 565
Wayne Roberts 1:0817a150122b 566 void Radio::boardInit(const RadioEvents_t* e)
Wayne Roberts 1:0817a150122b 567 {
Wayne Roberts 1:0817a150122b 568 hw_reset();
Wayne Roberts 1:0817a150122b 569
Wayne Roberts 1:0817a150122b 570 radio.txDone = txDoneBottom;
Wayne Roberts 1:0817a150122b 571 radio.rxDone = rxDone;
Wayne Roberts 2:ea9245bb1c53 572 radio.cadDone = cadDone;
Wayne Roberts 1:0817a150122b 573
Wayne Roberts 1:0817a150122b 574 radio.chipModeChange = chipModeChange;
Wayne Roberts 1:0817a150122b 575
Wayne Roberts 1:0817a150122b 576 readChip();
Wayne Roberts 1:0817a150122b 577
Wayne Roberts 1:0817a150122b 578 RadioEvents = e;
Wayne Roberts 1:0817a150122b 579
Wayne Roberts 1:0817a150122b 580 lpt.start();
Wayne Roberts 1:0817a150122b 581 }
Wayne Roberts 1:0817a150122b 582
Wayne Roberts 1:0817a150122b 583 bool Radio::deviceSel_read()
Wayne Roberts 1:0817a150122b 584 {
Wayne Roberts 1:0817a150122b 585 PaCtrl1b_t PaCtrl1b;
Wayne Roberts 1:0817a150122b 586 PaCtrl1b.octet = radio.readReg(REG_ADDR_PA_CTRL1B, 1);
Wayne Roberts 1:0817a150122b 587 pa_config_buf[2] = PaCtrl1b.bits.tx_mode_bat; // deviceSel
Wayne Roberts 1:0817a150122b 588 return PaCtrl1b.bits.tx_mode_bat;
Wayne Roberts 1:0817a150122b 589 }
Wayne Roberts 1:0817a150122b 590
Wayne Roberts 1:0817a150122b 591 bool Radio::deviceSel_push()
Wayne Roberts 1:0817a150122b 592 {
Wayne Roberts 1:0817a150122b 593 if (pa_config_buf[2])
Wayne Roberts 1:0817a150122b 594 pa_config_buf[2] = 0;
Wayne Roberts 1:0817a150122b 595 else
Wayne Roberts 1:0817a150122b 596 pa_config_buf[2] = 1;
Wayne Roberts 1:0817a150122b 597
Wayne Roberts 1:0817a150122b 598 radio.xfer(OPCODE_SET_PA_CONFIG, 4, 0, pa_config_buf);
Wayne Roberts 1:0817a150122b 599
Wayne Roberts 1:0817a150122b 600 return pa_config_buf[2];
Wayne Roberts 1:0817a150122b 601 }
Wayne Roberts 1:0817a150122b 602
Wayne Roberts 1:0817a150122b 603 const toggle_item_t Radio::deviceSel_item = { _ITEM_TOGGLE, "SX1262", "SX1261", deviceSel_read, deviceSel_push};
Wayne Roberts 1:0817a150122b 604
Wayne Roberts 1:0817a150122b 605 static const char* paDutyCycles[] = {
Wayne Roberts 1:0817a150122b 606 "0",
Wayne Roberts 1:0817a150122b 607 "1",
Wayne Roberts 1:0817a150122b 608 "2",
Wayne Roberts 1:0817a150122b 609 "3",
Wayne Roberts 1:0817a150122b 610 "4",
Wayne Roberts 1:0817a150122b 611 "5",
Wayne Roberts 1:0817a150122b 612 "6",
Wayne Roberts 1:0817a150122b 613 "7",
Wayne Roberts 1:0817a150122b 614 NULL
Wayne Roberts 1:0817a150122b 615 };
Wayne Roberts 1:0817a150122b 616
Wayne Roberts 1:0817a150122b 617 unsigned Radio::paDutyCycle_read(bool forWriting)
Wayne Roberts 1:0817a150122b 618 {
Wayne Roberts 1:0817a150122b 619 AnaCtrl6_t AnaCtrl6;
Wayne Roberts 1:0817a150122b 620 AnaCtrl6.octet = radio.readReg(REG_ADDR_ANACTRL6, 1);
Wayne Roberts 1:0817a150122b 621 pa_config_buf[0] = AnaCtrl6.bits.pa_dctrim_select_ana;
Wayne Roberts 1:0817a150122b 622 return AnaCtrl6.bits.pa_dctrim_select_ana;
Wayne Roberts 1:0817a150122b 623 }
Wayne Roberts 1:0817a150122b 624
Wayne Roberts 1:0817a150122b 625 menuMode_e Radio::paDutyCycle_write(unsigned sidx)
Wayne Roberts 1:0817a150122b 626 {
Wayne Roberts 1:0817a150122b 627 pa_config_buf[0] = sidx;
Wayne Roberts 1:0817a150122b 628 radio.xfer(OPCODE_SET_TX_PARAMS, 2, 0, tx_param_buf);
Wayne Roberts 1:0817a150122b 629 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 630 }
Wayne Roberts 1:0817a150122b 631
Wayne Roberts 1:0817a150122b 632 const dropdown_item_t Radio::paDutyCycle_item = { _ITEM_DROPDOWN, paDutyCycles, paDutyCycles, paDutyCycle_read, paDutyCycle_write};
Wayne Roberts 1:0817a150122b 633
Wayne Roberts 1:0817a150122b 634 static const char* hpMaxs[] = {
Wayne Roberts 1:0817a150122b 635 "0",
Wayne Roberts 1:0817a150122b 636 "1",
Wayne Roberts 1:0817a150122b 637 "2",
Wayne Roberts 1:0817a150122b 638 "3",
Wayne Roberts 1:0817a150122b 639 "4",
Wayne Roberts 1:0817a150122b 640 "5",
Wayne Roberts 1:0817a150122b 641 "6",
Wayne Roberts 1:0817a150122b 642 "7",
Wayne Roberts 1:0817a150122b 643 NULL
Wayne Roberts 1:0817a150122b 644 };
Wayne Roberts 1:0817a150122b 645
Wayne Roberts 1:0817a150122b 646 unsigned Radio::hpMax_read(bool forWriting)
Wayne Roberts 1:0817a150122b 647 {
Wayne Roberts 1:0817a150122b 648 AnaCtrl7_t AnaCtrl7;
Wayne Roberts 1:0817a150122b 649 AnaCtrl7.octet = radio.readReg(REG_ADDR_ANACTRL7, 1);
Wayne Roberts 1:0817a150122b 650 pa_config_buf[1] = AnaCtrl7.bits.pa_hp_sel_ana;
Wayne Roberts 1:0817a150122b 651 return AnaCtrl7.bits.pa_hp_sel_ana;
Wayne Roberts 1:0817a150122b 652 }
Wayne Roberts 1:0817a150122b 653
Wayne Roberts 1:0817a150122b 654 menuMode_e Radio::hpMax_write(unsigned sidx)
Wayne Roberts 1:0817a150122b 655 {
Wayne Roberts 1:0817a150122b 656 pa_config_buf[1] = sidx;
Wayne Roberts 1:0817a150122b 657 radio.xfer(OPCODE_SET_TX_PARAMS, 2, 0, tx_param_buf);
Wayne Roberts 1:0817a150122b 658 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 659 }
Wayne Roberts 1:0817a150122b 660
Wayne Roberts 1:0817a150122b 661 const dropdown_item_t Radio::hpMax_item = { _ITEM_DROPDOWN, hpMaxs, hpMaxs, hpMax_read, hpMax_write};
Wayne Roberts 1:0817a150122b 662
Wayne Roberts 1:0817a150122b 663 void Radio::ocp_print()
Wayne Roberts 1:0817a150122b 664 {
Wayne Roberts 1:0817a150122b 665 uint8_t ocp = radio.readReg(REG_ADDR_OCP, 1);
Wayne Roberts 1:0817a150122b 666 pc.printf("%.1f", ocp * 2.5);
Wayne Roberts 1:0817a150122b 667
Wayne Roberts 1:0817a150122b 668 }
Wayne Roberts 1:0817a150122b 669
Wayne Roberts 1:0817a150122b 670 bool Radio::ocp_write(const char* txt)
Wayne Roberts 1:0817a150122b 671 {
Wayne Roberts 1:0817a150122b 672 float mA;
Wayne Roberts 1:0817a150122b 673 if (sscanf(txt, "%f", &mA) == 1)
Wayne Roberts 1:0817a150122b 674 radio.writeReg(REG_ADDR_OCP, mA / 2.5, 1);
Wayne Roberts 1:0817a150122b 675
Wayne Roberts 1:0817a150122b 676 return false;
Wayne Roberts 1:0817a150122b 677 }
Wayne Roberts 1:0817a150122b 678
Wayne Roberts 1:0817a150122b 679 const value_item_t Radio::ocp_item = { _ITEM_VALUE, 7, ocp_print, ocp_write};
Wayne Roberts 1:0817a150122b 680
Wayne Roberts 1:0817a150122b 681 const menu_t Radio::common_menu[] = {
Wayne Roberts 1:0817a150122b 682 { {FIRST_CHIP_MENU_ROW, 1}, "deviceSel:", &deviceSel_item, FLAG_MSGTYPE_ALL, &tx_dbm_item },
Wayne Roberts 1:0817a150122b 683 { {FIRST_CHIP_MENU_ROW, 18}, "paDutyCycle:", &paDutyCycle_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 684 { {FIRST_CHIP_MENU_ROW, 36}, "hpMax:", &hpMax_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 685 { {FIRST_CHIP_MENU_ROW, 45}, "ocp mA:", &ocp_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 686
Wayne Roberts 1:0817a150122b 687 { {0, 0}, NULL, NULL }
Wayne Roberts 1:0817a150122b 688 };
Wayne Roberts 1:0817a150122b 689
Wayne Roberts 1:0817a150122b 690 const uint8_t loraBWs[] = {
Wayne Roberts 1:0817a150122b 691 LORA_BW_7, LORA_BW_10, LORA_BW_15,
Wayne Roberts 1:0817a150122b 692 LORA_BW_20, LORA_BW_31, LORA_BW_41,
Wayne Roberts 1:0817a150122b 693 LORA_BW_62, LORA_BW_125, LORA_BW_250,
Wayne Roberts 1:0817a150122b 694 LORA_BW_500
Wayne Roberts 1:0817a150122b 695 };
Wayne Roberts 1:0817a150122b 696
Wayne Roberts 1:0817a150122b 697 static const char* lora_bwstrs[] = {
Wayne Roberts 1:0817a150122b 698 " 7.81KHz", "10.42KHz", "15.63KHz",
Wayne Roberts 1:0817a150122b 699 "20.83KHz", "31.25KHz", "41.67KHz",
Wayne Roberts 1:0817a150122b 700 " 62.5KHz", " 125KHz", " 250KHz",
Wayne Roberts 1:0817a150122b 701 " 500KHz",
Wayne Roberts 1:0817a150122b 702 NULL
Wayne Roberts 1:0817a150122b 703 };
Wayne Roberts 1:0817a150122b 704
Wayne Roberts 1:0817a150122b 705 unsigned Radio::lora_bw_read(bool forWriting)
Wayne Roberts 1:0817a150122b 706 {
Wayne Roberts 1:0817a150122b 707 unsigned n;
Wayne Roberts 1:0817a150122b 708 loraConfig0_t conf0;
Wayne Roberts 1:0817a150122b 709 conf0.octet = radio.readReg(REG_ADDR_LORA_CONFIG0, 1);
Wayne Roberts 1:0817a150122b 710 mpLORA.lora.bandwidth = conf0.bits.modem_bw;
Wayne Roberts 1:0817a150122b 711 for (n = 0; n < sizeof(loraBWs); n++) {
Wayne Roberts 1:0817a150122b 712 if (conf0.bits.modem_bw == loraBWs[n]) {
Wayne Roberts 1:0817a150122b 713 bw_idx = n;
Wayne Roberts 1:0817a150122b 714 return n;
Wayne Roberts 1:0817a150122b 715 }
Wayne Roberts 1:0817a150122b 716 }
Wayne Roberts 1:0817a150122b 717 return sizeof(loraBWs);
Wayne Roberts 1:0817a150122b 718 }
Wayne Roberts 1:0817a150122b 719
Wayne Roberts 1:0817a150122b 720 menuMode_e Radio::lora_bw_write(unsigned sidx)
Wayne Roberts 1:0817a150122b 721 {
Wayne Roberts 1:0817a150122b 722 mpLORA.lora.bandwidth = loraBWs[sidx];
Wayne Roberts 1:0817a150122b 723 radio.xfer(OPCODE_SET_MODULATION_PARAMS, 4, 0, mpLORA.buf);
Wayne Roberts 1:0817a150122b 724 bw_idx = sidx;
Wayne Roberts 1:0817a150122b 725 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 726 }
Wayne Roberts 1:0817a150122b 727
Wayne Roberts 1:0817a150122b 728 const dropdown_item_t Radio::lora_bw_item = { _ITEM_DROPDOWN, lora_bwstrs, lora_bwstrs, lora_bw_read, lora_bw_write};
Wayne Roberts 1:0817a150122b 729
Wayne Roberts 1:0817a150122b 730 void Radio::lora_sf_print()
Wayne Roberts 1:0817a150122b 731 {
Wayne Roberts 1:0817a150122b 732 loraConfig0_t conf0;
Wayne Roberts 1:0817a150122b 733 conf0.octet = radio.readReg(REG_ADDR_LORA_CONFIG0, 1);
Wayne Roberts 1:0817a150122b 734 mpLORA.lora.spreadingFactor = conf0.bits.modem_sf;
Wayne Roberts 1:0817a150122b 735 pc.printf("%u", conf0.bits.modem_sf);
Wayne Roberts 1:0817a150122b 736 }
Wayne Roberts 1:0817a150122b 737
Wayne Roberts 1:0817a150122b 738 bool Radio::lora_sf_write(const char* str)
Wayne Roberts 1:0817a150122b 739 {
Wayne Roberts 1:0817a150122b 740 unsigned sf;
Wayne Roberts 1:0817a150122b 741 if (sscanf(str, "%u", &sf) == 1) {
Wayne Roberts 1:0817a150122b 742 mpLORA.lora.spreadingFactor = sf;
Wayne Roberts 1:0817a150122b 743 radio.xfer(OPCODE_SET_MODULATION_PARAMS, 4, 0, mpLORA.buf);
Wayne Roberts 1:0817a150122b 744 }
Wayne Roberts 1:0817a150122b 745 return false;
Wayne Roberts 1:0817a150122b 746 }
Wayne Roberts 1:0817a150122b 747
Wayne Roberts 1:0817a150122b 748 const value_item_t Radio::lora_sf_item = { _ITEM_VALUE, 3, lora_sf_print, lora_sf_write };
Wayne Roberts 1:0817a150122b 749
Wayne Roberts 1:0817a150122b 750 static const char* lora_crs[] = {
Wayne Roberts 1:0817a150122b 751 "4/5 ",
Wayne Roberts 1:0817a150122b 752 "4/6 ",
Wayne Roberts 1:0817a150122b 753 "4/7 ",
Wayne Roberts 1:0817a150122b 754 "4/8 ",
Wayne Roberts 1:0817a150122b 755 NULL
Wayne Roberts 1:0817a150122b 756 };
Wayne Roberts 1:0817a150122b 757
Wayne Roberts 1:0817a150122b 758 unsigned Radio::lora_cr_read(bool forWriting)
Wayne Roberts 1:0817a150122b 759 {
Wayne Roberts 1:0817a150122b 760 loraConfig1_t conf1;
Wayne Roberts 1:0817a150122b 761 conf1.octet = radio.readReg(REG_ADDR_LORA_CONFIG1, 1);
Wayne Roberts 1:0817a150122b 762 mpLORA.lora.codingRate = conf1.bits.tx_coding_rate;
Wayne Roberts 1:0817a150122b 763 return conf1.bits.tx_coding_rate;
Wayne Roberts 1:0817a150122b 764 }
Wayne Roberts 1:0817a150122b 765
Wayne Roberts 1:0817a150122b 766 menuMode_e Radio::lora_cr_write(unsigned sidx)
Wayne Roberts 1:0817a150122b 767 {
Wayne Roberts 1:0817a150122b 768 mpLORA.lora.codingRate = sidx;
Wayne Roberts 1:0817a150122b 769 radio.xfer(OPCODE_SET_MODULATION_PARAMS, 4, 0, mpLORA.buf);
Wayne Roberts 1:0817a150122b 770 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 771 }
Wayne Roberts 1:0817a150122b 772
Wayne Roberts 1:0817a150122b 773 const dropdown_item_t Radio::lora_cr_item = { _ITEM_DROPDOWN, lora_crs, lora_crs, lora_cr_read, lora_cr_write};
Wayne Roberts 1:0817a150122b 774
Wayne Roberts 1:0817a150122b 775 bool Radio::ppmOffset_read()
Wayne Roberts 1:0817a150122b 776 {
Wayne Roberts 1:0817a150122b 777 loraConfig1_t conf1;
Wayne Roberts 1:0817a150122b 778 conf1.octet = radio.readReg(REG_ADDR_LORA_CONFIG1, 1);
Wayne Roberts 1:0817a150122b 779 mpLORA.lora.LowDatarateOptimize = conf1.bits.ppm_offset;
Wayne Roberts 1:0817a150122b 780 return conf1.bits.ppm_offset;
Wayne Roberts 1:0817a150122b 781 }
Wayne Roberts 1:0817a150122b 782
Wayne Roberts 1:0817a150122b 783 bool Radio::ppmOffset_push()
Wayne Roberts 1:0817a150122b 784 {
Wayne Roberts 1:0817a150122b 785 if (mpLORA.lora.LowDatarateOptimize)
Wayne Roberts 1:0817a150122b 786 mpLORA.lora.LowDatarateOptimize = 0;
Wayne Roberts 1:0817a150122b 787 else
Wayne Roberts 1:0817a150122b 788 mpLORA.lora.LowDatarateOptimize = 1;
Wayne Roberts 1:0817a150122b 789
Wayne Roberts 1:0817a150122b 790 radio.xfer(OPCODE_SET_MODULATION_PARAMS, 4, 0, mpLORA.buf);
Wayne Roberts 1:0817a150122b 791 return mpLORA.lora.LowDatarateOptimize;
Wayne Roberts 1:0817a150122b 792 }
Wayne Roberts 1:0817a150122b 793
Wayne Roberts 1:0817a150122b 794 const toggle_item_t Radio::lora_ppmOffset_item = { _ITEM_TOGGLE, "LowDatarateOptimize", NULL, ppmOffset_read, ppmOffset_push};
Wayne Roberts 1:0817a150122b 795
Wayne Roberts 1:0817a150122b 796 void Radio::lora_pblLen_print()
Wayne Roberts 1:0817a150122b 797 {
Wayne Roberts 1:0817a150122b 798 uint32_t val = radio.readReg(REG_ADDR_LORA_PREAMBLE_SYMBNB, 2);
Wayne Roberts 1:0817a150122b 799 ppLORA.lora.PreambleLengthHi = val >> 8;
Wayne Roberts 1:0817a150122b 800 ppLORA.lora.PreambleLengthLo = val;
Wayne Roberts 1:0817a150122b 801 pc.printf("%u", val);
Wayne Roberts 1:0817a150122b 802 }
Wayne Roberts 1:0817a150122b 803
Wayne Roberts 1:0817a150122b 804 bool Radio::lora_pblLen_write(const char* txt)
Wayne Roberts 1:0817a150122b 805 {
Wayne Roberts 1:0817a150122b 806 unsigned n;
Wayne Roberts 1:0817a150122b 807 if (sscanf(txt, "%u", &n) == 1) {
Wayne Roberts 1:0817a150122b 808 ppLORA.lora.PreambleLengthHi = n >> 8;
Wayne Roberts 1:0817a150122b 809 ppLORA.lora.PreambleLengthLo = n;
Wayne Roberts 1:0817a150122b 810 radio.xfer(OPCODE_SET_PACKET_PARAMS, 6, 0, ppLORA.buf);
Wayne Roberts 1:0817a150122b 811 }
Wayne Roberts 1:0817a150122b 812 return false;
Wayne Roberts 1:0817a150122b 813 }
Wayne Roberts 1:0817a150122b 814
Wayne Roberts 1:0817a150122b 815 const value_item_t Radio::lora_pblLen_item = { _ITEM_VALUE, 5, lora_pblLen_print, lora_pblLen_write};
Wayne Roberts 1:0817a150122b 816
Wayne Roberts 1:0817a150122b 817 bool Radio::lora_headerType_read()
Wayne Roberts 1:0817a150122b 818 {
Wayne Roberts 1:0817a150122b 819 loraConfig1_t conf1;
Wayne Roberts 1:0817a150122b 820 conf1.octet = radio.readReg(REG_ADDR_LORA_CONFIG1, 1);
Wayne Roberts 1:0817a150122b 821 ppLORA.lora.HeaderType = conf1.bits.implicit_header;
Wayne Roberts 1:0817a150122b 822 return conf1.bits.implicit_header;
Wayne Roberts 1:0817a150122b 823 }
Wayne Roberts 1:0817a150122b 824
Wayne Roberts 1:0817a150122b 825 bool Radio::lora_headerType_push()
Wayne Roberts 1:0817a150122b 826 {
Wayne Roberts 1:0817a150122b 827 if (ppLORA.lora.HeaderType)
Wayne Roberts 1:0817a150122b 828 ppLORA.lora.HeaderType = 0;
Wayne Roberts 1:0817a150122b 829 else
Wayne Roberts 1:0817a150122b 830 ppLORA.lora.HeaderType = 1;
Wayne Roberts 1:0817a150122b 831
Wayne Roberts 1:0817a150122b 832 radio.xfer(OPCODE_SET_PACKET_PARAMS, 6, 0, ppLORA.buf);
Wayne Roberts 1:0817a150122b 833 return ppLORA.lora.HeaderType;
Wayne Roberts 1:0817a150122b 834 }
Wayne Roberts 1:0817a150122b 835
Wayne Roberts 1:0817a150122b 836 const toggle_item_t Radio::lora_headerType_item = { _ITEM_TOGGLE, "EXPLICIT", "IMPLICIT", lora_headerType_read, lora_headerType_push};
Wayne Roberts 1:0817a150122b 837
Wayne Roberts 1:0817a150122b 838 bool Radio::lora_crcon_read()
Wayne Roberts 1:0817a150122b 839 {
Wayne Roberts 1:0817a150122b 840 loraConfig2_t conf2;
Wayne Roberts 1:0817a150122b 841 conf2.octet = radio.readReg(REG_ADDR_LORA_CONFIG2, 1);
Wayne Roberts 1:0817a150122b 842 ppLORA.lora.CRCType = conf2.bits.tx_payload_crc16_en;
Wayne Roberts 1:0817a150122b 843 return conf2.bits.tx_payload_crc16_en;
Wayne Roberts 1:0817a150122b 844 }
Wayne Roberts 1:0817a150122b 845
Wayne Roberts 1:0817a150122b 846 bool Radio::lora_crcon_push()
Wayne Roberts 1:0817a150122b 847 {
Wayne Roberts 1:0817a150122b 848 if (ppLORA.lora.CRCType)
Wayne Roberts 1:0817a150122b 849 ppLORA.lora.CRCType = 0;
Wayne Roberts 1:0817a150122b 850 else
Wayne Roberts 1:0817a150122b 851 ppLORA.lora.CRCType = 1;
Wayne Roberts 1:0817a150122b 852
Wayne Roberts 1:0817a150122b 853 radio.xfer(OPCODE_SET_PACKET_PARAMS, 6, 0, ppLORA.buf);
Wayne Roberts 1:0817a150122b 854 return ppLORA.lora.CRCType;
Wayne Roberts 1:0817a150122b 855 }
Wayne Roberts 1:0817a150122b 856
Wayne Roberts 1:0817a150122b 857 const toggle_item_t Radio::lora_crcon_item = { _ITEM_TOGGLE, "CrcOn", NULL, lora_crcon_read, lora_crcon_push};
Wayne Roberts 1:0817a150122b 858
Wayne Roberts 1:0817a150122b 859 bool Radio::lora_inviq_read()
Wayne Roberts 1:0817a150122b 860 {
Wayne Roberts 1:0817a150122b 861 loraConfig1_t conf1;
Wayne Roberts 1:0817a150122b 862 conf1.octet = radio.readReg(REG_ADDR_LORA_CONFIG1, 1);
Wayne Roberts 1:0817a150122b 863 ppLORA.lora.InvertIQ = conf1.bits.rx_invert_iq;
Wayne Roberts 1:0817a150122b 864 return conf1.bits.rx_invert_iq;
Wayne Roberts 1:0817a150122b 865 }
Wayne Roberts 1:0817a150122b 866
Wayne Roberts 1:0817a150122b 867 bool Radio::lora_inviq_push()
Wayne Roberts 1:0817a150122b 868 {
Wayne Roberts 1:0817a150122b 869 if (ppLORA.lora.InvertIQ)
Wayne Roberts 1:0817a150122b 870 ppLORA.lora.InvertIQ = 0;
Wayne Roberts 1:0817a150122b 871 else
Wayne Roberts 1:0817a150122b 872 ppLORA.lora.InvertIQ = 1;
Wayne Roberts 1:0817a150122b 873
Wayne Roberts 1:0817a150122b 874 radio.xfer(OPCODE_SET_PACKET_PARAMS, 6, 0, ppLORA.buf);
Wayne Roberts 1:0817a150122b 875 return ppLORA.lora.InvertIQ;
Wayne Roberts 1:0817a150122b 876 }
Wayne Roberts 1:0817a150122b 877
Wayne Roberts 1:0817a150122b 878 const toggle_item_t Radio::lora_inviq_item = { _ITEM_TOGGLE, "InvertIQ", NULL, lora_inviq_read, lora_inviq_push};
Wayne Roberts 1:0817a150122b 879
Wayne Roberts 2:ea9245bb1c53 880 void Radio::cad_push()
Wayne Roberts 2:ea9245bb1c53 881 {
Wayne Roberts 2:ea9245bb1c53 882 {
Wayne Roberts 2:ea9245bb1c53 883 uint8_t buf[8];
Wayne Roberts 2:ea9245bb1c53 884 IrqFlags_t irqEnable;
Wayne Roberts 2:ea9245bb1c53 885 irqEnable.word = 0;
Wayne Roberts 2:ea9245bb1c53 886 irqEnable.bits.RxDone = 1;
Wayne Roberts 2:ea9245bb1c53 887 irqEnable.bits.Timeout = 1;
Wayne Roberts 2:ea9245bb1c53 888 irqEnable.bits.CadDetected = 1;
Wayne Roberts 2:ea9245bb1c53 889 irqEnable.bits.CadDone = 1;
Wayne Roberts 2:ea9245bb1c53 890
Wayne Roberts 2:ea9245bb1c53 891 buf[0] = 3;//irqEnable.word >> 8; // enable bits
Wayne Roberts 2:ea9245bb1c53 892 buf[1] = 0xff;//irqEnable.word; // enable bits
Wayne Roberts 2:ea9245bb1c53 893 buf[2] = irqEnable.word >> 8; // dio1
Wayne Roberts 2:ea9245bb1c53 894 buf[3] = irqEnable.word; // dio1
Wayne Roberts 2:ea9245bb1c53 895 buf[4] = 0; // dio2
Wayne Roberts 2:ea9245bb1c53 896 buf[5] = 0; // dio2
Wayne Roberts 2:ea9245bb1c53 897 buf[6] = 0; // dio3
Wayne Roberts 2:ea9245bb1c53 898 buf[7] = 0; // dio3
Wayne Roberts 2:ea9245bb1c53 899 radio.xfer(OPCODE_SET_DIO_IRQ_PARAMS, 8, 0, buf);
Wayne Roberts 2:ea9245bb1c53 900 }
Wayne Roberts 2:ea9245bb1c53 901
Wayne Roberts 2:ea9245bb1c53 902 radio.setCAD();
Wayne Roberts 2:ea9245bb1c53 903 }
Wayne Roberts 2:ea9245bb1c53 904
Wayne Roberts 2:ea9245bb1c53 905 const button_item_t Radio::lora_cad_item = { _ITEM_BUTTON, "CAD", cad_push };
Wayne Roberts 2:ea9245bb1c53 906
Wayne Roberts 2:ea9245bb1c53 907 static const char* lora_cadsymbs[] = {
Wayne Roberts 2:ea9245bb1c53 908 " 1",
Wayne Roberts 2:ea9245bb1c53 909 " 2",
Wayne Roberts 2:ea9245bb1c53 910 " 4",
Wayne Roberts 2:ea9245bb1c53 911 " 8",
Wayne Roberts 2:ea9245bb1c53 912 "16",
Wayne Roberts 2:ea9245bb1c53 913 NULL
Wayne Roberts 2:ea9245bb1c53 914 };
Wayne Roberts 2:ea9245bb1c53 915
Wayne Roberts 2:ea9245bb1c53 916 unsigned Radio::lora_cadsymbs_read(bool forWriting)
Wayne Roberts 2:ea9245bb1c53 917 {
Wayne Roberts 2:ea9245bb1c53 918 cadParams[0] = radio.readReg(REG_ADDR_LORA_CONFIG9, 1);
Wayne Roberts 2:ea9245bb1c53 919 cadParams[0] >>= 5;
Wayne Roberts 2:ea9245bb1c53 920 return cadParams[0];
Wayne Roberts 2:ea9245bb1c53 921 }
Wayne Roberts 2:ea9245bb1c53 922
Wayne Roberts 2:ea9245bb1c53 923 menuMode_e Radio::lora_cadsymbs_write(unsigned sidx)
Wayne Roberts 2:ea9245bb1c53 924 {
Wayne Roberts 2:ea9245bb1c53 925 cadParams[0] = sidx;
Wayne Roberts 2:ea9245bb1c53 926 radio.xfer(OPCODE_SET_CAD_PARAM, 7, 0, cadParams);
Wayne Roberts 2:ea9245bb1c53 927 return MENUMODE_REDRAW;
Wayne Roberts 2:ea9245bb1c53 928 }
Wayne Roberts 2:ea9245bb1c53 929
Wayne Roberts 2:ea9245bb1c53 930 const dropdown_item_t Radio::lora_cadsymbs_item = { _ITEM_DROPDOWN, lora_cadsymbs, lora_cadsymbs, lora_cadsymbs_read, lora_cadsymbs_write};
Wayne Roberts 2:ea9245bb1c53 931
Wayne Roberts 2:ea9245bb1c53 932 void Radio::lora_cadpnratio_print()
Wayne Roberts 2:ea9245bb1c53 933 {
Wayne Roberts 2:ea9245bb1c53 934 cadParams[1] = radio.readReg(REG_ADDR_LORA_CAD_PN_RATIO, 1);
Wayne Roberts 2:ea9245bb1c53 935 pc.printf("%u", cadParams[1]);
Wayne Roberts 2:ea9245bb1c53 936 }
Wayne Roberts 2:ea9245bb1c53 937
Wayne Roberts 2:ea9245bb1c53 938 bool Radio::lora_cadpnratio_write(const char* txt)
Wayne Roberts 2:ea9245bb1c53 939 {
Wayne Roberts 2:ea9245bb1c53 940 unsigned n;
Wayne Roberts 2:ea9245bb1c53 941 sscanf(txt, "%u", &n);
Wayne Roberts 2:ea9245bb1c53 942 cadParams[1] = n;
Wayne Roberts 2:ea9245bb1c53 943 radio.xfer(OPCODE_SET_CAD_PARAM, 7, 0, cadParams);
Wayne Roberts 2:ea9245bb1c53 944 return false;
Wayne Roberts 2:ea9245bb1c53 945 }
Wayne Roberts 2:ea9245bb1c53 946
Wayne Roberts 2:ea9245bb1c53 947 const value_item_t Radio::lora_cadpnratio_item = { _ITEM_VALUE, 4, lora_cadpnratio_print, lora_cadpnratio_write};
Wayne Roberts 2:ea9245bb1c53 948
Wayne Roberts 2:ea9245bb1c53 949 void Radio::lora_cadmin_print()
Wayne Roberts 2:ea9245bb1c53 950 {
Wayne Roberts 2:ea9245bb1c53 951 cadParams[2] = radio.readReg(REG_ADDR_LORA_CAD_MINPEAK, 1);
Wayne Roberts 2:ea9245bb1c53 952 pc.printf("%u", cadParams[2]);
Wayne Roberts 2:ea9245bb1c53 953 }
Wayne Roberts 2:ea9245bb1c53 954
Wayne Roberts 2:ea9245bb1c53 955 bool Radio::lora_cadmin_write(const char* txt)
Wayne Roberts 2:ea9245bb1c53 956 {
Wayne Roberts 2:ea9245bb1c53 957 unsigned n;
Wayne Roberts 2:ea9245bb1c53 958 sscanf(txt, "%u", &n);
Wayne Roberts 2:ea9245bb1c53 959 cadParams[2] = n;
Wayne Roberts 2:ea9245bb1c53 960 radio.xfer(OPCODE_SET_CAD_PARAM, 7, 0, cadParams);
Wayne Roberts 2:ea9245bb1c53 961 return false;
Wayne Roberts 2:ea9245bb1c53 962 }
Wayne Roberts 2:ea9245bb1c53 963
Wayne Roberts 2:ea9245bb1c53 964 const value_item_t Radio::lora_cadmin_item = { _ITEM_VALUE, 4, lora_cadmin_print, lora_cadmin_write};
Wayne Roberts 2:ea9245bb1c53 965
Wayne Roberts 2:ea9245bb1c53 966 bool Radio::lora_cadexit_read()
Wayne Roberts 2:ea9245bb1c53 967 {
Wayne Roberts 2:ea9245bb1c53 968 return cadParams[3];
Wayne Roberts 2:ea9245bb1c53 969 }
Wayne Roberts 2:ea9245bb1c53 970
Wayne Roberts 2:ea9245bb1c53 971 bool Radio::lora_cadexit_push()
Wayne Roberts 2:ea9245bb1c53 972 {
Wayne Roberts 2:ea9245bb1c53 973 if (cadParams[3])
Wayne Roberts 2:ea9245bb1c53 974 cadParams[3] = 0;
Wayne Roberts 2:ea9245bb1c53 975 else
Wayne Roberts 2:ea9245bb1c53 976 cadParams[3] = 1;
Wayne Roberts 2:ea9245bb1c53 977
Wayne Roberts 2:ea9245bb1c53 978 radio.xfer(OPCODE_SET_CAD_PARAM, 7, 0, cadParams);
Wayne Roberts 2:ea9245bb1c53 979
Wayne Roberts 2:ea9245bb1c53 980 return cadParams[3];
Wayne Roberts 2:ea9245bb1c53 981 }
Wayne Roberts 2:ea9245bb1c53 982
Wayne Roberts 2:ea9245bb1c53 983 const toggle_item_t Radio::lora_cadexit_item = { _ITEM_TOGGLE, "CAD_ONLY", "CAD_RX ", lora_cadexit_read, lora_cadexit_push};
Wayne Roberts 2:ea9245bb1c53 984
Wayne Roberts 2:ea9245bb1c53 985 void Radio::lora_cadtimeout_print(void)
Wayne Roberts 2:ea9245bb1c53 986 {
Wayne Roberts 2:ea9245bb1c53 987 unsigned n;
Wayne Roberts 2:ea9245bb1c53 988
Wayne Roberts 2:ea9245bb1c53 989 n = cadParams[4];
Wayne Roberts 2:ea9245bb1c53 990 n <<= 8;
Wayne Roberts 2:ea9245bb1c53 991 n += cadParams[5];
Wayne Roberts 2:ea9245bb1c53 992 n <<= 8;
Wayne Roberts 2:ea9245bb1c53 993 n += cadParams[6];
Wayne Roberts 2:ea9245bb1c53 994 pc.printf("%u", n);
Wayne Roberts 2:ea9245bb1c53 995 }
Wayne Roberts 2:ea9245bb1c53 996
Wayne Roberts 2:ea9245bb1c53 997 bool Radio::lora_cadtimeout_write(const char* txt)
Wayne Roberts 2:ea9245bb1c53 998 {
Wayne Roberts 2:ea9245bb1c53 999 unsigned n;
Wayne Roberts 2:ea9245bb1c53 1000 float ticks;
Wayne Roberts 2:ea9245bb1c53 1001
Wayne Roberts 2:ea9245bb1c53 1002 sscanf(txt, "%u", &n);
Wayne Roberts 2:ea9245bb1c53 1003 ticks = n / 15.625;
Wayne Roberts 2:ea9245bb1c53 1004 n = ticks;
Wayne Roberts 2:ea9245bb1c53 1005
Wayne Roberts 2:ea9245bb1c53 1006 cadParams[4] = n >> 16;
Wayne Roberts 2:ea9245bb1c53 1007 cadParams[5] = n >> 8;
Wayne Roberts 2:ea9245bb1c53 1008 cadParams[6] = n;
Wayne Roberts 2:ea9245bb1c53 1009
Wayne Roberts 2:ea9245bb1c53 1010 return false;
Wayne Roberts 2:ea9245bb1c53 1011 }
Wayne Roberts 2:ea9245bb1c53 1012
Wayne Roberts 2:ea9245bb1c53 1013 const value_item_t Radio::lora_cadtimeout_item = { _ITEM_VALUE, 4, lora_cadtimeout_print, lora_cadtimeout_write};
Wayne Roberts 2:ea9245bb1c53 1014
Wayne Roberts 1:0817a150122b 1015 const menu_t Radio::lora_menu[] = {
Wayne Roberts 1:0817a150122b 1016 { {FIRST_CHIP_MENU_ROW+1, 1}, NULL, &lora_bw_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1017 { {FIRST_CHIP_MENU_ROW+1, 12}, "sf:", &lora_sf_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1018 { {FIRST_CHIP_MENU_ROW+1, 20}, "cr:", &lora_cr_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1019 { {FIRST_CHIP_MENU_ROW+1, 30}, NULL, &lora_ppmOffset_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1020
Wayne Roberts 1:0817a150122b 1021 { {FIRST_CHIP_MENU_ROW+2, 1}, "PreambleLength:", &lora_pblLen_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1022 { {FIRST_CHIP_MENU_ROW+2, 22}, NULL, &lora_headerType_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1023 { {FIRST_CHIP_MENU_ROW+2, 32}, NULL, &lora_crcon_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1024 { {FIRST_CHIP_MENU_ROW+2, 39}, NULL, &lora_inviq_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 2:ea9245bb1c53 1025
Wayne Roberts 2:ea9245bb1c53 1026 { {FIRST_CHIP_MENU_ROW+3, 1}, NULL, &lora_cad_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 2:ea9245bb1c53 1027 { {FIRST_CHIP_MENU_ROW+3, 5}, "symbols:", &lora_cadsymbs_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 2:ea9245bb1c53 1028 { {FIRST_CHIP_MENU_ROW+3, 20}, "peak/noise:", &lora_cadpnratio_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 2:ea9245bb1c53 1029 { {FIRST_CHIP_MENU_ROW+3, 35}, "min:", &lora_cadmin_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 2:ea9245bb1c53 1030 { {FIRST_CHIP_MENU_ROW+3, 45}, "exit:", &lora_cadexit_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 2:ea9245bb1c53 1031 { {FIRST_CHIP_MENU_ROW+3, 62}, "timeout us:", &lora_cadtimeout_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 2:ea9245bb1c53 1032
Wayne Roberts 1:0817a150122b 1033 { {0, 0}, NULL, NULL }
Wayne Roberts 1:0817a150122b 1034 };
Wayne Roberts 1:0817a150122b 1035
Wayne Roberts 1:0817a150122b 1036 void Radio::test()
Wayne Roberts 1:0817a150122b 1037 {
Wayne Roberts 1:0817a150122b 1038 pktType = radio.getPacketType();
Wayne Roberts 1:0817a150122b 1039
Wayne Roberts 1:0817a150122b 1040 if (pktType == PACKET_TYPE_GFSK) {
Wayne Roberts 1:0817a150122b 1041 } else if (pktType == PACKET_TYPE_LORA) {
Wayne Roberts 1:0817a150122b 1042 }
Wayne Roberts 1:0817a150122b 1043 }
Wayne Roberts 1:0817a150122b 1044
Wayne Roberts 1:0817a150122b 1045 void Radio::gfsk_bitrate_print()
Wayne Roberts 1:0817a150122b 1046 {
Wayne Roberts 1:0817a150122b 1047 unsigned d = radio.readReg(REG_ADDR_BITRATE, 3);
Wayne Roberts 1:0817a150122b 1048 float f = d / 32.0;
Wayne Roberts 1:0817a150122b 1049
Wayne Roberts 1:0817a150122b 1050 pc.printf("%u", (unsigned)(XTAL_FREQ_HZ / f));
Wayne Roberts 1:0817a150122b 1051
Wayne Roberts 1:0817a150122b 1052 mpFSK.gfsk.bitrateHi = d >> 16;
Wayne Roberts 1:0817a150122b 1053 mpFSK.gfsk.bitrateMid = d >> 8;
Wayne Roberts 1:0817a150122b 1054 mpFSK.gfsk.bitrateLo = d;
Wayne Roberts 1:0817a150122b 1055 }
Wayne Roberts 1:0817a150122b 1056
Wayne Roberts 1:0817a150122b 1057 bool Radio::gfsk_bitrate_write(const char* txt)
Wayne Roberts 1:0817a150122b 1058 {
Wayne Roberts 1:0817a150122b 1059 unsigned bps, br;
Wayne Roberts 1:0817a150122b 1060
Wayne Roberts 1:0817a150122b 1061 if (sscanf(txt, "%u", &bps) == 1) {
Wayne Roberts 1:0817a150122b 1062 br = 32 * (XTAL_FREQ_HZ / (float)bps);
Wayne Roberts 1:0817a150122b 1063 mpFSK.gfsk.bitrateHi = br >> 16;
Wayne Roberts 1:0817a150122b 1064 mpFSK.gfsk.bitrateMid = br >> 8;
Wayne Roberts 1:0817a150122b 1065 mpFSK.gfsk.bitrateLo = br;
Wayne Roberts 1:0817a150122b 1066 radio.xfer(OPCODE_SET_MODULATION_PARAMS, 8, 0, mpFSK.buf);
Wayne Roberts 1:0817a150122b 1067 }
Wayne Roberts 1:0817a150122b 1068 return false;
Wayne Roberts 1:0817a150122b 1069 }
Wayne Roberts 1:0817a150122b 1070
Wayne Roberts 1:0817a150122b 1071 const value_item_t Radio::gfsk_bitrate_item = { _ITEM_VALUE, 8, gfsk_bitrate_print, gfsk_bitrate_write};
Wayne Roberts 1:0817a150122b 1072
Wayne Roberts 1:0817a150122b 1073 static const char* gfsk_bts[] = {
Wayne Roberts 1:0817a150122b 1074 "off", // 0
Wayne Roberts 1:0817a150122b 1075 "0.3", // 1
Wayne Roberts 1:0817a150122b 1076 "0.5", // 2
Wayne Roberts 1:0817a150122b 1077 "0.7", // 3
Wayne Roberts 1:0817a150122b 1078 "1.0", // 4
Wayne Roberts 1:0817a150122b 1079 NULL
Wayne Roberts 1:0817a150122b 1080 };
Wayne Roberts 1:0817a150122b 1081
Wayne Roberts 1:0817a150122b 1082 unsigned Radio::gfsk_bt_read(bool forWriting)
Wayne Roberts 1:0817a150122b 1083 {
Wayne Roberts 1:0817a150122b 1084 shapeCfg_t shapeCfg;
Wayne Roberts 1:0817a150122b 1085 shapeCfg.octet = radio.readReg(REG_ADDR_SHAPECFG, 1);
Wayne Roberts 1:0817a150122b 1086 mpFSK.gfsk.PulseShape = shapeCfg.octet;
Wayne Roberts 1:0817a150122b 1087 if (shapeCfg.bits.pulse_shape)
Wayne Roberts 1:0817a150122b 1088 return shapeCfg.bits.bt + 1;
Wayne Roberts 1:0817a150122b 1089 else
Wayne Roberts 1:0817a150122b 1090 return 0;
Wayne Roberts 1:0817a150122b 1091 }
Wayne Roberts 1:0817a150122b 1092
Wayne Roberts 1:0817a150122b 1093 menuMode_e Radio::gfsk_bt_write(unsigned sidx)
Wayne Roberts 1:0817a150122b 1094 {
Wayne Roberts 1:0817a150122b 1095 switch (sidx) {
Wayne Roberts 1:0817a150122b 1096 case 0: mpFSK.gfsk.PulseShape = GFSK_SHAPE_NONE; break;
Wayne Roberts 1:0817a150122b 1097 case 1: mpFSK.gfsk.PulseShape = GFSK_SHAPE_BT0_3; break;
Wayne Roberts 1:0817a150122b 1098 case 2: mpFSK.gfsk.PulseShape = GFSK_SHAPE_BT0_5; break;
Wayne Roberts 1:0817a150122b 1099 case 3: mpFSK.gfsk.PulseShape = GFSK_SHAPE_BT0_7; break;
Wayne Roberts 1:0817a150122b 1100 case 4: mpFSK.gfsk.PulseShape = GFSK_SHAPE_BT1_0; break;
Wayne Roberts 1:0817a150122b 1101 }
Wayne Roberts 1:0817a150122b 1102 radio.xfer(OPCODE_SET_MODULATION_PARAMS, 8, 0, mpFSK.buf);
Wayne Roberts 1:0817a150122b 1103 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 1104 }
Wayne Roberts 1:0817a150122b 1105
Wayne Roberts 1:0817a150122b 1106 const dropdown_item_t Radio::gfsk_bt_item = { _ITEM_DROPDOWN, gfsk_bts, gfsk_bts, gfsk_bt_read, gfsk_bt_write};
Wayne Roberts 1:0817a150122b 1107
Wayne Roberts 1:0817a150122b 1108 static const uint8_t rx_bws[] = {
Wayne Roberts 1:0817a150122b 1109 GFSK_RX_BW_4800, GFSK_RX_BW_5800, GFSK_RX_BW_7300, GFSK_RX_BW_9700,
Wayne Roberts 1:0817a150122b 1110 GFSK_RX_BW_11700, GFSK_RX_BW_14600, GFSK_RX_BW_19500, GFSK_RX_BW_23400,
Wayne Roberts 1:0817a150122b 1111 GFSK_RX_BW_29300, GFSK_RX_BW_39000, GFSK_RX_BW_46900, GFSK_RX_BW_58600,
Wayne Roberts 1:0817a150122b 1112 GFSK_RX_BW_78200, GFSK_RX_BW_93800, GFSK_RX_BW_117300, GFSK_RX_BW_156200,
Wayne Roberts 1:0817a150122b 1113 GFSK_RX_BW_187200, GFSK_RX_BW_234300, GFSK_RX_BW_312000, GFSK_RX_BW_373600,
Wayne Roberts 1:0817a150122b 1114 GFSK_RX_BW_467000
Wayne Roberts 1:0817a150122b 1115 };
Wayne Roberts 1:0817a150122b 1116
Wayne Roberts 1:0817a150122b 1117 static const char* rxbw_str[] = {
Wayne Roberts 1:0817a150122b 1118 " 4.8KHz", " 5.8KHz", " 7.3KHz", " 9.7KHz",
Wayne Roberts 1:0817a150122b 1119 " 11.7KHz", " 14.6KHz", " 19.5KHz", " 23.4KHz",
Wayne Roberts 1:0817a150122b 1120 " 29.3KHz", " 39.0KHz", " 46.9KHz", " 58.6KHz",
Wayne Roberts 1:0817a150122b 1121 " 78.2KHz", " 93.8KHz", "117.3KHz", "156.2KHz",
Wayne Roberts 1:0817a150122b 1122 "187.2KHz", "234.3KHz", "312.0KHz", "373.6KHz",
Wayne Roberts 1:0817a150122b 1123 "467.0KHz",
Wayne Roberts 1:0817a150122b 1124 NULL
Wayne Roberts 1:0817a150122b 1125 };
Wayne Roberts 1:0817a150122b 1126
Wayne Roberts 1:0817a150122b 1127 unsigned Radio::gfsk_rxbw_read(bool forWriting)
Wayne Roberts 1:0817a150122b 1128 {
Wayne Roberts 1:0817a150122b 1129 unsigned n;
Wayne Roberts 1:0817a150122b 1130 bwSel_t bwSel;
Wayne Roberts 1:0817a150122b 1131 bwSel.octet = radio.readReg(REG_ADDR_BWSEL, 1);
Wayne Roberts 1:0817a150122b 1132 mpFSK.gfsk.bandwidth = bwSel.octet;
Wayne Roberts 1:0817a150122b 1133
Wayne Roberts 1:0817a150122b 1134 for (n = 0; n < sizeof(rx_bws); n++) {
Wayne Roberts 1:0817a150122b 1135 if (bwSel.octet == rx_bws[n])
Wayne Roberts 1:0817a150122b 1136 return n;
Wayne Roberts 1:0817a150122b 1137 }
Wayne Roberts 1:0817a150122b 1138 return sizeof(rx_bws);
Wayne Roberts 1:0817a150122b 1139 }
Wayne Roberts 1:0817a150122b 1140
Wayne Roberts 1:0817a150122b 1141 menuMode_e Radio::gfsk_rxbw_write(unsigned sidx)
Wayne Roberts 1:0817a150122b 1142 {
Wayne Roberts 1:0817a150122b 1143 mpFSK.gfsk.bandwidth = rx_bws[sidx];
Wayne Roberts 1:0817a150122b 1144 radio.xfer(OPCODE_SET_MODULATION_PARAMS, 8, 0, mpFSK.buf);
Wayne Roberts 1:0817a150122b 1145 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 1146 }
Wayne Roberts 1:0817a150122b 1147
Wayne Roberts 1:0817a150122b 1148 const dropdown_item_t Radio::gfsk_rxbw_item = { _ITEM_DROPDOWN, rxbw_str, rxbw_str, gfsk_rxbw_read, gfsk_rxbw_write};
Wayne Roberts 1:0817a150122b 1149
Wayne Roberts 1:0817a150122b 1150 void Radio::gfsk_fdev_print()
Wayne Roberts 1:0817a150122b 1151 {
Wayne Roberts 1:0817a150122b 1152 unsigned d = radio.readReg(REG_ADDR_FREQDEV, 3);
Wayne Roberts 1:0817a150122b 1153 pc.printf("%u", (unsigned)(d * FREQ_STEP));
Wayne Roberts 1:0817a150122b 1154 }
Wayne Roberts 1:0817a150122b 1155
Wayne Roberts 1:0817a150122b 1156 bool Radio::gfsk_fdev_write(const char* txt)
Wayne Roberts 1:0817a150122b 1157 {
Wayne Roberts 1:0817a150122b 1158 unsigned hz, fdev;
Wayne Roberts 1:0817a150122b 1159 if (sscanf(txt, "%u", &hz) == 1) {
Wayne Roberts 1:0817a150122b 1160 fdev = hz / FREQ_STEP;
Wayne Roberts 1:0817a150122b 1161 mpFSK.gfsk.fdevHi = fdev >> 16;
Wayne Roberts 1:0817a150122b 1162 mpFSK.gfsk.fdevMid = fdev >> 8;
Wayne Roberts 1:0817a150122b 1163 mpFSK.gfsk.fdevLo = fdev;
Wayne Roberts 1:0817a150122b 1164 radio.xfer(OPCODE_SET_MODULATION_PARAMS, 8, 0, mpFSK.buf);
Wayne Roberts 1:0817a150122b 1165 }
Wayne Roberts 1:0817a150122b 1166 return false;
Wayne Roberts 1:0817a150122b 1167 }
Wayne Roberts 1:0817a150122b 1168
Wayne Roberts 1:0817a150122b 1169 const value_item_t Radio::gfsk_fdev_item = { _ITEM_VALUE, 8, gfsk_fdev_print, gfsk_fdev_write};
Wayne Roberts 1:0817a150122b 1170
Wayne Roberts 1:0817a150122b 1171 void Radio::gfsk_pblLen_print()
Wayne Roberts 1:0817a150122b 1172 {
Wayne Roberts 1:0817a150122b 1173 unsigned n = radio.readReg(REG_ADDR_FSK_PREAMBLE_TXLEN , 2);
Wayne Roberts 1:0817a150122b 1174 ppFSK.gfsk.PreambleLengthHi = n << 8; // param1
Wayne Roberts 1:0817a150122b 1175 ppFSK.gfsk.PreambleLengthLo = n;// param2
Wayne Roberts 1:0817a150122b 1176 pc.printf("%u", n);
Wayne Roberts 1:0817a150122b 1177 }
Wayne Roberts 1:0817a150122b 1178
Wayne Roberts 1:0817a150122b 1179 bool Radio::gfsk_pblLen_write(const char* txt)
Wayne Roberts 1:0817a150122b 1180 {
Wayne Roberts 1:0817a150122b 1181 unsigned n;
Wayne Roberts 1:0817a150122b 1182 if (sscanf(txt, "%u", &n) == 1) {
Wayne Roberts 1:0817a150122b 1183 ppFSK.gfsk.PreambleLengthHi = n << 8; // param1
Wayne Roberts 1:0817a150122b 1184 ppFSK.gfsk.PreambleLengthLo = n;// param2
Wayne Roberts 1:0817a150122b 1185 radio.xfer(OPCODE_SET_PACKET_PARAMS, 9, 0, ppFSK.buf);
Wayne Roberts 1:0817a150122b 1186 }
Wayne Roberts 1:0817a150122b 1187 return false;
Wayne Roberts 1:0817a150122b 1188 }
Wayne Roberts 1:0817a150122b 1189
Wayne Roberts 1:0817a150122b 1190 const value_item_t Radio::gfsk_pblLen_item = { _ITEM_VALUE, 5, gfsk_pblLen_print, gfsk_pblLen_write};
Wayne Roberts 1:0817a150122b 1191
Wayne Roberts 1:0817a150122b 1192 static const char* fsk_detlens[] = {
Wayne Roberts 1:0817a150122b 1193 " off ",
Wayne Roberts 1:0817a150122b 1194 " 8bits",
Wayne Roberts 1:0817a150122b 1195 "16bits",
Wayne Roberts 1:0817a150122b 1196 "24bits",
Wayne Roberts 1:0817a150122b 1197 "32bits",
Wayne Roberts 1:0817a150122b 1198 NULL
Wayne Roberts 1:0817a150122b 1199 };
Wayne Roberts 1:0817a150122b 1200
Wayne Roberts 1:0817a150122b 1201 unsigned Radio::gfsk_pblDetLen_read(bool forWriting)
Wayne Roberts 1:0817a150122b 1202 {
Wayne Roberts 1:0817a150122b 1203 pktCtrl1_t pktCtrl1;
Wayne Roberts 1:0817a150122b 1204 pktCtrl1.octet = radio.readReg(REG_ADDR_FSK_PKTCTRL1, 1);
Wayne Roberts 1:0817a150122b 1205 ppFSK.gfsk.PreambleDetectorLength = pktCtrl1.octet & 0x07; // param3
Wayne Roberts 1:0817a150122b 1206 if (pktCtrl1.bits.preamble_det_on)
Wayne Roberts 1:0817a150122b 1207 return pktCtrl1.bits.preamble_len_rx + 1;
Wayne Roberts 1:0817a150122b 1208 else
Wayne Roberts 1:0817a150122b 1209 return 0;
Wayne Roberts 1:0817a150122b 1210 }
Wayne Roberts 1:0817a150122b 1211
Wayne Roberts 1:0817a150122b 1212 menuMode_e Radio::gfsk_pblDetLen_write(unsigned sidx)
Wayne Roberts 1:0817a150122b 1213 {
Wayne Roberts 1:0817a150122b 1214 if (sidx == 0)
Wayne Roberts 1:0817a150122b 1215 ppFSK.gfsk.PreambleDetectorLength = 0;
Wayne Roberts 1:0817a150122b 1216 else
Wayne Roberts 1:0817a150122b 1217 ppFSK.gfsk.PreambleDetectorLength = sidx + 3;
Wayne Roberts 1:0817a150122b 1218
Wayne Roberts 1:0817a150122b 1219 radio.xfer(OPCODE_SET_PACKET_PARAMS, 9, 0, ppFSK.buf);
Wayne Roberts 1:0817a150122b 1220 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 1221 }
Wayne Roberts 1:0817a150122b 1222
Wayne Roberts 1:0817a150122b 1223 const dropdown_item_t Radio::gfsk_pblDetLen_item = { _ITEM_DROPDOWN, fsk_detlens, fsk_detlens, gfsk_pblDetLen_read, gfsk_pblDetLen_write};
Wayne Roberts 1:0817a150122b 1224
Wayne Roberts 1:0817a150122b 1225 void Radio::gfsk_swl_print()
Wayne Roberts 1:0817a150122b 1226 {
Wayne Roberts 1:0817a150122b 1227 ppFSK.gfsk.SyncWordLength = radio.readReg(REG_ADDR_FSK_SYNC_LEN, 1);// param4
Wayne Roberts 1:0817a150122b 1228 pc.printf("%u", ppFSK.gfsk.SyncWordLength);
Wayne Roberts 1:0817a150122b 1229 }
Wayne Roberts 1:0817a150122b 1230
Wayne Roberts 1:0817a150122b 1231 bool Radio::gfsk_swl_write(const char* txt)
Wayne Roberts 1:0817a150122b 1232 {
Wayne Roberts 1:0817a150122b 1233 unsigned n;
Wayne Roberts 1:0817a150122b 1234 unsigned r;
Wayne Roberts 1:0817a150122b 1235 r = sscanf(txt, "%u", &n);
Wayne Roberts 1:0817a150122b 1236 if (r == 1) {
Wayne Roberts 1:0817a150122b 1237 ppFSK.gfsk.SyncWordLength = n;
Wayne Roberts 1:0817a150122b 1238 radio.xfer(OPCODE_SET_PACKET_PARAMS, 9, 0, ppFSK.buf);
Wayne Roberts 1:0817a150122b 1239 }
Wayne Roberts 1:0817a150122b 1240 return false;
Wayne Roberts 1:0817a150122b 1241 }
Wayne Roberts 1:0817a150122b 1242
Wayne Roberts 1:0817a150122b 1243 const value_item_t Radio::gfsk_swl_item = { _ITEM_VALUE, 3, gfsk_swl_print, gfsk_swl_write};
Wayne Roberts 1:0817a150122b 1244
Wayne Roberts 1:0817a150122b 1245 void Radio::gfsk_syncword_print()
Wayne Roberts 1:0817a150122b 1246 {
Wayne Roberts 1:0817a150122b 1247 unsigned addr = REG_ADDR_SYNCADDR;
Wayne Roberts 1:0817a150122b 1248 uint8_t swl_bits = radio.readReg(REG_ADDR_FSK_SYNC_LEN, 1);
Wayne Roberts 1:0817a150122b 1249 if (swl_bits & 7) {
Wayne Roberts 1:0817a150122b 1250 swl_bits |= 7;
Wayne Roberts 1:0817a150122b 1251 swl_bits++;
Wayne Roberts 1:0817a150122b 1252 }
Wayne Roberts 1:0817a150122b 1253 while (swl_bits > 0) {
Wayne Roberts 1:0817a150122b 1254 pc.printf("%02x", radio.readReg(addr++, 1));
Wayne Roberts 1:0817a150122b 1255 swl_bits -= 8;
Wayne Roberts 1:0817a150122b 1256 }
Wayne Roberts 1:0817a150122b 1257 }
Wayne Roberts 1:0817a150122b 1258
Wayne Roberts 1:0817a150122b 1259 bool Radio::gfsk_syncword_write(const char* txt)
Wayne Roberts 1:0817a150122b 1260 {
Wayne Roberts 1:0817a150122b 1261 const char* ptr = txt;
Wayne Roberts 1:0817a150122b 1262 unsigned addr = REG_ADDR_SYNCADDR;
Wayne Roberts 1:0817a150122b 1263 int8_t swl_bits = radio.readReg(REG_ADDR_FSK_SYNC_LEN, 1);
Wayne Roberts 1:0817a150122b 1264 if (swl_bits & 7) {
Wayne Roberts 1:0817a150122b 1265 swl_bits |= 7;
Wayne Roberts 1:0817a150122b 1266 swl_bits++;
Wayne Roberts 1:0817a150122b 1267 }
Wayne Roberts 1:0817a150122b 1268 while (swl_bits > 0) {
Wayne Roberts 1:0817a150122b 1269 char buf[3];
Wayne Roberts 1:0817a150122b 1270 unsigned n;
Wayne Roberts 1:0817a150122b 1271 buf[0] = ptr[0];
Wayne Roberts 1:0817a150122b 1272 buf[1] = ptr[1];
Wayne Roberts 1:0817a150122b 1273 buf[2] = 0;
Wayne Roberts 1:0817a150122b 1274 sscanf(buf, "%x", &n);
Wayne Roberts 1:0817a150122b 1275 radio.writeReg(addr++, n, 1);
Wayne Roberts 1:0817a150122b 1276 ptr += 2;
Wayne Roberts 1:0817a150122b 1277 swl_bits -= 8;
Wayne Roberts 1:0817a150122b 1278 }
Wayne Roberts 1:0817a150122b 1279 return false;
Wayne Roberts 1:0817a150122b 1280 }
Wayne Roberts 1:0817a150122b 1281
Wayne Roberts 1:0817a150122b 1282 const value_item_t Radio::gfsk_syncword_item = { _ITEM_VALUE, 17, gfsk_syncword_print, gfsk_syncword_write};
Wayne Roberts 1:0817a150122b 1283
Wayne Roberts 1:0817a150122b 1284 bool Radio::gfsk_fixLen_read()
Wayne Roberts 1:0817a150122b 1285 {
Wayne Roberts 1:0817a150122b 1286 pktCtrl0_t pktCtrl0;
Wayne Roberts 1:0817a150122b 1287 pktCtrl0.octet = radio.readReg(REG_ADDR_FSK_PKTCTRL0, 1);
Wayne Roberts 1:0817a150122b 1288 ppFSK.gfsk.PacketType = pktCtrl0.bits.pkt_len_format; // param6
Wayne Roberts 1:0817a150122b 1289 return pktCtrl0.bits.pkt_len_format;
Wayne Roberts 1:0817a150122b 1290 }
Wayne Roberts 1:0817a150122b 1291
Wayne Roberts 1:0817a150122b 1292 bool Radio::gfsk_fixLen_push()
Wayne Roberts 1:0817a150122b 1293 {
Wayne Roberts 1:0817a150122b 1294 if (ppFSK.gfsk.PacketType)
Wayne Roberts 1:0817a150122b 1295 ppFSK.gfsk.PacketType = 0;
Wayne Roberts 1:0817a150122b 1296 else
Wayne Roberts 1:0817a150122b 1297 ppFSK.gfsk.PacketType = 1;
Wayne Roberts 1:0817a150122b 1298
Wayne Roberts 1:0817a150122b 1299 radio.xfer(OPCODE_SET_PACKET_PARAMS, 9, 0, ppFSK.buf);
Wayne Roberts 1:0817a150122b 1300 return ppFSK.gfsk.PacketType;
Wayne Roberts 1:0817a150122b 1301 }
Wayne Roberts 1:0817a150122b 1302
Wayne Roberts 1:0817a150122b 1303 const toggle_item_t Radio::gfsk_fixLen_item = { _ITEM_TOGGLE,
Wayne Roberts 1:0817a150122b 1304 "fixed ",
Wayne Roberts 1:0817a150122b 1305 "variable",
Wayne Roberts 1:0817a150122b 1306 gfsk_fixLen_read, gfsk_fixLen_push
Wayne Roberts 1:0817a150122b 1307 };
Wayne Roberts 1:0817a150122b 1308
Wayne Roberts 1:0817a150122b 1309
Wayne Roberts 1:0817a150122b 1310 static const char* addrcomps[] = {
Wayne Roberts 1:0817a150122b 1311 " off ",
Wayne Roberts 1:0817a150122b 1312 "NodeAddress ",
Wayne Roberts 1:0817a150122b 1313 "NodeAddress+broadcast",
Wayne Roberts 1:0817a150122b 1314 NULL
Wayne Roberts 1:0817a150122b 1315 };
Wayne Roberts 1:0817a150122b 1316
Wayne Roberts 1:0817a150122b 1317 unsigned Radio::gfsk_addrcomp_read(bool forWriting)
Wayne Roberts 1:0817a150122b 1318 {
Wayne Roberts 1:0817a150122b 1319 ppFSK.gfsk.AddrComp = radio.readReg(REG_ADDR_NODEADDRCOMP, 1);// param5
Wayne Roberts 1:0817a150122b 1320 return ppFSK.gfsk.AddrComp;
Wayne Roberts 1:0817a150122b 1321 }
Wayne Roberts 1:0817a150122b 1322
Wayne Roberts 1:0817a150122b 1323 menuMode_e Radio::gfsk_addrcomp_write(unsigned sidx)
Wayne Roberts 1:0817a150122b 1324 {
Wayne Roberts 1:0817a150122b 1325 ppFSK.gfsk.AddrComp = sidx;
Wayne Roberts 1:0817a150122b 1326 radio.xfer(OPCODE_SET_PACKET_PARAMS, 9, 0, ppFSK.buf);
Wayne Roberts 1:0817a150122b 1327 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 1328 }
Wayne Roberts 1:0817a150122b 1329
Wayne Roberts 1:0817a150122b 1330 const dropdown_item_t Radio::gfsk_addrcomp_item = { _ITEM_DROPDOWN, addrcomps, addrcomps, gfsk_addrcomp_read, gfsk_addrcomp_write};
Wayne Roberts 1:0817a150122b 1331
Wayne Roberts 1:0817a150122b 1332 void Radio::gfsk_nodeadrs_print()
Wayne Roberts 1:0817a150122b 1333 {
Wayne Roberts 1:0817a150122b 1334 pc.printf("%02x", radio.readReg(REG_ADDR_NODEADDR, 1));
Wayne Roberts 1:0817a150122b 1335 }
Wayne Roberts 1:0817a150122b 1336
Wayne Roberts 1:0817a150122b 1337 bool Radio::gfsk_nodeadrs_write(const char* txt)
Wayne Roberts 1:0817a150122b 1338 {
Wayne Roberts 1:0817a150122b 1339 unsigned v;
Wayne Roberts 1:0817a150122b 1340 if (sscanf(txt, "%x", &v) == 1)
Wayne Roberts 1:0817a150122b 1341 radio.writeReg(REG_ADDR_NODEADDR, v, 1);
Wayne Roberts 1:0817a150122b 1342
Wayne Roberts 1:0817a150122b 1343 return false;
Wayne Roberts 1:0817a150122b 1344 }
Wayne Roberts 1:0817a150122b 1345
Wayne Roberts 1:0817a150122b 1346 const value_item_t Radio::gfsk_nodeadrs_item = { _ITEM_VALUE, 3, gfsk_nodeadrs_print, gfsk_nodeadrs_write};
Wayne Roberts 1:0817a150122b 1347
Wayne Roberts 1:0817a150122b 1348 void Radio::gfsk_broadcast_print()
Wayne Roberts 1:0817a150122b 1349 {
Wayne Roberts 1:0817a150122b 1350 pc.printf("%02x", radio.readReg(REG_ADDR_BROADCAST, 1));
Wayne Roberts 1:0817a150122b 1351 }
Wayne Roberts 1:0817a150122b 1352
Wayne Roberts 1:0817a150122b 1353 bool Radio::gfsk_broadcast_write(const char* txt)
Wayne Roberts 1:0817a150122b 1354 {
Wayne Roberts 1:0817a150122b 1355 unsigned v;
Wayne Roberts 1:0817a150122b 1356 if (sscanf(txt, "%x", &v) == 1)
Wayne Roberts 1:0817a150122b 1357 radio.writeReg(REG_ADDR_BROADCAST, v, 1);
Wayne Roberts 1:0817a150122b 1358
Wayne Roberts 1:0817a150122b 1359 return false;
Wayne Roberts 1:0817a150122b 1360 }
Wayne Roberts 1:0817a150122b 1361
Wayne Roberts 1:0817a150122b 1362 const value_item_t Radio::gfsk_broadcast_item = { _ITEM_VALUE, 3, gfsk_broadcast_print, gfsk_broadcast_write};
Wayne Roberts 1:0817a150122b 1363
Wayne Roberts 1:0817a150122b 1364 static const char* crctypes[] = {
Wayne Roberts 1:0817a150122b 1365 " off ", // 0
Wayne Roberts 1:0817a150122b 1366 "1 Byte ", // 1
Wayne Roberts 1:0817a150122b 1367 "2 Byte ", // 2
Wayne Roberts 1:0817a150122b 1368 "1 Byte inv", // 3
Wayne Roberts 1:0817a150122b 1369 "2 Byte inv", // 4
Wayne Roberts 1:0817a150122b 1370 NULL
Wayne Roberts 1:0817a150122b 1371 };
Wayne Roberts 1:0817a150122b 1372
Wayne Roberts 1:0817a150122b 1373 unsigned Radio::gfsk_crctype_read(bool forWriting)
Wayne Roberts 1:0817a150122b 1374 {
Wayne Roberts 1:0817a150122b 1375 pktCtrl2_t pktCtrl2;
Wayne Roberts 1:0817a150122b 1376 pktCtrl2.octet = radio.readReg(REG_ADDR_FSK_PKTCTRL2, 1);
Wayne Roberts 1:0817a150122b 1377 ppFSK.gfsk.CRCType = pktCtrl2.octet & 0x7; // param8
Wayne Roberts 1:0817a150122b 1378 switch (ppFSK.gfsk.CRCType) {
Wayne Roberts 1:0817a150122b 1379 case GFSK_CRC_OFF: return 0;
Wayne Roberts 1:0817a150122b 1380 case GFSK_CRC_1_BYTE: return 1;
Wayne Roberts 1:0817a150122b 1381 case GFSK_CRC_2_BYTE: return 2;
Wayne Roberts 1:0817a150122b 1382 case GFSK_CRC_1_BYTE_INV: return 3;
Wayne Roberts 1:0817a150122b 1383 case GFSK_CRC_2_BYTE_INV: return 4;
Wayne Roberts 1:0817a150122b 1384 default: return 5;
Wayne Roberts 1:0817a150122b 1385 }
Wayne Roberts 1:0817a150122b 1386 }
Wayne Roberts 1:0817a150122b 1387
Wayne Roberts 1:0817a150122b 1388 menuMode_e Radio::gfsk_crctype_write(unsigned sidx)
Wayne Roberts 1:0817a150122b 1389 {
Wayne Roberts 1:0817a150122b 1390 switch (sidx) {
Wayne Roberts 1:0817a150122b 1391 case 0: ppFSK.gfsk.CRCType = GFSK_CRC_OFF; break;
Wayne Roberts 1:0817a150122b 1392 case 1: ppFSK.gfsk.CRCType = GFSK_CRC_1_BYTE; break;
Wayne Roberts 1:0817a150122b 1393 case 2: ppFSK.gfsk.CRCType = GFSK_CRC_2_BYTE; break;
Wayne Roberts 1:0817a150122b 1394 case 3: ppFSK.gfsk.CRCType = GFSK_CRC_1_BYTE_INV; break;
Wayne Roberts 1:0817a150122b 1395 case 4: ppFSK.gfsk.CRCType = GFSK_CRC_2_BYTE_INV; break;
Wayne Roberts 1:0817a150122b 1396 }
Wayne Roberts 1:0817a150122b 1397
Wayne Roberts 1:0817a150122b 1398 radio.xfer(OPCODE_SET_PACKET_PARAMS, 9, 0, ppFSK.buf);
Wayne Roberts 1:0817a150122b 1399 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 1400 }
Wayne Roberts 1:0817a150122b 1401
Wayne Roberts 1:0817a150122b 1402 const dropdown_item_t Radio::gfsk_crctype_item = { _ITEM_DROPDOWN, crctypes, crctypes, gfsk_crctype_read, gfsk_crctype_write};
Wayne Roberts 1:0817a150122b 1403
Wayne Roberts 1:0817a150122b 1404 bool Radio::gfsk_white_read()
Wayne Roberts 1:0817a150122b 1405 {
Wayne Roberts 1:0817a150122b 1406 pktCtrl2_t pktCtrl2;
Wayne Roberts 1:0817a150122b 1407 pktCtrl2.octet = radio.readReg(REG_ADDR_FSK_PKTCTRL2, 1);
Wayne Roberts 1:0817a150122b 1408 ppFSK.gfsk.Whitening = pktCtrl2.bits.whit_enable; // param9
Wayne Roberts 1:0817a150122b 1409 return pktCtrl2.bits.whit_enable;
Wayne Roberts 1:0817a150122b 1410 }
Wayne Roberts 1:0817a150122b 1411
Wayne Roberts 1:0817a150122b 1412 bool Radio::gfsk_white_push()
Wayne Roberts 1:0817a150122b 1413 {
Wayne Roberts 1:0817a150122b 1414 if (ppFSK.gfsk.Whitening)
Wayne Roberts 1:0817a150122b 1415 ppFSK.gfsk.Whitening = 0;
Wayne Roberts 1:0817a150122b 1416 else
Wayne Roberts 1:0817a150122b 1417 ppFSK.gfsk.Whitening = 1;
Wayne Roberts 1:0817a150122b 1418
Wayne Roberts 1:0817a150122b 1419 radio.xfer(OPCODE_SET_PACKET_PARAMS, 9, 0, ppFSK.buf);
Wayne Roberts 1:0817a150122b 1420 return ppFSK.gfsk.Whitening;
Wayne Roberts 1:0817a150122b 1421 }
Wayne Roberts 1:0817a150122b 1422
Wayne Roberts 1:0817a150122b 1423 const toggle_item_t Radio::gfsk_white_item = { _ITEM_TOGGLE, "Whitening", NULL, gfsk_white_read, gfsk_white_push};
Wayne Roberts 1:0817a150122b 1424
Wayne Roberts 1:0817a150122b 1425 void Radio::gfsk_crcinit_print()
Wayne Roberts 1:0817a150122b 1426 {
Wayne Roberts 1:0817a150122b 1427 pc.printf("%04x", radio.readReg(REG_ADDR_FSK_CRCINIT, 2));
Wayne Roberts 1:0817a150122b 1428 }
Wayne Roberts 1:0817a150122b 1429
Wayne Roberts 1:0817a150122b 1430 bool Radio::gfsk_crcinit_write(const char* txt)
Wayne Roberts 1:0817a150122b 1431 {
Wayne Roberts 1:0817a150122b 1432 unsigned v;
Wayne Roberts 1:0817a150122b 1433 if (sscanf(txt, "%x", &v) == 1)
Wayne Roberts 1:0817a150122b 1434 radio.writeReg(REG_ADDR_FSK_CRCINIT, v, 2);
Wayne Roberts 1:0817a150122b 1435
Wayne Roberts 1:0817a150122b 1436 return false;
Wayne Roberts 1:0817a150122b 1437 }
Wayne Roberts 1:0817a150122b 1438
Wayne Roberts 1:0817a150122b 1439 const value_item_t Radio::gfsk_crcinit_item = { _ITEM_VALUE, 5, gfsk_crcinit_print, gfsk_crcinit_write};
Wayne Roberts 1:0817a150122b 1440
Wayne Roberts 1:0817a150122b 1441 void Radio::gfsk_crcpoly_print()
Wayne Roberts 1:0817a150122b 1442 {
Wayne Roberts 1:0817a150122b 1443 pc.printf("%04x", radio.readReg(REG_ADDR_FSK_CRCPOLY, 2));
Wayne Roberts 1:0817a150122b 1444 }
Wayne Roberts 1:0817a150122b 1445
Wayne Roberts 1:0817a150122b 1446 bool Radio::gfsk_crcpoly_write(const char* txt)
Wayne Roberts 1:0817a150122b 1447 {
Wayne Roberts 1:0817a150122b 1448 unsigned v;
Wayne Roberts 1:0817a150122b 1449 if (sscanf(txt, "%x", &v) == 1)
Wayne Roberts 1:0817a150122b 1450 radio.writeReg(REG_ADDR_FSK_CRCPOLY, v, 2);
Wayne Roberts 1:0817a150122b 1451
Wayne Roberts 1:0817a150122b 1452 return false;
Wayne Roberts 1:0817a150122b 1453 }
Wayne Roberts 1:0817a150122b 1454
Wayne Roberts 1:0817a150122b 1455 const value_item_t Radio::gfsk_crcpoly_item = { _ITEM_VALUE, 5, gfsk_crcpoly_print, gfsk_crcpoly_write};
Wayne Roberts 1:0817a150122b 1456
Wayne Roberts 1:0817a150122b 1457 void Radio::gfsk_whiteInit_print()
Wayne Roberts 1:0817a150122b 1458 {
Wayne Roberts 1:0817a150122b 1459 PktCtrl1a_t PktCtrl1a;
Wayne Roberts 1:0817a150122b 1460 PktCtrl1a.word = radio.readReg(REG_ADDR_FSK_PKTCTRL1A, 2);
Wayne Roberts 1:0817a150122b 1461 pc.printf("%x", PktCtrl1a.bits.whit_init_val);
Wayne Roberts 1:0817a150122b 1462 }
Wayne Roberts 1:0817a150122b 1463
Wayne Roberts 1:0817a150122b 1464 bool Radio::gfsk_whiteInit_write(const char* txt)
Wayne Roberts 1:0817a150122b 1465 {
Wayne Roberts 1:0817a150122b 1466 unsigned n;
Wayne Roberts 1:0817a150122b 1467 PktCtrl1a_t PktCtrl1a;
Wayne Roberts 1:0817a150122b 1468 PktCtrl1a.word = radio.readReg(REG_ADDR_FSK_PKTCTRL1A, 2);
Wayne Roberts 1:0817a150122b 1469 if (sscanf(txt, "%x", &n) == 1) {
Wayne Roberts 1:0817a150122b 1470 PktCtrl1a.bits.whit_init_val = n;
Wayne Roberts 1:0817a150122b 1471 radio.writeReg(REG_ADDR_FSK_PKTCTRL1A, PktCtrl1a.word, 2);
Wayne Roberts 1:0817a150122b 1472 }
Wayne Roberts 1:0817a150122b 1473 return false;
Wayne Roberts 1:0817a150122b 1474 }
Wayne Roberts 1:0817a150122b 1475
Wayne Roberts 1:0817a150122b 1476 const value_item_t Radio::gfsk_whiteInit_item = { _ITEM_VALUE, 5, gfsk_whiteInit_print, gfsk_whiteInit_write};
Wayne Roberts 1:0817a150122b 1477
Wayne Roberts 1:0817a150122b 1478 const menu_t Radio::gfsk_menu[] = {
Wayne Roberts 1:0817a150122b 1479 { {FIRST_CHIP_MENU_ROW+1, 1}, "bps:", &gfsk_bitrate_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1480 { {FIRST_CHIP_MENU_ROW+1, 15}, "bt:", &gfsk_bt_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1481 { {FIRST_CHIP_MENU_ROW+1, 23}, "rxbw:", &gfsk_rxbw_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1482 { {FIRST_CHIP_MENU_ROW+1, 39}, "fdev:", &gfsk_fdev_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1483 { {FIRST_CHIP_MENU_ROW+1, 53}, NULL, &gfsk_fixLen_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1484
Wayne Roberts 1:0817a150122b 1485 { {FIRST_CHIP_MENU_ROW+2, 1}, "PreambleLength:", &gfsk_pblLen_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1486 { {FIRST_CHIP_MENU_ROW+2, 21}, "PreambleDetectorLength:", &gfsk_pblDetLen_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1487 { {FIRST_CHIP_MENU_ROW+2, 51}, "SyncWordLength bits:", &gfsk_swl_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1488
Wayne Roberts 1:0817a150122b 1489 { {FIRST_CHIP_MENU_ROW+3, 1}, "SyncWord:", &gfsk_syncword_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1490
Wayne Roberts 1:0817a150122b 1491 { {FIRST_CHIP_MENU_ROW+4, 1}, "AddrComp:", &gfsk_addrcomp_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1492 { {FIRST_CHIP_MENU_ROW+4, 33}, "NodeAdrs:", &gfsk_nodeadrs_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1493 { {FIRST_CHIP_MENU_ROW+4, 47}, "broadcast:", &gfsk_broadcast_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1494
Wayne Roberts 1:0817a150122b 1495 { {FIRST_CHIP_MENU_ROW+5, 1}, "crcType:", &gfsk_crctype_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1496 { {FIRST_CHIP_MENU_ROW+5, 21}, "crcInit:", &gfsk_crcinit_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1497 { {FIRST_CHIP_MENU_ROW+5, 34}, "crcPoly:", &gfsk_crcpoly_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1498
Wayne Roberts 1:0817a150122b 1499 { {FIRST_CHIP_MENU_ROW+6, 1}, NULL, &gfsk_white_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1500 { {FIRST_CHIP_MENU_ROW+6, 12}, "lfsr init:", &gfsk_whiteInit_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1501 //12345678901234567890123456789012
Wayne Roberts 1:0817a150122b 1502
Wayne Roberts 1:0817a150122b 1503 { {0, 0}, NULL, NULL }
Wayne Roberts 1:0817a150122b 1504 };
Wayne Roberts 1:0817a150122b 1505
Wayne Roberts 1:0817a150122b 1506 const menu_t* Radio::get_modem_sub_menu() { return NULL; }
Wayne Roberts 1:0817a150122b 1507
Wayne Roberts 1:0817a150122b 1508 const menu_t* Radio::get_modem_menu()
Wayne Roberts 1:0817a150122b 1509 {
Wayne Roberts 1:0817a150122b 1510 pktType = radio.getPacketType();
Wayne Roberts 1:0817a150122b 1511
Wayne Roberts 1:0817a150122b 1512 if (pktType == PACKET_TYPE_LORA) {
Wayne Roberts 1:0817a150122b 1513 return lora_menu;
Wayne Roberts 1:0817a150122b 1514 } else if (pktType == PACKET_TYPE_GFSK) {
Wayne Roberts 1:0817a150122b 1515 return gfsk_menu;
Wayne Roberts 1:0817a150122b 1516 }
Wayne Roberts 1:0817a150122b 1517
Wayne Roberts 1:0817a150122b 1518 return NULL;
Wayne Roberts 1:0817a150122b 1519 }
Wayne Roberts 1:0817a150122b 1520
Wayne Roberts 1:0817a150122b 1521 #endif /* ..SX126x_H */
Wayne Roberts 1:0817a150122b 1522