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:
dudmuck
Date:
Thu May 28 01:21:03 2015 +0000
Revision:
9:dc02ef560bd1
Parent:
8:e3da1dc7b628
Child:
10:a3e2c558c003
added lora spectral inversion commands

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