NAMote72 Utility Application – Serial Terminal Monitor control for NAMote72 (note: this application replaces the previous na_mote1 test code application)

Dependencies:   SX127x lib_gps lib_mma8451q lib_mpl3115a2 lib_sx9500 mbed

Fork of na_mote1 by wayne roberts

See wiki Page for a detailed

This is a link to the wiki page

Committer:
Wayne Roberts
Date:
Tue May 29 14:03:22 2018 -0700
Revision:
17:f73dbeca8736
Parent:
15:cdc215392e60
update to latest libraries

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dudmuck 0:9c2b09ecb20f 1 #include "sx127x_lora.h"
dudmuck 0:9c2b09ecb20f 2 #include "sx127x_fsk.h"
dudmuck 0:9c2b09ecb20f 3
dudmuck 1:b13a15a34c3f 4 #include "mma8451q.h"
dudmuck 1:b13a15a34c3f 5 #include "mpl3115a2.h"
dudmuck 1:b13a15a34c3f 6 #include "sx9500.h"
dudmuck 3:8924027a8933 7 #include "gps.h"
Wayne Roberts 17:f73dbeca8736 8 #include <inttypes.h>
dudmuck 8:e3da1dc7b628 9
dudmuck 6:8defa260bc10 10 #define RADIO_RESET PC_2 //NorAm_Mote Reset_sx
dudmuck 6:8defa260bc10 11 #define RADIO_MOSI PB_15 //NorAm_Mote SPI2 Mosi
dudmuck 6:8defa260bc10 12 #define RADIO_MISO PB_14 //NorAm_Mote SPI2 Miso
dudmuck 6:8defa260bc10 13 #define RADIO_SCLK PB_13 //NorAm_Mote SPI2 Clk
dudmuck 6:8defa260bc10 14 #define RADIO_NSS PB_12 //NorAm_Mote SPI2 Nss
dudmuck 6:8defa260bc10 15
dudmuck 6:8defa260bc10 16 #define RADIO_DIO_0 PC_6 //NorAm_Mote DIO0
dudmuck 6:8defa260bc10 17 #define RADIO_DIO_1 PC_10 //NorAm_Mote DIO1
dudmuck 6:8defa260bc10 18 #define RADIO_DIO_2 PC_8 //NorAm_Mote DIO2
dudmuck 6:8defa260bc10 19 #define RADIO_DIO_3 PB_4 //NorAm_Mote DIO3
dudmuck 6:8defa260bc10 20 #define RADIO_DIO_4 PB_5 //NorAm_Mote DIO4
dudmuck 6:8defa260bc10 21 #define RADIO_DIO_5 PB_6 //NorAm_Mote DIO5
dudmuck 6:8defa260bc10 22
dudmuck 6:8defa260bc10 23 #define RFSW1 PC_4 //NorAm_Mote RFSwitch_CNTR_1
dudmuck 6:8defa260bc10 24 #define RFSW2 PC_13 //NorAm_Mote RFSwitch_CNTR_2
dudmuck 6:8defa260bc10 25
dudmuck 15:cdc215392e60 26 #define FSK_RSSI_OFFSET 5
dudmuck 15:cdc215392e60 27 #define FSK_RSSI_SMOOTHING 2
dudmuck 1:b13a15a34c3f 28 /*
dudmuck 1:b13a15a34c3f 29 *
dudmuck 1:b13a15a34c3f 30 */
dudmuck 0:9c2b09ecb20f 31 Serial pc(USBTX, USBRX);
dudmuck 2:fb41d1c4b299 32 #ifdef I2C_PIN_TEST
dudmuck 2:fb41d1c4b299 33 DigitalInOut pb8(PB_8);
dudmuck 2:fb41d1c4b299 34 DigitalInOut pb9(PB_9);
dudmuck 2:fb41d1c4b299 35 #else
dudmuck 2:fb41d1c4b299 36 I2C i2c(I2C_SDA, I2C_SCL);
dudmuck 6:8defa260bc10 37 DigitalIn i2c_int_pin(RADIO_DIO_3);
dudmuck 6:8defa260bc10 38 MMA8451Q mma8451q(i2c, i2c_int_pin);
dudmuck 6:8defa260bc10 39 MPL3115A2 mpl3115a2(i2c, i2c_int_pin);
dudmuck 6:8defa260bc10 40 SX9500 sx9500(i2c, PA_9, PA_10);
dudmuck 2:fb41d1c4b299 41 #endif /* I2C_PIN_TeST */
dudmuck 2:fb41d1c4b299 42
dudmuck 6:8defa260bc10 43 /* gps(tx, rx, en); */
dudmuck 6:8defa260bc10 44 GPS gps(PB_6, PB_7, PB_11);
dudmuck 2:fb41d1c4b299 45 DigitalOut pd2(PD_2);
dudmuck 12:6afe8fed5385 46
dudmuck 14:35e7156e73ff 47 AnalogIn* ain_bat;
dudmuck 13:a22debeee855 48 #define AIN_VREF 3.3 // stm32 internal refernce
dudmuck 13:a22debeee855 49 #define AIN_VBAT_DIV 2 // resistor divider
dudmuck 13:a22debeee855 50
dudmuck 12:6afe8fed5385 51 typedef enum {
dudmuck 12:6afe8fed5385 52 MOTE_NONE = 0,
dudmuck 12:6afe8fed5385 53 MOTE_V2,
dudmuck 12:6afe8fed5385 54 MOTE_V3
dudmuck 12:6afe8fed5385 55 } mote_version_e;
dudmuck 12:6afe8fed5385 56
dudmuck 12:6afe8fed5385 57 mote_version_e mote_version = MOTE_NONE;
dudmuck 12:6afe8fed5385 58 DigitalOut pc_7(PC_7);
dudmuck 13:a22debeee855 59
dudmuck 12:6afe8fed5385 60 DigitalIn pc_1(PC_1);
dudmuck 5:329557e0625c 61 DigitalOut hdr_fem_csd(PC_0);
dudmuck 2:fb41d1c4b299 62
dudmuck 2:fb41d1c4b299 63 DigitalOut red_led(PB_1);
dudmuck 13:a22debeee855 64 DigitalOut led2(PC_3); // green
dudmuck 13:a22debeee855 65 DigitalOut yellow_led(PB_10);
dudmuck 2:fb41d1c4b299 66 #define LED_ON 0
dudmuck 2:fb41d1c4b299 67 #define LED_OFF 1
dudmuck 2:fb41d1c4b299 68
dudmuck 3:8924027a8933 69 Timeout hop_timeout;
dudmuck 3:8924027a8933 70
dudmuck 2:fb41d1c4b299 71 InterruptIn dio3(PC_8);
dudmuck 2:fb41d1c4b299 72 bool clear_valid_header;
dudmuck 2:fb41d1c4b299 73
dudmuck 13:a22debeee855 74 #ifdef FCC_TEST
dudmuck 3:8924027a8933 75 typedef enum {
dudmuck 3:8924027a8933 76 HOP_TYPE_NONE = 0,
dudmuck 3:8924027a8933 77 HOP_TYPE_64CH,
dudmuck 3:8924027a8933 78 HOP_TYPE_4CH
dudmuck 3:8924027a8933 79 } hop_type_e;
dudmuck 3:8924027a8933 80 hop_type_e hop_type;
dudmuck 3:8924027a8933 81 float hop_base_MHz = 902.3;
dudmuck 3:8924027a8933 82 float hop_step_MHz = 0.2;
dudmuck 13:a22debeee855 83 #endif /* #ifdef FCC_TEST */
dudmuck 3:8924027a8933 84
dudmuck 5:329557e0625c 85 bool abort_key;
dudmuck 2:fb41d1c4b299 86 bool per_en;
Wayne Roberts 17:f73dbeca8736 87 uint32_t PacketRxSequencePrev;
dudmuck 2:fb41d1c4b299 88 uint32_t PacketPerKoCnt;
dudmuck 2:fb41d1c4b299 89 uint32_t PacketPerOkCnt;
dudmuck 2:fb41d1c4b299 90 uint32_t PacketNormalCnt;
dudmuck 2:fb41d1c4b299 91 Timeout per_timeout;
dudmuck 2:fb41d1c4b299 92 float per_tx_delay = 0.1;
dudmuck 2:fb41d1c4b299 93 int per_id;
dudmuck 2:fb41d1c4b299 94 uint32_t PacketTxCnt;
dudmuck 0:9c2b09ecb20f 95
dudmuck 0:9c2b09ecb20f 96 uint8_t tx_cnt;
dudmuck 0:9c2b09ecb20f 97 char pcbuf[64];
dudmuck 6:8defa260bc10 98 bool rx_after_tx;
dudmuck 0:9c2b09ecb20f 99
dudmuck 0:9c2b09ecb20f 100 typedef enum {
dudmuck 0:9c2b09ecb20f 101 APP_NONE = 0,
dudmuck 0:9c2b09ecb20f 102 APP_CHAT
dudmuck 0:9c2b09ecb20f 103 } app_e;
dudmuck 0:9c2b09ecb20f 104
dudmuck 0:9c2b09ecb20f 105 app_e app = APP_NONE;
dudmuck 0:9c2b09ecb20f 106
dudmuck 10:a3e2c558c003 107 char service_en = 1;
dudmuck 10:a3e2c558c003 108
dudmuck 0:9c2b09ecb20f 109 #define FSK_LARGE_PKT_THRESHOLD 0x3f
dudmuck 0:9c2b09ecb20f 110
dudmuck 0:9c2b09ecb20f 111 /******************************************************************************/
dudmuck 0:9c2b09ecb20f 112
Wayne Roberts 17:f73dbeca8736 113 SPI spi(RADIO_MOSI, RADIO_MISO, RADIO_SCLK);
Wayne Roberts 17:f73dbeca8736 114 // dio0, dio1, nss, spi, rst
Wayne Roberts 17:f73dbeca8736 115 SX127x radio(RADIO_DIO_0, RADIO_DIO_1, RADIO_NSS, spi, RADIO_RESET);
dudmuck 0:9c2b09ecb20f 116
dudmuck 0:9c2b09ecb20f 117 SX127x_fsk fsk(radio);
dudmuck 0:9c2b09ecb20f 118 SX127x_lora lora(radio);
dudmuck 0:9c2b09ecb20f 119
dudmuck 4:1efa46cff1b3 120 DigitalOut rfsw1(RFSW1);
dudmuck 4:1efa46cff1b3 121 DigitalOut rfsw2(RFSW2);
dudmuck 15:cdc215392e60 122 DigitalIn dio2(RADIO_DIO_2);
dudmuck 6:8defa260bc10 123
dudmuck 4:1efa46cff1b3 124 void rfsw_callback()
dudmuck 4:1efa46cff1b3 125 {
dudmuck 4:1efa46cff1b3 126 if (radio.RegOpMode.bits.Mode == RF_OPMODE_TRANSMITTER) { // start of transmission
dudmuck 4:1efa46cff1b3 127 if (radio.HF) {
dudmuck 4:1efa46cff1b3 128 if (radio.RegPaConfig.bits.PaSelect) { // if PA_BOOST
dudmuck 4:1efa46cff1b3 129 rfsw2 = 0;
dudmuck 4:1efa46cff1b3 130 rfsw1 = 1;
dudmuck 4:1efa46cff1b3 131 } else { // RFO to power amp
dudmuck 4:1efa46cff1b3 132 rfsw2 = 1;
dudmuck 4:1efa46cff1b3 133 rfsw1 = 0;
dudmuck 4:1efa46cff1b3 134 }
dudmuck 4:1efa46cff1b3 135 } else {
dudmuck 4:1efa46cff1b3 136 // todo: sx1276
dudmuck 4:1efa46cff1b3 137 }
dudmuck 13:a22debeee855 138 //hdr_fem_csd = 1; //debug
dudmuck 4:1efa46cff1b3 139 } else if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER || radio.RegOpMode.bits.Mode == RF_OPMODE_CAD) { // start of reception
dudmuck 4:1efa46cff1b3 140 if (radio.HF) {
dudmuck 4:1efa46cff1b3 141 rfsw2 = 1;
dudmuck 4:1efa46cff1b3 142 rfsw1 = 1;
dudmuck 4:1efa46cff1b3 143 } else {
dudmuck 4:1efa46cff1b3 144 // todo: sx1276
dudmuck 4:1efa46cff1b3 145 }
dudmuck 13:a22debeee855 146 //hdr_fem_csd = 0; //debug
dudmuck 4:1efa46cff1b3 147 } else { // RF switch shutdown
dudmuck 4:1efa46cff1b3 148 rfsw2 = 0;
dudmuck 5:329557e0625c 149 rfsw1 = 0;
dudmuck 13:a22debeee855 150 //hdr_fem_csd = 0; //debug
dudmuck 4:1efa46cff1b3 151 }
dudmuck 4:1efa46cff1b3 152 }
dudmuck 4:1efa46cff1b3 153
dudmuck 0:9c2b09ecb20f 154 void printLoraIrqs_(bool clear)
dudmuck 0:9c2b09ecb20f 155 {
dudmuck 0:9c2b09ecb20f 156 //in radio class -- RegIrqFlags_t RegIrqFlags;
dudmuck 0:9c2b09ecb20f 157
dudmuck 0:9c2b09ecb20f 158 //already read RegIrqFlags.octet = radio.read_reg(REG_LR_IRQFLAGS);
dudmuck 0:9c2b09ecb20f 159 printf("\r\nIrqFlags:");
dudmuck 0:9c2b09ecb20f 160 if (lora.RegIrqFlags.bits.CadDetected)
dudmuck 0:9c2b09ecb20f 161 printf("CadDetected ");
dudmuck 0:9c2b09ecb20f 162 if (lora.RegIrqFlags.bits.FhssChangeChannel) {
dudmuck 0:9c2b09ecb20f 163 //radio.RegHopChannel.octet = radio.read_reg(REG_LR_HOPCHANNEL);
dudmuck 0:9c2b09ecb20f 164 printf("FhssChangeChannel:%d ", lora.RegHopChannel.bits.FhssPresentChannel);
dudmuck 0:9c2b09ecb20f 165 }
dudmuck 0:9c2b09ecb20f 166 if (lora.RegIrqFlags.bits.CadDone)
dudmuck 0:9c2b09ecb20f 167 printf("CadDone ");
dudmuck 0:9c2b09ecb20f 168 if (lora.RegIrqFlags.bits.TxDone)
dudmuck 0:9c2b09ecb20f 169 printf("TxDone ");
dudmuck 0:9c2b09ecb20f 170 if (lora.RegIrqFlags.bits.ValidHeader)
dudmuck 0:9c2b09ecb20f 171 printf("ValidHeader ");
dudmuck 0:9c2b09ecb20f 172 if (lora.RegIrqFlags.bits.PayloadCrcError)
dudmuck 0:9c2b09ecb20f 173 printf("PayloadCrcError ");
dudmuck 0:9c2b09ecb20f 174 if (lora.RegIrqFlags.bits.RxDone)
dudmuck 0:9c2b09ecb20f 175 printf("RxDone ");
dudmuck 0:9c2b09ecb20f 176 if (lora.RegIrqFlags.bits.RxTimeout)
dudmuck 0:9c2b09ecb20f 177 printf("RxTimeout ");
dudmuck 0:9c2b09ecb20f 178
dudmuck 0:9c2b09ecb20f 179 printf("\r\n");
dudmuck 0:9c2b09ecb20f 180
dudmuck 0:9c2b09ecb20f 181 if (clear)
dudmuck 0:9c2b09ecb20f 182 radio.write_reg(REG_LR_IRQFLAGS, lora.RegIrqFlags.octet);
dudmuck 0:9c2b09ecb20f 183
dudmuck 0:9c2b09ecb20f 184 }
dudmuck 0:9c2b09ecb20f 185
dudmuck 0:9c2b09ecb20f 186 void lora_printCodingRate(bool from_rx)
dudmuck 0:9c2b09ecb20f 187 {
dudmuck 0:9c2b09ecb20f 188 uint8_t d = lora.getCodingRate(from_rx);
dudmuck 0:9c2b09ecb20f 189 printf("CodingRate:");
dudmuck 0:9c2b09ecb20f 190 switch (d) {
dudmuck 0:9c2b09ecb20f 191 case 1: printf("4/5 "); break;
dudmuck 0:9c2b09ecb20f 192 case 2: printf("4/6 "); break;
dudmuck 0:9c2b09ecb20f 193 case 3: printf("4/7 "); break;
dudmuck 0:9c2b09ecb20f 194 case 4: printf("4/8 "); break;
dudmuck 0:9c2b09ecb20f 195 default:
dudmuck 0:9c2b09ecb20f 196 printf("%d ", d);
dudmuck 0:9c2b09ecb20f 197 break;
dudmuck 0:9c2b09ecb20f 198 }
dudmuck 0:9c2b09ecb20f 199 }
dudmuck 0:9c2b09ecb20f 200
dudmuck 0:9c2b09ecb20f 201 void lora_printHeaderMode()
dudmuck 0:9c2b09ecb20f 202 {
dudmuck 0:9c2b09ecb20f 203 if (lora.getHeaderMode())
dudmuck 0:9c2b09ecb20f 204 printf("implicit ");
dudmuck 0:9c2b09ecb20f 205 else
dudmuck 0:9c2b09ecb20f 206 printf("explicit ");
dudmuck 0:9c2b09ecb20f 207 }
dudmuck 0:9c2b09ecb20f 208
dudmuck 0:9c2b09ecb20f 209 void lora_printBw()
dudmuck 0:9c2b09ecb20f 210 {
dudmuck 0:9c2b09ecb20f 211 uint8_t bw = lora.getBw();
dudmuck 0:9c2b09ecb20f 212
dudmuck 0:9c2b09ecb20f 213 printf("Bw:");
dudmuck 0:9c2b09ecb20f 214 if (radio.type == SX1276) {
Wayne Roberts 17:f73dbeca8736 215 switch (bw) {
dudmuck 0:9c2b09ecb20f 216 case 0: printf("7.8KHz "); break;
dudmuck 0:9c2b09ecb20f 217 case 1: printf("10.4KHz "); break;
dudmuck 0:9c2b09ecb20f 218 case 2: printf("15.6KHz "); break;
dudmuck 0:9c2b09ecb20f 219 case 3: printf("20.8KHz "); break;
dudmuck 0:9c2b09ecb20f 220 case 4: printf("31.25KHz "); break;
dudmuck 0:9c2b09ecb20f 221 case 5: printf("41.7KHz "); break;
dudmuck 0:9c2b09ecb20f 222 case 6: printf("62.5KHz "); break;
dudmuck 0:9c2b09ecb20f 223 case 7: printf("125KHz "); break;
dudmuck 0:9c2b09ecb20f 224 case 8: printf("250KHz "); break;
dudmuck 0:9c2b09ecb20f 225 case 9: printf("500KHz "); break;
dudmuck 0:9c2b09ecb20f 226 default: printf("%x ", lora.RegModemConfig.sx1276bits.Bw); break;
dudmuck 0:9c2b09ecb20f 227 }
dudmuck 0:9c2b09ecb20f 228 } else if (radio.type == SX1272) {
Wayne Roberts 17:f73dbeca8736 229 switch (bw) {
dudmuck 0:9c2b09ecb20f 230 case 0: printf("125KHz "); break;
dudmuck 0:9c2b09ecb20f 231 case 1: printf("250KHz "); break;
dudmuck 0:9c2b09ecb20f 232 case 2: printf("500KHz "); break;
dudmuck 0:9c2b09ecb20f 233 case 3: printf("11b "); break;
dudmuck 0:9c2b09ecb20f 234 }
dudmuck 0:9c2b09ecb20f 235 }
dudmuck 0:9c2b09ecb20f 236 }
dudmuck 0:9c2b09ecb20f 237
dudmuck 0:9c2b09ecb20f 238 void lora_printAllBw()
dudmuck 0:9c2b09ecb20f 239 {
dudmuck 0:9c2b09ecb20f 240 int i, s;
dudmuck 0:9c2b09ecb20f 241
dudmuck 0:9c2b09ecb20f 242 if (radio.type == SX1276) {
dudmuck 0:9c2b09ecb20f 243 s = lora.RegModemConfig.sx1276bits.Bw;
dudmuck 0:9c2b09ecb20f 244 for (i = 0; i < 10; i++ ) {
dudmuck 0:9c2b09ecb20f 245 lora.RegModemConfig.sx1276bits.Bw = i;
dudmuck 0:9c2b09ecb20f 246 printf("%d ", i);
dudmuck 0:9c2b09ecb20f 247 lora_printBw();
dudmuck 0:9c2b09ecb20f 248 printf("\r\n");
dudmuck 0:9c2b09ecb20f 249 }
dudmuck 0:9c2b09ecb20f 250 lora.RegModemConfig.sx1276bits.Bw = s;
dudmuck 0:9c2b09ecb20f 251 } else if (radio.type == SX1272) {
dudmuck 0:9c2b09ecb20f 252 s = lora.RegModemConfig.sx1272bits.Bw;
dudmuck 0:9c2b09ecb20f 253 for (i = 0; i < 3; i++ ) {
dudmuck 0:9c2b09ecb20f 254 lora.RegModemConfig.sx1272bits.Bw = i;
dudmuck 0:9c2b09ecb20f 255 printf("%d ", i);
dudmuck 0:9c2b09ecb20f 256 lora_printBw();
dudmuck 0:9c2b09ecb20f 257 printf("\r\n");
dudmuck 0:9c2b09ecb20f 258 }
dudmuck 0:9c2b09ecb20f 259 lora.RegModemConfig.sx1272bits.Bw = s;
dudmuck 0:9c2b09ecb20f 260 }
dudmuck 0:9c2b09ecb20f 261 }
dudmuck 0:9c2b09ecb20f 262
dudmuck 0:9c2b09ecb20f 263 void lora_printSf()
dudmuck 0:9c2b09ecb20f 264 {
dudmuck 0:9c2b09ecb20f 265 // spreading factor same between sx127[26]
dudmuck 0:9c2b09ecb20f 266 printf("sf:%d ", lora.getSf());
dudmuck 0:9c2b09ecb20f 267 }
dudmuck 0:9c2b09ecb20f 268
dudmuck 0:9c2b09ecb20f 269 void lora_printRxPayloadCrcOn()
dudmuck 0:9c2b09ecb20f 270 {
dudmuck 0:9c2b09ecb20f 271 bool on = lora.getRxPayloadCrcOn();
dudmuck 0:9c2b09ecb20f 272 //printf("RxPayloadCrcOn:%s ", on ? "on" : "off");
dudmuck 0:9c2b09ecb20f 273 if (on)
dudmuck 0:9c2b09ecb20f 274 printf("RxPayloadCrcOn:1 = Tx CRC Enabled\r\n");
dudmuck 0:9c2b09ecb20f 275 else
dudmuck 0:9c2b09ecb20f 276 printf("RxPayloadCrcOn:1 = no Tx CRC\r\n");
dudmuck 0:9c2b09ecb20f 277 }
dudmuck 0:9c2b09ecb20f 278
dudmuck 0:9c2b09ecb20f 279 void lora_printTxContinuousMode()
dudmuck 0:9c2b09ecb20f 280 {
dudmuck 0:9c2b09ecb20f 281 printf("TxContinuousMode:%d ", lora.RegModemConfig2.sx1276bits.TxContinuousMode); // same for sx1272 and sx1276
dudmuck 0:9c2b09ecb20f 282 }
dudmuck 0:9c2b09ecb20f 283
dudmuck 0:9c2b09ecb20f 284 void lora_printAgcAutoOn()
dudmuck 0:9c2b09ecb20f 285 {
dudmuck 0:9c2b09ecb20f 286 printf("AgcAutoOn:%d", lora.getAgcAutoOn());
dudmuck 0:9c2b09ecb20f 287 }
dudmuck 0:9c2b09ecb20f 288
dudmuck 0:9c2b09ecb20f 289 void lora_print_dio()
dudmuck 0:9c2b09ecb20f 290 {
dudmuck 0:9c2b09ecb20f 291 radio.RegDioMapping2.octet = radio.read_reg(REG_DIOMAPPING2);
dudmuck 0:9c2b09ecb20f 292 printf("DIO5:");
dudmuck 0:9c2b09ecb20f 293 switch (radio.RegDioMapping2.bits.Dio5Mapping) {
dudmuck 0:9c2b09ecb20f 294 case 0: printf("ModeReady"); break;
dudmuck 0:9c2b09ecb20f 295 case 1: printf("ClkOut"); break;
dudmuck 0:9c2b09ecb20f 296 case 2: printf("ClkOut"); break;
dudmuck 0:9c2b09ecb20f 297 }
dudmuck 0:9c2b09ecb20f 298 printf(" DIO4:");
dudmuck 0:9c2b09ecb20f 299 switch (radio.RegDioMapping2.bits.Dio4Mapping) {
dudmuck 0:9c2b09ecb20f 300 case 0: printf("CadDetected"); break;
dudmuck 0:9c2b09ecb20f 301 case 1: printf("PllLock"); break;
dudmuck 0:9c2b09ecb20f 302 case 2: printf("PllLock"); break;
dudmuck 0:9c2b09ecb20f 303 }
dudmuck 0:9c2b09ecb20f 304 radio.RegDioMapping1.octet = radio.read_reg(REG_DIOMAPPING1);
dudmuck 0:9c2b09ecb20f 305 printf(" DIO3:");
dudmuck 0:9c2b09ecb20f 306 switch (radio.RegDioMapping1.bits.Dio3Mapping) {
dudmuck 0:9c2b09ecb20f 307 case 0: printf("CadDone"); break;
dudmuck 0:9c2b09ecb20f 308 case 1: printf("ValidHeader"); break;
dudmuck 0:9c2b09ecb20f 309 case 2: printf("PayloadCrcError"); break;
dudmuck 0:9c2b09ecb20f 310 }
dudmuck 0:9c2b09ecb20f 311 printf(" DIO2:");
dudmuck 0:9c2b09ecb20f 312 switch (radio.RegDioMapping1.bits.Dio2Mapping) {
dudmuck 0:9c2b09ecb20f 313 case 0:
dudmuck 0:9c2b09ecb20f 314 case 1:
dudmuck 0:9c2b09ecb20f 315 case 2:
dudmuck 0:9c2b09ecb20f 316 printf("FhssChangeChannel");
dudmuck 0:9c2b09ecb20f 317 break;
dudmuck 0:9c2b09ecb20f 318 }
dudmuck 0:9c2b09ecb20f 319 printf(" DIO1:");
dudmuck 0:9c2b09ecb20f 320 switch (radio.RegDioMapping1.bits.Dio1Mapping) {
dudmuck 0:9c2b09ecb20f 321 case 0: printf("RxTimeout"); break;
dudmuck 0:9c2b09ecb20f 322 case 1: printf("FhssChangeChannel"); break;
dudmuck 0:9c2b09ecb20f 323 case 2: printf("CadDetected"); break;
dudmuck 0:9c2b09ecb20f 324 }
dudmuck 0:9c2b09ecb20f 325 printf(" DIO0:");
dudmuck 0:9c2b09ecb20f 326 switch (radio.RegDioMapping1.bits.Dio0Mapping) {
dudmuck 0:9c2b09ecb20f 327 case 0: printf("RxDone"); break;
dudmuck 0:9c2b09ecb20f 328 case 1: printf("TxDone"); break;
dudmuck 0:9c2b09ecb20f 329 case 2: printf("CadDone"); break;
dudmuck 0:9c2b09ecb20f 330 }
dudmuck 0:9c2b09ecb20f 331
dudmuck 0:9c2b09ecb20f 332 printf("\r\n");
dudmuck 0:9c2b09ecb20f 333 }
dudmuck 0:9c2b09ecb20f 334
dudmuck 0:9c2b09ecb20f 335 void fsk_print_dio()
dudmuck 0:9c2b09ecb20f 336 {
dudmuck 0:9c2b09ecb20f 337 radio.RegDioMapping2.octet = radio.read_reg(REG_DIOMAPPING2);
dudmuck 0:9c2b09ecb20f 338
dudmuck 0:9c2b09ecb20f 339 printf("DIO5:");
dudmuck 0:9c2b09ecb20f 340 switch (radio.RegDioMapping2.bits.Dio5Mapping) {
dudmuck 0:9c2b09ecb20f 341 case 0: printf("ClkOut"); break;
dudmuck 0:9c2b09ecb20f 342 case 1: printf("PllLock"); break;
dudmuck 0:9c2b09ecb20f 343 case 2:
dudmuck 0:9c2b09ecb20f 344 if (fsk.RegPktConfig2.bits.DataModePacket)
dudmuck 0:9c2b09ecb20f 345 printf("data");
dudmuck 0:9c2b09ecb20f 346 else {
dudmuck 0:9c2b09ecb20f 347 if (radio.RegDioMapping2.bits.MapPreambleDetect)
dudmuck 0:9c2b09ecb20f 348 printf("preamble");
dudmuck 0:9c2b09ecb20f 349 else
dudmuck 0:9c2b09ecb20f 350 printf("rssi");
dudmuck 0:9c2b09ecb20f 351 }
dudmuck 0:9c2b09ecb20f 352 break;
dudmuck 0:9c2b09ecb20f 353 case 3: printf("ModeReady"); break;
dudmuck 0:9c2b09ecb20f 354 }
dudmuck 0:9c2b09ecb20f 355
dudmuck 0:9c2b09ecb20f 356 printf(" DIO4:");
dudmuck 0:9c2b09ecb20f 357 switch (radio.RegDioMapping2.bits.Dio4Mapping) {
dudmuck 0:9c2b09ecb20f 358 case 0: printf("temp/eol"); break;
dudmuck 0:9c2b09ecb20f 359 case 1: printf("PllLock"); break;
dudmuck 0:9c2b09ecb20f 360 case 2: printf("TimeOut"); break;
dudmuck 0:9c2b09ecb20f 361 case 3:
dudmuck 0:9c2b09ecb20f 362 if (fsk.RegPktConfig2.bits.DataModePacket) {
dudmuck 0:9c2b09ecb20f 363 if (radio.RegDioMapping2.bits.MapPreambleDetect)
dudmuck 0:9c2b09ecb20f 364 printf("preamble");
dudmuck 0:9c2b09ecb20f 365 else
dudmuck 0:9c2b09ecb20f 366 printf("rssi");
dudmuck 0:9c2b09ecb20f 367 } else
dudmuck 0:9c2b09ecb20f 368 printf("ModeReady");
dudmuck 0:9c2b09ecb20f 369 break;
dudmuck 0:9c2b09ecb20f 370 }
dudmuck 0:9c2b09ecb20f 371
dudmuck 0:9c2b09ecb20f 372 radio.RegDioMapping1.octet = radio.read_reg(REG_DIOMAPPING1);
dudmuck 0:9c2b09ecb20f 373
dudmuck 0:9c2b09ecb20f 374 printf(" DIO3:");
dudmuck 0:9c2b09ecb20f 375 switch (radio.RegDioMapping1.bits.Dio3Mapping) {
dudmuck 0:9c2b09ecb20f 376 case 0: printf("Timeout"); break;
dudmuck 0:9c2b09ecb20f 377 case 1:
dudmuck 0:9c2b09ecb20f 378 if (radio.RegDioMapping2.bits.MapPreambleDetect)
dudmuck 0:9c2b09ecb20f 379 printf("preamble");
dudmuck 0:9c2b09ecb20f 380 else
dudmuck 0:9c2b09ecb20f 381 printf("rssi");
dudmuck 0:9c2b09ecb20f 382 break;
dudmuck 0:9c2b09ecb20f 383 case 2: printf("?automode_status?"); break;
dudmuck 0:9c2b09ecb20f 384 case 3: printf("TempChange/LowBat"); break;
dudmuck 0:9c2b09ecb20f 385 }
dudmuck 0:9c2b09ecb20f 386
dudmuck 0:9c2b09ecb20f 387 printf(" DIO2:");
dudmuck 0:9c2b09ecb20f 388 if (fsk.RegPktConfig2.bits.DataModePacket) {
dudmuck 0:9c2b09ecb20f 389 switch (radio.RegDioMapping1.bits.Dio2Mapping) {
dudmuck 0:9c2b09ecb20f 390 case 0: printf("FifoFull"); break;
dudmuck 0:9c2b09ecb20f 391 case 1: printf("RxReady"); break;
dudmuck 0:9c2b09ecb20f 392 case 2: printf("FifoFull/rx-timeout"); break;
dudmuck 0:9c2b09ecb20f 393 case 3: printf("FifoFull/rx-syncadrs"); break;
dudmuck 0:9c2b09ecb20f 394 }
dudmuck 0:9c2b09ecb20f 395 } else {
dudmuck 0:9c2b09ecb20f 396 printf("Data");
dudmuck 0:9c2b09ecb20f 397 }
dudmuck 0:9c2b09ecb20f 398
dudmuck 0:9c2b09ecb20f 399 printf(" DIO1:");
dudmuck 0:9c2b09ecb20f 400 if (fsk.RegPktConfig2.bits.DataModePacket) {
dudmuck 0:9c2b09ecb20f 401 switch (radio.RegDioMapping1.bits.Dio1Mapping) {
dudmuck 0:9c2b09ecb20f 402 case 0: printf("FifoThresh"); break;
dudmuck 0:9c2b09ecb20f 403 case 1: printf("FifoEmpty"); break;
dudmuck 0:9c2b09ecb20f 404 case 2: printf("FifoFull"); break;
dudmuck 0:9c2b09ecb20f 405 case 3: printf("-3-"); break;
dudmuck 0:9c2b09ecb20f 406 }
dudmuck 0:9c2b09ecb20f 407 } else {
dudmuck 0:9c2b09ecb20f 408 switch (radio.RegDioMapping1.bits.Dio1Mapping) {
dudmuck 0:9c2b09ecb20f 409 case 0: printf("Dclk"); break;
dudmuck 0:9c2b09ecb20f 410 case 1:
dudmuck 0:9c2b09ecb20f 411 if (radio.RegDioMapping2.bits.MapPreambleDetect)
dudmuck 0:9c2b09ecb20f 412 printf("preamble");
dudmuck 0:9c2b09ecb20f 413 else
dudmuck 0:9c2b09ecb20f 414 printf("rssi");
dudmuck 0:9c2b09ecb20f 415 break;
dudmuck 0:9c2b09ecb20f 416 case 2: printf("-2-"); break;
dudmuck 0:9c2b09ecb20f 417 case 3: printf("-3-"); break;
dudmuck 0:9c2b09ecb20f 418 }
dudmuck 0:9c2b09ecb20f 419 }
dudmuck 0:9c2b09ecb20f 420
dudmuck 0:9c2b09ecb20f 421 printf(" DIO0:");
dudmuck 0:9c2b09ecb20f 422 if (fsk.RegPktConfig2.bits.DataModePacket) {
dudmuck 0:9c2b09ecb20f 423 switch (radio.RegDioMapping1.bits.Dio0Mapping) {
dudmuck 0:9c2b09ecb20f 424 case 0: printf("PayloadReady/PacketSent"); break;
dudmuck 0:9c2b09ecb20f 425 case 1: printf("CrcOk"); break;
dudmuck 0:9c2b09ecb20f 426 case 2: printf("-2-"); break;
dudmuck 0:9c2b09ecb20f 427 case 3: printf("TempChange/LowBat"); break;
dudmuck 0:9c2b09ecb20f 428 }
dudmuck 0:9c2b09ecb20f 429 } else {
dudmuck 0:9c2b09ecb20f 430 switch (radio.RegDioMapping1.bits.Dio0Mapping) {
dudmuck 0:9c2b09ecb20f 431 case 0: printf("SyncAdrs/TxReady"); break;
dudmuck 0:9c2b09ecb20f 432 case 1:
dudmuck 0:9c2b09ecb20f 433 if (radio.RegDioMapping2.bits.MapPreambleDetect)
dudmuck 0:9c2b09ecb20f 434 printf("preamble");
dudmuck 0:9c2b09ecb20f 435 else
dudmuck 0:9c2b09ecb20f 436 printf("rssi");
dudmuck 0:9c2b09ecb20f 437 break;
dudmuck 0:9c2b09ecb20f 438 case 2: printf("RxReady"); break;
dudmuck 0:9c2b09ecb20f 439 case 3: printf("-3-"); break;
dudmuck 0:9c2b09ecb20f 440 }
dudmuck 0:9c2b09ecb20f 441 }
dudmuck 0:9c2b09ecb20f 442 printf("\r\n");
dudmuck 0:9c2b09ecb20f 443 }
dudmuck 0:9c2b09ecb20f 444
dudmuck 0:9c2b09ecb20f 445 void lora_print_status()
dudmuck 0:9c2b09ecb20f 446 {
dudmuck 0:9c2b09ecb20f 447 uint8_t d;
dudmuck 0:9c2b09ecb20f 448
dudmuck 0:9c2b09ecb20f 449 if (radio.type == SX1276)
dudmuck 0:9c2b09ecb20f 450 printf("\r\nSX1276 ");
dudmuck 0:9c2b09ecb20f 451 else if (radio.type == SX1272)
dudmuck 0:9c2b09ecb20f 452 printf("\r\nSX1272 ");
dudmuck 0:9c2b09ecb20f 453
dudmuck 0:9c2b09ecb20f 454 radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
dudmuck 0:9c2b09ecb20f 455 if (!radio.RegOpMode.bits.LongRangeMode) {
dudmuck 0:9c2b09ecb20f 456 printf("FSK\r\n");
dudmuck 0:9c2b09ecb20f 457 return;
dudmuck 0:9c2b09ecb20f 458 }
dudmuck 0:9c2b09ecb20f 459
dudmuck 0:9c2b09ecb20f 460 lora_print_dio();
dudmuck 0:9c2b09ecb20f 461 printf("LoRa ");
dudmuck 0:9c2b09ecb20f 462
dudmuck 0:9c2b09ecb20f 463 // printing LoRa registers at 0x0d -> 0x3f
dudmuck 0:9c2b09ecb20f 464
dudmuck 0:9c2b09ecb20f 465 lora.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
dudmuck 0:9c2b09ecb20f 466 lora.RegModemConfig2.octet = radio.read_reg(REG_LR_MODEMCONFIG2);
dudmuck 0:9c2b09ecb20f 467
dudmuck 0:9c2b09ecb20f 468 lora_printCodingRate(false); // false: transmitted coding rate
dudmuck 0:9c2b09ecb20f 469 lora_printHeaderMode();
dudmuck 0:9c2b09ecb20f 470 lora_printBw();
dudmuck 0:9c2b09ecb20f 471 lora_printSf();
dudmuck 0:9c2b09ecb20f 472 lora_printRxPayloadCrcOn();
dudmuck 0:9c2b09ecb20f 473 // RegModemStat
dudmuck 0:9c2b09ecb20f 474 printf("ModemStat:0x%02x\r\n", radio.read_reg(REG_LR_MODEMSTAT));
dudmuck 0:9c2b09ecb20f 475
dudmuck 0:9c2b09ecb20f 476 // fifo ptrs:
dudmuck 0:9c2b09ecb20f 477 lora.RegPayloadLength = radio.read_reg(REG_LR_PAYLOADLENGTH);
dudmuck 0:9c2b09ecb20f 478 lora.RegRxMaxPayloadLength = radio.read_reg(REG_LR_RX_MAX_PAYLOADLENGTH);
dudmuck 0:9c2b09ecb20f 479 printf("fifoptr=0x%02x txbase=0x%02x rxbase=0x%02x payloadLength=0x%02x maxlen=0x%02x",
dudmuck 0:9c2b09ecb20f 480 radio.read_reg(REG_LR_FIFOADDRPTR),
dudmuck 0:9c2b09ecb20f 481 radio.read_reg(REG_LR_FIFOTXBASEADDR),
dudmuck 0:9c2b09ecb20f 482 radio.read_reg(REG_LR_FIFORXBASEADDR),
dudmuck 0:9c2b09ecb20f 483 lora.RegPayloadLength,
dudmuck 0:9c2b09ecb20f 484 lora.RegRxMaxPayloadLength
dudmuck 0:9c2b09ecb20f 485 );
dudmuck 0:9c2b09ecb20f 486
dudmuck 0:9c2b09ecb20f 487 lora.RegIrqFlags.octet = radio.read_reg(REG_LR_IRQFLAGS);
dudmuck 0:9c2b09ecb20f 488 printLoraIrqs_(false);
dudmuck 0:9c2b09ecb20f 489
dudmuck 0:9c2b09ecb20f 490 lora.RegHopPeriod = radio.read_reg(REG_LR_HOPPERIOD);
dudmuck 0:9c2b09ecb20f 491 if (lora.RegHopPeriod != 0) {
dudmuck 0:9c2b09ecb20f 492 printf("\r\nHopPeriod:0x%02x\r\n", lora.RegHopPeriod);
dudmuck 0:9c2b09ecb20f 493 }
dudmuck 0:9c2b09ecb20f 494
dudmuck 0:9c2b09ecb20f 495 printf("SymbTimeout:0x%03x ", radio.read_u16(REG_LR_MODEMCONFIG2) & 0x3ff);
dudmuck 0:9c2b09ecb20f 496
dudmuck 0:9c2b09ecb20f 497 lora.RegPreamble = radio.read_u16(REG_LR_PREAMBLEMSB);
dudmuck 0:9c2b09ecb20f 498 printf("PreambleLength:%d ", lora.RegPreamble);
dudmuck 0:9c2b09ecb20f 499
dudmuck 0:9c2b09ecb20f 500 if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER || radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER_SINGLE) {
dudmuck 0:9c2b09ecb20f 501 d = radio.read_reg(REG_LR_RSSIVALUE);
dudmuck 0:9c2b09ecb20f 502 printf("rssi:%ddBm ", d-120);
dudmuck 0:9c2b09ecb20f 503 }
dudmuck 0:9c2b09ecb20f 504
dudmuck 0:9c2b09ecb20f 505 lora_printTxContinuousMode();
dudmuck 0:9c2b09ecb20f 506
dudmuck 0:9c2b09ecb20f 507 printf("\r\n");
dudmuck 0:9c2b09ecb20f 508 lora_printAgcAutoOn();
dudmuck 0:9c2b09ecb20f 509
dudmuck 0:9c2b09ecb20f 510 printf("\r\nHeaderCount:%d PacketCount:%d, ",
dudmuck 0:9c2b09ecb20f 511 radio.read_u16(REG_LR_RXHEADERCNTVALUE_MSB), radio.read_u16(REG_LR_RXPACKETCNTVALUE_MSB));
dudmuck 0:9c2b09ecb20f 512
dudmuck 0:9c2b09ecb20f 513 printf("Lora detection threshold:%02x\r\n", radio.read_reg(REG_LR_DETECTION_THRESHOLD));
dudmuck 0:9c2b09ecb20f 514 lora.RegTest31.octet = radio.read_reg(REG_LR_TEST31);
dudmuck 0:9c2b09ecb20f 515 printf("detect_trig_same_peaks_nb:%d\r\n", lora.RegTest31.bits.detect_trig_same_peaks_nb);
dudmuck 0:9c2b09ecb20f 516
dudmuck 9:dc02ef560bd1 517 printf("LowDataRateOptimize:");
dudmuck 0:9c2b09ecb20f 518 if (radio.type == SX1272) {
dudmuck 0:9c2b09ecb20f 519 lora.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
dudmuck 9:dc02ef560bd1 520 printf("%d ", lora.RegModemConfig.sx1272bits.LowDataRateOptimize);
dudmuck 0:9c2b09ecb20f 521 } else if (radio.type == SX1276) {
dudmuck 0:9c2b09ecb20f 522 lora.RegModemConfig3.octet = radio.read_reg(REG_LR_MODEMCONFIG3);
dudmuck 9:dc02ef560bd1 523 printf("%d ", lora.RegModemConfig3.sx1276bits.LowDataRateOptimize);
dudmuck 0:9c2b09ecb20f 524 }
dudmuck 0:9c2b09ecb20f 525
dudmuck 9:dc02ef560bd1 526 printf(" invert: rx=%d tx=%d\r\n", lora.RegTest33.bits.invert_i_q, !lora.RegTest33.bits.chirp_invert_tx);
dudmuck 9:dc02ef560bd1 527
dudmuck 13:a22debeee855 528 #ifdef FCC_TEST
dudmuck 3:8924027a8933 529 switch (hop_type) {
dudmuck 3:8924027a8933 530 case HOP_TYPE_NONE:
dudmuck 3:8924027a8933 531 break;
dudmuck 3:8924027a8933 532 case HOP_TYPE_64CH:
dudmuck 7:6d5f193b6c2f 533 printf("hop 64ch\r\n");
dudmuck 3:8924027a8933 534 break;
dudmuck 3:8924027a8933 535 case HOP_TYPE_4CH:
dudmuck 7:6d5f193b6c2f 536 printf("hop 4ch\r\n");
dudmuck 3:8924027a8933 537 break;
dudmuck 3:8924027a8933 538 }
dudmuck 13:a22debeee855 539 #endif /* #ifdef FCC_TEST */
dudmuck 0:9c2b09ecb20f 540 printf("\r\n");
dudmuck 0:9c2b09ecb20f 541 }
dudmuck 0:9c2b09ecb20f 542
dudmuck 0:9c2b09ecb20f 543 uint16_t
dudmuck 0:9c2b09ecb20f 544 fsk_get_PayloadLength(void)
dudmuck 0:9c2b09ecb20f 545 {
dudmuck 0:9c2b09ecb20f 546 fsk.RegPktConfig2.word = radio.read_u16(REG_FSK_PACKETCONFIG2);
dudmuck 0:9c2b09ecb20f 547
dudmuck 0:9c2b09ecb20f 548 return fsk.RegPktConfig2.bits.PayloadLength;
dudmuck 0:9c2b09ecb20f 549 }
dudmuck 0:9c2b09ecb20f 550
dudmuck 0:9c2b09ecb20f 551 void fsk_printAddressFiltering()
dudmuck 0:9c2b09ecb20f 552 {
dudmuck 0:9c2b09ecb20f 553 uint8_t FSKRegNodeAdrs, FSKRegBroadcastAdrs;
dudmuck 0:9c2b09ecb20f 554
dudmuck 0:9c2b09ecb20f 555 printf(" AddressFiltering:");
dudmuck 0:9c2b09ecb20f 556 switch (fsk.RegPktConfig1.bits.AddressFiltering) {
dudmuck 0:9c2b09ecb20f 557 case 0: printf("off"); break;
dudmuck 0:9c2b09ecb20f 558 case 1: // NodeAddress
dudmuck 0:9c2b09ecb20f 559 FSKRegNodeAdrs = radio.read_reg(REG_FSK_NODEADRS);
dudmuck 7:6d5f193b6c2f 560 printf("NodeAdrs:%02x\r\n", FSKRegNodeAdrs);
dudmuck 0:9c2b09ecb20f 561 break;
dudmuck 0:9c2b09ecb20f 562 case 2: // NodeAddress & BroadcastAddress
dudmuck 0:9c2b09ecb20f 563 FSKRegNodeAdrs = radio.read_reg(REG_FSK_NODEADRS);
dudmuck 0:9c2b09ecb20f 564 printf("NodeAdrs:%02x ", FSKRegNodeAdrs);
dudmuck 0:9c2b09ecb20f 565 FSKRegBroadcastAdrs = radio.read_reg(REG_FSK_BROADCASTADRS);
dudmuck 7:6d5f193b6c2f 566 printf("BroadcastAdrs:%02x\r\n", FSKRegBroadcastAdrs );
dudmuck 0:9c2b09ecb20f 567 break;
dudmuck 0:9c2b09ecb20f 568 default:
dudmuck 0:9c2b09ecb20f 569 printf("%d", fsk.RegPktConfig1.bits.AddressFiltering);
dudmuck 0:9c2b09ecb20f 570 break;
dudmuck 0:9c2b09ecb20f 571 }
dudmuck 0:9c2b09ecb20f 572 }
dudmuck 0:9c2b09ecb20f 573
dudmuck 0:9c2b09ecb20f 574 void fsk_print_IrqFlags2()
dudmuck 0:9c2b09ecb20f 575 {
dudmuck 0:9c2b09ecb20f 576 RegIrqFlags2_t RegIrqFlags2;
dudmuck 0:9c2b09ecb20f 577
dudmuck 0:9c2b09ecb20f 578 printf("IrqFlags2: ");
dudmuck 0:9c2b09ecb20f 579 RegIrqFlags2.octet = radio.read_reg(REG_FSK_IRQFLAGS2);
dudmuck 0:9c2b09ecb20f 580 if (RegIrqFlags2.bits.FifoFull)
dudmuck 0:9c2b09ecb20f 581 printf("FifoFull ");
dudmuck 0:9c2b09ecb20f 582 if (RegIrqFlags2.bits.FifoEmpty)
dudmuck 0:9c2b09ecb20f 583 printf("FifoEmpty ");
dudmuck 0:9c2b09ecb20f 584 if (RegIrqFlags2.bits.FifoLevel)
dudmuck 0:9c2b09ecb20f 585 printf("FifoLevel ");
dudmuck 0:9c2b09ecb20f 586 if (RegIrqFlags2.bits.FifoOverrun)
dudmuck 0:9c2b09ecb20f 587 printf("FifoOverrun ");
dudmuck 0:9c2b09ecb20f 588 if (RegIrqFlags2.bits.PacketSent)
dudmuck 0:9c2b09ecb20f 589 printf("PacketSent ");
dudmuck 0:9c2b09ecb20f 590 if (RegIrqFlags2.bits.PayloadReady)
dudmuck 0:9c2b09ecb20f 591 printf("PayloadReady ");
dudmuck 0:9c2b09ecb20f 592 if (RegIrqFlags2.bits.CrcOk)
dudmuck 0:9c2b09ecb20f 593 printf("CrcOk ");
dudmuck 0:9c2b09ecb20f 594 if (RegIrqFlags2.bits.LowBat)
dudmuck 0:9c2b09ecb20f 595 printf("LowBat ");
dudmuck 0:9c2b09ecb20f 596 printf("\r\n");
dudmuck 0:9c2b09ecb20f 597 }
dudmuck 0:9c2b09ecb20f 598
dudmuck 0:9c2b09ecb20f 599 void
dudmuck 0:9c2b09ecb20f 600 fsk_print_status()
dudmuck 0:9c2b09ecb20f 601 {
dudmuck 0:9c2b09ecb20f 602 //uint16_t s;
dudmuck 0:9c2b09ecb20f 603 RegIrqFlags1_t RegIrqFlags1;
dudmuck 0:9c2b09ecb20f 604
dudmuck 0:9c2b09ecb20f 605 if (radio.RegOpMode.bits.LongRangeMode) {
dudmuck 0:9c2b09ecb20f 606 printf("LoRa\r\n");
dudmuck 0:9c2b09ecb20f 607 return;
dudmuck 0:9c2b09ecb20f 608 }
dudmuck 0:9c2b09ecb20f 609
dudmuck 0:9c2b09ecb20f 610 if (radio.RegOpMode.bits.ModulationType == 0) {
dudmuck 0:9c2b09ecb20f 611 printf("FSK ");
dudmuck 0:9c2b09ecb20f 612 switch (radio.RegOpMode.bits.ModulationShaping) {
dudmuck 0:9c2b09ecb20f 613 case 1: printf("BT1.0 "); break;
dudmuck 0:9c2b09ecb20f 614 case 2: printf("BT0.5 "); break;
dudmuck 0:9c2b09ecb20f 615 case 3: printf("BT0.3 "); break;
dudmuck 0:9c2b09ecb20f 616 }
dudmuck 0:9c2b09ecb20f 617 } else if (radio.RegOpMode.bits.ModulationType == 1) {
dudmuck 0:9c2b09ecb20f 618 printf("OOK ");
dudmuck 0:9c2b09ecb20f 619 }
dudmuck 0:9c2b09ecb20f 620
Wayne Roberts 17:f73dbeca8736 621 printf("%" PRIu32 "bps fdev:%" PRIu32 "Hz\r\n", fsk.get_bitrate(), fsk.get_tx_fdev_hz());
dudmuck 0:9c2b09ecb20f 622
dudmuck 0:9c2b09ecb20f 623 fsk.RegPktConfig2.word = radio.read_u16(REG_FSK_PACKETCONFIG2);
dudmuck 0:9c2b09ecb20f 624
dudmuck 0:9c2b09ecb20f 625 fsk_print_dio();
dudmuck 0:9c2b09ecb20f 626
Wayne Roberts 17:f73dbeca8736 627 printf("rxbw:%" PRIu32 "Hz ", fsk.get_rx_bw_hz(REG_FSK_RXBW));
Wayne Roberts 17:f73dbeca8736 628 printf("afcbw:%" PRIu32 "Hz\r\n", fsk.get_rx_bw_hz(REG_FSK_AFCBW));
dudmuck 0:9c2b09ecb20f 629
dudmuck 0:9c2b09ecb20f 630 fsk.RegRssiConfig.octet = radio.read_reg(REG_FSK_RSSICONFIG);
dudmuck 0:9c2b09ecb20f 631 printf("RssiOffset:%ddB smoothing:%dsamples\r\n", fsk.RegRssiConfig.bits.RssiOffset, 1 << (fsk.RegRssiConfig.bits.RssiSmoothing+1));
dudmuck 0:9c2b09ecb20f 632
dudmuck 0:9c2b09ecb20f 633
dudmuck 0:9c2b09ecb20f 634 fsk.RegSyncConfig.octet = radio.read_reg(REG_FSK_SYNCCONFIG);
dudmuck 0:9c2b09ecb20f 635
dudmuck 0:9c2b09ecb20f 636 if (fsk.RegPktConfig2.bits.DataModePacket) {
dudmuck 0:9c2b09ecb20f 637 uint16_t len;
dudmuck 0:9c2b09ecb20f 638 /* packet mode */
dudmuck 0:9c2b09ecb20f 639 len = fsk_get_PayloadLength();
dudmuck 0:9c2b09ecb20f 640 printf("packet RegPayloadLength:0x%03x ", len);
dudmuck 0:9c2b09ecb20f 641
dudmuck 0:9c2b09ecb20f 642 if (fsk.RegPktConfig2.bits.BeaconOn)
dudmuck 0:9c2b09ecb20f 643 printf("BeaconOn ");
dudmuck 0:9c2b09ecb20f 644
dudmuck 0:9c2b09ecb20f 645 fsk.RegFifoThreshold.octet = radio.read_reg(REG_FSK_FIFOTHRESH);
dudmuck 0:9c2b09ecb20f 646 printf("FifoThreshold:%d TxStartCondition:", fsk.RegFifoThreshold.bits.FifoThreshold);
dudmuck 0:9c2b09ecb20f 647 if (fsk.RegFifoThreshold.bits.TxStartCondition)
dudmuck 0:9c2b09ecb20f 648 printf("!FifoEmpty");
dudmuck 0:9c2b09ecb20f 649 else
dudmuck 0:9c2b09ecb20f 650 printf("FifoLevel");
dudmuck 0:9c2b09ecb20f 651
dudmuck 0:9c2b09ecb20f 652 printf("\r\nAutoRestartRxMode:");
dudmuck 0:9c2b09ecb20f 653 switch (fsk.RegSyncConfig.bits.AutoRestartRxMode) {
dudmuck 0:9c2b09ecb20f 654 case 0: printf("off "); break;
dudmuck 0:9c2b09ecb20f 655 case 1: printf("no-pll-wait "); break;
dudmuck 0:9c2b09ecb20f 656 case 2: printf("pll-wait "); break;
dudmuck 0:9c2b09ecb20f 657 case 3: printf("3 "); break;
dudmuck 0:9c2b09ecb20f 658 }
dudmuck 0:9c2b09ecb20f 659 //...todo
dudmuck 0:9c2b09ecb20f 660
dudmuck 0:9c2b09ecb20f 661 printf("PreambleSize:%d ", radio.read_u16(REG_FSK_PREAMBLEMSB));
dudmuck 0:9c2b09ecb20f 662
dudmuck 0:9c2b09ecb20f 663 fsk.RegOokPeak.octet = radio.read_reg(REG_FSK_OOKPEAK);
dudmuck 0:9c2b09ecb20f 664 if (fsk.RegOokPeak.bits.barker_en)
dudmuck 0:9c2b09ecb20f 665 printf("barker ");
dudmuck 0:9c2b09ecb20f 666 if (!fsk.RegOokPeak.bits.BitSyncOn)
dudmuck 0:9c2b09ecb20f 667 printf("BitSyncOff ");
dudmuck 0:9c2b09ecb20f 668 //...todo
dudmuck 0:9c2b09ecb20f 669
dudmuck 0:9c2b09ecb20f 670 fsk.RegPktConfig1.octet = radio.read_reg(REG_FSK_PACKETCONFIG1);
dudmuck 0:9c2b09ecb20f 671 if (fsk.RegPktConfig1.bits.PacketFormatVariable)
dudmuck 0:9c2b09ecb20f 672 printf("variable");
dudmuck 0:9c2b09ecb20f 673 else
dudmuck 0:9c2b09ecb20f 674 printf("fixed");
dudmuck 0:9c2b09ecb20f 675 printf("-length\r\ncrc");
dudmuck 0:9c2b09ecb20f 676 if (fsk.RegPktConfig1.bits.CrcOn) {
dudmuck 0:9c2b09ecb20f 677 printf("On");
dudmuck 0:9c2b09ecb20f 678 } else
dudmuck 0:9c2b09ecb20f 679 printf("Off");
dudmuck 0:9c2b09ecb20f 680 printf(" crctype:");
dudmuck 0:9c2b09ecb20f 681 if (fsk.RegPktConfig1.bits.CrCWhiteningType)
dudmuck 0:9c2b09ecb20f 682 printf("IBM");
dudmuck 0:9c2b09ecb20f 683 else
dudmuck 0:9c2b09ecb20f 684 printf("CCITT");
dudmuck 0:9c2b09ecb20f 685 printf(" dcFree:");
dudmuck 0:9c2b09ecb20f 686 switch (fsk.RegPktConfig1.bits.DcFree) {
dudmuck 0:9c2b09ecb20f 687 case 0: printf("none "); break;
dudmuck 0:9c2b09ecb20f 688 case 1: printf("Manchester "); break;
dudmuck 0:9c2b09ecb20f 689 case 2: printf("Whitening "); break;
dudmuck 0:9c2b09ecb20f 690 case 3: printf("reserved "); break;
dudmuck 0:9c2b09ecb20f 691 }
dudmuck 0:9c2b09ecb20f 692 fsk_printAddressFiltering();
dudmuck 0:9c2b09ecb20f 693
dudmuck 0:9c2b09ecb20f 694 printf("\r\n");
dudmuck 0:9c2b09ecb20f 695 fsk_print_IrqFlags2();
dudmuck 0:9c2b09ecb20f 696 } else {
dudmuck 0:9c2b09ecb20f 697 /* continuous mode */
dudmuck 0:9c2b09ecb20f 698 printf("continuous ");
dudmuck 0:9c2b09ecb20f 699 }
dudmuck 0:9c2b09ecb20f 700
dudmuck 0:9c2b09ecb20f 701 fsk.RegPreambleDetect.octet = radio.read_reg(REG_FSK_PREAMBLEDETECT);
dudmuck 0:9c2b09ecb20f 702 printf("PreambleDetect:");
dudmuck 0:9c2b09ecb20f 703 if (fsk.RegPreambleDetect.bits.PreambleDetectorOn) {
dudmuck 0:9c2b09ecb20f 704 printf("size=%d,tol=%d ",
dudmuck 0:9c2b09ecb20f 705 fsk.RegPreambleDetect.bits.PreambleDetectorSize,
dudmuck 0:9c2b09ecb20f 706 fsk.RegPreambleDetect.bits.PreambleDetectorTol);
dudmuck 0:9c2b09ecb20f 707 } else
dudmuck 0:9c2b09ecb20f 708 printf("Off ");
dudmuck 0:9c2b09ecb20f 709
dudmuck 0:9c2b09ecb20f 710 printf(" syncsize:%d ", fsk.RegSyncConfig.bits.SyncSize);
dudmuck 0:9c2b09ecb20f 711 printf(" : %02x ", radio.read_reg(REG_FSK_SYNCVALUE1));
dudmuck 0:9c2b09ecb20f 712 printf("%02x ", radio.read_reg(REG_FSK_SYNCVALUE2));
dudmuck 0:9c2b09ecb20f 713 printf("%02x ", radio.read_reg(REG_FSK_SYNCVALUE3));
dudmuck 0:9c2b09ecb20f 714 printf("%02x ", radio.read_reg(REG_FSK_SYNCVALUE4));
dudmuck 0:9c2b09ecb20f 715 printf("\r\n"); // end sync config
dudmuck 0:9c2b09ecb20f 716
dudmuck 0:9c2b09ecb20f 717 fsk.RegAfcFei.octet = radio.read_reg(REG_FSK_AFCFEI);
dudmuck 0:9c2b09ecb20f 718 printf("afcAutoClear:");
dudmuck 0:9c2b09ecb20f 719 if (fsk.RegAfcFei.bits.AfcAutoClearOn)
dudmuck 0:9c2b09ecb20f 720 printf("On");
dudmuck 0:9c2b09ecb20f 721 else
dudmuck 0:9c2b09ecb20f 722 printf("OFF");
dudmuck 0:9c2b09ecb20f 723 printf(" afc:%dHz ", (int)(FREQ_STEP_HZ * radio.read_s16(REG_FSK_AFCMSB)));
dudmuck 0:9c2b09ecb20f 724
dudmuck 0:9c2b09ecb20f 725 printf("fei:%dHz\r\n", (int)(FREQ_STEP_HZ * radio.read_s16(REG_FSK_FEIMSB)));
dudmuck 0:9c2b09ecb20f 726
dudmuck 0:9c2b09ecb20f 727 fsk.RegRxConfig.octet = radio.read_reg(REG_FSK_RXCONFIG);
dudmuck 0:9c2b09ecb20f 728 printf("RxTrigger:");
dudmuck 0:9c2b09ecb20f 729 switch (fsk.RegRxConfig.bits.RxTrigger) {
dudmuck 0:9c2b09ecb20f 730 case 0: printf("none "); break;
dudmuck 0:9c2b09ecb20f 731 case 1: printf("rssi "); break;
dudmuck 0:9c2b09ecb20f 732 case 6: printf("preamble "); break;
dudmuck 0:9c2b09ecb20f 733 case 7: printf("both "); break;
dudmuck 0:9c2b09ecb20f 734 default: printf("-%d- ", fsk.RegRxConfig.bits.RxTrigger); break;
dudmuck 0:9c2b09ecb20f 735 }
dudmuck 0:9c2b09ecb20f 736 printf("AfcAuto:");
dudmuck 0:9c2b09ecb20f 737 if (fsk.RegRxConfig.bits.AfcAutoOn)
dudmuck 0:9c2b09ecb20f 738 printf("On ");
dudmuck 0:9c2b09ecb20f 739 else
dudmuck 0:9c2b09ecb20f 740 printf("OFF ");
dudmuck 5:329557e0625c 741 if (fsk.RegRxConfig.bits.AgcAutoOn) {
dudmuck 5:329557e0625c 742 printf("AgcAutoOn ");
dudmuck 5:329557e0625c 743 } else {
dudmuck 0:9c2b09ecb20f 744 radio.RegLna.octet = radio.read_reg(REG_LNA);
dudmuck 0:9c2b09ecb20f 745 printf("AgcAutoOff:G%d ", radio.RegLna.bits.LnaGain);
dudmuck 0:9c2b09ecb20f 746 }
dudmuck 0:9c2b09ecb20f 747
dudmuck 0:9c2b09ecb20f 748 fsk.RegTimerResol.octet = radio.read_reg(REG_FSK_TIMERRESOL);
dudmuck 0:9c2b09ecb20f 749 if (fsk.RegTimerResol.bits.hlm_started)
dudmuck 0:9c2b09ecb20f 750 printf("hlm_started ");
dudmuck 0:9c2b09ecb20f 751 else
dudmuck 0:9c2b09ecb20f 752 printf("hlm_stopped ");
dudmuck 0:9c2b09ecb20f 753
dudmuck 0:9c2b09ecb20f 754 fsk.RegRssiThresh = radio.read_reg(REG_FSK_RSSITHRESH);
dudmuck 0:9c2b09ecb20f 755 printf("rssiThreshold:-%.1f@%02x ", fsk.RegRssiThresh / 2.0, REG_FSK_RSSITHRESH);
dudmuck 0:9c2b09ecb20f 756
dudmuck 0:9c2b09ecb20f 757 radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
dudmuck 0:9c2b09ecb20f 758 if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER ||
dudmuck 0:9c2b09ecb20f 759 radio.RegOpMode.bits.Mode == RF_OPMODE_SYNTHESIZER_RX)
dudmuck 0:9c2b09ecb20f 760 {
dudmuck 0:9c2b09ecb20f 761 printf("rssi:-%.1f ", radio.read_reg(REG_FSK_RSSIVALUE) / 2.0);
dudmuck 0:9c2b09ecb20f 762 }
dudmuck 0:9c2b09ecb20f 763
dudmuck 0:9c2b09ecb20f 764 fsk.RegSeqConfig1.octet = radio.read_reg(REG_FSK_SEQCONFIG1);
dudmuck 0:9c2b09ecb20f 765 printf("\r\nsequencer: ");
dudmuck 0:9c2b09ecb20f 766 printf("FromStart:");
dudmuck 0:9c2b09ecb20f 767 switch (fsk.RegSeqConfig1.bits.FromStart) {
dudmuck 0:9c2b09ecb20f 768 case 0:
dudmuck 0:9c2b09ecb20f 769 printf("lowPowerSelection-");
dudmuck 0:9c2b09ecb20f 770 if (fsk.RegSeqConfig1.bits.LowPowerSelection)
dudmuck 0:9c2b09ecb20f 771 printf("idle");
dudmuck 0:9c2b09ecb20f 772 else
dudmuck 0:9c2b09ecb20f 773 printf("sequencerOff");
dudmuck 0:9c2b09ecb20f 774 break;
dudmuck 0:9c2b09ecb20f 775 case 1: printf("rx"); break;
dudmuck 0:9c2b09ecb20f 776 case 2: printf("tx"); break;
dudmuck 0:9c2b09ecb20f 777 case 3: printf("tx on fifolevel"); break;
dudmuck 0:9c2b09ecb20f 778 }
dudmuck 0:9c2b09ecb20f 779 printf(" lowPowerSelection:");
dudmuck 0:9c2b09ecb20f 780 if (fsk.RegSeqConfig1.bits.LowPowerSelection)
dudmuck 0:9c2b09ecb20f 781 printf("idle");
dudmuck 0:9c2b09ecb20f 782 else
dudmuck 0:9c2b09ecb20f 783 printf("SequencerOff");
dudmuck 0:9c2b09ecb20f 784 if (fsk.RegSeqConfig1.bits.FromStart != 0 &&
dudmuck 0:9c2b09ecb20f 785 fsk.RegSeqConfig1.bits.LowPowerSelection != 0)
dudmuck 0:9c2b09ecb20f 786 { // if sequencer enabled:
dudmuck 0:9c2b09ecb20f 787 printf("\r\nsequencer: IdleMode:");
dudmuck 0:9c2b09ecb20f 788 if (fsk.RegSeqConfig1.bits.IdleMode)
dudmuck 0:9c2b09ecb20f 789 printf("Sleep");
dudmuck 0:9c2b09ecb20f 790 else
dudmuck 0:9c2b09ecb20f 791 printf("standby");
dudmuck 0:9c2b09ecb20f 792 printf("\r\nsequencer: FromIdle to:");
dudmuck 0:9c2b09ecb20f 793 if (fsk.RegSeqConfig1.bits.FromIdle)
dudmuck 0:9c2b09ecb20f 794 printf("rx");
dudmuck 0:9c2b09ecb20f 795 else
dudmuck 0:9c2b09ecb20f 796 printf("tx");
dudmuck 0:9c2b09ecb20f 797 printf("\r\nsequencer: FromTransmit to:");
dudmuck 0:9c2b09ecb20f 798 if (fsk.RegSeqConfig1.bits.FromTransmit)
dudmuck 0:9c2b09ecb20f 799 printf("rx-on-PacketSent");
dudmuck 0:9c2b09ecb20f 800 else {
dudmuck 0:9c2b09ecb20f 801 printf("lowPowerSelection-");
dudmuck 0:9c2b09ecb20f 802 if (fsk.RegSeqConfig1.bits.LowPowerSelection)
dudmuck 0:9c2b09ecb20f 803 printf("idle");
dudmuck 0:9c2b09ecb20f 804 else
dudmuck 0:9c2b09ecb20f 805 printf("SequencerOff");
dudmuck 0:9c2b09ecb20f 806 printf("-on-PacketSent");
dudmuck 0:9c2b09ecb20f 807 }
dudmuck 0:9c2b09ecb20f 808 fsk.RegSeqConfig2.octet = radio.read_reg(REG_FSK_SEQCONFIG2);
dudmuck 0:9c2b09ecb20f 809 printf("\r\nsequencer: FromReceive:");
dudmuck 0:9c2b09ecb20f 810 switch (fsk.RegSeqConfig2.bits.FromReceive) {
dudmuck 0:9c2b09ecb20f 811 case 1: printf("PacketRecevied on PayloadReady"); break;
dudmuck 0:9c2b09ecb20f 812 case 2:
dudmuck 0:9c2b09ecb20f 813 printf("lowPowerSelection-");
dudmuck 0:9c2b09ecb20f 814 if (fsk.RegSeqConfig1.bits.LowPowerSelection)
dudmuck 0:9c2b09ecb20f 815 printf("idle");
dudmuck 0:9c2b09ecb20f 816 else
dudmuck 0:9c2b09ecb20f 817 printf("SequencerOff");
dudmuck 0:9c2b09ecb20f 818 printf("-on-payloadReady");
dudmuck 0:9c2b09ecb20f 819 break;
dudmuck 0:9c2b09ecb20f 820 case 3: printf("PacketRecevied-on-CrcOk"); break;
dudmuck 0:9c2b09ecb20f 821 case 4: printf("SequencerOff-on-Rssi"); break;
dudmuck 0:9c2b09ecb20f 822 case 5: printf("SequencerOff-on-SyncAddress"); break;
dudmuck 0:9c2b09ecb20f 823 case 6: printf("SequencerOff-PreambleDetect"); break;
dudmuck 0:9c2b09ecb20f 824 default: printf("-%d-", fsk.RegSeqConfig2.bits.FromReceive); break;
dudmuck 0:9c2b09ecb20f 825 }
dudmuck 0:9c2b09ecb20f 826 printf("\r\nsequencer: FromRxTimeout:");
dudmuck 0:9c2b09ecb20f 827 switch (fsk.RegSeqConfig2.bits.FromRxTimeout) {
dudmuck 0:9c2b09ecb20f 828 case 0: printf("rx"); break;
dudmuck 0:9c2b09ecb20f 829 case 1: printf("tx"); break;
dudmuck 0:9c2b09ecb20f 830 case 2:
dudmuck 0:9c2b09ecb20f 831 printf("lowPowerSelection-");
dudmuck 0:9c2b09ecb20f 832 if (fsk.RegSeqConfig1.bits.LowPowerSelection)
dudmuck 0:9c2b09ecb20f 833 printf("idle");
dudmuck 0:9c2b09ecb20f 834 else
dudmuck 0:9c2b09ecb20f 835 printf("SequencerOff");
dudmuck 0:9c2b09ecb20f 836 break;
dudmuck 0:9c2b09ecb20f 837 case 3: printf("SequencerOff"); break;
dudmuck 0:9c2b09ecb20f 838 }
dudmuck 0:9c2b09ecb20f 839 printf("\r\nsequencer: FromPacketReceived to:");
dudmuck 0:9c2b09ecb20f 840 switch (fsk.RegSeqConfig2.bits.FromPacketReceived) {
dudmuck 0:9c2b09ecb20f 841 case 0: printf("SequencerOff"); break;
dudmuck 0:9c2b09ecb20f 842 case 1: printf("tx on FifoEmpty"); break;
dudmuck 0:9c2b09ecb20f 843 case 2:
dudmuck 0:9c2b09ecb20f 844 printf("lowPowerSelection-");
dudmuck 0:9c2b09ecb20f 845 if (fsk.RegSeqConfig1.bits.LowPowerSelection)
dudmuck 0:9c2b09ecb20f 846 printf("idle");
dudmuck 0:9c2b09ecb20f 847 else
dudmuck 0:9c2b09ecb20f 848 printf("sequencerOff");
dudmuck 0:9c2b09ecb20f 849 break;
dudmuck 0:9c2b09ecb20f 850 case 3: printf("rx via fs"); break;
dudmuck 0:9c2b09ecb20f 851 case 4: printf("rx"); break;
dudmuck 0:9c2b09ecb20f 852 }
dudmuck 0:9c2b09ecb20f 853
dudmuck 0:9c2b09ecb20f 854 fsk.RegTimerResol.octet = radio.read_reg(REG_FSK_TIMERRESOL);
dudmuck 0:9c2b09ecb20f 855 printf("\r\nsequencer: timer1:");
dudmuck 0:9c2b09ecb20f 856 switch (fsk.RegTimerResol.bits.timer1_resol) {
dudmuck 0:9c2b09ecb20f 857 case 0: printf("off"); break;
dudmuck 0:9c2b09ecb20f 858 case 1: printf("%dus", radio.read_reg(REG_FSK_TIMER1COEF) * 64); break;
dudmuck 0:9c2b09ecb20f 859 case 2: printf("%.1fms", radio.read_reg(REG_FSK_TIMER1COEF) * 4.1); break;
dudmuck 0:9c2b09ecb20f 860 case 3: printf("%.1fs", radio.read_reg(REG_FSK_TIMER1COEF) * 0.262); break;
dudmuck 0:9c2b09ecb20f 861 }
dudmuck 0:9c2b09ecb20f 862
dudmuck 0:9c2b09ecb20f 863 printf(" timer2:");
dudmuck 0:9c2b09ecb20f 864 switch (fsk.RegTimerResol.bits.timer2_resol) {
dudmuck 0:9c2b09ecb20f 865 case 0: printf("off"); break;
dudmuck 0:9c2b09ecb20f 866 case 1: printf("%dus", radio.read_reg(REG_FSK_TIMER2COEF) * 64); break;
dudmuck 0:9c2b09ecb20f 867 case 2: printf("%.1fms", radio.read_reg(REG_FSK_TIMER2COEF) * 4.1); break;
dudmuck 0:9c2b09ecb20f 868 case 3: printf("%.1fs", radio.read_reg(REG_FSK_TIMER2COEF) * 0.262); break;
dudmuck 0:9c2b09ecb20f 869 }
dudmuck 0:9c2b09ecb20f 870 } // ..if sequencer enabled
dudmuck 0:9c2b09ecb20f 871
dudmuck 0:9c2b09ecb20f 872 printf("\r\nIrqFlags1:");
dudmuck 0:9c2b09ecb20f 873 RegIrqFlags1.octet = radio.read_reg(REG_FSK_IRQFLAGS1);
dudmuck 0:9c2b09ecb20f 874 if (RegIrqFlags1.bits.ModeReady)
dudmuck 0:9c2b09ecb20f 875 printf("ModeReady ");
dudmuck 0:9c2b09ecb20f 876 if (RegIrqFlags1.bits.RxReady)
dudmuck 0:9c2b09ecb20f 877 printf("RxReady ");
dudmuck 0:9c2b09ecb20f 878 if (RegIrqFlags1.bits.TxReady)
dudmuck 0:9c2b09ecb20f 879 printf("TxReady ");
dudmuck 0:9c2b09ecb20f 880 if (RegIrqFlags1.bits.PllLock)
dudmuck 0:9c2b09ecb20f 881 printf("PllLock ");
dudmuck 0:9c2b09ecb20f 882 if (RegIrqFlags1.bits.Rssi)
dudmuck 0:9c2b09ecb20f 883 printf("Rssi ");
dudmuck 0:9c2b09ecb20f 884 if (RegIrqFlags1.bits.Timeout)
dudmuck 0:9c2b09ecb20f 885 printf("Timeout ");
dudmuck 0:9c2b09ecb20f 886 if (RegIrqFlags1.bits.PreambleDetect)
dudmuck 0:9c2b09ecb20f 887 printf("PreambleDetect ");
dudmuck 0:9c2b09ecb20f 888 if (RegIrqFlags1.bits.SyncAddressMatch)
dudmuck 0:9c2b09ecb20f 889 printf("SyncAddressMatch ");
dudmuck 0:9c2b09ecb20f 890
dudmuck 0:9c2b09ecb20f 891 printf("\r\n");
dudmuck 0:9c2b09ecb20f 892
dudmuck 0:9c2b09ecb20f 893 /* TODO if (!SX1272FSK->RegPktConfig1.bits.PacketFormatVariable) { // if fixed-length packet format:
dudmuck 0:9c2b09ecb20f 894 s = fsk_get_PayloadLength();
dudmuck 0:9c2b09ecb20f 895 if (s > FSK_LARGE_PKT_THRESHOLD)
dudmuck 0:9c2b09ecb20f 896 flags.fifo_flow_ctl = 1;
dudmuck 0:9c2b09ecb20f 897 else
dudmuck 0:9c2b09ecb20f 898 flags.fifo_flow_ctl = 0;
dudmuck 0:9c2b09ecb20f 899 }*/
dudmuck 0:9c2b09ecb20f 900
dudmuck 0:9c2b09ecb20f 901 fsk.RegImageCal.octet = radio.read_reg(REG_FSK_IMAGECAL);
dudmuck 0:9c2b09ecb20f 902 if (fsk.RegImageCal.bits.TempMonitorOff) {
dudmuck 7:6d5f193b6c2f 903 printf("TempMonitorOff[\r0m\r\n");
dudmuck 0:9c2b09ecb20f 904 } else {
dudmuck 0:9c2b09ecb20f 905 printf("TempThreshold:");
dudmuck 0:9c2b09ecb20f 906 switch (fsk.RegImageCal.bits.TempThreshold) {
dudmuck 0:9c2b09ecb20f 907 case 0: printf("5C"); break;
dudmuck 0:9c2b09ecb20f 908 case 1: printf("10C"); break;
dudmuck 0:9c2b09ecb20f 909 case 2: printf("15C"); break;
dudmuck 0:9c2b09ecb20f 910 case 3: printf("20C"); break;
dudmuck 0:9c2b09ecb20f 911 }
dudmuck 0:9c2b09ecb20f 912 printf("\r\n");
dudmuck 0:9c2b09ecb20f 913 }
dudmuck 0:9c2b09ecb20f 914 if (fsk.RegImageCal.bits.ImageCalRunning)
dudmuck 7:6d5f193b6c2f 915 printf("ImageCalRunning[\r0m\r\n");
dudmuck 0:9c2b09ecb20f 916
dudmuck 0:9c2b09ecb20f 917 /* printf("flags.fifo_flow_ctl:%d pktidx:%d rx_pktlen:%d", flags.fifo_flow_ctl, pktidx, rx_pktlen);
dudmuck 7:6d5f193b6c2f 918 printf("\r\n");
dudmuck 0:9c2b09ecb20f 919
dudmuck 7:6d5f193b6c2f 920 //printf("DIO0_PIN:%d\r\n", digitalRead(DIO0_PIN));
dudmuck 7:6d5f193b6c2f 921 printf("pkt_buf_len=%d remaining=%d\r\n", pk*/
dudmuck 0:9c2b09ecb20f 922 }
dudmuck 0:9c2b09ecb20f 923
dudmuck 0:9c2b09ecb20f 924 void printOpMode()
dudmuck 0:9c2b09ecb20f 925 {
dudmuck 0:9c2b09ecb20f 926 radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
dudmuck 0:9c2b09ecb20f 927 switch (radio.RegOpMode.bits.Mode) {
dudmuck 0:9c2b09ecb20f 928 case RF_OPMODE_SLEEP: printf("sleep"); break;
dudmuck 0:9c2b09ecb20f 929 case RF_OPMODE_STANDBY: printf("stby"); break;
dudmuck 0:9c2b09ecb20f 930 case RF_OPMODE_SYNTHESIZER_TX: printf("fstx"); break;
dudmuck 0:9c2b09ecb20f 931 case RF_OPMODE_TRANSMITTER: printf("tx"); break;
dudmuck 0:9c2b09ecb20f 932 case RF_OPMODE_SYNTHESIZER_RX: printf("fsrx"); break;
dudmuck 0:9c2b09ecb20f 933 case RF_OPMODE_RECEIVER: printf("rx"); break;
dudmuck 0:9c2b09ecb20f 934 case 6:
dudmuck 0:9c2b09ecb20f 935 if (radio.RegOpMode.bits.LongRangeMode)
dudmuck 0:9c2b09ecb20f 936 printf("rxs");
dudmuck 0:9c2b09ecb20f 937 else
dudmuck 0:9c2b09ecb20f 938 printf("-6-");
dudmuck 0:9c2b09ecb20f 939 break; // todo: different lora/fsk
dudmuck 0:9c2b09ecb20f 940 case 7:
dudmuck 0:9c2b09ecb20f 941 if (radio.RegOpMode.bits.LongRangeMode)
dudmuck 0:9c2b09ecb20f 942 printf("cad");
dudmuck 0:9c2b09ecb20f 943 else
dudmuck 0:9c2b09ecb20f 944 printf("-7-");
dudmuck 0:9c2b09ecb20f 945 break; // todo: different lora/fsk
dudmuck 0:9c2b09ecb20f 946 }
dudmuck 0:9c2b09ecb20f 947 }
dudmuck 0:9c2b09ecb20f 948
dudmuck 0:9c2b09ecb20f 949 void
dudmuck 0:9c2b09ecb20f 950 printPa()
dudmuck 0:9c2b09ecb20f 951 {
dudmuck 2:fb41d1c4b299 952 RegPdsTrim1_t pds_trim;
dudmuck 2:fb41d1c4b299 953
dudmuck 15:cdc215392e60 954 pds_trim.octet = radio.read_reg(REG_PDSTRIM1_SX1272);
dudmuck 2:fb41d1c4b299 955 printf(" txdac=%.1fuA", 2.5 + (pds_trim.bits.prog_txdac * 0.625));
dudmuck 0:9c2b09ecb20f 956 radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG);
dudmuck 0:9c2b09ecb20f 957 if (radio.RegPaConfig.bits.PaSelect) {
dudmuck 2:fb41d1c4b299 958 //float output_dBm = 17 - (15-radio.RegPaConfig.bits.OutputPower);
dudmuck 2:fb41d1c4b299 959 float output_dBm = (pds_trim.bits.prog_txdac+13) - (15-radio.RegPaConfig.bits.OutputPower);
dudmuck 0:9c2b09ecb20f 960 printf(" PABOOST OutputPower=%.1fdBm", output_dBm);
dudmuck 0:9c2b09ecb20f 961 } else {
dudmuck 0:9c2b09ecb20f 962 float pmax = (0.6*radio.RegPaConfig.bits.MaxPower) + 10.8;
dudmuck 0:9c2b09ecb20f 963 float output_dBm = pmax - (15-radio.RegPaConfig.bits.OutputPower);
dudmuck 0:9c2b09ecb20f 964 printf(" RFO pmax=%.1fdBm OutputPower=%.1fdBm", pmax, output_dBm);
dudmuck 0:9c2b09ecb20f 965 }
dudmuck 0:9c2b09ecb20f 966 }
dudmuck 0:9c2b09ecb20f 967
dudmuck 0:9c2b09ecb20f 968 void /* things always present, whether lora or fsk */
dudmuck 0:9c2b09ecb20f 969 common_print_status()
dudmuck 0:9c2b09ecb20f 970 {
dudmuck 2:fb41d1c4b299 971 printf("PD2:%d version:0x%02x %.3fMHz ", pd2.read(), radio.read_reg(REG_VERSION), radio.get_frf_MHz());
dudmuck 0:9c2b09ecb20f 972 printOpMode();
dudmuck 0:9c2b09ecb20f 973
dudmuck 0:9c2b09ecb20f 974 printPa();
dudmuck 0:9c2b09ecb20f 975
dudmuck 0:9c2b09ecb20f 976 radio.RegOcp.octet = radio.read_reg(REG_OCP);
dudmuck 0:9c2b09ecb20f 977 if (radio.RegOcp.bits.OcpOn) {
dudmuck 0:9c2b09ecb20f 978 int imax = 0;
dudmuck 0:9c2b09ecb20f 979 if (radio.RegOcp.bits.OcpTrim < 16)
dudmuck 13:a22debeee855 980 imax = (5 * radio.RegOcp.bits.OcpTrim) + 45;
dudmuck 0:9c2b09ecb20f 981 else if (radio.RegOcp.bits.OcpTrim < 28)
dudmuck 13:a22debeee855 982 imax = (10 * radio.RegOcp.bits.OcpTrim) - 30;
dudmuck 0:9c2b09ecb20f 983 else
dudmuck 0:9c2b09ecb20f 984 imax = 240;
dudmuck 0:9c2b09ecb20f 985 printf(" OcpOn %dmA ", imax);
dudmuck 0:9c2b09ecb20f 986 } else
dudmuck 0:9c2b09ecb20f 987 printf(" OcpOFF ");
dudmuck 0:9c2b09ecb20f 988
dudmuck 0:9c2b09ecb20f 989 printf("\r\n");
dudmuck 2:fb41d1c4b299 990
dudmuck 2:fb41d1c4b299 991 if (per_en) {
dudmuck 7:6d5f193b6c2f 992 printf("per_tx_delay:%f\r\n", per_tx_delay);
dudmuck 7:6d5f193b6c2f 993 printf("PER device ID:%d\r\n", per_id);
dudmuck 2:fb41d1c4b299 994 }
dudmuck 12:6afe8fed5385 995 printf("GPS enabled:%d ", gps.enabled());
dudmuck 12:6afe8fed5385 996 if (mote_version == MOTE_V2)
dudmuck 12:6afe8fed5385 997 printf("MOTE_V2\r\n");
dudmuck 12:6afe8fed5385 998 else if (mote_version == MOTE_V3)
dudmuck 12:6afe8fed5385 999 printf("MOTE_V3\r\n");
dudmuck 0:9c2b09ecb20f 1000 }
dudmuck 0:9c2b09ecb20f 1001
dudmuck 2:fb41d1c4b299 1002 void per_cb()
dudmuck 2:fb41d1c4b299 1003 {
dudmuck 2:fb41d1c4b299 1004 int i;
dudmuck 2:fb41d1c4b299 1005
dudmuck 2:fb41d1c4b299 1006 PacketTxCnt++;
dudmuck 3:8924027a8933 1007
dudmuck 2:fb41d1c4b299 1008 radio.tx_buf[0] = per_id;
dudmuck 2:fb41d1c4b299 1009 radio.tx_buf[1] = PacketTxCnt >> 24;
dudmuck 2:fb41d1c4b299 1010 radio.tx_buf[2] = PacketTxCnt >> 16;
dudmuck 2:fb41d1c4b299 1011 radio.tx_buf[3] = PacketTxCnt >> 8;
dudmuck 2:fb41d1c4b299 1012 radio.tx_buf[4] = PacketTxCnt;
dudmuck 2:fb41d1c4b299 1013 radio.tx_buf[5] = 'P';
dudmuck 2:fb41d1c4b299 1014 radio.tx_buf[6] = 'E';
dudmuck 2:fb41d1c4b299 1015 radio.tx_buf[7] = 'R';
dudmuck 2:fb41d1c4b299 1016 radio.tx_buf[8] = 0;
dudmuck 2:fb41d1c4b299 1017 for (i = 0; i < 8; i++)
dudmuck 2:fb41d1c4b299 1018 radio.tx_buf[8] += radio.tx_buf[i];
dudmuck 2:fb41d1c4b299 1019 red_led = LED_ON;
dudmuck 15:cdc215392e60 1020
dudmuck 15:cdc215392e60 1021 if (radio.RegOpMode.bits.LongRangeMode) {
dudmuck 15:cdc215392e60 1022 lora.start_tx(lora.RegPayloadLength);
dudmuck 15:cdc215392e60 1023 } else {
dudmuck 15:cdc215392e60 1024 fsk.start_tx(9);
dudmuck 15:cdc215392e60 1025 }
dudmuck 2:fb41d1c4b299 1026 }
dudmuck 2:fb41d1c4b299 1027
dudmuck 3:8924027a8933 1028
dudmuck 3:8924027a8933 1029
dudmuck 2:fb41d1c4b299 1030 void dio3_cb()
dudmuck 2:fb41d1c4b299 1031 {
dudmuck 6:8defa260bc10 1032 //green_led = LED_ON;
dudmuck 2:fb41d1c4b299 1033 clear_valid_header = true;
dudmuck 2:fb41d1c4b299 1034 }
dudmuck 2:fb41d1c4b299 1035
dudmuck 5:329557e0625c 1036 bool lora_sync_sweep_hi;
dudmuck 5:329557e0625c 1037 uint8_t lora_sync_byte;
dudmuck 5:329557e0625c 1038 void lora_sync_sweep()
dudmuck 5:329557e0625c 1039 {
dudmuck 5:329557e0625c 1040 if (abort_key) {
dudmuck 5:329557e0625c 1041 abort_key = false;
dudmuck 5:329557e0625c 1042 return;
dudmuck 5:329557e0625c 1043 }
dudmuck 5:329557e0625c 1044
dudmuck 5:329557e0625c 1045 hop_timeout.attach(&lora_sync_sweep, 0.1);
dudmuck 5:329557e0625c 1046 if (lora_sync_sweep_hi) {
dudmuck 5:329557e0625c 1047 lora_sync_byte += 0x10;
dudmuck 5:329557e0625c 1048 } else {
dudmuck 5:329557e0625c 1049 if ((lora_sync_byte & 0x0f) == 0x0f)
dudmuck 5:329557e0625c 1050 lora_sync_byte &= 0xf0;
dudmuck 5:329557e0625c 1051 else
dudmuck 5:329557e0625c 1052 lora_sync_byte++;
dudmuck 5:329557e0625c 1053 }
dudmuck 5:329557e0625c 1054 printf("%02x\r\n", lora_sync_byte);
dudmuck 5:329557e0625c 1055 radio.write_reg(REG_LR_SYNC_BYTE, lora_sync_byte);
dudmuck 5:329557e0625c 1056
dudmuck 5:329557e0625c 1057 lora.start_tx(lora.RegPayloadLength);
dudmuck 5:329557e0625c 1058 }
dudmuck 3:8924027a8933 1059
dudmuck 13:a22debeee855 1060 #ifdef FCC_TEST
dudmuck 3:8924027a8933 1061 float hop_MHz;
dudmuck 3:8924027a8933 1062 bool new_hop;
dudmuck 3:8924027a8933 1063 uint8_t hop_ofs = 0;
dudmuck 3:8924027a8933 1064
dudmuck 3:8924027a8933 1065 void hop_cb()
dudmuck 3:8924027a8933 1066 {
dudmuck 3:8924027a8933 1067 static uint8_t prev_ofs;
dudmuck 3:8924027a8933 1068 int shift;
dudmuck 3:8924027a8933 1069
dudmuck 3:8924027a8933 1070 radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
dudmuck 3:8924027a8933 1071 if (radio.RegOpMode.bits.Mode == RF_OPMODE_TRANSMITTER)
dudmuck 3:8924027a8933 1072 hop_timeout.attach(&hop_cb, 0.4);
dudmuck 3:8924027a8933 1073 else
dudmuck 3:8924027a8933 1074 return;
dudmuck 3:8924027a8933 1075
dudmuck 3:8924027a8933 1076 do {
dudmuck 3:8924027a8933 1077 shift = rand() & 0x1f;
dudmuck 3:8924027a8933 1078 if (hop_type == HOP_TYPE_64CH)
dudmuck 3:8924027a8933 1079 hop_ofs = (rand() >> shift) & 0x3f;
dudmuck 3:8924027a8933 1080 else if (hop_type == HOP_TYPE_4CH)
dudmuck 3:8924027a8933 1081 hop_ofs = (rand() >> shift) & 0x3;
dudmuck 3:8924027a8933 1082 } while (hop_ofs == prev_ofs);
dudmuck 3:8924027a8933 1083
dudmuck 3:8924027a8933 1084 prev_ofs = hop_ofs;
dudmuck 3:8924027a8933 1085 hop_MHz = hop_base_MHz + (hop_ofs * hop_step_MHz);
dudmuck 3:8924027a8933 1086 new_hop = true;
dudmuck 3:8924027a8933 1087
dudmuck 3:8924027a8933 1088 radio.set_frf_MHz(hop_MHz);
dudmuck 3:8924027a8933 1089
dudmuck 3:8924027a8933 1090 radio.set_opmode(RF_OPMODE_STANDBY);
dudmuck 3:8924027a8933 1091 radio.set_opmode(RF_OPMODE_TRANSMITTER);
dudmuck 3:8924027a8933 1092
dudmuck 12:6afe8fed5385 1093 if (pc_7.read())
dudmuck 12:6afe8fed5385 1094 pc_7 = 0;
dudmuck 3:8924027a8933 1095 else
dudmuck 12:6afe8fed5385 1096 pc_7 = 1;
dudmuck 3:8924027a8933 1097 }
dudmuck 13:a22debeee855 1098 #endif /* #ifdef FCC_TEST */
dudmuck 3:8924027a8933 1099
dudmuck 0:9c2b09ecb20f 1100 void print_rx_buf(int len)
dudmuck 0:9c2b09ecb20f 1101 {
dudmuck 0:9c2b09ecb20f 1102 int i;
dudmuck 0:9c2b09ecb20f 1103
dudmuck 0:9c2b09ecb20f 1104 printf("000:");
dudmuck 0:9c2b09ecb20f 1105 for (i = 0; i < len; i++) {
dudmuck 0:9c2b09ecb20f 1106 //printf("(%d)%02x ", i % 16, rx_buf[i]);
dudmuck 0:9c2b09ecb20f 1107 printf("%02x ", radio.rx_buf[i]);
dudmuck 0:9c2b09ecb20f 1108 if (i % 16 == 15 && i != len-1)
dudmuck 0:9c2b09ecb20f 1109 printf("\r\n%03d:", i+1);
dudmuck 0:9c2b09ecb20f 1110
dudmuck 0:9c2b09ecb20f 1111 }
dudmuck 0:9c2b09ecb20f 1112 printf("\r\n");
dudmuck 0:9c2b09ecb20f 1113 }
dudmuck 0:9c2b09ecb20f 1114
dudmuck 8:e3da1dc7b628 1115 void print_rx_verbose(uint8_t dlen)
dudmuck 2:fb41d1c4b299 1116 {
dudmuck 2:fb41d1c4b299 1117 float dbm;
dudmuck 2:fb41d1c4b299 1118 printLoraIrqs_(false);
dudmuck 2:fb41d1c4b299 1119 if (lora.RegHopPeriod > 0) {
dudmuck 2:fb41d1c4b299 1120 lora.RegHopChannel.octet = radio.read_reg(REG_LR_HOPCHANNEL);
dudmuck 2:fb41d1c4b299 1121 printf("HopCH:%d ", lora.RegHopChannel.bits.FhssPresentChannel);
dudmuck 2:fb41d1c4b299 1122 }
dudmuck 8:e3da1dc7b628 1123 printf("%dHz ", lora.get_freq_error_Hz());
dudmuck 2:fb41d1c4b299 1124 lora_printCodingRate(true); // true: of received packet
dudmuck 2:fb41d1c4b299 1125 dbm = lora.get_pkt_rssi();
dudmuck 2:fb41d1c4b299 1126 printf(" crc%s %.1fdB %.1fdBm\r\n",
dudmuck 2:fb41d1c4b299 1127 lora.RegHopChannel.bits.RxPayloadCrcOn ? "On" : "OFF",
dudmuck 2:fb41d1c4b299 1128 lora.RegPktSnrValue / 4.0,
dudmuck 2:fb41d1c4b299 1129 dbm
dudmuck 2:fb41d1c4b299 1130 );
dudmuck 8:e3da1dc7b628 1131 print_rx_buf(/*lora.RegRxNbBytes*/dlen);
dudmuck 8:e3da1dc7b628 1132
dudmuck 2:fb41d1c4b299 1133 }
dudmuck 15:cdc215392e60 1134
dudmuck 15:cdc215392e60 1135 int per_parse_rx(uint8_t len)
dudmuck 15:cdc215392e60 1136 {
dudmuck 15:cdc215392e60 1137 if (len > 8 && radio.rx_buf[5] == 'P' && radio.rx_buf[6] == 'E' && radio.rx_buf[7] == 'R') {
dudmuck 15:cdc215392e60 1138 int i;
dudmuck 15:cdc215392e60 1139 float per;
dudmuck 15:cdc215392e60 1140
dudmuck 15:cdc215392e60 1141 /* this is PER packet */
dudmuck 15:cdc215392e60 1142 uint32_t PacketRxSequence = (radio.rx_buf[1] << 24) | (radio.rx_buf[2] << 16) | (radio.rx_buf[3] << 8) | radio.rx_buf[4];
dudmuck 15:cdc215392e60 1143 PacketPerOkCnt++;
dudmuck 15:cdc215392e60 1144
dudmuck 15:cdc215392e60 1145 if( PacketRxSequence <= PacketRxSequencePrev )
dudmuck 15:cdc215392e60 1146 { // Sequence went back => resynchronization
dudmuck 15:cdc215392e60 1147 // dont count missed packets this time
dudmuck 15:cdc215392e60 1148 i = 0;
dudmuck 15:cdc215392e60 1149 }
dudmuck 15:cdc215392e60 1150 else
dudmuck 15:cdc215392e60 1151 {
dudmuck 15:cdc215392e60 1152 // determine number of missed packets
dudmuck 15:cdc215392e60 1153 i = PacketRxSequence - PacketRxSequencePrev - 1;
dudmuck 15:cdc215392e60 1154 }
dudmuck 15:cdc215392e60 1155
dudmuck 15:cdc215392e60 1156 red_led = !red_led.read();
dudmuck 15:cdc215392e60 1157 // be ready for the next
dudmuck 15:cdc215392e60 1158 PacketRxSequencePrev = PacketRxSequence;
dudmuck 15:cdc215392e60 1159 // increment 'missed' counter for the RX session
dudmuck 15:cdc215392e60 1160 PacketPerKoCnt += i;
dudmuck 15:cdc215392e60 1161 per = ( 1.0 - ( float )PacketPerOkCnt / ( float )( PacketPerOkCnt + PacketPerKoCnt ) ) * 100.0;
Wayne Roberts 17:f73dbeca8736 1162 printf("%" PRIu32 ", ok=%" PRIu32 " missed=%" PRIu32 " normal=%" PRIu32 " per:%.3f ", PacketRxSequence, PacketPerOkCnt, PacketPerKoCnt, PacketNormalCnt, per);
dudmuck 15:cdc215392e60 1163 if (radio.RegOpMode.bits.LongRangeMode)
dudmuck 15:cdc215392e60 1164 printf("pkt:%ddBm, snr:%.1fdB, %ddBm\r\n", lora.get_pkt_rssi(), lora.RegPktSnrValue / 4.0, lora.get_current_rssi());
dudmuck 15:cdc215392e60 1165 else {
dudmuck 15:cdc215392e60 1166 wait_us(10000);
dudmuck 15:cdc215392e60 1167 printf(" -%.1fdBm\r\n", radio.read_reg(REG_FSK_RSSIVALUE) / 2.0);
dudmuck 15:cdc215392e60 1168 }
dudmuck 15:cdc215392e60 1169
dudmuck 15:cdc215392e60 1170 return 1;
dudmuck 15:cdc215392e60 1171 } else {
dudmuck 15:cdc215392e60 1172 return 0;
dudmuck 15:cdc215392e60 1173 }
dudmuck 15:cdc215392e60 1174 }
dudmuck 2:fb41d1c4b299 1175
dudmuck 0:9c2b09ecb20f 1176 void
dudmuck 0:9c2b09ecb20f 1177 service_radio()
dudmuck 0:9c2b09ecb20f 1178 {
dudmuck 0:9c2b09ecb20f 1179 service_action_e act;
dudmuck 15:cdc215392e60 1180 static uint8_t rssi = 0;
dudmuck 0:9c2b09ecb20f 1181
dudmuck 0:9c2b09ecb20f 1182 if (radio.RegOpMode.bits.LongRangeMode) {
dudmuck 0:9c2b09ecb20f 1183
dudmuck 0:9c2b09ecb20f 1184 act = lora.service();
dudmuck 0:9c2b09ecb20f 1185
dudmuck 0:9c2b09ecb20f 1186 switch (act) {
dudmuck 0:9c2b09ecb20f 1187 case SERVICE_READ_FIFO:
dudmuck 6:8defa260bc10 1188 //green_led = LED_OFF; // ValidHeader indication
dudmuck 4:1efa46cff1b3 1189
dudmuck 2:fb41d1c4b299 1190 if (app == APP_NONE) {
dudmuck 2:fb41d1c4b299 1191 if (per_en) {
dudmuck 15:cdc215392e60 1192 if (!per_parse_rx(lora.RegRxNbBytes)) {
dudmuck 2:fb41d1c4b299 1193 PacketNormalCnt++;
dudmuck 15:cdc215392e60 1194 print_rx_verbose(lora.RegRxNbBytes);
dudmuck 2:fb41d1c4b299 1195 }
dudmuck 15:cdc215392e60 1196 } else
dudmuck 4:1efa46cff1b3 1197 print_rx_verbose(lora.RegRxNbBytes);
dudmuck 15:cdc215392e60 1198 fflush(stdout);
dudmuck 0:9c2b09ecb20f 1199 } else if (app == APP_CHAT) {
dudmuck 0:9c2b09ecb20f 1200 if (lora.RegHopChannel.bits.RxPayloadCrcOn) {
dudmuck 0:9c2b09ecb20f 1201 if (lora.RegIrqFlags.bits.PayloadCrcError)
dudmuck 0:9c2b09ecb20f 1202 printf("crcError\r\n");
dudmuck 0:9c2b09ecb20f 1203 else {
dudmuck 0:9c2b09ecb20f 1204 int n = lora.RegRxNbBytes;
dudmuck 0:9c2b09ecb20f 1205 radio.rx_buf[n++] = '\r';
dudmuck 0:9c2b09ecb20f 1206 radio.rx_buf[n++] = '\n';
dudmuck 0:9c2b09ecb20f 1207 radio.rx_buf[n] = 0; // null terminate
dudmuck 0:9c2b09ecb20f 1208 printf((char *)radio.rx_buf);
dudmuck 0:9c2b09ecb20f 1209 }
dudmuck 0:9c2b09ecb20f 1210 } else
dudmuck 0:9c2b09ecb20f 1211 printf("crcOff\r\n");
dudmuck 0:9c2b09ecb20f 1212
dudmuck 0:9c2b09ecb20f 1213 // clear Irq flags
dudmuck 0:9c2b09ecb20f 1214 radio.write_reg(REG_LR_IRQFLAGS, lora.RegIrqFlags.octet);
dudmuck 0:9c2b09ecb20f 1215 // should still be in receive mode
dudmuck 0:9c2b09ecb20f 1216 }
dudmuck 0:9c2b09ecb20f 1217 break;
dudmuck 0:9c2b09ecb20f 1218 case SERVICE_TX_DONE:
dudmuck 2:fb41d1c4b299 1219 red_led = LED_OFF;
dudmuck 5:329557e0625c 1220 hdr_fem_csd = 0; //debug
dudmuck 0:9c2b09ecb20f 1221 if (app == APP_CHAT) {
Wayne Roberts 17:f73dbeca8736 1222 lora.start_rx(RF_OPMODE_RECEIVER);
dudmuck 2:fb41d1c4b299 1223 } else if (per_en)
dudmuck 2:fb41d1c4b299 1224 per_timeout.attach(&per_cb, per_tx_delay); // start next TX
dudmuck 6:8defa260bc10 1225 else if (rx_after_tx)
Wayne Roberts 17:f73dbeca8736 1226 lora.start_rx(RF_OPMODE_RECEIVER);
dudmuck 0:9c2b09ecb20f 1227 break;
dudmuck 0:9c2b09ecb20f 1228 case SERVICE_ERROR:
dudmuck 0:9c2b09ecb20f 1229 printf("error\r\n");
dudmuck 0:9c2b09ecb20f 1230 break;
Wayne Roberts 17:f73dbeca8736 1231 case SERVICE_NONE:
Wayne Roberts 17:f73dbeca8736 1232 break;
dudmuck 0:9c2b09ecb20f 1233 } // ...switch (act)
dudmuck 0:9c2b09ecb20f 1234 } else {
dudmuck 0:9c2b09ecb20f 1235 /* FSK: */
dudmuck 0:9c2b09ecb20f 1236 act = fsk.service();
dudmuck 0:9c2b09ecb20f 1237
dudmuck 0:9c2b09ecb20f 1238 switch (act) {
dudmuck 0:9c2b09ecb20f 1239 case SERVICE_READ_FIFO:
dudmuck 0:9c2b09ecb20f 1240 if (app == APP_CHAT) {
dudmuck 0:9c2b09ecb20f 1241 int n = fsk.rx_buf_length;
dudmuck 0:9c2b09ecb20f 1242 radio.rx_buf[n++] = '\r';
dudmuck 0:9c2b09ecb20f 1243 radio.rx_buf[n++] = '\n';
dudmuck 0:9c2b09ecb20f 1244 radio.rx_buf[n] = 0; // null terminate
dudmuck 0:9c2b09ecb20f 1245 printf((char *)radio.rx_buf);
dudmuck 0:9c2b09ecb20f 1246 } else {
Wayne Roberts 17:f73dbeca8736 1247 if (fsk.RegRxConfig.bits.AfcAutoOn) {
dudmuck 15:cdc215392e60 1248 printf("%dHz ", (int)(FREQ_STEP_HZ * fsk.RegAfcValue));
dudmuck 15:cdc215392e60 1249 if (rssi != 0) {
dudmuck 15:cdc215392e60 1250 printf("pkt:-%.1fdBm ", rssi / 2.0);
dudmuck 15:cdc215392e60 1251 rssi = 0;
Wayne Roberts 17:f73dbeca8736 1252 }
Wayne Roberts 17:f73dbeca8736 1253 }
dudmuck 15:cdc215392e60 1254 if (per_en) {
dudmuck 15:cdc215392e60 1255 if (!per_parse_rx(fsk.rx_buf_length)) {
dudmuck 15:cdc215392e60 1256 PacketNormalCnt++;
dudmuck 15:cdc215392e60 1257 print_rx_buf(fsk.rx_buf_length);
dudmuck 15:cdc215392e60 1258 }
dudmuck 15:cdc215392e60 1259 } else {
dudmuck 15:cdc215392e60 1260 print_rx_buf(fsk.rx_buf_length);
dudmuck 15:cdc215392e60 1261 }
dudmuck 15:cdc215392e60 1262 fflush(stdout);
dudmuck 0:9c2b09ecb20f 1263 }
dudmuck 0:9c2b09ecb20f 1264 break;
dudmuck 0:9c2b09ecb20f 1265 case SERVICE_TX_DONE:
dudmuck 0:9c2b09ecb20f 1266 if (app == APP_CHAT) {
dudmuck 0:9c2b09ecb20f 1267 fsk.start_rx();
dudmuck 15:cdc215392e60 1268 } else if (per_en) {
dudmuck 15:cdc215392e60 1269 per_timeout.attach(&per_cb, per_tx_delay); // start next TX
dudmuck 0:9c2b09ecb20f 1270 }
dudmuck 0:9c2b09ecb20f 1271 break;
Wayne Roberts 17:f73dbeca8736 1272 case SERVICE_ERROR:
Wayne Roberts 17:f73dbeca8736 1273 case SERVICE_NONE:
Wayne Roberts 17:f73dbeca8736 1274 break;
dudmuck 0:9c2b09ecb20f 1275 } // ...switch (act)
dudmuck 15:cdc215392e60 1276
dudmuck 15:cdc215392e60 1277 /* fsk sync address */
dudmuck 15:cdc215392e60 1278 if (dio2 && radio.RegDioMapping1.bits.Dio2Mapping == 3) {
dudmuck 15:cdc215392e60 1279 // syncAdrs when in RX mode
dudmuck 15:cdc215392e60 1280 if (rssi == 0) {
dudmuck 15:cdc215392e60 1281 rssi = radio.read_reg(REG_FSK_RSSIVALUE);
dudmuck 15:cdc215392e60 1282 }
dudmuck 15:cdc215392e60 1283 }
dudmuck 15:cdc215392e60 1284
dudmuck 0:9c2b09ecb20f 1285 }
dudmuck 2:fb41d1c4b299 1286
dudmuck 2:fb41d1c4b299 1287 if (clear_valid_header) {
dudmuck 2:fb41d1c4b299 1288 RegIrqFlags_t irqs;
dudmuck 2:fb41d1c4b299 1289 irqs.octet = 0;
dudmuck 2:fb41d1c4b299 1290 irqs.bits.ValidHeader = 1;
dudmuck 2:fb41d1c4b299 1291 radio.write_reg(REG_LR_IRQFLAGS, irqs.octet);
dudmuck 2:fb41d1c4b299 1292 clear_valid_header = false;
dudmuck 2:fb41d1c4b299 1293 }
dudmuck 3:8924027a8933 1294
dudmuck 13:a22debeee855 1295 #ifdef FCC_TEST
dudmuck 3:8924027a8933 1296 if (new_hop) {
dudmuck 3:8924027a8933 1297 new_hop = false;
dudmuck 7:6d5f193b6c2f 1298 printf("%02d %.1f\r\n", hop_ofs, hop_MHz);
dudmuck 3:8924027a8933 1299 }
dudmuck 13:a22debeee855 1300 #endif /* #ifdef FCC_TEST */
dudmuck 0:9c2b09ecb20f 1301 }
dudmuck 0:9c2b09ecb20f 1302
dudmuck 6:8defa260bc10 1303 void
dudmuck 6:8defa260bc10 1304 gps_service()
dudmuck 6:8defa260bc10 1305 {
dudmuck 6:8defa260bc10 1306 gps.service();
dudmuck 6:8defa260bc10 1307 if (gps.enabled()) {
dudmuck 6:8defa260bc10 1308 if (gps.LatitudeBinary != 0) {
dudmuck 6:8defa260bc10 1309 gps.LatitudeBinary = 0;
dudmuck 14:35e7156e73ff 1310 printf("gps long:%f, lat:%f Vbat:%.2fV\r\n", gps.Longitude, gps.Latitude, ain_bat->read()*AIN_VREF*AIN_VBAT_DIV);
dudmuck 6:8defa260bc10 1311 }
dudmuck 6:8defa260bc10 1312 }
dudmuck 6:8defa260bc10 1313 }
dudmuck 6:8defa260bc10 1314
dudmuck 14:35e7156e73ff 1315 RCC_OscInitTypeDef prev_RCC_OscInitStruct;
dudmuck 14:35e7156e73ff 1316
dudmuck 10:a3e2c558c003 1317 void all_peripherals_off()
dudmuck 10:a3e2c558c003 1318 {
dudmuck 10:a3e2c558c003 1319 // TODO: PD2 low, has pulldown
dudmuck 14:35e7156e73ff 1320
dudmuck 14:35e7156e73ff 1321 HAL_RCC_GetOscConfig(&prev_RCC_OscInitStruct);
dudmuck 14:35e7156e73ff 1322 /*printf("hsiState:%d\r\n", osc_init.HSIState);
dudmuck 14:35e7156e73ff 1323 wait(0.05);*/
dudmuck 10:a3e2c558c003 1324
dudmuck 10:a3e2c558c003 1325 #ifndef USE_DEBUGGER
dudmuck 10:a3e2c558c003 1326 /* PA13 to undriven JTMS/SWDIO pin (from AF0 to GPIO), and PA2 */
dudmuck 10:a3e2c558c003 1327 GPIOA->MODER &= 0xf7ffffdf;
dudmuck 10:a3e2c558c003 1328 GPIOB->MODER &= 0xffffdfff; // PB6 UART_TX to input
dudmuck 10:a3e2c558c003 1329 #endif
dudmuck 10:a3e2c558c003 1330
dudmuck 10:a3e2c558c003 1331 sx9500.set_active(false);
dudmuck 10:a3e2c558c003 1332 mpl3115a2.SetModeStandby();
dudmuck 10:a3e2c558c003 1333 mma8451q.set_active(0);
dudmuck 10:a3e2c558c003 1334 gps.enable(false);
dudmuck 10:a3e2c558c003 1335
dudmuck 10:a3e2c558c003 1336 if (GPIOB->ODR & 0x1000) { // if SX1272_NSS (PB12) wasnt forced low
dudmuck 10:a3e2c558c003 1337 radio.set_opmode(RF_OPMODE_SLEEP);
dudmuck 10:a3e2c558c003 1338 }
dudmuck 10:a3e2c558c003 1339 }
dudmuck 10:a3e2c558c003 1340
dudmuck 14:35e7156e73ff 1341
dudmuck 14:35e7156e73ff 1342
dudmuck 10:a3e2c558c003 1343 void restore_from_sleep()
dudmuck 10:a3e2c558c003 1344 {
dudmuck 14:35e7156e73ff 1345 RCC_OscInitTypeDef osc_init;
dudmuck 10:a3e2c558c003 1346 #ifndef USE_DEBUGGER
dudmuck 10:a3e2c558c003 1347 /* PA13 back to JTMS/SWDIO pin (from GPIO to AF0), and PA2 */
dudmuck 10:a3e2c558c003 1348 GPIOA->MODER |= 0x08000020;
dudmuck 10:a3e2c558c003 1349 GPIOB->MODER |= 0x00002000; // PB6 input to UART_TX
dudmuck 10:a3e2c558c003 1350 #endif
dudmuck 14:35e7156e73ff 1351
dudmuck 14:35e7156e73ff 1352 if (prev_RCC_OscInitStruct.HSIState == RCC_HSI_ON) {
dudmuck 14:35e7156e73ff 1353 HAL_RCC_GetOscConfig(&osc_init);
dudmuck 14:35e7156e73ff 1354 if (osc_init.HSIState != RCC_HSI_ON) {
dudmuck 14:35e7156e73ff 1355 printf("hsi-restore\r\n");
dudmuck 14:35e7156e73ff 1356 // Enable the HSI (to clock the ADC)
dudmuck 14:35e7156e73ff 1357 osc_init.OscillatorType = RCC_OSCILLATORTYPE_HSI;
dudmuck 14:35e7156e73ff 1358 osc_init.HSIState = RCC_HSI_ON;
dudmuck 14:35e7156e73ff 1359 osc_init.PLL.PLLState = RCC_PLL_NONE;
dudmuck 14:35e7156e73ff 1360 HAL_RCC_OscConfig(&osc_init);
dudmuck 14:35e7156e73ff 1361 }
dudmuck 14:35e7156e73ff 1362 }
dudmuck 10:a3e2c558c003 1363 }
dudmuck 10:a3e2c558c003 1364
dudmuck 0:9c2b09ecb20f 1365 int get_kbd_str(char* buf, int size)
dudmuck 0:9c2b09ecb20f 1366 {
dudmuck 0:9c2b09ecb20f 1367 char c;
dudmuck 0:9c2b09ecb20f 1368 int i;
dudmuck 0:9c2b09ecb20f 1369 static int prev_len;
dudmuck 0:9c2b09ecb20f 1370
dudmuck 0:9c2b09ecb20f 1371 for (i = 0;;) {
dudmuck 10:a3e2c558c003 1372
dudmuck 0:9c2b09ecb20f 1373 if (pc.readable()) {
dudmuck 0:9c2b09ecb20f 1374 c = pc.getc();
dudmuck 3:8924027a8933 1375 if (c == 8) { // backspace
dudmuck 3:8924027a8933 1376 if (i > 0) {
dudmuck 3:8924027a8933 1377 pc.putc(8);
dudmuck 3:8924027a8933 1378 pc.putc(' ');
dudmuck 3:8924027a8933 1379 pc.putc(8);
dudmuck 3:8924027a8933 1380 i--;
dudmuck 3:8924027a8933 1381 }
dudmuck 0:9c2b09ecb20f 1382 } else if (c == '\r') {
dudmuck 0:9c2b09ecb20f 1383 if (i == 0) {
dudmuck 0:9c2b09ecb20f 1384 return prev_len; // repeat previous
dudmuck 0:9c2b09ecb20f 1385 } else {
dudmuck 0:9c2b09ecb20f 1386 buf[i] = 0; // null terminate
dudmuck 0:9c2b09ecb20f 1387 prev_len = i;
dudmuck 0:9c2b09ecb20f 1388 return i;
dudmuck 0:9c2b09ecb20f 1389 }
dudmuck 0:9c2b09ecb20f 1390 } else if (c == 3) {
dudmuck 0:9c2b09ecb20f 1391 // ctrl-C abort
dudmuck 2:fb41d1c4b299 1392 per_en = false;
dudmuck 5:329557e0625c 1393 abort_key = true;
dudmuck 0:9c2b09ecb20f 1394 return -1;
dudmuck 0:9c2b09ecb20f 1395 } else if (i < size) {
dudmuck 0:9c2b09ecb20f 1396 buf[i++] = c;
dudmuck 0:9c2b09ecb20f 1397 pc.putc(c);
dudmuck 0:9c2b09ecb20f 1398 }
dudmuck 0:9c2b09ecb20f 1399 } else {
dudmuck 10:a3e2c558c003 1400 if (service_en) {
dudmuck 10:a3e2c558c003 1401 service_radio();
dudmuck 10:a3e2c558c003 1402 }
dudmuck 6:8defa260bc10 1403 gps_service();
dudmuck 6:8defa260bc10 1404 sx9500.service();
dudmuck 6:8defa260bc10 1405 mma8451q.service();
dudmuck 6:8defa260bc10 1406 mpl3115a2.service();
dudmuck 10:a3e2c558c003 1407
dudmuck 0:9c2b09ecb20f 1408 }
dudmuck 0:9c2b09ecb20f 1409 } // ...for()
dudmuck 0:9c2b09ecb20f 1410 }
dudmuck 0:9c2b09ecb20f 1411
dudmuck 0:9c2b09ecb20f 1412 void
dudmuck 0:9c2b09ecb20f 1413 console_chat()
dudmuck 0:9c2b09ecb20f 1414 {
dudmuck 0:9c2b09ecb20f 1415 int i, len = get_kbd_str(pcbuf, sizeof(pcbuf));
dudmuck 0:9c2b09ecb20f 1416 if (len < 0) {
dudmuck 0:9c2b09ecb20f 1417 printf("chat abort\r\n");
dudmuck 0:9c2b09ecb20f 1418 app = APP_NONE;
dudmuck 0:9c2b09ecb20f 1419 return;
dudmuck 0:9c2b09ecb20f 1420 } else {
dudmuck 0:9c2b09ecb20f 1421 for (i = 0; i < len; i++)
dudmuck 0:9c2b09ecb20f 1422 radio.tx_buf[i] = pcbuf[i];
dudmuck 0:9c2b09ecb20f 1423 if (radio.RegOpMode.bits.LongRangeMode) {
dudmuck 0:9c2b09ecb20f 1424 lora.RegPayloadLength = len;
dudmuck 0:9c2b09ecb20f 1425 radio.write_reg(REG_LR_PAYLOADLENGTH, lora.RegPayloadLength);
dudmuck 2:fb41d1c4b299 1426 red_led = LED_ON;
dudmuck 0:9c2b09ecb20f 1427 lora.start_tx(len);
dudmuck 0:9c2b09ecb20f 1428 } else {
dudmuck 0:9c2b09ecb20f 1429 fsk.start_tx(len);
dudmuck 0:9c2b09ecb20f 1430 }
dudmuck 0:9c2b09ecb20f 1431 printf("\r\n");
dudmuck 0:9c2b09ecb20f 1432 }
dudmuck 0:9c2b09ecb20f 1433 }
dudmuck 0:9c2b09ecb20f 1434
dudmuck 4:1efa46cff1b3 1435 uint8_t last_RxCurrentAddr;
dudmuck 4:1efa46cff1b3 1436 uint8_t last_RxNbBytes;
dudmuck 10:a3e2c558c003 1437
dudmuck 10:a3e2c558c003 1438
dudmuck 10:a3e2c558c003 1439
dudmuck 3:8924027a8933 1440
dudmuck 0:9c2b09ecb20f 1441 void
dudmuck 0:9c2b09ecb20f 1442 console()
dudmuck 0:9c2b09ecb20f 1443 {
dudmuck 0:9c2b09ecb20f 1444 int len, i;
dudmuck 0:9c2b09ecb20f 1445 uint32_t ui;
dudmuck 0:9c2b09ecb20f 1446 uint8_t a, d;
dudmuck 0:9c2b09ecb20f 1447 static uint16_t fsk_tx_length;
dudmuck 0:9c2b09ecb20f 1448
dudmuck 0:9c2b09ecb20f 1449 len = get_kbd_str(pcbuf, sizeof(pcbuf));
dudmuck 0:9c2b09ecb20f 1450 if (len < 0) {
dudmuck 0:9c2b09ecb20f 1451 printf("abort\r\n");
dudmuck 0:9c2b09ecb20f 1452 return;
dudmuck 0:9c2b09ecb20f 1453 }
dudmuck 0:9c2b09ecb20f 1454
dudmuck 0:9c2b09ecb20f 1455 printf("\r\n");
dudmuck 0:9c2b09ecb20f 1456 if (len == 1) {
dudmuck 0:9c2b09ecb20f 1457 switch (pcbuf[0]) {
dudmuck 0:9c2b09ecb20f 1458 case 'i':
dudmuck 0:9c2b09ecb20f 1459 printf("init\r\n");
dudmuck 0:9c2b09ecb20f 1460 radio.init();
dudmuck 0:9c2b09ecb20f 1461 if (!radio.RegOpMode.bits.LongRangeMode) {
dudmuck 0:9c2b09ecb20f 1462 fsk.init(); // put FSK modem to some functioning default
dudmuck 0:9c2b09ecb20f 1463 } else {
dudmuck 0:9c2b09ecb20f 1464 // lora configuration is more simple
dudmuck 0:9c2b09ecb20f 1465 }
dudmuck 0:9c2b09ecb20f 1466 break;
dudmuck 0:9c2b09ecb20f 1467 case 'h':
dudmuck 0:9c2b09ecb20f 1468 printf("hw_reset()\r\n");
dudmuck 0:9c2b09ecb20f 1469 radio.hw_reset();
dudmuck 0:9c2b09ecb20f 1470 break;
dudmuck 0:9c2b09ecb20f 1471 case 'R':
dudmuck 0:9c2b09ecb20f 1472 // read all registers
dudmuck 0:9c2b09ecb20f 1473 for (a = 1; a < 0x71; a++) {
dudmuck 0:9c2b09ecb20f 1474 d = radio.read_reg(a);
dudmuck 0:9c2b09ecb20f 1475 //update_shadow_regs(selected_radio, a, d);
dudmuck 0:9c2b09ecb20f 1476 printf("%02x: %02x\r\n", a, d);
dudmuck 0:9c2b09ecb20f 1477 }
dudmuck 0:9c2b09ecb20f 1478 break;
dudmuck 0:9c2b09ecb20f 1479 case 'T':
dudmuck 0:9c2b09ecb20f 1480 if (radio.RegOpMode.bits.LongRangeMode) {
dudmuck 0:9c2b09ecb20f 1481 lora.RegModemConfig2.octet = radio.read_reg(REG_LR_MODEMCONFIG2);
dudmuck 3:8924027a8933 1482 //printf("a %02x\r\n", lora.RegModemConfig2.octet);
dudmuck 0:9c2b09ecb20f 1483 lora.RegModemConfig2.sx1276bits.TxContinuousMode ^= 1; // same for sx1272 and sx1276
dudmuck 3:8924027a8933 1484 //printf("b %02x\r\n", lora.RegModemConfig2.octet);
dudmuck 0:9c2b09ecb20f 1485 radio.write_reg(REG_LR_MODEMCONFIG2, lora.RegModemConfig2.octet);
dudmuck 3:8924027a8933 1486 lora.RegModemConfig2.octet = radio.read_reg(REG_LR_MODEMCONFIG2);
dudmuck 3:8924027a8933 1487 //printf("c %02x\r\n", lora.RegModemConfig2.octet);
dudmuck 0:9c2b09ecb20f 1488 lora_printTxContinuousMode();
dudmuck 0:9c2b09ecb20f 1489 printf("\r\n");
dudmuck 3:8924027a8933 1490 } else
dudmuck 7:6d5f193b6c2f 1491 printf("(fsk)\r\n");
dudmuck 0:9c2b09ecb20f 1492 break;
dudmuck 15:cdc215392e60 1493 case 'c':
dudmuck 15:cdc215392e60 1494 if (!radio.RegOpMode.bits.LongRangeMode) {
Wayne Roberts 17:f73dbeca8736 1495 printf("%" PRIu32 "bps fdev:%" PRIu32 "hz ", fsk.get_bitrate(), fsk.get_tx_fdev_hz());
Wayne Roberts 17:f73dbeca8736 1496 printf("rxbw:%" PRIu32 "Hz ", fsk.get_rx_bw_hz(REG_FSK_RXBW));
Wayne Roberts 17:f73dbeca8736 1497 printf("afcbw:%" PRIu32 "Hz preambleLen:%d\r\n", fsk.get_rx_bw_hz(REG_FSK_AFCBW), radio.read_u16(REG_FSK_PREAMBLEMSB));
dudmuck 15:cdc215392e60 1498 }
dudmuck 15:cdc215392e60 1499 break;
dudmuck 0:9c2b09ecb20f 1500 case 'C':
dudmuck 0:9c2b09ecb20f 1501 if (radio.RegOpMode.bits.LongRangeMode) {
dudmuck 0:9c2b09ecb20f 1502 lora.setRxPayloadCrcOn(!lora.getRxPayloadCrcOn());
dudmuck 0:9c2b09ecb20f 1503 lora_printRxPayloadCrcOn();
dudmuck 0:9c2b09ecb20f 1504 } else {
dudmuck 0:9c2b09ecb20f 1505 printf("CrcOn:");
dudmuck 0:9c2b09ecb20f 1506 fsk.RegPktConfig1.bits.CrcOn ^= 1;
dudmuck 0:9c2b09ecb20f 1507 radio.write_reg(REG_FSK_PACKETCONFIG1, fsk.RegPktConfig1.octet);
dudmuck 0:9c2b09ecb20f 1508 if (fsk.RegPktConfig1.bits.CrcOn)
dudmuck 0:9c2b09ecb20f 1509 printf("On\r\n");
dudmuck 0:9c2b09ecb20f 1510 else
dudmuck 0:9c2b09ecb20f 1511 printf("Off\r\n");
dudmuck 0:9c2b09ecb20f 1512 if (fsk.RegPktConfig2.bits.DataModePacket && radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER) {
dudmuck 0:9c2b09ecb20f 1513 fsk.config_dio0_for_pktmode_rx();
dudmuck 0:9c2b09ecb20f 1514 }
dudmuck 0:9c2b09ecb20f 1515 }
dudmuck 0:9c2b09ecb20f 1516 printf("\r\n");
dudmuck 0:9c2b09ecb20f 1517 break;
dudmuck 0:9c2b09ecb20f 1518 case 'B':
dudmuck 0:9c2b09ecb20f 1519 radio.RegPaConfig.bits.PaSelect ^= 1;
dudmuck 0:9c2b09ecb20f 1520 radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet);
dudmuck 0:9c2b09ecb20f 1521 printPa();
dudmuck 0:9c2b09ecb20f 1522 printf("\r\n");
dudmuck 0:9c2b09ecb20f 1523 break;
dudmuck 0:9c2b09ecb20f 1524 case 'L':
dudmuck 0:9c2b09ecb20f 1525 if (radio.RegOpMode.bits.LongRangeMode)
dudmuck 5:329557e0625c 1526 fsk.enable(false);
dudmuck 0:9c2b09ecb20f 1527 else
dudmuck 0:9c2b09ecb20f 1528 lora.enable();
dudmuck 0:9c2b09ecb20f 1529
dudmuck 0:9c2b09ecb20f 1530 radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
dudmuck 0:9c2b09ecb20f 1531 if (radio.RegOpMode.bits.LongRangeMode)
dudmuck 0:9c2b09ecb20f 1532 printf("LoRa\r\n");
dudmuck 0:9c2b09ecb20f 1533 else
dudmuck 0:9c2b09ecb20f 1534 printf("FSK\r\n");
dudmuck 0:9c2b09ecb20f 1535 break;
dudmuck 0:9c2b09ecb20f 1536 case 's':
dudmuck 0:9c2b09ecb20f 1537 if (!radio.RegOpMode.bits.LongRangeMode) {
dudmuck 0:9c2b09ecb20f 1538 fsk.RegFifoThreshold.bits.TxStartCondition ^= 1;
dudmuck 0:9c2b09ecb20f 1539 radio.write_reg(REG_FSK_FIFOTHRESH, fsk.RegFifoThreshold.octet);
dudmuck 0:9c2b09ecb20f 1540 printf("TxStartCondition:");
dudmuck 0:9c2b09ecb20f 1541 if (fsk.RegFifoThreshold.bits.TxStartCondition)
dudmuck 0:9c2b09ecb20f 1542 printf("!FifoEmpty\r\n");
dudmuck 0:9c2b09ecb20f 1543 else
dudmuck 0:9c2b09ecb20f 1544 printf("FifoLevel\r\n");
dudmuck 0:9c2b09ecb20f 1545 }
dudmuck 0:9c2b09ecb20f 1546 break;
dudmuck 0:9c2b09ecb20f 1547 case 'f':
dudmuck 0:9c2b09ecb20f 1548 if (!radio.RegOpMode.bits.LongRangeMode) {
dudmuck 0:9c2b09ecb20f 1549 printf("PacketFormat:");
dudmuck 0:9c2b09ecb20f 1550 fsk.RegPktConfig1.bits.PacketFormatVariable ^= 1;
dudmuck 0:9c2b09ecb20f 1551 radio.write_reg(REG_FSK_PACKETCONFIG1, fsk.RegPktConfig1.octet);
dudmuck 0:9c2b09ecb20f 1552 if (fsk.RegPktConfig1.bits.PacketFormatVariable)
dudmuck 0:9c2b09ecb20f 1553 printf("variable\r\n");
dudmuck 0:9c2b09ecb20f 1554 else
dudmuck 0:9c2b09ecb20f 1555 printf("fixed\r\n");
dudmuck 0:9c2b09ecb20f 1556 /*if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER)
dudmuck 0:9c2b09ecb20f 1557 reset_flow();*/
dudmuck 0:9c2b09ecb20f 1558 }
dudmuck 0:9c2b09ecb20f 1559 break;
dudmuck 0:9c2b09ecb20f 1560 case 'E':
dudmuck 0:9c2b09ecb20f 1561 if (!radio.RegOpMode.bits.LongRangeMode) {
dudmuck 0:9c2b09ecb20f 1562 RegIrqFlags2_t RegIrqFlags2;
dudmuck 0:9c2b09ecb20f 1563 RegIrqFlags2.octet = radio.read_reg(REG_FSK_IRQFLAGS2);
dudmuck 0:9c2b09ecb20f 1564 while (!RegIrqFlags2.bits.FifoEmpty) {
dudmuck 0:9c2b09ecb20f 1565 if (pc.readable())
dudmuck 0:9c2b09ecb20f 1566 break;
dudmuck 0:9c2b09ecb20f 1567 printf("%02x\r\n", radio.read_reg(REG_FIFO));
dudmuck 0:9c2b09ecb20f 1568 RegIrqFlags2.octet = radio.read_reg(REG_FSK_IRQFLAGS2);
dudmuck 0:9c2b09ecb20f 1569 }
dudmuck 0:9c2b09ecb20f 1570 }
dudmuck 0:9c2b09ecb20f 1571 break;
dudmuck 0:9c2b09ecb20f 1572 case 'A':
dudmuck 0:9c2b09ecb20f 1573 if (!radio.RegOpMode.bits.LongRangeMode) {
dudmuck 0:9c2b09ecb20f 1574 fsk.RegRxConfig.bits.AfcAutoOn ^= 1;
dudmuck 0:9c2b09ecb20f 1575 radio.write_reg(REG_FSK_RXCONFIG, fsk.RegRxConfig.octet);
dudmuck 0:9c2b09ecb20f 1576 printf("AfcAuto:");
dudmuck 0:9c2b09ecb20f 1577 if (fsk.RegRxConfig.bits.AfcAutoOn)
dudmuck 0:9c2b09ecb20f 1578 printf("On\r\n");
dudmuck 0:9c2b09ecb20f 1579 else
dudmuck 0:9c2b09ecb20f 1580 printf("OFF\r\n");
dudmuck 0:9c2b09ecb20f 1581 break;
dudmuck 0:9c2b09ecb20f 1582 }
dudmuck 0:9c2b09ecb20f 1583 break;
dudmuck 0:9c2b09ecb20f 1584 case '?':
dudmuck 10:a3e2c558c003 1585 printf("G<portABCD><MO><pin0-f>[0123] pin control (M=MODER, O=BSRR) see RM0038 section 7.4\r\n");
dudmuck 10:a3e2c558c003 1586 printf("cs%%d deepsleep for seconds\r\n");
dudmuck 10:a3e2c558c003 1587 printf("cl%%d sleep for seconds\r\n");
dudmuck 10:a3e2c558c003 1588 printf("CS%%d repeated sleep for seconds (hold down key to stop)\r\n");
dudmuck 8:e3da1dc7b628 1589 printf("r %%x read sx1272 register (addr)\r\n");
dudmuck 8:e3da1dc7b628 1590 printf("w %%x %%x write sx1272 register (addr data)\r\n");
dudmuck 3:8924027a8933 1591 printf("ge toggle GPS enable\r\n");
dudmuck 0:9c2b09ecb20f 1592 printf("L toggle LongRangeMode/FSK\r\n");
dudmuck 0:9c2b09ecb20f 1593 printf("i radio_init\r\n");
dudmuck 0:9c2b09ecb20f 1594 printf("h hw_reset\r\n");
dudmuck 13:a22debeee855 1595 printf("tx[%%d] transmit [length]\r\n");
dudmuck 13:a22debeee855 1596 printf("rx receive\r\n");
dudmuck 13:a22debeee855 1597 printf("stb put radio into standby\r\n");
dudmuck 13:a22debeee855 1598 printf("sle put radio to sleep\r\n");
dudmuck 0:9c2b09ecb20f 1599 printf("C toggle crcOn\r\n");
dudmuck 2:fb41d1c4b299 1600 printf("op[%%d] get/set output power\r\n");
dudmuck 13:a22debeee855 1601 printf("ocp[%%d] get/set over-current protection (mA)\r\n");
dudmuck 0:9c2b09ecb20f 1602 printf("d[0-5] change DIO pin assignment\r\n");
dudmuck 2:fb41d1c4b299 1603 printf("frf[%%f] get/set operating frequency (MHz)\r\n");
dudmuck 2:fb41d1c4b299 1604 printf("pd2 toggle PA_High_Power\r\n");
dudmuck 2:fb41d1c4b299 1605 printf("bgr[%%d] get/set prog_txdac BGR bias for TXDAC (7=+20dBm)\r\n");
dudmuck 8:e3da1dc7b628 1606 printf("per toggle PER enable (\"tx\" to start, ctrl-C to stop)\r\n");
dudmuck 7:6d5f193b6c2f 1607 printf("pin[%%f] get/set per_tx_delay (seconds)\r\n");
dudmuck 7:6d5f193b6c2f 1608 printf("pid[%%d] get/set PER device ID\r\n");
dudmuck 13:a22debeee855 1609 #ifdef FCC_TEST
dudmuck 7:6d5f193b6c2f 1610 printf("hop change hop type (off, 64ch, 4ch)\r\n");
dudmuck 7:6d5f193b6c2f 1611 printf("hb[%%f] get/set hop base MHz\r\n");
dudmuck 7:6d5f193b6c2f 1612 printf("hs[%%f] get/set hop step MHz\r\n");
dudmuck 13:a22debeee855 1613 #endif /* #ifdef FCC_TEST */
dudmuck 0:9c2b09ecb20f 1614 if (radio.RegOpMode.bits.LongRangeMode) {
dudmuck 2:fb41d1c4b299 1615 printf("pl[%%d] LORA get/set RegPayloadLength\r\n");
dudmuck 0:9c2b09ecb20f 1616 printf("cr[1234] LORA set coding rate \r\n");
dudmuck 2:fb41d1c4b299 1617 printf("bw[%%d] LORA get/set bandwidth\r\n");
dudmuck 2:fb41d1c4b299 1618 printf("sf[%%d] LORA get/set spreading factor\r\n");
dudmuck 0:9c2b09ecb20f 1619 printf("T LORA toggle TxContinuousMode\r\n");
dudmuck 2:fb41d1c4b299 1620 printf("hp[%%d] LORA get/set hop period\r\n");
dudmuck 0:9c2b09ecb20f 1621 printf("hm LORA toggle explicit/explicit header mode\r\n");
dudmuck 9:dc02ef560bd1 1622 printf("rin LORA toggle RX invert_i_q\r\n");
dudmuck 9:dc02ef560bd1 1623 printf("tin LORA toggle chirp_invert_tx\r\n");
dudmuck 2:fb41d1c4b299 1624 printf("ld LORA toggle LowDataRateOptimize\r\n");
dudmuck 0:9c2b09ecb20f 1625 } else {
dudmuck 0:9c2b09ecb20f 1626 printf("bw[a][%%d] FSK get-set rxbw (bwa=afcbw)\r\n");
dudmuck 0:9c2b09ecb20f 1627 printf("br[%%d] FSK get-set bitrate\r\n");
dudmuck 15:cdc215392e60 1628 printf("c[%%d] FSK set test case\r\n");
dudmuck 0:9c2b09ecb20f 1629 printf("fdev[%%d] FSK get-set TX frequency deviation (hz)\r\n");
dudmuck 0:9c2b09ecb20f 1630 printf("rt FSK change RxTrigger\r\n");
dudmuck 0:9c2b09ecb20f 1631 printf("pd FSK enable/disable preamble detector\r\n");
dudmuck 0:9c2b09ecb20f 1632 printf("pt FSK get-set PreambleDetectorTol\r\n");
dudmuck 0:9c2b09ecb20f 1633 printf("ss[%%d] FSK get-set SyncSize\r\n");
dudmuck 0:9c2b09ecb20f 1634 printf("S[%%x] FSK get-set sync word\r\n");
dudmuck 0:9c2b09ecb20f 1635 printf("s FSK toggle TxStartCondition\r\n");
dudmuck 0:9c2b09ecb20f 1636 printf("f FSK toggle PacketFormat fixed-variable\r\n");
dudmuck 0:9c2b09ecb20f 1637 printf("E FSK empty out the fifo\r\n");
dudmuck 0:9c2b09ecb20f 1638 printf("ac FSK AfcClear\r\n");
dudmuck 0:9c2b09ecb20f 1639 printf("A FSK toggle AfcAutoOn\r\n");
dudmuck 0:9c2b09ecb20f 1640 printf("mp FSK toggle MapPreambleDetect\r\n");
dudmuck 0:9c2b09ecb20f 1641 printf("ar FSK change AutoRestartRxMode\r\n");
dudmuck 0:9c2b09ecb20f 1642 printf("alc FSK toggle AfcAutoClearOn\r\n");
dudmuck 5:329557e0625c 1643 printf("ag FSK toggle AgcAutoOn\r\n");
dudmuck 0:9c2b09ecb20f 1644 printf("pre[%%d} FSK get-set TX preamble length\r\n");
dudmuck 0:9c2b09ecb20f 1645 }
dudmuck 8:e3da1dc7b628 1646 printf("mp? MPL3115 help (tempurature/pressure sensor)\r\n");
dudmuck 8:e3da1dc7b628 1647 printf("mm? MMA8451 help (accelerometer)\r\n");
dudmuck 8:e3da1dc7b628 1648 printf("95? SX9500 help (touch sensor)\r\n");
dudmuck 0:9c2b09ecb20f 1649 break;
dudmuck 0:9c2b09ecb20f 1650 case '.':
dudmuck 0:9c2b09ecb20f 1651 if (radio.RegOpMode.bits.LongRangeMode)
dudmuck 0:9c2b09ecb20f 1652 lora_print_status();
dudmuck 0:9c2b09ecb20f 1653 else
dudmuck 0:9c2b09ecb20f 1654 fsk_print_status();
dudmuck 0:9c2b09ecb20f 1655 common_print_status();
dudmuck 0:9c2b09ecb20f 1656 break;
dudmuck 0:9c2b09ecb20f 1657 } // ...switch (pcbuf[0])
dudmuck 0:9c2b09ecb20f 1658 } else {
dudmuck 0:9c2b09ecb20f 1659 if (pcbuf[0] == 't' && pcbuf[1] == 'x') { // TX
dudmuck 15:cdc215392e60 1660 if (per_en) {
dudmuck 15:cdc215392e60 1661 printf("timeout attach %f\r\n", per_tx_delay);
dudmuck 15:cdc215392e60 1662 PacketTxCnt = 0;
dudmuck 15:cdc215392e60 1663 per_timeout.attach(&per_cb, per_tx_delay);
dudmuck 15:cdc215392e60 1664 } else {
dudmuck 15:cdc215392e60 1665 if (radio.RegOpMode.bits.LongRangeMode) {
dudmuck 2:fb41d1c4b299 1666 if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
dudmuck 2:fb41d1c4b299 1667 sscanf(pcbuf+2, "%d", &i);
dudmuck 2:fb41d1c4b299 1668 lora.RegPayloadLength = i;
dudmuck 13:a22debeee855 1669 radio.write_reg(REG_LR_PAYLOADLENGTH, lora.RegPayloadLength);
dudmuck 2:fb41d1c4b299 1670 }
dudmuck 2:fb41d1c4b299 1671 tx_cnt++;
dudmuck 2:fb41d1c4b299 1672 for (i = 0; i < lora.RegPayloadLength; i++)
dudmuck 2:fb41d1c4b299 1673 radio.tx_buf[i] = tx_cnt;
dudmuck 2:fb41d1c4b299 1674 red_led = LED_ON;
dudmuck 2:fb41d1c4b299 1675 lora.start_tx(lora.RegPayloadLength);
dudmuck 6:8defa260bc10 1676 if (pcbuf[2] == 'r')
dudmuck 6:8defa260bc10 1677 rx_after_tx = true;
dudmuck 6:8defa260bc10 1678 else
dudmuck 6:8defa260bc10 1679 rx_after_tx = false;
dudmuck 15:cdc215392e60 1680 } else { // FSK:
dudmuck 15:cdc215392e60 1681 if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
dudmuck 15:cdc215392e60 1682 sscanf(pcbuf+2, "%d", &i);
dudmuck 15:cdc215392e60 1683 fsk_tx_length = i;
dudmuck 0:9c2b09ecb20f 1684 }
dudmuck 15:cdc215392e60 1685 if (radio.RegOpMode.bits.Mode != RF_OPMODE_TRANSMITTER) { // if not already busy transmitting
dudmuck 15:cdc215392e60 1686 tx_cnt++;
dudmuck 15:cdc215392e60 1687 for (i = 0; i < fsk_tx_length; i++) {
dudmuck 15:cdc215392e60 1688 radio.tx_buf[i] = tx_cnt;
dudmuck 15:cdc215392e60 1689 }
dudmuck 15:cdc215392e60 1690 fsk.start_tx(fsk_tx_length);
dudmuck 15:cdc215392e60 1691 }
dudmuck 15:cdc215392e60 1692 } // ...fsk
dudmuck 15:cdc215392e60 1693 } // ..!per_en
dudmuck 13:a22debeee855 1694 #ifdef FCC_TEST
dudmuck 3:8924027a8933 1695 if (hop_type != HOP_TYPE_NONE)
dudmuck 3:8924027a8933 1696 hop_timeout.attach(&hop_cb, 0.4);
dudmuck 13:a22debeee855 1697 #endif /* #ifdef FCC_TEST */
dudmuck 3:8924027a8933 1698 } else if (pcbuf[0] == 'r' && pcbuf[1] == 'n' && pcbuf[2] == 'd') {
dudmuck 3:8924027a8933 1699 uint8_t of = rand() & 0x3f;
dudmuck 3:8924027a8933 1700
dudmuck 7:6d5f193b6c2f 1701 printf("%02d %.2f\r\n", of, 902.3 + (of * 0.2));
dudmuck 13:a22debeee855 1702 }
dudmuck 13:a22debeee855 1703 #ifdef FCC_TEST
dudmuck 13:a22debeee855 1704 else if (pcbuf[0] == 'h' && pcbuf[1] == 'b') {
dudmuck 3:8924027a8933 1705 if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
dudmuck 3:8924027a8933 1706 sscanf(pcbuf+2, "%f", &hop_base_MHz);
dudmuck 3:8924027a8933 1707 }
dudmuck 7:6d5f193b6c2f 1708 printf("hop_base:%f\r\n", hop_base_MHz);
dudmuck 3:8924027a8933 1709 } else if (pcbuf[0] == 'h' && pcbuf[1] == 's') {
dudmuck 3:8924027a8933 1710 if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
dudmuck 3:8924027a8933 1711 sscanf(pcbuf+2, "%f", &hop_step_MHz);
dudmuck 3:8924027a8933 1712 }
dudmuck 7:6d5f193b6c2f 1713 printf("hop_step:%f\r\n", hop_step_MHz);
dudmuck 3:8924027a8933 1714 } else if (pcbuf[0] == 'h' && pcbuf[1] == 'o' && pcbuf[2] == 'p') {
dudmuck 3:8924027a8933 1715 switch (hop_type) {
dudmuck 3:8924027a8933 1716 case HOP_TYPE_NONE:
dudmuck 3:8924027a8933 1717 hop_type = HOP_TYPE_64CH;
dudmuck 7:6d5f193b6c2f 1718 printf("64ch hop\r\n");
dudmuck 3:8924027a8933 1719 break;
dudmuck 3:8924027a8933 1720 case HOP_TYPE_64CH:
dudmuck 3:8924027a8933 1721 hop_type = HOP_TYPE_4CH;
dudmuck 7:6d5f193b6c2f 1722 printf("4ch hop\r\n");
dudmuck 3:8924027a8933 1723 break;
dudmuck 3:8924027a8933 1724 case HOP_TYPE_4CH:
dudmuck 3:8924027a8933 1725 hop_type = HOP_TYPE_NONE;
dudmuck 7:6d5f193b6c2f 1726 printf("hop off\r\n");
dudmuck 3:8924027a8933 1727 break;
dudmuck 3:8924027a8933 1728 }
dudmuck 13:a22debeee855 1729 }
dudmuck 13:a22debeee855 1730 #endif /* #ifdef FCC_TEST */
dudmuck 13:a22debeee855 1731 else if (pcbuf[0] == 'h' && pcbuf[1] == 'p' && radio.RegOpMode.bits.LongRangeMode) {
dudmuck 0:9c2b09ecb20f 1732 if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
dudmuck 0:9c2b09ecb20f 1733 sscanf(pcbuf+2, "%d", &i);
dudmuck 0:9c2b09ecb20f 1734 lora.RegHopPeriod = i;
dudmuck 0:9c2b09ecb20f 1735 radio.write_reg(REG_LR_HOPPERIOD, lora.RegHopPeriod);
dudmuck 0:9c2b09ecb20f 1736 if (radio.RegDioMapping1.bits.Dio1Mapping != 1) {
dudmuck 0:9c2b09ecb20f 1737 radio.RegDioMapping1.bits.Dio1Mapping = 1;
dudmuck 0:9c2b09ecb20f 1738 radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet);
dudmuck 0:9c2b09ecb20f 1739 }
dudmuck 0:9c2b09ecb20f 1740 }
dudmuck 0:9c2b09ecb20f 1741 lora.RegHopPeriod = radio.read_reg(REG_LR_HOPPERIOD);
dudmuck 0:9c2b09ecb20f 1742 printf("HopPeriod:0x%02x\r\n", lora.RegHopPeriod);
dudmuck 0:9c2b09ecb20f 1743 } else if (pcbuf[0] == 'r' && pcbuf[1] == 't' && !radio.RegOpMode.bits.LongRangeMode) {
dudmuck 0:9c2b09ecb20f 1744 printf("RxTrigger:");
dudmuck 0:9c2b09ecb20f 1745 switch (fsk.RegRxConfig.bits.RxTrigger) {
dudmuck 0:9c2b09ecb20f 1746 case 0: fsk.RegRxConfig.bits.RxTrigger = 1;
dudmuck 0:9c2b09ecb20f 1747 printf("rssi\r\n");
dudmuck 0:9c2b09ecb20f 1748 break;
dudmuck 0:9c2b09ecb20f 1749 case 1: fsk.RegRxConfig.bits.RxTrigger = 6;
dudmuck 0:9c2b09ecb20f 1750 printf("preamble\r\n");
dudmuck 0:9c2b09ecb20f 1751 break;
dudmuck 0:9c2b09ecb20f 1752 case 6: fsk.RegRxConfig.bits.RxTrigger = 7;
dudmuck 0:9c2b09ecb20f 1753 printf("both\r\n");
dudmuck 0:9c2b09ecb20f 1754 break;
dudmuck 0:9c2b09ecb20f 1755 case 7: fsk.RegRxConfig.bits.RxTrigger = 0;
dudmuck 0:9c2b09ecb20f 1756 printf("none\r\n");
dudmuck 0:9c2b09ecb20f 1757 break;
dudmuck 0:9c2b09ecb20f 1758 default: fsk.RegRxConfig.bits.RxTrigger = 0;
dudmuck 0:9c2b09ecb20f 1759 printf("none\r\n");
dudmuck 0:9c2b09ecb20f 1760 break;
dudmuck 0:9c2b09ecb20f 1761 }
dudmuck 10:a3e2c558c003 1762 radio.write_reg(REG_FSK_RXCONFIG, fsk.RegRxConfig.octet);
dudmuck 0:9c2b09ecb20f 1763 } else if (pcbuf[0] == 'r' && pcbuf[1] == 'x') { // RX
dudmuck 2:fb41d1c4b299 1764 if (per_en) {
dudmuck 2:fb41d1c4b299 1765 red_led = LED_OFF;
dudmuck 6:8defa260bc10 1766 //green_led = LED_OFF;
dudmuck 2:fb41d1c4b299 1767 PacketNormalCnt = 0;
dudmuck 2:fb41d1c4b299 1768 PacketRxSequencePrev = -1;
dudmuck 2:fb41d1c4b299 1769 PacketPerKoCnt = 0;
dudmuck 2:fb41d1c4b299 1770 PacketPerOkCnt = 0;
dudmuck 2:fb41d1c4b299 1771 dio3.rise(&dio3_cb);
dudmuck 2:fb41d1c4b299 1772 }
dudmuck 4:1efa46cff1b3 1773 if (radio.RegOpMode.bits.LongRangeMode) {
dudmuck 4:1efa46cff1b3 1774 last_RxCurrentAddr = radio.read_reg(REG_LR_FIFORXCURRENTADDR);
Wayne Roberts 17:f73dbeca8736 1775 lora.start_rx(RF_OPMODE_RECEIVER);
dudmuck 15:cdc215392e60 1776 } else {
dudmuck 0:9c2b09ecb20f 1777 fsk.start_rx();
dudmuck 15:cdc215392e60 1778 radio.RegDioMapping1.bits.Dio2Mapping = 3; // dio2 to syncadrs
dudmuck 15:cdc215392e60 1779 radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet);
dudmuck 15:cdc215392e60 1780
dudmuck 15:cdc215392e60 1781 fsk.RegRssiConfig.octet = radio.read_reg(REG_FSK_RSSICONFIG);
dudmuck 15:cdc215392e60 1782 fsk.RegRssiConfig.bits.RssiOffset = FSK_RSSI_OFFSET;
dudmuck 15:cdc215392e60 1783 fsk.RegRssiConfig.bits.RssiSmoothing = FSK_RSSI_SMOOTHING;
dudmuck 15:cdc215392e60 1784 radio.write_reg(REG_FSK_RSSICONFIG, fsk.RegRssiConfig.octet);
dudmuck 15:cdc215392e60 1785 }
dudmuck 0:9c2b09ecb20f 1786 } else if (pcbuf[0] == 'r' && pcbuf[1] == ' ') { // read single register
dudmuck 0:9c2b09ecb20f 1787 sscanf(pcbuf+2, "%x", &i);
dudmuck 0:9c2b09ecb20f 1788 printf("%02x: %02x\r\n", i, radio.read_reg(i));
dudmuck 0:9c2b09ecb20f 1789 } else if (pcbuf[0] == 'w' && pcbuf[1] == ' ') { // write single register
dudmuck 0:9c2b09ecb20f 1790 sscanf(pcbuf+2, "%x %x", &i, &len);
dudmuck 0:9c2b09ecb20f 1791 radio.write_reg(i, len);
dudmuck 0:9c2b09ecb20f 1792 printf("%02x: %02x\r\n", i, radio.read_reg(i));
dudmuck 2:fb41d1c4b299 1793 }
dudmuck 2:fb41d1c4b299 1794 #ifdef I2C_PIN_TEST
dudmuck 2:fb41d1c4b299 1795 else if (pcbuf[0] == 'b' && pcbuf[1] == '8') {
dudmuck 1:b13a15a34c3f 1796 printf("SCL:");
dudmuck 1:b13a15a34c3f 1797 switch (pcbuf[2]) {
dudmuck 1:b13a15a34c3f 1798 case '0':
dudmuck 1:b13a15a34c3f 1799 pb8.output();
dudmuck 1:b13a15a34c3f 1800 pb8 = 0;
dudmuck 1:b13a15a34c3f 1801 printf("lo");
dudmuck 1:b13a15a34c3f 1802 break;
dudmuck 1:b13a15a34c3f 1803 case '1':
dudmuck 1:b13a15a34c3f 1804 pb8.output();
dudmuck 1:b13a15a34c3f 1805 pb8 = 1;
dudmuck 1:b13a15a34c3f 1806 printf("hi");
dudmuck 1:b13a15a34c3f 1807 break;
dudmuck 1:b13a15a34c3f 1808 case 'z':
dudmuck 1:b13a15a34c3f 1809 pb8.input();
dudmuck 1:b13a15a34c3f 1810 printf("z");
dudmuck 1:b13a15a34c3f 1811 break;
dudmuck 1:b13a15a34c3f 1812 }
dudmuck 7:6d5f193b6c2f 1813 printf("\r\n");
dudmuck 1:b13a15a34c3f 1814 } else if (pcbuf[0] == 'b' && pcbuf[1] == '9') {
dudmuck 1:b13a15a34c3f 1815 printf("SDA:");
dudmuck 1:b13a15a34c3f 1816 switch (pcbuf[2]) {
dudmuck 1:b13a15a34c3f 1817 case '0':
dudmuck 1:b13a15a34c3f 1818 pb9.output();
dudmuck 1:b13a15a34c3f 1819 pb9 = 0;
dudmuck 1:b13a15a34c3f 1820 printf("lo");
dudmuck 1:b13a15a34c3f 1821 break;
dudmuck 1:b13a15a34c3f 1822 case '1':
dudmuck 1:b13a15a34c3f 1823 pb9.output();
dudmuck 1:b13a15a34c3f 1824 pb9 = 1;
dudmuck 1:b13a15a34c3f 1825 printf("hi");
dudmuck 1:b13a15a34c3f 1826 break;
dudmuck 1:b13a15a34c3f 1827 case 'z':
dudmuck 1:b13a15a34c3f 1828 pb9.input();
dudmuck 1:b13a15a34c3f 1829 printf("z");
dudmuck 1:b13a15a34c3f 1830 break;
dudmuck 1:b13a15a34c3f 1831 }
dudmuck 7:6d5f193b6c2f 1832 printf("\r\n");
dudmuck 2:fb41d1c4b299 1833 }
dudmuck 3:8924027a8933 1834 #else
dudmuck 6:8defa260bc10 1835 /************************** MMA8451Q... **************************************/
dudmuck 6:8defa260bc10 1836 else if (pcbuf[0] == 'm' && pcbuf[1] == 'm') {
dudmuck 6:8defa260bc10 1837 if (pcbuf[2] == '?') {
dudmuck 6:8defa260bc10 1838 printf("mm. get status\r\n");
dudmuck 7:6d5f193b6c2f 1839 printf("mm, print XYZ\r\n");
dudmuck 7:6d5f193b6c2f 1840 printf("mma toggle stby/active\r\n");
dudmuck 7:6d5f193b6c2f 1841 printf("mmtd configure for transient detection\r\n");
dudmuck 14:35e7156e73ff 1842 printf("mmod configure for orientation detection\r\n");
dudmuck 6:8defa260bc10 1843 } else if (pcbuf[2] == '.') {
dudmuck 7:6d5f193b6c2f 1844 printf("active:%d\r\n", mma8451q.get_active());
dudmuck 6:8defa260bc10 1845 mma8451q.print_regs();
dudmuck 6:8defa260bc10 1846 printf("i2c_int_pin:%d\r\n", i2c_int_pin.read());
dudmuck 6:8defa260bc10 1847 } else if (pcbuf[2] == ',') {
dudmuck 6:8defa260bc10 1848 mma8451q.read(MMA8451_OUT_X_MSB, mma8451q.out.octets, 6);
dudmuck 6:8defa260bc10 1849 mma8451q.out.v.x >>= 4; // 12bit data
dudmuck 6:8defa260bc10 1850 mma8451q.out.v.y >>= 4; // 12bit data
dudmuck 6:8defa260bc10 1851 mma8451q.out.v.z >>= 4; // 12bit data
dudmuck 7:6d5f193b6c2f 1852 printf("x:%d y:%d z:%d\r\n", mma8451q.out.v.x, mma8451q.out.v.y, mma8451q.out.v.z);
dudmuck 14:35e7156e73ff 1853 } else if (pcbuf[2] == 'o' && pcbuf[3] == 'd') {
dudmuck 14:35e7156e73ff 1854 printf("orientation ");
dudmuck 14:35e7156e73ff 1855 d = mma8451q.read_single(MMA8451_PL_CFG);
dudmuck 14:35e7156e73ff 1856 if (d & 0x40) { // PL_EN?
dudmuck 14:35e7156e73ff 1857 d &= ~0x40;
dudmuck 14:35e7156e73ff 1858 mma8451q.write(MMA8451_PL_CFG, d);
dudmuck 14:35e7156e73ff 1859 printf("off\r\n");
dudmuck 14:35e7156e73ff 1860 } else {
dudmuck 14:35e7156e73ff 1861 mpl3115a2.write(CTRL_REG4, 0); // turn off: shares same interrupt pin
dudmuck 14:35e7156e73ff 1862 mma8451q.orient_detect();
dudmuck 14:35e7156e73ff 1863 printf("on\r\n");
dudmuck 14:35e7156e73ff 1864 }
dudmuck 6:8defa260bc10 1865 } else if (pcbuf[2] == 't' && pcbuf[3] == 'd') {
dudmuck 6:8defa260bc10 1866 printf("transient ");
dudmuck 6:8defa260bc10 1867 if (mma8451q.transient_cfg.bits.ELE) {
dudmuck 6:8defa260bc10 1868 mma8451q.transient_cfg.octet = 0;
dudmuck 6:8defa260bc10 1869 mma8451q.write(MMA8451_TRANSIENT_CFG, mma8451q.transient_cfg.octet);
dudmuck 6:8defa260bc10 1870 mma8451q.ctrl_reg4.bits.INT_EN_TRANS = 0;
dudmuck 6:8defa260bc10 1871 mma8451q.write(MMA8451_CTRL_REG4, mma8451q.ctrl_reg4.octet);
dudmuck 7:6d5f193b6c2f 1872 printf("off\r\n");
dudmuck 6:8defa260bc10 1873 } else {
dudmuck 14:35e7156e73ff 1874 mpl3115a2.write(CTRL_REG4, 0); // turn off: shares same interrupt pin
dudmuck 6:8defa260bc10 1875 mma8451q.transient_detect();
dudmuck 6:8defa260bc10 1876 //poll_timeout.attach(on_poll, 0.3);
dudmuck 7:6d5f193b6c2f 1877 printf("on\r\n");
dudmuck 6:8defa260bc10 1878 }
dudmuck 6:8defa260bc10 1879 } else if (pcbuf[2] == 'a') {
dudmuck 6:8defa260bc10 1880 if (mma8451q.get_active()) {
dudmuck 6:8defa260bc10 1881 mma8451q.set_active(0);
dudmuck 6:8defa260bc10 1882 } else {
dudmuck 6:8defa260bc10 1883 mma8451q.set_active(1);
dudmuck 6:8defa260bc10 1884 }
dudmuck 7:6d5f193b6c2f 1885 printf("active:%d\r\n", mma8451q.get_active());
dudmuck 6:8defa260bc10 1886 }
dudmuck 6:8defa260bc10 1887 }
dudmuck 6:8defa260bc10 1888 /************************** MPL3115... **************************************/
dudmuck 6:8defa260bc10 1889 else if (pcbuf[0] == 'm' && pcbuf[1] == 'p') {
dudmuck 6:8defa260bc10 1890 if (pcbuf[2] == '?') {
dudmuck 6:8defa260bc10 1891 printf("mp. get status\r\n");
dudmuck 6:8defa260bc10 1892 printf("mpt get temperature\r\n");
dudmuck 6:8defa260bc10 1893 printf("mpa get altitude\r\n");
dudmuck 14:35e7156e73ff 1894 printf("mpb get barometer\r\n");
dudmuck 14:35e7156e73ff 1895 printf("mpo[%%d] get/set oversampling (0-7)\r\n");
dudmuck 6:8defa260bc10 1896 } else if (pcbuf[2] == '.') {
dudmuck 6:8defa260bc10 1897 printf("active:%d\r\n", mpl3115a2.GetModeActive());
dudmuck 6:8defa260bc10 1898 printf("int src:%02x\r\n", mpl3115a2.read(INT_SOURCE_REG));
dudmuck 14:35e7156e73ff 1899 printf("CTRL1:%02x\r\n", mpl3115a2.read(CTRL_REG1));
dudmuck 6:8defa260bc10 1900 /* only INT1 is connected */
dudmuck 14:35e7156e73ff 1901 printf("CTRL3:%02x\r\n", mpl3115a2.read(CTRL_REG3)); /* TODO: PP_OD1 for open-drain operation */
dudmuck 14:35e7156e73ff 1902 printf("CTRL4:%02x\r\n", mpl3115a2.read(CTRL_REG4));
dudmuck 14:35e7156e73ff 1903 printf("CTRL5:%02x\r\n", mpl3115a2.read(CTRL_REG5));
dudmuck 14:35e7156e73ff 1904 printf("OFF_H:%02x\r\n", mpl3115a2.read(OFF_H_REG));
dudmuck 14:35e7156e73ff 1905
dudmuck 6:8defa260bc10 1906 printf("i2c_int_pin:%d\r\n", i2c_int_pin.read());
dudmuck 6:8defa260bc10 1907 } else if (pcbuf[2] == 't') {
dudmuck 14:35e7156e73ff 1908 printf("temp:%.4f\r\n", mpl3115a2.ReadTemperature());
dudmuck 6:8defa260bc10 1909 } else if (pcbuf[2] == 'a') {
dudmuck 14:35e7156e73ff 1910 printf("alt:%.4f\r\n", mpl3115a2.ReadAltitude());
dudmuck 14:35e7156e73ff 1911 } else if (pcbuf[2] == 'b') {
dudmuck 14:35e7156e73ff 1912 printf("bar:%.2f\r\n", mpl3115a2.ReadBarometer());
dudmuck 14:35e7156e73ff 1913 } else if (pcbuf[2] == 'o') {
dudmuck 14:35e7156e73ff 1914 if (pcbuf[3] >= '0' && pcbuf[3] <= '9') {
dudmuck 14:35e7156e73ff 1915 sscanf(pcbuf+3, "%d", &i);
dudmuck 14:35e7156e73ff 1916 mpl3115a2.setOSR(i);
dudmuck 14:35e7156e73ff 1917 }
dudmuck 14:35e7156e73ff 1918 printf("OSR:%d\r\n", mpl3115a2.getOSR());
dudmuck 6:8defa260bc10 1919 }
dudmuck 6:8defa260bc10 1920 }
dudmuck 6:8defa260bc10 1921 /************************** sx9500... **************************************/
dudmuck 6:8defa260bc10 1922 else if (pcbuf[0] == '9' && pcbuf[1] == '5') {
dudmuck 5:329557e0625c 1923 if (pcbuf[2] == '?') {
dudmuck 7:6d5f193b6c2f 1924 printf("95R reset\r\n");
dudmuck 7:6d5f193b6c2f 1925 printf("95. read status\r\n");
dudmuck 6:8defa260bc10 1926 printf("95t[%%d] get/set PROXTHRESH\r\n");
dudmuck 6:8defa260bc10 1927 printf("95s[%%d] get/set SCANPERIOD\r\n");
dudmuck 6:8defa260bc10 1928 printf("95a toggle txen\r\n");
dudmuck 5:329557e0625c 1929 } else if (pcbuf[2] == '.') {
dudmuck 6:8defa260bc10 1930 printf("(txen) active:%d\r\n", sx9500.get_active());
dudmuck 7:6d5f193b6c2f 1931 printf("RegStat:%02x\r\n", sx9500.read_single(SX9500_REG_STAT));
dudmuck 7:6d5f193b6c2f 1932 printf("RegProxCtrl0:%02x\r\n", sx9500.read_single(SX9500_REG_PROXCTRL0));
dudmuck 7:6d5f193b6c2f 1933 printf("RegProxCtrl1:%02x\r\n", sx9500.read_single(SX9500_REG_PROXCTRL1));
dudmuck 7:6d5f193b6c2f 1934 printf("RegProxCtrl2:%02x\r\n", sx9500.read_single(SX9500_REG_PROXCTRL2));
dudmuck 7:6d5f193b6c2f 1935 printf("RegProxCtrl3:%02x\r\n", sx9500.read_single(SX9500_REG_PROXCTRL3));
dudmuck 7:6d5f193b6c2f 1936 printf("RegProxCtrl4:%02x\r\n", sx9500.read_single(SX9500_REG_PROXCTRL4));
dudmuck 7:6d5f193b6c2f 1937 printf("RegProxCtrl5:%02x\r\n", sx9500.read_single(SX9500_REG_PROXCTRL5));
dudmuck 7:6d5f193b6c2f 1938 printf("RegProxCtrl6:%02x\r\n", sx9500.read_single(SX9500_REG_PROXCTRL6));
dudmuck 6:8defa260bc10 1939 } else if (pcbuf[2] == 'a') {
dudmuck 6:8defa260bc10 1940 if (sx9500.get_active()) {
dudmuck 6:8defa260bc10 1941 sx9500.set_active(false);
dudmuck 6:8defa260bc10 1942 } else {
dudmuck 6:8defa260bc10 1943 sx9500.RegProxCtrl0.octet = sx9500.read_single(SX9500_REG_PROXCTRL0);
dudmuck 6:8defa260bc10 1944 sx9500.RegProxCtrl0.bits.sensor_en = 3; // CS0 and CS1 on
dudmuck 6:8defa260bc10 1945 sx9500.write(SX9500_REG_PROXCTRL0, sx9500.RegProxCtrl0.octet);
dudmuck 6:8defa260bc10 1946 sx9500.write(SX9500_REG_PROXCTRL6, 1); // threshold to 20 for CS1 release
dudmuck 6:8defa260bc10 1947 sx9500.write(SX9500_REG_IRQMSK, 0x60); // enable near and far interrupts
dudmuck 6:8defa260bc10 1948 sx9500.set_active(true);
dudmuck 7:6d5f193b6c2f 1949 printf("RegProxCtrl0:%02x\r\n", sx9500.read_single(SX9500_REG_PROXCTRL0)); /* sensor-enable and scan period */
dudmuck 6:8defa260bc10 1950 }
dudmuck 6:8defa260bc10 1951 printf("(txen) active:%d\r\n", sx9500.get_active());
dudmuck 5:329557e0625c 1952 } else if (pcbuf[2] == 'R') {
dudmuck 5:329557e0625c 1953 sx9500.reset();
dudmuck 6:8defa260bc10 1954 } else if (pcbuf[2] == 'i') {
dudmuck 6:8defa260bc10 1955 if (pcbuf[3] != 0) {
dudmuck 6:8defa260bc10 1956 sscanf(pcbuf+3, "%x", &i);
dudmuck 6:8defa260bc10 1957 sx9500.write(SX9500_REG_IRQMSK, i);
dudmuck 6:8defa260bc10 1958 }
dudmuck 6:8defa260bc10 1959 printf("irqmsk:%02x\r\n", sx9500.read_single(SX9500_REG_IRQMSK));
dudmuck 6:8defa260bc10 1960 } else if (pcbuf[2] == 't') {
dudmuck 6:8defa260bc10 1961 if (pcbuf[3] >= '0' && pcbuf[3] <= '9') {
dudmuck 6:8defa260bc10 1962 sscanf(pcbuf+3, "%d", &i);
dudmuck 6:8defa260bc10 1963 sx9500.write(SX9500_REG_PROXCTRL6, i);
dudmuck 6:8defa260bc10 1964 }
dudmuck 6:8defa260bc10 1965 printf("proxthresh:0x%x\r\n", sx9500.read_single(SX9500_REG_PROXCTRL6));
dudmuck 6:8defa260bc10 1966 } else if (pcbuf[2] == 'p') {
dudmuck 6:8defa260bc10 1967 if (pcbuf[3] >= '0' && pcbuf[3] <= '9') {
dudmuck 6:8defa260bc10 1968 sscanf(pcbuf+2, "%d", &i);
dudmuck 6:8defa260bc10 1969 sx9500.RegProxCtrl0.bits.scan_period = i;
dudmuck 6:8defa260bc10 1970 sx9500.write(SX9500_REG_PROXCTRL0, sx9500.RegProxCtrl0.octet);
dudmuck 6:8defa260bc10 1971 }
dudmuck 6:8defa260bc10 1972 sx9500.RegProxCtrl0.octet = sx9500.read_single(SX9500_REG_PROXCTRL0);
dudmuck 6:8defa260bc10 1973 printf("scan period:%d\r\n", sx9500.RegProxCtrl0.bits.scan_period);
dudmuck 6:8defa260bc10 1974 }
dudmuck 2:fb41d1c4b299 1975 }
dudmuck 2:fb41d1c4b299 1976 #endif /* !I2C_PIN_TEST */
dudmuck 2:fb41d1c4b299 1977 else if (pcbuf[0] == 'm' && pcbuf[1] == 'p' && !radio.RegOpMode.bits.LongRangeMode) {
dudmuck 0:9c2b09ecb20f 1978 radio.RegDioMapping2.bits.MapPreambleDetect ^= 1;
dudmuck 0:9c2b09ecb20f 1979 radio.write_reg(REG_DIOMAPPING2, radio.RegDioMapping2.octet);
dudmuck 0:9c2b09ecb20f 1980 printf("MapPreambleDetect:");
dudmuck 0:9c2b09ecb20f 1981 if (radio.RegDioMapping2.bits.MapPreambleDetect)
dudmuck 0:9c2b09ecb20f 1982 printf("preamble\r\n");
dudmuck 0:9c2b09ecb20f 1983 else
dudmuck 0:9c2b09ecb20f 1984 printf("rssi\r\n");
dudmuck 0:9c2b09ecb20f 1985 } else if (pcbuf[0] == 'o' && pcbuf[1] == 'p') {
dudmuck 0:9c2b09ecb20f 1986 if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
dudmuck 0:9c2b09ecb20f 1987 sscanf(pcbuf+2, "%d", &i);
dudmuck 0:9c2b09ecb20f 1988 radio.RegPaConfig.bits.OutputPower = i;
dudmuck 0:9c2b09ecb20f 1989 radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet);
dudmuck 0:9c2b09ecb20f 1990 }
dudmuck 0:9c2b09ecb20f 1991 radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG);
dudmuck 0:9c2b09ecb20f 1992 printf("OutputPower:%d\r\n", radio.RegPaConfig.bits.OutputPower);
dudmuck 15:cdc215392e60 1993 } else if (pcbuf[0] == 'c' && (pcbuf[1] >= '0' && pcbuf[1] <= '9') && !radio.RegOpMode.bits.LongRangeMode) {
dudmuck 15:cdc215392e60 1994 radio.set_opmode(RF_OPMODE_STANDBY);
dudmuck 15:cdc215392e60 1995 per_tx_delay = 0.3;
dudmuck 15:cdc215392e60 1996
dudmuck 15:cdc215392e60 1997 fsk.RegFifoThreshold.octet = radio.read_reg(REG_FSK_FIFOTHRESH);
dudmuck 15:cdc215392e60 1998 fsk.RegFifoThreshold.bits.TxStartCondition = 1; // to nFifoEmpty
dudmuck 15:cdc215392e60 1999 radio.write_reg(REG_FSK_FIFOTHRESH, fsk.RegFifoThreshold.octet);
dudmuck 15:cdc215392e60 2000
dudmuck 15:cdc215392e60 2001 if (radio.read_reg(REG_FSK_SYNCVALUE1) == 0x55 && radio.read_reg(REG_FSK_SYNCVALUE2)) {
dudmuck 15:cdc215392e60 2002 fsk.RegSyncConfig.octet = radio.read_reg(REG_FSK_SYNCCONFIG);
dudmuck 15:cdc215392e60 2003 fsk.RegSyncConfig.bits.SyncSize = 2;
dudmuck 15:cdc215392e60 2004 radio.write_reg(REG_FSK_SYNCCONFIG, fsk.RegSyncConfig.octet);
dudmuck 15:cdc215392e60 2005 radio.write_reg(REG_FSK_SYNCVALUE3, 0x90);
dudmuck 15:cdc215392e60 2006 radio.write_reg(REG_FSK_SYNCVALUE2, 0x4e);
dudmuck 15:cdc215392e60 2007 radio.write_reg(REG_FSK_SYNCVALUE1, 0x63);
dudmuck 15:cdc215392e60 2008 }
dudmuck 15:cdc215392e60 2009
dudmuck 15:cdc215392e60 2010 fsk.RegPreambleDetect.octet = radio.read_reg(REG_FSK_PREAMBLEDETECT);
dudmuck 15:cdc215392e60 2011 fsk.RegPreambleDetect.bits.PreambleDetectorOn = 1;
dudmuck 15:cdc215392e60 2012 radio.write_reg(REG_FSK_PREAMBLEDETECT, fsk.RegPreambleDetect.octet);
dudmuck 15:cdc215392e60 2013
dudmuck 15:cdc215392e60 2014 fsk.RegRxConfig.octet = radio.read_reg(REG_FSK_RXCONFIG);
dudmuck 15:cdc215392e60 2015 fsk.RegRxConfig.bits.AfcAutoOn = 1;
dudmuck 15:cdc215392e60 2016 fsk.RegRxConfig.bits.AgcAutoOn = 1;
dudmuck 15:cdc215392e60 2017 fsk.RegRxConfig.bits.RxTrigger = 7;
dudmuck 15:cdc215392e60 2018 radio.write_reg(REG_FSK_RXCONFIG, fsk.RegRxConfig.octet);
dudmuck 15:cdc215392e60 2019
dudmuck 15:cdc215392e60 2020 fsk.RegPreambleDetect.bits.PreambleDetectorOn = 1;
dudmuck 15:cdc215392e60 2021 fsk.RegPreambleDetect.bits.PreambleDetectorSize = 1;
dudmuck 15:cdc215392e60 2022 fsk.RegPreambleDetect.bits.PreambleDetectorTol = 10;
dudmuck 15:cdc215392e60 2023 radio.write_reg(REG_FSK_PREAMBLEDETECT, fsk.RegPreambleDetect.octet);
dudmuck 15:cdc215392e60 2024
dudmuck 15:cdc215392e60 2025 switch (pcbuf[1]) {
dudmuck 15:cdc215392e60 2026 case '0':
dudmuck 15:cdc215392e60 2027 fsk.set_bitrate(4800);
dudmuck 15:cdc215392e60 2028 fsk.set_tx_fdev_hz(5005);
dudmuck 15:cdc215392e60 2029 fsk.set_rx_dcc_bw_hz(10417, 0); // rxbw
dudmuck 15:cdc215392e60 2030 fsk.set_rx_dcc_bw_hz(50000, 1); // afcbw
dudmuck 15:cdc215392e60 2031 radio.write_u16(REG_FSK_PREAMBLEMSB, 8);
dudmuck 15:cdc215392e60 2032 break;
dudmuck 15:cdc215392e60 2033 case '1':
dudmuck 15:cdc215392e60 2034 fsk.set_bitrate(50000);
dudmuck 15:cdc215392e60 2035 fsk.set_tx_fdev_hz(25000);
dudmuck 15:cdc215392e60 2036 fsk.set_rx_dcc_bw_hz(62500, 0); // rxbw
dudmuck 15:cdc215392e60 2037 fsk.set_rx_dcc_bw_hz(100000, 1); // afcbw
dudmuck 15:cdc215392e60 2038 radio.write_u16(REG_FSK_PREAMBLEMSB, 9);
dudmuck 15:cdc215392e60 2039 break;
dudmuck 15:cdc215392e60 2040 case '2':
dudmuck 15:cdc215392e60 2041 fsk.set_bitrate(38400);
dudmuck 15:cdc215392e60 2042 fsk.set_tx_fdev_hz(20020);
dudmuck 15:cdc215392e60 2043 fsk.set_rx_dcc_bw_hz(50000, 0); // rxbw
dudmuck 15:cdc215392e60 2044 fsk.set_rx_dcc_bw_hz(100000, 1); // afcbw
dudmuck 15:cdc215392e60 2045 radio.write_u16(REG_FSK_PREAMBLEMSB, 8);
dudmuck 15:cdc215392e60 2046 break;
dudmuck 15:cdc215392e60 2047 case '3':
dudmuck 15:cdc215392e60 2048 fsk.set_bitrate(1201);
dudmuck 15:cdc215392e60 2049 fsk.set_tx_fdev_hz(20020);
dudmuck 15:cdc215392e60 2050 fsk.set_rx_dcc_bw_hz(25000, 0); // rxbw
dudmuck 15:cdc215392e60 2051 fsk.set_rx_dcc_bw_hz(50000, 1); // afcbw
dudmuck 15:cdc215392e60 2052 radio.write_u16(REG_FSK_PREAMBLEMSB, 8);
dudmuck 15:cdc215392e60 2053 break;
dudmuck 15:cdc215392e60 2054 case '4':
dudmuck 15:cdc215392e60 2055 fsk.set_bitrate(1201);
dudmuck 15:cdc215392e60 2056 fsk.set_tx_fdev_hz(4028);
dudmuck 15:cdc215392e60 2057 fsk.set_rx_dcc_bw_hz(7813, 0); // rxbw
dudmuck 15:cdc215392e60 2058 fsk.set_rx_dcc_bw_hz(25000, 1); // afcbw
dudmuck 15:cdc215392e60 2059 radio.write_u16(REG_FSK_PREAMBLEMSB, 8);
dudmuck 15:cdc215392e60 2060 break;
dudmuck 15:cdc215392e60 2061 case '5':
dudmuck 15:cdc215392e60 2062 fsk.set_bitrate(1201);
dudmuck 15:cdc215392e60 2063 fsk.set_tx_fdev_hz(4028);
dudmuck 15:cdc215392e60 2064 fsk.set_rx_dcc_bw_hz(5208, 0); // rxbw
dudmuck 15:cdc215392e60 2065 fsk.set_rx_dcc_bw_hz(10417, 1); // afcbw
dudmuck 15:cdc215392e60 2066 radio.write_u16(REG_FSK_PREAMBLEMSB, 8);
dudmuck 15:cdc215392e60 2067 break;
dudmuck 15:cdc215392e60 2068 } // ...switch (pcbuf[1])
Wayne Roberts 17:f73dbeca8736 2069 printf("%" PRIu32" bps fdev:%" PRIu32 "hz ", fsk.get_bitrate(), fsk.get_tx_fdev_hz());
Wayne Roberts 17:f73dbeca8736 2070 printf("rxbw:%" PRIu32 "Hz ", fsk.get_rx_bw_hz(REG_FSK_RXBW));
Wayne Roberts 17:f73dbeca8736 2071 printf("afcbw:%" PRIu32 "Hz preambleLen:%d\r\n", fsk.get_rx_bw_hz(REG_FSK_AFCBW), radio.read_u16(REG_FSK_PREAMBLEMSB));
dudmuck 13:a22debeee855 2072 } else if (pcbuf[0] == 'o' && pcbuf[1] == 'c' && pcbuf[2] == 'p') {
dudmuck 13:a22debeee855 2073 if (pcbuf[3] >= '0' && pcbuf[3] <= '9') {
dudmuck 13:a22debeee855 2074 sscanf(pcbuf+3, "%d", &i);
dudmuck 13:a22debeee855 2075 if (i < 130)
dudmuck 13:a22debeee855 2076 radio.RegOcp.bits.OcpTrim = (i - 45) / 5;
dudmuck 13:a22debeee855 2077 else
dudmuck 13:a22debeee855 2078 radio.RegOcp.bits.OcpTrim = (i + 30) / 10;
dudmuck 13:a22debeee855 2079 radio.write_reg(REG_OCP, radio.RegOcp.octet);
dudmuck 13:a22debeee855 2080 }
dudmuck 13:a22debeee855 2081 radio.RegOcp.octet = radio.read_reg(REG_OCP);
dudmuck 13:a22debeee855 2082 if (radio.RegOcp.bits.OcpTrim < 16)
dudmuck 13:a22debeee855 2083 i = 45 + (5 * radio.RegOcp.bits.OcpTrim);
dudmuck 13:a22debeee855 2084 else if (radio.RegOcp.bits.OcpTrim < 28)
dudmuck 13:a22debeee855 2085 i = (10 * radio.RegOcp.bits.OcpTrim) - 30;
dudmuck 13:a22debeee855 2086 else
dudmuck 13:a22debeee855 2087 i = 240;
dudmuck 13:a22debeee855 2088 printf("Ocp: %dmA\r\n", i);
dudmuck 0:9c2b09ecb20f 2089 } else if (pcbuf[0] == 'c' && pcbuf[1] == 'r' && radio.RegOpMode.bits.LongRangeMode) {
dudmuck 0:9c2b09ecb20f 2090 if (pcbuf[2] >= '0' && pcbuf[2] <= '9')
dudmuck 0:9c2b09ecb20f 2091 lora.setCodingRate(pcbuf[2] - '0');
dudmuck 0:9c2b09ecb20f 2092 lora.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
dudmuck 0:9c2b09ecb20f 2093 lora_printCodingRate(false); // false: transmitted
dudmuck 0:9c2b09ecb20f 2094 printf("\r\n");
dudmuck 0:9c2b09ecb20f 2095 } else if (pcbuf[0] == 'h' && pcbuf[1] == 'm' && radio.RegOpMode.bits.LongRangeMode) { // toggle implicit/explicit
dudmuck 0:9c2b09ecb20f 2096 lora.setHeaderMode(!lora.getHeaderMode());
dudmuck 0:9c2b09ecb20f 2097 lora.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
dudmuck 0:9c2b09ecb20f 2098 lora_printHeaderMode();
dudmuck 0:9c2b09ecb20f 2099 printf("\r\n");
dudmuck 5:329557e0625c 2100 } else if (pcbuf[0] == 'a' && pcbuf[1] == 'g' && !radio.RegOpMode.bits.LongRangeMode) {
dudmuck 5:329557e0625c 2101 fsk.RegRxConfig.bits.AgcAutoOn ^= 1;
dudmuck 5:329557e0625c 2102 radio.write_reg(REG_FSK_RXCONFIG, fsk.RegRxConfig.octet);
dudmuck 5:329557e0625c 2103 printf("AgcAutoOn:%d\r\n", fsk.RegRxConfig.bits.AgcAutoOn);
dudmuck 0:9c2b09ecb20f 2104 } else if (pcbuf[0] == 'a' && pcbuf[1] == 'l' && !radio.RegOpMode.bits.LongRangeMode) {
dudmuck 0:9c2b09ecb20f 2105 fsk.RegAfcFei.bits.AfcAutoClearOn ^= 1;
dudmuck 0:9c2b09ecb20f 2106 printf("AfcAutoClearOn: ");
dudmuck 0:9c2b09ecb20f 2107 radio.write_reg(REG_FSK_AFCFEI, fsk.RegAfcFei.octet);
dudmuck 0:9c2b09ecb20f 2108 if (fsk.RegAfcFei.bits.AfcAutoClearOn)
dudmuck 0:9c2b09ecb20f 2109 printf("ON\r\n");
dudmuck 0:9c2b09ecb20f 2110 else
dudmuck 0:9c2b09ecb20f 2111 printf("off\r\n");
dudmuck 0:9c2b09ecb20f 2112 } else if (pcbuf[0] == 'a' && pcbuf[1] == 'r' && !radio.RegOpMode.bits.LongRangeMode) {
dudmuck 0:9c2b09ecb20f 2113 fsk.RegSyncConfig.bits.AutoRestartRxMode++;
dudmuck 0:9c2b09ecb20f 2114 radio.write_reg(REG_FSK_SYNCCONFIG, fsk.RegSyncConfig.octet);
dudmuck 0:9c2b09ecb20f 2115 fsk.RegSyncConfig.octet = radio.read_reg(REG_FSK_SYNCCONFIG);
dudmuck 0:9c2b09ecb20f 2116 printf("AutoRestartRxMode:");
dudmuck 0:9c2b09ecb20f 2117 switch (fsk.RegSyncConfig.bits.AutoRestartRxMode) {
dudmuck 0:9c2b09ecb20f 2118 case 0: printf("off "); break;
dudmuck 0:9c2b09ecb20f 2119 case 1: printf("no-pll-wait "); break;
dudmuck 0:9c2b09ecb20f 2120 case 2: printf("pll-wait "); break;
dudmuck 0:9c2b09ecb20f 2121 case 3: printf("3 "); break;
dudmuck 0:9c2b09ecb20f 2122 }
dudmuck 0:9c2b09ecb20f 2123 printf("\r\n");
dudmuck 0:9c2b09ecb20f 2124 } else if (pcbuf[0] == 'a' && pcbuf[1] == 'c' && !radio.RegOpMode.bits.LongRangeMode) {
dudmuck 0:9c2b09ecb20f 2125 printf("clear afc: ");
dudmuck 0:9c2b09ecb20f 2126 fsk.RegAfcFei.bits.AfcClear = 1;
dudmuck 0:9c2b09ecb20f 2127 radio.write_reg(REG_FSK_AFCFEI, fsk.RegAfcFei.octet);
dudmuck 0:9c2b09ecb20f 2128 fsk.RegAfcFei.bits.AfcClear = 0;
dudmuck 0:9c2b09ecb20f 2129 printf("%dHz\r\n", (int)(FREQ_STEP_HZ * radio.read_s16(REG_FSK_AFCMSB)));
dudmuck 2:fb41d1c4b299 2130 } else if (pcbuf[0] == 'b' && pcbuf[1] == 'g' && pcbuf[2] == 'r') {
dudmuck 2:fb41d1c4b299 2131 RegPdsTrim1_t pds_trim;
dudmuck 15:cdc215392e60 2132 pds_trim.octet = radio.read_reg(REG_PDSTRIM1_SX1272);
dudmuck 2:fb41d1c4b299 2133 if (pcbuf[3] >= '0' && pcbuf[3] <= '9') {
dudmuck 2:fb41d1c4b299 2134 sscanf(&pcbuf[3], "%d", &i);
dudmuck 2:fb41d1c4b299 2135 pds_trim.bits.prog_txdac = i;
dudmuck 2:fb41d1c4b299 2136 }
dudmuck 15:cdc215392e60 2137 radio.write_reg(REG_PDSTRIM1_SX1272, pds_trim.octet);
dudmuck 2:fb41d1c4b299 2138 printf("prog_txdac:%.1fuA\r\n", 2.5 + (pds_trim.bits.prog_txdac * 0.625));
dudmuck 13:a22debeee855 2139 /* increase OCP threshold to allow more power */
dudmuck 13:a22debeee855 2140 radio.RegOcp.octet = radio.read_reg(REG_OCP);
dudmuck 13:a22debeee855 2141 if (radio.RegOcp.bits.OcpTrim < 16) {
dudmuck 13:a22debeee855 2142 radio.RegOcp.bits.OcpTrim = 16;
dudmuck 13:a22debeee855 2143 radio.write_reg(REG_OCP, radio.RegOcp.octet);
dudmuck 13:a22debeee855 2144 }
dudmuck 0:9c2b09ecb20f 2145 } else if (pcbuf[0] == 'b' && pcbuf[1] == 'r' && !radio.RegOpMode.bits.LongRangeMode) {
dudmuck 0:9c2b09ecb20f 2146 if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
dudmuck 0:9c2b09ecb20f 2147 sscanf(&pcbuf[2], "%d", &i);
dudmuck 0:9c2b09ecb20f 2148 fsk.set_bitrate(i);
dudmuck 0:9c2b09ecb20f 2149 }
Wayne Roberts 17:f73dbeca8736 2150 printf("%" PRIu32 "bps\r\n", fsk.get_bitrate());
dudmuck 0:9c2b09ecb20f 2151 } else if (pcbuf[0] == 'b' && pcbuf[1] == 'w') {
dudmuck 0:9c2b09ecb20f 2152 if (radio.RegOpMode.bits.LongRangeMode) {
dudmuck 0:9c2b09ecb20f 2153 if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
dudmuck 0:9c2b09ecb20f 2154 radio.set_opmode(RF_OPMODE_STANDBY);
dudmuck 0:9c2b09ecb20f 2155 sscanf(&pcbuf[2], "%d", &i);
dudmuck 0:9c2b09ecb20f 2156 lora.setBw(i);
dudmuck 0:9c2b09ecb20f 2157 } else
dudmuck 0:9c2b09ecb20f 2158 lora_printAllBw();
dudmuck 0:9c2b09ecb20f 2159 lora.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
dudmuck 0:9c2b09ecb20f 2160 printf("current ");
dudmuck 0:9c2b09ecb20f 2161 lora_printBw();
dudmuck 0:9c2b09ecb20f 2162 printf("\r\n");
dudmuck 0:9c2b09ecb20f 2163 } else { // FSK:
dudmuck 0:9c2b09ecb20f 2164 if (pcbuf[2] == 'a') {
dudmuck 0:9c2b09ecb20f 2165 if (pcbuf[3] >= '0' && pcbuf[3] <= '9') {
dudmuck 0:9c2b09ecb20f 2166 radio.set_opmode(RF_OPMODE_STANDBY);
dudmuck 0:9c2b09ecb20f 2167 sscanf(&pcbuf[3], "%d", &i);
dudmuck 0:9c2b09ecb20f 2168 fsk.set_rx_dcc_bw_hz(i, 1);
dudmuck 0:9c2b09ecb20f 2169 }
Wayne Roberts 17:f73dbeca8736 2170 printf("afcbw:%" PRIu32 "Hz\r\n", fsk.get_rx_bw_hz(REG_FSK_AFCBW));
dudmuck 0:9c2b09ecb20f 2171 } else {
dudmuck 0:9c2b09ecb20f 2172 if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
dudmuck 0:9c2b09ecb20f 2173 radio.set_opmode(RF_OPMODE_STANDBY);
dudmuck 0:9c2b09ecb20f 2174 sscanf(&pcbuf[2], "%d", &i);
dudmuck 0:9c2b09ecb20f 2175 fsk.set_rx_dcc_bw_hz(i, 0);
dudmuck 0:9c2b09ecb20f 2176 }
Wayne Roberts 17:f73dbeca8736 2177 printf("rxbw:%" PRIu32 "Hz\r\n", fsk.get_rx_bw_hz(REG_FSK_RXBW));
dudmuck 0:9c2b09ecb20f 2178 }
dudmuck 0:9c2b09ecb20f 2179 }
dudmuck 0:9c2b09ecb20f 2180 } else if (pcbuf[0] == 'v' && pcbuf[1] == 'h') {
dudmuck 0:9c2b09ecb20f 2181 lora.poll_vh ^= 1;
dudmuck 0:9c2b09ecb20f 2182 printf("poll_vh:%d\r\n", lora.poll_vh);
dudmuck 0:9c2b09ecb20f 2183 } else if (pcbuf[0] == 'S' && !radio.RegOpMode.bits.LongRangeMode) {
dudmuck 0:9c2b09ecb20f 2184 if (pcbuf[1] == '0') {
Wayne Roberts 17:f73dbeca8736 2185 sscanf(pcbuf+1, "%" SCNu32, &ui);
dudmuck 0:9c2b09ecb20f 2186 if (ui < 0x100) {
dudmuck 0:9c2b09ecb20f 2187 fsk.RegSyncConfig.bits.SyncSize = 0;
dudmuck 0:9c2b09ecb20f 2188 radio.write_reg(REG_FSK_SYNCVALUE1, ui);
dudmuck 0:9c2b09ecb20f 2189 } else if (ui < 0x10000) {
dudmuck 0:9c2b09ecb20f 2190 fsk.RegSyncConfig.bits.SyncSize = 1;
dudmuck 0:9c2b09ecb20f 2191 radio.write_reg(REG_FSK_SYNCVALUE2, ui & 0xff);
dudmuck 0:9c2b09ecb20f 2192 radio.write_reg(REG_FSK_SYNCVALUE1, ui >> 8);
dudmuck 0:9c2b09ecb20f 2193 } else if (ui < 0x1000000) {
dudmuck 0:9c2b09ecb20f 2194 fsk.RegSyncConfig.bits.SyncSize = 2;
dudmuck 0:9c2b09ecb20f 2195 radio.write_reg(REG_FSK_SYNCVALUE3, ui & 0xff);
dudmuck 0:9c2b09ecb20f 2196 radio.write_reg(REG_FSK_SYNCVALUE2, (ui >> 8) & 0xff);
dudmuck 0:9c2b09ecb20f 2197 radio.write_reg(REG_FSK_SYNCVALUE1, ui >> 16);
dudmuck 0:9c2b09ecb20f 2198 } else {
dudmuck 0:9c2b09ecb20f 2199 fsk.RegSyncConfig.bits.SyncSize = 3;
dudmuck 0:9c2b09ecb20f 2200 radio.write_reg(REG_FSK_SYNCVALUE4, ui & 0xff);
dudmuck 0:9c2b09ecb20f 2201 radio.write_reg(REG_FSK_SYNCVALUE3, (ui >> 8) & 0xff);
dudmuck 0:9c2b09ecb20f 2202 radio.write_reg(REG_FSK_SYNCVALUE2, (ui >> 16) & 0xff);
dudmuck 0:9c2b09ecb20f 2203 radio.write_reg(REG_FSK_SYNCVALUE1, ui >> 24);
dudmuck 0:9c2b09ecb20f 2204 }
dudmuck 0:9c2b09ecb20f 2205 radio.write_reg(REG_FSK_SYNCCONFIG, fsk.RegSyncConfig.octet);
dudmuck 0:9c2b09ecb20f 2206 }
dudmuck 0:9c2b09ecb20f 2207 fsk.RegSyncConfig.octet = radio.read_reg(REG_FSK_SYNCCONFIG);
dudmuck 0:9c2b09ecb20f 2208 printf("%d: ", fsk.RegSyncConfig.bits.SyncSize);
dudmuck 0:9c2b09ecb20f 2209 for (i = 0; i <= fsk.RegSyncConfig.bits.SyncSize; i++)
dudmuck 0:9c2b09ecb20f 2210 printf("%02x ", radio.read_reg(REG_FSK_SYNCVALUE1+i));
dudmuck 0:9c2b09ecb20f 2211 printf("\r\n");
dudmuck 10:a3e2c558c003 2212 } else if (pcbuf[0] == 's' && pcbuf[1] == 'e' && pcbuf[2] == 'r') {
dudmuck 10:a3e2c558c003 2213 service_en ^= 1;
dudmuck 10:a3e2c558c003 2214 printf("service_en:%d\r\n", service_en);
dudmuck 5:329557e0625c 2215 } else if (pcbuf[0] == 's' && pcbuf[1] == 's') {
dudmuck 5:329557e0625c 2216 if (radio.RegOpMode.bits.LongRangeMode) { // sweep test on lora sync
dudmuck 5:329557e0625c 2217 if (pcbuf[2] == 'h') { // sweep high nibble
dudmuck 5:329557e0625c 2218 lora_sync_sweep_hi = 1;
dudmuck 5:329557e0625c 2219 } else if (pcbuf[2] == 'l') { // sweep low nibble
dudmuck 5:329557e0625c 2220 lora_sync_sweep_hi = 0;
dudmuck 5:329557e0625c 2221 }
dudmuck 5:329557e0625c 2222 lora_sync_byte = radio.read_reg(REG_LR_SYNC_BYTE);
dudmuck 5:329557e0625c 2223 hop_timeout.attach(&lora_sync_sweep, 0.1);
dudmuck 5:329557e0625c 2224 } else {
dudmuck 5:329557e0625c 2225 if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
dudmuck 5:329557e0625c 2226 sscanf(pcbuf+2, "%d", &i);
dudmuck 5:329557e0625c 2227 fsk.RegSyncConfig.bits.SyncSize = i;
dudmuck 5:329557e0625c 2228 radio.write_reg(REG_FSK_SYNCCONFIG, fsk.RegSyncConfig.octet);
dudmuck 5:329557e0625c 2229 }
dudmuck 5:329557e0625c 2230 fsk.RegSyncConfig.octet = radio.read_reg(REG_FSK_SYNCCONFIG);
dudmuck 5:329557e0625c 2231 printf("SyncSize:%d\r\n", fsk.RegSyncConfig.bits.SyncSize);
dudmuck 0:9c2b09ecb20f 2232 }
dudmuck 0:9c2b09ecb20f 2233 } else if (pcbuf[0] == 's' && pcbuf[1] == 'f' && radio.RegOpMode.bits.LongRangeMode) {
dudmuck 0:9c2b09ecb20f 2234 if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
dudmuck 0:9c2b09ecb20f 2235 sscanf(pcbuf+2, "%d", &i);
dudmuck 0:9c2b09ecb20f 2236 lora.setSf(i);
dudmuck 0:9c2b09ecb20f 2237 if (i == 6 && !lora.getHeaderMode()) {
dudmuck 0:9c2b09ecb20f 2238 printf("SF6: to implicit header mode\r\n");
dudmuck 0:9c2b09ecb20f 2239 lora.setHeaderMode(true);
dudmuck 0:9c2b09ecb20f 2240 }
dudmuck 0:9c2b09ecb20f 2241 }
dudmuck 0:9c2b09ecb20f 2242 lora.RegModemConfig2.octet = radio.read_reg(REG_LR_MODEMCONFIG2);
dudmuck 0:9c2b09ecb20f 2243 lora_printSf();
dudmuck 0:9c2b09ecb20f 2244 printf("\r\n");
dudmuck 5:329557e0625c 2245 } else if (pcbuf[0] == 'f' && pcbuf[1] == 'i' && !radio.RegOpMode.bits.LongRangeMode) {
dudmuck 5:329557e0625c 2246 fsk.init();
dudmuck 5:329557e0625c 2247 printf("fsk.init\r\n");
dudmuck 0:9c2b09ecb20f 2248 } else if (pcbuf[0] == 'f' && pcbuf[1] == 'd' && pcbuf[2] == 'e' && !radio.RegOpMode.bits.LongRangeMode) {
dudmuck 0:9c2b09ecb20f 2249 if (pcbuf[4] >= '0' && pcbuf[4] <= '9') {
dudmuck 0:9c2b09ecb20f 2250 sscanf(pcbuf+4, "%d", &i);
dudmuck 0:9c2b09ecb20f 2251 fsk.set_tx_fdev_hz(i);
dudmuck 0:9c2b09ecb20f 2252 }
Wayne Roberts 17:f73dbeca8736 2253 printf("fdev:%" PRIu32 "Hz\r\n", fsk.get_tx_fdev_hz());
dudmuck 0:9c2b09ecb20f 2254 } else if (pcbuf[0] == 'f' && pcbuf[1] == 'r' && pcbuf[2] == 'f') {
dudmuck 0:9c2b09ecb20f 2255 if (pcbuf[3] >= '0' && pcbuf[3] <= '9') {
dudmuck 0:9c2b09ecb20f 2256 float MHz;
dudmuck 0:9c2b09ecb20f 2257 sscanf(pcbuf+3, "%f", &MHz);
dudmuck 0:9c2b09ecb20f 2258 //printf("MHz:%f\r\n", MHz);
dudmuck 0:9c2b09ecb20f 2259 radio.set_frf_MHz(MHz);
dudmuck 0:9c2b09ecb20f 2260 }
dudmuck 0:9c2b09ecb20f 2261 printf("%fMHz\r\n", radio.get_frf_MHz());
dudmuck 2:fb41d1c4b299 2262 } else if (pcbuf[0] == 'p' && pcbuf[1] == 'i' && pcbuf[2] == 'd') {
dudmuck 2:fb41d1c4b299 2263 if (pcbuf[3] >= '0' && pcbuf[3] <= '9') {
dudmuck 2:fb41d1c4b299 2264 sscanf(pcbuf+3, "%d", &per_id);
dudmuck 2:fb41d1c4b299 2265 }
dudmuck 7:6d5f193b6c2f 2266 printf("PER device ID:%d\r\n", per_id);
dudmuck 2:fb41d1c4b299 2267 } else if (pcbuf[0] == 'p' && pcbuf[1] == 'i' && pcbuf[2] == 'n') {
dudmuck 2:fb41d1c4b299 2268 if (pcbuf[3] >= '0' && pcbuf[3] <= '9') {
dudmuck 13:a22debeee855 2269 sscanf(pcbuf+3, "%f", &per_tx_delay);
dudmuck 2:fb41d1c4b299 2270 }
dudmuck 7:6d5f193b6c2f 2271 printf("per_tx_delay:%f\r\n", per_tx_delay);
dudmuck 2:fb41d1c4b299 2272 } else if (pcbuf[0] == 'p' && pcbuf[1] == 'e' && pcbuf[2] == 'r') {
dudmuck 2:fb41d1c4b299 2273 per_en ^= 1;
dudmuck 7:6d5f193b6c2f 2274 printf("per_en:%d\r\n", per_en);
dudmuck 2:fb41d1c4b299 2275 if (per_en && radio.RegOpMode.bits.LongRangeMode) {
dudmuck 2:fb41d1c4b299 2276 if (radio.type == SX1272) {
dudmuck 2:fb41d1c4b299 2277 lora.RegModemConfig.sx1272bits.LowDataRateOptimize = 1;
dudmuck 2:fb41d1c4b299 2278 radio.write_reg(REG_LR_MODEMCONFIG, lora.RegModemConfig.octet);
dudmuck 2:fb41d1c4b299 2279 } else if (radio.type == SX1276) {
dudmuck 2:fb41d1c4b299 2280 lora.RegModemConfig3.sx1276bits.LowDataRateOptimize = 1;
dudmuck 2:fb41d1c4b299 2281 radio.write_reg(REG_LR_MODEMCONFIG3, lora.RegModemConfig3.octet);
dudmuck 2:fb41d1c4b299 2282 }
dudmuck 2:fb41d1c4b299 2283 lora.RegPayloadLength = 9;
dudmuck 2:fb41d1c4b299 2284 radio.write_reg(REG_LR_PAYLOADLENGTH, lora.RegPayloadLength);
dudmuck 2:fb41d1c4b299 2285 radio.RegDioMapping1.bits.Dio3Mapping = 1; // to ValidHeader
dudmuck 2:fb41d1c4b299 2286 radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet);
dudmuck 2:fb41d1c4b299 2287 }
dudmuck 2:fb41d1c4b299 2288 PacketRxSequencePrev = -1;
dudmuck 2:fb41d1c4b299 2289 //PacketRxSequence = 0;
dudmuck 2:fb41d1c4b299 2290 PacketPerKoCnt = 0;
dudmuck 2:fb41d1c4b299 2291 PacketPerOkCnt = 0;
dudmuck 2:fb41d1c4b299 2292 PacketNormalCnt = 0;
dudmuck 2:fb41d1c4b299 2293 if (!per_en) {
dudmuck 2:fb41d1c4b299 2294 per_timeout.detach();
dudmuck 2:fb41d1c4b299 2295 }
dudmuck 0:9c2b09ecb20f 2296 } else if (pcbuf[0] == 'p' && pcbuf[1] == 'r' && pcbuf[2] == 'e') {
dudmuck 0:9c2b09ecb20f 2297 if (radio.RegOpMode.bits.LongRangeMode) {
dudmuck 0:9c2b09ecb20f 2298 if (pcbuf[3] >= '0' && pcbuf[3] <= '9') {
dudmuck 0:9c2b09ecb20f 2299 sscanf(pcbuf+3, "%d", &i);
dudmuck 0:9c2b09ecb20f 2300 radio.write_u16(REG_LR_PREAMBLEMSB, i);
dudmuck 0:9c2b09ecb20f 2301 }
dudmuck 0:9c2b09ecb20f 2302 lora.RegPreamble = radio.read_u16(REG_LR_PREAMBLEMSB);
dudmuck 0:9c2b09ecb20f 2303 printf("lora PreambleLength:%d\r\n", lora.RegPreamble);
dudmuck 0:9c2b09ecb20f 2304 } else {
dudmuck 0:9c2b09ecb20f 2305 if (pcbuf[3] >= '0' && pcbuf[3] <= '9') {
dudmuck 0:9c2b09ecb20f 2306 sscanf(pcbuf+3, "%d", &i);
dudmuck 0:9c2b09ecb20f 2307 radio.write_u16(REG_FSK_PREAMBLEMSB, i);
dudmuck 0:9c2b09ecb20f 2308 }
dudmuck 0:9c2b09ecb20f 2309 printf("FSK TX PreambleSize:%d\r\n", radio.read_u16(REG_FSK_PREAMBLEMSB));
dudmuck 0:9c2b09ecb20f 2310 }
dudmuck 0:9c2b09ecb20f 2311 } else if (pcbuf[0] == 'p' && pcbuf[1] == 't' && !radio.RegOpMode.bits.LongRangeMode) {
dudmuck 0:9c2b09ecb20f 2312 if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
dudmuck 0:9c2b09ecb20f 2313 sscanf(pcbuf+2, "%d", &i);
dudmuck 0:9c2b09ecb20f 2314 fsk.RegPreambleDetect.bits.PreambleDetectorTol = i;
dudmuck 0:9c2b09ecb20f 2315 radio.write_reg(REG_FSK_PREAMBLEDETECT, fsk.RegPreambleDetect.octet);
dudmuck 0:9c2b09ecb20f 2316 }
dudmuck 0:9c2b09ecb20f 2317 fsk.RegPreambleDetect.octet = radio.read_reg(REG_FSK_PREAMBLEDETECT);
dudmuck 0:9c2b09ecb20f 2318 printf("PreambleDetectorTol:%d\r\n", fsk.RegPreambleDetect.bits.PreambleDetectorTol);
dudmuck 2:fb41d1c4b299 2319 } else if (pcbuf[0] == 'p' && pcbuf[1] == 'd' && pcbuf[2] == '2') {
dudmuck 2:fb41d1c4b299 2320 if (pd2.read())
dudmuck 2:fb41d1c4b299 2321 pd2 = 0;
dudmuck 2:fb41d1c4b299 2322 else
dudmuck 2:fb41d1c4b299 2323 pd2 = 1;
dudmuck 7:6d5f193b6c2f 2324 printf("pd2:%d\r\n", pd2.read());
dudmuck 0:9c2b09ecb20f 2325 } else if (pcbuf[0] == 'p' && pcbuf[1] == 'd' && !radio.RegOpMode.bits.LongRangeMode) {
dudmuck 0:9c2b09ecb20f 2326 fsk.RegPreambleDetect.bits.PreambleDetectorOn ^= 1;
dudmuck 0:9c2b09ecb20f 2327 radio.write_reg(REG_FSK_PREAMBLEDETECT, fsk.RegPreambleDetect.octet);
dudmuck 0:9c2b09ecb20f 2328 printf("PreambleDetector:");
dudmuck 0:9c2b09ecb20f 2329 if (fsk.RegPreambleDetect.bits.PreambleDetectorOn)
dudmuck 0:9c2b09ecb20f 2330 printf("On\r\n");
dudmuck 0:9c2b09ecb20f 2331 else
dudmuck 0:9c2b09ecb20f 2332 printf("OFF\r\n");
dudmuck 0:9c2b09ecb20f 2333 } else if (pcbuf[0] == 'p' && pcbuf[1] == 'l' && radio.RegOpMode.bits.LongRangeMode) {
dudmuck 0:9c2b09ecb20f 2334 if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
dudmuck 0:9c2b09ecb20f 2335 sscanf(pcbuf+2, "%d", &i);
dudmuck 0:9c2b09ecb20f 2336 lora.RegPayloadLength = i;
dudmuck 0:9c2b09ecb20f 2337 radio.write_reg(REG_LR_PAYLOADLENGTH, lora.RegPayloadLength);
dudmuck 0:9c2b09ecb20f 2338 }
dudmuck 0:9c2b09ecb20f 2339 lora.RegPayloadLength = radio.read_reg(REG_LR_PAYLOADLENGTH);
dudmuck 0:9c2b09ecb20f 2340 printf("PayloadLength:%d\r\n", lora.RegPayloadLength);
dudmuck 2:fb41d1c4b299 2341 } else if (pcbuf[0] == 'l' && pcbuf[1] == 'd' && radio.RegOpMode.bits.LongRangeMode) {
dudmuck 2:fb41d1c4b299 2342 if (radio.type == SX1272) {
dudmuck 2:fb41d1c4b299 2343 lora.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
dudmuck 2:fb41d1c4b299 2344 lora.RegModemConfig.sx1272bits.LowDataRateOptimize ^= 1;
dudmuck 2:fb41d1c4b299 2345 printf("LowDataRateOptimize:%d\r\n", lora.RegModemConfig.sx1272bits.LowDataRateOptimize);
dudmuck 2:fb41d1c4b299 2346 radio.write_reg(REG_LR_MODEMCONFIG, lora.RegModemConfig.octet);
dudmuck 2:fb41d1c4b299 2347 } else if (radio.type == SX1276) {
dudmuck 2:fb41d1c4b299 2348 lora.RegModemConfig3.octet = radio.read_reg(REG_LR_MODEMCONFIG3);
dudmuck 2:fb41d1c4b299 2349 lora.RegModemConfig3.sx1276bits.LowDataRateOptimize ^= 1;
dudmuck 2:fb41d1c4b299 2350 printf("LowDataRateOptimize:%d\r\n", lora.RegModemConfig3.sx1276bits.LowDataRateOptimize);
dudmuck 2:fb41d1c4b299 2351 radio.write_reg(REG_LR_MODEMCONFIG3, lora.RegModemConfig3.octet);
dudmuck 9:dc02ef560bd1 2352 }
dudmuck 9:dc02ef560bd1 2353 } else if (pcbuf[0] == 't' && pcbuf[1] == 'i' && pcbuf[2] == 'n' && radio.RegOpMode.bits.LongRangeMode) {
dudmuck 9:dc02ef560bd1 2354 lora.invert_tx(lora.RegTest33.bits.chirp_invert_tx);
dudmuck 9:dc02ef560bd1 2355 printf("chirp_invert_tx :%d\r\n", lora.RegTest33.bits.chirp_invert_tx);
dudmuck 9:dc02ef560bd1 2356 } else if (pcbuf[0] == 'r' && pcbuf[1] == 'i' && pcbuf[2] == 'n' && radio.RegOpMode.bits.LongRangeMode) {
dudmuck 9:dc02ef560bd1 2357 lora.invert_rx(!lora.RegTest33.bits.invert_i_q);
dudmuck 10:a3e2c558c003 2358 printf("rx invert_i_q:%d\r\n", lora.RegTest33.bits.invert_i_q);
dudmuck 10:a3e2c558c003 2359 } else if (pcbuf[0] == 'd' && pcbuf[1] == 'i' && pcbuf[2] == 'o') {
dudmuck 10:a3e2c558c003 2360 if (radio.RegOpMode.bits.LongRangeMode)
dudmuck 10:a3e2c558c003 2361 lora_print_dio();
dudmuck 10:a3e2c558c003 2362 else
dudmuck 10:a3e2c558c003 2363 fsk_print_dio();
dudmuck 10:a3e2c558c003 2364 printf("dio0:%d, dio1:%d\r\n", radio.dio0.read(), radio.dio0.read());
dudmuck 10:a3e2c558c003 2365 lora.RegIrqFlags.octet = radio.read_reg(REG_LR_IRQFLAGS);
dudmuck 10:a3e2c558c003 2366 printLoraIrqs_(false);
dudmuck 0:9c2b09ecb20f 2367 } else if (pcbuf[0] == 'd' && pcbuf[1] >= '0' && pcbuf[1] <= '5') {
dudmuck 0:9c2b09ecb20f 2368 switch (pcbuf[1]) {
dudmuck 0:9c2b09ecb20f 2369 case '0':
dudmuck 0:9c2b09ecb20f 2370 radio.RegDioMapping1.bits.Dio0Mapping++;
dudmuck 0:9c2b09ecb20f 2371 radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet);
dudmuck 0:9c2b09ecb20f 2372 break;
dudmuck 0:9c2b09ecb20f 2373 case '1':
dudmuck 0:9c2b09ecb20f 2374 radio.RegDioMapping1.bits.Dio1Mapping++;
dudmuck 0:9c2b09ecb20f 2375 radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet);
dudmuck 0:9c2b09ecb20f 2376 break;
dudmuck 0:9c2b09ecb20f 2377 case '2':
dudmuck 0:9c2b09ecb20f 2378 radio.RegDioMapping1.bits.Dio2Mapping++;
dudmuck 0:9c2b09ecb20f 2379 radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet);
dudmuck 0:9c2b09ecb20f 2380 break;
dudmuck 0:9c2b09ecb20f 2381 case '3':
dudmuck 0:9c2b09ecb20f 2382 radio.RegDioMapping1.bits.Dio3Mapping++;
dudmuck 0:9c2b09ecb20f 2383 radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet);
dudmuck 0:9c2b09ecb20f 2384 break;
dudmuck 0:9c2b09ecb20f 2385 case '4':
dudmuck 0:9c2b09ecb20f 2386 radio.RegDioMapping2.bits.Dio4Mapping++;
dudmuck 5:329557e0625c 2387 radio.write_reg(REG_DIOMAPPING2, radio.RegDioMapping2.octet);
dudmuck 0:9c2b09ecb20f 2388 break;
dudmuck 0:9c2b09ecb20f 2389 case '5':
dudmuck 0:9c2b09ecb20f 2390 radio.RegDioMapping2.bits.Dio5Mapping++;
dudmuck 5:329557e0625c 2391 radio.write_reg(REG_DIOMAPPING2, radio.RegDioMapping2.octet);
dudmuck 0:9c2b09ecb20f 2392 break;
dudmuck 0:9c2b09ecb20f 2393 } // ...switch (pcbuf[1])
dudmuck 0:9c2b09ecb20f 2394 if (radio.RegOpMode.bits.LongRangeMode)
dudmuck 0:9c2b09ecb20f 2395 lora_print_dio();
dudmuck 0:9c2b09ecb20f 2396 else
dudmuck 0:9c2b09ecb20f 2397 fsk_print_dio();
dudmuck 3:8924027a8933 2398 } else if (pcbuf[0] == 'g') { /******* GPS... **********/
dudmuck 3:8924027a8933 2399 if (pcbuf[1] == 'e') {
dudmuck 6:8defa260bc10 2400 //gps.enable(!gps.enabled());
dudmuck 6:8defa260bc10 2401 if (gps.enabled()) {
dudmuck 6:8defa260bc10 2402 gps.enable(false);
dudmuck 6:8defa260bc10 2403 printf("gps disabled\r\n");
dudmuck 6:8defa260bc10 2404 } else {
dudmuck 6:8defa260bc10 2405 gps.enable(true);
dudmuck 6:8defa260bc10 2406 printf("GPS enabled\r\n");
dudmuck 6:8defa260bc10 2407 }
dudmuck 6:8defa260bc10 2408 } else if (pcbuf[1] == 'v') {
dudmuck 6:8defa260bc10 2409 gps.verbose ^= 1;
dudmuck 6:8defa260bc10 2410 printf("gps.verbose:%d\r\n", gps.verbose);
dudmuck 3:8924027a8933 2411 }
dudmuck 10:a3e2c558c003 2412 } else if (pcbuf[0] == 'G') { // gpio registers. G<portABCD><MO><pin0-f>[0123]
dudmuck 10:a3e2c558c003 2413 GPIO_TypeDef *gpiox;
dudmuck 10:a3e2c558c003 2414 char bp[2];
dudmuck 10:a3e2c558c003 2415 bp[0] = pcbuf[3];
dudmuck 10:a3e2c558c003 2416 bp[1] = 0;
dudmuck 10:a3e2c558c003 2417 sscanf(bp, "%x", &i);
dudmuck 10:a3e2c558c003 2418 switch (pcbuf[1]) {
dudmuck 10:a3e2c558c003 2419 case 'A': gpiox = GPIOA; break;
dudmuck 10:a3e2c558c003 2420 case 'B': gpiox = GPIOB; break;
dudmuck 10:a3e2c558c003 2421 case 'C': gpiox = GPIOC; break;
dudmuck 10:a3e2c558c003 2422 case 'D': gpiox = GPIOD; break;
dudmuck 10:a3e2c558c003 2423 default: gpiox = NULL; break;
dudmuck 10:a3e2c558c003 2424 }
dudmuck 10:a3e2c558c003 2425 if (gpiox != NULL) {
dudmuck 10:a3e2c558c003 2426 if (pcbuf[2] == 'M') { // GPIOx->MODER
dudmuck 10:a3e2c558c003 2427 if (pcbuf[4] >= '0' && pcbuf[4] <= '3') {
dudmuck 10:a3e2c558c003 2428 a = i << 1;
dudmuck 10:a3e2c558c003 2429 ui = 3 << a;
dudmuck 10:a3e2c558c003 2430 d = pcbuf[4] - '0';
dudmuck 10:a3e2c558c003 2431 //gpiox->MODER &= ~ui;
dudmuck 10:a3e2c558c003 2432 gpiox->MODER &= ~ui;
dudmuck 10:a3e2c558c003 2433 gpiox->MODER |= d << a;;
Wayne Roberts 17:f73dbeca8736 2434 printf("ui:%08" PRIx32 ", d<<a:%08x\r\n", ui, d<<a);
dudmuck 10:a3e2c558c003 2435 }
dudmuck 10:a3e2c558c003 2436 for (len = 0; len < 16; len++) {
dudmuck 10:a3e2c558c003 2437 i = len << 1;
dudmuck 10:a3e2c558c003 2438 ui = gpiox->MODER >> i;
dudmuck 10:a3e2c558c003 2439 printf("%02d:", len);
dudmuck 10:a3e2c558c003 2440 switch (ui & 3) {
dudmuck 10:a3e2c558c003 2441 case 0: printf("input\r\n"); break;
dudmuck 10:a3e2c558c003 2442 case 1: printf("output\r\n"); break;
dudmuck 10:a3e2c558c003 2443 case 2: printf("AF\r\n"); break;
dudmuck 10:a3e2c558c003 2444 case 3: printf("analog\r\n"); break;
dudmuck 10:a3e2c558c003 2445 }
dudmuck 10:a3e2c558c003 2446 }
Wayne Roberts 17:f73dbeca8736 2447 printf("MODER:%08" PRIx32 "\r\n", gpiox->MODER);
dudmuck 10:a3e2c558c003 2448 } else if (pcbuf[2] == 'O') { // GPIOx->BSRR
dudmuck 10:a3e2c558c003 2449 ui = 1 << i;
dudmuck 10:a3e2c558c003 2450 if (pcbuf[4] == '0') {
dudmuck 10:a3e2c558c003 2451 gpiox->BSRR = ui << 16;
dudmuck 10:a3e2c558c003 2452 } else if (pcbuf[4] == '1') {
dudmuck 10:a3e2c558c003 2453 gpiox->BSRR = ui;
dudmuck 10:a3e2c558c003 2454 }
Wayne Roberts 17:f73dbeca8736 2455 printf("ODR:%08" PRIx32 "\r\n", gpiox->ODR);
dudmuck 10:a3e2c558c003 2456 }
dudmuck 10:a3e2c558c003 2457 }
dudmuck 10:a3e2c558c003 2458
dudmuck 0:9c2b09ecb20f 2459 } else if (pcbuf[0] == 's' && pcbuf[1] == 't' && pcbuf[2] == 'b') {
dudmuck 0:9c2b09ecb20f 2460 radio.set_opmode(RF_OPMODE_STANDBY);
dudmuck 6:8defa260bc10 2461 //green_led = LED_OFF;
dudmuck 2:fb41d1c4b299 2462 red_led = LED_OFF;
dudmuck 0:9c2b09ecb20f 2463 } else if (pcbuf[0] == 's' && pcbuf[1] == 'l' && pcbuf[2] == 'e') {
dudmuck 0:9c2b09ecb20f 2464 radio.set_opmode(RF_OPMODE_SLEEP);
dudmuck 6:8defa260bc10 2465 //green_led = LED_OFF;
dudmuck 2:fb41d1c4b299 2466 red_led = LED_OFF;
dudmuck 0:9c2b09ecb20f 2467 } else if (pcbuf[0] == 'c' && pcbuf[1] == 'h' && pcbuf[2] == 'a') {
dudmuck 0:9c2b09ecb20f 2468 app = APP_CHAT;
Wayne Roberts 17:f73dbeca8736 2469 lora.start_rx(RF_OPMODE_RECEIVER);
dudmuck 0:9c2b09ecb20f 2470 printf("chat start\r\n");
dudmuck 0:9c2b09ecb20f 2471 }
dudmuck 0:9c2b09ecb20f 2472 }
dudmuck 0:9c2b09ecb20f 2473 printf("> ");
dudmuck 0:9c2b09ecb20f 2474 fflush(stdout);
dudmuck 0:9c2b09ecb20f 2475
dudmuck 0:9c2b09ecb20f 2476 }
dudmuck 0:9c2b09ecb20f 2477
dudmuck 12:6afe8fed5385 2478 void get_mote_version()
dudmuck 12:6afe8fed5385 2479 {
dudmuck 12:6afe8fed5385 2480 char first;
dudmuck 12:6afe8fed5385 2481
dudmuck 12:6afe8fed5385 2482 /*DigitalOut pc_7(PC_7);
dudmuck 12:6afe8fed5385 2483 DigitalIn pc_1(PC_1);*/
dudmuck 12:6afe8fed5385 2484
dudmuck 12:6afe8fed5385 2485 pc_7 = 1;
dudmuck 12:6afe8fed5385 2486 first = pc_1;
dudmuck 12:6afe8fed5385 2487 pc_7 = 0;
dudmuck 12:6afe8fed5385 2488 if (first && !pc_1) {
dudmuck 12:6afe8fed5385 2489 //printf("v2-mote\r\n");
dudmuck 12:6afe8fed5385 2490 mote_version = MOTE_V2;
dudmuck 14:35e7156e73ff 2491 ain_bat = new AnalogIn(PA_0);
dudmuck 12:6afe8fed5385 2492 } else {
dudmuck 12:6afe8fed5385 2493 //printf("v3-mote\r\n");
dudmuck 12:6afe8fed5385 2494 mote_version = MOTE_V3;
dudmuck 14:35e7156e73ff 2495 ain_bat = new AnalogIn(PA_1);
dudmuck 12:6afe8fed5385 2496 }
dudmuck 12:6afe8fed5385 2497
dudmuck 12:6afe8fed5385 2498 }
dudmuck 12:6afe8fed5385 2499
dudmuck 0:9c2b09ecb20f 2500 int main()
dudmuck 0:9c2b09ecb20f 2501 {
dudmuck 10:a3e2c558c003 2502 set_time(0); // start RTC
dudmuck 10:a3e2c558c003 2503
dudmuck 0:9c2b09ecb20f 2504 pc.baud(57600);
dudmuck 3:8924027a8933 2505 gps.init();
dudmuck 3:8924027a8933 2506
dudmuck 7:6d5f193b6c2f 2507 printf("\nreset\r\n");
dudmuck 6:8defa260bc10 2508 //green_led = LED_OFF;
dudmuck 2:fb41d1c4b299 2509 red_led = LED_OFF;
dudmuck 13:a22debeee855 2510 led2 = LED_OFF;
dudmuck 13:a22debeee855 2511 yellow_led = LED_OFF;
dudmuck 3:8924027a8933 2512
Wayne Roberts 17:f73dbeca8736 2513 radio.rf_switch = rfsw_callback;
dudmuck 4:1efa46cff1b3 2514
dudmuck 4:1efa46cff1b3 2515 if (radio.RegOpMode.bits.LongRangeMode)
dudmuck 4:1efa46cff1b3 2516 last_RxCurrentAddr = radio.read_reg(REG_LR_FIFORXCURRENTADDR);
dudmuck 12:6afe8fed5385 2517
dudmuck 12:6afe8fed5385 2518 get_mote_version();
dudmuck 12:6afe8fed5385 2519 if (mote_version == MOTE_V3)
dudmuck 12:6afe8fed5385 2520 gps.en_invert = false;
dudmuck 12:6afe8fed5385 2521 else
dudmuck 12:6afe8fed5385 2522 gps.en_invert = true;
dudmuck 12:6afe8fed5385 2523
dudmuck 6:8defa260bc10 2524 gps.enable(false);
dudmuck 6:8defa260bc10 2525
dudmuck 6:8defa260bc10 2526 sx9500.RegProxCtrl0.bits.sensor_en = 3; // only CS0 and CS1 connected
dudmuck 6:8defa260bc10 2527 sx9500.write(SX9500_REG_PROXCTRL0, sx9500.RegProxCtrl0.octet);
dudmuck 6:8defa260bc10 2528
dudmuck 6:8defa260bc10 2529 // set PROXTHRESH to 80 because CS1 has 48 showing always on PROXDIFF
dudmuck 6:8defa260bc10 2530 sx9500.write(SX9500_REG_PROXCTRL6, 0x04);
dudmuck 6:8defa260bc10 2531
dudmuck 6:8defa260bc10 2532 mma8451q.set_active(0);
dudmuck 14:35e7156e73ff 2533 mma8451q.verbose = true;
dudmuck 14:35e7156e73ff 2534 mpl3115a2.init();
dudmuck 6:8defa260bc10 2535 mpl3115a2.SetModeStandby();
dudmuck 11:0f62a500aedc 2536
dudmuck 11:0f62a500aedc 2537 GPIOA->MODER |= 0x01415500; // unused pins as outputs: PA4, PA5, PA6, PA7, PA8, (PA11,PA12 USB)
dudmuck 15:cdc215392e60 2538 //printf("GPIOA->MODER:%08x\r\n", GPIOA->MODER);
dudmuck 11:0f62a500aedc 2539
dudmuck 11:0f62a500aedc 2540 GPIOB->MODER |= 0x00000401; // unused pins as outputs: PB0(HDR_DIO1), PB5 (PB10 pulled hi by LED), PB3-T_SWO
dudmuck 15:cdc215392e60 2541 //printf("GPIOB->MODER:%08x\r\n", GPIOB->MODER);
dudmuck 11:0f62a500aedc 2542
dudmuck 13:a22debeee855 2543 GPIOC->MODER |= 0x00000045; // unused pins as outputs: PC0(hdr_fem_csd) PC1(hdr_fem_ctx) PC3(SPI3_enable)
dudmuck 15:cdc215392e60 2544 //printf("GPIOC->MODER:%08x\r\n", GPIOC->MODER);
dudmuck 11:0f62a500aedc 2545
dudmuck 0:9c2b09ecb20f 2546 while(1) {
dudmuck 0:9c2b09ecb20f 2547 switch (app) {
dudmuck 0:9c2b09ecb20f 2548 case APP_NONE:
dudmuck 0:9c2b09ecb20f 2549 console();
dudmuck 0:9c2b09ecb20f 2550 break;
dudmuck 0:9c2b09ecb20f 2551 case APP_CHAT:
dudmuck 0:9c2b09ecb20f 2552 console_chat();
dudmuck 0:9c2b09ecb20f 2553 break;
dudmuck 0:9c2b09ecb20f 2554 } // ...switch (app)
dudmuck 0:9c2b09ecb20f 2555 } // ...while(1)
dudmuck 0:9c2b09ecb20f 2556 }