Terminal for sending and receiving data via Semtech SX1276 chip. It uses the FRDM-KL25Z board, with a Modtronix inAir9 SX1276 board, and Modtronix SHD3I shield. The inAir9 module is mounted in iMod port 3 of the SHD3I module. The SHD3I shield is mounted on the FRDM-KL25Z board.

Dependencies:   SX127x_modtronix mbed

Fork of chat_sx127x by wayne roberts

Committer:
dudmuck
Date:
Wed Mar 26 01:13:30 2014 +0000
Revision:
0:be215de91a68
Child:
1:1cd0afbed23c
demo test application for sx127x

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dudmuck 0:be215de91a68 1 #include "sx127x.h"
dudmuck 0:be215de91a68 2
dudmuck 0:be215de91a68 3 /*
dudmuck 0:be215de91a68 4 * http://mbed.org/handbook/mbed-FRDM-KL25Z
dudmuck 0:be215de91a68 5 */
dudmuck 0:be215de91a68 6
dudmuck 0:be215de91a68 7 DigitalOut green(LED_GREEN);
dudmuck 0:be215de91a68 8
dudmuck 0:be215de91a68 9 Serial pc(USBTX, USBRX);
dudmuck 0:be215de91a68 10
dudmuck 0:be215de91a68 11 uint8_t tx_cnt;
dudmuck 0:be215de91a68 12 char pcbuf[64];
dudmuck 0:be215de91a68 13
dudmuck 0:be215de91a68 14 typedef enum {
dudmuck 0:be215de91a68 15 APP_NONE = 0,
dudmuck 0:be215de91a68 16 APP_CHAT
dudmuck 0:be215de91a68 17 } app_e;
dudmuck 0:be215de91a68 18
dudmuck 0:be215de91a68 19 app_e app = APP_NONE;
dudmuck 0:be215de91a68 20
dudmuck 0:be215de91a68 21
dudmuck 0:be215de91a68 22 /*const uint32_t my_frf_a = 914.0 / FREQ_STEP_MHZ;
dudmuck 0:be215de91a68 23 const uint32_t my_frf_b = 915.0 / FREQ_STEP_MHZ;*/
dudmuck 0:be215de91a68 24 const uint32_t frfs[] = {
dudmuck 0:be215de91a68 25 MHZ_TO_FRF(903.0),
dudmuck 0:be215de91a68 26 MHZ_TO_FRF(904.0),
dudmuck 0:be215de91a68 27 MHZ_TO_FRF(905.0),
dudmuck 0:be215de91a68 28 MHZ_TO_FRF(906.0),
dudmuck 0:be215de91a68 29 MHZ_TO_FRF(907.0),
dudmuck 0:be215de91a68 30 MHZ_TO_FRF(908.0),
dudmuck 0:be215de91a68 31 MHZ_TO_FRF(909.0),
dudmuck 0:be215de91a68 32 MHZ_TO_FRF(910.0),
dudmuck 0:be215de91a68 33 MHZ_TO_FRF(911.0),
dudmuck 0:be215de91a68 34 MHZ_TO_FRF(912.0),
dudmuck 0:be215de91a68 35 MHZ_TO_FRF(913.0),
dudmuck 0:be215de91a68 36 MHZ_TO_FRF(914.0),
dudmuck 0:be215de91a68 37 MHZ_TO_FRF(915.0)
dudmuck 0:be215de91a68 38 };
dudmuck 0:be215de91a68 39
dudmuck 0:be215de91a68 40 /******************************************************************************/
dudmuck 0:be215de91a68 41
dudmuck 0:be215de91a68 42 // pin: 3 8 1 7 10 12 5 20 18
dudmuck 0:be215de91a68 43 // mosi, miso, sclk, cs, rst, dio0, dio1, fctx, fcps
dudmuck 0:be215de91a68 44 SX127x radio(PTD2, PTD3, PTD1, PTD0, PTD5, PTA13, PTD4, PTC9, PTC8);
dudmuck 0:be215de91a68 45
dudmuck 0:be215de91a68 46 void printLoraIrqs_(bool clear)
dudmuck 0:be215de91a68 47 {
dudmuck 0:be215de91a68 48 //in radio class -- RegIrqFlags_t RegIrqFlags;
dudmuck 0:be215de91a68 49
dudmuck 0:be215de91a68 50 //already read RegIrqFlags.octet = radio.read_reg(REG_LR_IRQFLAGS);
dudmuck 0:be215de91a68 51 printf("\r\nIrqFlags:");
dudmuck 0:be215de91a68 52 if (radio.RegIrqFlags.bits.CadDetected)
dudmuck 0:be215de91a68 53 printf("CadDetected ");
dudmuck 0:be215de91a68 54 if (radio.RegIrqFlags.bits.FhssChangeChannel) {
dudmuck 0:be215de91a68 55 //radio.RegHopChannel.octet = radio.read_reg(REG_LR_HOPCHANNEL);
dudmuck 0:be215de91a68 56 printf("FhssChangeChannel:%d ", radio.RegHopChannel.bits.FhssPresentChannel);
dudmuck 0:be215de91a68 57 }
dudmuck 0:be215de91a68 58 if (radio.RegIrqFlags.bits.CadDone)
dudmuck 0:be215de91a68 59 printf("CadDone ");
dudmuck 0:be215de91a68 60 if (radio.RegIrqFlags.bits.TxDone)
dudmuck 0:be215de91a68 61 printf("TxDone ");
dudmuck 0:be215de91a68 62 if (radio.RegIrqFlags.bits.ValidHeader)
dudmuck 0:be215de91a68 63 printf("ValidHeader ");
dudmuck 0:be215de91a68 64 if (radio.RegIrqFlags.bits.PayloadCrcError)
dudmuck 0:be215de91a68 65 printf("PayloadCrcError ");
dudmuck 0:be215de91a68 66 if (radio.RegIrqFlags.bits.RxDone)
dudmuck 0:be215de91a68 67 printf("RxDone ");
dudmuck 0:be215de91a68 68 if (radio.RegIrqFlags.bits.RxTimeout)
dudmuck 0:be215de91a68 69 printf("RxTimeout ");
dudmuck 0:be215de91a68 70
dudmuck 0:be215de91a68 71 printf("\r\n");
dudmuck 0:be215de91a68 72
dudmuck 0:be215de91a68 73 if (clear)
dudmuck 0:be215de91a68 74 radio.write_reg(REG_LR_IRQFLAGS, radio.RegIrqFlags.octet);
dudmuck 0:be215de91a68 75
dudmuck 0:be215de91a68 76 }
dudmuck 0:be215de91a68 77
dudmuck 0:be215de91a68 78 void printCodingRate(bool from_rx)
dudmuck 0:be215de91a68 79 {
dudmuck 0:be215de91a68 80 uint8_t d = radio.getCodingRate(from_rx);
dudmuck 0:be215de91a68 81 printf("CodingRate:");
dudmuck 0:be215de91a68 82 switch (d) {
dudmuck 0:be215de91a68 83 case 1: printf("4/5 "); break;
dudmuck 0:be215de91a68 84 case 2: printf("4/6 "); break;
dudmuck 0:be215de91a68 85 case 3: printf("4/7 "); break;
dudmuck 0:be215de91a68 86 case 4: printf("4/8 "); break;
dudmuck 0:be215de91a68 87 default:
dudmuck 0:be215de91a68 88 printf("%d ", d);
dudmuck 0:be215de91a68 89 break;
dudmuck 0:be215de91a68 90 }
dudmuck 0:be215de91a68 91 }
dudmuck 0:be215de91a68 92
dudmuck 0:be215de91a68 93 void printHeaderMode()
dudmuck 0:be215de91a68 94 {
dudmuck 0:be215de91a68 95 if (radio.getHeaderMode())
dudmuck 0:be215de91a68 96 printf("implicit ");
dudmuck 0:be215de91a68 97 else
dudmuck 0:be215de91a68 98 printf("explicit ");
dudmuck 0:be215de91a68 99 }
dudmuck 0:be215de91a68 100
dudmuck 0:be215de91a68 101 void printBw()
dudmuck 0:be215de91a68 102 {
dudmuck 0:be215de91a68 103 uint8_t bw = radio.getBw();
dudmuck 0:be215de91a68 104
dudmuck 0:be215de91a68 105 printf("Bw:");
dudmuck 0:be215de91a68 106 if (radio.type == SX1276) {
dudmuck 0:be215de91a68 107 switch (radio.RegModemConfig.sx1276bits.Bw) {
dudmuck 0:be215de91a68 108 case 0: printf("7.8KHz "); break;
dudmuck 0:be215de91a68 109 case 1: printf("10.4KHz "); break;
dudmuck 0:be215de91a68 110 case 2: printf("15.6KHz "); break;
dudmuck 0:be215de91a68 111 case 3: printf("20.8KHz "); break;
dudmuck 0:be215de91a68 112 case 4: printf("31.25KHz "); break;
dudmuck 0:be215de91a68 113 case 5: printf("41.7KHz "); break;
dudmuck 0:be215de91a68 114 case 6: printf("62.5KHz "); break;
dudmuck 0:be215de91a68 115 case 7: printf("125KHz "); break;
dudmuck 0:be215de91a68 116 case 8: printf("250KHz "); break;
dudmuck 0:be215de91a68 117 case 9: printf("500KHz "); break;
dudmuck 0:be215de91a68 118 default: printf("%x ", radio.RegModemConfig.sx1276bits.Bw); break;
dudmuck 0:be215de91a68 119 }
dudmuck 0:be215de91a68 120 } else if (radio.type == SX1272) {
dudmuck 0:be215de91a68 121 switch (radio.RegModemConfig.sx1272bits.Bw) {
dudmuck 0:be215de91a68 122 case 0: printf("125KHz "); break;
dudmuck 0:be215de91a68 123 case 1: printf("250KHz "); break;
dudmuck 0:be215de91a68 124 case 2: printf("500KHz "); break;
dudmuck 0:be215de91a68 125 case 3: printf("11b "); break;
dudmuck 0:be215de91a68 126 }
dudmuck 0:be215de91a68 127 }
dudmuck 0:be215de91a68 128 }
dudmuck 0:be215de91a68 129
dudmuck 0:be215de91a68 130 void printAllBw()
dudmuck 0:be215de91a68 131 {
dudmuck 0:be215de91a68 132 int i, s;
dudmuck 0:be215de91a68 133
dudmuck 0:be215de91a68 134 if (radio.type == SX1276) {
dudmuck 0:be215de91a68 135 s = radio.RegModemConfig.sx1276bits.Bw;
dudmuck 0:be215de91a68 136 for (i = 0; i < 10; i++ ) {
dudmuck 0:be215de91a68 137 radio.RegModemConfig.sx1276bits.Bw = i;
dudmuck 0:be215de91a68 138 printf("%d ", i);
dudmuck 0:be215de91a68 139 printBw();
dudmuck 0:be215de91a68 140 printf("\r\n");
dudmuck 0:be215de91a68 141 }
dudmuck 0:be215de91a68 142 radio.RegModemConfig.sx1276bits.Bw = s;
dudmuck 0:be215de91a68 143 } else if (radio.type == SX1272) {
dudmuck 0:be215de91a68 144 s = radio.RegModemConfig.sx1272bits.Bw;
dudmuck 0:be215de91a68 145 for (i = 0; i < 3; i++ ) {
dudmuck 0:be215de91a68 146 radio.RegModemConfig.sx1272bits.Bw = i;
dudmuck 0:be215de91a68 147 printf("%d ", i);
dudmuck 0:be215de91a68 148 printBw();
dudmuck 0:be215de91a68 149 printf("\r\n");
dudmuck 0:be215de91a68 150 }
dudmuck 0:be215de91a68 151 radio.RegModemConfig.sx1272bits.Bw = s;
dudmuck 0:be215de91a68 152 }
dudmuck 0:be215de91a68 153 }
dudmuck 0:be215de91a68 154
dudmuck 0:be215de91a68 155 void printSf()
dudmuck 0:be215de91a68 156 {
dudmuck 0:be215de91a68 157 // spreading factor same between sx127[26]
dudmuck 0:be215de91a68 158 printf("sf:%d ", radio.getSf());
dudmuck 0:be215de91a68 159 }
dudmuck 0:be215de91a68 160
dudmuck 0:be215de91a68 161 void printRxPayloadCrcOn()
dudmuck 0:be215de91a68 162 {
dudmuck 0:be215de91a68 163 bool on = radio.getRxPayloadCrcOn();
dudmuck 0:be215de91a68 164 //printf("RxPayloadCrcOn:%s ", on ? "on" : "off");
dudmuck 0:be215de91a68 165 if (on)
dudmuck 0:be215de91a68 166 printf("RxPayloadCrcOn:1 = Tx CRC Enabled\r\n");
dudmuck 0:be215de91a68 167 else
dudmuck 0:be215de91a68 168 printf("RxPayloadCrcOn:1 = no Tx CRC\r\n");
dudmuck 0:be215de91a68 169 }
dudmuck 0:be215de91a68 170
dudmuck 0:be215de91a68 171 void printTxContinuousMode()
dudmuck 0:be215de91a68 172 {
dudmuck 0:be215de91a68 173 printf("TxContinuousMode:%d ", radio.RegModemConfig2.sx1276bits.TxContinuousMode); // same for sx1272 and sx1276
dudmuck 0:be215de91a68 174 }
dudmuck 0:be215de91a68 175
dudmuck 0:be215de91a68 176 void printAgcAutoOn()
dudmuck 0:be215de91a68 177 {
dudmuck 0:be215de91a68 178 printf("AgcAutoOn:%d", radio.getAgcAutoOn());
dudmuck 0:be215de91a68 179 }
dudmuck 0:be215de91a68 180
dudmuck 0:be215de91a68 181 void print_dio()
dudmuck 0:be215de91a68 182 {
dudmuck 0:be215de91a68 183 radio.RegDioMapping2.octet = radio.read_reg(REG_DIOMAPPING2);
dudmuck 0:be215de91a68 184 printf("DIO5:");
dudmuck 0:be215de91a68 185 switch (radio.RegDioMapping2.bits.Dio5Mapping) {
dudmuck 0:be215de91a68 186 case 0: printf("ModeReady"); break;
dudmuck 0:be215de91a68 187 case 1: printf("ClkOut"); break;
dudmuck 0:be215de91a68 188 case 2: printf("ClkOut"); break;
dudmuck 0:be215de91a68 189 }
dudmuck 0:be215de91a68 190 printf(" DIO4:");
dudmuck 0:be215de91a68 191 switch (radio.RegDioMapping2.bits.Dio4Mapping) {
dudmuck 0:be215de91a68 192 case 0: printf("CadDetected"); break;
dudmuck 0:be215de91a68 193 case 1: printf("PllLock"); break;
dudmuck 0:be215de91a68 194 case 2: printf("PllLock"); break;
dudmuck 0:be215de91a68 195 }
dudmuck 0:be215de91a68 196 radio.RegDioMapping1.octet = radio.read_reg(REG_DIOMAPPING1);
dudmuck 0:be215de91a68 197 printf(" DIO3:");
dudmuck 0:be215de91a68 198 switch (radio.RegDioMapping1.bits.Dio3Mapping) {
dudmuck 0:be215de91a68 199 case 0: printf("CadDone"); break;
dudmuck 0:be215de91a68 200 case 1: printf("ValidHeader"); break;
dudmuck 0:be215de91a68 201 case 2: printf("PayloadCrcError"); break;
dudmuck 0:be215de91a68 202 }
dudmuck 0:be215de91a68 203 printf(" DIO2:");
dudmuck 0:be215de91a68 204 switch (radio.RegDioMapping1.bits.Dio2Mapping) {
dudmuck 0:be215de91a68 205 case 0:
dudmuck 0:be215de91a68 206 case 1:
dudmuck 0:be215de91a68 207 case 2:
dudmuck 0:be215de91a68 208 printf("FhssChangeChannel");
dudmuck 0:be215de91a68 209 break;
dudmuck 0:be215de91a68 210 }
dudmuck 0:be215de91a68 211 printf(" DIO1:");
dudmuck 0:be215de91a68 212 switch (radio.RegDioMapping1.bits.Dio1Mapping) {
dudmuck 0:be215de91a68 213 case 0: printf("RxTimeout"); break;
dudmuck 0:be215de91a68 214 case 1: printf("FhssChangeChannel"); break;
dudmuck 0:be215de91a68 215 case 2: printf("CadDetected"); break;
dudmuck 0:be215de91a68 216 }
dudmuck 0:be215de91a68 217 printf(" DIO0:");
dudmuck 0:be215de91a68 218 switch (radio.RegDioMapping1.bits.Dio0Mapping) {
dudmuck 0:be215de91a68 219 case 0: printf("RxDone"); break;
dudmuck 0:be215de91a68 220 case 1: printf("TxDone"); break;
dudmuck 0:be215de91a68 221 case 2: printf("CadDone"); break;
dudmuck 0:be215de91a68 222 }
dudmuck 0:be215de91a68 223
dudmuck 0:be215de91a68 224 printf("\r\n");
dudmuck 0:be215de91a68 225 }
dudmuck 0:be215de91a68 226
dudmuck 0:be215de91a68 227 void lora_print_status()
dudmuck 0:be215de91a68 228 {
dudmuck 0:be215de91a68 229 uint8_t d;
dudmuck 0:be215de91a68 230
dudmuck 0:be215de91a68 231 if (radio.type == SX1276)
dudmuck 0:be215de91a68 232 printf("\r\nSX1276 ");
dudmuck 0:be215de91a68 233 else if (radio.type == SX1272)
dudmuck 0:be215de91a68 234 printf("\r\nSX1272 ");
dudmuck 0:be215de91a68 235
dudmuck 0:be215de91a68 236 radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
dudmuck 0:be215de91a68 237 if (!radio.RegOpMode.bits.LongRangeMode) {
dudmuck 0:be215de91a68 238 printf("FSK\r\n");
dudmuck 0:be215de91a68 239 return;
dudmuck 0:be215de91a68 240 }
dudmuck 0:be215de91a68 241
dudmuck 0:be215de91a68 242 print_dio();
dudmuck 0:be215de91a68 243 printf("LoRa ");
dudmuck 0:be215de91a68 244
dudmuck 0:be215de91a68 245 // printing LoRa registers at 0x0d -> 0x3f
dudmuck 0:be215de91a68 246
dudmuck 0:be215de91a68 247 radio.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
dudmuck 0:be215de91a68 248 radio.RegModemConfig2.octet = radio.read_reg(REG_LR_MODEMCONFIG2);
dudmuck 0:be215de91a68 249
dudmuck 0:be215de91a68 250 printCodingRate(false); // false: transmitted coding rate
dudmuck 0:be215de91a68 251 printHeaderMode();
dudmuck 0:be215de91a68 252 printBw();
dudmuck 0:be215de91a68 253 printSf();
dudmuck 0:be215de91a68 254 printRxPayloadCrcOn();
dudmuck 0:be215de91a68 255 // RegModemStat
dudmuck 0:be215de91a68 256 printf("ModemStat:0x%02x\r\n", radio.read_reg(REG_LR_MODEMSTAT));
dudmuck 0:be215de91a68 257
dudmuck 0:be215de91a68 258 // fifo ptrs:
dudmuck 0:be215de91a68 259 radio.RegPayloadLength = radio.read_reg(REG_LR_PAYLOADLENGTH);
dudmuck 0:be215de91a68 260 radio.RegRxMaxPayloadLength = radio.read_reg(REG_LR_RX_MAX_PAYLOADLENGTH);
dudmuck 0:be215de91a68 261 printf("fifoptr=0x%02x txbase=0x%02x rxbase=0x%02x payloadLength=0x%02x maxlen=0x%02x",
dudmuck 0:be215de91a68 262 radio.read_reg(REG_LR_FIFOADDRPTR),
dudmuck 0:be215de91a68 263 radio.read_reg(REG_LR_FIFOTXBASEADDR),
dudmuck 0:be215de91a68 264 radio.read_reg(REG_LR_FIFORXBASEADDR),
dudmuck 0:be215de91a68 265 radio.RegPayloadLength,
dudmuck 0:be215de91a68 266 radio.RegRxMaxPayloadLength
dudmuck 0:be215de91a68 267 );
dudmuck 0:be215de91a68 268
dudmuck 0:be215de91a68 269 radio.RegIrqFlags.octet = radio.read_reg(REG_LR_IRQFLAGS);
dudmuck 0:be215de91a68 270 printLoraIrqs_(false);
dudmuck 0:be215de91a68 271
dudmuck 0:be215de91a68 272 radio.RegHopPeriod = radio.read_reg(REG_LR_HOPPERIOD);
dudmuck 0:be215de91a68 273 if (radio.RegHopPeriod != 0) {
dudmuck 0:be215de91a68 274 printf("\r\nHopPeriod:0x%02x\r\n", radio.RegHopPeriod);
dudmuck 0:be215de91a68 275 }
dudmuck 0:be215de91a68 276
dudmuck 0:be215de91a68 277 printf("SymbTimeout:0x%03x ", radio.read_u16(REG_LR_MODEMCONFIG2) & 0x3ff);
dudmuck 0:be215de91a68 278
dudmuck 0:be215de91a68 279 radio.RegPreamble = radio.read_u16(REG_LR_PREAMBLEMSB);
dudmuck 0:be215de91a68 280 printf("PreambleLength:0x%03x ", radio.RegPreamble);
dudmuck 0:be215de91a68 281
dudmuck 0:be215de91a68 282
dudmuck 0:be215de91a68 283 if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER || radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER_SINGLE) {
dudmuck 0:be215de91a68 284 d = radio.read_reg(REG_LR_RSSIVALUE);
dudmuck 0:be215de91a68 285 printf("rssi:%ddBm ", d-120);
dudmuck 0:be215de91a68 286 }
dudmuck 0:be215de91a68 287
dudmuck 0:be215de91a68 288 printTxContinuousMode();
dudmuck 0:be215de91a68 289
dudmuck 0:be215de91a68 290 printf("\r\n");
dudmuck 0:be215de91a68 291 printAgcAutoOn();
dudmuck 0:be215de91a68 292 if (radio.type == SX1272) {
dudmuck 0:be215de91a68 293 printf(" LowDataRateOptimize:%d\r\n", radio.RegModemConfig.sx1272bits.LowDataRateOptimize);
dudmuck 0:be215de91a68 294 }
dudmuck 0:be215de91a68 295
dudmuck 0:be215de91a68 296 printf("\r\nHeaderCount:%d PacketCount:%d, ",
dudmuck 0:be215de91a68 297 radio.read_u16(REG_LR_RXHEADERCNTVALUE_MSB), radio.read_u16(REG_LR_RXPACKETCNTVALUE_MSB));
dudmuck 0:be215de91a68 298
dudmuck 0:be215de91a68 299 printf("Lora detection threshold:%02x\r\n", radio.read_reg(REG_LR_DETECTION_THRESHOLD));
dudmuck 0:be215de91a68 300 radio.RegTest31.octet = radio.read_reg(REG_LR_TEST31);
dudmuck 0:be215de91a68 301 printf("detect_trig_same_peaks_nb:%d\r\n", radio.RegTest31.bits.detect_trig_same_peaks_nb);
dudmuck 0:be215de91a68 302
dudmuck 0:be215de91a68 303 if (radio.type == SX1272) {
dudmuck 0:be215de91a68 304 radio.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
dudmuck 0:be215de91a68 305 printf("LowDataRateOptimize:%d\r\n", radio.RegModemConfig.sx1272bits.LowDataRateOptimize);
dudmuck 0:be215de91a68 306 } else if (radio.type == SX1276) {
dudmuck 0:be215de91a68 307 radio.RegModemConfig3.octet = radio.read_reg(REG_LR_MODEMCONFIG3);
dudmuck 0:be215de91a68 308 printf("LowDataRateOptimize:%d\r\n", radio.RegModemConfig3.sx1276bits.LowDataRateOptimize);
dudmuck 0:be215de91a68 309 }
dudmuck 0:be215de91a68 310
dudmuck 0:be215de91a68 311 printf("\r\n");
dudmuck 0:be215de91a68 312 //printf("A %02x\r\n", radio.RegModemConfig2.octet);
dudmuck 0:be215de91a68 313 }
dudmuck 0:be215de91a68 314
dudmuck 0:be215de91a68 315 void printOpMode()
dudmuck 0:be215de91a68 316 {
dudmuck 0:be215de91a68 317 radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
dudmuck 0:be215de91a68 318 switch (radio.RegOpMode.bits.Mode) {
dudmuck 0:be215de91a68 319 case RF_OPMODE_SLEEP: printf("sleep"); break;
dudmuck 0:be215de91a68 320 case RF_OPMODE_STANDBY: printf("stby"); break;
dudmuck 0:be215de91a68 321 case RF_OPMODE_SYNTHESIZER_TX: printf("fstx"); break;
dudmuck 0:be215de91a68 322 case RF_OPMODE_TRANSMITTER: printf("tx"); break;
dudmuck 0:be215de91a68 323 case RF_OPMODE_SYNTHESIZER_RX: printf("fsrx"); break;
dudmuck 0:be215de91a68 324 case RF_OPMODE_RECEIVER: printf("rx"); break;
dudmuck 0:be215de91a68 325 case 6:
dudmuck 0:be215de91a68 326 if (radio.RegOpMode.bits.LongRangeMode)
dudmuck 0:be215de91a68 327 printf("rxs");
dudmuck 0:be215de91a68 328 else
dudmuck 0:be215de91a68 329 printf("-6-");
dudmuck 0:be215de91a68 330 break; // todo: different lora/fsk
dudmuck 0:be215de91a68 331 case 7:
dudmuck 0:be215de91a68 332 if (radio.RegOpMode.bits.LongRangeMode)
dudmuck 0:be215de91a68 333 printf("cad");
dudmuck 0:be215de91a68 334 else
dudmuck 0:be215de91a68 335 printf("-7-");
dudmuck 0:be215de91a68 336 break; // todo: different lora/fsk
dudmuck 0:be215de91a68 337 }
dudmuck 0:be215de91a68 338 }
dudmuck 0:be215de91a68 339
dudmuck 0:be215de91a68 340 void
dudmuck 0:be215de91a68 341 printPa()
dudmuck 0:be215de91a68 342 {
dudmuck 0:be215de91a68 343 radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG);
dudmuck 0:be215de91a68 344 if (radio.RegPaConfig.bits.PaSelect) {
dudmuck 0:be215de91a68 345 float output_dBm = 17 - (15-radio.RegPaConfig.bits.OutputPower);
dudmuck 0:be215de91a68 346 printf(" PABOOST OutputPower=%.1fdBm", output_dBm);
dudmuck 0:be215de91a68 347 } else {
dudmuck 0:be215de91a68 348 float pmax = (0.6*radio.RegPaConfig.bits.MaxPower) + 10.8;
dudmuck 0:be215de91a68 349 float output_dBm = pmax - (15-radio.RegPaConfig.bits.OutputPower);
dudmuck 0:be215de91a68 350 printf(" RFO pmax=%.1fdBm OutputPower=%.1fdBm", pmax, output_dBm);
dudmuck 0:be215de91a68 351 }
dudmuck 0:be215de91a68 352 }
dudmuck 0:be215de91a68 353
dudmuck 0:be215de91a68 354 void /* things always present, whether lora or fsk */
dudmuck 0:be215de91a68 355 common_print_status()
dudmuck 0:be215de91a68 356 {
dudmuck 0:be215de91a68 357 printf("version:0x%02x %.3fMHz ", radio.read_reg(REG_VERSION), radio.get_frf_MHz());
dudmuck 0:be215de91a68 358 printOpMode();
dudmuck 0:be215de91a68 359
dudmuck 0:be215de91a68 360 printPa();
dudmuck 0:be215de91a68 361
dudmuck 0:be215de91a68 362 radio.RegOcp.octet = radio.read_reg(REG_OCP);
dudmuck 0:be215de91a68 363 if (radio.RegOcp.bits.OcpOn) {
dudmuck 0:be215de91a68 364 int imax = 0;
dudmuck 0:be215de91a68 365 if (radio.RegOcp.bits.OcpTrim < 16)
dudmuck 0:be215de91a68 366 imax = 45 + (5 * radio.RegOcp.bits.OcpTrim);
dudmuck 0:be215de91a68 367 else if (radio.RegOcp.bits.OcpTrim < 28)
dudmuck 0:be215de91a68 368 imax = -30 + (10 * radio.RegOcp.bits.OcpTrim);
dudmuck 0:be215de91a68 369 else
dudmuck 0:be215de91a68 370 imax = 240;
dudmuck 0:be215de91a68 371 printf(" OcpOn %dmA ", imax);
dudmuck 0:be215de91a68 372 } else
dudmuck 0:be215de91a68 373 printf(" OcpOFF ");
dudmuck 0:be215de91a68 374
dudmuck 0:be215de91a68 375 printf("\r\n");
dudmuck 0:be215de91a68 376
dudmuck 0:be215de91a68 377 }
dudmuck 0:be215de91a68 378
dudmuck 0:be215de91a68 379 void print_rx_buf(int len)
dudmuck 0:be215de91a68 380 {
dudmuck 0:be215de91a68 381 int i;
dudmuck 0:be215de91a68 382
dudmuck 0:be215de91a68 383 printf("000:");
dudmuck 0:be215de91a68 384 for (i = 0; i < len; i++) {
dudmuck 0:be215de91a68 385 //printf("(%d)%02x ", i % 16, rx_buf[i]);
dudmuck 0:be215de91a68 386 printf("%02x ", radio.rx_buf[i]);
dudmuck 0:be215de91a68 387 if (i % 16 == 15 && i != len-1)
dudmuck 0:be215de91a68 388 printf("\r\n%03d:", i+1);
dudmuck 0:be215de91a68 389
dudmuck 0:be215de91a68 390 }
dudmuck 0:be215de91a68 391 printf("\r\n");
dudmuck 0:be215de91a68 392 }
dudmuck 0:be215de91a68 393
dudmuck 0:be215de91a68 394 void
dudmuck 0:be215de91a68 395 service_radio()
dudmuck 0:be215de91a68 396 {
dudmuck 0:be215de91a68 397 service_action_e act = radio.service();
dudmuck 0:be215de91a68 398
dudmuck 0:be215de91a68 399 switch (act) {
dudmuck 0:be215de91a68 400 case SERVICE_READ_FIFO:
dudmuck 0:be215de91a68 401 if (app == APP_NONE) {
dudmuck 0:be215de91a68 402 printLoraIrqs_(false);
dudmuck 0:be215de91a68 403 if (radio.RegHopPeriod > 0) {
dudmuck 0:be215de91a68 404 radio.RegHopChannel.octet = radio.read_reg(REG_LR_HOPCHANNEL);
dudmuck 0:be215de91a68 405 printf("HopCH:%d ", radio.RegHopChannel.bits.FhssPresentChannel);
dudmuck 0:be215de91a68 406 }
dudmuck 0:be215de91a68 407 printCodingRate(true); // true: of received packet
dudmuck 0:be215de91a68 408 printf(" crc%s %.1fdB %ddBm\r\n",
dudmuck 0:be215de91a68 409 radio.RegHopChannel.bits.RxPayloadCrcOn ? "On" : "OFF",
dudmuck 0:be215de91a68 410 radio.RegPktSnrValue / 4.0,
dudmuck 0:be215de91a68 411 radio.RegPktRssiValue - 137
dudmuck 0:be215de91a68 412 );
dudmuck 0:be215de91a68 413 print_rx_buf(radio.RegRxNbBytes);
dudmuck 0:be215de91a68 414 } else if (app == APP_CHAT) {
dudmuck 0:be215de91a68 415 if (radio.RegHopChannel.bits.RxPayloadCrcOn) {
dudmuck 0:be215de91a68 416 if (radio.RegIrqFlags.bits.PayloadCrcError)
dudmuck 0:be215de91a68 417 printf("crcError\r\n");
dudmuck 0:be215de91a68 418 else {
dudmuck 0:be215de91a68 419 int n = radio.RegRxNbBytes;
dudmuck 0:be215de91a68 420 radio.rx_buf[n++] = '\r';
dudmuck 0:be215de91a68 421 radio.rx_buf[n++] = '\n';
dudmuck 0:be215de91a68 422 radio.rx_buf[n] = 0; // null terminate
dudmuck 0:be215de91a68 423 printf((char *)radio.rx_buf);
dudmuck 0:be215de91a68 424 }
dudmuck 0:be215de91a68 425 } else
dudmuck 0:be215de91a68 426 printf("crcOff\r\n");
dudmuck 0:be215de91a68 427
dudmuck 0:be215de91a68 428 // clear Irq flags
dudmuck 0:be215de91a68 429 radio.write_reg(REG_LR_IRQFLAGS, radio.RegIrqFlags.octet);
dudmuck 0:be215de91a68 430 // should still be in receive mode
dudmuck 0:be215de91a68 431 }
dudmuck 0:be215de91a68 432 break;
dudmuck 0:be215de91a68 433 case SERVICE_TX_DONE:
dudmuck 0:be215de91a68 434 if (app == APP_CHAT) {
dudmuck 0:be215de91a68 435 radio.lora_start_rx();
dudmuck 0:be215de91a68 436 }
dudmuck 0:be215de91a68 437 break;
dudmuck 0:be215de91a68 438 case SERVICE_ERROR:
dudmuck 0:be215de91a68 439 printf("error\r\n");
dudmuck 0:be215de91a68 440 break;
dudmuck 0:be215de91a68 441 } // ...switch (act)
dudmuck 0:be215de91a68 442 }
dudmuck 0:be215de91a68 443
dudmuck 0:be215de91a68 444 void user_init(void)
dudmuck 0:be215de91a68 445 {
dudmuck 0:be215de91a68 446 // set desired spreadingfactor, bandwidth, MHz, etc.
dudmuck 0:be215de91a68 447 }
dudmuck 0:be215de91a68 448
dudmuck 0:be215de91a68 449 int get_kbd_str(char* buf, int size)
dudmuck 0:be215de91a68 450 {
dudmuck 0:be215de91a68 451 char c;
dudmuck 0:be215de91a68 452 int i;
dudmuck 0:be215de91a68 453 static int prev_len;
dudmuck 0:be215de91a68 454
dudmuck 0:be215de91a68 455 for (i = 0;;) {
dudmuck 0:be215de91a68 456 if (pc.readable()) {
dudmuck 0:be215de91a68 457 c = pc.getc();
dudmuck 0:be215de91a68 458 if (c == 8 && i > 0) {
dudmuck 0:be215de91a68 459 pc.putc(8);
dudmuck 0:be215de91a68 460 pc.putc(' ');
dudmuck 0:be215de91a68 461 pc.putc(8);
dudmuck 0:be215de91a68 462 i--;
dudmuck 0:be215de91a68 463 } else if (c == '\r') {
dudmuck 0:be215de91a68 464 if (i == 0) {
dudmuck 0:be215de91a68 465 return prev_len; // repeat previous
dudmuck 0:be215de91a68 466 } else {
dudmuck 0:be215de91a68 467 buf[i] = 0; // null terminate
dudmuck 0:be215de91a68 468 prev_len = i;
dudmuck 0:be215de91a68 469 return i;
dudmuck 0:be215de91a68 470 }
dudmuck 0:be215de91a68 471 } else if (c == 3) {
dudmuck 0:be215de91a68 472 // ctrl-C abort
dudmuck 0:be215de91a68 473 return -1;
dudmuck 0:be215de91a68 474 } else if (i < size) {
dudmuck 0:be215de91a68 475 buf[i++] = c;
dudmuck 0:be215de91a68 476 pc.putc(c);
dudmuck 0:be215de91a68 477 }
dudmuck 0:be215de91a68 478 } else
dudmuck 0:be215de91a68 479 service_radio();
dudmuck 0:be215de91a68 480 } // ...for()
dudmuck 0:be215de91a68 481 }
dudmuck 0:be215de91a68 482
dudmuck 0:be215de91a68 483 void
dudmuck 0:be215de91a68 484 console_chat()
dudmuck 0:be215de91a68 485 {
dudmuck 0:be215de91a68 486 int i, len = get_kbd_str(pcbuf, sizeof(pcbuf));
dudmuck 0:be215de91a68 487 if (len < 0) {
dudmuck 0:be215de91a68 488 printf("chat abort\r\n");
dudmuck 0:be215de91a68 489 app = APP_NONE;
dudmuck 0:be215de91a68 490 return;
dudmuck 0:be215de91a68 491 } else {
dudmuck 0:be215de91a68 492 for (i = 0; i < len; i++)
dudmuck 0:be215de91a68 493 radio.tx_buf[i] = pcbuf[i];
dudmuck 0:be215de91a68 494 radio.RegPayloadLength = len;
dudmuck 0:be215de91a68 495 radio.write_reg(REG_LR_PAYLOADLENGTH, radio.RegPayloadLength);
dudmuck 0:be215de91a68 496 radio.lora_start_tx(len);
dudmuck 0:be215de91a68 497 printf("\r\n");
dudmuck 0:be215de91a68 498 }
dudmuck 0:be215de91a68 499 }
dudmuck 0:be215de91a68 500
dudmuck 0:be215de91a68 501 void
dudmuck 0:be215de91a68 502 console()
dudmuck 0:be215de91a68 503 {
dudmuck 0:be215de91a68 504 int len, i;
dudmuck 0:be215de91a68 505 uint8_t a, d;
dudmuck 0:be215de91a68 506
dudmuck 0:be215de91a68 507 len = get_kbd_str(pcbuf, sizeof(pcbuf));
dudmuck 0:be215de91a68 508 if (len < 0) {
dudmuck 0:be215de91a68 509 printf("abort\r\n");
dudmuck 0:be215de91a68 510 return;
dudmuck 0:be215de91a68 511 }
dudmuck 0:be215de91a68 512
dudmuck 0:be215de91a68 513 printf("\r\n");
dudmuck 0:be215de91a68 514 if (len == 1) {
dudmuck 0:be215de91a68 515 switch (pcbuf[0]) {
dudmuck 0:be215de91a68 516 case 'i':
dudmuck 0:be215de91a68 517 radio.init();
dudmuck 0:be215de91a68 518 user_init();
dudmuck 0:be215de91a68 519 break;
dudmuck 0:be215de91a68 520 case 'h':
dudmuck 0:be215de91a68 521 printf("hw_reset()\r\n");
dudmuck 0:be215de91a68 522 radio.hw_reset();
dudmuck 0:be215de91a68 523 break;
dudmuck 0:be215de91a68 524 case 'R':
dudmuck 0:be215de91a68 525 // read all registers
dudmuck 0:be215de91a68 526 for (a = 1; a < 0x71; a++) {
dudmuck 0:be215de91a68 527 d = radio.read_reg(a);
dudmuck 0:be215de91a68 528 //update_shadow_regs(selected_radio, a, d);
dudmuck 0:be215de91a68 529 printf("%02x: %02x\r\n", a, d);
dudmuck 0:be215de91a68 530 }
dudmuck 0:be215de91a68 531 break;
dudmuck 0:be215de91a68 532 case 'T':
dudmuck 0:be215de91a68 533 radio.RegModemConfig2.octet = radio.read_reg(REG_LR_MODEMCONFIG2);
dudmuck 0:be215de91a68 534 //printf("a %02x\r\n", radio.RegModemConfig2.octet);
dudmuck 0:be215de91a68 535 radio.RegModemConfig2.sx1276bits.TxContinuousMode ^= 1; // same for sx1272 and sx1276
dudmuck 0:be215de91a68 536 //printf("b %02x\r\n", radio.RegModemConfig2.octet);
dudmuck 0:be215de91a68 537 radio.write_reg(REG_LR_MODEMCONFIG2, radio.RegModemConfig2.octet);
dudmuck 0:be215de91a68 538 radio.RegModemConfig2.octet = radio.read_reg(REG_LR_MODEMCONFIG);
dudmuck 0:be215de91a68 539 //printf("c %02x\r\n", radio.RegModemConfig2.octet);
dudmuck 0:be215de91a68 540 printTxContinuousMode();
dudmuck 0:be215de91a68 541 printf("\r\n");
dudmuck 0:be215de91a68 542 break;
dudmuck 0:be215de91a68 543 case 'C':
dudmuck 0:be215de91a68 544 radio.setRxPayloadCrcOn(!radio.getRxPayloadCrcOn());
dudmuck 0:be215de91a68 545 printRxPayloadCrcOn();
dudmuck 0:be215de91a68 546 printf("\r\n");
dudmuck 0:be215de91a68 547 break;
dudmuck 0:be215de91a68 548 case 'B':
dudmuck 0:be215de91a68 549 radio.RegPaConfig.bits.PaSelect ^= 1;
dudmuck 0:be215de91a68 550 radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet);
dudmuck 0:be215de91a68 551 printPa();
dudmuck 0:be215de91a68 552 printf("\r\n");
dudmuck 0:be215de91a68 553 break;
dudmuck 0:be215de91a68 554 case '?':
dudmuck 0:be215de91a68 555 printf("i radio_init\r\n");
dudmuck 0:be215de91a68 556 printf("h hw_reset\r\n");
dudmuck 0:be215de91a68 557 printf("hm toggle explicit/explicit header mode\r\n");
dudmuck 0:be215de91a68 558 printf("tx[ %%d] transmit\r\n");
dudmuck 0:be215de91a68 559 printf("rx receive\r\n");
dudmuck 0:be215de91a68 560 printf("cr[1234] set coding rate\r\n");
dudmuck 0:be215de91a68 561 printf("bw[%%d] get/set bandwidth\r\n");
dudmuck 0:be215de91a68 562 printf("sf[%%d] get/set spreading factor\r\n");
dudmuck 0:be215de91a68 563 printf("pl[%%d] get/set RegPayloadLength\r\n");
dudmuck 0:be215de91a68 564 printf("C toggle crcOn\r\n");
dudmuck 0:be215de91a68 565 printf("T toggle TxContinuousMode\r\n");
dudmuck 0:be215de91a68 566 printf("op[%%d] get/set output power\r\n");
dudmuck 0:be215de91a68 567 printf("hp[%%d] get/set hop period\r\n");
dudmuck 0:be215de91a68 568 printf("d[0-5] change DIO pin assignment\r\n");
dudmuck 0:be215de91a68 569 break;
dudmuck 0:be215de91a68 570 case '.':
dudmuck 0:be215de91a68 571 lora_print_status();
dudmuck 0:be215de91a68 572 common_print_status();
dudmuck 0:be215de91a68 573 break;
dudmuck 0:be215de91a68 574 } // ...switch (pcbuf[0])
dudmuck 0:be215de91a68 575 } else {
dudmuck 0:be215de91a68 576 if (pcbuf[0] == 't' && pcbuf[1] == 'x') { // TX
dudmuck 0:be215de91a68 577 if (pcbuf[2] == ' ') {
dudmuck 0:be215de91a68 578 sscanf(pcbuf+3, "%d", &i);
dudmuck 0:be215de91a68 579 radio.RegPayloadLength = i;
dudmuck 0:be215de91a68 580 }
dudmuck 0:be215de91a68 581 tx_cnt++;
dudmuck 0:be215de91a68 582 for (i = 0; i < radio.RegPayloadLength; i++)
dudmuck 0:be215de91a68 583 radio.tx_buf[i] = tx_cnt;
dudmuck 0:be215de91a68 584 radio.lora_start_tx(radio.RegPayloadLength);
dudmuck 0:be215de91a68 585 } else if (pcbuf[0] == 'h' && pcbuf[1] == 'p') { //
dudmuck 0:be215de91a68 586 if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
dudmuck 0:be215de91a68 587 sscanf(pcbuf+2, "%d", &i);
dudmuck 0:be215de91a68 588 radio.RegHopPeriod = i;
dudmuck 0:be215de91a68 589 radio.write_reg(REG_LR_HOPPERIOD, radio.RegHopPeriod);
dudmuck 0:be215de91a68 590 if (radio.RegDioMapping1.bits.Dio1Mapping != 1) {
dudmuck 0:be215de91a68 591 radio.RegDioMapping1.bits.Dio1Mapping = 1;
dudmuck 0:be215de91a68 592 radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet);
dudmuck 0:be215de91a68 593 }
dudmuck 0:be215de91a68 594 }
dudmuck 0:be215de91a68 595 radio.RegHopPeriod = radio.read_reg(REG_LR_HOPPERIOD);
dudmuck 0:be215de91a68 596 printf("HopPeriod:0x%02x\r\n", radio.RegHopPeriod);
dudmuck 0:be215de91a68 597 } else if (pcbuf[0] == 'r' && pcbuf[1] == 'x') { // RX
dudmuck 0:be215de91a68 598 radio.lora_start_rx();
dudmuck 0:be215de91a68 599 } else if (pcbuf[0] == 'r' && pcbuf[1] == ' ') { // read single register
dudmuck 0:be215de91a68 600 sscanf(pcbuf+2, "%x", &i);
dudmuck 0:be215de91a68 601 printf("%02x: %02x\r\n", i, radio.read_reg(i));
dudmuck 0:be215de91a68 602 } else if (pcbuf[0] == 'w' && pcbuf[1] == ' ') { // write single register
dudmuck 0:be215de91a68 603 sscanf(pcbuf+2, "%x %x", &i, &len);
dudmuck 0:be215de91a68 604 radio.write_reg(i, len);
dudmuck 0:be215de91a68 605 printf("%02x: %02x\r\n", i, radio.read_reg(i));
dudmuck 0:be215de91a68 606 } else if (pcbuf[0] == 'o' && pcbuf[1] == 'p') {
dudmuck 0:be215de91a68 607 if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
dudmuck 0:be215de91a68 608 sscanf(pcbuf+2, "%d", &i);
dudmuck 0:be215de91a68 609 radio.RegPaConfig.bits.OutputPower = i;
dudmuck 0:be215de91a68 610 radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet);
dudmuck 0:be215de91a68 611 }
dudmuck 0:be215de91a68 612 radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG);
dudmuck 0:be215de91a68 613 printf("OutputPower:%d\r\n", radio.RegPaConfig.bits.OutputPower);
dudmuck 0:be215de91a68 614 } else if (pcbuf[0] == 'c' && pcbuf[1] == 'r') {
dudmuck 0:be215de91a68 615 if (pcbuf[2] >= '0' && pcbuf[2] <= '9')
dudmuck 0:be215de91a68 616 radio.setCodingRate(pcbuf[2] - '0');
dudmuck 0:be215de91a68 617 radio.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
dudmuck 0:be215de91a68 618 printCodingRate(false); // false: transmitted
dudmuck 0:be215de91a68 619 printf("\r\n");
dudmuck 0:be215de91a68 620 } else if (pcbuf[0] == 'h' && pcbuf[1] == 'm') { // toggle implicit/explicit
dudmuck 0:be215de91a68 621 radio.setHeaderMode(!radio.getHeaderMode());
dudmuck 0:be215de91a68 622 radio.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
dudmuck 0:be215de91a68 623 printHeaderMode();
dudmuck 0:be215de91a68 624 printf("\r\n");
dudmuck 0:be215de91a68 625 } else if (pcbuf[0] == 'b' && pcbuf[1] == 'w') {
dudmuck 0:be215de91a68 626 if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
dudmuck 0:be215de91a68 627 radio.set_opmode(RF_OPMODE_STANDBY);
dudmuck 0:be215de91a68 628 sscanf(&pcbuf[2], "%d", &i);
dudmuck 0:be215de91a68 629 radio.setBw(i);
dudmuck 0:be215de91a68 630 } else
dudmuck 0:be215de91a68 631 printAllBw();
dudmuck 0:be215de91a68 632 radio.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
dudmuck 0:be215de91a68 633 printf("current ");
dudmuck 0:be215de91a68 634 printBw();
dudmuck 0:be215de91a68 635 printf("\r\n");
dudmuck 0:be215de91a68 636 } else if (pcbuf[0] == 'v' && pcbuf[1] == 'h') {
dudmuck 0:be215de91a68 637 radio.poll_vh ^= 1;
dudmuck 0:be215de91a68 638 printf("poll_vh:%d\r\n", radio.poll_vh);
dudmuck 0:be215de91a68 639 } else if (pcbuf[0] == 's' && pcbuf[1] == 'f') {
dudmuck 0:be215de91a68 640 if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
dudmuck 0:be215de91a68 641 sscanf(pcbuf+2, "%d", &i);
dudmuck 0:be215de91a68 642 radio.setSf(i);
dudmuck 0:be215de91a68 643 if (i == 6 && !radio.getHeaderMode()) {
dudmuck 0:be215de91a68 644 printf("SF6: to implicit header mode\r\n");
dudmuck 0:be215de91a68 645 radio.setHeaderMode(true);
dudmuck 0:be215de91a68 646 }
dudmuck 0:be215de91a68 647 }
dudmuck 0:be215de91a68 648 radio.RegModemConfig2.octet = radio.read_reg(REG_LR_MODEMCONFIG2);
dudmuck 0:be215de91a68 649 printSf();
dudmuck 0:be215de91a68 650 printf("\r\n");
dudmuck 0:be215de91a68 651 } else if (pcbuf[0] == 'f' && pcbuf[1] == 'r' && pcbuf[2] == 'f') {
dudmuck 0:be215de91a68 652 if (pcbuf[3] >= '0' && pcbuf[3] <= '9') {
dudmuck 0:be215de91a68 653 float MHz;
dudmuck 0:be215de91a68 654 sscanf(pcbuf+3, "%f", &MHz);
dudmuck 0:be215de91a68 655 //printf("MHz:%f\r\n", MHz);
dudmuck 0:be215de91a68 656 radio.set_frf_MHz(MHz);
dudmuck 0:be215de91a68 657 } else
dudmuck 0:be215de91a68 658 printf("%fMHz\r\n", radio.get_frf_MHz());
dudmuck 0:be215de91a68 659 } else if (pcbuf[0] == 'p' && pcbuf[1] == 'l') {
dudmuck 0:be215de91a68 660 if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
dudmuck 0:be215de91a68 661 sscanf(pcbuf+2, "%d", &i);
dudmuck 0:be215de91a68 662 radio.RegPayloadLength = i;
dudmuck 0:be215de91a68 663 radio.write_reg(REG_LR_PAYLOADLENGTH, radio.RegPayloadLength);
dudmuck 0:be215de91a68 664 }
dudmuck 0:be215de91a68 665 radio.RegPayloadLength = radio.read_reg(REG_LR_PAYLOADLENGTH);
dudmuck 0:be215de91a68 666 printf("PayloadLength:%d\r\n", radio.RegPayloadLength);
dudmuck 0:be215de91a68 667 } else if (pcbuf[0] == 'd' && pcbuf[1] >= '0' && pcbuf[1] <= '5') {
dudmuck 0:be215de91a68 668 switch (pcbuf[1]) {
dudmuck 0:be215de91a68 669 case '0':
dudmuck 0:be215de91a68 670 radio.RegDioMapping1.bits.Dio0Mapping++;
dudmuck 0:be215de91a68 671 radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet);
dudmuck 0:be215de91a68 672 break;
dudmuck 0:be215de91a68 673 case '1':
dudmuck 0:be215de91a68 674 radio.RegDioMapping1.bits.Dio1Mapping++;
dudmuck 0:be215de91a68 675 radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet);
dudmuck 0:be215de91a68 676 break;
dudmuck 0:be215de91a68 677 case '2':
dudmuck 0:be215de91a68 678 radio.RegDioMapping1.bits.Dio2Mapping++;
dudmuck 0:be215de91a68 679 radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet);
dudmuck 0:be215de91a68 680 break;
dudmuck 0:be215de91a68 681 case '3':
dudmuck 0:be215de91a68 682 radio.RegDioMapping1.bits.Dio3Mapping++;
dudmuck 0:be215de91a68 683 radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet);
dudmuck 0:be215de91a68 684 break;
dudmuck 0:be215de91a68 685 case '4':
dudmuck 0:be215de91a68 686 radio.RegDioMapping2.bits.Dio4Mapping++;
dudmuck 0:be215de91a68 687 radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping2.octet);
dudmuck 0:be215de91a68 688 break;
dudmuck 0:be215de91a68 689 case '5':
dudmuck 0:be215de91a68 690 radio.RegDioMapping2.bits.Dio5Mapping++;
dudmuck 0:be215de91a68 691 radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping2.octet);
dudmuck 0:be215de91a68 692 break;
dudmuck 0:be215de91a68 693 } // ...switch (pcbuf[1])
dudmuck 0:be215de91a68 694 print_dio();
dudmuck 0:be215de91a68 695 } else if (pcbuf[0] == 's' && pcbuf[1] == 't' && pcbuf[2] == 'b') {
dudmuck 0:be215de91a68 696 radio.set_opmode(RF_OPMODE_STANDBY);
dudmuck 0:be215de91a68 697 } else if (pcbuf[0] == 's' && pcbuf[1] == 'l' && pcbuf[2] == 'e') {
dudmuck 0:be215de91a68 698 radio.set_opmode(RF_OPMODE_SLEEP);
dudmuck 0:be215de91a68 699 } else if (pcbuf[0] == 'c' && pcbuf[1] == 'h' && pcbuf[2] == 'a') {
dudmuck 0:be215de91a68 700 app = APP_CHAT;
dudmuck 0:be215de91a68 701 radio.lora_start_rx();
dudmuck 0:be215de91a68 702 printf("chat start\r\n");
dudmuck 0:be215de91a68 703 }
dudmuck 0:be215de91a68 704 }
dudmuck 0:be215de91a68 705 printf("> ");
dudmuck 0:be215de91a68 706 fflush(stdout);
dudmuck 0:be215de91a68 707
dudmuck 0:be215de91a68 708 }
dudmuck 0:be215de91a68 709
dudmuck 0:be215de91a68 710 int main()
dudmuck 0:be215de91a68 711 {
dudmuck 0:be215de91a68 712
dudmuck 0:be215de91a68 713 pc.baud(57600);
dudmuck 0:be215de91a68 714 user_init();
dudmuck 0:be215de91a68 715
dudmuck 0:be215de91a68 716 radio.frfs = frfs;
dudmuck 0:be215de91a68 717
dudmuck 0:be215de91a68 718 while(1) {
dudmuck 0:be215de91a68 719 switch (app) {
dudmuck 0:be215de91a68 720 case APP_NONE:
dudmuck 0:be215de91a68 721 console();
dudmuck 0:be215de91a68 722 break;
dudmuck 0:be215de91a68 723 case APP_CHAT:
dudmuck 0:be215de91a68 724 console_chat();
dudmuck 0:be215de91a68 725 break;
dudmuck 0:be215de91a68 726 } // ...switch (app)
dudmuck 0:be215de91a68 727 } // ...while(1)
dudmuck 0:be215de91a68 728 }
dudmuck 0:be215de91a68 729