NAMote72 Utility Application – Serial Terminal Monitor control for NAMote72 (note: this application replaces the previous na_mote1 test code application)

Dependencies:   SX127x lib_gps lib_mma8451q lib_mpl3115a2 lib_sx9500 mbed

Fork of na_mote1 by wayne roberts

See wiki Page for a detailed

This is a link to the wiki page

Revision:
15:cdc215392e60
Parent:
14:35e7156e73ff
Child:
17:f73dbeca8736
diff -r 35e7156e73ff -r cdc215392e60 main.cpp
--- a/main.cpp	Tue Sep 01 00:29:36 2015 +0000
+++ b/main.cpp	Fri Oct 30 00:17:45 2015 +0000
@@ -25,6 +25,8 @@
 #define RFSW1                    PC_4 //NorAm_Mote RFSwitch_CNTR_1
 #define RFSW2                    PC_13 //NorAm_Mote RFSwitch_CNTR_2
 
+#define FSK_RSSI_OFFSET         5
+#define FSK_RSSI_SMOOTHING      2
 /*
  *
  */
@@ -128,8 +130,7 @@
 
 DigitalOut rfsw1(RFSW1);
 DigitalOut rfsw2(RFSW2);
-
-
+DigitalIn dio2(RADIO_DIO_2);
 
 void rfsw_callback()
 {
@@ -961,7 +962,7 @@
 {
     RegPdsTrim1_t pds_trim;
     
-    pds_trim.octet = radio.read_reg(REG_PDSTRIM1);
+    pds_trim.octet = radio.read_reg(REG_PDSTRIM1_SX1272);
     printf(" txdac=%.1fuA", 2.5 + (pds_trim.bits.prog_txdac * 0.625));
     radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG);
     if (radio.RegPaConfig.bits.PaSelect) {
@@ -1027,7 +1028,12 @@
     for (i = 0; i < 8; i++)
         radio.tx_buf[8] += radio.tx_buf[i];
     red_led = LED_ON;
-    lora.start_tx(lora.RegPayloadLength);
+    
+    if (radio.RegOpMode.bits.LongRangeMode) {
+        lora.start_tx(lora.RegPayloadLength);
+    } else {
+        fsk.start_tx(9);
+    }        
 }
 
 
@@ -1193,11 +1199,53 @@
     }
 #endif /* LORA_WAN_ENABLE */
 }
+
+int per_parse_rx(uint8_t len)
+{
+    if (len > 8 && radio.rx_buf[5] == 'P' && radio.rx_buf[6] == 'E' && radio.rx_buf[7] == 'R') {
+        int i;
+        float per;
+
+        /* this is PER packet */
+        uint32_t PacketRxSequence = (radio.rx_buf[1] << 24) | (radio.rx_buf[2] << 16) | (radio.rx_buf[3] << 8) | radio.rx_buf[4];
+        PacketPerOkCnt++;
+        
+        if( PacketRxSequence <= PacketRxSequencePrev )
+        { // Sequence went back => resynchronization
+            // dont count missed packets this time
+            i = 0;
+        }
+        else
+        {
+            // determine number of missed packets
+            i = PacketRxSequence - PacketRxSequencePrev - 1;
+        }
+        
+        red_led = !red_led.read();
+        // be ready for the next
+        PacketRxSequencePrev = PacketRxSequence;
+        // increment 'missed' counter for the RX session
+        PacketPerKoCnt += i;
+        per = ( 1.0 - ( float )PacketPerOkCnt / ( float )( PacketPerOkCnt + PacketPerKoCnt ) ) * 100.0;
+        printf("%d, ok=%d missed=%d normal=%d per:%.3f ", PacketRxSequence, PacketPerOkCnt, PacketPerKoCnt, PacketNormalCnt, per);
+        if (radio.RegOpMode.bits.LongRangeMode)
+            printf("pkt:%ddBm, snr:%.1fdB, %ddBm\r\n", lora.get_pkt_rssi(), lora.RegPktSnrValue / 4.0, lora.get_current_rssi());
+        else {
+            wait_us(10000);
+            printf(" -%.1fdBm\r\n", radio.read_reg(REG_FSK_RSSIVALUE) / 2.0); 
+        }
+
+        return 1;
+    } else {
+        return 0;
+    }    
+}
     
 void
 service_radio()
 {
     service_action_e act;
+    static uint8_t rssi = 0;
     
     if (radio.RegOpMode.bits.LongRangeMode) {
 
@@ -1209,40 +1257,13 @@
                                    
                 if (app == APP_NONE) {   
                     if (per_en) {
-                        if (lora.RegRxNbBytes > 8 && radio.rx_buf[5] == 'P' && radio.rx_buf[6] == 'E' && radio.rx_buf[7] == 'R') {
-                            int i;
-                            float per;
-                            red_led = LED_OFF;
-                            /* this is PER packet */
-                            uint32_t PacketRxSequence = (radio.rx_buf[1] << 24) | (radio.rx_buf[2] << 16) | (radio.rx_buf[3] << 8) | radio.rx_buf[4];
-                            PacketPerOkCnt++;
-                            //IntervalPerOkCnt++;
-                            
-                            if( PacketRxSequence <= PacketRxSequencePrev )
-                            { // Sequence went back => resynchronization
-                                // dont count missed packets this time
-                                i = 0;
-                            }
-                            else
-                            {
-                                // determine number of missed packets
-                                i = PacketRxSequence - PacketRxSequencePrev - 1;
-                            }
-                            
-                            // be ready for the next
-                            PacketRxSequencePrev = PacketRxSequence;
-                            // increment 'missed' counter for the RX session
-                            PacketPerKoCnt += i;
-                            //IntervalPerKoCnt += i;
-                            printf("%d, ok=%d missed=%d normal=%d ", PacketRxSequence, PacketPerOkCnt, PacketPerKoCnt, PacketNormalCnt);
-                            per = ( 1.0 - ( float )PacketPerOkCnt / ( float )( PacketPerOkCnt + PacketPerKoCnt ) ) * 100.0;
-                            printf("per:%f\r\n", per);
-                        } else {
+                        if (!per_parse_rx(lora.RegRxNbBytes)) {
                             PacketNormalCnt++;
-                            print_rx_verbose(lora.RegRxNbBytes);
+                            print_rx_verbose(lora.RegRxNbBytes);                            
                         }
-                    } else
+                    } else                     
                         print_rx_verbose(lora.RegRxNbBytes);
+                    fflush(stdout);
                 } else if (app == APP_CHAT) {
                     if (lora.RegHopChannel.bits.RxPayloadCrcOn) {
                         if (lora.RegIrqFlags.bits.PayloadCrcError)
@@ -1289,21 +1310,40 @@
                     radio.rx_buf[n] = 0; // null terminate
                     printf((char *)radio.rx_buf);                    
                 } else {
-                    int i;
                     if (fsk.RegRxConfig.bits.AfcAutoOn)
-                        printf("%dHz ", (int)(FREQ_STEP_HZ * fsk.RegAfcValue));
-                    printf("%d: ", fsk.rx_buf_length);
-                    for (i = 0; i < fsk.rx_buf_length; i++)
-                        printf("%02x ", radio.rx_buf[i]);
-                    printf("\r\n");
+                        printf("%dHz ", (int)(FREQ_STEP_HZ * fsk.RegAfcValue));   
+                        if (rssi != 0) {
+                            printf("pkt:-%.1fdBm ", rssi / 2.0);
+                            rssi = 0;
+                        }    
+                    if (per_en) { 
+                        if (!per_parse_rx(fsk.rx_buf_length)) {
+                            PacketNormalCnt++;
+                            print_rx_buf(fsk.rx_buf_length);                                                 
+                        }                                       
+                    } else {
+                        print_rx_buf(fsk.rx_buf_length);                            
+                    }
+                    fflush(stdout);
                 }
                 break;
             case SERVICE_TX_DONE:
                 if (app == APP_CHAT) {
                     fsk.start_rx();
+                } else if (per_en) {
+                    per_timeout.attach(&per_cb, per_tx_delay); // start next TX
                 }
                 break;                
          } // ...switch (act)
+         
+         /* fsk sync address */
+         if (dio2 && radio.RegDioMapping1.bits.Dio2Mapping == 3) {
+             // syncAdrs when in RX mode
+             if (rssi == 0) {
+                 rssi = radio.read_reg(REG_FSK_RSSIVALUE);
+             }
+         }
+                  
     }
     
     if (clear_valid_header) {
@@ -1538,6 +1578,13 @@
                 } else
                     printf("(fsk)\r\n");
                 break;
+            case 'c':
+                if (!radio.RegOpMode.bits.LongRangeMode) {
+                    printf("%dbps fdev:%dhz ", fsk.get_bitrate(), fsk.get_tx_fdev_hz());
+                    printf("rxbw:%dHz ", fsk.get_rx_bw_hz(REG_FSK_RXBW));
+                    printf("afcbw:%dHz preambleLen:%d\r\n", fsk.get_rx_bw_hz(REG_FSK_AFCBW), radio.read_u16(REG_FSK_PREAMBLEMSB));
+                }
+                break;                            
             case 'C':
                 if (radio.RegOpMode.bits.LongRangeMode) {
                     lora.setRxPayloadCrcOn(!lora.getRxPayloadCrcOn());
@@ -1666,6 +1713,7 @@
                 } else {
                     printf("bw[a][%%d] FSK get-set rxbw (bwa=afcbw)\r\n");
                     printf("br[%%d]    FSK get-set bitrate\r\n");
+                    printf("c[%%d]       FSK set test case\r\n");
                     printf("fdev[%%d]    FSK get-set TX frequency deviation (hz)\r\n");
                     printf("rt          FSK change RxTrigger\r\n");
                     printf("pd          FSK enable/disable preamble detector\r\n");
@@ -1697,12 +1745,12 @@
         } // ...switch (pcbuf[0])
     } else {
         if (pcbuf[0] == 't' && pcbuf[1] == 'x') { // TX
-            if (radio.RegOpMode.bits.LongRangeMode) {
-                if (per_en) {
-                    printf("timeout attach %f\r\n", per_tx_delay);
-                    PacketTxCnt = 0;
-                    per_timeout.attach(&per_cb, per_tx_delay);
-                } else {
+            if (per_en) {
+                printf("timeout attach %f\r\n", per_tx_delay);
+                PacketTxCnt = 0;
+                per_timeout.attach(&per_cb, per_tx_delay);
+            } else {
+                if (radio.RegOpMode.bits.LongRangeMode) {
                     if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
                         sscanf(pcbuf+2, "%d", &i);
                         lora.RegPayloadLength = i;
@@ -1717,20 +1765,20 @@
                         rx_after_tx = true;
                     else
                         rx_after_tx = false;
-                }
-            } else {    // FSK:
-                if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
-                    sscanf(pcbuf+2, "%d", &i);
-                    fsk_tx_length = i;
-                }
-                if (radio.RegOpMode.bits.Mode != RF_OPMODE_TRANSMITTER) { // if not already busy transmitting
-                    tx_cnt++;
-                    for (i = 0; i < fsk_tx_length; i++) {
-                        radio.tx_buf[i] = tx_cnt;
+                } else {    // FSK:
+                    if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
+                        sscanf(pcbuf+2, "%d", &i);
+                        fsk_tx_length = i;
                     }
-                    fsk.start_tx(fsk_tx_length);
-                }
-            }
+                    if (radio.RegOpMode.bits.Mode != RF_OPMODE_TRANSMITTER) { // if not already busy transmitting
+                        tx_cnt++;
+                        for (i = 0; i < fsk_tx_length; i++) {
+                            radio.tx_buf[i] = tx_cnt;
+                        }
+                        fsk.start_tx(fsk_tx_length);
+                    }
+                } // ...fsk
+            } // ..!per_en
 #ifdef FCC_TEST            
             if (hop_type != HOP_TYPE_NONE)
                 hop_timeout.attach(&hop_cb, 0.4);
@@ -1841,8 +1889,16 @@
             if (radio.RegOpMode.bits.LongRangeMode) {
                 last_RxCurrentAddr = radio.read_reg(REG_LR_FIFORXCURRENTADDR);
                 lora.start_rx();
-            } else
+            } else {
                 fsk.start_rx();
+                radio.RegDioMapping1.bits.Dio2Mapping = 3;  // dio2 to syncadrs
+                radio.write_reg(REG_DIOMAPPING1, radio.RegDioMapping1.octet); 
+                
+                fsk.RegRssiConfig.octet = radio.read_reg(REG_FSK_RSSICONFIG);
+                fsk.RegRssiConfig.bits.RssiOffset = FSK_RSSI_OFFSET;
+                fsk.RegRssiConfig.bits.RssiSmoothing = FSK_RSSI_SMOOTHING;
+                radio.write_reg(REG_FSK_RSSICONFIG, fsk.RegRssiConfig.octet);              
+            }
         } else if (pcbuf[0] == 'r' && pcbuf[1] == ' ') { // read single register
             sscanf(pcbuf+2, "%x", &i);
             printf("%02x: %02x\r\n", i, radio.read_reg(i));
@@ -2056,6 +2112,85 @@
             }
             radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG);
             printf("OutputPower:%d\r\n", radio.RegPaConfig.bits.OutputPower);
+        } else if (pcbuf[0] == 'c' && (pcbuf[1] >= '0' && pcbuf[1] <= '9') && !radio.RegOpMode.bits.LongRangeMode) {
+            radio.set_opmode(RF_OPMODE_STANDBY);
+            per_tx_delay = 0.3;
+            
+            fsk.RegFifoThreshold.octet = radio.read_reg(REG_FSK_FIFOTHRESH);
+            fsk.RegFifoThreshold.bits.TxStartCondition = 1; // to nFifoEmpty
+            radio.write_reg(REG_FSK_FIFOTHRESH, fsk.RegFifoThreshold.octet);
+            
+            if (radio.read_reg(REG_FSK_SYNCVALUE1) == 0x55 && radio.read_reg(REG_FSK_SYNCVALUE2)) {
+                fsk.RegSyncConfig.octet = radio.read_reg(REG_FSK_SYNCCONFIG);    
+                fsk.RegSyncConfig.bits.SyncSize = 2;
+                radio.write_reg(REG_FSK_SYNCCONFIG, fsk.RegSyncConfig.octet);
+                radio.write_reg(REG_FSK_SYNCVALUE3, 0x90);
+                radio.write_reg(REG_FSK_SYNCVALUE2, 0x4e);
+                radio.write_reg(REG_FSK_SYNCVALUE1, 0x63);              
+            }
+            
+            fsk.RegPreambleDetect.octet = radio.read_reg(REG_FSK_PREAMBLEDETECT);
+            fsk.RegPreambleDetect.bits.PreambleDetectorOn = 1;
+            radio.write_reg(REG_FSK_PREAMBLEDETECT, fsk.RegPreambleDetect.octet);                 
+            
+            fsk.RegRxConfig.octet = radio.read_reg(REG_FSK_RXCONFIG);
+            fsk.RegRxConfig.bits.AfcAutoOn = 1;
+            fsk.RegRxConfig.bits.AgcAutoOn = 1;
+            fsk.RegRxConfig.bits.RxTrigger = 7;
+            radio.write_reg(REG_FSK_RXCONFIG, fsk.RegRxConfig.octet);    
+            
+            fsk.RegPreambleDetect.bits.PreambleDetectorOn = 1;
+            fsk.RegPreambleDetect.bits.PreambleDetectorSize = 1;
+            fsk.RegPreambleDetect.bits.PreambleDetectorTol = 10;
+            radio.write_reg(REG_FSK_PREAMBLEDETECT, fsk.RegPreambleDetect.octet);            
+            
+            switch (pcbuf[1]) {
+                case '0':
+                    fsk.set_bitrate(4800);
+                    fsk.set_tx_fdev_hz(5005);
+                    fsk.set_rx_dcc_bw_hz(10417, 0);  // rxbw
+                    fsk.set_rx_dcc_bw_hz(50000, 1);  // afcbw
+                    radio.write_u16(REG_FSK_PREAMBLEMSB, 8);                    
+                    break;
+                case '1':
+                    fsk.set_bitrate(50000);
+                    fsk.set_tx_fdev_hz(25000);
+                    fsk.set_rx_dcc_bw_hz(62500, 0);  // rxbw
+                    fsk.set_rx_dcc_bw_hz(100000, 1);  // afcbw
+                    radio.write_u16(REG_FSK_PREAMBLEMSB, 9);                    
+                    break;           
+                case '2':
+                    fsk.set_bitrate(38400);
+                    fsk.set_tx_fdev_hz(20020);
+                    fsk.set_rx_dcc_bw_hz(50000, 0);  // rxbw
+                    fsk.set_rx_dcc_bw_hz(100000, 1);  // afcbw
+                    radio.write_u16(REG_FSK_PREAMBLEMSB, 8);                        
+                    break;
+                case '3':
+                    fsk.set_bitrate(1201);
+                    fsk.set_tx_fdev_hz(20020);
+                    fsk.set_rx_dcc_bw_hz(25000, 0);  // rxbw
+                    fsk.set_rx_dcc_bw_hz(50000, 1);  // afcbw
+                    radio.write_u16(REG_FSK_PREAMBLEMSB, 8);                 
+                    break;    
+                case '4':
+                    fsk.set_bitrate(1201);
+                    fsk.set_tx_fdev_hz(4028);
+                    fsk.set_rx_dcc_bw_hz(7813, 0);  // rxbw
+                    fsk.set_rx_dcc_bw_hz(25000, 1);  // afcbw
+                    radio.write_u16(REG_FSK_PREAMBLEMSB, 8);
+                    break;
+                case '5':
+                    fsk.set_bitrate(1201);
+                    fsk.set_tx_fdev_hz(4028);
+                    fsk.set_rx_dcc_bw_hz(5208, 0);  // rxbw
+                    fsk.set_rx_dcc_bw_hz(10417, 1);  // afcbw
+                    radio.write_u16(REG_FSK_PREAMBLEMSB, 8);                    
+                    break;                                                                 
+            } // ...switch (pcbuf[1])
+            printf("%dbps fdev:%dhz ", fsk.get_bitrate(), fsk.get_tx_fdev_hz());
+            printf("rxbw:%dHz ", fsk.get_rx_bw_hz(REG_FSK_RXBW));
+            printf("afcbw:%dHz preambleLen:%d\r\n", fsk.get_rx_bw_hz(REG_FSK_AFCBW), radio.read_u16(REG_FSK_PREAMBLEMSB));            
         } else if (pcbuf[0] == 'o' && pcbuf[1] == 'c' && pcbuf[2] == 'p') {
             if (pcbuf[3] >= '0' && pcbuf[3] <= '9') {
                 sscanf(pcbuf+3, "%d", &i);
@@ -2116,12 +2251,12 @@
             printf("%dHz\r\n", (int)(FREQ_STEP_HZ * radio.read_s16(REG_FSK_AFCMSB)));
         } else if (pcbuf[0] == 'b' && pcbuf[1] == 'g' && pcbuf[2] == 'r') {
             RegPdsTrim1_t pds_trim;
-            pds_trim.octet = radio.read_reg(REG_PDSTRIM1);
+            pds_trim.octet = radio.read_reg(REG_PDSTRIM1_SX1272);
             if (pcbuf[3] >= '0' && pcbuf[3] <= '9') {
                 sscanf(&pcbuf[3], "%d", &i);
                 pds_trim.bits.prog_txdac = i;
             }
-            radio.write_reg(REG_PDSTRIM1, pds_trim.octet);
+            radio.write_reg(REG_PDSTRIM1_SX1272, pds_trim.octet);
             printf("prog_txdac:%.1fuA\r\n", 2.5 + (pds_trim.bits.prog_txdac * 0.625));
             /* increase OCP threshold to allow more power */
             radio.RegOcp.octet = radio.read_reg(REG_OCP);
@@ -2523,13 +2658,13 @@
     mpl3115a2.SetModeStandby();
     
     GPIOA->MODER |= 0x01415500;     // unused pins as outputs: PA4, PA5, PA6, PA7, PA8, (PA11,PA12 USB)
-    printf("GPIOA->MODER:%08x\r\n", GPIOA->MODER);
+    //printf("GPIOA->MODER:%08x\r\n", GPIOA->MODER);
 
     GPIOB->MODER |= 0x00000401;     // unused pins as outputs: PB0(HDR_DIO1), PB5 (PB10 pulled hi by LED), PB3-T_SWO
-    printf("GPIOB->MODER:%08x\r\n", GPIOB->MODER);
+    //printf("GPIOB->MODER:%08x\r\n", GPIOB->MODER);
 
     GPIOC->MODER |= 0x00000045;    // unused pins as outputs: PC0(hdr_fem_csd) PC1(hdr_fem_ctx) PC3(SPI3_enable)
-    printf("GPIOC->MODER:%08x\r\n", GPIOC->MODER);
+    //printf("GPIOC->MODER:%08x\r\n", GPIOC->MODER);
 
     /*wait(0.1);
     all_peripherals_off();