Using the mDot to receive data.
Dependencies: libmDot-dev-mbed5-deprecated ISL29011
Fork of mdot-examples by
receive_main.cpp@4:ee3739e513a9, 2018-04-14 (annotated)
- Committer:
- SDesign2018
- Date:
- Sat Apr 14 17:47:26 2018 +0000
- Revision:
- 4:ee3739e513a9
- Parent:
- 3:6bd9904f6c3e
Parsing data packet is working fine, need to add the rest of the GPS location and dates.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
SDesign2018 | 2:b44a9032fcc5 | 1 | /* |
SDesign2018 | 2:b44a9032fcc5 | 2 | 3/27/2018 mdot version 3.1.0, mbed version 5.7.4 |
SDesign2018 | 2:b44a9032fcc5 | 3 | */ |
SDesign2018 | 2:b44a9032fcc5 | 4 | |
SDesign2018 | 2:b44a9032fcc5 | 5 | #include "dot_util.h" |
SDesign2018 | 2:b44a9032fcc5 | 6 | #include "RadioEvent.h" |
SDesign2018 | 2:b44a9032fcc5 | 7 | #include <string.h> |
SDesign2018 | 3:6bd9904f6c3e | 8 | #include <cstdlib> |
SDesign2018 | 4:ee3739e513a9 | 9 | #include <stdlib.h> |
SDesign2018 | 2:b44a9032fcc5 | 10 | |
SDesign2018 | 2:b44a9032fcc5 | 11 | #if ACTIVE_EXAMPLE == PEER_TO_PEER_EXAMPLE |
SDesign2018 | 2:b44a9032fcc5 | 12 | |
SDesign2018 | 2:b44a9032fcc5 | 13 | ///////////////////////////////////////////////////////////////////////////// |
SDesign2018 | 2:b44a9032fcc5 | 14 | // -------------------- DOT LIBRARY REQUIRED ------------------------------// |
SDesign2018 | 2:b44a9032fcc5 | 15 | // * Because these example programs can be used for both mDot and xDot // |
SDesign2018 | 2:b44a9032fcc5 | 16 | // devices, the LoRa stack is not included. The libmDot library should // |
SDesign2018 | 2:b44a9032fcc5 | 17 | // be imported if building for mDot devices. The libxDot library // |
SDesign2018 | 2:b44a9032fcc5 | 18 | // should be imported if building for xDot devices. // |
SDesign2018 | 2:b44a9032fcc5 | 19 | // * https://developer.mbed.org/teams/MultiTech/code/libmDot-dev-mbed5/ // |
SDesign2018 | 2:b44a9032fcc5 | 20 | // * https://developer.mbed.org/teams/MultiTech/code/libmDot-mbed5/ // |
SDesign2018 | 2:b44a9032fcc5 | 21 | // * https://developer.mbed.org/teams/MultiTech/code/libxDot-dev-mbed5/ // |
SDesign2018 | 2:b44a9032fcc5 | 22 | // * https://developer.mbed.org/teams/MultiTech/code/libxDot-mbed5/ // |
SDesign2018 | 2:b44a9032fcc5 | 23 | ///////////////////////////////////////////////////////////////////////////// |
SDesign2018 | 2:b44a9032fcc5 | 24 | |
SDesign2018 | 2:b44a9032fcc5 | 25 | ///////////////////////////////////////////////////////////// |
SDesign2018 | 2:b44a9032fcc5 | 26 | // * these options must match between the two devices in // |
SDesign2018 | 2:b44a9032fcc5 | 27 | // order for communication to be successful |
SDesign2018 | 2:b44a9032fcc5 | 28 | ///////////////////////////////////////////////////////////// |
SDesign2018 | 2:b44a9032fcc5 | 29 | static uint8_t network_address[] = { 0x00, 0x11, 0x22, 0x33 }; |
SDesign2018 | 2:b44a9032fcc5 | 30 | static uint8_t network_session_key[] = { 0x00, 0x11, 0x22, 0x33, 0x00, 0x11, 0x22, 0x33, 0x00, 0x11, 0x22, 0x33, 0x00, 0x11, 0x22, 0x33 }; |
SDesign2018 | 2:b44a9032fcc5 | 31 | static uint8_t data_session_key[] = { 0x33, 0x22, 0x11, 0x00, 0x33, 0x22, 0x11, 0x00, 0x33, 0x22, 0x11, 0x00, 0x33, 0x22, 0x11, 0x00 }; |
SDesign2018 | 2:b44a9032fcc5 | 32 | |
SDesign2018 | 2:b44a9032fcc5 | 33 | mDot* dot = NULL; |
SDesign2018 | 2:b44a9032fcc5 | 34 | lora::ChannelPlan* plan = NULL; |
SDesign2018 | 2:b44a9032fcc5 | 35 | |
SDesign2018 | 2:b44a9032fcc5 | 36 | Serial pc(USBTX, USBRX); |
SDesign2018 | 2:b44a9032fcc5 | 37 | |
SDesign2018 | 3:6bd9904f6c3e | 38 | |
SDesign2018 | 3:6bd9904f6c3e | 39 | // Storage for int conversions |
SDesign2018 | 3:6bd9904f6c3e | 40 | unsigned int i_Temperature; |
SDesign2018 | 3:6bd9904f6c3e | 41 | unsigned int i_X; |
SDesign2018 | 3:6bd9904f6c3e | 42 | unsigned int i_Y; |
SDesign2018 | 3:6bd9904f6c3e | 43 | unsigned int i_Z; |
SDesign2018 | 3:6bd9904f6c3e | 44 | |
SDesign2018 | 4:ee3739e513a9 | 45 | // Storage for GPS |
SDesign2018 | 4:ee3739e513a9 | 46 | float f_longitude; |
SDesign2018 | 4:ee3739e513a9 | 47 | float f_latitude; |
SDesign2018 | 4:ee3739e513a9 | 48 | int hour; |
SDesign2018 | 4:ee3739e513a9 | 49 | int minutes; |
SDesign2018 | 4:ee3739e513a9 | 50 | int seconds; |
SDesign2018 | 4:ee3739e513a9 | 51 | int milliseconds; |
SDesign2018 | 4:ee3739e513a9 | 52 | int day; |
SDesign2018 | 4:ee3739e513a9 | 53 | int month; |
SDesign2018 | 4:ee3739e513a9 | 54 | int year; |
SDesign2018 | 4:ee3739e513a9 | 55 | |
SDesign2018 | 3:6bd9904f6c3e | 56 | // Storage for twos complement |
SDesign2018 | 3:6bd9904f6c3e | 57 | unsigned int i2s_Temperature; |
SDesign2018 | 3:6bd9904f6c3e | 58 | unsigned int i2s_X; |
SDesign2018 | 3:6bd9904f6c3e | 59 | unsigned int i2s_Y; |
SDesign2018 | 3:6bd9904f6c3e | 60 | unsigned int i2s_Z; |
SDesign2018 | 3:6bd9904f6c3e | 61 | |
SDesign2018 | 4:ee3739e513a9 | 62 | // Variables to receiving data |
SDesign2018 | 4:ee3739e513a9 | 63 | std::string whatData = ""; |
SDesign2018 | 4:ee3739e513a9 | 64 | int i_whatData = 0; |
SDesign2018 | 4:ee3739e513a9 | 65 | std::string typeData = ""; |
SDesign2018 | 4:ee3739e513a9 | 66 | unsigned int i_typeData = 0; |
SDesign2018 | 4:ee3739e513a9 | 67 | int whereDataTypeFlag = 0; |
SDesign2018 | 4:ee3739e513a9 | 68 | std::string s_temperature = ""; |
SDesign2018 | 4:ee3739e513a9 | 69 | std::string s_XData = ""; |
SDesign2018 | 4:ee3739e513a9 | 70 | std::string s_YData = ""; |
SDesign2018 | 4:ee3739e513a9 | 71 | std::string s_ZData = ""; |
SDesign2018 | 4:ee3739e513a9 | 72 | |
SDesign2018 | 3:6bd9904f6c3e | 73 | unsigned int twosComplement(unsigned int value, unsigned int resolutionMask,unsigned int bitMask); |
SDesign2018 | 3:6bd9904f6c3e | 74 | |
SDesign2018 | 2:b44a9032fcc5 | 75 | |
SDesign2018 | 2:b44a9032fcc5 | 76 | class myEvent : public mDotEvent |
SDesign2018 | 2:b44a9032fcc5 | 77 | { |
SDesign2018 | 2:b44a9032fcc5 | 78 | |
SDesign2018 | 2:b44a9032fcc5 | 79 | public: |
SDesign2018 | 2:b44a9032fcc5 | 80 | myEvent() {} |
SDesign2018 | 2:b44a9032fcc5 | 81 | |
SDesign2018 | 2:b44a9032fcc5 | 82 | virtual ~myEvent() { |
SDesign2018 | 2:b44a9032fcc5 | 83 | } |
SDesign2018 | 2:b44a9032fcc5 | 84 | |
SDesign2018 | 2:b44a9032fcc5 | 85 | /*! |
SDesign2018 | 2:b44a9032fcc5 | 86 | * MAC layer event callback prototype. |
SDesign2018 | 2:b44a9032fcc5 | 87 | * |
SDesign2018 | 2:b44a9032fcc5 | 88 | * \param [IN] flags Bit field indicating the MAC events occurred |
SDesign2018 | 2:b44a9032fcc5 | 89 | * \param [IN] info Details about MAC events occurred |
SDesign2018 | 2:b44a9032fcc5 | 90 | */ |
SDesign2018 | 2:b44a9032fcc5 | 91 | virtual void MacEvent(LoRaMacEventFlags* flags, LoRaMacEventInfo* info) { |
SDesign2018 | 2:b44a9032fcc5 | 92 | |
SDesign2018 | 2:b44a9032fcc5 | 93 | |
SDesign2018 | 2:b44a9032fcc5 | 94 | if (flags->Bits.Rx) { |
SDesign2018 | 2:b44a9032fcc5 | 95 | |
SDesign2018 | 2:b44a9032fcc5 | 96 | //logDebug("Rx %d bytes", info->RxBufferSize); |
SDesign2018 | 2:b44a9032fcc5 | 97 | if (info->RxBufferSize > 0) { |
SDesign2018 | 3:6bd9904f6c3e | 98 | |
SDesign2018 | 4:ee3739e513a9 | 99 | |
SDesign2018 | 2:b44a9032fcc5 | 100 | std::string data = mts::Text::bin2hexString(info->RxBuffer, info->RxBufferSize).c_str(); |
SDesign2018 | 2:b44a9032fcc5 | 101 | |
SDesign2018 | 2:b44a9032fcc5 | 102 | |
SDesign2018 | 2:b44a9032fcc5 | 103 | |
SDesign2018 | 2:b44a9032fcc5 | 104 | // print RX data as string and hexadecimal |
SDesign2018 | 2:b44a9032fcc5 | 105 | std::string rx((const char*)info->RxBuffer, info->RxBufferSize); |
SDesign2018 | 3:6bd9904f6c3e | 106 | pc.printf("Receive data: %s [%s]\r\n", rx.c_str(), data.c_str()); |
SDesign2018 | 2:b44a9032fcc5 | 107 | pc.printf("Data is of length: %d\n\r", data.length()); |
SDesign2018 | 2:b44a9032fcc5 | 108 | |
SDesign2018 | 4:ee3739e513a9 | 109 | // whereDataTypeFlag = data.find("01"); |
SDesign2018 | 4:ee3739e513a9 | 110 | // s_temperature = data.substr(whereDataTypeFlag + 2, 4); |
SDesign2018 | 4:ee3739e513a9 | 111 | // data.erase(0,6); |
SDesign2018 | 2:b44a9032fcc5 | 112 | |
SDesign2018 | 4:ee3739e513a9 | 113 | // whereDataTypeFlag = data.find("02"); |
SDesign2018 | 4:ee3739e513a9 | 114 | // s_XData = data.substr(whereDataTypeFlag + 2, 4); |
SDesign2018 | 4:ee3739e513a9 | 115 | |
SDesign2018 | 4:ee3739e513a9 | 116 | // whereDataTypeFlag = data.find("03"); |
SDesign2018 | 4:ee3739e513a9 | 117 | // s_YData = data.substr(whereDataTypeFlag + 2, 4); |
SDesign2018 | 4:ee3739e513a9 | 118 | |
SDesign2018 | 4:ee3739e513a9 | 119 | // whereDataTypeFlag = data.find("04"); |
SDesign2018 | 4:ee3739e513a9 | 120 | // s_ZData = data.substr(whereDataTypeFlag + 2, 4); |
SDesign2018 | 2:b44a9032fcc5 | 121 | |
SDesign2018 | 4:ee3739e513a9 | 122 | while(data != "") |
SDesign2018 | 4:ee3739e513a9 | 123 | { |
SDesign2018 | 4:ee3739e513a9 | 124 | typeData = data.substr(0,2); |
SDesign2018 | 4:ee3739e513a9 | 125 | data.erase(0,2); |
SDesign2018 | 4:ee3739e513a9 | 126 | //whatData = data.substr(0,4); |
SDesign2018 | 4:ee3739e513a9 | 127 | //data.erase(0,4); |
SDesign2018 | 4:ee3739e513a9 | 128 | //i_whatData = atoi(typeData.c_str()); |
SDesign2018 | 4:ee3739e513a9 | 129 | |
SDesign2018 | 4:ee3739e513a9 | 130 | i_typeData = strtoul(typeData.c_str(), NULL, 16); |
SDesign2018 | 4:ee3739e513a9 | 131 | switch(i_typeData) |
SDesign2018 | 4:ee3739e513a9 | 132 | { |
SDesign2018 | 4:ee3739e513a9 | 133 | // Temperature |
SDesign2018 | 4:ee3739e513a9 | 134 | case 1: |
SDesign2018 | 4:ee3739e513a9 | 135 | whatData = data.substr(0,4); |
SDesign2018 | 4:ee3739e513a9 | 136 | data.erase(0,4); |
SDesign2018 | 4:ee3739e513a9 | 137 | s_temperature = whatData; |
SDesign2018 | 4:ee3739e513a9 | 138 | i_Temperature = strtoul(whatData.c_str(),NULL, 16); |
SDesign2018 | 4:ee3739e513a9 | 139 | |
SDesign2018 | 4:ee3739e513a9 | 140 | break; |
SDesign2018 | 4:ee3739e513a9 | 141 | |
SDesign2018 | 4:ee3739e513a9 | 142 | // X Data |
SDesign2018 | 4:ee3739e513a9 | 143 | case 2: |
SDesign2018 | 4:ee3739e513a9 | 144 | whatData = data.substr(0,4); |
SDesign2018 | 4:ee3739e513a9 | 145 | data.erase(0,4); |
SDesign2018 | 4:ee3739e513a9 | 146 | s_XData = whatData; |
SDesign2018 | 4:ee3739e513a9 | 147 | i_X = strtoul(whatData.c_str(), NULL, 16); |
SDesign2018 | 4:ee3739e513a9 | 148 | break; |
SDesign2018 | 4:ee3739e513a9 | 149 | |
SDesign2018 | 4:ee3739e513a9 | 150 | // Y Data |
SDesign2018 | 4:ee3739e513a9 | 151 | case 3: |
SDesign2018 | 4:ee3739e513a9 | 152 | whatData = data.substr(0,4); |
SDesign2018 | 4:ee3739e513a9 | 153 | data.erase(0,4); |
SDesign2018 | 4:ee3739e513a9 | 154 | s_YData = whatData; |
SDesign2018 | 4:ee3739e513a9 | 155 | i_Y = strtoul(whatData.c_str(), NULL, 16); |
SDesign2018 | 4:ee3739e513a9 | 156 | break; |
SDesign2018 | 4:ee3739e513a9 | 157 | |
SDesign2018 | 4:ee3739e513a9 | 158 | // Z Data |
SDesign2018 | 4:ee3739e513a9 | 159 | case 4: |
SDesign2018 | 4:ee3739e513a9 | 160 | whatData = data.substr(0,4); |
SDesign2018 | 4:ee3739e513a9 | 161 | data.erase(0,4); |
SDesign2018 | 4:ee3739e513a9 | 162 | s_ZData = whatData; |
SDesign2018 | 4:ee3739e513a9 | 163 | i_Z = strtoul(whatData.c_str(), NULL, 16); |
SDesign2018 | 4:ee3739e513a9 | 164 | break; |
SDesign2018 | 4:ee3739e513a9 | 165 | // Longitude |
SDesign2018 | 4:ee3739e513a9 | 166 | case 5: |
SDesign2018 | 4:ee3739e513a9 | 167 | whatData = data.substr(0,4); |
SDesign2018 | 4:ee3739e513a9 | 168 | data.erase(0,4); |
SDesign2018 | 4:ee3739e513a9 | 169 | f_longitude = atof(whatData.c_str()); |
SDesign2018 | 4:ee3739e513a9 | 170 | break; |
SDesign2018 | 4:ee3739e513a9 | 171 | |
SDesign2018 | 4:ee3739e513a9 | 172 | // Latitude |
SDesign2018 | 4:ee3739e513a9 | 173 | case 6: |
SDesign2018 | 4:ee3739e513a9 | 174 | whatData = data.substr(0,4); |
SDesign2018 | 4:ee3739e513a9 | 175 | data.erase(0,4); |
SDesign2018 | 4:ee3739e513a9 | 176 | f_longitude = atof(whatData.c_str()); |
SDesign2018 | 4:ee3739e513a9 | 177 | break; |
SDesign2018 | 4:ee3739e513a9 | 178 | |
SDesign2018 | 4:ee3739e513a9 | 179 | // Hour |
SDesign2018 | 4:ee3739e513a9 | 180 | case 7: |
SDesign2018 | 4:ee3739e513a9 | 181 | whatData = data.substr(0,4); |
SDesign2018 | 4:ee3739e513a9 | 182 | data.erase(0,4); |
SDesign2018 | 4:ee3739e513a9 | 183 | hour = strtoul(whatData.c_str(), NULL, 16); |
SDesign2018 | 4:ee3739e513a9 | 184 | break; |
SDesign2018 | 4:ee3739e513a9 | 185 | |
SDesign2018 | 4:ee3739e513a9 | 186 | // minutes |
SDesign2018 | 4:ee3739e513a9 | 187 | case 8: |
SDesign2018 | 4:ee3739e513a9 | 188 | whatData = data.substr(0,4); |
SDesign2018 | 4:ee3739e513a9 | 189 | data.erase(0,4); |
SDesign2018 | 4:ee3739e513a9 | 190 | minutes = atoi(whatData.c_str()); |
SDesign2018 | 4:ee3739e513a9 | 191 | break; |
SDesign2018 | 4:ee3739e513a9 | 192 | |
SDesign2018 | 4:ee3739e513a9 | 193 | default: |
SDesign2018 | 4:ee3739e513a9 | 194 | break; |
SDesign2018 | 4:ee3739e513a9 | 195 | |
SDesign2018 | 4:ee3739e513a9 | 196 | |
SDesign2018 | 4:ee3739e513a9 | 197 | } |
SDesign2018 | 4:ee3739e513a9 | 198 | |
SDesign2018 | 4:ee3739e513a9 | 199 | } |
SDesign2018 | 2:b44a9032fcc5 | 200 | |
SDesign2018 | 4:ee3739e513a9 | 201 | // i_Temperature = strtoul(s_temperature.c_str(), NULL, 16); |
SDesign2018 | 4:ee3739e513a9 | 202 | // i_X = strtoul(s_XData.c_str(), NULL, 16); |
SDesign2018 | 4:ee3739e513a9 | 203 | // i_Y = strtoul(s_YData.c_str(), NULL, 16); |
SDesign2018 | 4:ee3739e513a9 | 204 | // i_Z = strtoul(s_ZData.c_str(), NULL, 16); |
SDesign2018 | 3:6bd9904f6c3e | 205 | |
SDesign2018 | 3:6bd9904f6c3e | 206 | // 0x1FFF->only needs 13bits, 0x1000->13th bit is sign bit |
SDesign2018 | 3:6bd9904f6c3e | 207 | i2s_Temperature = twosComplement(i_Temperature, 0x1FFF, 0x1000); |
SDesign2018 | 3:6bd9904f6c3e | 208 | |
SDesign2018 | 3:6bd9904f6c3e | 209 | // 0x0FFF->resolution is 12bits, 0x0800->12th bit is sign bit |
SDesign2018 | 3:6bd9904f6c3e | 210 | i2s_X = twosComplement(i_X, 0x0FFF, 0x0800); |
SDesign2018 | 3:6bd9904f6c3e | 211 | i2s_Y = twosComplement(i_Y, 0x0FFF, 0x0800); |
SDesign2018 | 3:6bd9904f6c3e | 212 | i2s_Z = twosComplement(i_Z, 0x0FFF, 0x0800); |
SDesign2018 | 3:6bd9904f6c3e | 213 | |
SDesign2018 | 3:6bd9904f6c3e | 214 | // Stoi not in mbed |
SDesign2018 | 3:6bd9904f6c3e | 215 | // i_Temperature = std::stoi(s_temperature,nullptr,16); |
SDesign2018 | 3:6bd9904f6c3e | 216 | // i_X = std::stoi(s_XData,nullptr,16); |
SDesign2018 | 3:6bd9904f6c3e | 217 | // i_Y = std::stoi(s_YData,nullptr,16); |
SDesign2018 | 3:6bd9904f6c3e | 218 | // i_Z = std::stoi(s_ZData,nullptr,16); |
SDesign2018 | 3:6bd9904f6c3e | 219 | |
SDesign2018 | 3:6bd9904f6c3e | 220 | // atoi freezes |
SDesign2018 | 3:6bd9904f6c3e | 221 | // i_Temperature = std::atoi(s_temperature.c_str()); |
SDesign2018 | 3:6bd9904f6c3e | 222 | // i_X = std::atoi(s_XData.c_str()); |
SDesign2018 | 3:6bd9904f6c3e | 223 | // i_Y = std::atoi(s_YData.c_str()); |
SDesign2018 | 3:6bd9904f6c3e | 224 | // i_Z = std::atoi(s_ZData.c_str()); |
SDesign2018 | 3:6bd9904f6c3e | 225 | |
SDesign2018 | 3:6bd9904f6c3e | 226 | // pc.printf("Temperature is: %s\n\r", s_temperature); |
SDesign2018 | 3:6bd9904f6c3e | 227 | // pc.printf("X: %s \n\r", s_XData); |
SDesign2018 | 3:6bd9904f6c3e | 228 | // pc.printf("Y: %s \n\r", s_YData); |
SDesign2018 | 3:6bd9904f6c3e | 229 | // pc.printf("Z: %s \n\r", s_ZData); |
SDesign2018 | 3:6bd9904f6c3e | 230 | |
SDesign2018 | 3:6bd9904f6c3e | 231 | pc.printf("Temperature is: %d (%d)[%s]\n\r", i2s_Temperature, i_Temperature, s_temperature.c_str()); |
SDesign2018 | 3:6bd9904f6c3e | 232 | pc.printf("X: %d (%d) [%s]\n\r", i2s_X, i_X, s_XData.c_str()); |
SDesign2018 | 3:6bd9904f6c3e | 233 | pc.printf("Y: %d (%d) [%s]\n\r", i2s_Y, i_Y, s_YData.c_str()); |
SDesign2018 | 3:6bd9904f6c3e | 234 | pc.printf("Z: %d (%d) [%s]\n\r", i2s_Z, i_Z, s_ZData.c_str()); |
SDesign2018 | 2:b44a9032fcc5 | 235 | |
SDesign2018 | 2:b44a9032fcc5 | 236 | |
SDesign2018 | 2:b44a9032fcc5 | 237 | |
SDesign2018 | 2:b44a9032fcc5 | 238 | |
SDesign2018 | 2:b44a9032fcc5 | 239 | |
SDesign2018 | 2:b44a9032fcc5 | 240 | /*for(; it < 2; it++) |
SDesign2018 | 2:b44a9032fcc5 | 241 | { |
SDesign2018 | 2:b44a9032fcc5 | 242 | whatData = strcat(whatData,data[it]) |
SDesign2018 | 2:b44a9032fcc5 | 243 | } |
SDesign2018 | 2:b44a9032fcc5 | 244 | pc.printf("%s is the first 2 numbers\n\r", whatData);*/ |
SDesign2018 | 2:b44a9032fcc5 | 245 | |
SDesign2018 | 2:b44a9032fcc5 | 246 | } |
SDesign2018 | 2:b44a9032fcc5 | 247 | } |
SDesign2018 | 2:b44a9032fcc5 | 248 | } |
SDesign2018 | 2:b44a9032fcc5 | 249 | }; |
SDesign2018 | 2:b44a9032fcc5 | 250 | |
SDesign2018 | 3:6bd9904f6c3e | 251 | /* |
SDesign2018 | 3:6bd9904f6c3e | 252 | @Param: |
SDesign2018 | 3:6bd9904f6c3e | 253 | value: pass by value, the value you want to evaluate for twos complement |
SDesign2018 | 3:6bd9904f6c3e | 254 | resolutionMask: declare at function call, hex representation of which bits are unneeded |
SDesign2018 | 3:6bd9904f6c3e | 255 | bitMask: declare at function call, hex representation of which bit is sign bit |
SDesign2018 | 3:6bd9904f6c3e | 256 | @return: |
SDesign2018 | 3:6bd9904f6c3e | 257 | unsigned int converted value, if needed |
SDesign2018 | 3:6bd9904f6c3e | 258 | */ |
SDesign2018 | 3:6bd9904f6c3e | 259 | unsigned int twosComplement(unsigned int value, unsigned int resolutionMask,unsigned int bitMask) |
SDesign2018 | 3:6bd9904f6c3e | 260 | { |
SDesign2018 | 3:6bd9904f6c3e | 261 | if(value & bitMask) |
SDesign2018 | 3:6bd9904f6c3e | 262 | { |
SDesign2018 | 3:6bd9904f6c3e | 263 | value = ~value; |
SDesign2018 | 3:6bd9904f6c3e | 264 | value = value & resolutionMask; |
SDesign2018 | 3:6bd9904f6c3e | 265 | value += 1; |
SDesign2018 | 3:6bd9904f6c3e | 266 | } |
SDesign2018 | 3:6bd9904f6c3e | 267 | |
SDesign2018 | 3:6bd9904f6c3e | 268 | return value; |
SDesign2018 | 3:6bd9904f6c3e | 269 | } |
SDesign2018 | 3:6bd9904f6c3e | 270 | |
SDesign2018 | 2:b44a9032fcc5 | 271 | int main() { |
SDesign2018 | 2:b44a9032fcc5 | 272 | // Custom event handler for automatically displaying RX data |
SDesign2018 | 2:b44a9032fcc5 | 273 | //RadioEvent events; |
SDesign2018 | 2:b44a9032fcc5 | 274 | myEvent _event; |
SDesign2018 | 2:b44a9032fcc5 | 275 | |
SDesign2018 | 2:b44a9032fcc5 | 276 | uint32_t tx_frequency; |
SDesign2018 | 2:b44a9032fcc5 | 277 | uint8_t tx_datarate; |
SDesign2018 | 2:b44a9032fcc5 | 278 | uint8_t tx_power; |
SDesign2018 | 2:b44a9032fcc5 | 279 | uint8_t frequency_band; |
SDesign2018 | 2:b44a9032fcc5 | 280 | uint32_t receiveStatus; |
SDesign2018 | 2:b44a9032fcc5 | 281 | |
SDesign2018 | 2:b44a9032fcc5 | 282 | pc.baud(115200); |
SDesign2018 | 2:b44a9032fcc5 | 283 | |
SDesign2018 | 2:b44a9032fcc5 | 284 | mts::MTSLog::setLogLevel(mts::MTSLog::TRACE_LEVEL); |
SDesign2018 | 2:b44a9032fcc5 | 285 | |
SDesign2018 | 2:b44a9032fcc5 | 286 | |
SDesign2018 | 2:b44a9032fcc5 | 287 | plan = new lora::ChannelPlan_US915(); |
SDesign2018 | 2:b44a9032fcc5 | 288 | |
SDesign2018 | 2:b44a9032fcc5 | 289 | logInfo("Now asserting"); |
SDesign2018 | 2:b44a9032fcc5 | 290 | assert(plan); |
SDesign2018 | 2:b44a9032fcc5 | 291 | |
SDesign2018 | 2:b44a9032fcc5 | 292 | dot = mDot::getInstance(plan); |
SDesign2018 | 2:b44a9032fcc5 | 293 | assert(dot); |
SDesign2018 | 2:b44a9032fcc5 | 294 | |
SDesign2018 | 2:b44a9032fcc5 | 295 | logInfo("mbed-os library version: %d", MBED_LIBRARY_VERSION); |
SDesign2018 | 2:b44a9032fcc5 | 296 | |
SDesign2018 | 2:b44a9032fcc5 | 297 | // start from a well-known state |
SDesign2018 | 2:b44a9032fcc5 | 298 | logInfo("defaulting Dot configuration"); |
SDesign2018 | 2:b44a9032fcc5 | 299 | dot->resetConfig(); |
SDesign2018 | 2:b44a9032fcc5 | 300 | |
SDesign2018 | 2:b44a9032fcc5 | 301 | |
SDesign2018 | 2:b44a9032fcc5 | 302 | // make sure library logging is turned on |
SDesign2018 | 2:b44a9032fcc5 | 303 | dot->setLogLevel(mts::MTSLog::INFO_LEVEL); |
SDesign2018 | 2:b44a9032fcc5 | 304 | |
SDesign2018 | 2:b44a9032fcc5 | 305 | // attach the custom events handler |
SDesign2018 | 2:b44a9032fcc5 | 306 | //dot->setEvents(&events); |
SDesign2018 | 2:b44a9032fcc5 | 307 | dot->setEvents(&_event); |
SDesign2018 | 2:b44a9032fcc5 | 308 | |
SDesign2018 | 2:b44a9032fcc5 | 309 | // update configuration if necessary |
SDesign2018 | 2:b44a9032fcc5 | 310 | if (dot->getJoinMode() != mDot::PEER_TO_PEER) { |
SDesign2018 | 2:b44a9032fcc5 | 311 | logInfo("changing network join mode to PEER_TO_PEER"); |
SDesign2018 | 2:b44a9032fcc5 | 312 | if (dot->setJoinMode(mDot::PEER_TO_PEER) != mDot::MDOT_OK) { |
SDesign2018 | 2:b44a9032fcc5 | 313 | logError("failed to set network join mode to PEER_TO_PEER"); |
SDesign2018 | 2:b44a9032fcc5 | 314 | } |
SDesign2018 | 2:b44a9032fcc5 | 315 | } |
SDesign2018 | 2:b44a9032fcc5 | 316 | frequency_band = dot->getFrequencyBand(); |
SDesign2018 | 2:b44a9032fcc5 | 317 | switch (frequency_band) { |
SDesign2018 | 2:b44a9032fcc5 | 318 | case lora::ChannelPlan::EU868_OLD: |
SDesign2018 | 2:b44a9032fcc5 | 319 | case lora::ChannelPlan::EU868: |
SDesign2018 | 2:b44a9032fcc5 | 320 | // 250kHz channels achieve higher throughput |
SDesign2018 | 2:b44a9032fcc5 | 321 | // DR_6 : SF7 @ 250kHz |
SDesign2018 | 2:b44a9032fcc5 | 322 | // DR_0 - DR_5 (125kHz channels) available but much slower |
SDesign2018 | 2:b44a9032fcc5 | 323 | tx_frequency = 869850000; |
SDesign2018 | 2:b44a9032fcc5 | 324 | tx_datarate = lora::DR_6; |
SDesign2018 | 2:b44a9032fcc5 | 325 | // the 869850000 frequency is 100% duty cycle if the total power is under 7 dBm - tx power 4 + antenna gain 3 = 7 |
SDesign2018 | 2:b44a9032fcc5 | 326 | tx_power = 4; |
SDesign2018 | 2:b44a9032fcc5 | 327 | break; |
SDesign2018 | 2:b44a9032fcc5 | 328 | |
SDesign2018 | 2:b44a9032fcc5 | 329 | case lora::ChannelPlan::US915_OLD: |
SDesign2018 | 2:b44a9032fcc5 | 330 | case lora::ChannelPlan::US915: |
SDesign2018 | 2:b44a9032fcc5 | 331 | case lora::ChannelPlan::AU915_OLD: |
SDesign2018 | 2:b44a9032fcc5 | 332 | case lora::ChannelPlan::AU915: |
SDesign2018 | 2:b44a9032fcc5 | 333 | // 500kHz channels achieve highest throughput |
SDesign2018 | 2:b44a9032fcc5 | 334 | // DR_8 : SF12 @ 500kHz |
SDesign2018 | 2:b44a9032fcc5 | 335 | // DR_9 : SF11 @ 500kHz |
SDesign2018 | 2:b44a9032fcc5 | 336 | // DR_10 : SF10 @ 500kHz |
SDesign2018 | 2:b44a9032fcc5 | 337 | // DR_11 : SF9 @ 500kHz |
SDesign2018 | 2:b44a9032fcc5 | 338 | // DR_12 : SF8 @ 500kHz |
SDesign2018 | 2:b44a9032fcc5 | 339 | // DR_13 : SF7 @ 500kHz |
SDesign2018 | 2:b44a9032fcc5 | 340 | // DR_0 - DR_3 (125kHz channels) available but much slower |
SDesign2018 | 2:b44a9032fcc5 | 341 | tx_frequency = 915500000; |
SDesign2018 | 2:b44a9032fcc5 | 342 | tx_datarate = lora::DR_13; |
SDesign2018 | 2:b44a9032fcc5 | 343 | // 915 bands have no duty cycle restrictions, set tx power to max |
SDesign2018 | 2:b44a9032fcc5 | 344 | tx_power = 20; |
SDesign2018 | 2:b44a9032fcc5 | 345 | break; |
SDesign2018 | 2:b44a9032fcc5 | 346 | |
SDesign2018 | 2:b44a9032fcc5 | 347 | case lora::ChannelPlan::AS923: |
SDesign2018 | 2:b44a9032fcc5 | 348 | case lora::ChannelPlan::AS923_JAPAN: |
SDesign2018 | 2:b44a9032fcc5 | 349 | // 250kHz channels achieve higher throughput |
SDesign2018 | 2:b44a9032fcc5 | 350 | // DR_6 : SF7 @ 250kHz |
SDesign2018 | 2:b44a9032fcc5 | 351 | // DR_0 - DR_5 (125kHz channels) available but much slower |
SDesign2018 | 2:b44a9032fcc5 | 352 | tx_frequency = 924800000; |
SDesign2018 | 2:b44a9032fcc5 | 353 | tx_datarate = lora::DR_6; |
SDesign2018 | 2:b44a9032fcc5 | 354 | tx_power = 16; |
SDesign2018 | 2:b44a9032fcc5 | 355 | break; |
SDesign2018 | 2:b44a9032fcc5 | 356 | |
SDesign2018 | 2:b44a9032fcc5 | 357 | case lora::ChannelPlan::KR920: |
SDesign2018 | 2:b44a9032fcc5 | 358 | // DR_5 : SF7 @ 125kHz |
SDesign2018 | 2:b44a9032fcc5 | 359 | tx_frequency = 922700000; |
SDesign2018 | 2:b44a9032fcc5 | 360 | tx_datarate = lora::DR_5; |
SDesign2018 | 2:b44a9032fcc5 | 361 | tx_power = 14; |
SDesign2018 | 2:b44a9032fcc5 | 362 | break; |
SDesign2018 | 2:b44a9032fcc5 | 363 | |
SDesign2018 | 2:b44a9032fcc5 | 364 | default: |
SDesign2018 | 2:b44a9032fcc5 | 365 | while (true) { |
SDesign2018 | 2:b44a9032fcc5 | 366 | logFatal("no known channel plan in use - extra configuration is needed!"); |
SDesign2018 | 2:b44a9032fcc5 | 367 | wait(5); |
SDesign2018 | 2:b44a9032fcc5 | 368 | } |
SDesign2018 | 2:b44a9032fcc5 | 369 | break; |
SDesign2018 | 2:b44a9032fcc5 | 370 | } |
SDesign2018 | 2:b44a9032fcc5 | 371 | // in PEER_TO_PEER mode there is no join request/response transaction |
SDesign2018 | 2:b44a9032fcc5 | 372 | // as long as both Dots are configured correctly, they should be able to communicate |
SDesign2018 | 2:b44a9032fcc5 | 373 | update_peer_to_peer_config(network_address, network_session_key, data_session_key, tx_frequency, tx_datarate, tx_power); |
SDesign2018 | 2:b44a9032fcc5 | 374 | |
SDesign2018 | 2:b44a9032fcc5 | 375 | // save changes to configuration |
SDesign2018 | 2:b44a9032fcc5 | 376 | logInfo("saving configuration"); |
SDesign2018 | 2:b44a9032fcc5 | 377 | if (!dot->saveConfig()) { |
SDesign2018 | 2:b44a9032fcc5 | 378 | logError("failed to save configuration"); |
SDesign2018 | 2:b44a9032fcc5 | 379 | } |
SDesign2018 | 2:b44a9032fcc5 | 380 | |
SDesign2018 | 2:b44a9032fcc5 | 381 | // display configuration |
SDesign2018 | 2:b44a9032fcc5 | 382 | display_config(); |
SDesign2018 | 2:b44a9032fcc5 | 383 | // |
SDesign2018 | 2:b44a9032fcc5 | 384 | //#if defined(TARGET_XDOT_L151CC) |
SDesign2018 | 2:b44a9032fcc5 | 385 | // // configure the ISL29011 sensor on the xDot-DK for continuous ambient light sampling, 16 bit conversion, and maximum range |
SDesign2018 | 2:b44a9032fcc5 | 386 | // lux.setMode(ISL29011::ALS_CONT); |
SDesign2018 | 2:b44a9032fcc5 | 387 | // lux.setResolution(ISL29011::ADC_16BIT); |
SDesign2018 | 2:b44a9032fcc5 | 388 | // lux.setRange(ISL29011::RNG_64000); |
SDesign2018 | 2:b44a9032fcc5 | 389 | //#endif |
SDesign2018 | 2:b44a9032fcc5 | 390 | |
SDesign2018 | 2:b44a9032fcc5 | 391 | |
SDesign2018 | 2:b44a9032fcc5 | 392 | while (true) { |
SDesign2018 | 2:b44a9032fcc5 | 393 | |
SDesign2018 | 2:b44a9032fcc5 | 394 | std::vector<uint8_t> rx_data; |
SDesign2018 | 2:b44a9032fcc5 | 395 | |
SDesign2018 | 2:b44a9032fcc5 | 396 | // join network if not joined |
SDesign2018 | 2:b44a9032fcc5 | 397 | if (!dot->getNetworkJoinStatus()) { |
SDesign2018 | 2:b44a9032fcc5 | 398 | join_network(); |
SDesign2018 | 2:b44a9032fcc5 | 399 | } |
SDesign2018 | 2:b44a9032fcc5 | 400 | |
SDesign2018 | 2:b44a9032fcc5 | 401 | |
SDesign2018 | 2:b44a9032fcc5 | 402 | |
SDesign2018 | 2:b44a9032fcc5 | 403 | } |
SDesign2018 | 2:b44a9032fcc5 | 404 | |
SDesign2018 | 2:b44a9032fcc5 | 405 | return 0; |
SDesign2018 | 2:b44a9032fcc5 | 406 | } |
SDesign2018 | 2:b44a9032fcc5 | 407 | |
SDesign2018 | 2:b44a9032fcc5 | 408 | #endif |
SDesign2018 | 2:b44a9032fcc5 | 409 |