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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "sx127x_lora.h"
00002 #include "sx127x_fsk.h"
00003 
00004 #include "mma8451q.h"
00005 #include "mpl3115a2.h"
00006 #include "sx9500.h"
00007 #include "gps.h"
00008 #include <inttypes.h>
00009 
00010 #define RADIO_RESET              PC_2 //NorAm_Mote Reset_sx
00011 #define RADIO_MOSI               PB_15 //NorAm_Mote SPI2 Mosi
00012 #define RADIO_MISO               PB_14 //NorAm_Mote SPI2 Miso
00013 #define RADIO_SCLK               PB_13 //NorAm_Mote  SPI2 Clk
00014 #define RADIO_NSS                PB_12 //NorAm_Mote SPI2 Nss
00015 
00016 #define RADIO_DIO_0              PC_6 //NorAm_Mote DIO0 
00017 #define RADIO_DIO_1              PC_10 //NorAm_Mote DIO1 
00018 #define RADIO_DIO_2              PC_8 //NorAm_Mote DIO2 
00019 #define RADIO_DIO_3              PB_4 //NorAm_Mote DIO3 
00020 #define RADIO_DIO_4              PB_5 //NorAm_Mote DIO4 
00021 #define RADIO_DIO_5              PB_6 //NorAm_Mote DIO5
00022 
00023 #define RFSW1                    PC_4 //NorAm_Mote RFSwitch_CNTR_1
00024 #define RFSW2                    PC_13 //NorAm_Mote RFSwitch_CNTR_2
00025 
00026 #define FSK_RSSI_OFFSET         5
00027 #define FSK_RSSI_SMOOTHING      2
00028 /*
00029  *
00030  */
00031 Serial pc(USBTX, USBRX);
00032 #ifdef I2C_PIN_TEST
00033     DigitalInOut pb8(PB_8);
00034     DigitalInOut pb9(PB_9);
00035 #else
00036     I2C i2c(I2C_SDA, I2C_SCL);
00037     DigitalIn i2c_int_pin(RADIO_DIO_3);
00038     MMA8451Q mma8451q(i2c, i2c_int_pin);
00039     MPL3115A2 mpl3115a2(i2c, i2c_int_pin);
00040     SX9500 sx9500(i2c, PA_9, PA_10);
00041 #endif /* I2C_PIN_TeST */
00042 
00043 /*  gps(tx, rx, en); */
00044 GPS gps(PB_6, PB_7, PB_11);
00045 DigitalOut pd2(PD_2);
00046 
00047 AnalogIn* ain_bat;
00048 #define AIN_VREF        3.3     // stm32 internal refernce
00049 #define AIN_VBAT_DIV    2       // resistor divider
00050 
00051 typedef enum {
00052     MOTE_NONE = 0,
00053     MOTE_V2,
00054     MOTE_V3
00055 } mote_version_e;
00056 
00057 mote_version_e mote_version = MOTE_NONE;   
00058 DigitalOut pc_7(PC_7);
00059 
00060 DigitalIn pc_1(PC_1);
00061 DigitalOut hdr_fem_csd(PC_0);
00062 
00063 DigitalOut red_led(PB_1);
00064 DigitalOut led2(PC_3); // green
00065 DigitalOut yellow_led(PB_10);
00066 #define LED_ON  0
00067 #define LED_OFF 1
00068 
00069 Timeout hop_timeout;
00070 
00071 InterruptIn dio3(PC_8);
00072 bool clear_valid_header;
00073 
00074 #ifdef FCC_TEST
00075 typedef enum {
00076     HOP_TYPE_NONE = 0,
00077     HOP_TYPE_64CH,
00078     HOP_TYPE_4CH
00079 } hop_type_e;
00080 hop_type_e hop_type;
00081 float hop_base_MHz = 902.3;
00082 float hop_step_MHz = 0.2;
00083 #endif /* #ifdef FCC_TEST */
00084 
00085 bool abort_key;
00086 bool per_en;
00087 uint32_t PacketRxSequencePrev;
00088 uint32_t PacketPerKoCnt;
00089 uint32_t PacketPerOkCnt;
00090 uint32_t PacketNormalCnt;
00091 Timeout per_timeout;
00092 float per_tx_delay = 0.1;
00093 int per_id;
00094 uint32_t PacketTxCnt;
00095 
00096 uint8_t tx_cnt;
00097 char pcbuf[64];
00098 bool rx_after_tx;
00099 
00100 typedef enum {
00101     APP_NONE = 0,
00102     APP_CHAT
00103 } app_e;
00104 
00105 app_e app = APP_NONE;
00106 
00107 char service_en = 1;
00108 
00109 #define FSK_LARGE_PKT_THRESHOLD  0x3f
00110 
00111 /******************************************************************************/
00112 
00113 SPI spi(RADIO_MOSI, RADIO_MISO, RADIO_SCLK);
00114 //             dio0, dio1, nss, spi, rst
00115 SX127x radio(RADIO_DIO_0, RADIO_DIO_1, RADIO_NSS, spi, RADIO_RESET);
00116 
00117 SX127x_fsk fsk(radio);
00118 SX127x_lora lora(radio);
00119 
00120 DigitalOut rfsw1(RFSW1);
00121 DigitalOut rfsw2(RFSW2);
00122 DigitalIn dio2(RADIO_DIO_2);
00123 
00124 void rfsw_callback()
00125 {
00126     if (radio.RegOpMode.bits.Mode == RF_OPMODE_TRANSMITTER) {  // start of transmission
00127         if (radio.HF) {
00128             if (radio.RegPaConfig.bits.PaSelect) { // if PA_BOOST
00129                 rfsw2 = 0;
00130                 rfsw1 = 1;
00131             } else { // RFO to power amp
00132                 rfsw2 = 1;
00133                 rfsw1 = 0;            
00134             }
00135         } else {
00136             // todo: sx1276
00137         }
00138         //hdr_fem_csd = 1;    //debug
00139     } else if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER || radio.RegOpMode.bits.Mode == RF_OPMODE_CAD) { // start of reception
00140         if (radio.HF) {
00141             rfsw2 = 1;
00142             rfsw1 = 1;              
00143         } else {
00144             // todo: sx1276
00145         }
00146         //hdr_fem_csd = 0;    //debug
00147     } else { // RF switch shutdown
00148         rfsw2 = 0;
00149         rfsw1 = 0;     
00150         //hdr_fem_csd = 0;    //debug         
00151     }
00152 }
00153 
00154 void printLoraIrqs_(bool clear)
00155 {
00156     //in radio class -- RegIrqFlags_t RegIrqFlags;
00157 
00158     //already read RegIrqFlags.octet = radio.read_reg(REG_LR_IRQFLAGS);
00159     printf("\r\nIrqFlags:");
00160     if (lora.RegIrqFlags.bits.CadDetected)
00161         printf("CadDetected ");
00162     if (lora.RegIrqFlags.bits.FhssChangeChannel) {
00163         //radio.RegHopChannel.octet = radio.read_reg(REG_LR_HOPCHANNEL);
00164         printf("FhssChangeChannel:%d ", lora.RegHopChannel.bits.FhssPresentChannel);
00165     }
00166     if (lora.RegIrqFlags.bits.CadDone)
00167         printf("CadDone ");
00168     if (lora.RegIrqFlags.bits.TxDone)
00169         printf("TxDone ");
00170     if (lora.RegIrqFlags.bits.ValidHeader)
00171         printf("ValidHeader ");
00172     if (lora.RegIrqFlags.bits.PayloadCrcError)
00173         printf("PayloadCrcError ");
00174     if (lora.RegIrqFlags.bits.RxDone)
00175         printf("RxDone ");  
00176     if (lora.RegIrqFlags.bits.RxTimeout)
00177         printf("RxTimeout ");
00178 
00179     printf("\r\n");
00180 
00181     if (clear)
00182         radio.write_reg(REG_LR_IRQFLAGS, lora.RegIrqFlags.octet);
00183 
00184 }
00185 
00186 void lora_printCodingRate(bool from_rx)
00187 {
00188     uint8_t d = lora.getCodingRate(from_rx);
00189     printf("CodingRate:");
00190     switch (d) {
00191         case 1: printf("4/5 "); break;
00192         case 2: printf("4/6 "); break;
00193         case 3: printf("4/7 "); break;
00194         case 4: printf("4/8 "); break;
00195         default:
00196             printf("%d ", d);
00197             break;
00198     }
00199 }
00200 
00201 void lora_printHeaderMode()
00202 {
00203     if (lora.getHeaderMode())
00204         printf("implicit ");
00205     else
00206         printf("explicit ");
00207 }
00208 
00209 void lora_printBw()
00210 {
00211     uint8_t bw = lora.getBw();
00212     
00213     printf("Bw:");
00214     if (radio.type == SX1276) {
00215         switch (bw) {
00216             case 0: printf("7.8KHz "); break;
00217             case 1: printf("10.4KHz "); break;
00218             case 2: printf("15.6KHz "); break;
00219             case 3: printf("20.8KHz "); break;
00220             case 4: printf("31.25KHz "); break;
00221             case 5: printf("41.7KHz "); break;
00222             case 6: printf("62.5KHz "); break;
00223             case 7: printf("125KHz "); break;
00224             case 8: printf("250KHz "); break;
00225             case 9: printf("500KHz "); break;
00226             default: printf("%x ", lora.RegModemConfig.sx1276bits.Bw); break;
00227         }
00228     } else if (radio.type == SX1272) {
00229         switch (bw) {
00230             case 0: printf("125KHz "); break;
00231             case 1: printf("250KHz "); break;
00232             case 2: printf("500KHz "); break;
00233             case 3: printf("11b "); break;
00234         }
00235     }
00236 }
00237 
00238 void lora_printAllBw()
00239 {
00240     int i, s;
00241     
00242     if (radio.type == SX1276) {
00243         s = lora.RegModemConfig.sx1276bits.Bw;    
00244         for (i = 0; i < 10; i++ ) {
00245             lora.RegModemConfig.sx1276bits.Bw = i;
00246             printf("%d ", i);
00247             lora_printBw();
00248             printf("\r\n");
00249         }
00250         lora.RegModemConfig.sx1276bits.Bw = s;
00251     } else if (radio.type == SX1272) {
00252         s = lora.RegModemConfig.sx1272bits.Bw;    
00253         for (i = 0; i < 3; i++ ) {
00254             lora.RegModemConfig.sx1272bits.Bw = i;
00255             printf("%d ", i);
00256             lora_printBw();
00257             printf("\r\n");
00258         }
00259         lora.RegModemConfig.sx1272bits.Bw = s;    
00260     }
00261 }
00262 
00263 void lora_printSf()
00264 {
00265     // spreading factor same between sx127[26]
00266     printf("sf:%d ", lora.getSf());
00267 }
00268 
00269 void lora_printRxPayloadCrcOn()
00270 {
00271     bool on = lora.getRxPayloadCrcOn();
00272     //printf("RxPayloadCrcOn:%s ", on ? "on" : "off");
00273     if (on)
00274         printf("RxPayloadCrcOn:1 = Tx CRC Enabled\r\n");
00275     else
00276         printf("RxPayloadCrcOn:1 = no Tx CRC\r\n");
00277 }
00278 
00279 void lora_printTxContinuousMode()
00280 {
00281     printf("TxContinuousMode:%d ", lora.RegModemConfig2.sx1276bits.TxContinuousMode);    // same for sx1272 and sx1276
00282 }
00283 
00284 void lora_printAgcAutoOn()
00285 {
00286     printf("AgcAutoOn:%d", lora.getAgcAutoOn());
00287 }
00288 
00289 void lora_print_dio()
00290 {
00291     radio.RegDioMapping2.octet = radio.read_reg(REG_DIOMAPPING2);
00292     printf("DIO5:");
00293     switch (radio.RegDioMapping2.bits.Dio5Mapping) {
00294         case 0: printf("ModeReady"); break;
00295         case 1: printf("ClkOut"); break;
00296         case 2: printf("ClkOut"); break;
00297     }
00298     printf(" DIO4:");
00299     switch (radio.RegDioMapping2.bits.Dio4Mapping) {
00300         case 0: printf("CadDetected"); break;
00301         case 1: printf("PllLock"); break;
00302         case 2: printf("PllLock"); break;
00303     }    
00304     radio.RegDioMapping1.octet = radio.read_reg(REG_DIOMAPPING1);
00305     printf(" DIO3:");
00306     switch (radio.RegDioMapping1.bits.Dio3Mapping) {
00307         case 0: printf("CadDone"); break;
00308         case 1: printf("ValidHeader"); break;
00309         case 2: printf("PayloadCrcError"); break;
00310     }    
00311     printf(" DIO2:");
00312     switch (radio.RegDioMapping1.bits.Dio2Mapping) {
00313         case 0:
00314         case 1:
00315         case 2:
00316             printf("FhssChangeChannel");
00317             break;
00318     }    
00319     printf(" DIO1:");
00320     switch (radio.RegDioMapping1.bits.Dio1Mapping) {
00321         case 0: printf("RxTimeout"); break;
00322         case 1: printf("FhssChangeChannel"); break;
00323         case 2: printf("CadDetected"); break;
00324     }    
00325     printf(" DIO0:");
00326     switch (radio.RegDioMapping1.bits.Dio0Mapping) {
00327         case 0: printf("RxDone"); break;
00328         case 1: printf("TxDone"); break;
00329         case 2: printf("CadDone"); break;
00330     }    
00331     
00332     printf("\r\n"); 
00333 }
00334 
00335 void fsk_print_dio()
00336 {
00337     radio.RegDioMapping2.octet = radio.read_reg(REG_DIOMAPPING2);
00338     
00339     printf("DIO5:");
00340     switch (radio.RegDioMapping2.bits.Dio5Mapping) {
00341         case 0: printf("ClkOut"); break;
00342         case 1: printf("PllLock"); break;
00343         case 2:
00344             if (fsk.RegPktConfig2.bits.DataModePacket)
00345                 printf("data");
00346             else {
00347                 if (radio.RegDioMapping2.bits.MapPreambleDetect)
00348                     printf("preamble");
00349                 else
00350                     printf("rssi");
00351             }
00352             break;
00353         case 3: printf("ModeReady"); break;
00354     }
00355     
00356     printf(" DIO4:");
00357     switch (radio.RegDioMapping2.bits.Dio4Mapping) {
00358         case 0: printf("temp/eol"); break;
00359         case 1: printf("PllLock"); break;
00360         case 2: printf("TimeOut"); break;
00361         case 3:
00362             if (fsk.RegPktConfig2.bits.DataModePacket) {
00363                 if (radio.RegDioMapping2.bits.MapPreambleDetect)
00364                     printf("preamble");
00365                 else
00366                     printf("rssi");
00367             } else
00368                 printf("ModeReady");
00369             break;
00370     }
00371     
00372     radio.RegDioMapping1.octet = radio.read_reg(REG_DIOMAPPING1);
00373     
00374     printf(" DIO3:");
00375     switch (radio.RegDioMapping1.bits.Dio3Mapping) {
00376         case 0: printf("Timeout"); break;
00377         case 1:
00378             if (radio.RegDioMapping2.bits.MapPreambleDetect)
00379                 printf("preamble");
00380             else
00381                 printf("rssi");
00382             break;
00383         case 2: printf("?automode_status?"); break;
00384         case 3: printf("TempChange/LowBat"); break;
00385     }
00386     
00387     printf(" DIO2:");
00388     if (fsk.RegPktConfig2.bits.DataModePacket) {
00389         switch (radio.RegDioMapping1.bits.Dio2Mapping) {
00390             case 0: printf("FifoFull"); break;
00391             case 1: printf("RxReady"); break;
00392             case 2: printf("FifoFull/rx-timeout"); break;
00393             case 3: printf("FifoFull/rx-syncadrs"); break;
00394         }
00395     } else {
00396         printf("Data");
00397     }
00398     
00399     printf(" DIO1:");
00400     if (fsk.RegPktConfig2.bits.DataModePacket) {
00401         switch (radio.RegDioMapping1.bits.Dio1Mapping) {
00402             case 0: printf("FifoThresh"); break;
00403             case 1: printf("FifoEmpty"); break;
00404             case 2: printf("FifoFull"); break;
00405             case 3: printf("-3-"); break;
00406         }
00407     } else {
00408         switch (radio.RegDioMapping1.bits.Dio1Mapping) {
00409             case 0: printf("Dclk"); break;
00410             case 1:
00411                 if (radio.RegDioMapping2.bits.MapPreambleDetect)
00412                     printf("preamble");
00413                 else
00414                     printf("rssi");
00415                 break;
00416             case 2: printf("-2-"); break;
00417             case 3: printf("-3-"); break;
00418         }
00419     }
00420     
00421     printf(" DIO0:");
00422     if (fsk.RegPktConfig2.bits.DataModePacket) {
00423         switch (radio.RegDioMapping1.bits.Dio0Mapping) {
00424             case 0: printf("PayloadReady/PacketSent"); break;
00425             case 1: printf("CrcOk"); break;
00426             case 2: printf("-2-"); break;
00427             case 3: printf("TempChange/LowBat"); break;
00428         }
00429     } else {
00430         switch (radio.RegDioMapping1.bits.Dio0Mapping) {
00431             case 0: printf("SyncAdrs/TxReady"); break;
00432             case 1:
00433                 if (radio.RegDioMapping2.bits.MapPreambleDetect)
00434                     printf("preamble");
00435                 else
00436                     printf("rssi");
00437                 break;
00438             case 2: printf("RxReady"); break;
00439             case 3: printf("-3-"); break;
00440         }
00441     }
00442     printf("\r\n"); 
00443 }
00444 
00445 void lora_print_status()
00446 {
00447     uint8_t d;
00448     
00449     if (radio.type == SX1276)
00450         printf("\r\nSX1276 ");
00451     else if (radio.type == SX1272)
00452         printf("\r\nSX1272 ");
00453     
00454     radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
00455     if (!radio.RegOpMode.bits.LongRangeMode) {
00456         printf("FSK\r\n");
00457         return;
00458     }
00459     
00460     lora_print_dio();
00461     printf("LoRa ");
00462     
00463     // printing LoRa registers at 0x0d -> 0x3f
00464 
00465     lora.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
00466     lora.RegModemConfig2.octet = radio.read_reg(REG_LR_MODEMCONFIG2);
00467 
00468     lora_printCodingRate(false); // false: transmitted coding rate
00469     lora_printHeaderMode();
00470     lora_printBw();
00471     lora_printSf();
00472     lora_printRxPayloadCrcOn();
00473     // RegModemStat
00474     printf("ModemStat:0x%02x\r\n", radio.read_reg(REG_LR_MODEMSTAT));
00475 
00476     // fifo ptrs:
00477     lora.RegPayloadLength = radio.read_reg(REG_LR_PAYLOADLENGTH);
00478     lora.RegRxMaxPayloadLength = radio.read_reg(REG_LR_RX_MAX_PAYLOADLENGTH);
00479     printf("fifoptr=0x%02x txbase=0x%02x rxbase=0x%02x payloadLength=0x%02x maxlen=0x%02x",
00480         radio.read_reg(REG_LR_FIFOADDRPTR),
00481         radio.read_reg(REG_LR_FIFOTXBASEADDR),
00482         radio.read_reg(REG_LR_FIFORXBASEADDR),
00483         lora.RegPayloadLength,
00484         lora.RegRxMaxPayloadLength
00485     );
00486 
00487     lora.RegIrqFlags.octet = radio.read_reg(REG_LR_IRQFLAGS);
00488     printLoraIrqs_(false);
00489 
00490     lora.RegHopPeriod = radio.read_reg(REG_LR_HOPPERIOD);
00491     if (lora.RegHopPeriod != 0) {
00492         printf("\r\nHopPeriod:0x%02x\r\n", lora.RegHopPeriod);
00493     }
00494 
00495     printf("SymbTimeout:0x%03x ", radio.read_u16(REG_LR_MODEMCONFIG2) & 0x3ff);
00496 
00497     lora.RegPreamble = radio.read_u16(REG_LR_PREAMBLEMSB);
00498     printf("PreambleLength:%d ", lora.RegPreamble);
00499 
00500     if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER || radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER_SINGLE) {
00501         d = radio.read_reg(REG_LR_RSSIVALUE);
00502         printf("rssi:%ddBm ", d-120);
00503     }
00504 
00505     lora_printTxContinuousMode();
00506 
00507     printf("\r\n");
00508     lora_printAgcAutoOn();
00509 
00510     printf("\r\nHeaderCount:%d PacketCount:%d, ",
00511         radio.read_u16(REG_LR_RXHEADERCNTVALUE_MSB), radio.read_u16(REG_LR_RXPACKETCNTVALUE_MSB));
00512 
00513     printf("Lora detection threshold:%02x\r\n", radio.read_reg(REG_LR_DETECTION_THRESHOLD));
00514     lora.RegTest31.octet = radio.read_reg(REG_LR_TEST31);
00515     printf("detect_trig_same_peaks_nb:%d\r\n", lora.RegTest31.bits.detect_trig_same_peaks_nb);
00516 
00517     printf("LowDataRateOptimize:");
00518     if (radio.type == SX1272) {
00519         lora.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
00520         printf("%d ", lora.RegModemConfig.sx1272bits.LowDataRateOptimize);
00521     } else if (radio.type == SX1276) {
00522         lora.RegModemConfig3.octet = radio.read_reg(REG_LR_MODEMCONFIG3);
00523         printf("%d ", lora.RegModemConfig3.sx1276bits.LowDataRateOptimize);        
00524     }
00525     
00526     printf(" invert: rx=%d tx=%d\r\n", lora.RegTest33.bits.invert_i_q, !lora.RegTest33.bits.chirp_invert_tx);
00527     
00528 #ifdef FCC_TEST
00529     switch (hop_type) {
00530         case HOP_TYPE_NONE:
00531             break;
00532         case HOP_TYPE_64CH:
00533             printf("hop 64ch\r\n");
00534             break;
00535         case HOP_TYPE_4CH:
00536             printf("hop 4ch\r\n");
00537             break;
00538     }
00539 #endif /* #ifdef FCC_TEST */         
00540     printf("\r\n");
00541 }
00542 
00543 uint16_t
00544 fsk_get_PayloadLength(void)
00545 {
00546     fsk.RegPktConfig2.word = radio.read_u16(REG_FSK_PACKETCONFIG2);
00547 
00548     return fsk.RegPktConfig2.bits.PayloadLength;
00549 }
00550 
00551 void fsk_printAddressFiltering()
00552 {
00553     uint8_t FSKRegNodeAdrs, FSKRegBroadcastAdrs;
00554     
00555     printf(" AddressFiltering:");
00556     switch (fsk.RegPktConfig1.bits.AddressFiltering) {
00557         case 0: printf("off"); break;
00558         case 1: // NodeAddress
00559             FSKRegNodeAdrs = radio.read_reg(REG_FSK_NODEADRS);
00560             printf("NodeAdrs:%02x\r\n", FSKRegNodeAdrs);
00561             break;
00562         case 2: // NodeAddress & BroadcastAddress
00563             FSKRegNodeAdrs = radio.read_reg(REG_FSK_NODEADRS);
00564             printf("NodeAdrs:%02x ", FSKRegNodeAdrs);
00565             FSKRegBroadcastAdrs = radio.read_reg(REG_FSK_BROADCASTADRS);
00566             printf("BroadcastAdrs:%02x\r\n", FSKRegBroadcastAdrs );
00567             break;
00568         default:
00569             printf("%d", fsk.RegPktConfig1.bits.AddressFiltering);
00570             break;
00571     }
00572 }
00573 
00574 void fsk_print_IrqFlags2()
00575 {
00576     RegIrqFlags2_t RegIrqFlags2;
00577     
00578     printf("IrqFlags2: ");
00579     RegIrqFlags2.octet = radio.read_reg(REG_FSK_IRQFLAGS2);
00580     if (RegIrqFlags2.bits.FifoFull)
00581         printf("FifoFull ");
00582     if (RegIrqFlags2.bits.FifoEmpty)
00583         printf("FifoEmpty ");
00584     if (RegIrqFlags2.bits.FifoLevel)
00585         printf("FifoLevel ");
00586     if (RegIrqFlags2.bits.FifoOverrun)
00587         printf("FifoOverrun ");
00588     if (RegIrqFlags2.bits.PacketSent)
00589         printf("PacketSent ");
00590     if (RegIrqFlags2.bits.PayloadReady)
00591         printf("PayloadReady ");
00592     if (RegIrqFlags2.bits.CrcOk)
00593         printf("CrcOk ");
00594     if (RegIrqFlags2.bits.LowBat)
00595         printf("LowBat ");
00596     printf("\r\n");
00597 }
00598 
00599 void
00600 fsk_print_status()
00601 {
00602     //uint16_t s;
00603     RegIrqFlags1_t RegIrqFlags1;
00604     
00605     if (radio.RegOpMode.bits.LongRangeMode) {
00606         printf("LoRa\r\n");
00607         return;
00608     }
00609     
00610     if (radio.RegOpMode.bits.ModulationType == 0) {
00611         printf("FSK ");
00612         switch (radio.RegOpMode.bits.ModulationShaping) {
00613             case 1: printf("BT1.0 "); break;
00614             case 2: printf("BT0.5 "); break;
00615             case 3: printf("BT0.3 "); break;
00616         }
00617     } else if (radio.RegOpMode.bits.ModulationType == 1) {
00618         printf("OOK ");
00619     }
00620 
00621     printf("%" PRIu32 "bps fdev:%" PRIu32 "Hz\r\n", fsk.get_bitrate(), fsk.get_tx_fdev_hz());    
00622     
00623     fsk.RegPktConfig2.word = radio.read_u16(REG_FSK_PACKETCONFIG2);
00624     
00625     fsk_print_dio();
00626     
00627     printf("rxbw:%" PRIu32 "Hz ", fsk.get_rx_bw_hz(REG_FSK_RXBW));
00628     printf("afcbw:%" PRIu32 "Hz\r\n", fsk.get_rx_bw_hz(REG_FSK_AFCBW));
00629 
00630     fsk.RegRssiConfig.octet = radio.read_reg(REG_FSK_RSSICONFIG);
00631     printf("RssiOffset:%ddB smoothing:%dsamples\r\n", fsk.RegRssiConfig.bits.RssiOffset, 1 << (fsk.RegRssiConfig.bits.RssiSmoothing+1));
00632 
00633 
00634     fsk.RegSyncConfig.octet = radio.read_reg(REG_FSK_SYNCCONFIG);
00635 
00636     if (fsk.RegPktConfig2.bits.DataModePacket) {
00637         uint16_t len;
00638         /* packet mode */
00639         len = fsk_get_PayloadLength();
00640         printf("packet RegPayloadLength:0x%03x ", len);
00641 
00642         if (fsk.RegPktConfig2.bits.BeaconOn)
00643             printf("BeaconOn ");
00644 
00645         fsk.RegFifoThreshold.octet = radio.read_reg(REG_FSK_FIFOTHRESH);
00646         printf("FifoThreshold:%d TxStartCondition:", fsk.RegFifoThreshold.bits.FifoThreshold);
00647         if (fsk.RegFifoThreshold.bits.TxStartCondition)
00648             printf("!FifoEmpty");
00649         else
00650             printf("FifoLevel");
00651 
00652         printf("\r\nAutoRestartRxMode:");
00653         switch (fsk.RegSyncConfig.bits.AutoRestartRxMode) {
00654             case 0: printf("off "); break;
00655             case 1: printf("no-pll-wait "); break;
00656             case 2: printf("pll-wait "); break;
00657             case 3: printf("3 "); break;
00658         }
00659         //...todo
00660 
00661         printf("PreambleSize:%d ", radio.read_u16(REG_FSK_PREAMBLEMSB));
00662 
00663         fsk.RegOokPeak.octet = radio.read_reg(REG_FSK_OOKPEAK);
00664         if (fsk.RegOokPeak.bits.barker_en)
00665             printf("barker ");
00666         if (!fsk.RegOokPeak.bits.BitSyncOn)
00667             printf("BitSyncOff ");
00668         //...todo
00669 
00670         fsk.RegPktConfig1.octet = radio.read_reg(REG_FSK_PACKETCONFIG1);
00671         if (fsk.RegPktConfig1.bits.PacketFormatVariable)
00672             printf("variable");
00673         else
00674             printf("fixed");
00675         printf("-length\r\ncrc");
00676         if (fsk.RegPktConfig1.bits.CrcOn) {
00677             printf("On");
00678         } else
00679             printf("Off");
00680         printf(" crctype:");
00681         if (fsk.RegPktConfig1.bits.CrCWhiteningType)
00682             printf("IBM");
00683         else
00684             printf("CCITT");
00685         printf(" dcFree:");
00686         switch (fsk.RegPktConfig1.bits.DcFree) {
00687             case 0: printf("none "); break;
00688             case 1: printf("Manchester "); break;
00689             case 2: printf("Whitening "); break;
00690             case 3: printf("reserved "); break;
00691         }
00692         fsk_printAddressFiltering();
00693 
00694         printf("\r\n");
00695         fsk_print_IrqFlags2();
00696     } else {
00697         /* continuous mode */
00698         printf("continuous ");
00699     }
00700 
00701     fsk.RegPreambleDetect.octet = radio.read_reg(REG_FSK_PREAMBLEDETECT);
00702     printf("PreambleDetect:");
00703     if (fsk.RegPreambleDetect.bits.PreambleDetectorOn) {
00704         printf("size=%d,tol=%d ",
00705             fsk.RegPreambleDetect.bits.PreambleDetectorSize,
00706             fsk.RegPreambleDetect.bits.PreambleDetectorTol);
00707     } else
00708         printf("Off ");
00709 
00710     printf(" syncsize:%d ", fsk.RegSyncConfig.bits.SyncSize);
00711     printf(" : %02x ", radio.read_reg(REG_FSK_SYNCVALUE1));
00712     printf("%02x ", radio.read_reg(REG_FSK_SYNCVALUE2));
00713     printf("%02x ", radio.read_reg(REG_FSK_SYNCVALUE3));
00714     printf("%02x ", radio.read_reg(REG_FSK_SYNCVALUE4));
00715     printf("\r\n");   // end sync config
00716 
00717     fsk.RegAfcFei.octet = radio.read_reg(REG_FSK_AFCFEI);
00718     printf("afcAutoClear:");
00719     if (fsk.RegAfcFei.bits.AfcAutoClearOn)
00720         printf("On");
00721     else
00722         printf("OFF");
00723     printf(" afc:%dHz ", (int)(FREQ_STEP_HZ * radio.read_s16(REG_FSK_AFCMSB)));
00724 
00725     printf("fei:%dHz\r\n", (int)(FREQ_STEP_HZ * radio.read_s16(REG_FSK_FEIMSB)));
00726 
00727     fsk.RegRxConfig.octet = radio.read_reg(REG_FSK_RXCONFIG);
00728     printf("RxTrigger:");
00729     switch (fsk.RegRxConfig.bits.RxTrigger) {
00730         case 0: printf("none "); break;
00731         case 1: printf("rssi "); break;
00732         case 6: printf("preamble "); break;
00733         case 7: printf("both "); break;
00734         default: printf("-%d- ", fsk.RegRxConfig.bits.RxTrigger); break;
00735     }
00736     printf("AfcAuto:");
00737     if (fsk.RegRxConfig.bits.AfcAutoOn)
00738         printf("On ");
00739     else
00740         printf("OFF ");
00741     if (fsk.RegRxConfig.bits.AgcAutoOn) {
00742         printf("AgcAutoOn ");
00743     } else {
00744         radio.RegLna.octet = radio.read_reg(REG_LNA);
00745         printf("AgcAutoOff:G%d ", radio.RegLna.bits.LnaGain);
00746     }
00747 
00748     fsk.RegTimerResol.octet = radio.read_reg(REG_FSK_TIMERRESOL);
00749     if (fsk.RegTimerResol.bits.hlm_started)
00750         printf("hlm_started ");
00751     else
00752         printf("hlm_stopped ");
00753 
00754     fsk.RegRssiThresh = radio.read_reg(REG_FSK_RSSITHRESH);
00755     printf("rssiThreshold:-%.1f@%02x ", fsk.RegRssiThresh / 2.0, REG_FSK_RSSITHRESH);
00756 
00757     radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
00758     if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER ||
00759         radio.RegOpMode.bits.Mode == RF_OPMODE_SYNTHESIZER_RX)
00760     {
00761         printf("rssi:-%.1f ", radio.read_reg(REG_FSK_RSSIVALUE) / 2.0);
00762     }
00763 
00764     fsk.RegSeqConfig1.octet = radio.read_reg(REG_FSK_SEQCONFIG1);
00765     printf("\r\nsequencer: ");
00766     printf("FromStart:");
00767     switch (fsk.RegSeqConfig1.bits.FromStart) {
00768         case 0:
00769             printf("lowPowerSelection-");
00770             if (fsk.RegSeqConfig1.bits.LowPowerSelection)
00771                 printf("idle");
00772             else
00773                 printf("sequencerOff");
00774             break;
00775         case 1: printf("rx"); break;
00776         case 2: printf("tx"); break;
00777         case 3: printf("tx on fifolevel"); break;
00778     }
00779     printf(" lowPowerSelection:");
00780     if (fsk.RegSeqConfig1.bits.LowPowerSelection)
00781         printf("idle");
00782     else
00783         printf("SequencerOff");
00784     if (fsk.RegSeqConfig1.bits.FromStart != 0 && 
00785         fsk.RegSeqConfig1.bits.LowPowerSelection != 0)
00786     {   // if sequencer enabled:
00787         printf("\r\nsequencer: IdleMode:");
00788         if (fsk.RegSeqConfig1.bits.IdleMode)
00789             printf("Sleep");
00790         else
00791             printf("standby");
00792         printf("\r\nsequencer: FromIdle to:");
00793         if (fsk.RegSeqConfig1.bits.FromIdle)
00794             printf("rx");
00795         else
00796             printf("tx");
00797         printf("\r\nsequencer: FromTransmit to:");
00798         if (fsk.RegSeqConfig1.bits.FromTransmit)
00799             printf("rx-on-PacketSent");
00800         else {
00801             printf("lowPowerSelection-");
00802             if (fsk.RegSeqConfig1.bits.LowPowerSelection)
00803                 printf("idle");
00804             else
00805                 printf("SequencerOff");
00806             printf("-on-PacketSent");
00807         }
00808         fsk.RegSeqConfig2.octet = radio.read_reg(REG_FSK_SEQCONFIG2);
00809         printf("\r\nsequencer: FromReceive:");
00810         switch (fsk.RegSeqConfig2.bits.FromReceive) {
00811             case 1: printf("PacketRecevied on PayloadReady"); break;
00812             case 2: 
00813                 printf("lowPowerSelection-");
00814                 if (fsk.RegSeqConfig1.bits.LowPowerSelection)
00815                     printf("idle");
00816                 else
00817                     printf("SequencerOff");
00818                 printf("-on-payloadReady");
00819                 break;
00820             case 3: printf("PacketRecevied-on-CrcOk"); break;
00821             case 4: printf("SequencerOff-on-Rssi"); break;
00822             case 5: printf("SequencerOff-on-SyncAddress"); break;
00823             case 6: printf("SequencerOff-PreambleDetect"); break;
00824             default: printf("-%d-", fsk.RegSeqConfig2.bits.FromReceive); break;
00825         }
00826         printf("\r\nsequencer: FromRxTimeout:");
00827         switch (fsk.RegSeqConfig2.bits.FromRxTimeout) {
00828             case 0: printf("rx"); break;
00829             case 1: printf("tx"); break;
00830             case 2:
00831                 printf("lowPowerSelection-");
00832                 if (fsk.RegSeqConfig1.bits.LowPowerSelection)
00833                     printf("idle");
00834                 else
00835                     printf("SequencerOff");
00836                 break;
00837             case 3: printf("SequencerOff"); break;
00838         }
00839         printf("\r\nsequencer: FromPacketReceived to:");
00840         switch (fsk.RegSeqConfig2.bits.FromPacketReceived) {
00841             case 0: printf("SequencerOff"); break;
00842             case 1: printf("tx on FifoEmpty"); break;
00843             case 2:
00844                 printf("lowPowerSelection-");
00845                 if (fsk.RegSeqConfig1.bits.LowPowerSelection)
00846                 printf("idle");
00847                 else
00848                 printf("sequencerOff");
00849                 break;
00850             case 3: printf("rx via fs"); break;
00851             case 4: printf("rx"); break;
00852         }
00853 
00854         fsk.RegTimerResol.octet = radio.read_reg(REG_FSK_TIMERRESOL);
00855         printf("\r\nsequencer: timer1:");
00856         switch (fsk.RegTimerResol.bits.timer1_resol) {
00857             case 0: printf("off"); break;
00858             case 1: printf("%dus", radio.read_reg(REG_FSK_TIMER1COEF) * 64); break;
00859             case 2: printf("%.1fms", radio.read_reg(REG_FSK_TIMER1COEF) * 4.1); break;
00860             case 3: printf("%.1fs", radio.read_reg(REG_FSK_TIMER1COEF) * 0.262); break;
00861         }
00862 
00863         printf(" timer2:");
00864         switch (fsk.RegTimerResol.bits.timer2_resol) {
00865             case 0: printf("off"); break;
00866             case 1: printf("%dus", radio.read_reg(REG_FSK_TIMER2COEF) * 64); break;
00867             case 2: printf("%.1fms", radio.read_reg(REG_FSK_TIMER2COEF) * 4.1); break;
00868             case 3: printf("%.1fs", radio.read_reg(REG_FSK_TIMER2COEF) * 0.262); break;
00869         }
00870     } // ..if sequencer enabled
00871 
00872     printf("\r\nIrqFlags1:");
00873     RegIrqFlags1.octet = radio.read_reg(REG_FSK_IRQFLAGS1);
00874     if (RegIrqFlags1.bits.ModeReady)
00875         printf("ModeReady ");
00876     if (RegIrqFlags1.bits.RxReady)
00877         printf("RxReady ");
00878     if (RegIrqFlags1.bits.TxReady)
00879         printf("TxReady ");
00880     if (RegIrqFlags1.bits.PllLock)
00881         printf("PllLock ");
00882     if (RegIrqFlags1.bits.Rssi)
00883         printf("Rssi ");
00884     if (RegIrqFlags1.bits.Timeout)
00885         printf("Timeout ");
00886     if (RegIrqFlags1.bits.PreambleDetect)
00887         printf("PreambleDetect ");
00888     if (RegIrqFlags1.bits.SyncAddressMatch)
00889         printf("SyncAddressMatch ");
00890 
00891     printf("\r\n");
00892 
00893 /* TODO    if (!SX1272FSK->RegPktConfig1.bits.PacketFormatVariable) { // if fixed-length packet format:
00894         s = fsk_get_PayloadLength();
00895         if (s > FSK_LARGE_PKT_THRESHOLD)
00896             flags.fifo_flow_ctl = 1;
00897         else
00898             flags.fifo_flow_ctl = 0;
00899     }*/
00900 
00901     fsk.RegImageCal.octet = radio.read_reg(REG_FSK_IMAGECAL);
00902     if (fsk.RegImageCal.bits.TempMonitorOff) {
00903         printf("TempMonitorOff[\r0m\r\n");
00904     } else {
00905         printf("TempThreshold:");
00906         switch (fsk.RegImageCal.bits.TempThreshold) {
00907             case 0: printf("5C"); break;
00908             case 1: printf("10C"); break;
00909             case 2: printf("15C"); break;
00910             case 3: printf("20C"); break;
00911         }
00912         printf("\r\n");
00913     }
00914     if (fsk.RegImageCal.bits.ImageCalRunning)
00915         printf("ImageCalRunning[\r0m\r\n");
00916 
00917 /*    printf("flags.fifo_flow_ctl:%d pktidx:%d rx_pktlen:%d", flags.fifo_flow_ctl, pktidx, rx_pktlen);
00918     printf("\r\n");
00919 
00920     //printf("DIO0_PIN:%d\r\n", digitalRead(DIO0_PIN));
00921     printf("pkt_buf_len=%d remaining=%d\r\n", pk*/
00922 }
00923 
00924 void printOpMode()
00925 {
00926     radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
00927     switch (radio.RegOpMode.bits.Mode) {
00928         case RF_OPMODE_SLEEP: printf("sleep"); break;
00929         case RF_OPMODE_STANDBY: printf("stby"); break;
00930         case RF_OPMODE_SYNTHESIZER_TX: printf("fstx"); break;
00931         case RF_OPMODE_TRANSMITTER: printf("tx"); break;
00932         case RF_OPMODE_SYNTHESIZER_RX: printf("fsrx"); break;
00933         case RF_OPMODE_RECEIVER: printf("rx"); break;
00934         case 6:
00935             if (radio.RegOpMode.bits.LongRangeMode)
00936                 printf("rxs");
00937             else
00938                 printf("-6-");
00939             break;  // todo: different lora/fsk
00940         case 7:
00941             if (radio.RegOpMode.bits.LongRangeMode)
00942                 printf("cad");
00943             else
00944                 printf("-7-");
00945             break;  // todo: different lora/fsk
00946     }
00947 }
00948 
00949 void
00950 printPa()
00951 {
00952     RegPdsTrim1_t pds_trim;
00953     
00954     pds_trim.octet = radio.read_reg(REG_PDSTRIM1_SX1272);
00955     printf(" txdac=%.1fuA", 2.5 + (pds_trim.bits.prog_txdac * 0.625));
00956     radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG);
00957     if (radio.RegPaConfig.bits.PaSelect) {
00958         //float output_dBm = 17 - (15-radio.RegPaConfig.bits.OutputPower);
00959         float output_dBm = (pds_trim.bits.prog_txdac+13) - (15-radio.RegPaConfig.bits.OutputPower);
00960         printf(" PABOOST OutputPower=%.1fdBm", output_dBm);
00961     } else {
00962         float pmax = (0.6*radio.RegPaConfig.bits.MaxPower) + 10.8;
00963         float output_dBm = pmax - (15-radio.RegPaConfig.bits.OutputPower);
00964         printf(" RFO pmax=%.1fdBm OutputPower=%.1fdBm", pmax, output_dBm);
00965     }
00966 }
00967 
00968 void /* things always present, whether lora or fsk */
00969 common_print_status()
00970 {
00971     printf("PD2:%d version:0x%02x %.3fMHz ", pd2.read(), radio.read_reg(REG_VERSION), radio.get_frf_MHz());
00972     printOpMode();
00973 
00974     printPa();
00975 
00976     radio.RegOcp.octet = radio.read_reg(REG_OCP);
00977     if (radio.RegOcp.bits.OcpOn) {
00978         int imax = 0;
00979         if (radio.RegOcp.bits.OcpTrim < 16)
00980             imax = (5 * radio.RegOcp.bits.OcpTrim) + 45;
00981         else if (radio.RegOcp.bits.OcpTrim < 28)
00982             imax = (10 * radio.RegOcp.bits.OcpTrim) - 30;
00983         else
00984             imax = 240;
00985         printf(" OcpOn %dmA ", imax);
00986     } else
00987         printf(" OcpOFF ");
00988 
00989     printf("\r\n");
00990     
00991     if (per_en) {
00992         printf("per_tx_delay:%f\r\n", per_tx_delay);
00993         printf("PER device ID:%d\r\n", per_id);
00994     }
00995     printf("GPS enabled:%d ", gps.enabled());
00996     if (mote_version == MOTE_V2)
00997         printf("MOTE_V2\r\n");
00998     else if (mote_version == MOTE_V3)
00999         printf("MOTE_V3\r\n");
01000 }
01001 
01002 void per_cb()
01003 {
01004     int i;
01005     
01006     PacketTxCnt++;
01007 
01008     radio.tx_buf[0] = per_id;
01009     radio.tx_buf[1] = PacketTxCnt >> 24;
01010     radio.tx_buf[2] = PacketTxCnt >> 16;
01011     radio.tx_buf[3] = PacketTxCnt >> 8;
01012     radio.tx_buf[4] = PacketTxCnt;
01013     radio.tx_buf[5] = 'P';
01014     radio.tx_buf[6] = 'E';
01015     radio.tx_buf[7] = 'R';
01016     radio.tx_buf[8] = 0;
01017     for (i = 0; i < 8; i++)
01018         radio.tx_buf[8] += radio.tx_buf[i];
01019     red_led = LED_ON;
01020     
01021     if (radio.RegOpMode.bits.LongRangeMode) {
01022         lora.start_tx(lora.RegPayloadLength);
01023     } else {
01024         fsk.start_tx(9);
01025     }        
01026 }
01027 
01028 
01029 
01030 void dio3_cb()
01031 {
01032     //green_led = LED_ON;
01033     clear_valid_header = true;
01034 }
01035 
01036 bool lora_sync_sweep_hi;
01037 uint8_t lora_sync_byte;
01038 void lora_sync_sweep()
01039 {
01040     if (abort_key) {
01041         abort_key = false;
01042         return;
01043     }
01044     
01045     hop_timeout.attach(&lora_sync_sweep, 0.1);
01046     if (lora_sync_sweep_hi) {
01047         lora_sync_byte += 0x10;
01048     } else {
01049         if ((lora_sync_byte & 0x0f) == 0x0f)
01050             lora_sync_byte &= 0xf0;
01051         else
01052             lora_sync_byte++;
01053     }
01054      printf("%02x\r\n", lora_sync_byte);
01055     radio.write_reg(REG_LR_SYNC_BYTE, lora_sync_byte);
01056     
01057     lora.start_tx(lora.RegPayloadLength);
01058 }
01059 
01060 #ifdef FCC_TEST  
01061 float hop_MHz;
01062 bool new_hop;
01063 uint8_t hop_ofs = 0;
01064 
01065 void hop_cb()
01066 {
01067     static uint8_t prev_ofs;
01068     int shift;
01069     
01070     radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
01071     if (radio.RegOpMode.bits.Mode == RF_OPMODE_TRANSMITTER)
01072         hop_timeout.attach(&hop_cb, 0.4);
01073     else
01074         return;
01075     
01076     do {
01077         shift = rand() & 0x1f;
01078         if (hop_type == HOP_TYPE_64CH)
01079             hop_ofs = (rand() >> shift) & 0x3f;
01080         else if (hop_type == HOP_TYPE_4CH)
01081             hop_ofs = (rand() >> shift) & 0x3;
01082     } while (hop_ofs == prev_ofs);
01083     
01084     prev_ofs = hop_ofs; 
01085     hop_MHz = hop_base_MHz + (hop_ofs * hop_step_MHz);
01086     new_hop = true;
01087       
01088     radio.set_frf_MHz(hop_MHz);
01089 
01090     radio.set_opmode(RF_OPMODE_STANDBY);              
01091     radio.set_opmode(RF_OPMODE_TRANSMITTER);
01092     
01093     if (pc_7.read())
01094         pc_7 = 0;
01095     else
01096         pc_7 = 1;
01097 }
01098 #endif /* #ifdef FCC_TEST */  
01099 
01100 void print_rx_buf(int len)
01101 {
01102     int i;
01103 
01104     printf("000:");
01105     for (i = 0; i < len; i++) {
01106         //printf("(%d)%02x ", i % 16, rx_buf[i]);
01107         printf("%02x ", radio.rx_buf[i]);
01108         if (i % 16 == 15 && i != len-1)
01109             printf("\r\n%03d:", i+1);
01110 
01111     }
01112     printf("\r\n");
01113 }
01114 
01115 void print_rx_verbose(uint8_t dlen)
01116 {
01117     float dbm;
01118     printLoraIrqs_(false);
01119     if (lora.RegHopPeriod > 0) {
01120         lora.RegHopChannel.octet = radio.read_reg(REG_LR_HOPCHANNEL);
01121         printf("HopCH:%d ", lora.RegHopChannel.bits.FhssPresentChannel);
01122     }
01123     printf("%dHz ", lora.get_freq_error_Hz());    
01124     lora_printCodingRate(true);  // true: of received packet
01125     dbm = lora.get_pkt_rssi();
01126     printf(" crc%s %.1fdB  %.1fdBm\r\n",
01127         lora.RegHopChannel.bits.RxPayloadCrcOn ? "On" : "OFF",
01128         lora.RegPktSnrValue / 4.0,
01129         dbm
01130     );
01131     print_rx_buf(/*lora.RegRxNbBytes*/dlen);  
01132     
01133 }
01134 
01135 int per_parse_rx(uint8_t len)
01136 {
01137     if (len > 8 && radio.rx_buf[5] == 'P' && radio.rx_buf[6] == 'E' && radio.rx_buf[7] == 'R') {
01138         int i;
01139         float per;
01140 
01141         /* this is PER packet */
01142         uint32_t PacketRxSequence = (radio.rx_buf[1] << 24) | (radio.rx_buf[2] << 16) | (radio.rx_buf[3] << 8) | radio.rx_buf[4];
01143         PacketPerOkCnt++;
01144         
01145         if( PacketRxSequence <= PacketRxSequencePrev )
01146         { // Sequence went back => resynchronization
01147             // dont count missed packets this time
01148             i = 0;
01149         }
01150         else
01151         {
01152             // determine number of missed packets
01153             i = PacketRxSequence - PacketRxSequencePrev - 1;
01154         }
01155         
01156         red_led = !red_led.read();
01157         // be ready for the next
01158         PacketRxSequencePrev = PacketRxSequence;
01159         // increment 'missed' counter for the RX session
01160         PacketPerKoCnt += i;
01161         per = ( 1.0 - ( float )PacketPerOkCnt / ( float )( PacketPerOkCnt + PacketPerKoCnt ) ) * 100.0;
01162         printf("%" PRIu32 ", ok=%" PRIu32 " missed=%" PRIu32 " normal=%" PRIu32 " per:%.3f ", PacketRxSequence, PacketPerOkCnt, PacketPerKoCnt, PacketNormalCnt, per);
01163         if (radio.RegOpMode.bits.LongRangeMode)
01164             printf("pkt:%ddBm, snr:%.1fdB, %ddBm\r\n", lora.get_pkt_rssi(), lora.RegPktSnrValue / 4.0, lora.get_current_rssi());
01165         else {
01166             wait_us(10000);
01167             printf(" -%.1fdBm\r\n", radio.read_reg(REG_FSK_RSSIVALUE) / 2.0); 
01168         }
01169 
01170         return 1;
01171     } else {
01172         return 0;
01173     }    
01174 }
01175     
01176 void
01177 service_radio()
01178 {
01179     service_action_e act;
01180     static uint8_t rssi = 0;
01181     
01182     if (radio.RegOpMode.bits.LongRangeMode) {
01183 
01184         act = lora.service();
01185     
01186         switch (act) {
01187             case SERVICE_READ_FIFO:
01188                 //green_led = LED_OFF; // ValidHeader indication
01189                                    
01190                 if (app == APP_NONE) {   
01191                     if (per_en) {
01192                         if (!per_parse_rx(lora.RegRxNbBytes)) {
01193                             PacketNormalCnt++;
01194                             print_rx_verbose(lora.RegRxNbBytes);                            
01195                         }
01196                     } else                     
01197                         print_rx_verbose(lora.RegRxNbBytes);
01198                     fflush(stdout);
01199                 } else if (app == APP_CHAT) {
01200                     if (lora.RegHopChannel.bits.RxPayloadCrcOn) {
01201                         if (lora.RegIrqFlags.bits.PayloadCrcError)
01202                             printf("crcError\r\n");
01203                         else {
01204                             int n = lora.RegRxNbBytes;
01205                             radio.rx_buf[n++] = '\r';
01206                             radio.rx_buf[n++] = '\n';
01207                             radio.rx_buf[n] = 0; // null terminate
01208                             printf((char *)radio.rx_buf);
01209                         }
01210                     } else
01211                         printf("crcOff\r\n");
01212                         
01213                     // clear Irq flags
01214                     radio.write_reg(REG_LR_IRQFLAGS, lora.RegIrqFlags.octet);
01215                     // should still be in receive mode
01216                 }
01217                 break;
01218             case SERVICE_TX_DONE:
01219                 red_led = LED_OFF;
01220                 hdr_fem_csd = 0;    //debug
01221                 if (app == APP_CHAT) {
01222                     lora.start_rx(RF_OPMODE_RECEIVER);
01223                 } else if (per_en)
01224                     per_timeout.attach(&per_cb, per_tx_delay); // start next TX
01225                 else if (rx_after_tx)
01226                     lora.start_rx(RF_OPMODE_RECEIVER);
01227                 break;
01228             case SERVICE_ERROR:
01229                 printf("error\r\n");
01230                 break;
01231             case SERVICE_NONE:
01232                 break;
01233         } // ...switch (act)
01234     } else {
01235         /* FSK: */
01236         act = fsk.service();
01237         
01238          switch (act) {
01239              case SERVICE_READ_FIFO:
01240                 if (app == APP_CHAT) {
01241                     int n = fsk.rx_buf_length;
01242                     radio.rx_buf[n++] = '\r';
01243                     radio.rx_buf[n++] = '\n';
01244                     radio.rx_buf[n] = 0; // null terminate
01245                     printf((char *)radio.rx_buf);                    
01246                 } else {
01247                     if (fsk.RegRxConfig.bits.AfcAutoOn) {
01248                         printf("%dHz ", (int)(FREQ_STEP_HZ * fsk.RegAfcValue));   
01249                         if (rssi != 0) {
01250                             printf("pkt:-%.1fdBm ", rssi / 2.0);
01251                             rssi = 0;
01252                         }
01253                     }
01254                     if (per_en) { 
01255                         if (!per_parse_rx(fsk.rx_buf_length)) {
01256                             PacketNormalCnt++;
01257                             print_rx_buf(fsk.rx_buf_length);                                                 
01258                         }                                       
01259                     } else {
01260                         print_rx_buf(fsk.rx_buf_length);                            
01261                     }
01262                     fflush(stdout);
01263                 }
01264                 break;
01265             case SERVICE_TX_DONE:
01266                 if (app == APP_CHAT) {
01267                     fsk.start_rx();
01268                 } else if (per_en) {
01269                     per_timeout.attach(&per_cb, per_tx_delay); // start next TX
01270                 }
01271                 break;                
01272             case SERVICE_ERROR:
01273             case SERVICE_NONE:
01274                 break;                
01275          } // ...switch (act)
01276          
01277          /* fsk sync address */
01278          if (dio2 && radio.RegDioMapping1.bits.Dio2Mapping == 3) {
01279              // syncAdrs when in RX mode
01280              if (rssi == 0) {
01281                  rssi = radio.read_reg(REG_FSK_RSSIVALUE);
01282              }
01283          }
01284                   
01285     }
01286     
01287     if (clear_valid_header) {
01288         RegIrqFlags_t irqs;
01289         irqs.octet = 0;
01290         irqs.bits.ValidHeader = 1;
01291         radio.write_reg(REG_LR_IRQFLAGS, irqs.octet);
01292         clear_valid_header = false;
01293     }
01294     
01295 #ifdef FCC_TEST    
01296     if (new_hop) {
01297         new_hop = false;
01298         printf("%02d  %.1f\r\n", hop_ofs, hop_MHz);
01299     }    
01300 #endif /* #ifdef FCC_TEST */  
01301 }
01302 
01303 void
01304 gps_service()
01305 {
01306     gps.service();
01307     if (gps.enabled()) {
01308         if (gps.LatitudeBinary != 0) {
01309             gps.LatitudeBinary = 0;
01310             printf("gps long:%f, lat:%f  Vbat:%.2fV\r\n", gps.Longitude, gps.Latitude, ain_bat->read()*AIN_VREF*AIN_VBAT_DIV);
01311         }
01312     }
01313 }
01314 
01315 RCC_OscInitTypeDef prev_RCC_OscInitStruct;
01316 
01317 void all_peripherals_off()
01318 {
01319     // TODO: PD2 low, has pulldown
01320     
01321     HAL_RCC_GetOscConfig(&prev_RCC_OscInitStruct);
01322     /*printf("hsiState:%d\r\n", osc_init.HSIState);
01323     wait(0.05);*/
01324 
01325 #ifndef USE_DEBUGGER
01326     /* PA13 to undriven JTMS/SWDIO pin (from AF0 to GPIO), and PA2 */
01327     GPIOA->MODER &= 0xf7ffffdf;
01328     GPIOB->MODER &= 0xffffdfff; // PB6 UART_TX to input
01329 #endif
01330 
01331     sx9500.set_active(false);
01332     mpl3115a2.SetModeStandby();
01333     mma8451q.set_active(0);
01334     gps.enable(false);
01335 
01336     if (GPIOB->ODR & 0x1000) {  // if SX1272_NSS (PB12) wasnt forced low
01337         radio.set_opmode(RF_OPMODE_SLEEP);
01338     }
01339 }
01340 
01341 
01342 
01343 void restore_from_sleep()
01344 {
01345     RCC_OscInitTypeDef osc_init;
01346 #ifndef USE_DEBUGGER
01347     /* PA13 back to JTMS/SWDIO pin (from GPIO to AF0), and PA2 */
01348     GPIOA->MODER |= 0x08000020;
01349     GPIOB->MODER |= 0x00002000; // PB6 input to UART_TX
01350 #endif
01351 
01352     if (prev_RCC_OscInitStruct.HSIState == RCC_HSI_ON) {
01353         HAL_RCC_GetOscConfig(&osc_init);
01354         if (osc_init.HSIState != RCC_HSI_ON) {
01355             printf("hsi-restore\r\n");
01356             // Enable the HSI (to clock the ADC)
01357             osc_init.OscillatorType = RCC_OSCILLATORTYPE_HSI;
01358             osc_init.HSIState       = RCC_HSI_ON;
01359             osc_init.PLL.PLLState   = RCC_PLL_NONE;
01360             HAL_RCC_OscConfig(&osc_init);    
01361         }
01362     }
01363 }
01364 
01365 int get_kbd_str(char* buf, int size)
01366 {
01367     char c;
01368     int i;
01369     static int prev_len;
01370     
01371     for (i = 0;;) {
01372         
01373         if (pc.readable()) {
01374             c = pc.getc();
01375             if (c == 8) {   // backspace
01376                 if (i > 0) {
01377                     pc.putc(8);
01378                     pc.putc(' ');
01379                     pc.putc(8);
01380                     i--;
01381                 }
01382             } else if (c == '\r') {
01383                 if (i == 0) {
01384                     return prev_len; // repeat previous
01385                 } else {
01386                     buf[i] = 0; // null terminate
01387                     prev_len = i;
01388                     return i;
01389                 }
01390             } else if (c == 3) {
01391                 // ctrl-C abort
01392                 per_en = false;
01393                 abort_key = true;
01394                 return -1;
01395             } else if (i < size) {
01396                 buf[i++] = c;
01397                 pc.putc(c);
01398             }
01399         } else {
01400             if (service_en) {
01401                 service_radio();
01402             }
01403             gps_service();
01404             sx9500.service();
01405             mma8451q.service();
01406             mpl3115a2.service();
01407 
01408         }
01409     } // ...for()
01410 }
01411 
01412 void
01413 console_chat()
01414 {
01415     int i, len = get_kbd_str(pcbuf, sizeof(pcbuf));
01416     if (len < 0) {
01417         printf("chat abort\r\n");
01418         app = APP_NONE;
01419         return;
01420     } else {
01421         for (i = 0; i < len; i++)
01422             radio.tx_buf[i] = pcbuf[i];
01423         if (radio.RegOpMode.bits.LongRangeMode) {
01424             lora.RegPayloadLength = len;
01425             radio.write_reg(REG_LR_PAYLOADLENGTH, lora.RegPayloadLength);
01426             red_led = LED_ON;
01427             lora.start_tx(len);
01428         } else {
01429             fsk.start_tx(len);
01430         }
01431         printf("\r\n");
01432     }
01433 }
01434 
01435 uint8_t last_RxCurrentAddr;
01436 uint8_t last_RxNbBytes;
01437 
01438 
01439 
01440                 
01441 void
01442 console()
01443 {
01444     int len, i;
01445     uint32_t ui;
01446     uint8_t a, d;
01447     static uint16_t fsk_tx_length;
01448         
01449     len = get_kbd_str(pcbuf, sizeof(pcbuf));
01450     if (len < 0) {
01451         printf("abort\r\n");
01452         return;
01453     }
01454     
01455     printf("\r\n");
01456     if (len == 1) {
01457         switch (pcbuf[0]) {
01458             case 'i':
01459                 printf("init\r\n");
01460                 radio.init();
01461                 if (!radio.RegOpMode.bits.LongRangeMode) {
01462                     fsk.init();   // put FSK modem to some functioning default
01463                 } else {
01464                     // lora configuration is more simple
01465                 }
01466                 break;
01467             case 'h':
01468                 printf("hw_reset()\r\n");
01469                 radio.hw_reset();
01470                 break;
01471             case 'R':
01472                 // read all registers
01473                 for (a = 1; a < 0x71; a++) {
01474                     d = radio.read_reg(a);
01475                     //update_shadow_regs(selected_radio, a, d); 
01476                     printf("%02x: %02x\r\n", a, d);
01477                 }
01478                 break;
01479             case 'T':
01480                 if (radio.RegOpMode.bits.LongRangeMode) {
01481                     lora.RegModemConfig2.octet = radio.read_reg(REG_LR_MODEMCONFIG2);
01482                     //printf("a %02x\r\n", lora.RegModemConfig2.octet);
01483                     lora.RegModemConfig2.sx1276bits.TxContinuousMode ^= 1;   // same for sx1272 and sx1276
01484                     //printf("b %02x\r\n", lora.RegModemConfig2.octet);
01485                     radio.write_reg(REG_LR_MODEMCONFIG2, lora.RegModemConfig2.octet);
01486                     lora.RegModemConfig2.octet = radio.read_reg(REG_LR_MODEMCONFIG2);
01487                     //printf("c %02x\r\n", lora.RegModemConfig2.octet);
01488                     lora_printTxContinuousMode();
01489                     printf("\r\n");
01490                 } else
01491                     printf("(fsk)\r\n");
01492                 break;
01493             case 'c':
01494                 if (!radio.RegOpMode.bits.LongRangeMode) {
01495                     printf("%" PRIu32 "bps fdev:%" PRIu32 "hz ", fsk.get_bitrate(), fsk.get_tx_fdev_hz());
01496                     printf("rxbw:%" PRIu32 "Hz ", fsk.get_rx_bw_hz(REG_FSK_RXBW));
01497                     printf("afcbw:%" PRIu32 "Hz preambleLen:%d\r\n", fsk.get_rx_bw_hz(REG_FSK_AFCBW), radio.read_u16(REG_FSK_PREAMBLEMSB));
01498                 }
01499                 break;                            
01500             case 'C':
01501                 if (radio.RegOpMode.bits.LongRangeMode) {
01502                     lora.setRxPayloadCrcOn(!lora.getRxPayloadCrcOn());
01503                     lora_printRxPayloadCrcOn();
01504                 } else {
01505                     printf("CrcOn:");
01506                     fsk.RegPktConfig1.bits.CrcOn ^= 1;
01507                     radio.write_reg(REG_FSK_PACKETCONFIG1, fsk.RegPktConfig1.octet);
01508                     if (fsk.RegPktConfig1.bits.CrcOn)
01509                         printf("On\r\n");
01510                     else
01511                         printf("Off\r\n");
01512                     if (fsk.RegPktConfig2.bits.DataModePacket && radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER) {
01513                         fsk.config_dio0_for_pktmode_rx();
01514                     }
01515                 }
01516                 printf("\r\n");
01517                 break;
01518             case 'B':
01519                 radio.RegPaConfig.bits.PaSelect ^= 1;
01520                 radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet);
01521                 printPa();
01522                 printf("\r\n");
01523                 break;
01524             case 'L':  
01525                 if (radio.RegOpMode.bits.LongRangeMode)
01526                     fsk.enable(false);
01527                 else
01528                     lora.enable();
01529 
01530                 radio.RegOpMode.octet = radio.read_reg(REG_OPMODE);
01531                 if (radio.RegOpMode.bits.LongRangeMode)
01532                     printf("LoRa\r\n");
01533                 else
01534                     printf("FSK\r\n");                
01535                 break;
01536             case 's':
01537                 if (!radio.RegOpMode.bits.LongRangeMode) {
01538                     fsk.RegFifoThreshold.bits.TxStartCondition ^= 1;
01539                     radio.write_reg(REG_FSK_FIFOTHRESH, fsk.RegFifoThreshold.octet);
01540                     printf("TxStartCondition:");
01541                     if (fsk.RegFifoThreshold.bits.TxStartCondition)
01542                         printf("!FifoEmpty\r\n");
01543                     else
01544                         printf("FifoLevel\r\n");                    
01545                 }
01546                 break;
01547             case 'f':
01548                 if (!radio.RegOpMode.bits.LongRangeMode) {
01549                     printf("PacketFormat:");
01550                     fsk.RegPktConfig1.bits.PacketFormatVariable ^= 1;
01551                     radio.write_reg(REG_FSK_PACKETCONFIG1, fsk.RegPktConfig1.octet);
01552                     if (fsk.RegPktConfig1.bits.PacketFormatVariable)
01553                         printf("variable\r\n");
01554                     else
01555                         printf("fixed\r\n");
01556                     /*if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER)
01557                         reset_flow();*/
01558                 }
01559                 break;
01560             case 'E':
01561                 if (!radio.RegOpMode.bits.LongRangeMode) {
01562                     RegIrqFlags2_t RegIrqFlags2;
01563                     RegIrqFlags2.octet = radio.read_reg(REG_FSK_IRQFLAGS2);
01564                     while (!RegIrqFlags2.bits.FifoEmpty) {
01565                         if (pc.readable())
01566                             break;
01567                         printf("%02x\r\n", radio.read_reg(REG_FIFO));
01568                         RegIrqFlags2.octet = radio.read_reg(REG_FSK_IRQFLAGS2);
01569                     }
01570                 }
01571                 break;
01572             case 'A':
01573                 if (!radio.RegOpMode.bits.LongRangeMode) {
01574                     fsk.RegRxConfig.bits.AfcAutoOn ^= 1;
01575                     radio.write_reg(REG_FSK_RXCONFIG, fsk.RegRxConfig.octet);
01576                     printf("AfcAuto:");
01577                     if (fsk.RegRxConfig.bits.AfcAutoOn)
01578                         printf("On\r\n");
01579                     else
01580                         printf("OFF\r\n");
01581                     break;
01582                 }
01583                 break;
01584             case '?':
01585                 printf("G<portABCD><MO><pin0-f>[0123]       pin control (M=MODER, O=BSRR) see RM0038 section 7.4\r\n");
01586                 printf("cs%%d        deepsleep for seconds\r\n");
01587                 printf("cl%%d        sleep for seconds\r\n");
01588                 printf("CS%%d        repeated sleep for seconds (hold down key to stop)\r\n");
01589                 printf("r %%x       read sx1272 register (addr)\r\n");
01590                 printf("w %%x %%x   write sx1272 register (addr data)\r\n");
01591                 printf("ge          toggle GPS enable\r\n");
01592                 printf("L           toggle LongRangeMode/FSK\r\n");
01593                 printf("i           radio_init\r\n");
01594                 printf("h           hw_reset\r\n");
01595                 printf("tx[%%d]     transmit [length]\r\n");
01596                 printf("rx          receive\r\n");
01597                 printf("stb         put radio into standby\r\n");
01598                 printf("sle         put radio to sleep\r\n");
01599                 printf("C           toggle crcOn\r\n");
01600                 printf("op[%%d]     get/set output power\r\n");
01601                 printf("ocp[%%d]     get/set over-current protection (mA)\r\n");
01602                 printf("d[0-5]      change DIO pin assignment\r\n");
01603                 printf("frf[%%f]    get/set operating frequency (MHz)\r\n");
01604                 printf("pd2         toggle PA_High_Power\r\n");
01605                 printf("bgr[%%d]        get/set prog_txdac BGR bias for TXDAC (7=+20dBm)\r\n"); 
01606                 printf("per         toggle PER enable (\"tx\" to start, ctrl-C to stop)\r\n");
01607                 printf("pin[%%f]         get/set per_tx_delay (seconds)\r\n");    
01608                 printf("pid[%%d]        get/set PER device ID\r\n");
01609 #ifdef FCC_TEST                
01610                 printf("hop         change hop type (off, 64ch, 4ch)\r\n");
01611                 printf("hb[%%f]     get/set hop base MHz\r\n");
01612                 printf("hs[%%f]     get/set hop step MHz\r\n");
01613 #endif /* #ifdef FCC_TEST */                 
01614                 if (radio.RegOpMode.bits.LongRangeMode) {
01615                     printf("pl[%%d]     LORA get/set RegPayloadLength\r\n");
01616                     printf("cr[1234]    LORA set coding rate \r\n");
01617                     printf("bw[%%d]     LORA get/set bandwidth\r\n");
01618                     printf("sf[%%d]     LORA get/set spreading factor\r\n");
01619                     printf("T           LORA toggle TxContinuousMode\r\n");
01620                     printf("hp[%%d]     LORA get/set hop period\r\n");
01621                     printf("hm          LORA toggle explicit/explicit header mode\r\n");
01622                     printf("rin          LORA toggle RX invert_i_q\r\n");
01623                     printf("tin          LORA toggle chirp_invert_tx\r\n");
01624                     printf("ld          LORA toggle LowDataRateOptimize\r\n");
01625                 } else {
01626                     printf("bw[a][%%d] FSK get-set rxbw (bwa=afcbw)\r\n");
01627                     printf("br[%%d]    FSK get-set bitrate\r\n");
01628                     printf("c[%%d]       FSK set test case\r\n");
01629                     printf("fdev[%%d]    FSK get-set TX frequency deviation (hz)\r\n");
01630                     printf("rt          FSK change RxTrigger\r\n");
01631                     printf("pd          FSK enable/disable preamble detector\r\n");
01632                     printf("pt          FSK get-set PreambleDetectorTol\r\n");
01633                     printf("ss[%%d]    FSK get-set SyncSize\r\n");
01634                     printf("S[%%x]     FSK get-set sync word\r\n");
01635                     printf("s           FSK toggle TxStartCondition\r\n");
01636                     printf("f           FSK toggle PacketFormat fixed-variable\r\n");
01637                     printf("E           FSK empty out the fifo\r\n");
01638                     printf("ac          FSK AfcClear\r\n");
01639                     printf("A           FSK toggle AfcAutoOn\r\n");
01640                     printf("mp          FSK toggle MapPreambleDetect\r\n");
01641                     printf("ar          FSK change AutoRestartRxMode\r\n");
01642                     printf("alc          FSK toggle AfcAutoClearOn\r\n");
01643                     printf("ag          FSK toggle AgcAutoOn\r\n");
01644                     printf("pre[%%d}    FSK get-set TX preamble length\r\n");
01645                 }
01646                 printf("mp?     MPL3115 help (tempurature/pressure sensor)\r\n");
01647                 printf("mm?     MMA8451 help (accelerometer)\r\n");
01648                 printf("95?     SX9500 help (touch sensor)\r\n");
01649                 break;
01650             case '.':
01651                 if (radio.RegOpMode.bits.LongRangeMode)
01652                     lora_print_status();
01653                 else
01654                     fsk_print_status();
01655                 common_print_status();
01656                 break;
01657         } // ...switch (pcbuf[0])
01658     } else {
01659         if (pcbuf[0] == 't' && pcbuf[1] == 'x') { // TX
01660             if (per_en) {
01661                 printf("timeout attach %f\r\n", per_tx_delay);
01662                 PacketTxCnt = 0;
01663                 per_timeout.attach(&per_cb, per_tx_delay);
01664             } else {
01665                 if (radio.RegOpMode.bits.LongRangeMode) {
01666                     if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
01667                         sscanf(pcbuf+2, "%d", &i);
01668                         lora.RegPayloadLength = i;
01669                         radio.write_reg(REG_LR_PAYLOADLENGTH, lora.RegPayloadLength);
01670                     }
01671                     tx_cnt++;
01672                     for (i = 0; i < lora.RegPayloadLength; i++)
01673                         radio.tx_buf[i] = tx_cnt;
01674                     red_led = LED_ON;
01675                     lora.start_tx(lora.RegPayloadLength);
01676                     if (pcbuf[2] == 'r')
01677                         rx_after_tx = true;
01678                     else
01679                         rx_after_tx = false;
01680                 } else {    // FSK:
01681                     if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
01682                         sscanf(pcbuf+2, "%d", &i);
01683                         fsk_tx_length = i;
01684                     }
01685                     if (radio.RegOpMode.bits.Mode != RF_OPMODE_TRANSMITTER) { // if not already busy transmitting
01686                         tx_cnt++;
01687                         for (i = 0; i < fsk_tx_length; i++) {
01688                             radio.tx_buf[i] = tx_cnt;
01689                         }
01690                         fsk.start_tx(fsk_tx_length);
01691                     }
01692                 } // ...fsk
01693             } // ..!per_en
01694 #ifdef FCC_TEST            
01695             if (hop_type != HOP_TYPE_NONE)
01696                 hop_timeout.attach(&hop_cb, 0.4);
01697 #endif /* #ifdef FCC_TEST */
01698         } else if (pcbuf[0] == 'r' && pcbuf[1] == 'n' && pcbuf[2] == 'd') {
01699             uint8_t of = rand() & 0x3f;
01700 
01701             printf("%02d %.2f\r\n", of, 902.3 + (of * 0.2));
01702         }
01703 #ifdef FCC_TEST
01704         else if (pcbuf[0] == 'h' && pcbuf[1] == 'b') {
01705             if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
01706                 sscanf(pcbuf+2, "%f", &hop_base_MHz);
01707             }
01708             printf("hop_base:%f\r\n", hop_base_MHz);
01709         } else if (pcbuf[0] == 'h' && pcbuf[1] == 's') {
01710             if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
01711                 sscanf(pcbuf+2, "%f", &hop_step_MHz);
01712             }
01713             printf("hop_step:%f\r\n", hop_step_MHz);                           
01714         } else if (pcbuf[0] == 'h' && pcbuf[1] == 'o' && pcbuf[2] == 'p') {
01715             switch (hop_type) {
01716                 case HOP_TYPE_NONE:
01717                     hop_type = HOP_TYPE_64CH;
01718                     printf("64ch hop\r\n");                 
01719                     break;
01720                 case HOP_TYPE_64CH:
01721                     hop_type = HOP_TYPE_4CH;
01722                     printf("4ch hop\r\n");                                 
01723                     break;
01724                 case HOP_TYPE_4CH:
01725                     hop_type = HOP_TYPE_NONE;
01726                     printf("hop off\r\n");                 
01727                     break;
01728             }
01729         }
01730 #endif /* #ifdef FCC_TEST */         
01731         else if (pcbuf[0] == 'h' && pcbuf[1] == 'p' && radio.RegOpMode.bits.LongRangeMode) {
01732             if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
01733                 sscanf(pcbuf+2, "%d", &i);
01734                 lora.RegHopPeriod = i;
01735                 radio.write_reg(REG_LR_HOPPERIOD, lora.RegHopPeriod);
01736                 if (radio.RegDioMapping1.bits.Dio1Mapping != 1) {
01737                     radio.RegDioMapping1.bits.Dio1Mapping = 1;
01738                     radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet);
01739                 }
01740             }
01741             lora.RegHopPeriod = radio.read_reg(REG_LR_HOPPERIOD);
01742             printf("HopPeriod:0x%02x\r\n", lora.RegHopPeriod);
01743         } else if (pcbuf[0] == 'r' && pcbuf[1] == 't' && !radio.RegOpMode.bits.LongRangeMode) {
01744             printf("RxTrigger:");
01745             switch (fsk.RegRxConfig.bits.RxTrigger) {
01746                 case 0: fsk.RegRxConfig.bits.RxTrigger = 1;
01747                     printf("rssi\r\n");
01748                     break;
01749                 case 1: fsk.RegRxConfig.bits.RxTrigger = 6;
01750                     printf("preamble\r\n");
01751                     break;
01752                 case 6: fsk.RegRxConfig.bits.RxTrigger = 7;
01753                     printf("both\r\n");
01754                     break;
01755                 case 7: fsk.RegRxConfig.bits.RxTrigger = 0;
01756                     printf("none\r\n");
01757                     break;
01758                 default: fsk.RegRxConfig.bits.RxTrigger = 0;
01759                     printf("none\r\n");
01760                     break;
01761                 }
01762             radio.write_reg(REG_FSK_RXCONFIG, fsk.RegRxConfig.octet);     
01763         } else if (pcbuf[0] == 'r' && pcbuf[1] == 'x') { // RX
01764             if (per_en) {
01765                 red_led = LED_OFF;
01766                 //green_led = LED_OFF;
01767                 PacketNormalCnt = 0;
01768                 PacketRxSequencePrev = -1;
01769                 PacketPerKoCnt = 0;
01770                 PacketPerOkCnt = 0;                
01771                 dio3.rise(&dio3_cb);
01772             }
01773             if (radio.RegOpMode.bits.LongRangeMode) {
01774                 last_RxCurrentAddr = radio.read_reg(REG_LR_FIFORXCURRENTADDR);
01775                 lora.start_rx(RF_OPMODE_RECEIVER);
01776             } else {
01777                 fsk.start_rx();
01778                 radio.RegDioMapping1.bits.Dio2Mapping = 3;  // dio2 to syncadrs
01779                 radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet); 
01780                 
01781                 fsk.RegRssiConfig.octet = radio.read_reg(REG_FSK_RSSICONFIG);
01782                 fsk.RegRssiConfig.bits.RssiOffset = FSK_RSSI_OFFSET;
01783                 fsk.RegRssiConfig.bits.RssiSmoothing = FSK_RSSI_SMOOTHING;
01784                 radio.write_reg(REG_FSK_RSSICONFIG, fsk.RegRssiConfig.octet);              
01785             }
01786         } else if (pcbuf[0] == 'r' && pcbuf[1] == ' ') { // read single register
01787             sscanf(pcbuf+2, "%x", &i);
01788             printf("%02x: %02x\r\n", i, radio.read_reg(i));
01789         } else if (pcbuf[0] == 'w' && pcbuf[1] == ' ') { // write single register
01790             sscanf(pcbuf+2, "%x %x", &i, &len);
01791             radio.write_reg(i, len);
01792             printf("%02x: %02x\r\n", i, radio.read_reg(i));
01793         }
01794 #ifdef I2C_PIN_TEST
01795         else if (pcbuf[0] == 'b' && pcbuf[1] == '8') {
01796             printf("SCL:");
01797             switch (pcbuf[2]) {
01798                 case '0':
01799                     pb8.output();
01800                     pb8 = 0;
01801                     printf("lo");
01802                     break;
01803                 case '1':
01804                     pb8.output();
01805                     pb8 = 1;
01806                     printf("hi");
01807                     break;                    
01808                 case 'z':
01809                     pb8.input();
01810                     printf("z");
01811                     break;                    
01812             }
01813             printf("\r\n");
01814         } else if (pcbuf[0] == 'b' && pcbuf[1] == '9') {
01815             printf("SDA:");
01816             switch (pcbuf[2]) {
01817                 case '0':
01818                     pb9.output();
01819                     pb9 = 0;
01820                     printf("lo");
01821                     break;
01822                 case '1':
01823                     pb9.output();
01824                     pb9 = 1;
01825                     printf("hi");
01826                     break;                    
01827                 case 'z':
01828                     pb9.input();
01829                     printf("z");
01830                     break;                    
01831             }
01832             printf("\r\n");                      
01833         }
01834 #else    
01835         /************************** MMA8451Q... **************************************/
01836         else if (pcbuf[0] == 'm' && pcbuf[1] == 'm') {
01837             if (pcbuf[2] == '?') {
01838                 printf("mm.     get status\r\n");
01839                 printf("mm,     print XYZ\r\n");
01840                 printf("mma     toggle stby/active\r\n");
01841                 printf("mmtd     configure for transient detection\r\n");
01842                 printf("mmod     configure for orientation detection\r\n");
01843             } else if (pcbuf[2] == '.') {
01844                 printf("active:%d\r\n", mma8451q.get_active());
01845                 mma8451q.print_regs();
01846                 printf("i2c_int_pin:%d\r\n", i2c_int_pin.read());
01847             } else if (pcbuf[2] == ',') {
01848                 mma8451q.read(MMA8451_OUT_X_MSB, mma8451q.out.octets, 6);
01849                 mma8451q.out.v.x >>= 4; // 12bit data
01850                 mma8451q.out.v.y >>= 4; // 12bit data
01851                 mma8451q.out.v.z >>= 4; // 12bit data
01852                 printf("x:%d y:%d z:%d\r\n", mma8451q.out.v.x, mma8451q.out.v.y, mma8451q.out.v.z);
01853             } else if (pcbuf[2] == 'o' && pcbuf[3] == 'd') {
01854                 printf("orientation ");
01855                 d = mma8451q.read_single(MMA8451_PL_CFG);
01856                 if (d & 0x40) { // PL_EN?
01857                     d &= ~0x40;
01858                     mma8451q.write(MMA8451_PL_CFG, d);
01859                     printf("off\r\n");
01860                 } else {
01861                     mpl3115a2.write(CTRL_REG4, 0);  // turn off: shares same interrupt pin
01862                     mma8451q.orient_detect();
01863                     printf("on\r\n");
01864                 }
01865             } else if (pcbuf[2] == 't' && pcbuf[3] == 'd') {   
01866                 printf("transient ");
01867                 if (mma8451q.transient_cfg.bits.ELE) {
01868                     mma8451q.transient_cfg.octet = 0;
01869                     mma8451q.write(MMA8451_TRANSIENT_CFG, mma8451q.transient_cfg.octet);
01870                     mma8451q.ctrl_reg4.bits.INT_EN_TRANS = 0;
01871                     mma8451q.write(MMA8451_CTRL_REG4, mma8451q.ctrl_reg4.octet);                    
01872                     printf("off\r\n");
01873                 } else {
01874                     mpl3115a2.write(CTRL_REG4, 0);  // turn off: shares same interrupt pin
01875                     mma8451q.transient_detect();
01876                     //poll_timeout.attach(on_poll, 0.3);
01877                     printf("on\r\n");
01878                 }                         
01879             } else if (pcbuf[2] == 'a') {
01880                 if (mma8451q.get_active()) {
01881                     mma8451q.set_active(0);
01882                 } else {
01883                     mma8451q.set_active(1);
01884                 }
01885                 printf("active:%d\r\n", mma8451q.get_active());
01886             }
01887         }
01888         /************************** MPL3115... **************************************/
01889         else if (pcbuf[0] == 'm' && pcbuf[1] == 'p') {
01890             if (pcbuf[2] == '?') {
01891                 printf("mp.     get status\r\n");
01892                 printf("mpt     get temperature\r\n");
01893                 printf("mpa     get altitude\r\n");
01894                 printf("mpb     get barometer\r\n");
01895                 printf("mpo[%%d]     get/set oversampling (0-7)\r\n");
01896             } else if (pcbuf[2] == '.') {
01897                 printf("active:%d\r\n", mpl3115a2.GetModeActive());
01898                 printf("int src:%02x\r\n", mpl3115a2.read(INT_SOURCE_REG));
01899                 printf("CTRL1:%02x\r\n", mpl3115a2.read(CTRL_REG1));
01900                 /* only INT1 is connected */
01901                 printf("CTRL3:%02x\r\n", mpl3115a2.read(CTRL_REG3));    /* TODO: PP_OD1 for open-drain operation */
01902                 printf("CTRL4:%02x\r\n", mpl3115a2.read(CTRL_REG4));
01903                 printf("CTRL5:%02x\r\n", mpl3115a2.read(CTRL_REG5));
01904                 printf("OFF_H:%02x\r\n", mpl3115a2.read(OFF_H_REG));
01905                 
01906                 printf("i2c_int_pin:%d\r\n", i2c_int_pin.read());
01907             } else if (pcbuf[2] == 't') {
01908                 printf("temp:%.4f\r\n", mpl3115a2.ReadTemperature());
01909             } else if (pcbuf[2] == 'a') {
01910                 printf("alt:%.4f\r\n", mpl3115a2.ReadAltitude());
01911             } else if (pcbuf[2] == 'b') {
01912                 printf("bar:%.2f\r\n", mpl3115a2.ReadBarometer());
01913             } else if (pcbuf[2] == 'o') {
01914                 if (pcbuf[3] >= '0' && pcbuf[3] <= '9') {
01915                     sscanf(pcbuf+3, "%d", &i);
01916                     mpl3115a2.setOSR(i);
01917                 }                       
01918                 printf("OSR:%d\r\n", mpl3115a2.getOSR());
01919             }
01920         }
01921         /************************** sx9500... **************************************/
01922         else if (pcbuf[0] == '9' && pcbuf[1] == '5') {
01923             if (pcbuf[2] == '?') {
01924                 printf("95R     reset\r\n");
01925                 printf("95.     read status\r\n");
01926                 printf("95t[%%d]   get/set PROXTHRESH\r\n");
01927                 printf("95s[%%d]   get/set SCANPERIOD\r\n");
01928                 printf("95a         toggle txen\r\n");
01929             } else if (pcbuf[2] == '.') {
01930                 printf("(txen) active:%d\r\n", sx9500.get_active());
01931                 printf("RegStat:%02x\r\n", sx9500.read_single(SX9500_REG_STAT));
01932                 printf("RegProxCtrl0:%02x\r\n", sx9500.read_single(SX9500_REG_PROXCTRL0));
01933                 printf("RegProxCtrl1:%02x\r\n", sx9500.read_single(SX9500_REG_PROXCTRL1));
01934                 printf("RegProxCtrl2:%02x\r\n", sx9500.read_single(SX9500_REG_PROXCTRL2));
01935                 printf("RegProxCtrl3:%02x\r\n", sx9500.read_single(SX9500_REG_PROXCTRL3));
01936                 printf("RegProxCtrl4:%02x\r\n", sx9500.read_single(SX9500_REG_PROXCTRL4));
01937                 printf("RegProxCtrl5:%02x\r\n", sx9500.read_single(SX9500_REG_PROXCTRL5));
01938                 printf("RegProxCtrl6:%02x\r\n", sx9500.read_single(SX9500_REG_PROXCTRL6));
01939             } else if (pcbuf[2] == 'a') {
01940                 if (sx9500.get_active()) {
01941                     sx9500.set_active(false);
01942                 } else {
01943                     sx9500.RegProxCtrl0.octet = sx9500.read_single(SX9500_REG_PROXCTRL0);
01944                     sx9500.RegProxCtrl0.bits.sensor_en = 3;    // CS0 and CS1 on
01945                     sx9500.write(SX9500_REG_PROXCTRL0, sx9500.RegProxCtrl0.octet);
01946                     sx9500.write(SX9500_REG_PROXCTRL6, 1);  // threshold to 20 for CS1 release
01947                     sx9500.write(SX9500_REG_IRQMSK, 0x60);     // enable near and far interrupts
01948                     sx9500.set_active(true);
01949                     printf("RegProxCtrl0:%02x\r\n", sx9500.read_single(SX9500_REG_PROXCTRL0));    /* sensor-enable and scan period */
01950                 }
01951                 printf("(txen) active:%d\r\n", sx9500.get_active());
01952             } else if (pcbuf[2] == 'R') {
01953                 sx9500.reset();
01954             } else if (pcbuf[2] == 'i') {
01955                 if (pcbuf[3] != 0) {
01956                     sscanf(pcbuf+3, "%x", &i);
01957                     sx9500.write(SX9500_REG_IRQMSK, i);
01958                 }
01959                 printf("irqmsk:%02x\r\n", sx9500.read_single(SX9500_REG_IRQMSK));
01960             } else if (pcbuf[2] == 't') {
01961                 if (pcbuf[3] >= '0' && pcbuf[3] <= '9') {
01962                     sscanf(pcbuf+3, "%d", &i);
01963                     sx9500.write(SX9500_REG_PROXCTRL6, i);           
01964                 }   
01965                 printf("proxthresh:0x%x\r\n", sx9500.read_single(SX9500_REG_PROXCTRL6));
01966             } else if (pcbuf[2] == 'p') {
01967                 if (pcbuf[3] >= '0' && pcbuf[3] <= '9') {
01968                     sscanf(pcbuf+2, "%d", &i);
01969                     sx9500.RegProxCtrl0.bits.scan_period = i;
01970                     sx9500.write(SX9500_REG_PROXCTRL0, sx9500.RegProxCtrl0.octet);
01971                 }
01972                 sx9500.RegProxCtrl0.octet = sx9500.read_single(SX9500_REG_PROXCTRL0);
01973                 printf("scan period:%d\r\n", sx9500.RegProxCtrl0.bits.scan_period);
01974             }
01975         } 
01976 #endif /* !I2C_PIN_TEST */
01977         else if (pcbuf[0] == 'm' && pcbuf[1] == 'p' && !radio.RegOpMode.bits.LongRangeMode) {
01978             radio.RegDioMapping2.bits.MapPreambleDetect ^= 1;
01979             radio.write_reg(REG_DIOMAPPING2, radio.RegDioMapping2.octet);
01980             printf("MapPreambleDetect:");
01981             if (radio.RegDioMapping2.bits.MapPreambleDetect)
01982                 printf("preamble\r\n");
01983             else
01984                 printf("rssi\r\n");
01985         } else if (pcbuf[0] == 'o' && pcbuf[1] == 'p') {
01986             if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
01987                 sscanf(pcbuf+2, "%d", &i);
01988                 radio.RegPaConfig.bits.OutputPower = i;
01989                 radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet);
01990             }
01991             radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG);
01992             printf("OutputPower:%d\r\n", radio.RegPaConfig.bits.OutputPower);
01993         } else if (pcbuf[0] == 'c' && (pcbuf[1] >= '0' && pcbuf[1] <= '9') && !radio.RegOpMode.bits.LongRangeMode) {
01994             radio.set_opmode(RF_OPMODE_STANDBY);
01995             per_tx_delay = 0.3;
01996             
01997             fsk.RegFifoThreshold.octet = radio.read_reg(REG_FSK_FIFOTHRESH);
01998             fsk.RegFifoThreshold.bits.TxStartCondition = 1; // to nFifoEmpty
01999             radio.write_reg(REG_FSK_FIFOTHRESH, fsk.RegFifoThreshold.octet);
02000             
02001             if (radio.read_reg(REG_FSK_SYNCVALUE1) == 0x55 && radio.read_reg(REG_FSK_SYNCVALUE2)) {
02002                 fsk.RegSyncConfig.octet = radio.read_reg(REG_FSK_SYNCCONFIG);    
02003                 fsk.RegSyncConfig.bits.SyncSize = 2;
02004                 radio.write_reg(REG_FSK_SYNCCONFIG, fsk.RegSyncConfig.octet);
02005                 radio.write_reg(REG_FSK_SYNCVALUE3, 0x90);
02006                 radio.write_reg(REG_FSK_SYNCVALUE2, 0x4e);
02007                 radio.write_reg(REG_FSK_SYNCVALUE1, 0x63);              
02008             }
02009             
02010             fsk.RegPreambleDetect.octet = radio.read_reg(REG_FSK_PREAMBLEDETECT);
02011             fsk.RegPreambleDetect.bits.PreambleDetectorOn = 1;
02012             radio.write_reg(REG_FSK_PREAMBLEDETECT, fsk.RegPreambleDetect.octet);                 
02013             
02014             fsk.RegRxConfig.octet = radio.read_reg(REG_FSK_RXCONFIG);
02015             fsk.RegRxConfig.bits.AfcAutoOn = 1;
02016             fsk.RegRxConfig.bits.AgcAutoOn = 1;
02017             fsk.RegRxConfig.bits.RxTrigger = 7;
02018             radio.write_reg(REG_FSK_RXCONFIG, fsk.RegRxConfig.octet);    
02019             
02020             fsk.RegPreambleDetect.bits.PreambleDetectorOn = 1;
02021             fsk.RegPreambleDetect.bits.PreambleDetectorSize = 1;
02022             fsk.RegPreambleDetect.bits.PreambleDetectorTol = 10;
02023             radio.write_reg(REG_FSK_PREAMBLEDETECT, fsk.RegPreambleDetect.octet);            
02024             
02025             switch (pcbuf[1]) {
02026                 case '0':
02027                     fsk.set_bitrate(4800);
02028                     fsk.set_tx_fdev_hz(5005);
02029                     fsk.set_rx_dcc_bw_hz(10417, 0);  // rxbw
02030                     fsk.set_rx_dcc_bw_hz(50000, 1);  // afcbw
02031                     radio.write_u16(REG_FSK_PREAMBLEMSB, 8);                    
02032                     break;
02033                 case '1':
02034                     fsk.set_bitrate(50000);
02035                     fsk.set_tx_fdev_hz(25000);
02036                     fsk.set_rx_dcc_bw_hz(62500, 0);  // rxbw
02037                     fsk.set_rx_dcc_bw_hz(100000, 1);  // afcbw
02038                     radio.write_u16(REG_FSK_PREAMBLEMSB, 9);                    
02039                     break;           
02040                 case '2':
02041                     fsk.set_bitrate(38400);
02042                     fsk.set_tx_fdev_hz(20020);
02043                     fsk.set_rx_dcc_bw_hz(50000, 0);  // rxbw
02044                     fsk.set_rx_dcc_bw_hz(100000, 1);  // afcbw
02045                     radio.write_u16(REG_FSK_PREAMBLEMSB, 8);                        
02046                     break;
02047                 case '3':
02048                     fsk.set_bitrate(1201);
02049                     fsk.set_tx_fdev_hz(20020);
02050                     fsk.set_rx_dcc_bw_hz(25000, 0);  // rxbw
02051                     fsk.set_rx_dcc_bw_hz(50000, 1);  // afcbw
02052                     radio.write_u16(REG_FSK_PREAMBLEMSB, 8);                 
02053                     break;    
02054                 case '4':
02055                     fsk.set_bitrate(1201);
02056                     fsk.set_tx_fdev_hz(4028);
02057                     fsk.set_rx_dcc_bw_hz(7813, 0);  // rxbw
02058                     fsk.set_rx_dcc_bw_hz(25000, 1);  // afcbw
02059                     radio.write_u16(REG_FSK_PREAMBLEMSB, 8);
02060                     break;
02061                 case '5':
02062                     fsk.set_bitrate(1201);
02063                     fsk.set_tx_fdev_hz(4028);
02064                     fsk.set_rx_dcc_bw_hz(5208, 0);  // rxbw
02065                     fsk.set_rx_dcc_bw_hz(10417, 1);  // afcbw
02066                     radio.write_u16(REG_FSK_PREAMBLEMSB, 8);                    
02067                     break;                                                                 
02068             } // ...switch (pcbuf[1])
02069             printf("%" PRIu32" bps fdev:%" PRIu32 "hz ", fsk.get_bitrate(), fsk.get_tx_fdev_hz());
02070             printf("rxbw:%" PRIu32 "Hz ", fsk.get_rx_bw_hz(REG_FSK_RXBW));
02071             printf("afcbw:%" PRIu32 "Hz preambleLen:%d\r\n", fsk.get_rx_bw_hz(REG_FSK_AFCBW), radio.read_u16(REG_FSK_PREAMBLEMSB));            
02072         } else if (pcbuf[0] == 'o' && pcbuf[1] == 'c' && pcbuf[2] == 'p') {
02073             if (pcbuf[3] >= '0' && pcbuf[3] <= '9') {
02074                 sscanf(pcbuf+3, "%d", &i);
02075                 if (i < 130)
02076                     radio.RegOcp.bits.OcpTrim = (i - 45) / 5;
02077                 else
02078                     radio.RegOcp.bits.OcpTrim = (i + 30) / 10;
02079                 radio.write_reg(REG_OCP, radio.RegOcp.octet);
02080             }            
02081             radio.RegOcp.octet = radio.read_reg(REG_OCP);
02082             if (radio.RegOcp.bits.OcpTrim < 16)
02083                 i = 45 + (5 * radio.RegOcp.bits.OcpTrim);
02084             else if (radio.RegOcp.bits.OcpTrim < 28)
02085                 i = (10 * radio.RegOcp.bits.OcpTrim) - 30;
02086             else
02087                 i = 240;
02088             printf("Ocp: %dmA\r\n", i);            
02089         } else if (pcbuf[0] == 'c' && pcbuf[1] == 'r' && radio.RegOpMode.bits.LongRangeMode) {
02090             if (pcbuf[2] >= '0' && pcbuf[2] <= '9')
02091                 lora.setCodingRate(pcbuf[2] - '0');
02092              lora.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
02093              lora_printCodingRate(false);    // false: transmitted
02094              printf("\r\n");
02095         } else if (pcbuf[0] == 'h' && pcbuf[1] == 'm' && radio.RegOpMode.bits.LongRangeMode) {    // toggle implicit/explicit
02096             lora.setHeaderMode(!lora.getHeaderMode());
02097             lora.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
02098             lora_printHeaderMode();
02099             printf("\r\n");
02100         } else if (pcbuf[0] == 'a' && pcbuf[1] == 'g' && !radio.RegOpMode.bits.LongRangeMode) {
02101             fsk.RegRxConfig.bits.AgcAutoOn ^= 1;
02102             radio.write_reg(REG_FSK_RXCONFIG, fsk.RegRxConfig.octet);
02103             printf("AgcAutoOn:%d\r\n", fsk.RegRxConfig.bits.AgcAutoOn);            
02104         } else if (pcbuf[0] == 'a' && pcbuf[1] == 'l' && !radio.RegOpMode.bits.LongRangeMode) {
02105             fsk.RegAfcFei.bits.AfcAutoClearOn ^= 1;
02106             printf("AfcAutoClearOn: ");
02107             radio.write_reg(REG_FSK_AFCFEI, fsk.RegAfcFei.octet);
02108             if (fsk.RegAfcFei.bits.AfcAutoClearOn)
02109                 printf("ON\r\n");
02110             else
02111                 printf("off\r\n");
02112         } else if (pcbuf[0] == 'a' && pcbuf[1] == 'r' && !radio.RegOpMode.bits.LongRangeMode) {
02113             fsk.RegSyncConfig.bits.AutoRestartRxMode++;
02114             radio.write_reg(REG_FSK_SYNCCONFIG, fsk.RegSyncConfig.octet);
02115             fsk.RegSyncConfig.octet = radio.read_reg(REG_FSK_SYNCCONFIG);
02116             printf("AutoRestartRxMode:");
02117             switch (fsk.RegSyncConfig.bits.AutoRestartRxMode) {
02118                 case 0: printf("off "); break;
02119                 case 1: printf("no-pll-wait "); break;
02120                 case 2: printf("pll-wait "); break;
02121                 case 3: printf("3 "); break;
02122             }
02123             printf("\r\n");            
02124         } else if (pcbuf[0] == 'a' && pcbuf[1] == 'c' && !radio.RegOpMode.bits.LongRangeMode) {
02125             printf("clear afc: ");
02126             fsk.RegAfcFei.bits.AfcClear = 1;
02127             radio.write_reg(REG_FSK_AFCFEI, fsk.RegAfcFei.octet);
02128             fsk.RegAfcFei.bits.AfcClear = 0; 
02129             printf("%dHz\r\n", (int)(FREQ_STEP_HZ * radio.read_s16(REG_FSK_AFCMSB)));
02130         } else if (pcbuf[0] == 'b' && pcbuf[1] == 'g' && pcbuf[2] == 'r') {
02131             RegPdsTrim1_t pds_trim;
02132             pds_trim.octet = radio.read_reg(REG_PDSTRIM1_SX1272);
02133             if (pcbuf[3] >= '0' && pcbuf[3] <= '9') {
02134                 sscanf(&pcbuf[3], "%d", &i);
02135                 pds_trim.bits.prog_txdac = i;
02136             }
02137             radio.write_reg(REG_PDSTRIM1_SX1272, pds_trim.octet);
02138             printf("prog_txdac:%.1fuA\r\n", 2.5 + (pds_trim.bits.prog_txdac * 0.625));
02139             /* increase OCP threshold to allow more power */
02140             radio.RegOcp.octet = radio.read_reg(REG_OCP);
02141             if (radio.RegOcp.bits.OcpTrim < 16) {
02142                 radio.RegOcp.bits.OcpTrim = 16;
02143                 radio.write_reg(REG_OCP, radio.RegOcp.octet);
02144             }           
02145         } else if (pcbuf[0] == 'b' && pcbuf[1] == 'r' && !radio.RegOpMode.bits.LongRangeMode) {
02146             if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
02147                 sscanf(&pcbuf[2], "%d", &i);
02148                 fsk.set_bitrate(i);
02149             }
02150             printf("%" PRIu32 "bps\r\n", fsk.get_bitrate());             
02151         } else if (pcbuf[0] == 'b' && pcbuf[1] == 'w') {
02152             if (radio.RegOpMode.bits.LongRangeMode) {
02153                 if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
02154                     radio.set_opmode(RF_OPMODE_STANDBY);
02155                     sscanf(&pcbuf[2], "%d", &i);
02156                     lora.setBw(i);
02157                 } else
02158                     lora_printAllBw();
02159                 lora.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
02160                 printf("current ");
02161                 lora_printBw();
02162                 printf("\r\n");
02163             } else { // FSK:
02164                 if (pcbuf[2] == 'a') {
02165                     if (pcbuf[3] >= '0' && pcbuf[3] <= '9') {
02166                         radio.set_opmode(RF_OPMODE_STANDBY);
02167                         sscanf(&pcbuf[3], "%d", &i);
02168                         fsk.set_rx_dcc_bw_hz(i, 1);
02169                     }
02170                     printf("afcbw:%" PRIu32 "Hz\r\n", fsk.get_rx_bw_hz(REG_FSK_AFCBW));
02171                 } else {
02172                     if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
02173                         radio.set_opmode(RF_OPMODE_STANDBY);
02174                         sscanf(&pcbuf[2], "%d", &i);
02175                         fsk.set_rx_dcc_bw_hz(i, 0);
02176                     }
02177                     printf("rxbw:%" PRIu32 "Hz\r\n", fsk.get_rx_bw_hz(REG_FSK_RXBW));
02178                 }
02179             }
02180         } else if (pcbuf[0] == 'v' && pcbuf[1] == 'h') {
02181             lora.poll_vh ^= 1;
02182             printf("poll_vh:%d\r\n", lora.poll_vh);
02183         } else if (pcbuf[0] == 'S' && !radio.RegOpMode.bits.LongRangeMode) {
02184             if (pcbuf[1] == '0') {
02185                 sscanf(pcbuf+1, "%" SCNu32, &ui);
02186                 if (ui < 0x100) {
02187                     fsk.RegSyncConfig.bits.SyncSize = 0;
02188                     radio.write_reg(REG_FSK_SYNCVALUE1, ui);
02189                 } else if (ui < 0x10000) {
02190                     fsk.RegSyncConfig.bits.SyncSize = 1;
02191                     radio.write_reg(REG_FSK_SYNCVALUE2, ui & 0xff);
02192                     radio.write_reg(REG_FSK_SYNCVALUE1, ui >> 8);
02193                 } else if (ui < 0x1000000) {
02194                     fsk.RegSyncConfig.bits.SyncSize = 2;
02195                     radio.write_reg(REG_FSK_SYNCVALUE3, ui & 0xff);
02196                     radio.write_reg(REG_FSK_SYNCVALUE2, (ui >> 8) & 0xff);
02197                     radio.write_reg(REG_FSK_SYNCVALUE1, ui >> 16);                              
02198                 } else {
02199                     fsk.RegSyncConfig.bits.SyncSize = 3;
02200                     radio.write_reg(REG_FSK_SYNCVALUE4, ui & 0xff);
02201                     radio.write_reg(REG_FSK_SYNCVALUE3, (ui >> 8) & 0xff);
02202                     radio.write_reg(REG_FSK_SYNCVALUE2, (ui >> 16) & 0xff);
02203                     radio.write_reg(REG_FSK_SYNCVALUE1, ui >> 24);                       
02204                 }
02205                 radio.write_reg(REG_FSK_SYNCCONFIG, fsk.RegSyncConfig.octet);
02206             }
02207             fsk.RegSyncConfig.octet = radio.read_reg(REG_FSK_SYNCCONFIG);
02208             printf("%d: ", fsk.RegSyncConfig.bits.SyncSize);
02209             for (i = 0; i <= fsk.RegSyncConfig.bits.SyncSize; i++)
02210                 printf("%02x ", radio.read_reg(REG_FSK_SYNCVALUE1+i));
02211             printf("\r\n");
02212         } else if (pcbuf[0] == 's' && pcbuf[1] == 'e' && pcbuf[2] == 'r') {
02213             service_en ^= 1;
02214             printf("service_en:%d\r\n", service_en);
02215         } else if (pcbuf[0] == 's' && pcbuf[1] == 's') {
02216             if (radio.RegOpMode.bits.LongRangeMode) { // sweep test on lora sync
02217                 if (pcbuf[2] == 'h') { // sweep high nibble
02218                     lora_sync_sweep_hi = 1;
02219                 } else if (pcbuf[2] == 'l') { // sweep low nibble
02220                     lora_sync_sweep_hi = 0;
02221                 }
02222                 lora_sync_byte = radio.read_reg(REG_LR_SYNC_BYTE);
02223                 hop_timeout.attach(&lora_sync_sweep, 0.1);
02224             } else {
02225                 if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
02226                     sscanf(pcbuf+2, "%d", &i);
02227                     fsk.RegSyncConfig.bits.SyncSize = i;
02228                     radio.write_reg(REG_FSK_SYNCCONFIG, fsk.RegSyncConfig.octet);
02229                 }
02230                 fsk.RegSyncConfig.octet = radio.read_reg(REG_FSK_SYNCCONFIG);
02231                 printf("SyncSize:%d\r\n", fsk.RegSyncConfig.bits.SyncSize);
02232             }
02233         } else if (pcbuf[0] == 's' && pcbuf[1] == 'f' && radio.RegOpMode.bits.LongRangeMode) {
02234             if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
02235                 sscanf(pcbuf+2, "%d", &i);
02236                 lora.setSf(i);
02237                 if (i == 6 && !lora.getHeaderMode()) {
02238                     printf("SF6: to implicit header mode\r\n");
02239                     lora.setHeaderMode(true);
02240                 }
02241             }
02242             lora.RegModemConfig2.octet = radio.read_reg(REG_LR_MODEMCONFIG2);
02243             lora_printSf();
02244             printf("\r\n");
02245         } else if (pcbuf[0] == 'f' && pcbuf[1] == 'i' && !radio.RegOpMode.bits.LongRangeMode) {
02246             fsk.init();
02247             printf("fsk.init\r\n");
02248         } else if (pcbuf[0] == 'f' && pcbuf[1] == 'd' && pcbuf[2] == 'e' && !radio.RegOpMode.bits.LongRangeMode) {
02249             if (pcbuf[4] >= '0' && pcbuf[4] <= '9') {
02250                 sscanf(pcbuf+4, "%d", &i);
02251                 fsk.set_tx_fdev_hz(i);
02252             }
02253             printf("fdev:%" PRIu32 "Hz\r\n", fsk.get_tx_fdev_hz());
02254         } else if (pcbuf[0] == 'f' && pcbuf[1] == 'r' && pcbuf[2] == 'f') {
02255             if (pcbuf[3] >= '0' && pcbuf[3] <= '9') {
02256                 float MHz;
02257                 sscanf(pcbuf+3, "%f", &MHz);
02258                 //printf("MHz:%f\r\n", MHz);
02259                 radio.set_frf_MHz(MHz);
02260             }
02261             printf("%fMHz\r\n", radio.get_frf_MHz());
02262         } else if (pcbuf[0] == 'p' && pcbuf[1] == 'i' && pcbuf[2] == 'd') {
02263             if (pcbuf[3] >= '0' && pcbuf[3] <= '9') {
02264                 sscanf(pcbuf+3, "%d", &per_id);
02265             }
02266             printf("PER device ID:%d\r\n", per_id);
02267         } else if (pcbuf[0] == 'p' && pcbuf[1] == 'i' && pcbuf[2] == 'n') {
02268             if (pcbuf[3] >= '0' && pcbuf[3] <= '9') {
02269                 sscanf(pcbuf+3, "%f", &per_tx_delay);
02270             }
02271             printf("per_tx_delay:%f\r\n", per_tx_delay);
02272         } else if (pcbuf[0] == 'p' && pcbuf[1] == 'e' && pcbuf[2] == 'r') {
02273             per_en ^= 1;
02274             printf("per_en:%d\r\n", per_en);
02275             if (per_en && radio.RegOpMode.bits.LongRangeMode) {
02276                 if (radio.type == SX1272) {
02277                     lora.RegModemConfig.sx1272bits.LowDataRateOptimize = 1;
02278                     radio.write_reg(REG_LR_MODEMCONFIG, lora.RegModemConfig.octet);
02279                 } else if (radio.type == SX1276) {
02280                     lora.RegModemConfig3.sx1276bits.LowDataRateOptimize = 1;
02281                     radio.write_reg(REG_LR_MODEMCONFIG3, lora.RegModemConfig3.octet);
02282                 }
02283                 lora.RegPayloadLength = 9;
02284                 radio.write_reg(REG_LR_PAYLOADLENGTH, lora.RegPayloadLength);
02285                 radio.RegDioMapping1.bits.Dio3Mapping = 1;  // to ValidHeader
02286                 radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet);                                  
02287             }
02288             PacketRxSequencePrev = -1;
02289             //PacketRxSequence = 0;
02290             PacketPerKoCnt = 0;
02291             PacketPerOkCnt = 0;
02292             PacketNormalCnt = 0;
02293             if (!per_en) {
02294                 per_timeout.detach();
02295             }
02296         } else if (pcbuf[0] == 'p' && pcbuf[1] == 'r' && pcbuf[2] == 'e') {
02297             if (radio.RegOpMode.bits.LongRangeMode) {
02298                 if (pcbuf[3] >= '0' && pcbuf[3] <= '9') {
02299                     sscanf(pcbuf+3, "%d", &i);
02300                     radio.write_u16(REG_LR_PREAMBLEMSB, i);
02301                 }
02302                 lora.RegPreamble = radio.read_u16(REG_LR_PREAMBLEMSB);
02303                 printf("lora PreambleLength:%d\r\n", lora.RegPreamble);                
02304             } else {
02305                 if (pcbuf[3] >= '0' && pcbuf[3] <= '9') {
02306                     sscanf(pcbuf+3, "%d", &i);
02307                     radio.write_u16(REG_FSK_PREAMBLEMSB, i);
02308                 }
02309                 printf("FSK TX PreambleSize:%d\r\n", radio.read_u16(REG_FSK_PREAMBLEMSB));
02310             }
02311         } else if (pcbuf[0] == 'p' && pcbuf[1] == 't' && !radio.RegOpMode.bits.LongRangeMode) {
02312             if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
02313                 sscanf(pcbuf+2, "%d", &i);
02314                 fsk.RegPreambleDetect.bits.PreambleDetectorTol = i;
02315                 radio.write_reg(REG_FSK_PREAMBLEDETECT, fsk.RegPreambleDetect.octet);
02316             }
02317             fsk.RegPreambleDetect.octet = radio.read_reg(REG_FSK_PREAMBLEDETECT);
02318             printf("PreambleDetectorTol:%d\r\n", fsk.RegPreambleDetect.bits.PreambleDetectorTol);
02319         } else if (pcbuf[0] == 'p' && pcbuf[1] == 'd' && pcbuf[2] == '2') {
02320             if (pd2.read())
02321                 pd2 = 0;
02322             else 
02323                 pd2 = 1;
02324             printf("pd2:%d\r\n", pd2.read());
02325         } else if (pcbuf[0] == 'p' && pcbuf[1] == 'd' && !radio.RegOpMode.bits.LongRangeMode) {
02326             fsk.RegPreambleDetect.bits.PreambleDetectorOn ^= 1;
02327             radio.write_reg(REG_FSK_PREAMBLEDETECT, fsk.RegPreambleDetect.octet);
02328             printf("PreambleDetector:");
02329             if (fsk.RegPreambleDetect.bits.PreambleDetectorOn)
02330                 printf("On\r\n");
02331             else
02332                 printf("OFF\r\n");            
02333         } else if (pcbuf[0] == 'p' && pcbuf[1] == 'l' && radio.RegOpMode.bits.LongRangeMode) {
02334             if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
02335                 sscanf(pcbuf+2, "%d", &i);
02336                 lora.RegPayloadLength = i;
02337                 radio.write_reg(REG_LR_PAYLOADLENGTH, lora.RegPayloadLength);             
02338             }
02339             lora.RegPayloadLength = radio.read_reg(REG_LR_PAYLOADLENGTH);
02340             printf("PayloadLength:%d\r\n", lora.RegPayloadLength);
02341         } else if (pcbuf[0] == 'l' && pcbuf[1] == 'd' && radio.RegOpMode.bits.LongRangeMode) {
02342             if (radio.type == SX1272) {
02343                 lora.RegModemConfig.octet = radio.read_reg(REG_LR_MODEMCONFIG);
02344                 lora.RegModemConfig.sx1272bits.LowDataRateOptimize ^= 1;
02345                 printf("LowDataRateOptimize:%d\r\n", lora.RegModemConfig.sx1272bits.LowDataRateOptimize);
02346                 radio.write_reg(REG_LR_MODEMCONFIG, lora.RegModemConfig.octet);
02347             } else if (radio.type == SX1276) {
02348                 lora.RegModemConfig3.octet = radio.read_reg(REG_LR_MODEMCONFIG3);
02349                 lora.RegModemConfig3.sx1276bits.LowDataRateOptimize ^= 1;
02350                 printf("LowDataRateOptimize:%d\r\n", lora.RegModemConfig3.sx1276bits.LowDataRateOptimize); 
02351                 radio.write_reg(REG_LR_MODEMCONFIG3, lora.RegModemConfig3.octet);
02352             }   
02353         } else if (pcbuf[0] == 't' && pcbuf[1] == 'i' && pcbuf[2] == 'n' && radio.RegOpMode.bits.LongRangeMode) {                     
02354             lora.invert_tx(lora.RegTest33.bits.chirp_invert_tx);
02355             printf("chirp_invert_tx :%d\r\n", lora.RegTest33.bits.chirp_invert_tx);          
02356         } else if (pcbuf[0] == 'r' && pcbuf[1] == 'i' && pcbuf[2] == 'n' && radio.RegOpMode.bits.LongRangeMode) {
02357             lora.invert_rx(!lora.RegTest33.bits.invert_i_q);
02358             printf("rx invert_i_q:%d\r\n", lora.RegTest33.bits.invert_i_q);   
02359         } else if (pcbuf[0] == 'd' && pcbuf[1] == 'i' && pcbuf[2] == 'o') {
02360             if (radio.RegOpMode.bits.LongRangeMode)
02361                 lora_print_dio();
02362             else
02363                 fsk_print_dio();            
02364             printf("dio0:%d, dio1:%d\r\n", radio.dio0.read(), radio.dio0.read());
02365             lora.RegIrqFlags.octet = radio.read_reg(REG_LR_IRQFLAGS);
02366             printLoraIrqs_(false);            
02367         } else if (pcbuf[0] == 'd' && pcbuf[1] >= '0' && pcbuf[1] <= '5') {
02368             switch (pcbuf[1]) {
02369                 case '0':
02370                     radio.RegDioMapping1.bits.Dio0Mapping++;
02371                     radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet);
02372                     break;
02373                 case '1':
02374                     radio.RegDioMapping1.bits.Dio1Mapping++;
02375                     radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet);
02376                     break;    
02377                 case '2':
02378                     radio.RegDioMapping1.bits.Dio2Mapping++;
02379                     radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet);
02380                     break;
02381                 case '3':
02382                     radio.RegDioMapping1.bits.Dio3Mapping++;
02383                     radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet);
02384                     break;
02385                 case '4':
02386                     radio.RegDioMapping2.bits.Dio4Mapping++;
02387                     radio.write_reg(REG_DIOMAPPING2, radio.RegDioMapping2.octet);
02388                     break; 
02389                 case '5':
02390                     radio.RegDioMapping2.bits.Dio5Mapping++;
02391                     radio.write_reg(REG_DIOMAPPING2, radio.RegDioMapping2.octet);
02392                     break;                                                                                             
02393             } // ...switch (pcbuf[1])
02394             if (radio.RegOpMode.bits.LongRangeMode)
02395                 lora_print_dio();
02396             else
02397                 fsk_print_dio();
02398         } else if (pcbuf[0] == 'g') {   /******* GPS... **********/
02399             if (pcbuf[1] == 'e') {
02400                 //gps.enable(!gps.enabled());
02401                 if (gps.enabled()) {
02402                     gps.enable(false);
02403                     printf("gps disabled\r\n");
02404                 } else {
02405                     gps.enable(true);
02406                     printf("GPS enabled\r\n");
02407                 }
02408             } else if (pcbuf[1] == 'v') {
02409                 gps.verbose ^= 1;
02410                 printf("gps.verbose:%d\r\n", gps.verbose);
02411             }
02412         } else if (pcbuf[0] == 'G') {   // gpio registers.  G<portABCD><MO><pin0-f>[0123]
02413             GPIO_TypeDef *gpiox;
02414             char bp[2];
02415             bp[0] = pcbuf[3];
02416             bp[1] = 0;
02417             sscanf(bp, "%x", &i);
02418             switch (pcbuf[1]) {
02419                 case 'A': gpiox = GPIOA; break;
02420                 case 'B': gpiox = GPIOB; break;
02421                 case 'C': gpiox = GPIOC; break;
02422                 case 'D': gpiox = GPIOD; break;
02423                 default: gpiox = NULL; break;
02424             }
02425             if (gpiox != NULL) {
02426                 if (pcbuf[2] == 'M') {  // GPIOx->MODER
02427                     if (pcbuf[4] >= '0' && pcbuf[4] <= '3') {
02428                         a = i << 1;
02429                         ui = 3 << a;
02430                         d = pcbuf[4] - '0';
02431                         //gpiox->MODER &= ~ui;
02432                         gpiox->MODER &= ~ui;
02433                         gpiox->MODER |= d << a;;
02434                         printf("ui:%08" PRIx32 ", d<<a:%08x\r\n", ui, d<<a);
02435                     }
02436                     for (len = 0; len < 16; len++) {
02437                         i = len << 1;
02438                         ui = gpiox->MODER >> i;
02439                         printf("%02d:", len);
02440                         switch (ui & 3) {
02441                             case 0: printf("input\r\n"); break;
02442                             case 1: printf("output\r\n"); break;
02443                             case 2: printf("AF\r\n"); break;
02444                             case 3: printf("analog\r\n"); break;
02445                         }
02446                     }
02447                     printf("MODER:%08" PRIx32 "\r\n", gpiox->MODER);
02448                 } else if (pcbuf[2] == 'O') {   // GPIOx->BSRR
02449                     ui = 1 << i;
02450                     if (pcbuf[4] == '0') {
02451                         gpiox->BSRR = ui << 16;
02452                     } else if (pcbuf[4] == '1') {
02453                         gpiox->BSRR = ui;
02454                     }
02455                     printf("ODR:%08" PRIx32 "\r\n", gpiox->ODR);
02456                 }
02457             }
02458                         
02459         } else if (pcbuf[0] == 's' && pcbuf[1] == 't' && pcbuf[2] == 'b') {
02460             radio.set_opmode(RF_OPMODE_STANDBY);
02461             //green_led = LED_OFF;
02462             red_led = LED_OFF;
02463         } else if (pcbuf[0] == 's' && pcbuf[1] == 'l' && pcbuf[2] == 'e') {
02464             radio.set_opmode(RF_OPMODE_SLEEP);
02465             //green_led = LED_OFF;
02466             red_led = LED_OFF;
02467         } else if (pcbuf[0] == 'c' && pcbuf[1] == 'h' && pcbuf[2] == 'a') {
02468             app = APP_CHAT;
02469             lora.start_rx(RF_OPMODE_RECEIVER);
02470             printf("chat start\r\n");
02471         }           
02472     }
02473     printf("> ");
02474     fflush(stdout);
02475         
02476 }
02477 
02478 void get_mote_version()
02479 {
02480     char first;
02481     
02482     /*DigitalOut pc_7(PC_7);
02483       DigitalIn pc_1(PC_1);*/
02484       
02485     pc_7 = 1;
02486     first = pc_1;
02487     pc_7 = 0;
02488     if (first && !pc_1) {
02489         //printf("v2-mote\r\n");
02490         mote_version = MOTE_V2;
02491         ain_bat = new AnalogIn(PA_0);
02492     } else {
02493         //printf("v3-mote\r\n");
02494         mote_version = MOTE_V3;
02495         ain_bat = new AnalogIn(PA_1);
02496     }
02497     
02498 }
02499 
02500 int main()
02501 {  
02502     set_time(0);    // start RTC
02503     
02504     pc.baud(57600);
02505     gps.init();
02506 
02507     printf("\nreset\r\n");    
02508     //green_led = LED_OFF;
02509     red_led = LED_OFF;
02510     led2 = LED_OFF;
02511     yellow_led = LED_OFF;
02512     
02513     radio.rf_switch = rfsw_callback;
02514     
02515     if (radio.RegOpMode.bits.LongRangeMode)
02516         last_RxCurrentAddr = radio.read_reg(REG_LR_FIFORXCURRENTADDR);
02517         
02518     get_mote_version();
02519     if (mote_version == MOTE_V3)
02520         gps.en_invert = false;
02521     else
02522         gps.en_invert = true;
02523         
02524     gps.enable(false);
02525     
02526     sx9500.RegProxCtrl0.bits.sensor_en = 3; // only CS0 and CS1 connected
02527     sx9500.write(SX9500_REG_PROXCTRL0, sx9500.RegProxCtrl0.octet);
02528     
02529     // set PROXTHRESH to 80 because CS1 has 48 showing always on PROXDIFF
02530     sx9500.write(SX9500_REG_PROXCTRL6, 0x04);
02531     
02532     mma8451q.set_active(0);
02533     mma8451q.verbose = true;
02534     mpl3115a2.init();
02535     mpl3115a2.SetModeStandby();
02536     
02537     GPIOA->MODER |= 0x01415500;     // unused pins as outputs: PA4, PA5, PA6, PA7, PA8, (PA11,PA12 USB)
02538     //printf("GPIOA->MODER:%08x\r\n", GPIOA->MODER);
02539 
02540     GPIOB->MODER |= 0x00000401;     // unused pins as outputs: PB0(HDR_DIO1), PB5 (PB10 pulled hi by LED), PB3-T_SWO
02541     //printf("GPIOB->MODER:%08x\r\n", GPIOB->MODER);
02542 
02543     GPIOC->MODER |= 0x00000045;    // unused pins as outputs: PC0(hdr_fem_csd) PC1(hdr_fem_ctx) PC3(SPI3_enable)
02544     //printf("GPIOC->MODER:%08x\r\n", GPIOC->MODER);
02545 
02546     while(1) {
02547         switch (app) {
02548             case APP_NONE:
02549                 console();
02550                 break;
02551             case APP_CHAT:
02552                 console_chat();
02553                 break;
02554         } // ...switch (app)
02555     } // ...while(1)
02556 }