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