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
See wiki Page for a detailed
This is a link to the wiki page
Diff: main.cpp
- 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: