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:
Fri Oct 30 00:17:45 2015 +0000
Revision:
15:cdc215392e60
Parent:
14:35e7156e73ff
Child:
17:f73dbeca8736
corrected PDSTRIM register name, added FSK test cases

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