Echo example of class C devices receiving downlink and sending as next uplink
Dependencies: libmDot-mbed5 ISL29011
Diff: examples/src/ota_example.cpp
- Revision:
- 0:a151a6350d7f
- Child:
- 2:ffac7b141b72
diff -r 000000000000 -r a151a6350d7f examples/src/ota_example.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/src/ota_example.cpp Wed Oct 05 21:07:50 2016 +0000 @@ -0,0 +1,109 @@ +#include "dot_util.h" + +#if ACTIVE_EXAMPLE == OTA_EXAMPLE + +/////////////////////////////////////////////////////////// +// these options must match the settings on your gateway // +// edit their values to match your configuration // +// frequency sub band is only relevant for the 915 bands // +/////////////////////////////////////////////////////////// +static std::string network_name = "mikes_lora_network"; +static std::string network_passphrase = "password_123"; +static uint8_t frequency_sub_band = 6; +static bool public_network = false; +static uint8_t ack = 1; + +// deepsleep consumes slightly less current than sleep +// in sleep mode, IO state is maintained, RAM is retained, and application will resume after waking up +// in deepsleep mode, IOs float, RAM is lost, and application will start from beginning after waking up +// if deep_sleep == true, device will enter deepsleep mode +static bool deep_sleep = false; + +mDot* dot = NULL; + +Serial pc(USBTX, USBRX); + +#if defined(TARGET_XDOT_L151CC) +I2C i2c(I2C_SDA, I2C_SCL); +ISL29011 lux(i2c); +#else +AnalogIn lux(XBEE_AD0); +#endif + +int main() { + pc.baud(115200); + + mts::MTSLog::setLogLevel(mts::MTSLog::TRACE_LEVEL); + + dot = mDot::getInstance(); + + // make sure library logging is turned on + dot->setLogLevel(mts::MTSLog::INFO_LEVEL); + + // update configuration if necessary, then display it + if (dot->getJoinMode() != mDot::OTA) { + logInfo("changing network join mode to OTA"); + if (dot->setJoinMode(mDot::OTA) != mDot::MDOT_OK) { + logError("failed to set network join mode to OTA"); + } + } + update_ota_config(network_name, network_passphrase, frequency_sub_band, public_network, ack); + display_config(); + + // restore the saved session if the dot woke from deepsleep mode + // useful to use with deepsleep because RAM session info is otherwise lost when the dot enters deepsleep + if (dot->getStandbyFlag()) { + logInfo("restoring network session from NVM"); + dot->restoreNetworkSession(); + } + + while (true) { + uint16_t light; + std::vector<uint8_t> tx_data; + + // join network if not joined + if (!dot->getNetworkJoinStatus()) { + join_network(); + } + +#if defined(TARGET_XDOT_L151CC) + // configure the ISL29011 sensor on the xDot-DK for continuous ambient light sampling, 16 bit conversion, and maximum range + lux.setMode(ISL29011::ALS_CONT); + lux.setResolution(ISL29011::ADC_16BIT); + lux.setRange(ISL29011::RNG_64000); + + // get the latest light sample and send it to the gateway + light = lux.getData(); + tx_data.push_back((light >> 8) & 0xFF); + tx_data.push_back(light & 0xFF); + logInfo("light: %lu [0x%04X]", light, light); + send_data(tx_data); + + // put the LSL29011 ambient light sensor into a low power state + lux.setMode(ISL29011::PWR_DOWN); +#else + // get some dummy data and send it to the gateway + light = lux.read_u16(); + tx_data.push_back((light >> 8) & 0xFF); + tx_data.push_back(light & 0xFF); + logInfo("light: %lu [0x%04X]", light, light); + send_data(tx_data); +#endif + + // 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 + if (deep_sleep) { + 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(deep_sleep); + } + + return 0; +} + +#endif