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:
dudmuck
Date:
Thu Sep 16 21:57:23 2021 +0000
Revision:
14:14b9e1c08bfc
Parent:
13:8ce61a1897ab
BufferedSerial flush printf

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