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

radio chip selection

Radio chip driver is not included, allowing choice of radio device.
If you're using SX1272 or SX1276, then import sx127x driver into your program.
if you're using SX1261 or SX1262, then import sx126x driver into your program.
if you're using SX1280, then import sx1280 driver into your program.
if you're using LR1110, then import LR1110 driver into your program.
If you're using NAmote72 or Murata discovery, then you must import only sx127x driver.
If you're using Type1SJ select target DISCO_L072CZ_LRWAN1 and import sx126x driver into your program.

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

Committer:
Wayne Roberts
Date:
Mon Aug 20 18:13:09 2018 -0700
Revision:
1:0817a150122b
Child:
2:ea9245bb1c53
add source files

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 SX127x_H
Wayne Roberts 1:0817a150122b 3
Wayne Roberts 1:0817a150122b 4 const char* const Radio::chipNum_str = "SX127x";
Wayne Roberts 1:0817a150122b 5
Wayne Roberts 1:0817a150122b 6 const RadioEvents_t* Radio::RadioEvents;
Wayne Roberts 1:0817a150122b 7 LowPowerTimer Radio::lpt;
Wayne Roberts 1:0817a150122b 8 uint8_t Radio::bw_idx;
Wayne Roberts 1:0817a150122b 9
Wayne Roberts 1:0817a150122b 10 RegPaRamp_t Radio::RegPaRamp;
Wayne Roberts 1:0817a150122b 11
Wayne Roberts 1:0817a150122b 12 const char* opModes[] = {
Wayne Roberts 1:0817a150122b 13 "SLEEP ", // 0
Wayne Roberts 1:0817a150122b 14 "STANDBY ", // 1
Wayne Roberts 1:0817a150122b 15 "FS_TX ", // 2
Wayne Roberts 1:0817a150122b 16 "TX ", // 3
Wayne Roberts 1:0817a150122b 17 "FS_RX ", // 4
Wayne Roberts 1:0817a150122b 18 "RX ", // 5
Wayne Roberts 1:0817a150122b 19 "RX_SINGLE", // 6
Wayne Roberts 1:0817a150122b 20 "CAD " // 7
Wayne Roberts 1:0817a150122b 21 };
Wayne Roberts 1:0817a150122b 22
Wayne Roberts 1:0817a150122b 23 const char* Radio::tx_ramp_strs[] = {
Wayne Roberts 1:0817a150122b 24 "3400", // 0
Wayne Roberts 1:0817a150122b 25 "2000", // 1
Wayne Roberts 1:0817a150122b 26 "1000", // 2
Wayne Roberts 1:0817a150122b 27 "500 ", // 3
Wayne Roberts 1:0817a150122b 28 "250 ", // 4
Wayne Roberts 1:0817a150122b 29 "125 ", // 5
Wayne Roberts 1:0817a150122b 30 "100 ", // 6
Wayne Roberts 1:0817a150122b 31 "62 ", // 7
Wayne Roberts 1:0817a150122b 32 "50 ", // 8
Wayne Roberts 1:0817a150122b 33 "40 ", // 9
Wayne Roberts 1:0817a150122b 34 "31 ", // 10
Wayne Roberts 1:0817a150122b 35 "25 ", // 11
Wayne Roberts 1:0817a150122b 36 "20 ", // 12
Wayne Roberts 1:0817a150122b 37 "15 ", // 13
Wayne Roberts 1:0817a150122b 38 "12 ", // 14
Wayne Roberts 1:0817a150122b 39 "10 ", // 15
Wayne Roberts 1:0817a150122b 40 NULL
Wayne Roberts 1:0817a150122b 41 };
Wayne Roberts 1:0817a150122b 42
Wayne Roberts 1:0817a150122b 43 unsigned Radio::tx_ramp_read_cb(bool fw)
Wayne Roberts 1:0817a150122b 44 {
Wayne Roberts 1:0817a150122b 45 RegPaRamp.octet = radio.read_reg(REG_PARAMP);
Wayne Roberts 1:0817a150122b 46 return RegPaRamp.bits.PaRamp;
Wayne Roberts 1:0817a150122b 47 }
Wayne Roberts 1:0817a150122b 48
Wayne Roberts 1:0817a150122b 49 menuMode_e Radio::tx_ramp_write_cb(unsigned val)
Wayne Roberts 1:0817a150122b 50 {
Wayne Roberts 1:0817a150122b 51 RegPaRamp.octet = radio.read_reg(REG_PARAMP);
Wayne Roberts 1:0817a150122b 52
Wayne Roberts 1:0817a150122b 53 RegPaRamp.bits.PaRamp = val;
Wayne Roberts 1:0817a150122b 54 radio.write_reg(REG_PARAMP, RegPaRamp.octet);
Wayne Roberts 1:0817a150122b 55
Wayne Roberts 1:0817a150122b 56 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 57 }
Wayne Roberts 1:0817a150122b 58
Wayne Roberts 1:0817a150122b 59 const char* const Radio::pktType_strs[] = {
Wayne Roberts 1:0817a150122b 60 "FSK ", // 0
Wayne Roberts 1:0817a150122b 61 "OOK ", // 1
Wayne Roberts 1:0817a150122b 62 "LORA", // 2
Wayne Roberts 1:0817a150122b 63 NULL
Wayne Roberts 1:0817a150122b 64 };
Wayne Roberts 1:0817a150122b 65
Wayne Roberts 1:0817a150122b 66 unsigned Radio::pktType_read_cb(bool fw)
Wayne Roberts 1:0817a150122b 67 {
Wayne Roberts 1:0817a150122b 68 radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
Wayne Roberts 1:0817a150122b 69 if (radio.RegOpMode.bits.LongRangeMode)
Wayne Roberts 1:0817a150122b 70 return 2;
Wayne Roberts 1:0817a150122b 71 else
Wayne Roberts 1:0817a150122b 72 return radio.RegOpMode.bits.ModulationType;
Wayne Roberts 1:0817a150122b 73 }
Wayne Roberts 1:0817a150122b 74
Wayne Roberts 1:0817a150122b 75 menuMode_e Radio::pktType_write_cb(unsigned idx)
Wayne Roberts 1:0817a150122b 76 {
Wayne Roberts 1:0817a150122b 77 if (idx == 2) {
Wayne Roberts 1:0817a150122b 78 if (!radio.RegOpMode.bits.LongRangeMode) {
Wayne Roberts 1:0817a150122b 79 /* to lora */
Wayne Roberts 1:0817a150122b 80 radio.set_opmode(RF_OPMODE_SLEEP);
Wayne Roberts 1:0817a150122b 81 radio.RegOpMode.bits.LongRangeMode = 1;
Wayne Roberts 1:0817a150122b 82 wait_us(1000);
Wayne Roberts 1:0817a150122b 83 radio.write_reg(REG_OPMODE, radio.RegOpMode.octet);
Wayne Roberts 1:0817a150122b 84 }
Wayne Roberts 1:0817a150122b 85 } else {
Wayne Roberts 1:0817a150122b 86 if (radio.RegOpMode.bits.LongRangeMode) {
Wayne Roberts 1:0817a150122b 87 /* from lora */
Wayne Roberts 1:0817a150122b 88 radio.set_opmode(RF_OPMODE_SLEEP);
Wayne Roberts 1:0817a150122b 89 radio.RegOpMode.bits.LongRangeMode = 0;
Wayne Roberts 1:0817a150122b 90 wait_us(1000);
Wayne Roberts 1:0817a150122b 91 radio.write_reg(REG_OPMODE, radio.RegOpMode.octet);
Wayne Roberts 1:0817a150122b 92 }
Wayne Roberts 1:0817a150122b 93
Wayne Roberts 1:0817a150122b 94 if (radio.RegOpMode.bits.ModulationType != idx) {
Wayne Roberts 1:0817a150122b 95 radio.RegOpMode.bits.ModulationType = idx;
Wayne Roberts 1:0817a150122b 96 radio.write_reg(REG_OPMODE, radio.RegOpMode.octet);
Wayne Roberts 1:0817a150122b 97 }
Wayne Roberts 1:0817a150122b 98 }
Wayne Roberts 1:0817a150122b 99
Wayne Roberts 1:0817a150122b 100 return MENUMODE_REINIT_MENU;
Wayne Roberts 1:0817a150122b 101 }
Wayne Roberts 1:0817a150122b 102
Wayne Roberts 1:0817a150122b 103 void Radio::hw_reset()
Wayne Roberts 1:0817a150122b 104 {
Wayne Roberts 1:0817a150122b 105 radio.hw_reset();
Wayne Roberts 1:0817a150122b 106 }
Wayne Roberts 1:0817a150122b 107
Wayne Roberts 1:0817a150122b 108 void Radio::clearIrqFlags()
Wayne Roberts 1:0817a150122b 109 {
Wayne Roberts 1:0817a150122b 110 if (radio.RegOpMode.bits.LongRangeMode) {
Wayne Roberts 1:0817a150122b 111 radio.write_reg(REG_LR_IRQFLAGS, 0xff); // clear flags in radio
Wayne Roberts 1:0817a150122b 112 } else {
Wayne Roberts 1:0817a150122b 113 radio.write_reg(REG_FSK_IRQFLAGS1, 0x0b);
Wayne Roberts 1:0817a150122b 114 radio.write_reg(REG_FSK_IRQFLAGS2, 0x11);
Wayne Roberts 1:0817a150122b 115 }
Wayne Roberts 1:0817a150122b 116 }
Wayne Roberts 1:0817a150122b 117
Wayne Roberts 1:0817a150122b 118 void Radio::readChip()
Wayne Roberts 1:0817a150122b 119 {
Wayne Roberts 1:0817a150122b 120 }
Wayne Roberts 1:0817a150122b 121
Wayne Roberts 1:0817a150122b 122 uint8_t Radio::get_payload_length()
Wayne Roberts 1:0817a150122b 123 {
Wayne Roberts 1:0817a150122b 124 if (radio.RegOpMode.bits.LongRangeMode) {
Wayne Roberts 1:0817a150122b 125 lora.RegPayloadLength = radio.read_reg(REG_LR_PAYLOADLENGTH);
Wayne Roberts 1:0817a150122b 126 return lora.RegPayloadLength;
Wayne Roberts 1:0817a150122b 127 } else {
Wayne Roberts 1:0817a150122b 128 fsk.RegPktConfig2.word = radio.read_u16(REG_FSK_PACKETCONFIG2);
Wayne Roberts 1:0817a150122b 129 return fsk.RegPktConfig2.bits.PayloadLength;
Wayne Roberts 1:0817a150122b 130 }
Wayne Roberts 1:0817a150122b 131 }
Wayne Roberts 1:0817a150122b 132
Wayne Roberts 1:0817a150122b 133 void Radio::set_payload_length(uint8_t len)
Wayne Roberts 1:0817a150122b 134 {
Wayne Roberts 1:0817a150122b 135 if (radio.RegOpMode.bits.LongRangeMode) {
Wayne Roberts 1:0817a150122b 136 lora.RegPayloadLength = len;
Wayne Roberts 1:0817a150122b 137 radio.write_reg(REG_LR_PAYLOADLENGTH, lora.RegPayloadLength);
Wayne Roberts 1:0817a150122b 138 } else {
Wayne Roberts 1:0817a150122b 139 fsk.RegPktConfig2.bits.PayloadLength = len;
Wayne Roberts 1:0817a150122b 140 radio.write_u16(REG_FSK_PACKETCONFIG2, fsk.RegPktConfig2.word);
Wayne Roberts 1:0817a150122b 141 }
Wayne Roberts 1:0817a150122b 142 }
Wayne Roberts 1:0817a150122b 143
Wayne Roberts 1:0817a150122b 144 void Radio::Rx()
Wayne Roberts 1:0817a150122b 145 {
Wayne Roberts 1:0817a150122b 146 if (radio.RegOpMode.bits.LongRangeMode)
Wayne Roberts 1:0817a150122b 147 lora.start_rx(RF_OPMODE_RECEIVER);
Wayne Roberts 1:0817a150122b 148 else
Wayne Roberts 1:0817a150122b 149 fsk.start_rx();
Wayne Roberts 1:0817a150122b 150 }
Wayne Roberts 1:0817a150122b 151
Wayne Roberts 1:0817a150122b 152 void Radio::txPkt()
Wayne Roberts 1:0817a150122b 153 {
Wayne Roberts 1:0817a150122b 154 if (radio.RegOpMode.bits.LongRangeMode) {
Wayne Roberts 1:0817a150122b 155 lora.RegPayloadLength = radio.read_reg(REG_LR_PAYLOADLENGTH);
Wayne Roberts 1:0817a150122b 156 lora.start_tx(lora.RegPayloadLength);
Wayne Roberts 1:0817a150122b 157 } else {
Wayne Roberts 1:0817a150122b 158 fsk.RegPktConfig2.word = radio.read_u16(REG_FSK_PACKETCONFIG2);
Wayne Roberts 1:0817a150122b 159 //log_printf("fsk payLen %u\r\n", fsk.RegPktConfig2.bits.PayloadLength);
Wayne Roberts 1:0817a150122b 160 fsk.start_tx(fsk.RegPktConfig2.bits.PayloadLength);
Wayne Roberts 1:0817a150122b 161 }
Wayne Roberts 1:0817a150122b 162 }
Wayne Roberts 1:0817a150122b 163
Wayne Roberts 1:0817a150122b 164 void Radio::tx_carrier()
Wayne Roberts 1:0817a150122b 165 {
Wayne Roberts 1:0817a150122b 166 radio.set_opmode(RF_OPMODE_SLEEP);
Wayne Roberts 1:0817a150122b 167 fsk.enable(false);
Wayne Roberts 1:0817a150122b 168 radio.write_u16(REG_FSK_FDEVMSB, 0);
Wayne Roberts 1:0817a150122b 169 radio.write_u16(REG_FSK_PREAMBLEMSB, 0xffff);
Wayne Roberts 1:0817a150122b 170 fsk.start_tx(8);
Wayne Roberts 1:0817a150122b 171 }
Wayne Roberts 1:0817a150122b 172
Wayne Roberts 1:0817a150122b 173 void Radio::tx_preamble()
Wayne Roberts 1:0817a150122b 174 {
Wayne Roberts 1:0817a150122b 175 if (radio.RegOpMode.bits.LongRangeMode) {
Wayne Roberts 1:0817a150122b 176 radio.write_u16(REG_LR_PREAMBLEMSB, 0xffff);
Wayne Roberts 1:0817a150122b 177 lora.start_tx(8);
Wayne Roberts 1:0817a150122b 178 } else {
Wayne Roberts 1:0817a150122b 179 radio.write_u16(REG_FSK_PREAMBLEMSB, 0xffff);
Wayne Roberts 1:0817a150122b 180 fsk.start_tx(8);
Wayne Roberts 1:0817a150122b 181 }
Wayne Roberts 1:0817a150122b 182 }
Wayne Roberts 1:0817a150122b 183
Wayne Roberts 1:0817a150122b 184 bool Radio::service(int8_t statusRow)
Wayne Roberts 1:0817a150122b 185 {
Wayne Roberts 1:0817a150122b 186 bool ret = false;
Wayne Roberts 1:0817a150122b 187 static RegIrqFlags1_t prevRegIrqFlags1;
Wayne Roberts 1:0817a150122b 188 static RegIrqFlags2_t prevRegIrqFlags2;
Wayne Roberts 1:0817a150122b 189 static us_timestamp_t prev_now;
Wayne Roberts 1:0817a150122b 190 us_timestamp_t now = lpt.read_us();
Wayne Roberts 1:0817a150122b 191
Wayne Roberts 1:0817a150122b 192 if (radio.RegOpMode.bits.LongRangeMode) {
Wayne Roberts 1:0817a150122b 193 const float bws[] = {7.8, 10.4, 15.6, 20.8, 31.25, 41.7, 62.5, 125, 250, 500};
Wayne Roberts 1:0817a150122b 194 int32_t est_freq_error;
Wayne Roberts 1:0817a150122b 195 int idx, hz;
Wayne Roberts 1:0817a150122b 196 service_action_e act = lora.service();
Wayne Roberts 1:0817a150122b 197 switch (act) {
Wayne Roberts 1:0817a150122b 198 case SERVICE_READ_FIFO:
Wayne Roberts 1:0817a150122b 199 est_freq_error = radio.read_reg(REG_LR_TEST28);
Wayne Roberts 1:0817a150122b 200 est_freq_error <<= 8;
Wayne Roberts 1:0817a150122b 201 est_freq_error += radio.read_reg(REG_LR_TEST29);
Wayne Roberts 1:0817a150122b 202 est_freq_error <<= 8;
Wayne Roberts 1:0817a150122b 203 est_freq_error += radio.read_reg(REG_LR_TEST2A);
Wayne Roberts 1:0817a150122b 204
Wayne Roberts 1:0817a150122b 205 if (est_freq_error & 0x80000)
Wayne Roberts 1:0817a150122b 206 est_freq_error |= 0xfff00000; // extend sign from 20bit to 32bit
Wayne Roberts 1:0817a150122b 207
Wayne Roberts 1:0817a150122b 208 //log_printf("est_freq_error:%08x\r\n", est_freq_error);
Wayne Roberts 1:0817a150122b 209 if (radio.type == SX1272)
Wayne Roberts 1:0817a150122b 210 idx = bw_idx + 7;
Wayne Roberts 1:0817a150122b 211 else
Wayne Roberts 1:0817a150122b 212 idx = bw_idx;
Wayne Roberts 1:0817a150122b 213
Wayne Roberts 1:0817a150122b 214 hz = est_freq_error * -0.524288 * bws[idx] / 500;
Wayne Roberts 1:0817a150122b 215 log_printf("hz:%d\r\n", hz);
Wayne Roberts 1:0817a150122b 216
Wayne Roberts 1:0817a150122b 217 RadioEvents->RxDone(lora.RegRxNbBytes, lora.get_pkt_rssi(), lora.RegPktSnrValue / 4.0);
Wayne Roberts 1:0817a150122b 218 break;
Wayne Roberts 1:0817a150122b 219 case SERVICE_TX_DONE:
Wayne Roberts 1:0817a150122b 220 if (RadioEvents->TxDone_botHalf)
Wayne Roberts 1:0817a150122b 221 RadioEvents->TxDone_botHalf();
Wayne Roberts 1:0817a150122b 222 break;
Wayne Roberts 1:0817a150122b 223 case SERVICE_ERROR:
Wayne Roberts 1:0817a150122b 224 case SERVICE_NONE:
Wayne Roberts 1:0817a150122b 225 break;
Wayne Roberts 1:0817a150122b 226 }
Wayne Roberts 1:0817a150122b 227 } else {
Wayne Roberts 1:0817a150122b 228 service_action_e act = fsk.service();
Wayne Roberts 1:0817a150122b 229 switch (act) {
Wayne Roberts 1:0817a150122b 230 case SERVICE_READ_FIFO:
Wayne Roberts 1:0817a150122b 231 /*if (fsk.RegRxConfig.bits.AfcAutoOn) {
Wayne Roberts 1:0817a150122b 232 printf("%dHz ", (int)(FREQ_STEP_HZ * fsk.RegAfcValue));
Wayne Roberts 1:0817a150122b 233 if (rssi != 0) {
Wayne Roberts 1:0817a150122b 234 printf("pkt:-%.1fdBm ", rssi / 2.0);
Wayne Roberts 1:0817a150122b 235 rssi = 0;
Wayne Roberts 1:0817a150122b 236 }
Wayne Roberts 1:0817a150122b 237 }*/
Wayne Roberts 1:0817a150122b 238 if (fsk.RegRxConfig.bits.AfcAutoOn)
Wayne Roberts 1:0817a150122b 239 log_printf("%dHz\r\n", (int)(FREQ_STEP_HZ * fsk.RegAfcValue));
Wayne Roberts 1:0817a150122b 240
Wayne Roberts 1:0817a150122b 241 RadioEvents->RxDone(fsk.rx_buf_length, /*TODO rssi*/0, 0);
Wayne Roberts 1:0817a150122b 242 break;
Wayne Roberts 1:0817a150122b 243 case SERVICE_TX_DONE:
Wayne Roberts 1:0817a150122b 244 if (RadioEvents->TxDone_botHalf)
Wayne Roberts 1:0817a150122b 245 RadioEvents->TxDone_botHalf();
Wayne Roberts 1:0817a150122b 246 break;
Wayne Roberts 1:0817a150122b 247 case SERVICE_ERROR:
Wayne Roberts 1:0817a150122b 248 case SERVICE_NONE:
Wayne Roberts 1:0817a150122b 249 break;
Wayne Roberts 1:0817a150122b 250 }
Wayne Roberts 1:0817a150122b 251
Wayne Roberts 1:0817a150122b 252 if (statusRow > 0 && now-prev_now > 50000) {
Wayne Roberts 1:0817a150122b 253 RegIrqFlags1_t RegIrqFlags1;
Wayne Roberts 1:0817a150122b 254 RegIrqFlags2_t RegIrqFlags2;
Wayne Roberts 1:0817a150122b 255
Wayne Roberts 1:0817a150122b 256 RegIrqFlags1.octet = radio.read_reg(REG_FSK_IRQFLAGS1);
Wayne Roberts 1:0817a150122b 257 RegIrqFlags2.octet = radio.read_reg(REG_FSK_IRQFLAGS2);
Wayne Roberts 1:0817a150122b 258 prev_now = now;
Wayne Roberts 1:0817a150122b 259
Wayne Roberts 1:0817a150122b 260 if (RegIrqFlags1.octet != prevRegIrqFlags1.octet || RegIrqFlags2.octet != prevRegIrqFlags2.octet) {
Wayne Roberts 1:0817a150122b 261
Wayne Roberts 1:0817a150122b 262 pc.printf("\e[%u;1f", statusRow); // set (force) cursor to row;column
Wayne Roberts 1:0817a150122b 263
Wayne Roberts 1:0817a150122b 264 if (RegIrqFlags1.bits.ModeReady)
Wayne Roberts 1:0817a150122b 265 pc.printf("ModeReady ");
Wayne Roberts 1:0817a150122b 266 if (RegIrqFlags1.bits.RxReady)
Wayne Roberts 1:0817a150122b 267 pc.printf("RxReady ");
Wayne Roberts 1:0817a150122b 268 if (RegIrqFlags1.bits.TxReady)
Wayne Roberts 1:0817a150122b 269 pc.printf("TxReady ");
Wayne Roberts 1:0817a150122b 270 if (RegIrqFlags1.bits.PllLock)
Wayne Roberts 1:0817a150122b 271 pc.printf("PllLock ");
Wayne Roberts 1:0817a150122b 272 if (RegIrqFlags1.bits.Rssi)
Wayne Roberts 1:0817a150122b 273 pc.printf("Rssi ");
Wayne Roberts 1:0817a150122b 274 if (RegIrqFlags1.bits.Timeout)
Wayne Roberts 1:0817a150122b 275 pc.printf("Timeout ");
Wayne Roberts 1:0817a150122b 276 if (RegIrqFlags1.bits.PreambleDetect)
Wayne Roberts 1:0817a150122b 277 pc.printf("PreambleDetect ");
Wayne Roberts 1:0817a150122b 278 if (RegIrqFlags1.bits.SyncAddressMatch)
Wayne Roberts 1:0817a150122b 279 pc.printf("SyncAddressMatch ");
Wayne Roberts 1:0817a150122b 280
Wayne Roberts 1:0817a150122b 281 pc.printf(" | ");
Wayne Roberts 1:0817a150122b 282 if (RegIrqFlags2.bits.FifoFull)
Wayne Roberts 1:0817a150122b 283 pc.printf("FifoFull ");
Wayne Roberts 1:0817a150122b 284 if (RegIrqFlags2.bits.FifoEmpty)
Wayne Roberts 1:0817a150122b 285 pc.printf("FifoEmpty ");
Wayne Roberts 1:0817a150122b 286 if (RegIrqFlags2.bits.FifoLevel)
Wayne Roberts 1:0817a150122b 287 pc.printf("FifoLevel ");
Wayne Roberts 1:0817a150122b 288 if (RegIrqFlags2.bits.FifoOverrun)
Wayne Roberts 1:0817a150122b 289 pc.printf("FifoOverrun ");
Wayne Roberts 1:0817a150122b 290 if (RegIrqFlags2.bits.PacketSent)
Wayne Roberts 1:0817a150122b 291 pc.printf("PacketSent ");
Wayne Roberts 1:0817a150122b 292 if (RegIrqFlags2.bits.PayloadReady)
Wayne Roberts 1:0817a150122b 293 pc.printf("PayloadReady ");
Wayne Roberts 1:0817a150122b 294 if (RegIrqFlags2.bits.CrcOk)
Wayne Roberts 1:0817a150122b 295 pc.printf("CrcOk ");
Wayne Roberts 1:0817a150122b 296 if (RegIrqFlags2.bits.LowBat)
Wayne Roberts 1:0817a150122b 297 pc.printf("LowBat ");
Wayne Roberts 1:0817a150122b 298
Wayne Roberts 1:0817a150122b 299 prevRegIrqFlags1.octet = RegIrqFlags1.octet;
Wayne Roberts 1:0817a150122b 300 prevRegIrqFlags2.octet = RegIrqFlags2.octet;
Wayne Roberts 1:0817a150122b 301
Wayne Roberts 1:0817a150122b 302 pc.printf("\e[K");
Wayne Roberts 1:0817a150122b 303 ret = true;
Wayne Roberts 1:0817a150122b 304 } // ..if irq flag changed
Wayne Roberts 1:0817a150122b 305 } // ..if (++cnt > X)
Wayne Roberts 1:0817a150122b 306 } // ..!radio.RegOpMode.bits.LongRangeMode
Wayne Roberts 1:0817a150122b 307
Wayne Roberts 1:0817a150122b 308 return ret;
Wayne Roberts 1:0817a150122b 309 }
Wayne Roberts 1:0817a150122b 310
Wayne Roberts 1:0817a150122b 311 void Radio::setFS()
Wayne Roberts 1:0817a150122b 312 {
Wayne Roberts 1:0817a150122b 313 radio.set_opmode(RF_OPMODE_SYNTHESIZER_RX);
Wayne Roberts 1:0817a150122b 314 }
Wayne Roberts 1:0817a150122b 315
Wayne Roberts 1:0817a150122b 316 const menu_t* Radio::get_modem_sub_menu()
Wayne Roberts 1:0817a150122b 317 {
Wayne Roberts 1:0817a150122b 318 radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
Wayne Roberts 1:0817a150122b 319 if (radio.RegOpMode.bits.LongRangeMode) {
Wayne Roberts 1:0817a150122b 320 return NULL;
Wayne Roberts 1:0817a150122b 321 } else {
Wayne Roberts 1:0817a150122b 322 if (radio.RegOpMode.bits.ModulationType == 1) {
Wayne Roberts 1:0817a150122b 323 fsk.RegOokPeak.octet = radio.read_reg(REG_FSK_OOKPEAK);
Wayne Roberts 1:0817a150122b 324 if (fsk.RegOokPeak.bits.OokThreshType == 0) {
Wayne Roberts 1:0817a150122b 325 return ook_fixed_menu;
Wayne Roberts 1:0817a150122b 326 } else if (fsk.RegOokPeak.bits.OokThreshType == 1) {
Wayne Roberts 1:0817a150122b 327 return ook_peak_menu;
Wayne Roberts 1:0817a150122b 328 } else if (fsk.RegOokPeak.bits.OokThreshType == 2) {
Wayne Roberts 1:0817a150122b 329 return ook_average_menu;
Wayne Roberts 1:0817a150122b 330 }
Wayne Roberts 1:0817a150122b 331 } else
Wayne Roberts 1:0817a150122b 332 return NULL;
Wayne Roberts 1:0817a150122b 333 }
Wayne Roberts 1:0817a150122b 334
Wayne Roberts 1:0817a150122b 335 return NULL;
Wayne Roberts 1:0817a150122b 336 }
Wayne Roberts 1:0817a150122b 337
Wayne Roberts 1:0817a150122b 338 const menu_t* Radio::get_modem_menu()
Wayne Roberts 1:0817a150122b 339 {
Wayne Roberts 1:0817a150122b 340 radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
Wayne Roberts 1:0817a150122b 341
Wayne Roberts 1:0817a150122b 342 if (radio.RegOpMode.bits.LongRangeMode) {
Wayne Roberts 1:0817a150122b 343 return lora_menu;
Wayne Roberts 1:0817a150122b 344 } else {
Wayne Roberts 1:0817a150122b 345 if (radio.RegOpMode.bits.ModulationType == 0)
Wayne Roberts 1:0817a150122b 346 return fsk_menu;
Wayne Roberts 1:0817a150122b 347 else {
Wayne Roberts 1:0817a150122b 348 return ook_menu;
Wayne Roberts 1:0817a150122b 349 }
Wayne Roberts 1:0817a150122b 350 }
Wayne Roberts 1:0817a150122b 351 }
Wayne Roberts 1:0817a150122b 352
Wayne Roberts 1:0817a150122b 353 void Radio::tx_payload_length_print()
Wayne Roberts 1:0817a150122b 354 {
Wayne Roberts 1:0817a150122b 355 pc.printf("%u", get_payload_length());
Wayne Roberts 1:0817a150122b 356 }
Wayne Roberts 1:0817a150122b 357
Wayne Roberts 1:0817a150122b 358 bool Radio::tx_payload_length_write(const char* txt)
Wayne Roberts 1:0817a150122b 359 {
Wayne Roberts 1:0817a150122b 360 unsigned len;
Wayne Roberts 1:0817a150122b 361
Wayne Roberts 1:0817a150122b 362 sscanf(txt, "%u", &len);
Wayne Roberts 1:0817a150122b 363 //log_printf("scanned %u from \"%s\"\r\n", len, txt);
Wayne Roberts 1:0817a150122b 364
Wayne Roberts 1:0817a150122b 365 set_payload_length(len);
Wayne Roberts 1:0817a150122b 366
Wayne Roberts 1:0817a150122b 367 return false;
Wayne Roberts 1:0817a150122b 368 }
Wayne Roberts 1:0817a150122b 369
Wayne Roberts 1:0817a150122b 370 const char* const Radio::opmode_status_strs[] = {
Wayne Roberts 1:0817a150122b 371 "SLEEP ", // 0
Wayne Roberts 1:0817a150122b 372 "STANDBY ", // 1
Wayne Roberts 1:0817a150122b 373 "FS_TX ", // 2
Wayne Roberts 1:0817a150122b 374 "TX ", // 3
Wayne Roberts 1:0817a150122b 375 "FS_RX ", // 4
Wayne Roberts 1:0817a150122b 376 "RX ", // 5
Wayne Roberts 1:0817a150122b 377 "RX_SINGLE", // 6
Wayne Roberts 1:0817a150122b 378 "CAD ", // 7
Wayne Roberts 1:0817a150122b 379 NULL
Wayne Roberts 1:0817a150122b 380 };
Wayne Roberts 1:0817a150122b 381
Wayne Roberts 1:0817a150122b 382 const char* const Radio::opmode_select_strs[] = {
Wayne Roberts 1:0817a150122b 383 "SLEEP ", // 0
Wayne Roberts 1:0817a150122b 384 "STANDBY ", // 1
Wayne Roberts 1:0817a150122b 385 "FS_TX ", // 2
Wayne Roberts 1:0817a150122b 386 "TX ", // 3
Wayne Roberts 1:0817a150122b 387 "FS_RX ", // 4
Wayne Roberts 1:0817a150122b 388 "RX ", // 5
Wayne Roberts 1:0817a150122b 389 "RX_SINGLE", // 6
Wayne Roberts 1:0817a150122b 390 "CAD ", // 7
Wayne Roberts 1:0817a150122b 391 NULL
Wayne Roberts 1:0817a150122b 392 };
Wayne Roberts 1:0817a150122b 393
Wayne Roberts 1:0817a150122b 394 unsigned Radio::opmode_read_cb(bool forWriting)
Wayne Roberts 1:0817a150122b 395 {
Wayne Roberts 1:0817a150122b 396 radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
Wayne Roberts 1:0817a150122b 397 return radio.RegOpMode.bits.Mode;
Wayne Roberts 1:0817a150122b 398 }
Wayne Roberts 1:0817a150122b 399
Wayne Roberts 1:0817a150122b 400 menuMode_e Radio::opmode_write_cb(unsigned sel)
Wayne Roberts 1:0817a150122b 401 {
Wayne Roberts 1:0817a150122b 402 radio.RegOpMode.bits.Mode = sel;
Wayne Roberts 1:0817a150122b 403 radio.write_reg(REG_OPMODE, radio.RegOpMode.octet);
Wayne Roberts 1:0817a150122b 404
Wayne Roberts 1:0817a150122b 405 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 406 }
Wayne Roberts 1:0817a150122b 407
Wayne Roberts 1:0817a150122b 408 void Radio::ocp_print(void)
Wayne Roberts 1:0817a150122b 409 {
Wayne Roberts 1:0817a150122b 410 unsigned i;
Wayne Roberts 1:0817a150122b 411
Wayne Roberts 1:0817a150122b 412 radio.RegOcp.octet = radio.read_reg(REG_OCP);
Wayne Roberts 1:0817a150122b 413 if (radio.RegOcp.bits.OcpTrim < 16)
Wayne Roberts 1:0817a150122b 414 i = 45 + (5 * radio.RegOcp.bits.OcpTrim);
Wayne Roberts 1:0817a150122b 415 else if (radio.RegOcp.bits.OcpTrim < 28)
Wayne Roberts 1:0817a150122b 416 i = (10 * radio.RegOcp.bits.OcpTrim) - 30;
Wayne Roberts 1:0817a150122b 417 else
Wayne Roberts 1:0817a150122b 418 i = 240;
Wayne Roberts 1:0817a150122b 419
Wayne Roberts 1:0817a150122b 420 pc.printf("%u", i);
Wayne Roberts 1:0817a150122b 421 }
Wayne Roberts 1:0817a150122b 422
Wayne Roberts 1:0817a150122b 423 bool Radio::ocp_write(const char* txt)
Wayne Roberts 1:0817a150122b 424 {
Wayne Roberts 1:0817a150122b 425 unsigned i;
Wayne Roberts 1:0817a150122b 426
Wayne Roberts 1:0817a150122b 427 sscanf(txt, "%u", &i);
Wayne Roberts 1:0817a150122b 428
Wayne Roberts 1:0817a150122b 429 if (i < 130)
Wayne Roberts 1:0817a150122b 430 radio.RegOcp.bits.OcpTrim = (i - 45) / 5;
Wayne Roberts 1:0817a150122b 431 else
Wayne Roberts 1:0817a150122b 432 radio.RegOcp.bits.OcpTrim = (i + 30) / 10;
Wayne Roberts 1:0817a150122b 433
Wayne Roberts 1:0817a150122b 434 radio.write_reg(REG_OCP, radio.RegOcp.octet);
Wayne Roberts 1:0817a150122b 435
Wayne Roberts 1:0817a150122b 436 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 437 }
Wayne Roberts 1:0817a150122b 438
Wayne Roberts 1:0817a150122b 439 const value_item_t Radio::ocp_item = { _ITEM_VALUE, 4, ocp_print, ocp_write};
Wayne Roberts 1:0817a150122b 440
Wayne Roberts 1:0817a150122b 441 static const char* const lora_bws_1276[] = {
Wayne Roberts 1:0817a150122b 442 " 7.8KHz", // 0
Wayne Roberts 1:0817a150122b 443 " 10.4KHz", // 1
Wayne Roberts 1:0817a150122b 444 " 15.6KHz", // 2
Wayne Roberts 1:0817a150122b 445 " 20.8KHz", // 3
Wayne Roberts 1:0817a150122b 446 "31.25KHz", // 4
Wayne Roberts 1:0817a150122b 447 " 41.7KHz", // 5
Wayne Roberts 1:0817a150122b 448 " 62.5KHz", // 6
Wayne Roberts 1:0817a150122b 449 " 125KHz", // 7
Wayne Roberts 1:0817a150122b 450 " 250KHz", // 8
Wayne Roberts 1:0817a150122b 451 " 500KHz", // 9
Wayne Roberts 1:0817a150122b 452 NULL
Wayne Roberts 1:0817a150122b 453 };
Wayne Roberts 1:0817a150122b 454 static const char* const lora_bws_1272[] = {
Wayne Roberts 1:0817a150122b 455 "125KHz", // 0
Wayne Roberts 1:0817a150122b 456 "250KHz", // 1
Wayne Roberts 1:0817a150122b 457 "500KHz", // 2
Wayne Roberts 1:0817a150122b 458 NULL
Wayne Roberts 1:0817a150122b 459 };
Wayne Roberts 1:0817a150122b 460
Wayne Roberts 1:0817a150122b 461 unsigned Radio::lora_bw_read_cb(bool fw)
Wayne Roberts 1:0817a150122b 462 {
Wayne Roberts 1:0817a150122b 463 bw_idx = lora.getBw();
Wayne Roberts 1:0817a150122b 464 return bw_idx;
Wayne Roberts 1:0817a150122b 465 }
Wayne Roberts 1:0817a150122b 466
Wayne Roberts 1:0817a150122b 467 menuMode_e Radio::lora_bw_write_cb(unsigned sidx)
Wayne Roberts 1:0817a150122b 468 {
Wayne Roberts 1:0817a150122b 469 lora.setBw(sidx);
Wayne Roberts 1:0817a150122b 470 bw_idx = sidx;
Wayne Roberts 1:0817a150122b 471
Wayne Roberts 1:0817a150122b 472 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 473 }
Wayne Roberts 1:0817a150122b 474
Wayne Roberts 1:0817a150122b 475 dropdown_item_t Radio::lora_bw_item = { _ITEM_DROPDOWN, NULL, NULL, lora_bw_read_cb, lora_bw_write_cb};
Wayne Roberts 1:0817a150122b 476
Wayne Roberts 1:0817a150122b 477 void Radio::lora_sf_print()
Wayne Roberts 1:0817a150122b 478 {
Wayne Roberts 1:0817a150122b 479 pc.printf("%u", lora.getSf());
Wayne Roberts 1:0817a150122b 480 }
Wayne Roberts 1:0817a150122b 481
Wayne Roberts 1:0817a150122b 482 bool Radio::lora_sf_write(const char* txt)
Wayne Roberts 1:0817a150122b 483 {
Wayne Roberts 1:0817a150122b 484 unsigned sf;
Wayne Roberts 1:0817a150122b 485
Wayne Roberts 1:0817a150122b 486 sscanf(txt, "%u", &sf);
Wayne Roberts 1:0817a150122b 487 lora.setSf(sf);
Wayne Roberts 1:0817a150122b 488
Wayne Roberts 1:0817a150122b 489 return false;
Wayne Roberts 1:0817a150122b 490 }
Wayne Roberts 1:0817a150122b 491
Wayne Roberts 1:0817a150122b 492 const value_item_t Radio::lora_sf_item = { _ITEM_VALUE, 7, lora_sf_print, lora_sf_write };
Wayne Roberts 1:0817a150122b 493
Wayne Roberts 1:0817a150122b 494 const char* const lora_crs[] = {
Wayne Roberts 1:0817a150122b 495 "4/5", // 0
Wayne Roberts 1:0817a150122b 496 "4/6", // 1
Wayne Roberts 1:0817a150122b 497 "4/7", // 2
Wayne Roberts 1:0817a150122b 498 "4/8", // 3
Wayne Roberts 1:0817a150122b 499 NULL
Wayne Roberts 1:0817a150122b 500 };
Wayne Roberts 1:0817a150122b 501
Wayne Roberts 1:0817a150122b 502 unsigned Radio::lora_cr_read_cb(bool)
Wayne Roberts 1:0817a150122b 503 {
Wayne Roberts 1:0817a150122b 504 return lora.getCodingRate(false);
Wayne Roberts 1:0817a150122b 505 }
Wayne Roberts 1:0817a150122b 506
Wayne Roberts 1:0817a150122b 507 menuMode_e Radio::lora_cr_write_cb(unsigned sidx)
Wayne Roberts 1:0817a150122b 508 {
Wayne Roberts 1:0817a150122b 509 lora.setCodingRate(sidx);
Wayne Roberts 1:0817a150122b 510
Wayne Roberts 1:0817a150122b 511 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 512 }
Wayne Roberts 1:0817a150122b 513
Wayne Roberts 1:0817a150122b 514 const dropdown_item_t Radio::lora_cr_item = { _ITEM_DROPDOWN, lora_crs, lora_crs, lora_cr_read_cb, lora_cr_write_cb};
Wayne Roberts 1:0817a150122b 515
Wayne Roberts 1:0817a150122b 516 void Radio::lora_pblLen_print()
Wayne Roberts 1:0817a150122b 517 {
Wayne Roberts 1:0817a150122b 518 lora.RegPreamble = radio.read_u16(REG_LR_PREAMBLEMSB);
Wayne Roberts 1:0817a150122b 519 pc.printf("%u", lora.RegPreamble);
Wayne Roberts 1:0817a150122b 520 }
Wayne Roberts 1:0817a150122b 521
Wayne Roberts 1:0817a150122b 522 bool Radio::lora_pblLen_write(const char* str)
Wayne Roberts 1:0817a150122b 523 {
Wayne Roberts 1:0817a150122b 524 unsigned n;
Wayne Roberts 1:0817a150122b 525
Wayne Roberts 1:0817a150122b 526 sscanf(str, "%u", &n);
Wayne Roberts 1:0817a150122b 527
Wayne Roberts 1:0817a150122b 528 lora.RegPreamble = n;
Wayne Roberts 1:0817a150122b 529 radio.write_u16(REG_LR_PREAMBLEMSB, lora.RegPreamble);
Wayne Roberts 1:0817a150122b 530
Wayne Roberts 1:0817a150122b 531 return false;
Wayne Roberts 1:0817a150122b 532 }
Wayne Roberts 1:0817a150122b 533
Wayne Roberts 1:0817a150122b 534 const value_item_t Radio::lora_pblLen_item = { _ITEM_VALUE, 5, lora_pblLen_print, lora_pblLen_write};
Wayne Roberts 1:0817a150122b 535
Wayne Roberts 1:0817a150122b 536 static const char* lora_fixlen[] = {
Wayne Roberts 1:0817a150122b 537 "EXPLICIT", // 0
Wayne Roberts 1:0817a150122b 538 "IMPLICIT", // 1
Wayne Roberts 1:0817a150122b 539 NULL
Wayne Roberts 1:0817a150122b 540 };
Wayne Roberts 1:0817a150122b 541
Wayne Roberts 1:0817a150122b 542 unsigned Radio::lora_fixlen_read_cb(bool f)
Wayne Roberts 1:0817a150122b 543 {
Wayne Roberts 1:0817a150122b 544 if (lora.getHeaderMode())
Wayne Roberts 1:0817a150122b 545 return 1;
Wayne Roberts 1:0817a150122b 546 else
Wayne Roberts 1:0817a150122b 547 return 0;
Wayne Roberts 1:0817a150122b 548 }
Wayne Roberts 1:0817a150122b 549
Wayne Roberts 1:0817a150122b 550 menuMode_e Radio::lora_fixlen_write_cb(unsigned sidx)
Wayne Roberts 1:0817a150122b 551 {
Wayne Roberts 1:0817a150122b 552 lora.setHeaderMode(sidx == 1); // true = implicit
Wayne Roberts 1:0817a150122b 553
Wayne Roberts 1:0817a150122b 554 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 555 }
Wayne Roberts 1:0817a150122b 556
Wayne Roberts 1:0817a150122b 557 const dropdown_item_t Radio::lora_fixlen_item = { _ITEM_DROPDOWN, lora_fixlen, lora_fixlen, lora_fixlen_read_cb, lora_fixlen_write_cb};
Wayne Roberts 1:0817a150122b 558
Wayne Roberts 1:0817a150122b 559 bool Radio::lora_crcon_read()
Wayne Roberts 1:0817a150122b 560 {
Wayne Roberts 1:0817a150122b 561 return lora.getRxPayloadCrcOn();
Wayne Roberts 1:0817a150122b 562 }
Wayne Roberts 1:0817a150122b 563
Wayne Roberts 1:0817a150122b 564 bool Radio::lora_crcon_push()
Wayne Roberts 1:0817a150122b 565 {
Wayne Roberts 1:0817a150122b 566 lora.setRxPayloadCrcOn(!lora.getRxPayloadCrcOn());
Wayne Roberts 1:0817a150122b 567 return lora.getRxPayloadCrcOn();
Wayne Roberts 1:0817a150122b 568 }
Wayne Roberts 1:0817a150122b 569
Wayne Roberts 1:0817a150122b 570 const toggle_item_t Radio::lora_crcon_item = { _ITEM_TOGGLE, "CrcOn", NULL, lora_crcon_read, lora_crcon_push};
Wayne Roberts 1:0817a150122b 571
Wayne Roberts 1:0817a150122b 572 bool Radio::lora_iqinvTX_read()
Wayne Roberts 1:0817a150122b 573 {
Wayne Roberts 1:0817a150122b 574 lora.RegTest33.octet = radio.read_reg(REG_LR_TEST33);
Wayne Roberts 1:0817a150122b 575 return !lora.RegTest33.bits.chirp_invert_tx;
Wayne Roberts 1:0817a150122b 576 }
Wayne Roberts 1:0817a150122b 577
Wayne Roberts 1:0817a150122b 578 bool Radio::lora_iqinvTX_push()
Wayne Roberts 1:0817a150122b 579 {
Wayne Roberts 1:0817a150122b 580 lora.invert_tx(lora.RegTest33.bits.chirp_invert_tx);
Wayne Roberts 1:0817a150122b 581 return !lora.RegTest33.bits.chirp_invert_tx;
Wayne Roberts 1:0817a150122b 582 }
Wayne Roberts 1:0817a150122b 583
Wayne Roberts 1:0817a150122b 584 const toggle_item_t Radio::lora_iqinvTX_item = { _ITEM_TOGGLE, "iqInvTX", NULL, lora_iqinvTX_read, lora_iqinvTX_push};
Wayne Roberts 1:0817a150122b 585
Wayne Roberts 1:0817a150122b 586 bool Radio::lora_iqinvRX_read()
Wayne Roberts 1:0817a150122b 587 {
Wayne Roberts 1:0817a150122b 588 lora.RegTest33.octet = radio.read_reg(REG_LR_TEST33);
Wayne Roberts 1:0817a150122b 589 return lora.RegTest33.bits.invert_i_q;
Wayne Roberts 1:0817a150122b 590 }
Wayne Roberts 1:0817a150122b 591
Wayne Roberts 1:0817a150122b 592 bool Radio::lora_iqinvRX_push()
Wayne Roberts 1:0817a150122b 593 {
Wayne Roberts 1:0817a150122b 594 lora.invert_rx(!lora.RegTest33.bits.invert_i_q);
Wayne Roberts 1:0817a150122b 595 lora.RegTest33.octet = radio.read_reg(REG_LR_TEST33);
Wayne Roberts 1:0817a150122b 596 return lora.RegTest33.bits.invert_i_q;
Wayne Roberts 1:0817a150122b 597 }
Wayne Roberts 1:0817a150122b 598
Wayne Roberts 1:0817a150122b 599 const toggle_item_t Radio::lora_iqinvRX_item = { _ITEM_TOGGLE, "iqInvRX", NULL, lora_iqinvRX_read, lora_iqinvRX_push};
Wayne Roberts 1:0817a150122b 600
Wayne Roberts 1:0817a150122b 601
Wayne Roberts 1:0817a150122b 602 const menu_t Radio::lora_menu[] = {
Wayne Roberts 1:0817a150122b 603 { {FIRST_CHIP_MENU_ROW, 22}, "bw:", &lora_bw_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 604 { {FIRST_CHIP_MENU_ROW, 35}, "sf:", &lora_sf_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 605 { {FIRST_CHIP_MENU_ROW, 42}, "cr:", &lora_cr_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 606 { {FIRST_CHIP_MENU_ROW, 50}, "PreambleLength:", &lora_pblLen_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 607
Wayne Roberts 1:0817a150122b 608 { {FIRST_CHIP_MENU_ROW+1, 1}, NULL, &lora_fixlen_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 609 { {FIRST_CHIP_MENU_ROW+1, 10}, NULL, &lora_crcon_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 610 { {FIRST_CHIP_MENU_ROW+1, 20}, NULL, &lora_iqinvTX_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 611 { {FIRST_CHIP_MENU_ROW+1, 30}, NULL, &lora_iqinvRX_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 612 { {0, 0}, NULL, NULL }
Wayne Roberts 1:0817a150122b 613 };
Wayne Roberts 1:0817a150122b 614
Wayne Roberts 1:0817a150122b 615 void Radio::fsk_ook_bps_print(void)
Wayne Roberts 1:0817a150122b 616 {
Wayne Roberts 1:0817a150122b 617 pc.printf("%u", fsk.get_bitrate());
Wayne Roberts 1:0817a150122b 618 }
Wayne Roberts 1:0817a150122b 619
Wayne Roberts 1:0817a150122b 620 bool Radio::fsk_ook_bps_write(const char* txt)
Wayne Roberts 1:0817a150122b 621 {
Wayne Roberts 1:0817a150122b 622 unsigned bps;
Wayne Roberts 1:0817a150122b 623
Wayne Roberts 1:0817a150122b 624 sscanf(txt, "%u", &bps);
Wayne Roberts 1:0817a150122b 625 fsk.set_bitrate(bps);
Wayne Roberts 1:0817a150122b 626
Wayne Roberts 1:0817a150122b 627 return false;
Wayne Roberts 1:0817a150122b 628 }
Wayne Roberts 1:0817a150122b 629
Wayne Roberts 1:0817a150122b 630 const value_item_t Radio::fsk_ook_bitrate_item = { _ITEM_VALUE, 8, fsk_ook_bps_print, fsk_ook_bps_write };
Wayne Roberts 1:0817a150122b 631
Wayne Roberts 1:0817a150122b 632 void Radio::gfsk_fdev_print(void)
Wayne Roberts 1:0817a150122b 633 {
Wayne Roberts 1:0817a150122b 634 pc.printf("%u", fsk.get_tx_fdev_hz());
Wayne Roberts 1:0817a150122b 635
Wayne Roberts 1:0817a150122b 636 }
Wayne Roberts 1:0817a150122b 637
Wayne Roberts 1:0817a150122b 638 bool Radio::gfsk_fdev_write(const char* txt)
Wayne Roberts 1:0817a150122b 639 {
Wayne Roberts 1:0817a150122b 640 unsigned hz;
Wayne Roberts 1:0817a150122b 641
Wayne Roberts 1:0817a150122b 642 sscanf(txt, "%u", &hz);
Wayne Roberts 1:0817a150122b 643
Wayne Roberts 1:0817a150122b 644 fsk.set_tx_fdev_hz(hz);
Wayne Roberts 1:0817a150122b 645
Wayne Roberts 1:0817a150122b 646 return false;
Wayne Roberts 1:0817a150122b 647 }
Wayne Roberts 1:0817a150122b 648
Wayne Roberts 1:0817a150122b 649 const value_item_t Radio::gfsk_fdev_item = { _ITEM_VALUE, 8, gfsk_fdev_print, gfsk_fdev_write};
Wayne Roberts 1:0817a150122b 650
Wayne Roberts 1:0817a150122b 651 const char* const gfsk_bts[] = {
Wayne Roberts 1:0817a150122b 652 "off", // 0
Wayne Roberts 1:0817a150122b 653 "1.0", // 1
Wayne Roberts 1:0817a150122b 654 "0.5", // 2
Wayne Roberts 1:0817a150122b 655 "0.3", // 3
Wayne Roberts 1:0817a150122b 656 NULL
Wayne Roberts 1:0817a150122b 657 };
Wayne Roberts 1:0817a150122b 658
Wayne Roberts 1:0817a150122b 659 const char* const ook_bts[] = {
Wayne Roberts 1:0817a150122b 660 "off ", // 0
Wayne Roberts 1:0817a150122b 661 "bitRate ", // 1
Wayne Roberts 1:0817a150122b 662 "2*bitRate", // 2
Wayne Roberts 1:0817a150122b 663 NULL
Wayne Roberts 1:0817a150122b 664 };
Wayne Roberts 1:0817a150122b 665
Wayne Roberts 1:0817a150122b 666 unsigned Radio::bt_read_cb(bool forWriting)
Wayne Roberts 1:0817a150122b 667 {
Wayne Roberts 1:0817a150122b 668 if (radio.type == SX1276) {
Wayne Roberts 1:0817a150122b 669 RegPaRamp.octet = radio.read_reg(REG_PARAMP);
Wayne Roberts 1:0817a150122b 670 return RegPaRamp.bits.ModulationShaping;
Wayne Roberts 1:0817a150122b 671 } else if (radio.type == SX1272) {
Wayne Roberts 1:0817a150122b 672 radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
Wayne Roberts 1:0817a150122b 673 return radio.RegOpMode.bits.ModulationShaping;
Wayne Roberts 1:0817a150122b 674 }
Wayne Roberts 1:0817a150122b 675 return 3;
Wayne Roberts 1:0817a150122b 676 }
Wayne Roberts 1:0817a150122b 677
Wayne Roberts 1:0817a150122b 678 menuMode_e Radio::bt_write_cb(unsigned sel)
Wayne Roberts 1:0817a150122b 679 {
Wayne Roberts 1:0817a150122b 680 if (radio.type == SX1276) {
Wayne Roberts 1:0817a150122b 681 RegPaRamp.bits.ModulationShaping = sel;
Wayne Roberts 1:0817a150122b 682 radio.write_reg(REG_PARAMP, RegPaRamp.octet);
Wayne Roberts 1:0817a150122b 683 } else if (radio.type == SX1272) {
Wayne Roberts 1:0817a150122b 684 radio.RegOpMode.bits.ModulationShaping = sel;
Wayne Roberts 1:0817a150122b 685 radio.write_reg(REG_OPMODE, radio.RegOpMode.octet);
Wayne Roberts 1:0817a150122b 686 }
Wayne Roberts 1:0817a150122b 687 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 688 }
Wayne Roberts 1:0817a150122b 689
Wayne Roberts 1:0817a150122b 690 const dropdown_item_t Radio::gfsk_bt_item = { _ITEM_DROPDOWN, gfsk_bts, gfsk_bts, bt_read_cb, bt_write_cb};
Wayne Roberts 1:0817a150122b 691 const dropdown_item_t Radio::ook_bt_item = { _ITEM_DROPDOWN, ook_bts, ook_bts, bt_read_cb, bt_write_cb};
Wayne Roberts 1:0817a150122b 692
Wayne Roberts 1:0817a150122b 693 bool Radio::paSelect_read()
Wayne Roberts 1:0817a150122b 694 {
Wayne Roberts 1:0817a150122b 695 radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG);
Wayne Roberts 1:0817a150122b 696 return radio.RegPaConfig.bits.PaSelect;
Wayne Roberts 1:0817a150122b 697 }
Wayne Roberts 1:0817a150122b 698
Wayne Roberts 1:0817a150122b 699 bool Radio::paSelect_push()
Wayne Roberts 1:0817a150122b 700 {
Wayne Roberts 1:0817a150122b 701 radio.RegPaConfig.bits.PaSelect ^= 1;
Wayne Roberts 1:0817a150122b 702 radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet);
Wayne Roberts 1:0817a150122b 703 return radio.RegPaConfig.bits.PaSelect;
Wayne Roberts 1:0817a150122b 704 }
Wayne Roberts 1:0817a150122b 705
Wayne Roberts 1:0817a150122b 706 const toggle_item_t Radio::paSelect_item = { _ITEM_TOGGLE,
Wayne Roberts 1:0817a150122b 707 "RFO ", // 0
Wayne Roberts 1:0817a150122b 708 "PA_BOOST", // 1
Wayne Roberts 1:0817a150122b 709 paSelect_read, paSelect_push
Wayne Roberts 1:0817a150122b 710 };
Wayne Roberts 1:0817a150122b 711
Wayne Roberts 1:0817a150122b 712 const char* const rxbws[] = {
Wayne Roberts 1:0817a150122b 713 " 2.6", // 0
Wayne Roberts 1:0817a150122b 714 " 3.1", // 1
Wayne Roberts 1:0817a150122b 715 " 3.9", // 2
Wayne Roberts 1:0817a150122b 716 " 5.2", // 3
Wayne Roberts 1:0817a150122b 717 " 6.3", // 4
Wayne Roberts 1:0817a150122b 718 " 7.8", // 5
Wayne Roberts 1:0817a150122b 719 " 10.4", // 6
Wayne Roberts 1:0817a150122b 720 " 12.5", // 7
Wayne Roberts 1:0817a150122b 721 " 15.6", // 8
Wayne Roberts 1:0817a150122b 722 " 20.8", // 9
Wayne Roberts 1:0817a150122b 723 " 25.0", // 10
Wayne Roberts 1:0817a150122b 724 " 31.3", // 11
Wayne Roberts 1:0817a150122b 725 " 41.7", // 12
Wayne Roberts 1:0817a150122b 726 " 50.0", // 13
Wayne Roberts 1:0817a150122b 727 " 62.5", // 14
Wayne Roberts 1:0817a150122b 728 " 83.3", // 15
Wayne Roberts 1:0817a150122b 729 "100.0", // 16
Wayne Roberts 1:0817a150122b 730 "125.0", // 17
Wayne Roberts 1:0817a150122b 731 "166.7", // 18
Wayne Roberts 1:0817a150122b 732 "200.0", // 19
Wayne Roberts 1:0817a150122b 733 "250.0", // 20
Wayne Roberts 1:0817a150122b 734 NULL
Wayne Roberts 1:0817a150122b 735 };
Wayne Roberts 1:0817a150122b 736
Wayne Roberts 1:0817a150122b 737 unsigned Radio::bw_read_cb(uint8_t regAddr)
Wayne Roberts 1:0817a150122b 738 {
Wayne Roberts 1:0817a150122b 739 RegRxBw_t reg_bw;
Wayne Roberts 1:0817a150122b 740
Wayne Roberts 1:0817a150122b 741 reg_bw.octet = radio.read_reg(regAddr);
Wayne Roberts 1:0817a150122b 742
Wayne Roberts 1:0817a150122b 743 switch (reg_bw.bits.Exponent) {
Wayne Roberts 1:0817a150122b 744 case 7:
Wayne Roberts 1:0817a150122b 745 if (reg_bw.bits.Mantissa == 2)
Wayne Roberts 1:0817a150122b 746 return 0;
Wayne Roberts 1:0817a150122b 747 if (reg_bw.bits.Mantissa == 1)
Wayne Roberts 1:0817a150122b 748 return 1;
Wayne Roberts 1:0817a150122b 749 if (reg_bw.bits.Mantissa == 0)
Wayne Roberts 1:0817a150122b 750 return 2;
Wayne Roberts 1:0817a150122b 751 break;
Wayne Roberts 1:0817a150122b 752 case 6:
Wayne Roberts 1:0817a150122b 753 if (reg_bw.bits.Mantissa == 2)
Wayne Roberts 1:0817a150122b 754 return 3;
Wayne Roberts 1:0817a150122b 755 if (reg_bw.bits.Mantissa == 1)
Wayne Roberts 1:0817a150122b 756 return 4;
Wayne Roberts 1:0817a150122b 757 if (reg_bw.bits.Mantissa == 0)
Wayne Roberts 1:0817a150122b 758 return 5;
Wayne Roberts 1:0817a150122b 759 break;
Wayne Roberts 1:0817a150122b 760 case 5:
Wayne Roberts 1:0817a150122b 761 if (reg_bw.bits.Mantissa == 2)
Wayne Roberts 1:0817a150122b 762 return 6;
Wayne Roberts 1:0817a150122b 763 if (reg_bw.bits.Mantissa == 1)
Wayne Roberts 1:0817a150122b 764 return 7;
Wayne Roberts 1:0817a150122b 765 if (reg_bw.bits.Mantissa == 0)
Wayne Roberts 1:0817a150122b 766 return 8;
Wayne Roberts 1:0817a150122b 767 break;
Wayne Roberts 1:0817a150122b 768 case 4:
Wayne Roberts 1:0817a150122b 769 if (reg_bw.bits.Mantissa == 2)
Wayne Roberts 1:0817a150122b 770 return 9;
Wayne Roberts 1:0817a150122b 771 if (reg_bw.bits.Mantissa == 1)
Wayne Roberts 1:0817a150122b 772 return 10;
Wayne Roberts 1:0817a150122b 773 if (reg_bw.bits.Mantissa == 0)
Wayne Roberts 1:0817a150122b 774 return 11;
Wayne Roberts 1:0817a150122b 775 break;
Wayne Roberts 1:0817a150122b 776 case 3:
Wayne Roberts 1:0817a150122b 777 if (reg_bw.bits.Mantissa == 2)
Wayne Roberts 1:0817a150122b 778 return 12;
Wayne Roberts 1:0817a150122b 779 if (reg_bw.bits.Mantissa == 1)
Wayne Roberts 1:0817a150122b 780 return 13;
Wayne Roberts 1:0817a150122b 781 if (reg_bw.bits.Mantissa == 0)
Wayne Roberts 1:0817a150122b 782 return 14;
Wayne Roberts 1:0817a150122b 783 break;
Wayne Roberts 1:0817a150122b 784 case 2:
Wayne Roberts 1:0817a150122b 785 if (reg_bw.bits.Mantissa == 2)
Wayne Roberts 1:0817a150122b 786 return 15;
Wayne Roberts 1:0817a150122b 787 if (reg_bw.bits.Mantissa == 1)
Wayne Roberts 1:0817a150122b 788 return 16;
Wayne Roberts 1:0817a150122b 789 if (reg_bw.bits.Mantissa == 0)
Wayne Roberts 1:0817a150122b 790 return 17;
Wayne Roberts 1:0817a150122b 791 break;
Wayne Roberts 1:0817a150122b 792 case 1:
Wayne Roberts 1:0817a150122b 793 if (reg_bw.bits.Mantissa == 2)
Wayne Roberts 1:0817a150122b 794 return 18;
Wayne Roberts 1:0817a150122b 795 if (reg_bw.bits.Mantissa == 1)
Wayne Roberts 1:0817a150122b 796 return 19;
Wayne Roberts 1:0817a150122b 797 if (reg_bw.bits.Mantissa == 0)
Wayne Roberts 1:0817a150122b 798 return 20;
Wayne Roberts 1:0817a150122b 799 break;
Wayne Roberts 1:0817a150122b 800 }
Wayne Roberts 1:0817a150122b 801
Wayne Roberts 1:0817a150122b 802 return 21;
Wayne Roberts 1:0817a150122b 803 }
Wayne Roberts 1:0817a150122b 804
Wayne Roberts 1:0817a150122b 805 unsigned Radio::rxbw_read_cb(bool)
Wayne Roberts 1:0817a150122b 806 {
Wayne Roberts 1:0817a150122b 807 return bw_read_cb(REG_FSK_RXBW);
Wayne Roberts 1:0817a150122b 808 }
Wayne Roberts 1:0817a150122b 809
Wayne Roberts 1:0817a150122b 810 unsigned Radio::afcbw_read_cb(bool)
Wayne Roberts 1:0817a150122b 811 {
Wayne Roberts 1:0817a150122b 812 return bw_read_cb(REG_FSK_AFCBW);
Wayne Roberts 1:0817a150122b 813 }
Wayne Roberts 1:0817a150122b 814
Wayne Roberts 1:0817a150122b 815 void Radio::bw_write_cb(unsigned sidx, uint8_t regAddr)
Wayne Roberts 1:0817a150122b 816 {
Wayne Roberts 1:0817a150122b 817 RegRxBw_t reg_bw;
Wayne Roberts 1:0817a150122b 818
Wayne Roberts 1:0817a150122b 819 reg_bw.octet = radio.read_reg(regAddr);
Wayne Roberts 1:0817a150122b 820
Wayne Roberts 1:0817a150122b 821 switch (sidx) {
Wayne Roberts 1:0817a150122b 822 case 0:
Wayne Roberts 1:0817a150122b 823 reg_bw.bits.Mantissa = 2;
Wayne Roberts 1:0817a150122b 824 reg_bw.bits.Exponent = 7;
Wayne Roberts 1:0817a150122b 825 break;
Wayne Roberts 1:0817a150122b 826 case 1:
Wayne Roberts 1:0817a150122b 827 reg_bw.bits.Mantissa = 1;
Wayne Roberts 1:0817a150122b 828 reg_bw.bits.Exponent = 7;
Wayne Roberts 1:0817a150122b 829 break;
Wayne Roberts 1:0817a150122b 830 case 2:
Wayne Roberts 1:0817a150122b 831 reg_bw.bits.Mantissa = 0;
Wayne Roberts 1:0817a150122b 832 reg_bw.bits.Exponent = 7;
Wayne Roberts 1:0817a150122b 833 break;
Wayne Roberts 1:0817a150122b 834 case 3:
Wayne Roberts 1:0817a150122b 835 reg_bw.bits.Mantissa = 2;
Wayne Roberts 1:0817a150122b 836 reg_bw.bits.Exponent = 6;
Wayne Roberts 1:0817a150122b 837 break;
Wayne Roberts 1:0817a150122b 838 case 4:
Wayne Roberts 1:0817a150122b 839 reg_bw.bits.Mantissa = 1;
Wayne Roberts 1:0817a150122b 840 reg_bw.bits.Exponent = 6;
Wayne Roberts 1:0817a150122b 841 break;
Wayne Roberts 1:0817a150122b 842 case 5:
Wayne Roberts 1:0817a150122b 843 reg_bw.bits.Mantissa = 0;
Wayne Roberts 1:0817a150122b 844 reg_bw.bits.Exponent = 6;
Wayne Roberts 1:0817a150122b 845 break;
Wayne Roberts 1:0817a150122b 846 case 6:
Wayne Roberts 1:0817a150122b 847 reg_bw.bits.Mantissa = 2;
Wayne Roberts 1:0817a150122b 848 reg_bw.bits.Exponent = 5;
Wayne Roberts 1:0817a150122b 849 break;
Wayne Roberts 1:0817a150122b 850 case 7:
Wayne Roberts 1:0817a150122b 851 reg_bw.bits.Mantissa = 1;
Wayne Roberts 1:0817a150122b 852 reg_bw.bits.Exponent = 5;
Wayne Roberts 1:0817a150122b 853 break;
Wayne Roberts 1:0817a150122b 854 case 8:
Wayne Roberts 1:0817a150122b 855 reg_bw.bits.Mantissa = 0;
Wayne Roberts 1:0817a150122b 856 reg_bw.bits.Exponent = 5;
Wayne Roberts 1:0817a150122b 857 break;
Wayne Roberts 1:0817a150122b 858 case 9:
Wayne Roberts 1:0817a150122b 859 reg_bw.bits.Mantissa = 2;
Wayne Roberts 1:0817a150122b 860 reg_bw.bits.Exponent = 4;
Wayne Roberts 1:0817a150122b 861 break;
Wayne Roberts 1:0817a150122b 862 case 10:
Wayne Roberts 1:0817a150122b 863 reg_bw.bits.Mantissa = 1;
Wayne Roberts 1:0817a150122b 864 reg_bw.bits.Exponent = 4;
Wayne Roberts 1:0817a150122b 865 break;
Wayne Roberts 1:0817a150122b 866 case 11:
Wayne Roberts 1:0817a150122b 867 reg_bw.bits.Mantissa = 0;
Wayne Roberts 1:0817a150122b 868 reg_bw.bits.Exponent = 4;
Wayne Roberts 1:0817a150122b 869 break;
Wayne Roberts 1:0817a150122b 870 case 12:
Wayne Roberts 1:0817a150122b 871 reg_bw.bits.Mantissa = 2;
Wayne Roberts 1:0817a150122b 872 reg_bw.bits.Exponent = 3;
Wayne Roberts 1:0817a150122b 873 break;
Wayne Roberts 1:0817a150122b 874 case 13:
Wayne Roberts 1:0817a150122b 875 reg_bw.bits.Mantissa = 1;
Wayne Roberts 1:0817a150122b 876 reg_bw.bits.Exponent = 3;
Wayne Roberts 1:0817a150122b 877 break;
Wayne Roberts 1:0817a150122b 878 case 14:
Wayne Roberts 1:0817a150122b 879 reg_bw.bits.Mantissa = 0;
Wayne Roberts 1:0817a150122b 880 reg_bw.bits.Exponent = 3;
Wayne Roberts 1:0817a150122b 881 break;
Wayne Roberts 1:0817a150122b 882 case 15:
Wayne Roberts 1:0817a150122b 883 reg_bw.bits.Mantissa = 2;
Wayne Roberts 1:0817a150122b 884 reg_bw.bits.Exponent = 2;
Wayne Roberts 1:0817a150122b 885 break;
Wayne Roberts 1:0817a150122b 886 case 16:
Wayne Roberts 1:0817a150122b 887 reg_bw.bits.Mantissa = 1;
Wayne Roberts 1:0817a150122b 888 reg_bw.bits.Exponent = 2;
Wayne Roberts 1:0817a150122b 889 break;
Wayne Roberts 1:0817a150122b 890 case 17:
Wayne Roberts 1:0817a150122b 891 reg_bw.bits.Mantissa = 0;
Wayne Roberts 1:0817a150122b 892 reg_bw.bits.Exponent = 2;
Wayne Roberts 1:0817a150122b 893 break;
Wayne Roberts 1:0817a150122b 894 case 18:
Wayne Roberts 1:0817a150122b 895 reg_bw.bits.Mantissa = 2;
Wayne Roberts 1:0817a150122b 896 reg_bw.bits.Exponent = 1;
Wayne Roberts 1:0817a150122b 897 break;
Wayne Roberts 1:0817a150122b 898 case 19:
Wayne Roberts 1:0817a150122b 899 reg_bw.bits.Mantissa = 1;
Wayne Roberts 1:0817a150122b 900 reg_bw.bits.Exponent = 1;
Wayne Roberts 1:0817a150122b 901 break;
Wayne Roberts 1:0817a150122b 902 case 20:
Wayne Roberts 1:0817a150122b 903 reg_bw.bits.Mantissa = 0;
Wayne Roberts 1:0817a150122b 904 reg_bw.bits.Exponent = 1;
Wayne Roberts 1:0817a150122b 905 break;
Wayne Roberts 1:0817a150122b 906 }
Wayne Roberts 1:0817a150122b 907
Wayne Roberts 1:0817a150122b 908 radio.write_reg(regAddr, reg_bw.octet);
Wayne Roberts 1:0817a150122b 909 }
Wayne Roberts 1:0817a150122b 910
Wayne Roberts 1:0817a150122b 911 menuMode_e Radio::rxbw_write_cb(unsigned sidx)
Wayne Roberts 1:0817a150122b 912 {
Wayne Roberts 1:0817a150122b 913 bw_write_cb(sidx, REG_FSK_RXBW);
Wayne Roberts 1:0817a150122b 914 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 915 }
Wayne Roberts 1:0817a150122b 916
Wayne Roberts 1:0817a150122b 917 menuMode_e Radio::afcbw_write_cb(unsigned sidx)
Wayne Roberts 1:0817a150122b 918 {
Wayne Roberts 1:0817a150122b 919 bw_write_cb(sidx, REG_FSK_AFCBW);
Wayne Roberts 1:0817a150122b 920 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 921 }
Wayne Roberts 1:0817a150122b 922
Wayne Roberts 1:0817a150122b 923 const dropdown_item_t Radio::rxbw_item = { _ITEM_DROPDOWN, rxbws, rxbws, rxbw_read_cb, rxbw_write_cb};
Wayne Roberts 1:0817a150122b 924 const dropdown_item_t Radio::afcbw_item = { _ITEM_DROPDOWN, rxbws, rxbws, afcbw_read_cb, afcbw_write_cb};
Wayne Roberts 1:0817a150122b 925
Wayne Roberts 1:0817a150122b 926 void Radio::pblLen_print()
Wayne Roberts 1:0817a150122b 927 {
Wayne Roberts 1:0817a150122b 928 pc.printf("%u", radio.read_u16(REG_FSK_PREAMBLEMSB));
Wayne Roberts 1:0817a150122b 929 }
Wayne Roberts 1:0817a150122b 930
Wayne Roberts 1:0817a150122b 931 bool Radio::pblLen_write(const char* txt)
Wayne Roberts 1:0817a150122b 932 {
Wayne Roberts 1:0817a150122b 933 unsigned n;
Wayne Roberts 1:0817a150122b 934 sscanf(txt, "%u", &n);
Wayne Roberts 1:0817a150122b 935 radio.write_u16(REG_FSK_PREAMBLEMSB, n);
Wayne Roberts 1:0817a150122b 936 return false;
Wayne Roberts 1:0817a150122b 937 }
Wayne Roberts 1:0817a150122b 938
Wayne Roberts 1:0817a150122b 939 const value_item_t Radio::pblLen_item = { _ITEM_VALUE, 6, pblLen_print, pblLen_write};
Wayne Roberts 1:0817a150122b 940
Wayne Roberts 1:0817a150122b 941
Wayne Roberts 1:0817a150122b 942 const char* const rxTriggers[] = {
Wayne Roberts 1:0817a150122b 943 "off ", // 0
Wayne Roberts 1:0817a150122b 944 "RSSI ", // 1
Wayne Roberts 1:0817a150122b 945 "Preamble ", // 2
Wayne Roberts 1:0817a150122b 946 "RSSI+Preamble", // 3
Wayne Roberts 1:0817a150122b 947 NULL
Wayne Roberts 1:0817a150122b 948 };
Wayne Roberts 1:0817a150122b 949
Wayne Roberts 1:0817a150122b 950 unsigned Radio::rxTrigger_read_cb(bool fw)
Wayne Roberts 1:0817a150122b 951 {
Wayne Roberts 1:0817a150122b 952 fsk.RegRxConfig.octet = radio.read_reg(REG_FSK_RXCONFIG);
Wayne Roberts 1:0817a150122b 953 return fsk.RegRxConfig.bits.RxTrigger;
Wayne Roberts 1:0817a150122b 954 }
Wayne Roberts 1:0817a150122b 955
Wayne Roberts 1:0817a150122b 956 menuMode_e Radio::rxTrigger_write_cb(unsigned sidx)
Wayne Roberts 1:0817a150122b 957 {
Wayne Roberts 1:0817a150122b 958 fsk.RegRxConfig.bits.RxTrigger = sidx;
Wayne Roberts 1:0817a150122b 959 radio.write_reg(REG_FSK_RXCONFIG, fsk.RegRxConfig.octet);
Wayne Roberts 1:0817a150122b 960 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 961 }
Wayne Roberts 1:0817a150122b 962
Wayne Roberts 1:0817a150122b 963 const dropdown_item_t Radio::rxTrigger_item = { _ITEM_DROPDOWN, rxTriggers, rxTriggers, rxTrigger_read_cb, rxTrigger_write_cb};
Wayne Roberts 1:0817a150122b 964
Wayne Roberts 1:0817a150122b 965 bool Radio::AgcAutoOn_read()
Wayne Roberts 1:0817a150122b 966 {
Wayne Roberts 1:0817a150122b 967 fsk.RegRxConfig.octet = radio.read_reg(REG_FSK_RXCONFIG);
Wayne Roberts 1:0817a150122b 968 return fsk.RegRxConfig.bits.AgcAutoOn;
Wayne Roberts 1:0817a150122b 969 }
Wayne Roberts 1:0817a150122b 970
Wayne Roberts 1:0817a150122b 971 bool Radio::AgcAutoOn_push()
Wayne Roberts 1:0817a150122b 972 {
Wayne Roberts 1:0817a150122b 973 fsk.RegRxConfig.bits.AgcAutoOn ^= 1;
Wayne Roberts 1:0817a150122b 974 radio.write_reg(REG_FSK_RXCONFIG, fsk.RegRxConfig.octet);
Wayne Roberts 1:0817a150122b 975 return fsk.RegRxConfig.bits.AgcAutoOn;
Wayne Roberts 1:0817a150122b 976 }
Wayne Roberts 1:0817a150122b 977
Wayne Roberts 1:0817a150122b 978 bool Radio::AfcAutoOn_read()
Wayne Roberts 1:0817a150122b 979 {
Wayne Roberts 1:0817a150122b 980 fsk.RegRxConfig.octet = radio.read_reg(REG_FSK_RXCONFIG);
Wayne Roberts 1:0817a150122b 981 return fsk.RegRxConfig.bits.AfcAutoOn;
Wayne Roberts 1:0817a150122b 982 }
Wayne Roberts 1:0817a150122b 983
Wayne Roberts 1:0817a150122b 984 bool Radio::AfcAutoOn_push()
Wayne Roberts 1:0817a150122b 985 {
Wayne Roberts 1:0817a150122b 986 fsk.RegRxConfig.bits.AfcAutoOn ^= 1;
Wayne Roberts 1:0817a150122b 987 radio.write_reg(REG_FSK_RXCONFIG, fsk.RegRxConfig.octet);
Wayne Roberts 1:0817a150122b 988 return fsk.RegRxConfig.bits.AfcAutoOn;
Wayne Roberts 1:0817a150122b 989 }
Wayne Roberts 1:0817a150122b 990
Wayne Roberts 1:0817a150122b 991 const toggle_item_t Radio::agcautoon_item = { _ITEM_TOGGLE, "AgcAutoOn", NULL, AgcAutoOn_read, AgcAutoOn_push};
Wayne Roberts 1:0817a150122b 992
Wayne Roberts 1:0817a150122b 993 const toggle_item_t Radio::afcautoon_item = { _ITEM_TOGGLE, "AfcAutoOn", NULL, AfcAutoOn_read, AfcAutoOn_push};
Wayne Roberts 1:0817a150122b 994
Wayne Roberts 1:0817a150122b 995 bool Radio::RestartRxOnCollision_read()
Wayne Roberts 1:0817a150122b 996 {
Wayne Roberts 1:0817a150122b 997 fsk.RegRxConfig.octet = radio.read_reg(REG_FSK_RXCONFIG);
Wayne Roberts 1:0817a150122b 998 return fsk.RegRxConfig.bits.RestartRxOnCollision;
Wayne Roberts 1:0817a150122b 999 }
Wayne Roberts 1:0817a150122b 1000
Wayne Roberts 1:0817a150122b 1001 bool Radio::RestartRxOnCollision_push()
Wayne Roberts 1:0817a150122b 1002 {
Wayne Roberts 1:0817a150122b 1003 fsk.RegRxConfig.bits.RestartRxOnCollision ^= 1;
Wayne Roberts 1:0817a150122b 1004 radio.write_reg(REG_FSK_RXCONFIG, fsk.RegRxConfig.octet);
Wayne Roberts 1:0817a150122b 1005 return fsk.RegRxConfig.bits.RestartRxOnCollision;
Wayne Roberts 1:0817a150122b 1006 }
Wayne Roberts 1:0817a150122b 1007
Wayne Roberts 1:0817a150122b 1008 const toggle_item_t Radio::RestartRxOnCollision_item = { _ITEM_TOGGLE,
Wayne Roberts 1:0817a150122b 1009 "RestartRxOnCollision", NULL,
Wayne Roberts 1:0817a150122b 1010 RestartRxOnCollision_read, RestartRxOnCollision_push
Wayne Roberts 1:0817a150122b 1011 };
Wayne Roberts 1:0817a150122b 1012
Wayne Roberts 1:0817a150122b 1013 void Radio::RestartRxWithPllLock_push()
Wayne Roberts 1:0817a150122b 1014 {
Wayne Roberts 1:0817a150122b 1015 fsk.RegRxConfig.bits.RestartRxWithPllLock = 1;
Wayne Roberts 1:0817a150122b 1016 radio.write_reg(REG_FSK_RXCONFIG, fsk.RegRxConfig.octet);
Wayne Roberts 1:0817a150122b 1017 fsk.RegRxConfig.bits.RestartRxWithPllLock = 0;
Wayne Roberts 1:0817a150122b 1018 }
Wayne Roberts 1:0817a150122b 1019
Wayne Roberts 1:0817a150122b 1020 const button_item_t Radio::RestartRxWithPllLock_item = { _ITEM_BUTTON,
Wayne Roberts 1:0817a150122b 1021 "RestartRxWithPllLock",
Wayne Roberts 1:0817a150122b 1022 RestartRxWithPllLock_push
Wayne Roberts 1:0817a150122b 1023 };
Wayne Roberts 1:0817a150122b 1024
Wayne Roberts 1:0817a150122b 1025 void Radio::RestartRxWithoutPllLock_push()
Wayne Roberts 1:0817a150122b 1026 {
Wayne Roberts 1:0817a150122b 1027 fsk.RegRxConfig.bits.RestartRxWithoutPllLock = 1;
Wayne Roberts 1:0817a150122b 1028 radio.write_reg(REG_FSK_RXCONFIG, fsk.RegRxConfig.octet);
Wayne Roberts 1:0817a150122b 1029 fsk.RegRxConfig.bits.RestartRxWithoutPllLock = 0;
Wayne Roberts 1:0817a150122b 1030 }
Wayne Roberts 1:0817a150122b 1031
Wayne Roberts 1:0817a150122b 1032 const button_item_t Radio::RestartRxWithoutPllLock_item = { _ITEM_BUTTON,
Wayne Roberts 1:0817a150122b 1033 "RestartRxWithoutPllLock",
Wayne Roberts 1:0817a150122b 1034 RestartRxWithoutPllLock_push
Wayne Roberts 1:0817a150122b 1035 };
Wayne Roberts 1:0817a150122b 1036
Wayne Roberts 1:0817a150122b 1037 bool Radio::AfcAutoClearOn_read(void)
Wayne Roberts 1:0817a150122b 1038 {
Wayne Roberts 1:0817a150122b 1039 fsk.RegAfcFei.octet = radio.read_reg(REG_FSK_AFCFEI);
Wayne Roberts 1:0817a150122b 1040 return fsk.RegAfcFei.bits.AfcAutoClearOn;
Wayne Roberts 1:0817a150122b 1041 }
Wayne Roberts 1:0817a150122b 1042
Wayne Roberts 1:0817a150122b 1043 bool Radio::AfcAutoClearOn_push(void)
Wayne Roberts 1:0817a150122b 1044 {
Wayne Roberts 1:0817a150122b 1045 fsk.RegAfcFei.bits.AfcAutoClearOn ^= 1;
Wayne Roberts 1:0817a150122b 1046 radio.write_reg(REG_FSK_AFCFEI, fsk.RegAfcFei.octet);
Wayne Roberts 1:0817a150122b 1047 return fsk.RegAfcFei.bits.AfcAutoClearOn;
Wayne Roberts 1:0817a150122b 1048 }
Wayne Roberts 1:0817a150122b 1049
Wayne Roberts 1:0817a150122b 1050 const toggle_item_t Radio::AfcAutoClearOn_item = { _ITEM_TOGGLE, "AfcAutoClearOn", NULL, AfcAutoClearOn_read, AfcAutoClearOn_push};
Wayne Roberts 1:0817a150122b 1051
Wayne Roberts 1:0817a150122b 1052 void Radio::AgcStart_push()
Wayne Roberts 1:0817a150122b 1053 {
Wayne Roberts 1:0817a150122b 1054 fsk.RegAfcFei.bits.AgcStart = 1;
Wayne Roberts 1:0817a150122b 1055 radio.write_reg(REG_FSK_AFCFEI, fsk.RegAfcFei.octet);
Wayne Roberts 1:0817a150122b 1056 fsk.RegAfcFei.bits.AgcStart = 1;
Wayne Roberts 1:0817a150122b 1057 }
Wayne Roberts 1:0817a150122b 1058
Wayne Roberts 1:0817a150122b 1059 const button_item_t Radio::AgcStart_item = { _ITEM_BUTTON, "AgcStart", AgcStart_push};
Wayne Roberts 1:0817a150122b 1060
Wayne Roberts 1:0817a150122b 1061 void Radio::AfcClear_push()
Wayne Roberts 1:0817a150122b 1062 {
Wayne Roberts 1:0817a150122b 1063 fsk.RegAfcFei.bits.AfcClear = 1;
Wayne Roberts 1:0817a150122b 1064 radio.write_reg(REG_FSK_AFCFEI, fsk.RegAfcFei.octet);
Wayne Roberts 1:0817a150122b 1065 fsk.RegAfcFei.bits.AfcClear = 0;
Wayne Roberts 1:0817a150122b 1066 }
Wayne Roberts 1:0817a150122b 1067 const button_item_t Radio::AfcClear_item = { _ITEM_BUTTON, "AfcClear", AfcClear_push};
Wayne Roberts 1:0817a150122b 1068
Wayne Roberts 1:0817a150122b 1069 void Radio::syncWord_print(void)
Wayne Roberts 1:0817a150122b 1070 {
Wayne Roberts 1:0817a150122b 1071 unsigned n, stop;
Wayne Roberts 1:0817a150122b 1072
Wayne Roberts 1:0817a150122b 1073 fsk.RegSyncConfig.octet = radio.read_reg(REG_FSK_SYNCCONFIG);
Wayne Roberts 1:0817a150122b 1074
Wayne Roberts 1:0817a150122b 1075 stop = fsk.RegSyncConfig.bits.SyncSize + 1;
Wayne Roberts 1:0817a150122b 1076 for (n = 0; n < stop; n++) {
Wayne Roberts 1:0817a150122b 1077 pc.printf("%02x", radio.read_reg(REG_FSK_SYNCVALUE1+n));
Wayne Roberts 1:0817a150122b 1078 }
Wayne Roberts 1:0817a150122b 1079 }
Wayne Roberts 1:0817a150122b 1080
Wayne Roberts 1:0817a150122b 1081 bool Radio::syncWord_write(const char* txt)
Wayne Roberts 1:0817a150122b 1082 {
Wayne Roberts 1:0817a150122b 1083 const char* ptr;
Wayne Roberts 1:0817a150122b 1084 const char* endPtr;
Wayne Roberts 1:0817a150122b 1085 unsigned o, n = 0;
Wayne Roberts 1:0817a150122b 1086
Wayne Roberts 1:0817a150122b 1087 endPtr = txt + strlen(txt);
Wayne Roberts 1:0817a150122b 1088 for (ptr = txt; sscanf(ptr, "%02x", &o) == 1; ) {
Wayne Roberts 1:0817a150122b 1089 radio.write_reg(REG_FSK_SYNCVALUE1+n, o);
Wayne Roberts 1:0817a150122b 1090 n++;
Wayne Roberts 1:0817a150122b 1091 ptr += 2;
Wayne Roberts 1:0817a150122b 1092 if (ptr >= endPtr)
Wayne Roberts 1:0817a150122b 1093 break;
Wayne Roberts 1:0817a150122b 1094 }
Wayne Roberts 1:0817a150122b 1095
Wayne Roberts 1:0817a150122b 1096 fsk.RegSyncConfig.bits.SyncSize = n - 1;
Wayne Roberts 1:0817a150122b 1097 radio.write_reg(REG_FSK_SYNCCONFIG, fsk.RegSyncConfig.octet);
Wayne Roberts 1:0817a150122b 1098
Wayne Roberts 1:0817a150122b 1099 return false;
Wayne Roberts 1:0817a150122b 1100 }
Wayne Roberts 1:0817a150122b 1101
Wayne Roberts 1:0817a150122b 1102 const value_item_t Radio::syncWord_item = { _ITEM_VALUE, 17, syncWord_print, syncWord_write};
Wayne Roberts 1:0817a150122b 1103
Wayne Roberts 1:0817a150122b 1104 void Radio::syncSize_print(void)
Wayne Roberts 1:0817a150122b 1105 {
Wayne Roberts 1:0817a150122b 1106 fsk.RegSyncConfig.octet = radio.read_reg(REG_FSK_SYNCCONFIG);
Wayne Roberts 1:0817a150122b 1107
Wayne Roberts 1:0817a150122b 1108 pc.printf("%u", fsk.RegSyncConfig.bits.SyncSize + 1);
Wayne Roberts 1:0817a150122b 1109 }
Wayne Roberts 1:0817a150122b 1110
Wayne Roberts 1:0817a150122b 1111 bool Radio::syncSize_write(const char* txt)
Wayne Roberts 1:0817a150122b 1112 {
Wayne Roberts 1:0817a150122b 1113 unsigned n;
Wayne Roberts 1:0817a150122b 1114 sscanf(txt, "%u", &n);
Wayne Roberts 1:0817a150122b 1115 if (n > 0) {
Wayne Roberts 1:0817a150122b 1116 fsk.RegSyncConfig.bits.SyncSize = n - 1;
Wayne Roberts 1:0817a150122b 1117 radio.write_reg(REG_FSK_SYNCCONFIG, fsk.RegSyncConfig.octet);
Wayne Roberts 1:0817a150122b 1118 }
Wayne Roberts 1:0817a150122b 1119 return false;
Wayne Roberts 1:0817a150122b 1120 }
Wayne Roberts 1:0817a150122b 1121
Wayne Roberts 1:0817a150122b 1122 const value_item_t Radio::syncSize_item = { _ITEM_VALUE, 2, syncSize_print, syncSize_write};
Wayne Roberts 1:0817a150122b 1123
Wayne Roberts 1:0817a150122b 1124 bool Radio::SyncOn_read()
Wayne Roberts 1:0817a150122b 1125 {
Wayne Roberts 1:0817a150122b 1126 fsk.RegSyncConfig.octet = radio.read_reg(REG_FSK_SYNCCONFIG);
Wayne Roberts 1:0817a150122b 1127 return fsk.RegSyncConfig.bits.SyncOn;
Wayne Roberts 1:0817a150122b 1128 }
Wayne Roberts 1:0817a150122b 1129
Wayne Roberts 1:0817a150122b 1130 bool Radio::SyncOn_push()
Wayne Roberts 1:0817a150122b 1131 {
Wayne Roberts 1:0817a150122b 1132 fsk.RegSyncConfig.bits.SyncOn ^= 1;
Wayne Roberts 1:0817a150122b 1133 radio.write_reg(REG_FSK_SYNCCONFIG, fsk.RegSyncConfig.octet);
Wayne Roberts 1:0817a150122b 1134 return fsk.RegSyncConfig.bits.SyncOn;
Wayne Roberts 1:0817a150122b 1135 }
Wayne Roberts 1:0817a150122b 1136
Wayne Roberts 1:0817a150122b 1137 const toggle_item_t Radio::syncOn_item = { _ITEM_TOGGLE, "SyncOn", NULL, SyncOn_read, SyncOn_push};
Wayne Roberts 1:0817a150122b 1138
Wayne Roberts 1:0817a150122b 1139 bool Radio::fsk_pktfmt_read()
Wayne Roberts 1:0817a150122b 1140 {
Wayne Roberts 1:0817a150122b 1141 fsk.RegPktConfig1.octet = radio.read_reg(REG_FSK_PACKETCONFIG1);
Wayne Roberts 1:0817a150122b 1142 return fsk.RegPktConfig1.bits.PacketFormatVariable;
Wayne Roberts 1:0817a150122b 1143 }
Wayne Roberts 1:0817a150122b 1144
Wayne Roberts 1:0817a150122b 1145 bool Radio::fsk_pktfmt_push()
Wayne Roberts 1:0817a150122b 1146 {
Wayne Roberts 1:0817a150122b 1147 fsk.RegPktConfig1.bits.PacketFormatVariable ^= 1;
Wayne Roberts 1:0817a150122b 1148 radio.write_reg(REG_FSK_PACKETCONFIG1, fsk.RegPktConfig1.octet);
Wayne Roberts 1:0817a150122b 1149 return fsk.RegPktConfig1.bits.PacketFormatVariable;
Wayne Roberts 1:0817a150122b 1150 }
Wayne Roberts 1:0817a150122b 1151
Wayne Roberts 1:0817a150122b 1152 const toggle_item_t Radio::fskook_pktfmt_item = { _ITEM_TOGGLE,
Wayne Roberts 1:0817a150122b 1153 "fixed ",
Wayne Roberts 1:0817a150122b 1154 "variable",
Wayne Roberts 1:0817a150122b 1155 fsk_pktfmt_read, fsk_pktfmt_push
Wayne Roberts 1:0817a150122b 1156 };
Wayne Roberts 1:0817a150122b 1157
Wayne Roberts 1:0817a150122b 1158
Wayne Roberts 1:0817a150122b 1159 void Radio::rssiOffset_print(void)
Wayne Roberts 1:0817a150122b 1160 {
Wayne Roberts 1:0817a150122b 1161 int ro;
Wayne Roberts 1:0817a150122b 1162 fsk.RegRssiConfig.octet = radio.read_reg(REG_FSK_RSSICONFIG);
Wayne Roberts 1:0817a150122b 1163 ro = fsk.RegRssiConfig.bits.RssiOffset;
Wayne Roberts 1:0817a150122b 1164 pc.printf("%d", ro);
Wayne Roberts 1:0817a150122b 1165 }
Wayne Roberts 1:0817a150122b 1166
Wayne Roberts 1:0817a150122b 1167 bool Radio::rssiOffset_write(const char* txt)
Wayne Roberts 1:0817a150122b 1168 {
Wayne Roberts 1:0817a150122b 1169 int ro;
Wayne Roberts 1:0817a150122b 1170 sscanf(txt, "%d", &ro);
Wayne Roberts 1:0817a150122b 1171 fsk.RegRssiConfig.bits.RssiOffset = ro;
Wayne Roberts 1:0817a150122b 1172 radio.write_reg(REG_FSK_RSSICONFIG, fsk.RegRssiConfig.octet);
Wayne Roberts 1:0817a150122b 1173 return false;
Wayne Roberts 1:0817a150122b 1174 }
Wayne Roberts 1:0817a150122b 1175
Wayne Roberts 1:0817a150122b 1176 const value_item_t Radio::rssiOffset_item = { _ITEM_VALUE, 2, rssiOffset_print, rssiOffset_write};
Wayne Roberts 1:0817a150122b 1177
Wayne Roberts 1:0817a150122b 1178 const char* const rssiSmoothings[] = {
Wayne Roberts 1:0817a150122b 1179 "2 ", // 0
Wayne Roberts 1:0817a150122b 1180 "4 ", // 1
Wayne Roberts 1:0817a150122b 1181 "8 ", // 2
Wayne Roberts 1:0817a150122b 1182 "16 ", // 3
Wayne Roberts 1:0817a150122b 1183 "32 ", // 4
Wayne Roberts 1:0817a150122b 1184 "64 ", // 5
Wayne Roberts 1:0817a150122b 1185 "128", // 6
Wayne Roberts 1:0817a150122b 1186 "256", // 7
Wayne Roberts 1:0817a150122b 1187 NULL
Wayne Roberts 1:0817a150122b 1188 };
Wayne Roberts 1:0817a150122b 1189
Wayne Roberts 1:0817a150122b 1190 unsigned Radio::rssiSmoothing_read(bool fw)
Wayne Roberts 1:0817a150122b 1191 {
Wayne Roberts 1:0817a150122b 1192 fsk.RegRssiConfig.octet = radio.read_reg(REG_FSK_RSSICONFIG);
Wayne Roberts 1:0817a150122b 1193 return fsk.RegRssiConfig.bits.RssiSmoothing;
Wayne Roberts 1:0817a150122b 1194 }
Wayne Roberts 1:0817a150122b 1195
Wayne Roberts 1:0817a150122b 1196 menuMode_e Radio::rssiSmoothing_write(unsigned sidx)
Wayne Roberts 1:0817a150122b 1197 {
Wayne Roberts 1:0817a150122b 1198 radio.write_reg(REG_FSK_RSSICONFIG, fsk.RegRssiConfig.octet);
Wayne Roberts 1:0817a150122b 1199 fsk.RegRssiConfig.bits.RssiSmoothing = sidx;
Wayne Roberts 1:0817a150122b 1200 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 1201 }
Wayne Roberts 1:0817a150122b 1202
Wayne Roberts 1:0817a150122b 1203 const dropdown_item_t Radio::rssiSmoothing_item = { _ITEM_DROPDOWN, rssiSmoothings, rssiSmoothings, rssiSmoothing_read, rssiSmoothing_write};
Wayne Roberts 1:0817a150122b 1204
Wayne Roberts 1:0817a150122b 1205 bool Radio::dataMode_read()
Wayne Roberts 1:0817a150122b 1206 {
Wayne Roberts 1:0817a150122b 1207 fsk.RegPktConfig2.word = radio.read_u16(REG_FSK_PACKETCONFIG2);
Wayne Roberts 1:0817a150122b 1208 return fsk.RegPktConfig2.bits.DataModePacket;
Wayne Roberts 1:0817a150122b 1209 }
Wayne Roberts 1:0817a150122b 1210
Wayne Roberts 1:0817a150122b 1211 bool Radio::dataMode_push()
Wayne Roberts 1:0817a150122b 1212 {
Wayne Roberts 1:0817a150122b 1213 fsk.RegPktConfig2.bits.DataModePacket ^= 1;
Wayne Roberts 1:0817a150122b 1214 radio.write_u16(REG_FSK_PACKETCONFIG2, fsk.RegPktConfig2.word);
Wayne Roberts 1:0817a150122b 1215 return fsk.RegPktConfig2.bits.DataModePacket;
Wayne Roberts 1:0817a150122b 1216 }
Wayne Roberts 1:0817a150122b 1217
Wayne Roberts 1:0817a150122b 1218 const toggle_item_t Radio::dataMode_item = { _ITEM_TOGGLE,
Wayne Roberts 1:0817a150122b 1219 "continuous",
Wayne Roberts 1:0817a150122b 1220 "packet ",
Wayne Roberts 1:0817a150122b 1221 dataMode_read, dataMode_push
Wayne Roberts 1:0817a150122b 1222 };
Wayne Roberts 1:0817a150122b 1223
Wayne Roberts 1:0817a150122b 1224 bool Radio::bitSyncOn_read(void)
Wayne Roberts 1:0817a150122b 1225 {
Wayne Roberts 1:0817a150122b 1226 fsk.RegOokPeak.octet = radio.read_reg(REG_FSK_OOKPEAK);
Wayne Roberts 1:0817a150122b 1227 return fsk.RegOokPeak.bits.BitSyncOn;
Wayne Roberts 1:0817a150122b 1228 }
Wayne Roberts 1:0817a150122b 1229
Wayne Roberts 1:0817a150122b 1230 bool Radio::bitSyncOn_push(void)
Wayne Roberts 1:0817a150122b 1231 {
Wayne Roberts 1:0817a150122b 1232 fsk.RegOokPeak.bits.BitSyncOn ^= 1;
Wayne Roberts 1:0817a150122b 1233 radio.write_reg(REG_FSK_OOKPEAK, fsk.RegOokPeak.octet);
Wayne Roberts 1:0817a150122b 1234 return fsk.RegOokPeak.bits.BitSyncOn;
Wayne Roberts 1:0817a150122b 1235 }
Wayne Roberts 1:0817a150122b 1236
Wayne Roberts 1:0817a150122b 1237 const toggle_item_t Radio::bitSyncOn_item = { _ITEM_TOGGLE,
Wayne Roberts 1:0817a150122b 1238 "BitSyncOn", NULL,
Wayne Roberts 1:0817a150122b 1239 bitSyncOn_read, bitSyncOn_push
Wayne Roberts 1:0817a150122b 1240 };
Wayne Roberts 1:0817a150122b 1241
Wayne Roberts 1:0817a150122b 1242 const button_item_t Radio::pdLabel_item = { _ITEM_BUTTON, "PreambleDetector", NULL};
Wayne Roberts 1:0817a150122b 1243
Wayne Roberts 1:0817a150122b 1244 bool Radio::pdOn_read(void)
Wayne Roberts 1:0817a150122b 1245 {
Wayne Roberts 1:0817a150122b 1246 fsk.RegPreambleDetect.octet = radio.read_reg(REG_FSK_PREAMBLEDETECT);
Wayne Roberts 1:0817a150122b 1247 return fsk.RegPreambleDetect.bits.PreambleDetectorOn;
Wayne Roberts 1:0817a150122b 1248 }
Wayne Roberts 1:0817a150122b 1249
Wayne Roberts 1:0817a150122b 1250 bool Radio::pdOn_push(void)
Wayne Roberts 1:0817a150122b 1251 {
Wayne Roberts 1:0817a150122b 1252 fsk.RegPreambleDetect.bits.PreambleDetectorOn ^= 1;
Wayne Roberts 1:0817a150122b 1253 radio.write_reg(REG_FSK_PREAMBLEDETECT, fsk.RegPreambleDetect.octet);
Wayne Roberts 1:0817a150122b 1254 return fsk.RegPreambleDetect.bits.PreambleDetectorOn;
Wayne Roberts 1:0817a150122b 1255 }
Wayne Roberts 1:0817a150122b 1256
Wayne Roberts 1:0817a150122b 1257 const toggle_item_t Radio::pdOn_item = { _ITEM_TOGGLE,
Wayne Roberts 1:0817a150122b 1258 "On", NULL,
Wayne Roberts 1:0817a150122b 1259 pdOn_read, pdOn_push
Wayne Roberts 1:0817a150122b 1260 };
Wayne Roberts 1:0817a150122b 1261
Wayne Roberts 1:0817a150122b 1262 const char* const pdsizes[] = {
Wayne Roberts 1:0817a150122b 1263 "1 byte ", // 0
Wayne Roberts 1:0817a150122b 1264 "2 bytes", // 1
Wayne Roberts 1:0817a150122b 1265 "3 bytes", // 2
Wayne Roberts 1:0817a150122b 1266 NULL
Wayne Roberts 1:0817a150122b 1267 };
Wayne Roberts 1:0817a150122b 1268
Wayne Roberts 1:0817a150122b 1269 unsigned Radio::pdSize_read(bool)
Wayne Roberts 1:0817a150122b 1270 {
Wayne Roberts 1:0817a150122b 1271 fsk.RegPreambleDetect.octet = radio.read_reg(REG_FSK_PREAMBLEDETECT);
Wayne Roberts 1:0817a150122b 1272 return fsk.RegPreambleDetect.bits.PreambleDetectorSize;
Wayne Roberts 1:0817a150122b 1273 }
Wayne Roberts 1:0817a150122b 1274
Wayne Roberts 1:0817a150122b 1275 menuMode_e Radio::pdSize_write(unsigned sidx)
Wayne Roberts 1:0817a150122b 1276 {
Wayne Roberts 1:0817a150122b 1277 fsk.RegPreambleDetect.bits.PreambleDetectorSize = sidx;
Wayne Roberts 1:0817a150122b 1278 radio.write_reg(REG_FSK_PREAMBLEDETECT, fsk.RegPreambleDetect.octet);
Wayne Roberts 1:0817a150122b 1279 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 1280 }
Wayne Roberts 1:0817a150122b 1281
Wayne Roberts 1:0817a150122b 1282 const dropdown_item_t Radio::pdSize_item = { _ITEM_DROPDOWN, pdsizes, pdsizes, pdSize_read, pdSize_write};
Wayne Roberts 1:0817a150122b 1283
Wayne Roberts 1:0817a150122b 1284 void Radio::pdTol_print(void)
Wayne Roberts 1:0817a150122b 1285 {
Wayne Roberts 1:0817a150122b 1286 fsk.RegPreambleDetect.octet = radio.read_reg(REG_FSK_PREAMBLEDETECT);
Wayne Roberts 1:0817a150122b 1287 pc.printf("%u", fsk.RegPreambleDetect.bits.PreambleDetectorTol);
Wayne Roberts 1:0817a150122b 1288 }
Wayne Roberts 1:0817a150122b 1289
Wayne Roberts 1:0817a150122b 1290 bool Radio::pdTol_write(const char* txt)
Wayne Roberts 1:0817a150122b 1291 {
Wayne Roberts 1:0817a150122b 1292 unsigned n;
Wayne Roberts 1:0817a150122b 1293 sscanf(txt, "%u", &n);
Wayne Roberts 1:0817a150122b 1294 fsk.RegPreambleDetect.bits.PreambleDetectorTol = n;
Wayne Roberts 1:0817a150122b 1295 radio.write_reg(REG_FSK_PREAMBLEDETECT, fsk.RegPreambleDetect.octet);
Wayne Roberts 1:0817a150122b 1296 return false;
Wayne Roberts 1:0817a150122b 1297 }
Wayne Roberts 1:0817a150122b 1298
Wayne Roberts 1:0817a150122b 1299 const value_item_t Radio::pdTol_item = { _ITEM_VALUE, 3, pdTol_print, pdTol_write};
Wayne Roberts 1:0817a150122b 1300
Wayne Roberts 1:0817a150122b 1301 bool Radio::TxStartCondition_read()
Wayne Roberts 1:0817a150122b 1302 {
Wayne Roberts 1:0817a150122b 1303 fsk.RegFifoThreshold.octet = radio.read_reg(REG_FSK_FIFOTHRESH);
Wayne Roberts 1:0817a150122b 1304 return fsk.RegFifoThreshold.bits.TxStartCondition;
Wayne Roberts 1:0817a150122b 1305 }
Wayne Roberts 1:0817a150122b 1306
Wayne Roberts 1:0817a150122b 1307 bool Radio::TxStartCondition_push()
Wayne Roberts 1:0817a150122b 1308 {
Wayne Roberts 1:0817a150122b 1309 fsk.RegFifoThreshold.bits.TxStartCondition ^= 1;
Wayne Roberts 1:0817a150122b 1310 radio.write_reg(REG_FSK_FIFOTHRESH, fsk.RegFifoThreshold.octet);
Wayne Roberts 1:0817a150122b 1311 return fsk.RegFifoThreshold.bits.TxStartCondition;
Wayne Roberts 1:0817a150122b 1312 }
Wayne Roberts 1:0817a150122b 1313
Wayne Roberts 1:0817a150122b 1314 const toggle_item_t Radio::TxStartCondition_item = { _ITEM_TOGGLE,
Wayne Roberts 1:0817a150122b 1315 "FifoLevel ", // 0
Wayne Roberts 1:0817a150122b 1316 "FifoNotEmpty", // 1
Wayne Roberts 1:0817a150122b 1317 TxStartCondition_read, TxStartCondition_push
Wayne Roberts 1:0817a150122b 1318 };
Wayne Roberts 1:0817a150122b 1319
Wayne Roberts 1:0817a150122b 1320 void Radio::FifoThreshold_print(void)
Wayne Roberts 1:0817a150122b 1321 {
Wayne Roberts 1:0817a150122b 1322 fsk.RegFifoThreshold.octet = radio.read_reg(REG_FSK_FIFOTHRESH);
Wayne Roberts 1:0817a150122b 1323 pc.printf("%u", fsk.RegFifoThreshold.bits.FifoThreshold);
Wayne Roberts 1:0817a150122b 1324 }
Wayne Roberts 1:0817a150122b 1325
Wayne Roberts 1:0817a150122b 1326 bool Radio::FifoThreshold_write(const char* txt)
Wayne Roberts 1:0817a150122b 1327 {
Wayne Roberts 1:0817a150122b 1328 unsigned n;
Wayne Roberts 1:0817a150122b 1329 sscanf(txt, "%u", &n);
Wayne Roberts 1:0817a150122b 1330 fsk.RegFifoThreshold.bits.FifoThreshold = n;
Wayne Roberts 1:0817a150122b 1331 radio.write_reg(REG_FSK_FIFOTHRESH, fsk.RegFifoThreshold.octet);
Wayne Roberts 1:0817a150122b 1332 return false;
Wayne Roberts 1:0817a150122b 1333 }
Wayne Roberts 1:0817a150122b 1334
Wayne Roberts 1:0817a150122b 1335 const value_item_t Radio::FifoThreshold_item = { _ITEM_VALUE, 3, FifoThreshold_print, FifoThreshold_write};
Wayne Roberts 1:0817a150122b 1336
Wayne Roberts 1:0817a150122b 1337 const char* const dcFrees[] = {
Wayne Roberts 1:0817a150122b 1338 "none ", // 0
Wayne Roberts 1:0817a150122b 1339 "manchester", // 1
Wayne Roberts 1:0817a150122b 1340 "whitening ", // 2
Wayne Roberts 1:0817a150122b 1341 NULL
Wayne Roberts 1:0817a150122b 1342 };
Wayne Roberts 1:0817a150122b 1343
Wayne Roberts 1:0817a150122b 1344 unsigned Radio::dcFree_read(bool fw)
Wayne Roberts 1:0817a150122b 1345 {
Wayne Roberts 1:0817a150122b 1346 fsk.RegPktConfig1.octet = radio.read_reg(REG_FSK_PACKETCONFIG1);
Wayne Roberts 1:0817a150122b 1347 return fsk.RegPktConfig1.bits.DcFree;
Wayne Roberts 1:0817a150122b 1348 }
Wayne Roberts 1:0817a150122b 1349
Wayne Roberts 1:0817a150122b 1350 menuMode_e Radio::dcFree_write(unsigned sidx)
Wayne Roberts 1:0817a150122b 1351 {
Wayne Roberts 1:0817a150122b 1352 fsk.RegPktConfig1.bits.DcFree = sidx;
Wayne Roberts 1:0817a150122b 1353 radio.write_reg(REG_FSK_PACKETCONFIG1, fsk.RegPktConfig1.octet);
Wayne Roberts 1:0817a150122b 1354 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 1355 }
Wayne Roberts 1:0817a150122b 1356
Wayne Roberts 1:0817a150122b 1357 const dropdown_item_t Radio::dcFree_item = { _ITEM_DROPDOWN, dcFrees, dcFrees, dcFree_read, dcFree_write};
Wayne Roberts 1:0817a150122b 1358
Wayne Roberts 1:0817a150122b 1359 bool Radio::fskook_crcon_read()
Wayne Roberts 1:0817a150122b 1360 {
Wayne Roberts 1:0817a150122b 1361 fsk.RegPktConfig1.octet = radio.read_reg(REG_FSK_PACKETCONFIG1);
Wayne Roberts 1:0817a150122b 1362 return fsk.RegPktConfig1.bits.CrcOn;
Wayne Roberts 1:0817a150122b 1363 }
Wayne Roberts 1:0817a150122b 1364
Wayne Roberts 1:0817a150122b 1365 bool Radio::fskook_crcon_push()
Wayne Roberts 1:0817a150122b 1366 {
Wayne Roberts 1:0817a150122b 1367 fsk.RegPktConfig1.bits.CrcOn ^= 1;
Wayne Roberts 1:0817a150122b 1368 radio.write_reg(REG_FSK_PACKETCONFIG1, fsk.RegPktConfig1.octet);
Wayne Roberts 1:0817a150122b 1369
Wayne Roberts 1:0817a150122b 1370 if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER)
Wayne Roberts 1:0817a150122b 1371 fsk.config_dio0_for_pktmode_rx();
Wayne Roberts 1:0817a150122b 1372
Wayne Roberts 1:0817a150122b 1373 return fsk.RegPktConfig1.bits.CrcOn;
Wayne Roberts 1:0817a150122b 1374 }
Wayne Roberts 1:0817a150122b 1375
Wayne Roberts 1:0817a150122b 1376 const toggle_item_t Radio::fskook_crcon_item = { _ITEM_TOGGLE,
Wayne Roberts 1:0817a150122b 1377 "CrcOn", NULL,
Wayne Roberts 1:0817a150122b 1378 fskook_crcon_read, fskook_crcon_push
Wayne Roberts 1:0817a150122b 1379 };
Wayne Roberts 1:0817a150122b 1380
Wayne Roberts 1:0817a150122b 1381 void Radio::rssiThresh_print()
Wayne Roberts 1:0817a150122b 1382 {
Wayne Roberts 1:0817a150122b 1383 fsk.RegRssiThresh = radio.read_reg(REG_FSK_RSSITHRESH);
Wayne Roberts 1:0817a150122b 1384 pc.printf("%.1f", fsk.RegRssiThresh / -2.0);
Wayne Roberts 1:0817a150122b 1385 }
Wayne Roberts 1:0817a150122b 1386
Wayne Roberts 1:0817a150122b 1387 bool Radio::rssiThresh_write(const char* txt)
Wayne Roberts 1:0817a150122b 1388 {
Wayne Roberts 1:0817a150122b 1389 float dbm;
Wayne Roberts 1:0817a150122b 1390 sscanf(txt, "%f", &dbm);
Wayne Roberts 1:0817a150122b 1391 fsk.RegRssiThresh = dbm * -2.0;
Wayne Roberts 1:0817a150122b 1392 radio.write_reg(REG_FSK_RSSITHRESH, fsk.RegRssiThresh);
Wayne Roberts 1:0817a150122b 1393 return false;
Wayne Roberts 1:0817a150122b 1394 }
Wayne Roberts 1:0817a150122b 1395
Wayne Roberts 1:0817a150122b 1396 const value_item_t Radio::rssiThresh_item = { _ITEM_VALUE, 3, rssiThresh_print, rssiThresh_write};
Wayne Roberts 1:0817a150122b 1397
Wayne Roberts 1:0817a150122b 1398 bool Radio::pblPol_read()
Wayne Roberts 1:0817a150122b 1399 {
Wayne Roberts 1:0817a150122b 1400 fsk.RegSyncConfig.octet = radio.read_reg(REG_FSK_SYNCCONFIG);
Wayne Roberts 1:0817a150122b 1401 return fsk.RegSyncConfig.bits.PreamblePolarity;
Wayne Roberts 1:0817a150122b 1402 }
Wayne Roberts 1:0817a150122b 1403
Wayne Roberts 1:0817a150122b 1404 bool Radio::pblPol_push()
Wayne Roberts 1:0817a150122b 1405 {
Wayne Roberts 1:0817a150122b 1406 fsk.RegSyncConfig.bits.PreamblePolarity ^= 1;
Wayne Roberts 1:0817a150122b 1407 radio.write_reg(REG_FSK_SYNCCONFIG, fsk.RegSyncConfig.octet);
Wayne Roberts 1:0817a150122b 1408 return fsk.RegSyncConfig.bits.PreamblePolarity;
Wayne Roberts 1:0817a150122b 1409 }
Wayne Roberts 1:0817a150122b 1410
Wayne Roberts 1:0817a150122b 1411 const toggle_item_t Radio::pblPol_item = { _ITEM_TOGGLE,
Wayne Roberts 1:0817a150122b 1412 "0xaa",
Wayne Roberts 1:0817a150122b 1413 "0x55",
Wayne Roberts 1:0817a150122b 1414 pblPol_read, pblPol_push
Wayne Roberts 1:0817a150122b 1415 };
Wayne Roberts 1:0817a150122b 1416
Wayne Roberts 1:0817a150122b 1417 const menu_t Radio::fsk_menu[] = {
Wayne Roberts 1:0817a150122b 1418 { {FIRST_CHIP_MENU_ROW, 22}, "bps:", &fsk_ook_bitrate_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1419 { {FIRST_CHIP_MENU_ROW, 34}, "fdev:", &gfsk_fdev_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1420 { {FIRST_CHIP_MENU_ROW, 47}, "BT:", &gfsk_bt_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1421 { {FIRST_CHIP_MENU_ROW, 57}, "length:", &fskook_pktfmt_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1422
Wayne Roberts 1:0817a150122b 1423 { {FIRST_CHIP_MENU_ROW+1, 1}, "rxbw:", &rxbw_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1424 { {FIRST_CHIP_MENU_ROW+1, 14}, "afcbw:", &afcbw_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1425 { {FIRST_CHIP_MENU_ROW+1, 27}, "preambleLen:", &pblLen_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1426 { {FIRST_CHIP_MENU_ROW+1, 47}, "RxTrigger:", &rxTrigger_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1427 { {FIRST_CHIP_MENU_ROW+1, 72}, NULL, &pblPol_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1428
Wayne Roberts 1:0817a150122b 1429 { {FIRST_CHIP_MENU_ROW+2, 1}, "syncWord:", &syncWord_item, FLAG_MSGTYPE_ALL, &syncSize_item},
Wayne Roberts 1:0817a150122b 1430 { {FIRST_CHIP_MENU_ROW+2, 27}, "syncSize:", &syncSize_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1431 { {FIRST_CHIP_MENU_ROW+2, 39}, NULL, &syncOn_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1432 { {FIRST_CHIP_MENU_ROW+2, 47}, "DataMode:", &dataMode_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1433 { {FIRST_CHIP_MENU_ROW+2, 69}, NULL, &bitSyncOn_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1434
Wayne Roberts 1:0817a150122b 1435 { {FIRST_CHIP_MENU_ROW+3, 1}, NULL, &pdLabel_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1436 { {FIRST_CHIP_MENU_ROW+3, 18}, NULL, &pdOn_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1437 { {FIRST_CHIP_MENU_ROW+3, 23}, "size:", &pdSize_item , FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1438 { {FIRST_CHIP_MENU_ROW+3, 36}, "tol:", &pdTol_item , FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1439 { {FIRST_CHIP_MENU_ROW+3, 48}, "rssiThresh:", &rssiThresh_item , FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1440
Wayne Roberts 1:0817a150122b 1441 { {FIRST_CHIP_MENU_ROW+4, 1}, NULL, &agcautoon_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1442 { {FIRST_CHIP_MENU_ROW+4, 11}, NULL, &afcautoon_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1443 { {FIRST_CHIP_MENU_ROW+4, 22}, NULL, &RestartRxOnCollision_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1444 { {FIRST_CHIP_MENU_ROW+4, 43}, NULL, &RestartRxWithPllLock_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1445 { {FIRST_CHIP_MENU_ROW+4, 64}, NULL, &RestartRxWithoutPllLock_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1446
Wayne Roberts 1:0817a150122b 1447 { {FIRST_CHIP_MENU_ROW+5, 1}, NULL, &AfcAutoClearOn_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1448 { {FIRST_CHIP_MENU_ROW+5, 17}, NULL, &AgcStart_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1449 { {FIRST_CHIP_MENU_ROW+5, 27}, NULL, &AfcClear_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1450 { {FIRST_CHIP_MENU_ROW+5, 37}, "rssiOffset:", &rssiOffset_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1451 { {FIRST_CHIP_MENU_ROW+5, 52}, "rssiSmoothing:", &rssiSmoothing_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1452
Wayne Roberts 1:0817a150122b 1453 { {FIRST_CHIP_MENU_ROW+6, 1}, "TxStartCondition:", &TxStartCondition_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1454 { {FIRST_CHIP_MENU_ROW+6, 32}, "FifoThreshold:", &FifoThreshold_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1455 { {FIRST_CHIP_MENU_ROW+6, 50}, "dcFree:", &dcFree_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1456 { {FIRST_CHIP_MENU_ROW+6, 68}, NULL, &fskook_crcon_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1457
Wayne Roberts 1:0817a150122b 1458 { {0, 0}, NULL, NULL }
Wayne Roberts 1:0817a150122b 1459 };
Wayne Roberts 1:0817a150122b 1460
Wayne Roberts 1:0817a150122b 1461 const button_item_t Radio::ookLabel_item = { _ITEM_BUTTON, "Ook", NULL};
Wayne Roberts 1:0817a150122b 1462
Wayne Roberts 1:0817a150122b 1463 const menu_t Radio::common_menu[] = {
Wayne Roberts 1:0817a150122b 1464 { {FIRST_CHIP_MENU_ROW, 1}, NULL, &paSelect_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1465 { {FIRST_CHIP_MENU_ROW, 10}, "ocp mA:", &ocp_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1466 { {0, 0}, NULL, NULL }
Wayne Roberts 1:0817a150122b 1467 };
Wayne Roberts 1:0817a150122b 1468
Wayne Roberts 1:0817a150122b 1469 const char* const ook_peak_steps[] = {
Wayne Roberts 1:0817a150122b 1470 "0.5", // 0
Wayne Roberts 1:0817a150122b 1471 "1.0", // 1
Wayne Roberts 1:0817a150122b 1472 "1.5", // 2
Wayne Roberts 1:0817a150122b 1473 "2.0", // 3
Wayne Roberts 1:0817a150122b 1474 "3.0", // 4
Wayne Roberts 1:0817a150122b 1475 "4.0", // 5
Wayne Roberts 1:0817a150122b 1476 "5.0", // 6
Wayne Roberts 1:0817a150122b 1477 "6.0", // 7
Wayne Roberts 1:0817a150122b 1478 NULL
Wayne Roberts 1:0817a150122b 1479 };
Wayne Roberts 1:0817a150122b 1480
Wayne Roberts 1:0817a150122b 1481 unsigned Radio::ook_peak_step_read(bool fw)
Wayne Roberts 1:0817a150122b 1482 {
Wayne Roberts 1:0817a150122b 1483 fsk.RegOokPeak.octet = radio.read_reg(REG_FSK_OOKPEAK);
Wayne Roberts 1:0817a150122b 1484 return fsk.RegOokPeak.bits.OokPeakThreshStep;
Wayne Roberts 1:0817a150122b 1485 }
Wayne Roberts 1:0817a150122b 1486
Wayne Roberts 1:0817a150122b 1487 menuMode_e Radio::ook_peak_step_write(unsigned sidx)
Wayne Roberts 1:0817a150122b 1488 {
Wayne Roberts 1:0817a150122b 1489 fsk.RegOokPeak.bits.OokPeakThreshStep = sidx;
Wayne Roberts 1:0817a150122b 1490 radio.write_reg(REG_FSK_OOKPEAK, fsk.RegOokPeak.octet);
Wayne Roberts 1:0817a150122b 1491 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 1492 }
Wayne Roberts 1:0817a150122b 1493
Wayne Roberts 1:0817a150122b 1494 const dropdown_item_t Radio::ook_peak_step_item = { _ITEM_DROPDOWN, ook_peak_steps, ook_peak_steps, ook_peak_step_read, ook_peak_step_write};
Wayne Roberts 1:0817a150122b 1495
Wayne Roberts 1:0817a150122b 1496 const char* const ook_peak_decs[] = {
Wayne Roberts 1:0817a150122b 1497 "once per chip ", // 0
Wayne Roberts 1:0817a150122b 1498 "once every 2 chips ", // 1
Wayne Roberts 1:0817a150122b 1499 "once every 4 chips ", // 2
Wayne Roberts 1:0817a150122b 1500 "once every 8 chips ", // 3
Wayne Roberts 1:0817a150122b 1501 "twice in each chip ", // 4
Wayne Roberts 1:0817a150122b 1502 "4 times in each chip ", // 5
Wayne Roberts 1:0817a150122b 1503 "8 times in each chip ", // 6
Wayne Roberts 1:0817a150122b 1504 "16 times in each chip", // 7
Wayne Roberts 1:0817a150122b 1505 NULL
Wayne Roberts 1:0817a150122b 1506 };
Wayne Roberts 1:0817a150122b 1507
Wayne Roberts 1:0817a150122b 1508 unsigned Radio::ook_peak_dec_read(bool fw)
Wayne Roberts 1:0817a150122b 1509 {
Wayne Roberts 1:0817a150122b 1510 RegOokAvg_t RegOokAvg;
Wayne Roberts 1:0817a150122b 1511 RegOokAvg.octet = radio.read_reg(REG_FSK_OOKAVG);
Wayne Roberts 1:0817a150122b 1512 return RegOokAvg.bits.OokPeakThreshDec;
Wayne Roberts 1:0817a150122b 1513 }
Wayne Roberts 1:0817a150122b 1514
Wayne Roberts 1:0817a150122b 1515 menuMode_e Radio::ook_peak_dec_write(unsigned sidx)
Wayne Roberts 1:0817a150122b 1516 {
Wayne Roberts 1:0817a150122b 1517 RegOokAvg_t RegOokAvg;
Wayne Roberts 1:0817a150122b 1518 RegOokAvg.octet = radio.read_reg(REG_FSK_OOKAVG);
Wayne Roberts 1:0817a150122b 1519 RegOokAvg.bits.OokPeakThreshDec = sidx;
Wayne Roberts 1:0817a150122b 1520 radio.write_reg(REG_FSK_OOKAVG, RegOokAvg.octet);
Wayne Roberts 1:0817a150122b 1521 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 1522 }
Wayne Roberts 1:0817a150122b 1523
Wayne Roberts 1:0817a150122b 1524 const dropdown_item_t Radio::ook_peak_dec_item = { _ITEM_DROPDOWN, ook_peak_decs, ook_peak_decs, ook_peak_dec_read, ook_peak_dec_write};
Wayne Roberts 1:0817a150122b 1525
Wayne Roberts 1:0817a150122b 1526 void Radio::ookFixedThresh_print()
Wayne Roberts 1:0817a150122b 1527 {
Wayne Roberts 1:0817a150122b 1528 pc.printf("%u", radio.read_reg(REG_FSK_OOKFIX));
Wayne Roberts 1:0817a150122b 1529 }
Wayne Roberts 1:0817a150122b 1530
Wayne Roberts 1:0817a150122b 1531 bool Radio::ookFixedThresh_write(const char* txt)
Wayne Roberts 1:0817a150122b 1532 {
Wayne Roberts 1:0817a150122b 1533 unsigned n;
Wayne Roberts 1:0817a150122b 1534 sscanf(txt, "%u", &n);
Wayne Roberts 1:0817a150122b 1535 radio.write_reg(REG_FSK_OOKFIX, n);
Wayne Roberts 1:0817a150122b 1536 return false;
Wayne Roberts 1:0817a150122b 1537 }
Wayne Roberts 1:0817a150122b 1538
Wayne Roberts 1:0817a150122b 1539 const value_item_t Radio::ookFixedThresh_item = { _ITEM_VALUE, 3, ookFixedThresh_print, ookFixedThresh_write};
Wayne Roberts 1:0817a150122b 1540
Wayne Roberts 1:0817a150122b 1541 const char* const ook_avgOffsets[] = {
Wayne Roberts 1:0817a150122b 1542 "0.0dB", // 0
Wayne Roberts 1:0817a150122b 1543 "2.0dB", // 1
Wayne Roberts 1:0817a150122b 1544 "4.0dB", // 2
Wayne Roberts 1:0817a150122b 1545 "6.0dB", // 3
Wayne Roberts 1:0817a150122b 1546 NULL
Wayne Roberts 1:0817a150122b 1547 };
Wayne Roberts 1:0817a150122b 1548
Wayne Roberts 1:0817a150122b 1549 unsigned Radio::ook_avgOffset_read(bool fw)
Wayne Roberts 1:0817a150122b 1550 {
Wayne Roberts 1:0817a150122b 1551 RegOokAvg_t RegOokAvg;
Wayne Roberts 1:0817a150122b 1552 RegOokAvg.octet = radio.read_reg(REG_FSK_OOKAVG);
Wayne Roberts 1:0817a150122b 1553 return RegOokAvg.bits.OokAverageOffset;
Wayne Roberts 1:0817a150122b 1554 }
Wayne Roberts 1:0817a150122b 1555
Wayne Roberts 1:0817a150122b 1556 menuMode_e Radio::ook_avgOffset_write(unsigned sidx)
Wayne Roberts 1:0817a150122b 1557 {
Wayne Roberts 1:0817a150122b 1558 RegOokAvg_t RegOokAvg;
Wayne Roberts 1:0817a150122b 1559 RegOokAvg.octet = radio.read_reg(REG_FSK_OOKAVG);
Wayne Roberts 1:0817a150122b 1560 RegOokAvg.bits.OokAverageOffset = sidx;
Wayne Roberts 1:0817a150122b 1561 radio.write_reg(REG_FSK_OOKAVG, RegOokAvg.octet);
Wayne Roberts 1:0817a150122b 1562 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 1563 }
Wayne Roberts 1:0817a150122b 1564
Wayne Roberts 1:0817a150122b 1565 const dropdown_item_t Radio::ook_avgOffset_item = { _ITEM_DROPDOWN, ook_avgOffsets, ook_avgOffsets, ook_avgOffset_read, ook_avgOffset_write};
Wayne Roberts 1:0817a150122b 1566
Wayne Roberts 1:0817a150122b 1567 const char* const ook_avgFilters[] = {
Wayne Roberts 1:0817a150122b 1568 "chip rate / 32.π", // 0
Wayne Roberts 1:0817a150122b 1569 "chip rate / 8.π ", // 1
Wayne Roberts 1:0817a150122b 1570 "chip rate / 4.π ", // 2
Wayne Roberts 1:0817a150122b 1571 "chip rate / 2.π ", // 3
Wayne Roberts 1:0817a150122b 1572 NULL
Wayne Roberts 1:0817a150122b 1573 };
Wayne Roberts 1:0817a150122b 1574
Wayne Roberts 1:0817a150122b 1575 unsigned Radio::ook_avgFilter_read(bool fw)
Wayne Roberts 1:0817a150122b 1576 {
Wayne Roberts 1:0817a150122b 1577 RegOokAvg_t RegOokAvg;
Wayne Roberts 1:0817a150122b 1578 RegOokAvg.octet = radio.read_reg(REG_FSK_OOKAVG);
Wayne Roberts 1:0817a150122b 1579 return RegOokAvg.bits.OokAverageThreshFilt;
Wayne Roberts 1:0817a150122b 1580 }
Wayne Roberts 1:0817a150122b 1581
Wayne Roberts 1:0817a150122b 1582 menuMode_e Radio::ook_avgFilter_write(unsigned sidx)
Wayne Roberts 1:0817a150122b 1583 {
Wayne Roberts 1:0817a150122b 1584 RegOokAvg_t RegOokAvg;
Wayne Roberts 1:0817a150122b 1585 RegOokAvg.octet = radio.read_reg(REG_FSK_OOKAVG);
Wayne Roberts 1:0817a150122b 1586 RegOokAvg.bits.OokAverageThreshFilt = sidx;
Wayne Roberts 1:0817a150122b 1587 radio.write_reg(REG_FSK_OOKAVG, RegOokAvg.octet);
Wayne Roberts 1:0817a150122b 1588 return MENUMODE_REDRAW;
Wayne Roberts 1:0817a150122b 1589 }
Wayne Roberts 1:0817a150122b 1590
Wayne Roberts 1:0817a150122b 1591 const dropdown_item_t Radio::ook_avgFilter_item = { _ITEM_DROPDOWN, ook_avgFilters, ook_avgFilters, ook_avgFilter_read, ook_avgFilter_write};
Wayne Roberts 1:0817a150122b 1592
Wayne Roberts 1:0817a150122b 1593 const char* const ookthreshs[] = {
Wayne Roberts 1:0817a150122b 1594 "fixed ", // 0
Wayne Roberts 1:0817a150122b 1595 "peak ", // 1
Wayne Roberts 1:0817a150122b 1596 "average", // 2
Wayne Roberts 1:0817a150122b 1597 NULL
Wayne Roberts 1:0817a150122b 1598 };
Wayne Roberts 1:0817a150122b 1599
Wayne Roberts 1:0817a150122b 1600
Wayne Roberts 1:0817a150122b 1601 unsigned Radio::ookthreshtype_read(bool)
Wayne Roberts 1:0817a150122b 1602 {
Wayne Roberts 1:0817a150122b 1603 fsk.RegOokPeak.octet = radio.read_reg(REG_FSK_OOKPEAK);
Wayne Roberts 1:0817a150122b 1604
Wayne Roberts 1:0817a150122b 1605 return fsk.RegOokPeak.bits.OokThreshType;
Wayne Roberts 1:0817a150122b 1606 }
Wayne Roberts 1:0817a150122b 1607
Wayne Roberts 1:0817a150122b 1608 menuMode_e Radio::ookthreshtype_write(unsigned sidx)
Wayne Roberts 1:0817a150122b 1609 {
Wayne Roberts 1:0817a150122b 1610 fsk.RegOokPeak.bits.OokThreshType = sidx;
Wayne Roberts 1:0817a150122b 1611 radio.write_reg(REG_FSK_OOKPEAK, fsk.RegOokPeak.octet);
Wayne Roberts 1:0817a150122b 1612
Wayne Roberts 1:0817a150122b 1613 return MENUMODE_REINIT_MENU;
Wayne Roberts 1:0817a150122b 1614 }
Wayne Roberts 1:0817a150122b 1615
Wayne Roberts 1:0817a150122b 1616 const dropdown_item_t Radio::ookthreshtype_item = { _ITEM_DROPDOWN, ookthreshs, ookthreshs, ookthreshtype_read, ookthreshtype_write};
Wayne Roberts 1:0817a150122b 1617
Wayne Roberts 1:0817a150122b 1618 const menu_t Radio::ook_menu[] = {
Wayne Roberts 1:0817a150122b 1619 { {FIRST_CHIP_MENU_ROW, 22}, "bps:", &fsk_ook_bitrate_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1620 { {FIRST_CHIP_MENU_ROW, 34}, "Fcutoff=", &ook_bt_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1621 { {FIRST_CHIP_MENU_ROW, 56}, "length:", &fskook_pktfmt_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1622
Wayne Roberts 1:0817a150122b 1623 { {FIRST_CHIP_MENU_ROW+1, 1}, "rxbw:", &rxbw_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1624 { {FIRST_CHIP_MENU_ROW+1, 12}, "afcbw:", &afcbw_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1625 { {FIRST_CHIP_MENU_ROW+1, 25}, "preambleLen:", &pblLen_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1626 { {FIRST_CHIP_MENU_ROW+1, 47}, "RxTrigger:", &rxTrigger_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1627
Wayne Roberts 1:0817a150122b 1628 { {FIRST_CHIP_MENU_ROW+2, 1}, "syncWord:", &syncWord_item, FLAG_MSGTYPE_ALL, &syncSize_item},
Wayne Roberts 1:0817a150122b 1629 { {FIRST_CHIP_MENU_ROW+2, 27}, "syncSize:", &syncSize_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1630 { {FIRST_CHIP_MENU_ROW+2, 39}, NULL, &syncOn_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1631 { {FIRST_CHIP_MENU_ROW+2, 47}, "DataMode:", &dataMode_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1632 { {FIRST_CHIP_MENU_ROW+2, 69}, NULL, &bitSyncOn_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1633
Wayne Roberts 1:0817a150122b 1634 { {FIRST_CHIP_MENU_ROW+3, 1}, NULL, &pdLabel_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1635 { {FIRST_CHIP_MENU_ROW+3, 18}, NULL, &pdOn_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1636 { {FIRST_CHIP_MENU_ROW+3, 23}, "size:", &pdSize_item , FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1637 { {FIRST_CHIP_MENU_ROW+3, 36}, "tol:", &pdTol_item , FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1638 { {FIRST_CHIP_MENU_ROW+3, 48}, "rssiThresh:", &rssiThresh_item , FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1639
Wayne Roberts 1:0817a150122b 1640 { {FIRST_CHIP_MENU_ROW+4, 1}, "TxStartCondition:", &TxStartCondition_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1641 { {FIRST_CHIP_MENU_ROW+4, 32}, "FifoThreshold:", &FifoThreshold_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1642 { {FIRST_CHIP_MENU_ROW+4, 50}, "dcFree:", &dcFree_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1643 { {FIRST_CHIP_MENU_ROW+4, 68}, NULL, &fskook_crcon_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1644
Wayne Roberts 1:0817a150122b 1645 { {FIRST_CHIP_MENU_ROW+5, 1}, NULL, &ookLabel_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1646 { {FIRST_CHIP_MENU_ROW+5, 5}, "threshType:", &ookthreshtype_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1647
Wayne Roberts 1:0817a150122b 1648 { {0, 0}, NULL, NULL }
Wayne Roberts 1:0817a150122b 1649 };
Wayne Roberts 1:0817a150122b 1650
Wayne Roberts 1:0817a150122b 1651 const menu_t Radio::ook_fixed_menu[] = {
Wayne Roberts 1:0817a150122b 1652 { {FIRST_CHIP_MENU_ROW+5, 25}, "threshold:", &ookFixedThresh_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1653 { {0, 0}, NULL, NULL }
Wayne Roberts 1:0817a150122b 1654 };
Wayne Roberts 1:0817a150122b 1655
Wayne Roberts 1:0817a150122b 1656 const menu_t Radio::ook_peak_menu[] = {
Wayne Roberts 1:0817a150122b 1657 { {FIRST_CHIP_MENU_ROW+5, 25}, "step:", &ook_peak_step_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1658 { {FIRST_CHIP_MENU_ROW+5, 40}, "dec:", &ook_peak_dec_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1659 { {0, 0}, NULL, NULL }
Wayne Roberts 1:0817a150122b 1660 };
Wayne Roberts 1:0817a150122b 1661
Wayne Roberts 1:0817a150122b 1662 const menu_t Radio::ook_average_menu[] = {
Wayne Roberts 1:0817a150122b 1663 { {FIRST_CHIP_MENU_ROW+5, 25}, "offset:", &ook_avgOffset_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1664 { {FIRST_CHIP_MENU_ROW+5, 45}, "filter:", &ook_avgFilter_item, FLAG_MSGTYPE_ALL },
Wayne Roberts 1:0817a150122b 1665 { {0, 0}, NULL, NULL }
Wayne Roberts 1:0817a150122b 1666 };
Wayne Roberts 1:0817a150122b 1667
Wayne Roberts 1:0817a150122b 1668 void Radio::boardInit(const RadioEvents_t* e)
Wayne Roberts 1:0817a150122b 1669 {
Wayne Roberts 1:0817a150122b 1670 targetInit();
Wayne Roberts 1:0817a150122b 1671
Wayne Roberts 1:0817a150122b 1672 RadioEvents = e;
Wayne Roberts 1:0817a150122b 1673
Wayne Roberts 1:0817a150122b 1674 RegPaRamp.octet = radio.read_reg(REG_PARAMP);
Wayne Roberts 1:0817a150122b 1675
Wayne Roberts 1:0817a150122b 1676 if (radio.type == SX1276) {
Wayne Roberts 1:0817a150122b 1677 lora_bw_item.printed_strs = lora_bws_1276;
Wayne Roberts 1:0817a150122b 1678 lora_bw_item.selectable_strs = lora_bws_1276;
Wayne Roberts 1:0817a150122b 1679 } else if (radio.type == SX1272) {
Wayne Roberts 1:0817a150122b 1680 lora_bw_item.printed_strs = lora_bws_1272;
Wayne Roberts 1:0817a150122b 1681 lora_bw_item.selectable_strs = lora_bws_1272;
Wayne Roberts 1:0817a150122b 1682 }
Wayne Roberts 1:0817a150122b 1683
Wayne Roberts 1:0817a150122b 1684 lpt.start();
Wayne Roberts 1:0817a150122b 1685 }
Wayne Roberts 1:0817a150122b 1686
Wayne Roberts 1:0817a150122b 1687 void Radio::test() { }
Wayne Roberts 1:0817a150122b 1688
Wayne Roberts 1:0817a150122b 1689 #endif /* ..SX127x_H */
Wayne Roberts 1:0817a150122b 1690