Example of using the mDot UDK with the X-NUCLEO-IKS01A2 board
Dependencies: MTS_X_NUCLEO_IKS01A2 libmDot-mbed5
Fork of mDot-IKS01A1 by
Diff: main.cpp
- Revision:
- 0:9e88a9018fc0
- Child:
- 2:d0873bb1255f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Dec 09 15:56:42 2016 +0000 @@ -0,0 +1,120 @@ +#include "mbed.h" +#include "mDot.h" +#include "x_nucleo_iks01a1.h" +#include "dot_util.h" +#include "RadioEvent.h" + +static std::string network_name = "TestTest"; +static std::string network_passphrase = "TestTest"; +static uint8_t frequency_sub_band = 1; +static bool public_network = false; +static uint8_t ack = 0; + +mDot *dot = NULL; +Serial pc(USBTX, USBRX); + +int main() +{ + // Custom event handler for automatically displaying RX data + RadioEvent events; + pc.baud(115200); + + /* Initialize mDot */ + + mts::MTSLog::setLogLevel(mts::MTSLog::TRACE_LEVEL); + dot = mDot::getInstance(); + dot->setEvents(&events); + + + /* Instantiate the expansion board */ + X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(D14, D15); + + /* Retrieve the composing elements of the expansion board */ + GyroSensor *gyroscope = mems_expansion_board->GetGyroscope(); + MotionSensor *accelerometer = mems_expansion_board->GetAccelerometer(); + MagneticSensor *magnetometer = mems_expansion_board->magnetometer; + HumiditySensor *humidity_sensor = mems_expansion_board->ht_sensor; + PressureSensor *pressure_sensor = mems_expansion_board->pt_sensor; + TempSensor *temp_sensor1 = mems_expansion_board->ht_sensor; + TempSensor *temp_sensor2 = mems_expansion_board->pt_sensor; + + + if (!dot->getStandbyFlag()) { + logInfo("mbed-os library version: %d", MBED_LIBRARY_VERSION); + // start from a well-known state + logInfo("defaulting Dot configuration"); + dot->resetConfig(); + dot->resetNetworkSession(); + + // update configuration if necessary + // in AUTO_OTA mode the session is automatically saved, so saveNetworkSession and restoreNetworkSession are not needed + if (dot->getJoinMode() != mDot::AUTO_OTA) { + logInfo("changing network join mode to AUTO_OTA"); + if (dot->setJoinMode(mDot::AUTO_OTA) != mDot::MDOT_OK) { + logError("failed to set network join mode to AUTO_OTA"); + } + } + // in OTA and AUTO_OTA join modes, the credentials can be passed to the library as a name and passphrase or an ID and KEY + // only one method or the other should be used! + // network ID = crc64(network name) + // network KEY = cmac(network passphrase) + update_ota_config_name_phrase(network_name, network_passphrase, frequency_sub_band, public_network, ack); + + // configure network link checks + // network link checks are a good alternative to requiring the gateway to ACK every packet and should allow a single gateway to handle more Dots + // check the link every count packets + // declare the Dot disconnected after threshold failed link checks + // for count = 3 and threshold = 5, the Dot will be considered disconnected after 15 missed packets in a row + update_network_link_check_config(3, 5); + + // save changes to configuration + logInfo("saving configuration"); + if (!dot->saveConfig()) { + logError("failed to save configuration"); + } + + // display configuration + display_config(); + } else { + // restore the saved session if the dot woke from deepsleep mode + // useful to use with deepsleep because session info is otherwise lost when the dot enters deepsleep + logInfo("restoring network session from NVM"); + dot->restoreNetworkSession(); + } + + while (true) { + std::vector<uint8_t> tx_data; + + // join network if not joined + if (!dot->getNetworkJoinStatus()) { + join_network(); + } + // Retrieve sensor data and prepare the packet. + //temp floats + float value1, value2; + // HTS221 Humidity sensor + temp_sensor1->GetTemperature(&value1); + humidity_sensor->GetHumidity(&value2); + //serialize data and append to packet + tx_data.push_back(uint8_t(0xFF & *((uint32_t*)(&value1)))); + tx_data.push_back(uint8_t((0xFF << 2 ) & *((uint32_t*)(&value1)))); + tx_data.push_back(uint8_t((0xFF << 4 ) & *((uint32_t*)(&value1)))); + tx_data.push_back(uint8_t((0xFF << 6 ) & *((uint32_t*)(&value1)))); + logInfo("Temperature data %d", value1); + send_data(tx_data); + + // if going into deepsleep mode, save the session so we don't need to join again after waking up + // not necessary if going into sleep mode since RAM is retained + logInfo("saving network session to NVM"); + dot->saveNetworkSession(); + + + // ONLY ONE of the three functions below should be uncommented depending on the desired wakeup method + //sleep_wake_rtc_only(deep_sleep); + //sleep_wake_interrupt_only(deep_sleep); + sleep_wake_rtc_or_interrupt(false); + + } + + return 0; +} \ No newline at end of file