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:
Mon Apr 13 23:05:15 2015 +0000
Revision:
5:329557e0625c
Parent:
4:1efa46cff1b3
Child:
6:8defa260bc10
added control for AgcAutoOn in FSK

Who changed what in which revision?

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