Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: libmDot-mbed5 DOGS102 ISL29011 MMA845x MPL3115A2 NCP5623B X_NUCLEO_IKS01A1 Senet_Packet
Fork of MTDOT-UDKDemo_Senet by
Diff: main.cpp
- Revision:
- 12:ad92bbb6312f
- Parent:
- 10:658720d51610
- Child:
- 14:07ff01da6bbf
diff -r 3be85ca325d1 -r ad92bbb6312f main.cpp
--- a/main.cpp Tue Aug 23 22:10:35 2016 +0000
+++ b/main.cpp Tue Aug 23 23:35:00 2016 -0400
@@ -30,15 +30,12 @@
*
*/
-// #define MTDOT_EVB
-
-//#define MTDOT_UDK
-
#include "mbed.h"
#include "senet_packet.h"
// EVB Sensors
#ifdef MTDOT_EVB
+
#include "MMA845x.h"
#include "MPL3115A2.h"
#include "ISL29011.h"
@@ -46,8 +43,11 @@
#include "DOGS102.h"
#include "font_6x8.h"
#include "MultiTech_Logo.h"
+
#elif defined(MTDOT_UDK)
+
#include "x_nucleo_iks01a1.h"
+
#endif
#include "mDot.h"
@@ -55,29 +55,9 @@
#include <string>
#include <vector>
-enum LED1_COLOR {
- RED = 0,
- GREEN = 1
-};
-
-/*
- * union for converting from 32-bit to 4 8-bit values
+/*
+ * Board sensor data
*/
-union convert32 {
- int32_t f_s; // convert from signed 32 bit int
- uint32_t f_u; // convert from unsigned 32 bit int
- uint8_t t_u[4]; // convert to 8 bit unsigned array
-};
-
-/*
- * union for converting from 16- bit to 2 8-bit values
- */
-union convert16 {
- int16_t f_s; // convert from signed 16 bit int
- uint16_t f_u; // convert from unsigned 16 bit int
- uint8_t t_u[2]; // convert to 8 bit unsigned array
-};
-
struct BoardSensorData
{
float temperature;
@@ -98,92 +78,75 @@
BoardSensorData() { init(); }
};
-//DigitalIn mDot02(PA_2); // GPIO/UART_TX
-//DigitalOut mDot03(PA_3); // GPIO/UART_RX
-//DigitalIn mDot04(PA_6); // GPIO/SPI_MISO
-//DigitalIn mDot06(PA_8); // GPIO/I2C_SCL
-//DigitalIn mDot07(PC_9); // GPIO/I2C_SDA
+#ifdef MDOT_EVB
-#ifdef MDOT_EVB
-InterruptIn mDot08(PA_12); // GPIO/USB PB S1 on EVB
-InterruptIn mDot09(PA_11); // GPIO/USB PB S2 on EVB
+//DigitalIn mDot02(PA_2); // GPIO/UART_TX
+//DigitalOut mDot03(PA_3); // GPIO/UART_RX
+//DigitalIn mDot04(PA_6); // GPIO/SPI_MISO
+//DigitalIn mDot06(PA_8); // GPIO/I2C_SCL
+//DigitalIn mDot07(PC_9); // GPIO/I2C_SDA
-//DigitalIn mDot11(PA_7); // GPIO/SPI_MOSI
+InterruptIn mDot08(PA_12); // GPIO/USB PB S1 on EVB
+InterruptIn mDot09(PA_11); // GPIO/USB PB S2 on EVB
+
+//DigitalIn mDot11(PA_7); // GPIO/SPI_MOSI
-InterruptIn mDot12(PA_0); // GPIO/UART_CTS PRESSURE_INT2 on EVB
-DigitalOut mDot13(PC_13,1); // GPIO LCD_C/D
-InterruptIn mDot15(PC_1); // GPIO LIGHT_PROX_INT on EVB
-InterruptIn mDot16(PA_1); // GPIO/UART_RTS ACCEL_INT2 on EVB
-DigitalOut mDot17(PA_4,1); // GPIO/SPI_NCS LCD_CS on EVB
+InterruptIn mDot12(PA_0); // GPIO/UART_CTS PRESSURE_INT2 on EVB
+DigitalOut mDot13(PC_13,1); // GPIO LCD_C/D
+InterruptIn mDot15(PC_1); // GPIO LIGHT_PROX_INT on EVB
+InterruptIn mDot16(PA_1); // GPIO/UART_RTS ACCEL_INT2 on EVB
+DigitalOut mDot17(PA_4,1); // GPIO/SPI_NCS LCD_CS on EVB
-//DigitalIn mDot18(PA_5); // GPIO/SPI_SCK
+//DigitalIn mDot18(PA_5); // GPIO/SPI_SCK
//DigitalInOut mDot19(PB_0,PIN_INPUT,PullNone,0); // GPIO PushPull LED Low=Red High=Green set MODE=INPUT to turn off
-AnalogIn mDot20(PB_1); // GPIO Current Sense Analog in on EVB
-
-Serial debugUART(PA_9, PA_10); // mDot debug UART
+AnalogIn mDot20(PB_1); // GPIO Current Sense Analog in on EVB
+Serial debugUART(PA_9, PA_10); // mDot debug UART
+//Serial mDotUART(PA_2, PA_3); // mDot external UART mDot02 and mDot03
+I2C mDoti2c(PC_9,PA_8); // mDot External I2C mDot6 and mDot7
-//Serial mDotUART(PA_2, PA_3); // mDot external UART mDot02 and mDot03
-
-I2C mDoti2c(PC_9,PA_8); // mDot External I2C mDot6 and mDot7
-
-SPI mDotspi(PA_7,PA_6,PA_5); // mDot external SPI mDot11, mDot4, and mDot18
+SPI mDotspi(PA_7,PA_6,PA_5); // mDot external SPI mDot11, mDot4, and mDot18
#elif defined(MTDOT_UDK)
-Serial debugUART(USBTX, USBRX); // mDot debug UART
+Serial debugUART(USBTX, USBRX); // mDot debug UART
#endif
-/* **** replace these values with the proper public or private network settings ****
- * config_network_nameand config_network_pass are for private networks.
+/*
+ * LoRaWAN Configuration
*/
-static std::string config_network_name = "TAB-CubeNet";
-static std::string config_network_pass = "1nt3gral";
-static uint8_t config_frequency_sub_band = 0;
-static bool config_adr_on = true;
+static uint8_t app_id[8] = {0x00,0x25,0x0C,0x00,0x00,0x01,0x00,0x01};
+static uint8_t app_key[16] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
-/* config_app_id and config_app_key are for public networks. */
-static uint8_t app_id[8] = {0x00,0x25,0x0C,0x00,0x00,0x01,0x00,0x01};
-std::vector<uint8_t> config_app_id(app_id,app_id+sizeof(app_id)/sizeof(uint8_t));
-static uint8_t app_key[16] = {0xB4,0xAD,0x1A,0x25,0x69,0x7F,0xF6,0x8E,0xD3,0x4B,0x83,0xC4,0xB6,0xC0,0xF2,0x3C}; // 9C49
- //{0xA0,0xC8,0x3D,0xD1,0x7B,0x32,0x97,0x1B,0x71,0xDC,0x53,0xB5,0x4D,0x89,0xC6,0x19};
- //{0xFC,0xD1,0x8B,0x22,0x9E,0xA0,0xDA,0x4F,0x6B,0x8F,0x39,0x26,0xAF,0x07,0x8A,0x05}; //9CFF
- //{0xB3,0x53,0x00,0xDA,0xF6,0x0A,0x6C,0xF9,0x54,0x57,0x79,0x50,0x6F,0x19,0xE1,0x3A}; //9C35
-std::vector<uint8_t> config_app_key(app_key,app_key+sizeof(app_key)/sizeof(uint8_t));
-
-uint8_t result, pckt_time=100;
-char data;
-unsigned char test;
-char txtstr[17];
-int32_t num_whole, mdot_ret;
-uint32_t pressure;
-int16_t num_frac;
-
-uint8_t position_value = 0xFF; // 00 unknown, 01 is flat, 02 is vertical
-uint8_t reflected_value = 0xFE;
-bool position_changed = true;
-
-bool exit_program = false;
+static std::vector<uint8_t> config_app_id(app_id,app_id+sizeof(app_id)/sizeof(uint8_t));
+static std::vector<uint8_t> config_app_key(app_key,app_key+sizeof(app_key)/sizeof(uint8_t));
+static uint8_t config_frequency_sub_band = 0;
+static bool config_adr_on = true;
#ifdef MTDOT_EVB
MMA845x_DATA accel_data;
MPL3115A2_DATA baro_data;
uint16_t lux_data;
-MMA845x* evbAccel = NULL;
-MPL3115A2* evbBaro = NULL;
-ISL29011* evbAmbLight = NULL;
-NCP5623B* evbBackLight = NULL;
-DOGS102* evbLCD = NULL;
+MMA845x* evbAccel;
+MPL3115A2* evbBaro;
+ISL29011* evbAmbLight;
+NCP5623B* evbBackLight;
+DOGS102* evbLCD;
-#elif defined(MTDOT_UDK)
-static X_NUCLEO_IKS01A1 *mems_shield;
-#endif
+/*
+ * EVB Application state
+ */
+uint8_t position_value = 0xFF; // 00 unknown, 01 is flat, 02 is vertical
+uint8_t reflected_value = 0xFE;
+bool position_changed = true;
-mDot* mdot_radio;
-
-convert32 convertl;
-convert16 converts;
-
+unsigned char test;
+char txtstr[17];
+int32_t num_whole;
+uint32_t pressure;
+int16_t num_frac;
+uint8_t result, pckt_time=100;
+char data;
// flags for pushbutton debounce code
bool pb1_low = false;
bool pb2_low = false;
@@ -194,12 +157,46 @@
void pb2_debounce(void const *args);
Thread* thread_3;
-void log_error(mDot* dot, const char* msg, int32_t retval);
-
void config_pkt_xmit (void const *args);
+#elif defined(MTDOT_UDK)
+
+static X_NUCLEO_IKS01A1 *mems_shield;
+
+#endif
+
+mDot* mdot_radio;
+bool exit_program = false;
+
+/*
+ * Process downlink
+ */
+static void ReceiveData(std::vector<uint8_t> frame);
+
+static bool checkForExit(bool exit);
+
+/*
+ * prints of mDot error
+ */
+void log_error(mDot* dot, const char* msg, int32_t retval)
+{
+ printf("%s - %ld:%s, %s\r\n", msg, retval, mDot::getReturnCodeString(retval).c_str(), dot->getLastError().c_str());
+}
+
+/*
+ * Send frame
+ */
void SendFrame(std::vector<uint8_t> frame)
{
+#if 0
+ static uint32_t count = 0;
+ printf("%lu: send data: ",count++);
+ for(uint32_t i = 0;i < frame.size();i++)
+ printf("%02X",frame[i]);
+ printf("\r\n");
+#endif
+
+ int32_t mdot_ret;
if ((mdot_ret = mdot_radio->send(frame)) != mDot::MDOT_OK) {
log_error(mdot_radio, "failed to send", mdot_ret);
}
@@ -209,44 +206,49 @@
if ((mdot_ret = mdot_radio->recv(frame)) != mDot::MDOT_OK) {
log_error(mdot_radio,"failed to recv:", mdot_ret);
} else {
+
printf("recv data: ");
for(uint32_t i = 0;i < frame.size();i++)
printf("%02X",frame[i]);
printf("\r\n");
- reflected_value = frame[0];
- if(reflected_value == position_value)
- {
-#if MTDOT_EVB
- evbBackLight->setLEDCurrent(16);
-#endif
- position_changed = false;
- }
-#if MTDOT_EVB
- else
- {
- evbBackLight->setLEDCurrent(0);
- }
-#endif
+
+ ReceiveData(frame);
}
}
}
#ifdef MDOT_EVB
+
+void ReceiveData(std::vector<uint8_t> frame)
+{
+ reflected_value = frame[0];
+
+ if(reflected_value == position_value)
+ {
+ evbBackLight->setLEDCurrent(16);
+ position_changed = false;
+ }
+ else
+ {
+ evbBackLight->setLEDCurrent(0);
+ }
+}
+
void BoardInit()
{
static Thread thread_1(pb1_debounce); // threads for de-bouncing pushbutton switches
static Thread thread_2(pb2_debounce);
debugUART.baud(115200);
-// mDotUART.baud(9600); // mdot UART unused but available on external connector
+ // mDotUART.baud(9600); // mdot UART unused but available on external connector
- thread_3 = new Thread(config_pkt_xmit); // start thread that sends LoRa packet when SW2 pressed
+ thread_3 = new Thread(config_pkt_xmit); // start thread that sends LoRa packet when SW2 pressed
- evbAccel = new MMA845x(mDoti2c,MMA845x::SA0_VSS); // setup Accelerometer
- evbBaro = new MPL3115A2(mDoti2c); // setup Barometric sensor
- evbAmbLight = new ISL29011(mDoti2c); // Setup Ambient Light Sensor
- evbBackLight = new NCP5623B(mDoti2c); // setup backlight and LED 2 driver chip
- evbLCD = new DOGS102(mDotspi, mDot17, mDot13); // setup LCD
+ evbAccel = new MMA845x(mDoti2c,MMA845x::SA0_VSS); // setup Accelerometer
+ evbBaro = new MPL3115A2(mDoti2c); // setup Barometric sensor
+ evbAmbLight = new ISL29011(mDoti2c); // Setup Ambient Light Sensor
+ evbBackLight = new NCP5623B(mDoti2c); // setup backlight and LED 2 driver chip
+ evbLCD = new DOGS102(mDotspi, mDot17, mDot13); // setup LCD
/*
* Setup SW1 as program stop function
@@ -313,11 +315,11 @@
printf("Start of Test\n\r");
- osDelay (500); // allows other threads to process
+ osDelay (500); // allows other threads to process
printf("shutdown LED:\n\r");
evbBackLight->shutdown();
- osDelay (500); // allows other threads to process
+ osDelay (500); // allows other threads to process
printf("Turn on LED2\n\r");
evbBackLight->setLEDCurrent(16);
@@ -385,7 +387,7 @@
* Test Accelerometer XYZ data ready bit to see if acquisition complete
*/
do {
- osDelay(100); // allows other threads to process
+ osDelay(100); // allows other threads to process
result = evbAccel->getStatus();
} while ((result & MMA845x::XYZDR) == 0 );
@@ -502,53 +504,166 @@
printf("finished iteration %d\n\r",(++i));
}
-uint32_t PrepareFrame(std::vector<uint8_t> frame, BoardSensorData &data)
+uint32_t PrepareFrame(std::vector<uint8_t> &frame, BoardSensorData &data)
+{
+ if((reflected_value != position_value)|| position_changed)
+ {
+ frame.clear();
+ // we will send a simple byte descriptor of the current position of the device: 01 is laying flat, 02 is vertically oriented
+ frame.push_back(0x00);
+ frame.push_back(position_value);
+ return 2;
+ }
+
+ return 0;
+}
+
+bool checkForExit(bool _exit)
+{
+ // Check for PB1 press during network join attempt
+ if (exit_program) {
+ printf("Exiting program\n\r");
+
+ evbLCD->clearBuffer();
+ sprintf(txtstr,"Exiting Program");
+ evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
+ if(_exit)
+ exit(1);
+ }
+
+ return false;
+}
+
+void ExitingProgram()
{
- if (i % pckt_time != 0)
- return 0;
+ evbBaro->triggerOneShot();
+ do {
+ osDelay(200); // allows other threads to process
+ result = evbBaro->getStatus();
+ } while ((result & MPL3115A2::PTDR) == 0 );
+
+ baro_data = evbBaro->getAllData(true);
+ printf ("minBaro=%ld maxBaro=%ld minTemp=%d maxTemp=%d\n\r", baro_data._minbaro, baro_data._maxbaro,
+ baro_data._mintemp, baro_data._maxtemp);
+ evbLCD->clearBuffer();
+ sprintf(txtstr,"Exiting Program");
+ evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
+ printf("End of Test\n\r");
+}
+
- frame.clear();
- // we will send a simple byte descriptor of the current position of the device: 01 is laying flat, 02 is vertically oriented
- frame.push_back(0x00);
+void wait()
+{
+ osDelay(1000);
+}
+
+/*
+ * Sets pb1_low flag. Slag is cleared in pb1_debounce thread
+ */
+void pb1ISR(void)
+{
+ if (!pb1_low)
+ pb1_low = true;
+}
+
+/*
+ * Debounces pb1. Also exits program if pushbutton 1 is pressed
+ */
+void pb1_debounce(void const *args)
+{
+ static uint8_t count = 0;
- frame.push_back(position_value);
- /*frame.push_back(0x0E); // key for Current Acceleration 3-Axis Value
- converts.f_s = accel_data._x *4; // shift data 2 bits while retaining sign
- frame.push_back(converts.t_u[1]); // get 8 MSB of 14 bit value
- converts.f_s = accel_data._y * 4; // shift data 2 bits while retaining sign
- frame.push_back(converts.t_u[1]); // get 8 MSB of 14 bit value
- converts.f_s = accel_data._z * 4; // shift data 2 bits while retaining sign
- frame.push_back(converts.t_u[1]); // get 8 MSB of 14 bit value
- */
- /*
- frame.push_back(0x08); // key for Current Pressure Value
- convertl.f_u = pressure; // pressure data is 20 bits unsigned
- frame.push_back(convertl.t_u[2]);
- frame.push_back(convertl.t_u[1]);
- frame.push_back(convertl.t_u[0]);
- frame.push_back(0x05); // key for Current Ambient Light Value
- converts.f_u = lux_data; // data is 16 bits unsigned
- frame.push_back(converts.t_u[1]);
- frame.push_back(converts.t_u[0]);
- frame.push_back(0x0B); // key for Current Temperature Value
- converts.f_s = baro_data._temp; // temperature is signed 12 bit
- frame.push_back(converts.t_u[1]);
- frame.push_back(converts.t_u[0]);
-*/
+ while (true) {
+ if (pb1_low && (mDot08 == 0))
+ count++;
+ else {
+ count = 0;
+ pb1_low = false;
+ }
+
+ if (count == 5)
+ exit_program = true;
+
+ Thread::wait(5);
+ }
+}
+
+/*
+ * Sets pb2_low flag. Flag is cleared in pb2_debounce thread
+ */
+void pb2ISR(void)
+{
+ if (!pb2_low)
+ pb2_low = true;
+}
+
+/*
+ * Debounces pb2. Also changes packet transmit time to every other,
+ * every fifth, or every tenth sample when SW2 pushed
+ * Also triggers a thread to transmit a configuration packet
+ */
+void pb2_debounce(void const *args)
+{
+ static uint8_t count = 0;
+
+ while (true) {
- if((reflected_value != position_value)||(position_changed)||(0 == (i%100)))
- {
+ if (pb2_low && (mDot09 == 0))
+ count++;
+ else {
+ count = 0;
+ pb2_low = false;
+ }
+
+ if (count == 5){
+ if (pckt_time >= 5)
+ pckt_time /= 2;
+ else
+ pckt_time = 20;
+
+ //thread_3->signal_set(0x10); // signal config_pkt_xmit to send packet
+ position_changed = true;
+ }
+ Thread::wait(5);
+ }
+ }
+
+/*
+ * Thread that is triggered by SW2 ISR. Sends a packet to the LoRa server with the new Packet Transmission time setting
+ */
+void config_pkt_xmit (void const *args)
+{
+ int32_t mdot_ret;
+
+ std::vector<uint8_t> data;
+
+ while (true) {
+ Thread::signal_wait(0x10); // wait for pb2ISR to signal send
+ data.clear();
+ data.push_back(0x0F); // key for Configuration data (packet transmission timer)
+ data.push_back(pckt_time);
+
+ if ((mdot_ret = mdot_radio->send(data)) != mDot::MDOT_OK) {
+ log_error(mdot_radio, "failed to send config data", mdot_ret);
+ } else {
+ printf("sent config data to gateway\r\n");
+ }
}
}
#elif defined(MTDOT_UDK)
+void ReceiveData(std::vector<uint8_t> frame)
+{
+}
+
void BoardInit()
{
debugUART.baud(115200);
// ST X-NUCLEO-IKS01A1 MEMS Shield
- mems_shield = X_NUCLEO_IKS01A1::Instance();
+ mems_shield = X_NUCLEO_IKS01A1::Instance(NULL, NC);
+ // mems_shield = X_NUCLEO_IKS01A1::Instance();
}
void PostJoinInit() { }
@@ -579,14 +694,11 @@
printf("%s: Temperature=%f, Pressure=%f, x=%ld, y=%ld, z=%ld\r\n",__func__,
data.temperature, data.pressure,
data.accel_x, data.accel_y, data.accel_z);
-
- osDelay(5000);
-
}
-uint32_t PrepareFrame(std::vector<uint8_t> frame, BoardSensorData &data)
+uint32_t PrepareFrame(std::vector<uint8_t> &frame, BoardSensorData &data)
{
- static uint8_t buffer[64];
+ static uint8_t buffer[256];
uint16_t xyz_mask = 0;
// Sensor packet type serialized to the LMIC frame buffer
@@ -604,6 +716,18 @@
return frame.size();
}
+bool checkForExit(bool _exit) { return false;}
+
+
+void ExitingProgram()
+{
+ printf("Exiting\n\r");
+}
+
+void wait()
+{
+ osDelay(5000);
+}
#else
@@ -612,7 +736,10 @@
void mDotConfigureAndJoin()
{
- bool ok;
+ bool ok;
+ int32_t mdot_ret;
+
+ printf("Configuring mDot\r\n");
// get mDot handle
mdot_radio = mDot::getInstance();
@@ -649,15 +776,13 @@
for (uint8_t i=0; i<mdot_EUI.size(); i++) {
printf("%02x ", mdot_EUI[i]);
}
- printf("\n\r");
-
-
-// Setting up the mDot with network information.
+ printf("\n\r");
+
- /*
- * This call sets up private or public mode on the MTDOT. Set the function to true if
- * connecting to a public network
- */
+ /*
+ * This call sets up private or public mode on the MTDOT. Set the function to true if
+ * connecting to a public network
+ */
printf("setting Public Network Mode\r\n");
if ((mdot_ret = mdot_radio->setPublicNetwork(true)) != mDot::MDOT_OK) {
log_error(mdot_radio, "failed to set Public Network Mode", mdot_ret);
@@ -665,15 +790,15 @@
mdot_radio->setTxDataRate(mDot::DR0);
mdot_radio->setTxPower(14);
mdot_radio->setJoinRetries(1);
- mdot_radio->setJoinMode(mDot::OTA);
+ mdot_radio->setJoinMode(mDot::OTA);
- /*
- * Frequency sub-band is valid for NAM only and for Private networks should be set to a value
- * between 1-8 that matches the the LoRa gateway setting. Public networks use sub-band 0 only.
- * This function can be commented out for EU networks
- */
+ /*
+ * Frequency sub-band is valid for NAM only and for Private networks should be set to a value
+ * between 1-8 that matches the the LoRa gateway setting. Public networks use sub-band 0 only.
+ * This function can be commented out for EU networks
+ */
printf("setting frequency sub band\r\n");
- if ((mdot_ret = mdot_radio->setFrequencySubBand(config_frequency_sub_band)) != mDot::MDOT_OK) {
+ if ((mdot_ret = mdot_radio->setFrequencySubBand(config_frequency_sub_band)) != mDot::MDOT_OK) {
log_error(mdot_radio, "failed to set frequency sub band", mdot_ret);
ok = false;
}
@@ -683,30 +808,34 @@
log_error(mdot_radio, "failed to set ADR", mdot_ret);
ok = false;
}
- /*
- * setNetworkName is used for private networks.
- * Use setNetworkID(AppID) for public networks
- */
+
+ /*
+ * setNetworkName is used for private networks.
+ * Use setNetworkID(AppID) for public networks
+ */
printf("setting network name\r\n");
if ((mdot_ret = mdot_radio->setNetworkId(config_app_id)) != mDot::MDOT_OK) {
log_error(mdot_radio, "failed to set network name", mdot_ret);
ok = false;
}
- /*
- * setNetworkPassphrase is used for private networks
- * Use setNetworkKey for public networks
- */
- printf("setting network password\r\n");
+ /*
+ * setNetworkPassphrase is used for private networks
+ * Use setNetworkKey for public networks
+ */
+ printf("setting network key\r\n");
if ((mdot_ret = mdot_radio->setNetworkKey(config_app_key)) != mDot::MDOT_OK) {
log_error(mdot_radio, "failed to set network password", mdot_ret);
ok = false;
}
+
+ checkForExit(true);
+
}while(ok == false);
-
+
// attempt to join the network
printf("joining network\r\n");
- while (((mdot_ret = mdot_radio->joinNetwork()) != mDot::MDOT_OK) && (!exit_program)) {
+ while ((mdot_ret = mdot_radio->joinNetwork()) != mDot::MDOT_OK) {
log_error(mdot_radio,"failed to join network:", mdot_ret);
if (mdot_radio->getFrequencyBand() == mDot::FB_868){
mdot_ret = mdot_radio->getNextTxMs();
@@ -715,175 +844,42 @@
mdot_ret = 0;
}
+ checkForExit(true);
+
printf("delay = %lu\n\r",mdot_ret);
osDelay(mdot_ret + 10000);
}
}
+
int main()
{
BoardSensorData sensorData;
+ std::vector<uint8_t> frame;
// Board specific initialization
BoardInit();
- // mDot configuration and join
- //mDotConfigureAndJoin();
-
- PostJoinInit();
+ // Configure mDot and join
+ mDotConfigureAndJoin();
- /*
- * Check for PB1 press during network join attempt
- */
- if (exit_program) {
- printf("Exiting program\n\r");
-
-#ifdef MDOT_EVB
- evbLCD->clearBuffer();
- sprintf(txtstr,"Exiting Program");
- evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
-#endif
- exit(1);
- }
+ // Do board specific post join configuration
+ PostJoinInit();
/*
* Main data acquisition loop
*/
do {
- std::vector<uint8_t> frame;
-
// Acquire sensor values
ReadSensors(sensorData);
-
+
// Send sensor packets
if( PrepareFrame(frame, sensorData) > 0 ){
SendFrame( frame );
}
-
- } while(!exit_program);
-
-
-#ifdef MDOT_EVB
- evbBaro->triggerOneShot();
- do {
- osDelay(200); // allows other threads to process
- result = evbBaro->getStatus();
- } while ((result & MPL3115A2::PTDR) == 0 );
-
- baro_data = evbBaro->getAllData(true);
- printf ("minBaro=%ld maxBaro=%ld minTemp=%d maxTemp=%d\n\r", baro_data._minbaro, baro_data._maxbaro,
- baro_data._mintemp, baro_data._maxtemp);
- evbLCD->clearBuffer();
- sprintf(txtstr,"Exiting Program");
- evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
-#endif
-
- printf("End of Test\n\r");
-}
-
-#ifdef MDOT_EVB
-/*
- * Sets pb1_low flag. Slag is cleared in pb1_debounce thread
- */
-void pb1ISR(void)
-{
- if (!pb1_low)
- pb1_low = true;
-}
+ wait();
-/*
- * Debounces pb1. Also exits program if pushbutton 1 is pressed
- */
-void pb1_debounce(void const *args)
-{
-
- static uint8_t count = 0;
-
- while (true) {
+ } while(!checkForExit(false));
- if (pb1_low && (mDot08 == 0))
- count++;
- else {
- count = 0;
- pb1_low = false;
- }
-
- if (count == 5)
- exit_program = true;
-
- Thread::wait(5);
- }
-}
-
-/*
- * Sets pb2_low flag. Flag is cleared in pb2_debounce thread
- */
-void pb2ISR(void)
-{
- if (!pb2_low)
- pb2_low = true;
+ ExitingProgram();
}
-
-/*
- * Debounces pb2. Also changes packet transmit time to every other,
- * every fifth, or every tenth sample when SW2 pushed
- * Also triggers a thread to transmit a configuration packet
- */
-void pb2_debounce(void const *args)
-{
-
- static uint8_t count = 0;
-
- while (true) {
-
- if (pb2_low && (mDot09 == 0))
- count++;
- else {
- count = 0;
- pb2_low = false;
- }
-
- if (count == 5){
-
- if (pckt_time >= 5)
- pckt_time /= 2;
- else pckt_time = 20;
-
- //thread_3->signal_set(0x10); // signal config_pkt_xmit to send packet
- position_changed = true;
- }
-
- Thread::wait(5);
- }
- }
-#endif
-
-/*
- * Function that print clear text verion of mDot errors
- */
-void log_error(mDot* dot, const char* msg, int32_t retval)
-{
- printf("%s - %ld:%s, %s\r\n", msg, retval, mDot::getReturnCodeString(retval).c_str(), dot->getLastError().c_str());
-}
-
-/*
- * Thread that is triggered by SW2 ISR. Sends a packet to the LoRa server with the new Packet Transmission time setting
- */
-void config_pkt_xmit (void const *args)
-{
-
- std::vector<uint8_t> data;
-
- while (true) {
- Thread::signal_wait(0x10); // wait for pb2ISR to signal send
- data.clear();
- data.push_back(0x0F); // key for Configuration data (packet transmission timer)
- data.push_back(pckt_time);
-
- if ((mdot_ret = mdot_radio->send(data)) != mDot::MDOT_OK) {
- log_error(mdot_radio, "failed to send config data", mdot_ret);
- } else {
- printf("sent config data to gateway\r\n");
- }
- }
-}
