Basic xdot code to check how many memory is available for user APP after initializing libxdot lorawan stack

Committer:
Taylor Heck
Date:
Tue May 25 09:54:33 2021 -0500
Revision:
42:20f6b29a9903
Parent:
36:f1053cb17d4f
Target mbed-os 6 and Dot Library version 4.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jason Reiss 36:f1053cb17d4f 1 #include "dot_util.h"
Jason Reiss 36:f1053cb17d4f 2 #include "RadioEvent.h"
Jason Reiss 36:f1053cb17d4f 3
Jason Reiss 36:f1053cb17d4f 4 #if ACTIVE_EXAMPLE == FOTA_EXAMPLE
Jason Reiss 36:f1053cb17d4f 5
Taylor Heck 42:20f6b29a9903 6
Taylor Heck 42:20f6b29a9903 7 #if defined(TARGET_XDOT_L151CC)
Taylor Heck 42:20f6b29a9903 8 //#include "SPIFBlockDevice.h"
Taylor Heck 42:20f6b29a9903 9 //#include "DataFlashBlockDevice.h"
Taylor Heck 42:20f6b29a9903 10 #endif
Taylor Heck 42:20f6b29a9903 11
Jason Reiss 36:f1053cb17d4f 12 /////////////////////////////////////////////////////////////////////////////
Jason Reiss 36:f1053cb17d4f 13 // -------------------- DOT LIBRARY REQUIRED ------------------------------//
Jason Reiss 36:f1053cb17d4f 14 // * Because these example programs can be used for both mDot and xDot //
Jason Reiss 36:f1053cb17d4f 15 // devices, the LoRa stack is not included. The libmDot library should //
Jason Reiss 36:f1053cb17d4f 16 // be imported if building for mDot devices. The libxDot library //
Jason Reiss 36:f1053cb17d4f 17 // should be imported if building for xDot devices. //
Jason Reiss 36:f1053cb17d4f 18 // * https://developer.mbed.org/teams/MultiTech/code/libmDot-dev-mbed5/ //
Jason Reiss 36:f1053cb17d4f 19 // * https://developer.mbed.org/teams/MultiTech/code/libmDot-mbed5/ //
Jason Reiss 36:f1053cb17d4f 20 // * https://developer.mbed.org/teams/MultiTech/code/libxDot-dev-mbed5/ //
Jason Reiss 36:f1053cb17d4f 21 // * https://developer.mbed.org/teams/MultiTech/code/libxDot-mbed5/ //
Jason Reiss 36:f1053cb17d4f 22 /////////////////////////////////////////////////////////////////////////////
Jason Reiss 36:f1053cb17d4f 23
Jason Reiss 36:f1053cb17d4f 24
Jason Reiss 36:f1053cb17d4f 25 ////////////////////////////////////////////////////////////////////////////
Jason Reiss 36:f1053cb17d4f 26 // -------------------- DEFINITIONS REQUIRED ---------------------------- //
Taylor Heck 42:20f6b29a9903 27 // Add define for FOTA in mbed_app.json or on command line //
Jason Reiss 36:f1053cb17d4f 28 // Command line //
Jason Reiss 36:f1053cb17d4f 29 // mbed compile -t GCC_ARM -m MTS_MDOT_F411RE -DFOTA=1 //
Jason Reiss 36:f1053cb17d4f 30 // mbed_app.json //
Jason Reiss 36:f1053cb17d4f 31 // { //
Jason Reiss 36:f1053cb17d4f 32 // "macros": [ //
Taylor Heck 42:20f6b29a9903 33 // "FOTA" //
Jason Reiss 36:f1053cb17d4f 34 // ] //
Jason Reiss 36:f1053cb17d4f 35 // } //
Jason Reiss 36:f1053cb17d4f 36 // //
Taylor Heck 42:20f6b29a9903 37 ////////////////////////////////////////////////////////////////////////////
Taylor Heck 42:20f6b29a9903 38
Taylor Heck 42:20f6b29a9903 39
Taylor Heck 42:20f6b29a9903 40 ////////////////////////////////////////////////////////////////////////////
Taylor Heck 42:20f6b29a9903 41 // -------------------------- XDOT EXTERNAL STORAGE --------------------- //
Taylor Heck 42:20f6b29a9903 42 // An external storage device is required for FOTA on an XDot. The //
Taylor Heck 42:20f6b29a9903 43 // storage device must meet the following criteria: //
Taylor Heck 42:20f6b29a9903 44 // * Work with MBed OS DataFlashBlockDevice or SPIFBlockDevice classes //
Taylor Heck 42:20f6b29a9903 45 // * Maximum 4KB sector erase size //
Taylor Heck 42:20f6b29a9903 46 // * Maximum 512 byte page size //
Taylor Heck 42:20f6b29a9903 47 // * SPIF type components must support Serial Flash Discoverable //
Taylor Heck 42:20f6b29a9903 48 // Parameters (SFDP) //
Taylor Heck 42:20f6b29a9903 49 // //
Taylor Heck 42:20f6b29a9903 50 // Refer to mbed_app.json included in this project for configuration //
Taylor Heck 42:20f6b29a9903 51 // parameters requried for external storage. //
Taylor Heck 42:20f6b29a9903 52 // //
Taylor Heck 42:20f6b29a9903 53 // Modify code below to create a BlockDevice object. //
Jason Reiss 36:f1053cb17d4f 54 ////////////////////////////////////////////////////////////////////////////
Jason Reiss 36:f1053cb17d4f 55
Jason Reiss 36:f1053cb17d4f 56
Jason Reiss 36:f1053cb17d4f 57 /////////////////////////////////////////////////////////////
Jason Reiss 36:f1053cb17d4f 58 // * these options must match the settings on your gateway //
Jason Reiss 36:f1053cb17d4f 59 // * edit their values to match your configuration //
Jason Reiss 36:f1053cb17d4f 60 // * frequency sub band is only relevant for the 915 bands //
Jason Reiss 36:f1053cb17d4f 61 // * either the network name and passphrase can be used or //
Jason Reiss 36:f1053cb17d4f 62 // the network ID (8 bytes) and KEY (16 bytes) //
Jason Reiss 36:f1053cb17d4f 63 /////////////////////////////////////////////////////////////
Jason Reiss 36:f1053cb17d4f 64
Jason Reiss 36:f1053cb17d4f 65 static std::string network_name = "MultiTech";
Jason Reiss 36:f1053cb17d4f 66 static std::string network_passphrase = "MultiTech";
Jason Reiss 36:f1053cb17d4f 67 static uint8_t network_id[] = { 0x6C, 0x4E, 0xEF, 0x66, 0xF4, 0x79, 0x86, 0xA6 };
Jason Reiss 36:f1053cb17d4f 68 static uint8_t network_key[] = { 0x1F, 0x33, 0xA1, 0x70, 0xA5, 0xF1, 0xFD, 0xA0, 0xAB, 0x69, 0x7A, 0xAE, 0x2B, 0x95, 0x91, 0x6B };
Jason Reiss 36:f1053cb17d4f 69 static uint8_t frequency_sub_band = 0;
Jason Reiss 36:f1053cb17d4f 70 static lora::NetworkType network_type = lora::PUBLIC_LORAWAN;
Jason Reiss 36:f1053cb17d4f 71 static uint8_t join_delay = 5;
Jason Reiss 36:f1053cb17d4f 72 static uint8_t ack = 1;
Jason Reiss 36:f1053cb17d4f 73 static bool adr = true;
Jason Reiss 36:f1053cb17d4f 74
Jason Reiss 36:f1053cb17d4f 75 mDot* dot = NULL;
Jason Reiss 36:f1053cb17d4f 76 lora::ChannelPlan* plan = NULL;
Jason Reiss 36:f1053cb17d4f 77
Taylor Heck 42:20f6b29a9903 78 mbed::UnbufferedSerial pc(USBTX, USBRX);
Jason Reiss 36:f1053cb17d4f 79
Jason Reiss 36:f1053cb17d4f 80 #if defined(TARGET_XDOT_L151CC)
Jason Reiss 36:f1053cb17d4f 81 I2C i2c(I2C_SDA, I2C_SCL);
Jason Reiss 36:f1053cb17d4f 82 ISL29011 lux(i2c);
Jason Reiss 36:f1053cb17d4f 83 #else
Jason Reiss 36:f1053cb17d4f 84 AnalogIn lux(XBEE_AD0);
Jason Reiss 36:f1053cb17d4f 85 #endif
Jason Reiss 36:f1053cb17d4f 86
Jason Reiss 36:f1053cb17d4f 87 int main() {
Jason Reiss 36:f1053cb17d4f 88 // Custom event handler for automatically displaying RX data
Jason Reiss 36:f1053cb17d4f 89 RadioEvent events;
Jason Reiss 36:f1053cb17d4f 90
Jason Reiss 36:f1053cb17d4f 91 pc.baud(115200);
Jason Reiss 36:f1053cb17d4f 92
Jason Reiss 36:f1053cb17d4f 93 #if defined(TARGET_XDOT_L151CC)
Jason Reiss 36:f1053cb17d4f 94 i2c.frequency(400000);
Jason Reiss 36:f1053cb17d4f 95 #endif
Jason Reiss 36:f1053cb17d4f 96
Jason Reiss 36:f1053cb17d4f 97 mts::MTSLog::setLogLevel(mts::MTSLog::TRACE_LEVEL);
Jason Reiss 36:f1053cb17d4f 98
Taylor Heck 42:20f6b29a9903 99 // Create channel plan
Taylor Heck 42:20f6b29a9903 100 plan = create_channel_plan();
Jason Reiss 36:f1053cb17d4f 101 assert(plan);
Jason Reiss 36:f1053cb17d4f 102
Taylor Heck 42:20f6b29a9903 103 #if defined(TARGET_XDOT_L151CC)
Taylor Heck 42:20f6b29a9903 104
Taylor Heck 42:20f6b29a9903 105 mbed::BlockDevice* ext_bd = NULL;
Taylor Heck 42:20f6b29a9903 106
Taylor Heck 42:20f6b29a9903 107 // XDot requires an external storage device for FOTA (see above).
Taylor Heck 42:20f6b29a9903 108 // If one is connected provide the block device object to the mDot instance.
Taylor Heck 42:20f6b29a9903 109 //
Taylor Heck 42:20f6b29a9903 110 // ** Uncomment the appropriate block device here and include statement above
Taylor Heck 42:20f6b29a9903 111 //
Taylor Heck 42:20f6b29a9903 112 //ext_bd = new SPIFBlockDevice();
Taylor Heck 42:20f6b29a9903 113 //ext_bd = new DataFlashBlockDevice();
Taylor Heck 42:20f6b29a9903 114 ext_bd->init();
Taylor Heck 42:20f6b29a9903 115 dot = mDot::getInstance(plan, ext_bd);
Taylor Heck 42:20f6b29a9903 116 #else
Jason Reiss 36:f1053cb17d4f 117 dot = mDot::getInstance(plan);
Taylor Heck 42:20f6b29a9903 118 #endif
Jason Reiss 36:f1053cb17d4f 119 assert(dot);
Jason Reiss 36:f1053cb17d4f 120
Jason Reiss 36:f1053cb17d4f 121 logInfo("mbed-os library version: %d.%d.%d", MBED_MAJOR_VERSION, MBED_MINOR_VERSION, MBED_PATCH_VERSION);
Jason Reiss 36:f1053cb17d4f 122
Jason Reiss 36:f1053cb17d4f 123 // Initialize FOTA singleton
Jason Reiss 36:f1053cb17d4f 124 Fota::getInstance(dot);
Jason Reiss 36:f1053cb17d4f 125
Jason Reiss 36:f1053cb17d4f 126
Jason Reiss 36:f1053cb17d4f 127 // start from a well-known state
Jason Reiss 36:f1053cb17d4f 128 logInfo("defaulting Dot configuration");
Jason Reiss 36:f1053cb17d4f 129 dot->resetConfig();
Jason Reiss 36:f1053cb17d4f 130 dot->resetNetworkSession();
Jason Reiss 36:f1053cb17d4f 131
Jason Reiss 36:f1053cb17d4f 132 // make sure library logging is turned on
Jason Reiss 36:f1053cb17d4f 133 dot->setLogLevel(mts::MTSLog::INFO_LEVEL);
Jason Reiss 36:f1053cb17d4f 134
Jason Reiss 36:f1053cb17d4f 135 // attach the custom events handler
Jason Reiss 36:f1053cb17d4f 136 dot->setEvents(&events);
Jason Reiss 36:f1053cb17d4f 137
Jason Reiss 36:f1053cb17d4f 138 // update configuration if necessary
Jason Reiss 36:f1053cb17d4f 139 if (dot->getJoinMode() != mDot::OTA) {
Jason Reiss 36:f1053cb17d4f 140 logInfo("changing network join mode to OTA");
Jason Reiss 36:f1053cb17d4f 141 if (dot->setJoinMode(mDot::OTA) != mDot::MDOT_OK) {
Jason Reiss 36:f1053cb17d4f 142 logError("failed to set network join mode to OTA");
Jason Reiss 36:f1053cb17d4f 143 }
Jason Reiss 36:f1053cb17d4f 144 }
Jason Reiss 36:f1053cb17d4f 145 // 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
Jason Reiss 36:f1053cb17d4f 146 // only one method or the other should be used!
Jason Reiss 36:f1053cb17d4f 147 // network ID = crc64(network name)
Jason Reiss 36:f1053cb17d4f 148 // network KEY = cmac(network passphrase)
Jason Reiss 36:f1053cb17d4f 149 update_ota_config_name_phrase(network_name, network_passphrase, frequency_sub_band, network_type, ack);
Jason Reiss 36:f1053cb17d4f 150 //update_ota_config_id_key(network_id, network_key, frequency_sub_band, network_type, ack);
Jason Reiss 36:f1053cb17d4f 151
Jason Reiss 36:f1053cb17d4f 152 // configure the Dot for class C operation
Jason Reiss 36:f1053cb17d4f 153 // the Dot must also be configured on the gateway for class C
Jason Reiss 36:f1053cb17d4f 154 // use the lora-query application to do this on a Conduit: http://www.multitech.net/developer/software/lora/lora-network-server/
Jason Reiss 36:f1053cb17d4f 155 // to provision your Dot for class C operation with a 3rd party gateway, see the gateway or network provider documentation
Jason Reiss 36:f1053cb17d4f 156 logInfo("changing network mode to class C");
Jason Reiss 36:f1053cb17d4f 157 if (dot->setClass("C") != mDot::MDOT_OK) {
Jason Reiss 36:f1053cb17d4f 158 logError("failed to set network mode to class C");
Jason Reiss 36:f1053cb17d4f 159 }
Jason Reiss 36:f1053cb17d4f 160
Jason Reiss 36:f1053cb17d4f 161 // enable or disable Adaptive Data Rate
Jason Reiss 36:f1053cb17d4f 162 dot->setAdr(adr);
Jason Reiss 36:f1053cb17d4f 163
Jason Reiss 36:f1053cb17d4f 164 // Configure the join delay
Jason Reiss 36:f1053cb17d4f 165 dot->setJoinDelay(join_delay);
Jason Reiss 36:f1053cb17d4f 166
Jason Reiss 36:f1053cb17d4f 167 // save changes to configuration
Jason Reiss 36:f1053cb17d4f 168 logInfo("saving configuration");
Jason Reiss 36:f1053cb17d4f 169 if (!dot->saveConfig()) {
Jason Reiss 36:f1053cb17d4f 170 logError("failed to save configuration");
Jason Reiss 36:f1053cb17d4f 171 }
Jason Reiss 36:f1053cb17d4f 172
Jason Reiss 36:f1053cb17d4f 173 // display configuration
Jason Reiss 36:f1053cb17d4f 174 display_config();
Jason Reiss 36:f1053cb17d4f 175
Jason Reiss 36:f1053cb17d4f 176 while (true) {
Jason Reiss 36:f1053cb17d4f 177 uint16_t light;
Jason Reiss 36:f1053cb17d4f 178 std::vector<uint8_t> tx_data;
Jason Reiss 36:f1053cb17d4f 179
Jason Reiss 36:f1053cb17d4f 180 // join network if not joined
Jason Reiss 36:f1053cb17d4f 181 if (!dot->getNetworkJoinStatus()) {
Jason Reiss 36:f1053cb17d4f 182 join_network();
Jason Reiss 36:f1053cb17d4f 183 }
Jason Reiss 36:f1053cb17d4f 184
Jason Reiss 36:f1053cb17d4f 185 #if defined(TARGET_XDOT_L151CC)
Jason Reiss 36:f1053cb17d4f 186 // configure the ISL29011 sensor on the xDot-DK for continuous ambient light sampling, 16 bit conversion, and maximum range
Jason Reiss 36:f1053cb17d4f 187 lux.setMode(ISL29011::ALS_CONT);
Jason Reiss 36:f1053cb17d4f 188 lux.setResolution(ISL29011::ADC_16BIT);
Jason Reiss 36:f1053cb17d4f 189 lux.setRange(ISL29011::RNG_64000);
Jason Reiss 36:f1053cb17d4f 190
Jason Reiss 36:f1053cb17d4f 191 // get the latest light sample and send it to the gateway
Jason Reiss 36:f1053cb17d4f 192 light = lux.getData();
Jason Reiss 36:f1053cb17d4f 193 tx_data.push_back((light >> 8) & 0xFF);
Jason Reiss 36:f1053cb17d4f 194 tx_data.push_back(light & 0xFF);
Jason Reiss 36:f1053cb17d4f 195 logInfo("light: %lu [0x%04X]", light, light);
Jason Reiss 36:f1053cb17d4f 196 send_data(tx_data);
Jason Reiss 36:f1053cb17d4f 197
Jason Reiss 36:f1053cb17d4f 198 // put the LSL29011 ambient light sensor into a low power state
Jason Reiss 36:f1053cb17d4f 199 lux.setMode(ISL29011::PWR_DOWN);
Jason Reiss 36:f1053cb17d4f 200 #else
Jason Reiss 36:f1053cb17d4f 201 // get some dummy data and send it to the gateway
Jason Reiss 36:f1053cb17d4f 202 light = lux.read_u16();
Jason Reiss 36:f1053cb17d4f 203 tx_data.push_back((light >> 8) & 0xFF);
Jason Reiss 36:f1053cb17d4f 204 tx_data.push_back(light & 0xFF);
Jason Reiss 36:f1053cb17d4f 205 logInfo("light: %lu [0x%04X]", light, light);
Jason Reiss 36:f1053cb17d4f 206 send_data(tx_data);
Jason Reiss 36:f1053cb17d4f 207 #endif
Jason Reiss 36:f1053cb17d4f 208
Jason Reiss 36:f1053cb17d4f 209 // the Dot can't sleep in class C mode
Jason Reiss 36:f1053cb17d4f 210 // it must be waiting for data from the gateway
Jason Reiss 36:f1053cb17d4f 211 // send data every 30s
Jason Reiss 36:f1053cb17d4f 212 if (Fota::getInstance()->timeToStart() != 0) {
Jason Reiss 36:f1053cb17d4f 213 logInfo("waiting for 30s");
Taylor Heck 42:20f6b29a9903 214 ThisThread::sleep_for(30s);
Jason Reiss 36:f1053cb17d4f 215 } else {
Jason Reiss 36:f1053cb17d4f 216 // Reduce uplinks during FOTA, dot cannot receive while transmitting
Jason Reiss 36:f1053cb17d4f 217 // Too many lost packets will cause FOTA to fail
Jason Reiss 36:f1053cb17d4f 218 logInfo("FOTA starting in %d seconds", Fota::getInstance()->timeToStart());
Jason Reiss 36:f1053cb17d4f 219 logInfo("waiting for 300s");
Taylor Heck 42:20f6b29a9903 220 ThisThread::sleep_for(300s);
Jason Reiss 36:f1053cb17d4f 221 }
Jason Reiss 36:f1053cb17d4f 222
Jason Reiss 36:f1053cb17d4f 223 }
Jason Reiss 36:f1053cb17d4f 224
Jason Reiss 36:f1053cb17d4f 225 return 0;
Jason Reiss 36:f1053cb17d4f 226 }
Jason Reiss 36:f1053cb17d4f 227
Jason Reiss 36:f1053cb17d4f 228 #endif
Jason Reiss 36:f1053cb17d4f 229