This program connects to the The Things Network backend in OTAA Mode. It logs sensor values from a BME 280 to the backend. Tried adding support for Grove GPS using SerialGPS library but it is not working - conflicting with mbed-rtos, so it commented. Deep Sleep for mDot implemented BUT avoiding reprogramming of the mDot config is NOT working.
Dependencies: BME280 SerialGPS libmDot mbed-rtos mbed
main.cpp@5:4bc6ba66f28e, 2016-07-07 (annotated)
- Committer:
- AshuJoshi
- Date:
- Thu Jul 07 01:24:10 2016 +0000
- Revision:
- 5:4bc6ba66f28e
- Parent:
- 4:97f9ad3f2566
- Child:
- 6:35f934e83c74
Added code to configure the network for LoRa / TTN
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AshuJoshi | 0:3ec6a7645098 | 1 | /****************************************************** |
AshuJoshi | 0:3ec6a7645098 | 2 | * A Program to interface the Grove Base Shielf V2 |
AshuJoshi | 0:3ec6a7645098 | 3 | * to the mDot UDK. |
AshuJoshi | 0:3ec6a7645098 | 4 | * Additionally sample code to compress the data |
AshuJoshi | 0:3ec6a7645098 | 5 | * for use with LPWANs such as LoRa |
AshuJoshi | 0:3ec6a7645098 | 6 | *****************************************************/ |
AshuJoshi | 0:3ec6a7645098 | 7 | |
AshuJoshi | 0:3ec6a7645098 | 8 | #include "mbed.h" |
AshuJoshi | 0:3ec6a7645098 | 9 | #include <math.h> |
AshuJoshi | 2:866a72c3c3bf | 10 | #include <string> |
AshuJoshi | 2:866a72c3c3bf | 11 | #include "mDot.h" |
AshuJoshi | 2:866a72c3c3bf | 12 | #include "MTSLog.h" |
AshuJoshi | 2:866a72c3c3bf | 13 | #include "MTSText.h" |
AshuJoshi | 5:4bc6ba66f28e | 14 | //#include "SerialGPS.h" |
AshuJoshi | 1:36e336869699 | 15 | #include "BME280.h" |
AshuJoshi | 4:97f9ad3f2566 | 16 | |
AshuJoshi | 5:4bc6ba66f28e | 17 | |
AshuJoshi | 0:3ec6a7645098 | 18 | |
AshuJoshi | 2:866a72c3c3bf | 19 | using namespace mts; |
AshuJoshi | 2:866a72c3c3bf | 20 | |
AshuJoshi | 2:866a72c3c3bf | 21 | #define MIN(a,b) (((a)<(b))?(a):(b)) |
AshuJoshi | 2:866a72c3c3bf | 22 | #define MAX(a,b) (((a)>(b))?(a):(b)) |
AshuJoshi | 5:4bc6ba66f28e | 23 | |
AshuJoshi | 5:4bc6ba66f28e | 24 | // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> |
AshuJoshi | 5:4bc6ba66f28e | 25 | |
AshuJoshi | 5:4bc6ba66f28e | 26 | // Values as used by The Things Network |
AshuJoshi | 5:4bc6ba66f28e | 27 | // Application session key |
AshuJoshi | 5:4bc6ba66f28e | 28 | uint8_t AppSKey[16]= { 0x91, 0x5F, 0xCD, 0x2A, 0xED, 0x8E, 0x0C, 0x2B, 0x30, 0xEF, 0x35, 0x8D, 0xF7, 0xE7, 0x89, 0x0A }; |
AshuJoshi | 5:4bc6ba66f28e | 29 | // Network session key |
AshuJoshi | 5:4bc6ba66f28e | 30 | uint8_t NwkSKey[16]= { 0x60, 0xBF, 0x44, 0xA9, 0x56, 0x0A, 0x4C, 0xB4, 0xF2, 0xEB, 0xB1, 0x6B, 0x9A, 0x2C, 0x57, 0x32 }; |
AshuJoshi | 5:4bc6ba66f28e | 31 | |
AshuJoshi | 5:4bc6ba66f28e | 32 | // App Key 1DD7BB3D3E43ED13029996BEC25BF190 |
AshuJoshi | 5:4bc6ba66f28e | 33 | uint8_t AppKey[16] = {0x1D, 0xD7, 0xBB, 0x3D, 0x3E, 0x43, 0xED, 0x13, 0x02, 0x99, 0x96, 0xBE, 0xC2, 0x5B, 0xF1, 0x90}; |
AshuJoshi | 5:4bc6ba66f28e | 34 | // App EUI 70B3D57ED00005D5 |
AshuJoshi | 5:4bc6ba66f28e | 35 | uint8_t AppEUI[8] = {0x70, 0xB3, 0xD5, 0x7E, 0xD0, 0x00, 0x05, 0xD5}; |
AshuJoshi | 5:4bc6ba66f28e | 36 | |
AshuJoshi | 5:4bc6ba66f28e | 37 | |
AshuJoshi | 5:4bc6ba66f28e | 38 | // Network Address - Get your own address range at http://thethingsnetwork.org/wiki/AddressSpace |
AshuJoshi | 5:4bc6ba66f28e | 39 | //uint8_t NetworkAddr[4]= {0x02,0x01,0x6C,0x02}; // Our Network address or Node ID |
AshuJoshi | 5:4bc6ba66f28e | 40 | uint8_t NetworkAddr[4] = { 0x08, 0xBE, 0xAB, 0x8A }; |
AshuJoshi | 5:4bc6ba66f28e | 41 | |
AshuJoshi | 5:4bc6ba66f28e | 42 | // Some defines for the LoRa configuration |
AshuJoshi | 5:4bc6ba66f28e | 43 | #define LORA_ACK 0 |
AshuJoshi | 5:4bc6ba66f28e | 44 | #define LORA_TXPOWER 20 |
AshuJoshi | 5:4bc6ba66f28e | 45 | |
AshuJoshi | 5:4bc6ba66f28e | 46 | //Ignoring sub band for EU modules. |
AshuJoshi | 5:4bc6ba66f28e | 47 | static uint8_t config_frequency_sub_band = 7; |
AshuJoshi | 5:4bc6ba66f28e | 48 | |
AshuJoshi | 5:4bc6ba66f28e | 49 | // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< |
AshuJoshi | 5:4bc6ba66f28e | 50 | |
AshuJoshi | 5:4bc6ba66f28e | 51 | |
AshuJoshi | 2:866a72c3c3bf | 52 | |
AshuJoshi | 1:36e336869699 | 53 | // mDot UDK Specific |
AshuJoshi | 1:36e336869699 | 54 | // MDot Pinout: https://developer.mbed.org/platforms/MTS-mDot-F411/#pinout-diagram |
AshuJoshi | 0:3ec6a7645098 | 55 | // Uncomment this line if using a full sized UDK2.0 instead of a Micro UDK |
AshuJoshi | 1:36e336869699 | 56 | |
AshuJoshi | 0:3ec6a7645098 | 57 | #define UDK2 1 |
AshuJoshi | 0:3ec6a7645098 | 58 | #ifdef UDK2 |
AshuJoshi | 0:3ec6a7645098 | 59 | DigitalOut led(LED1); |
AshuJoshi | 0:3ec6a7645098 | 60 | #else |
AshuJoshi | 0:3ec6a7645098 | 61 | DigitalOut led(XBEE_RSSI); |
AshuJoshi | 0:3ec6a7645098 | 62 | #endif |
AshuJoshi | 0:3ec6a7645098 | 63 | |
AshuJoshi | 5:4bc6ba66f28e | 64 | //SerialGPS gps(PA_2, PA_3); |
AshuJoshi | 1:36e336869699 | 65 | //BME280 sensor(I2C_SDA, I2C_SCL) |
AshuJoshi | 1:36e336869699 | 66 | // MDot UDK - I2C_SDA and I2C_SCL connected to PC_9/PA_* |
AshuJoshi | 1:36e336869699 | 67 | BME280 b280(PC_9, PA_8); |
AshuJoshi | 1:36e336869699 | 68 | |
AshuJoshi | 5:4bc6ba66f28e | 69 | // Serial via USB for debugging only |
AshuJoshi | 5:4bc6ba66f28e | 70 | //Serial pc(USBTX,USBRX); |
AshuJoshi | 5:4bc6ba66f28e | 71 | |
AshuJoshi | 1:36e336869699 | 72 | |
AshuJoshi | 0:3ec6a7645098 | 73 | // Globals |
AshuJoshi | 0:3ec6a7645098 | 74 | Ticker tick; |
AshuJoshi | 2:866a72c3c3bf | 75 | mDot* dot; |
AshuJoshi | 2:866a72c3c3bf | 76 | |
AshuJoshi | 0:3ec6a7645098 | 77 | |
AshuJoshi | 0:3ec6a7645098 | 78 | // Function Declarations |
AshuJoshi | 0:3ec6a7645098 | 79 | void endLessTestLoop(); |
AshuJoshi | 0:3ec6a7645098 | 80 | void setUpLEDBlink(); |
AshuJoshi | 0:3ec6a7645098 | 81 | void blink(); |
AshuJoshi | 1:36e336869699 | 82 | void readandprintBME280(); |
AshuJoshi | 2:866a72c3c3bf | 83 | void mDotConfig(); |
AshuJoshi | 2:866a72c3c3bf | 84 | void mDotGotoDeepSleep(int seconds); |
AshuJoshi | 3:5c2bcba214b5 | 85 | void mDotConfigPrint(); |
AshuJoshi | 4:97f9ad3f2566 | 86 | void initSerialGPS(); |
AshuJoshi | 5:4bc6ba66f28e | 87 | void setupNetwork(); |
AshuJoshi | 5:4bc6ba66f28e | 88 | void joinNetwork(); |
AshuJoshi | 2:866a72c3c3bf | 89 | |
AshuJoshi | 0:3ec6a7645098 | 90 | |
AshuJoshi | 0:3ec6a7645098 | 91 | |
AshuJoshi | 0:3ec6a7645098 | 92 | /***************************************************** |
AshuJoshi | 0:3ec6a7645098 | 93 | * MAIN |
AshuJoshi | 0:3ec6a7645098 | 94 | *****************************************************/ |
AshuJoshi | 0:3ec6a7645098 | 95 | int main(){ |
AshuJoshi | 0:3ec6a7645098 | 96 | |
AshuJoshi | 0:3ec6a7645098 | 97 | // Simple Test Functions, "Hello World on UDK |
AshuJoshi | 0:3ec6a7645098 | 98 | setUpLEDBlink(); |
AshuJoshi | 2:866a72c3c3bf | 99 | mDotConfig(); |
AshuJoshi | 5:4bc6ba66f28e | 100 | setupNetwork(); |
AshuJoshi | 3:5c2bcba214b5 | 101 | mDotConfigPrint(); |
AshuJoshi | 4:97f9ad3f2566 | 102 | |
AshuJoshi | 0:3ec6a7645098 | 103 | endLessTestLoop(); |
AshuJoshi | 0:3ec6a7645098 | 104 | |
AshuJoshi | 0:3ec6a7645098 | 105 | return 0; |
AshuJoshi | 0:3ec6a7645098 | 106 | } |
AshuJoshi | 0:3ec6a7645098 | 107 | |
AshuJoshi | 2:866a72c3c3bf | 108 | /***************************************************** |
AshuJoshi | 2:866a72c3c3bf | 109 | * mDot Functions |
AshuJoshi | 2:866a72c3c3bf | 110 | ****************************************************/ |
AshuJoshi | 2:866a72c3c3bf | 111 | |
AshuJoshi | 2:866a72c3c3bf | 112 | |
AshuJoshi | 2:866a72c3c3bf | 113 | void mDotConfig() { |
AshuJoshi | 2:866a72c3c3bf | 114 | // get a mDot handle |
AshuJoshi | 2:866a72c3c3bf | 115 | dot = mDot::getInstance(); |
AshuJoshi | 2:866a72c3c3bf | 116 | //dot->setLogLevel(mts::MTSLog::INFO_LEVEL); |
AshuJoshi | 2:866a72c3c3bf | 117 | dot->setLogLevel(mts::MTSLog::TRACE_LEVEL); |
AshuJoshi | 5:4bc6ba66f28e | 118 | |
AshuJoshi | 2:866a72c3c3bf | 119 | } |
AshuJoshi | 2:866a72c3c3bf | 120 | |
AshuJoshi | 2:866a72c3c3bf | 121 | void mDotGotoDeepSleep(int seconds) { |
AshuJoshi | 2:866a72c3c3bf | 122 | // logInfo("input to sleep routine %d", seconds); |
AshuJoshi | 2:866a72c3c3bf | 123 | // Should sleep here and wakeup after a set interval. |
AshuJoshi | 2:866a72c3c3bf | 124 | uint32_t sleep_time = MAX((dot->getNextTxMs() / 1000), seconds); |
AshuJoshi | 2:866a72c3c3bf | 125 | logInfo("going to sleep for %d seconds", sleep_time); |
AshuJoshi | 2:866a72c3c3bf | 126 | // go to sleep and wake up automatically sleep_time seconds later |
AshuJoshi | 4:97f9ad3f2566 | 127 | //dot->sleep(sleep_time, mDot::RTC_ALARM, false); |
AshuJoshi | 4:97f9ad3f2566 | 128 | dot->sleep(sleep_time, mDot::RTC_ALARM); |
AshuJoshi | 2:866a72c3c3bf | 129 | |
AshuJoshi | 2:866a72c3c3bf | 130 | } |
AshuJoshi | 5:4bc6ba66f28e | 131 | void setupNetwork(){ |
AshuJoshi | 5:4bc6ba66f28e | 132 | int32_t ret; |
AshuJoshi | 5:4bc6ba66f28e | 133 | std::vector<uint8_t> send_data; |
AshuJoshi | 5:4bc6ba66f28e | 134 | std::vector<uint8_t> recv_data; |
AshuJoshi | 5:4bc6ba66f28e | 135 | std::vector<uint8_t> nwkSKey; |
AshuJoshi | 5:4bc6ba66f28e | 136 | std::vector<uint8_t> appSKey; |
AshuJoshi | 5:4bc6ba66f28e | 137 | std::vector<uint8_t> nodeAddr; |
AshuJoshi | 5:4bc6ba66f28e | 138 | std::vector<uint8_t> networkAddr; |
AshuJoshi | 5:4bc6ba66f28e | 139 | // from OTAA |
AshuJoshi | 5:4bc6ba66f28e | 140 | std::vector<uint8_t> appEUI; |
AshuJoshi | 5:4bc6ba66f28e | 141 | std::vector<uint8_t> appKey; |
AshuJoshi | 5:4bc6ba66f28e | 142 | |
AshuJoshi | 5:4bc6ba66f28e | 143 | // get a mDot handle |
AshuJoshi | 5:4bc6ba66f28e | 144 | // already done in mDotConfig |
AshuJoshi | 5:4bc6ba66f28e | 145 | //dot = mDot::getInstance(); |
AshuJoshi | 5:4bc6ba66f28e | 146 | |
AshuJoshi | 5:4bc6ba66f28e | 147 | logInfo("Checking Config"); |
AshuJoshi | 5:4bc6ba66f28e | 148 | |
AshuJoshi | 5:4bc6ba66f28e | 149 | // Test if we've already saved the config |
AshuJoshi | 5:4bc6ba66f28e | 150 | std::string configNetworkName = dot->getNetworkName(); |
AshuJoshi | 5:4bc6ba66f28e | 151 | |
AshuJoshi | 5:4bc6ba66f28e | 152 | uint8_t *it = NwkSKey; |
AshuJoshi | 5:4bc6ba66f28e | 153 | for (uint8_t i = 0; i<16; i++) |
AshuJoshi | 5:4bc6ba66f28e | 154 | nwkSKey.push_back((uint8_t) *it++); |
AshuJoshi | 5:4bc6ba66f28e | 155 | it = AppSKey; |
AshuJoshi | 5:4bc6ba66f28e | 156 | for (uint8_t i = 0; i<16; i++) |
AshuJoshi | 5:4bc6ba66f28e | 157 | appSKey.push_back((uint8_t) *it++); |
AshuJoshi | 5:4bc6ba66f28e | 158 | |
AshuJoshi | 5:4bc6ba66f28e | 159 | |
AshuJoshi | 5:4bc6ba66f28e | 160 | it = AppEUI; |
AshuJoshi | 5:4bc6ba66f28e | 161 | for (uint8_t i = 0; i<8; i++) |
AshuJoshi | 5:4bc6ba66f28e | 162 | appEUI.push_back((uint8_t) *it++); |
AshuJoshi | 5:4bc6ba66f28e | 163 | |
AshuJoshi | 5:4bc6ba66f28e | 164 | it = AppKey; |
AshuJoshi | 5:4bc6ba66f28e | 165 | for (uint8_t i = 0; i<16; i++) |
AshuJoshi | 5:4bc6ba66f28e | 166 | appKey.push_back((uint8_t) *it++); |
AshuJoshi | 5:4bc6ba66f28e | 167 | |
AshuJoshi | 5:4bc6ba66f28e | 168 | it = NetworkAddr; |
AshuJoshi | 5:4bc6ba66f28e | 169 | for (uint8_t i = 0; i<4; i++) |
AshuJoshi | 5:4bc6ba66f28e | 170 | networkAddr.push_back((uint8_t) *it++); |
AshuJoshi | 5:4bc6ba66f28e | 171 | |
AshuJoshi | 5:4bc6ba66f28e | 172 | logInfo("Resetting Config"); |
AshuJoshi | 5:4bc6ba66f28e | 173 | // reset to default config so we know what state we're in |
AshuJoshi | 5:4bc6ba66f28e | 174 | dot->resetConfig(); |
AshuJoshi | 5:4bc6ba66f28e | 175 | |
AshuJoshi | 5:4bc6ba66f28e | 176 | // Set byte order - AEP less than 1.0.30 |
AshuJoshi | 5:4bc6ba66f28e | 177 | //dot->setJoinByteOrder(mDot::MSB); // This is default for > 1.0.30 Conduit |
AshuJoshi | 5:4bc6ba66f28e | 178 | |
AshuJoshi | 5:4bc6ba66f28e | 179 | // Set Spreading Factor, higher is lower data rate, smaller packets but longer range |
AshuJoshi | 5:4bc6ba66f28e | 180 | // Lower is higher data rate, larger packets and shorter range. |
AshuJoshi | 5:4bc6ba66f28e | 181 | logInfo("Set SF"); |
AshuJoshi | 5:4bc6ba66f28e | 182 | //if((ret = dot->setTxDataRate( mDot::SF_10 )) != mDot::MDOT_OK) { |
AshuJoshi | 5:4bc6ba66f28e | 183 | if((ret = dot->setTxDataRate( mDot::SF_8 )) != mDot::MDOT_OK) { |
AshuJoshi | 5:4bc6ba66f28e | 184 | logError("Failed to set SF %d:%s", ret, mDot::getReturnCodeString(ret).c_str()); |
AshuJoshi | 5:4bc6ba66f28e | 185 | } |
AshuJoshi | 5:4bc6ba66f28e | 186 | |
AshuJoshi | 5:4bc6ba66f28e | 187 | //logInfo("Set TxPower"); |
AshuJoshi | 5:4bc6ba66f28e | 188 | //if((ret = dot->setTxPower( LORA_TXPOWER )) != mDot::MDOT_OK) { |
AshuJoshi | 5:4bc6ba66f28e | 189 | // logError("Failed to set Tx Power %d:%s", ret, mDot::getReturnCodeString(ret).c_str()); |
AshuJoshi | 5:4bc6ba66f28e | 190 | //} |
AshuJoshi | 5:4bc6ba66f28e | 191 | |
AshuJoshi | 5:4bc6ba66f28e | 192 | logInfo("Set Public mode"); |
AshuJoshi | 5:4bc6ba66f28e | 193 | if((ret = dot->setPublicNetwork(true)) != mDot::MDOT_OK) { |
AshuJoshi | 5:4bc6ba66f28e | 194 | logError("failed to set Public Mode %d:%s", ret, mDot::getReturnCodeString(ret).c_str()); |
AshuJoshi | 5:4bc6ba66f28e | 195 | } |
AshuJoshi | 5:4bc6ba66f28e | 196 | |
AshuJoshi | 5:4bc6ba66f28e | 197 | //logInfo("Set MANUAL Join mode"); |
AshuJoshi | 5:4bc6ba66f28e | 198 | //if((ret = dot->setJoinMode(mDot::MANUAL)) != mDot::MDOT_OK) { |
AshuJoshi | 5:4bc6ba66f28e | 199 | // logError("Failed to set MANUAL Join Mode %d:%s", ret, mDot::getReturnCodeString(ret).c_str()); |
AshuJoshi | 5:4bc6ba66f28e | 200 | //} |
AshuJoshi | 5:4bc6ba66f28e | 201 | |
AshuJoshi | 5:4bc6ba66f28e | 202 | logInfo("Set AUTO_OTA Join mode"); |
AshuJoshi | 5:4bc6ba66f28e | 203 | if((ret = dot->setJoinMode(mDot::AUTO_OTA)) != mDot::MDOT_OK) { |
AshuJoshi | 5:4bc6ba66f28e | 204 | logError("Failed to set AUTO_OTA Join Mode %d:%s", ret, mDot::getReturnCodeString(ret).c_str()); |
AshuJoshi | 5:4bc6ba66f28e | 205 | } |
AshuJoshi | 5:4bc6ba66f28e | 206 | |
AshuJoshi | 5:4bc6ba66f28e | 207 | logInfo("Set Ack"); |
AshuJoshi | 5:4bc6ba66f28e | 208 | // 1 retries on Ack, 0 to disable |
AshuJoshi | 5:4bc6ba66f28e | 209 | if((ret = dot->setAck( LORA_ACK)) != mDot::MDOT_OK) { |
AshuJoshi | 5:4bc6ba66f28e | 210 | logError("Failed to set Ack %d:%s", ret, mDot::getReturnCodeString(ret).c_str()); |
AshuJoshi | 5:4bc6ba66f28e | 211 | } |
AshuJoshi | 5:4bc6ba66f28e | 212 | |
AshuJoshi | 5:4bc6ba66f28e | 213 | // Not applicable for 868MHz in EU |
AshuJoshi | 5:4bc6ba66f28e | 214 | if ((ret = dot->setFrequencySubBand(config_frequency_sub_band)) != mDot::MDOT_OK) { |
AshuJoshi | 5:4bc6ba66f28e | 215 | logError("Failed to set frequency sub band %s", ret); |
AshuJoshi | 5:4bc6ba66f28e | 216 | } |
AshuJoshi | 5:4bc6ba66f28e | 217 | |
AshuJoshi | 5:4bc6ba66f28e | 218 | logInfo("Set Network Address"); |
AshuJoshi | 5:4bc6ba66f28e | 219 | if ((ret = dot->setNetworkAddress(networkAddr)) != mDot::MDOT_OK) { |
AshuJoshi | 5:4bc6ba66f28e | 220 | logError("Failed to set Network Address %d:%s", ret, mDot::getReturnCodeString(ret).c_str()); |
AshuJoshi | 5:4bc6ba66f28e | 221 | } |
AshuJoshi | 5:4bc6ba66f28e | 222 | |
AshuJoshi | 5:4bc6ba66f28e | 223 | logInfo("Set Data Session Key"); |
AshuJoshi | 5:4bc6ba66f28e | 224 | if ((ret = dot->setDataSessionKey(appSKey)) != mDot::MDOT_OK) { |
AshuJoshi | 5:4bc6ba66f28e | 225 | logError("Failed to set Data Session Key %d:%s", ret, mDot::getReturnCodeString(ret).c_str()); |
AshuJoshi | 5:4bc6ba66f28e | 226 | } |
AshuJoshi | 5:4bc6ba66f28e | 227 | |
AshuJoshi | 5:4bc6ba66f28e | 228 | logInfo("Set Network Session Key"); |
AshuJoshi | 5:4bc6ba66f28e | 229 | if ((ret = dot->setNetworkSessionKey(nwkSKey)) != mDot::MDOT_OK) { |
AshuJoshi | 5:4bc6ba66f28e | 230 | logError("Failed to set Network Session Key %d:%s", ret, mDot::getReturnCodeString(ret).c_str()); |
AshuJoshi | 5:4bc6ba66f28e | 231 | } |
AshuJoshi | 5:4bc6ba66f28e | 232 | |
AshuJoshi | 5:4bc6ba66f28e | 233 | logInfo("Set Network Id"); |
AshuJoshi | 5:4bc6ba66f28e | 234 | if ((ret = dot->setNetworkId(appEUI)) != mDot::MDOT_OK) { |
AshuJoshi | 5:4bc6ba66f28e | 235 | logError("Failed to set Network Id %d:%s", ret, mDot::getReturnCodeString(ret).c_str()); |
AshuJoshi | 5:4bc6ba66f28e | 236 | } |
AshuJoshi | 5:4bc6ba66f28e | 237 | logInfo("Set Network Key"); |
AshuJoshi | 5:4bc6ba66f28e | 238 | if ((ret = dot->setNetworkKey(appKey)) != mDot::MDOT_OK) { |
AshuJoshi | 5:4bc6ba66f28e | 239 | logError("Failed to set Network Id %d:%s", ret, mDot::getReturnCodeString(ret).c_str()); |
AshuJoshi | 5:4bc6ba66f28e | 240 | } |
AshuJoshi | 5:4bc6ba66f28e | 241 | |
AshuJoshi | 5:4bc6ba66f28e | 242 | logInfo("Saving Config"); |
AshuJoshi | 5:4bc6ba66f28e | 243 | // Save config |
AshuJoshi | 5:4bc6ba66f28e | 244 | if (! dot->saveConfig()) { |
AshuJoshi | 5:4bc6ba66f28e | 245 | logError("failed to save configuration"); |
AshuJoshi | 5:4bc6ba66f28e | 246 | } |
AshuJoshi | 5:4bc6ba66f28e | 247 | |
AshuJoshi | 5:4bc6ba66f28e | 248 | //******************************************* |
AshuJoshi | 5:4bc6ba66f28e | 249 | // end of configuration |
AshuJoshi | 5:4bc6ba66f28e | 250 | //******************************************* |
AshuJoshi | 5:4bc6ba66f28e | 251 | |
AshuJoshi | 5:4bc6ba66f28e | 252 | //char dataBuf[50]; |
AshuJoshi | 5:4bc6ba66f28e | 253 | |
AshuJoshi | 5:4bc6ba66f28e | 254 | |
AshuJoshi | 5:4bc6ba66f28e | 255 | |
AshuJoshi | 5:4bc6ba66f28e | 256 | } |
AshuJoshi | 5:4bc6ba66f28e | 257 | |
AshuJoshi | 5:4bc6ba66f28e | 258 | void joinNetwork() { |
AshuJoshi | 5:4bc6ba66f28e | 259 | int32_t ret; |
AshuJoshi | 5:4bc6ba66f28e | 260 | logInfo("Joining Network"); |
AshuJoshi | 5:4bc6ba66f28e | 261 | while ((ret = dot->joinNetwork()) != mDot::MDOT_OK) { |
AshuJoshi | 5:4bc6ba66f28e | 262 | logError("failed to join network [%d][%s]", ret, mDot::getReturnCodeString(ret).c_str()); |
AshuJoshi | 5:4bc6ba66f28e | 263 | //wait_ms(dot->getNextTxMs() + 1); |
AshuJoshi | 5:4bc6ba66f28e | 264 | osDelay(std::max((uint32_t)1000, (uint32_t)dot->getNextTxMs())); |
AshuJoshi | 5:4bc6ba66f28e | 265 | } |
AshuJoshi | 5:4bc6ba66f28e | 266 | logInfo("Joined Network"); |
AshuJoshi | 5:4bc6ba66f28e | 267 | } |
AshuJoshi | 0:3ec6a7645098 | 268 | |
AshuJoshi | 3:5c2bcba214b5 | 269 | void mDotConfigPrint() { |
AshuJoshi | 3:5c2bcba214b5 | 270 | |
AshuJoshi | 3:5c2bcba214b5 | 271 | // Display what is set |
AshuJoshi | 3:5c2bcba214b5 | 272 | printf("\r\n"); |
AshuJoshi | 3:5c2bcba214b5 | 273 | printf(" ********** mDot Configuration ************ \n"); |
AshuJoshi | 5:4bc6ba66f28e | 274 | // print library version information |
AshuJoshi | 5:4bc6ba66f28e | 275 | logInfo("Firmware Version: %s", dot->getId().c_str()); |
AshuJoshi | 5:4bc6ba66f28e | 276 | |
AshuJoshi | 3:5c2bcba214b5 | 277 | std::vector<uint8_t> tmp = dot->getNetworkSessionKey(); |
AshuJoshi | 3:5c2bcba214b5 | 278 | printf("Network Session Key: "); |
AshuJoshi | 3:5c2bcba214b5 | 279 | printf("%s\n", mts::Text::bin2hexString(tmp, " ").c_str()); |
AshuJoshi | 5:4bc6ba66f28e | 280 | |
AshuJoshi | 3:5c2bcba214b5 | 281 | tmp = dot->getDataSessionKey(); |
AshuJoshi | 3:5c2bcba214b5 | 282 | printf("Data Session Key: "); |
AshuJoshi | 3:5c2bcba214b5 | 283 | printf("%s\n", mts::Text::bin2hexString(tmp, " ").c_str()); |
AshuJoshi | 3:5c2bcba214b5 | 284 | |
AshuJoshi | 3:5c2bcba214b5 | 285 | tmp = dot->getNetworkId(); |
AshuJoshi | 3:5c2bcba214b5 | 286 | printf("App EUI: "); |
AshuJoshi | 3:5c2bcba214b5 | 287 | printf("%s\n", mts::Text::bin2hexString(tmp, " ").c_str()); |
AshuJoshi | 3:5c2bcba214b5 | 288 | |
AshuJoshi | 3:5c2bcba214b5 | 289 | tmp = dot->getNetworkKey(); |
AshuJoshi | 3:5c2bcba214b5 | 290 | printf("App Key: "); |
AshuJoshi | 3:5c2bcba214b5 | 291 | printf("%s\n", mts::Text::bin2hexString(tmp, " ").c_str()); |
AshuJoshi | 3:5c2bcba214b5 | 292 | |
AshuJoshi | 3:5c2bcba214b5 | 293 | printf("Device ID "); |
AshuJoshi | 3:5c2bcba214b5 | 294 | std::vector<uint8_t> deviceId; |
AshuJoshi | 3:5c2bcba214b5 | 295 | deviceId = dot->getDeviceId(); |
AshuJoshi | 3:5c2bcba214b5 | 296 | for (std::vector<uint8_t>::iterator it = deviceId.begin() ; it != deviceId.end(); ++it) |
AshuJoshi | 3:5c2bcba214b5 | 297 | printf("%2.2x",*it ); |
AshuJoshi | 3:5c2bcba214b5 | 298 | printf("\n"); |
AshuJoshi | 3:5c2bcba214b5 | 299 | std::vector<uint8_t> netAddress; |
AshuJoshi | 3:5c2bcba214b5 | 300 | |
AshuJoshi | 3:5c2bcba214b5 | 301 | printf("Network Address "); |
AshuJoshi | 3:5c2bcba214b5 | 302 | netAddress = dot->getNetworkAddress(); |
AshuJoshi | 3:5c2bcba214b5 | 303 | for (std::vector<uint8_t>::iterator it = netAddress.begin() ; it != netAddress.end(); ++it) |
AshuJoshi | 3:5c2bcba214b5 | 304 | printf("%2.2x",*it ); |
AshuJoshi | 3:5c2bcba214b5 | 305 | printf("\n"); |
AshuJoshi | 3:5c2bcba214b5 | 306 | |
AshuJoshi | 3:5c2bcba214b5 | 307 | // Display LoRa parameters |
AshuJoshi | 3:5c2bcba214b5 | 308 | // Display label and values in different colours, show pretty values not numeric values where applicable |
AshuJoshi | 3:5c2bcba214b5 | 309 | printf("Public Network: %s\n", (char*)(dot->getPublicNetwork() ? "Yes" : "No") ); |
AshuJoshi | 3:5c2bcba214b5 | 310 | printf("Frequency: %s\n", (char*)mDot::FrequencyBandStr(dot->getFrequencyBand()).c_str() ); |
AshuJoshi | 3:5c2bcba214b5 | 311 | printf("Sub Band: %s\n", (char*)mDot::FrequencySubBandStr(dot->getFrequencySubBand()).c_str() ); |
AshuJoshi | 3:5c2bcba214b5 | 312 | printf("Join Mode: %s\n", (char*)mDot::JoinModeStr(dot->getJoinMode()).c_str() ); |
AshuJoshi | 3:5c2bcba214b5 | 313 | printf("Join Retries: %d\n", dot->getJoinRetries() ); |
AshuJoshi | 3:5c2bcba214b5 | 314 | printf("Join Byte Order: %s\n", (char*)(dot->getJoinByteOrder() == 0 ? "LSB" : "MSB") ); |
AshuJoshi | 3:5c2bcba214b5 | 315 | printf("Link Check Count: %d\n", dot->getLinkCheckCount() ); |
AshuJoshi | 3:5c2bcba214b5 | 316 | printf("Link Check Thold: %d\n", dot->getLinkCheckThreshold() ); |
AshuJoshi | 3:5c2bcba214b5 | 317 | printf("Tx Data Rate: %s\n", (char*)mDot::DataRateStr(dot->getTxDataRate()).c_str() ); |
AshuJoshi | 3:5c2bcba214b5 | 318 | printf("Tx Power: %d\n", dot->getTxPower() ); |
AshuJoshi | 3:5c2bcba214b5 | 319 | printf("TxWait: %s, ", (dot->getTxWait() ? "Y" : "N" )); |
AshuJoshi | 3:5c2bcba214b5 | 320 | printf("CRC: %s, ", (dot->getCrc() ? "Y" : "N") ); |
AshuJoshi | 3:5c2bcba214b5 | 321 | printf("Ack: %s\n", (dot->getAck() ? "Y" : "N") ); |
AshuJoshi | 3:5c2bcba214b5 | 322 | |
AshuJoshi | 3:5c2bcba214b5 | 323 | |
AshuJoshi | 3:5c2bcba214b5 | 324 | |
AshuJoshi | 3:5c2bcba214b5 | 325 | } |
AshuJoshi | 3:5c2bcba214b5 | 326 | |
AshuJoshi | 0:3ec6a7645098 | 327 | |
AshuJoshi | 0:3ec6a7645098 | 328 | |
AshuJoshi | 1:36e336869699 | 329 | /***************************************************** |
AshuJoshi | 1:36e336869699 | 330 | * Sensor Functions |
AshuJoshi | 1:36e336869699 | 331 | ****************************************************/ |
AshuJoshi | 0:3ec6a7645098 | 332 | |
AshuJoshi | 1:36e336869699 | 333 | void readandprintBME280() { |
AshuJoshi | 2:866a72c3c3bf | 334 | float temperature; |
AshuJoshi | 2:866a72c3c3bf | 335 | float pressure; |
AshuJoshi | 2:866a72c3c3bf | 336 | float humidity; |
AshuJoshi | 2:866a72c3c3bf | 337 | char string_buffer[64]; |
AshuJoshi | 5:4bc6ba66f28e | 338 | //time_t secs; |
AshuJoshi | 4:97f9ad3f2566 | 339 | |
AshuJoshi | 5:4bc6ba66f28e | 340 | //secs = time(NULL); |
AshuJoshi | 5:4bc6ba66f28e | 341 | //printf("Seconds since January 1, 1970: %d\n", secs); |
AshuJoshi | 5:4bc6ba66f28e | 342 | //printf("Time as a basic string = %s", ctime(&secs)); |
AshuJoshi | 2:866a72c3c3bf | 343 | |
AshuJoshi | 2:866a72c3c3bf | 344 | // Temperature |
AshuJoshi | 2:866a72c3c3bf | 345 | temperature = b280.getTemperature(); |
AshuJoshi | 2:866a72c3c3bf | 346 | sprintf(string_buffer, "%s%3.2f", "TC:", temperature); |
AshuJoshi | 2:866a72c3c3bf | 347 | logInfo("The temperature is %s", string_buffer); |
AshuJoshi | 2:866a72c3c3bf | 348 | // Pressure |
AshuJoshi | 2:866a72c3c3bf | 349 | pressure = b280.getPressure(); |
AshuJoshi | 2:866a72c3c3bf | 350 | sprintf(string_buffer, "%s%04.2f", "hPa:", pressure); |
AshuJoshi | 2:866a72c3c3bf | 351 | logInfo("The pressure is %s", string_buffer); |
AshuJoshi | 2:866a72c3c3bf | 352 | // Humidity |
AshuJoshi | 2:866a72c3c3bf | 353 | humidity = b280.getHumidity(); |
AshuJoshi | 2:866a72c3c3bf | 354 | sprintf(string_buffer, "%s%03.2f", "H%:", humidity); |
AshuJoshi | 2:866a72c3c3bf | 355 | logInfo("The humidty is %s", string_buffer); |
AshuJoshi | 2:866a72c3c3bf | 356 | |
AshuJoshi | 5:4bc6ba66f28e | 357 | //printf("%2.2f degC, %04.2f hPa, %2.2f %%\n", temperature, pressure, humidity); |
AshuJoshi | 1:36e336869699 | 358 | } |
AshuJoshi | 0:3ec6a7645098 | 359 | |
AshuJoshi | 0:3ec6a7645098 | 360 | |
AshuJoshi | 0:3ec6a7645098 | 361 | |
AshuJoshi | 0:3ec6a7645098 | 362 | /***************************************************** |
AshuJoshi | 1:36e336869699 | 363 | * FUNCTIONS for Simple Testing |
AshuJoshi | 1:36e336869699 | 364 | ****************************************************/ |
AshuJoshi | 0:3ec6a7645098 | 365 | |
AshuJoshi | 0:3ec6a7645098 | 366 | void setUpLEDBlink(){ |
AshuJoshi | 0:3ec6a7645098 | 367 | // configure the Ticker to blink the LED on 500ms interval |
AshuJoshi | 0:3ec6a7645098 | 368 | tick.attach(&blink, 0.5); |
AshuJoshi | 0:3ec6a7645098 | 369 | } |
AshuJoshi | 0:3ec6a7645098 | 370 | |
AshuJoshi | 0:3ec6a7645098 | 371 | void endLessTestLoop() { |
AshuJoshi | 0:3ec6a7645098 | 372 | while(true) { |
AshuJoshi | 1:36e336869699 | 373 | // printf("Hello world!\r\n"); |
AshuJoshi | 1:36e336869699 | 374 | printf("BME280 Sensor: \n"); |
AshuJoshi | 1:36e336869699 | 375 | readandprintBME280(); |
AshuJoshi | 2:866a72c3c3bf | 376 | |
AshuJoshi | 5:4bc6ba66f28e | 377 | wait(5); |
AshuJoshi | 5:4bc6ba66f28e | 378 | //mDotGotoDeepSleep(60); |
AshuJoshi | 4:97f9ad3f2566 | 379 | //wait(5); |
AshuJoshi | 2:866a72c3c3bf | 380 | |
AshuJoshi | 0:3ec6a7645098 | 381 | } |
AshuJoshi | 0:3ec6a7645098 | 382 | } |
AshuJoshi | 0:3ec6a7645098 | 383 | |
AshuJoshi | 0:3ec6a7645098 | 384 | // Callback function to change LED state |
AshuJoshi | 0:3ec6a7645098 | 385 | void blink() { |
AshuJoshi | 0:3ec6a7645098 | 386 | led = !led; |
AshuJoshi | 4:97f9ad3f2566 | 387 | } |
AshuJoshi | 4:97f9ad3f2566 | 388 | |
AshuJoshi | 4:97f9ad3f2566 | 389 |