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:
17:f73dbeca8736
Parent:
15:cdc215392e60
--- a/main.cpp	Fri Jan 15 18:28:50 2016 +0000
+++ b/main.cpp	Tue May 29 14:03:22 2018 -0700
@@ -5,9 +5,7 @@
 #include "mpl3115a2.h"
 #include "sx9500.h"
 #include "gps.h"
-#include "rtc_alarm.h"
-
-#define LORA_WAN_ENABLE
+#include <inttypes.h>
 
 #define RADIO_RESET              PC_2 //NorAm_Mote Reset_sx
 #define RADIO_MOSI               PB_15 //NorAm_Mote SPI2 Mosi
@@ -84,11 +82,9 @@
 float hop_step_MHz = 0.2;
 #endif /* #ifdef FCC_TEST */
 
-uint32_t repeated_sleep;
-
 bool abort_key;
 bool per_en;
-int PacketRxSequencePrev;
+uint32_t PacketRxSequencePrev;
 uint32_t PacketPerKoCnt;
 uint32_t PacketPerOkCnt;
 uint32_t PacketNormalCnt;
@@ -110,21 +106,14 @@
 
 char service_en = 1;
 
-#ifdef LORA_WAN_ENABLE
-#define CFG_us915
-#include "oslmic.h"
-#include "lorabase.h"
-char mic_check;
-#endif /* LORA_WAN_ENABLE */
-
 #define FSK_LARGE_PKT_THRESHOLD  0x3f
 
 /******************************************************************************/
 
+SPI spi(RADIO_MOSI, RADIO_MISO, RADIO_SCLK);
+//             dio0, dio1, nss, spi, rst
+SX127x radio(RADIO_DIO_0, RADIO_DIO_1, RADIO_NSS, spi, RADIO_RESET);
 
-//  pin:       3     8     1      7    10    12     5   20    18
-//             mosi,      miso,      sclk,       cs,        rst,        dio0,         dio1
-SX127x radio(RADIO_MOSI, RADIO_MISO, RADIO_SCLK, RADIO_NSS, RADIO_RESET, RADIO_DIO_0, RADIO_DIO_1);
 SX127x_fsk fsk(radio);
 SX127x_lora lora(radio);
 
@@ -223,7 +212,7 @@
     
     printf("Bw:");
     if (radio.type == SX1276) {
-        switch (lora.RegModemConfig.sx1276bits.Bw) {
+        switch (bw) {
             case 0: printf("7.8KHz "); break;
             case 1: printf("10.4KHz "); break;
             case 2: printf("15.6KHz "); break;
@@ -237,7 +226,7 @@
             default: printf("%x ", lora.RegModemConfig.sx1276bits.Bw); break;
         }
     } else if (radio.type == SX1272) {
-        switch (lora.RegModemConfig.sx1272bits.Bw) {
+        switch (bw) {
             case 0: printf("125KHz "); break;
             case 1: printf("250KHz "); break;
             case 2: printf("500KHz "); break;
@@ -629,14 +618,14 @@
         printf("OOK ");
     }
 
-    printf("%dbps fdev:%dHz\r\n", fsk.get_bitrate(), fsk.get_tx_fdev_hz());    
+    printf("%" PRIu32 "bps fdev:%" PRIu32 "Hz\r\n", fsk.get_bitrate(), fsk.get_tx_fdev_hz());    
     
     fsk.RegPktConfig2.word = radio.read_u16(REG_FSK_PACKETCONFIG2);
     
     fsk_print_dio();
     
-    printf("rxbw:%dHz ", fsk.get_rx_bw_hz(REG_FSK_RXBW));
-    printf("afcbw:%dHz\r\n", fsk.get_rx_bw_hz(REG_FSK_AFCBW));
+    printf("rxbw:%" PRIu32 "Hz ", fsk.get_rx_bw_hz(REG_FSK_RXBW));
+    printf("afcbw:%" PRIu32 "Hz\r\n", fsk.get_rx_bw_hz(REG_FSK_AFCBW));
 
     fsk.RegRssiConfig.octet = radio.read_reg(REG_FSK_RSSICONFIG);
     printf("RssiOffset:%ddB smoothing:%dsamples\r\n", fsk.RegRssiConfig.bits.RssiOffset, 1 << (fsk.RegRssiConfig.bits.RssiSmoothing+1));
@@ -1123,35 +1112,6 @@
     printf("\r\n");
 }
 
-#ifdef LORA_WAN_ENABLE
-static const u1_t DEVKEY[16] = {
-        0x03, 0xfb, 0xb9, 0xb1, 0xa0, 0x62, 0xe0, 0x80, 0x8d, 0xa1, 0x9a, 0xf4, 0x05, 0xb1, 0xa1, 0x13
-//<APPKEY>03-   FB   -B9   -B1   -A0   -62   -E0   -80   -8D   -A1   -9A   -F4   -05   -B1   -A1   -13</APPKEY>
-};
-// provide device key (16 bytes)
-void os_getDevKey (u1_t* buf) {
-    memcpy(buf, DEVKEY, 16);
-}
-
-static void aes_encrypt (xref2u1_t pdu, int len) {
-    os_getDevKey(AESkey);
-    os_aes(AES_ENC, pdu, len);
-}
-
-u4_t os_rmsbf4 (xref2cu1_t buf) {
-    return (u4_t)(buf[3] | (buf[2]<<8) | ((u4_t)buf[1]<<16) | ((u4_t)buf[0]<<24));
-}
-u4_t calc_mic;
-u4_t rx_mic;
-static int aes_verifyMic0 (xref2u1_t pdu, int len) {
-    os_getDevKey(AESkey);
-    calc_mic = os_aes(AES_MIC|AES_MICNOAUX, pdu, len);
-    rx_mic = os_rmsbf4(pdu+len);
-    return calc_mic == rx_mic;
-    //return os_aes(AES_MIC|AES_MICNOAUX, pdu, len) == os_rmsbf4(pdu+len);
-}
-#endif /* LORA_WAN_ENABLE */
-
 void print_rx_verbose(uint8_t dlen)
 {
     float dbm;
@@ -1170,34 +1130,6 @@
     );
     print_rx_buf(/*lora.RegRxNbBytes*/dlen);  
     
-#ifdef LORA_WAN_ENABLE
-    if (mic_check) {    /* LoraWAN MIC check (join accept check) */
-        int a, d;
-        u1_t hdr;
-        printf("mic_check ");
-        if (dlen != LEN_JA && dlen != LEN_JAEXT) {
-            printf("dlen fail\r\n");
-            return;
-        }
-        hdr = radio.rx_buf[0];
-        if ((hdr & (HDR_FTYPE|HDR_MAJOR)) != (HDR_FTYPE_JACC|HDR_MAJOR_V1) ) {   
-            printf("hdr fail\r\n");
-            return;
-        } 
-        
-        aes_encrypt(radio.rx_buf+1, dlen-1);
-        if (!aes_verifyMic0(radio.rx_buf, dlen-4) ) {       
-            printf("%08x != %08x fail\r\n", calc_mic, rx_mic);
-        } else
-            printf("%08x == %08x\r\n", calc_mic, rx_mic);
-            
-        for (a = 0x0d; a < 0x40; a++) {
-            d = radio.read_reg(a);
-            //update_shadow_regs(selected_radio, a, d); 
-            printf("%02x: %02x\r\n", a, d);
-        }            
-    }
-#endif /* LORA_WAN_ENABLE */
 }
 
 int per_parse_rx(uint8_t len)
@@ -1227,7 +1159,7 @@
         // 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);
+        printf("%" PRIu32 ", ok=%" PRIu32 " missed=%" PRIu32 " normal=%" PRIu32 " 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 {
@@ -1287,15 +1219,17 @@
                 red_led = LED_OFF;
                 hdr_fem_csd = 0;    //debug
                 if (app == APP_CHAT) {
-                    lora.start_rx();
+                    lora.start_rx(RF_OPMODE_RECEIVER);
                 } else if (per_en)
                     per_timeout.attach(&per_cb, per_tx_delay); // start next TX
                 else if (rx_after_tx)
-                    lora.start_rx();
+                    lora.start_rx(RF_OPMODE_RECEIVER);
                 break;
             case SERVICE_ERROR:
                 printf("error\r\n");
                 break;
+            case SERVICE_NONE:
+                break;
         } // ...switch (act)
     } else {
         /* FSK: */
@@ -1310,12 +1244,13 @@
                     radio.rx_buf[n] = 0; // null terminate
                     printf((char *)radio.rx_buf);                    
                 } else {
-                    if (fsk.RegRxConfig.bits.AfcAutoOn)
+                    if (fsk.RegRxConfig.bits.AfcAutoOn) {
                         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++;
@@ -1334,6 +1269,9 @@
                     per_timeout.attach(&per_cb, per_tx_delay); // start next TX
                 }
                 break;                
+            case SERVICE_ERROR:
+            case SERVICE_NONE:
+                break;                
          } // ...switch (act)
          
          /* fsk sync address */
@@ -1429,31 +1367,10 @@
     char c;
     int i;
     static int prev_len;
-    static int sleep_start_cnt_dn = 0;
     
     for (i = 0;;) {
-        if (sleep_start_cnt_dn > 0) {
-            if (--sleep_start_cnt_dn == 0) {
-                if (repeated_sleep != 0) {
-                    all_peripherals_off();
-                    rtc_alarm_start(repeated_sleep);
-#ifdef USE_DEBUGGER
-                    HAL_EnableDBGStopMode();
-                    if (!DBGMCU->CR & DBGMCU_CR_DBG_STOP)
-                        for (;;) asm("nop");
-#endif /* USE_DEBUGGER */
-                    deepsleep();
-                    restore_from_sleep();
-                }
-            }
-        }        
         
         if (pc.readable()) {
-            if (sleep_start_cnt_dn > 0) {
-                repeated_sleep = 0;
-                printf("repeated_sleep abort\r\n");
-            }
-                        
             c = pc.getc();
             if (c == 8) {   // backspace
                 if (i > 0) {
@@ -1488,11 +1405,6 @@
             mma8451q.service();
             mpl3115a2.service();
 
-            if (sleep_start_cnt_dn == 0 && repeated_sleep != 0) {
-                printf("Alarm Start %d\r\n", repeated_sleep);
-                sleep_start_cnt_dn = 3000;
-            }
-                        
         }
     } // ...for()
 }
@@ -1580,9 +1492,9 @@
                 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));
+                    printf("%" PRIu32 "bps fdev:%" PRIu32 "hz ", fsk.get_bitrate(), fsk.get_tx_fdev_hz());
+                    printf("rxbw:%" PRIu32 "Hz ", fsk.get_rx_bw_hz(REG_FSK_RXBW));
+                    printf("afcbw:%" PRIu32 "Hz preambleLen:%d\r\n", fsk.get_rx_bw_hz(REG_FSK_AFCBW), radio.read_u16(REG_FSK_PREAMBLEMSB));
                 }
                 break;                            
             case 'C':
@@ -1848,34 +1760,6 @@
                     break;
                 }
             radio.write_reg(REG_FSK_RXCONFIG, fsk.RegRxConfig.octet);     
-        } else if (pcbuf[0] == 'C' && pcbuf[1] == 'S' && pcbuf[2] >= '0' && pcbuf[2] <= '9') {
-            all_peripherals_off();
-            sscanf(pcbuf+2, "%d", &i);
-            repeated_sleep = i;
-        } else if (pcbuf[0] == 'c' && (pcbuf[1] == 's' || pcbuf[1] == 'l') && pcbuf[2] >= '0' && pcbuf[2] <= '9') {
-             // rtc wakeup test
-            all_peripherals_off();
-            sscanf(pcbuf+2, "%d", &i);
-            printf("alarm_start %d\r\n", i);
-            wait(0.1);
-            rtc_alarm_start(i);
-            if (pcbuf[1] == 'l') {
-#ifdef USE_DEBUGGER
-                HAL_EnableDBGSleepMode();
-                if (!DBGMCU->CR & DBGMCU_CR_DBG_SLEEP)
-                    for (;;) asm("nop");
-#endif /* USE_DEBUGGER */
-                sleep();
-            } else {
-#ifdef USE_DEBUGGER
-                HAL_EnableDBGStopMode();
-                if (!DBGMCU->CR & DBGMCU_CR_DBG_STOP)
-                    for (;;) asm("nop");
-#endif /* USE_DEBUGGER */
-                deepsleep();
-
-            }
-            restore_from_sleep();                   
         } else if (pcbuf[0] == 'r' && pcbuf[1] == 'x') { // RX
             if (per_en) {
                 red_led = LED_OFF;
@@ -1888,7 +1772,7 @@
             }
             if (radio.RegOpMode.bits.LongRangeMode) {
                 last_RxCurrentAddr = radio.read_reg(REG_LR_FIFORXCURRENTADDR);
-                lora.start_rx();
+                lora.start_rx(RF_OPMODE_RECEIVER);
             } else {
                 fsk.start_rx();
                 radio.RegDioMapping1.bits.Dio2Mapping = 3;  // dio2 to syncadrs
@@ -2090,12 +1974,6 @@
             }
         } 
 #endif /* !I2C_PIN_TEST */
-#ifdef LORA_WAN_ENABLE
-        else if (pcbuf[0] == 'm' && pcbuf[1] == 'i') {
-            mic_check ^= 1;
-            printf("mic_check:%d\r\n", mic_check);
-        }
-#endif /* LORA_WAN_ENABLE */        
         else if (pcbuf[0] == 'm' && pcbuf[1] == 'p' && !radio.RegOpMode.bits.LongRangeMode) {
             radio.RegDioMapping2.bits.MapPreambleDetect ^= 1;
             radio.write_reg(REG_DIOMAPPING2, radio.RegDioMapping2.octet);
@@ -2188,9 +2066,9 @@
                     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));            
+            printf("%" PRIu32" bps fdev:%" PRIu32 "hz ", fsk.get_bitrate(), fsk.get_tx_fdev_hz());
+            printf("rxbw:%" PRIu32 "Hz ", fsk.get_rx_bw_hz(REG_FSK_RXBW));
+            printf("afcbw:%" PRIu32 "Hz 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);
@@ -2269,7 +2147,7 @@
                 sscanf(&pcbuf[2], "%d", &i);
                 fsk.set_bitrate(i);
             }
-            printf("%dbps\r\n", fsk.get_bitrate());             
+            printf("%" PRIu32 "bps\r\n", fsk.get_bitrate());             
         } else if (pcbuf[0] == 'b' && pcbuf[1] == 'w') {
             if (radio.RegOpMode.bits.LongRangeMode) {
                 if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
@@ -2289,14 +2167,14 @@
                         sscanf(&pcbuf[3], "%d", &i);
                         fsk.set_rx_dcc_bw_hz(i, 1);
                     }
-                    printf("afcbw:%dHz\r\n", fsk.get_rx_bw_hz(REG_FSK_AFCBW));
+                    printf("afcbw:%" PRIu32 "Hz\r\n", fsk.get_rx_bw_hz(REG_FSK_AFCBW));
                 } else {
                     if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
                         radio.set_opmode(RF_OPMODE_STANDBY);
                         sscanf(&pcbuf[2], "%d", &i);
                         fsk.set_rx_dcc_bw_hz(i, 0);
                     }
-                    printf("rxbw:%dHz\r\n", fsk.get_rx_bw_hz(REG_FSK_RXBW));
+                    printf("rxbw:%" PRIu32 "Hz\r\n", fsk.get_rx_bw_hz(REG_FSK_RXBW));
                 }
             }
         } else if (pcbuf[0] == 'v' && pcbuf[1] == 'h') {
@@ -2304,7 +2182,7 @@
             printf("poll_vh:%d\r\n", lora.poll_vh);
         } else if (pcbuf[0] == 'S' && !radio.RegOpMode.bits.LongRangeMode) {
             if (pcbuf[1] == '0') {
-                sscanf(pcbuf+1, "%x", &ui);
+                sscanf(pcbuf+1, "%" SCNu32, &ui);
                 if (ui < 0x100) {
                     fsk.RegSyncConfig.bits.SyncSize = 0;
                     radio.write_reg(REG_FSK_SYNCVALUE1, ui);
@@ -2372,7 +2250,7 @@
                 sscanf(pcbuf+4, "%d", &i);
                 fsk.set_tx_fdev_hz(i);
             }
-            printf("fdev:%dHz\r\n", fsk.get_tx_fdev_hz());
+            printf("fdev:%" PRIu32 "Hz\r\n", fsk.get_tx_fdev_hz());
         } else if (pcbuf[0] == 'f' && pcbuf[1] == 'r' && pcbuf[2] == 'f') {
             if (pcbuf[3] >= '0' && pcbuf[3] <= '9') {
                 float MHz;
@@ -2553,7 +2431,7 @@
                         //gpiox->MODER &= ~ui;
                         gpiox->MODER &= ~ui;
                         gpiox->MODER |= d << a;;
-                        printf("ui:%08x, d<<a:%08x\r\n", ui, d<<a);
+                        printf("ui:%08" PRIx32 ", d<<a:%08x\r\n", ui, d<<a);
                     }
                     for (len = 0; len < 16; len++) {
                         i = len << 1;
@@ -2566,7 +2444,7 @@
                             case 3: printf("analog\r\n"); break;
                         }
                     }
-                    printf("MODER:%08x\r\n", gpiox->MODER);
+                    printf("MODER:%08" PRIx32 "\r\n", gpiox->MODER);
                 } else if (pcbuf[2] == 'O') {   // GPIOx->BSRR
                     ui = 1 << i;
                     if (pcbuf[4] == '0') {
@@ -2574,7 +2452,7 @@
                     } else if (pcbuf[4] == '1') {
                         gpiox->BSRR = ui;
                     }
-                    printf("ODR:%08x\r\n", gpiox->ODR);
+                    printf("ODR:%08" PRIx32 "\r\n", gpiox->ODR);
                 }
             }
                         
@@ -2588,7 +2466,7 @@
             red_led = LED_OFF;
         } else if (pcbuf[0] == 'c' && pcbuf[1] == 'h' && pcbuf[2] == 'a') {
             app = APP_CHAT;
-            lora.start_rx();
+            lora.start_rx(RF_OPMODE_RECEIVER);
             printf("chat start\r\n");
         }           
     }
@@ -2622,7 +2500,6 @@
 int main()
 {  
     set_time(0);    // start RTC
-    rtc_alarm_init();
     
     pc.baud(57600);
     gps.init();
@@ -2633,7 +2510,7 @@
     led2 = LED_OFF;
     yellow_led = LED_OFF;
     
-    radio.rf_switch.attach(rfsw_callback);
+    radio.rf_switch = rfsw_callback;
     
     if (radio.RegOpMode.bits.LongRangeMode)
         last_RxCurrentAddr = radio.read_reg(REG_LR_FIFORXCURRENTADDR);
@@ -2666,11 +2543,6 @@
     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);
 
-    /*wait(0.1);
-    all_peripherals_off();
-    //repeated_sleep = 2;
-    deepsleep();*/
-            
     while(1) {
         switch (app) {
             case APP_NONE: