Factory firmware for the MultiTech Dotbox (MTDOT-BOX) and EVB (MTDOT-EVB) products.

Dependencies:   NCP5623B GpsParser ISL29011 libmDot-mbed5 MTS-Serial MMA845x DOGS102 MPL3115A2

MTDOT-BOX/EVB Firmware Description

This Firmware is what ships on DotBox and EVB devices. It is intended to be used as a proof of concept and site survey tool for planning LoRa deployments. The firmware provides a number of different modes of operation:

  • Configuration - Use AT commands to configure network credentials, TX power, TX data rate, view the survey data file, etc.
  • Survey Single - Test network connectivity at current location at a specific TX power and TX data rate. Uplink information, downlink information, and GPS information are saved to the survey data file and can also be sent to the gateway.
  • Survey Sweep - Test network connectivity at current location across a range of TX powers and TX data rates. Uplink information, downlink information, and GPS information for each survey in the sweep are saved to the survey data file and can also be sent to the gateway.
  • LoRa Demo - Gather data from onboard sensors and display it on the screen in real time. Send packets containing sensor data to the gateway either on an interval or when triggered by the user. GPS data is not transmitted.
  • Survey GPS - Gather sensor and GPS data and transmit it to the gateway either on an interval or when triggered by the user. Add padding to packets, switch frequency sub bands, TX power, TX data rate, and more all without exiting Survey GPS Mode.
  • View Data - View the survey data file on the screen one survey at a time.

Additional documentation and information for the MTDOT-BOX/EVB Factory Firmware can be found here.


Dot Libraries

Dot Library Limitations

The commit messages in libmDot-mbed5 and libmDot-dev-mbed5 specify the version of the Dot library the commit contains and the version of mbed-os it was compiled against. We recommend building your application with the version of mbed-os specified in the commit message of the version of the Dot library you're using. This will ensure that you don't run into any runtime issues caused by differences in the mbed-os versions.

Development library for mDot.

[Repository '/teams/MultiTech/code/libmDot-dev-mbed5/' not found]

Stable library for mDot.

Import librarylibmDot-mbed5

Stable version of the mDot library for mbed 5. This version of the library is suitable for deployment scenarios. See lastest commit message for version of mbed-os library that has been tested against.

Committer:
Mike Fiore
Date:
Fri Nov 04 17:27:05 2016 -0500
Revision:
7:a31236c2e75c
Child:
12:05435282f899
update from git revision 2.1.2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Mike Fiore 7:a31236c2e75c 1 /* Copyright (c) <2016> <MultiTech Systems>, MIT License
Mike Fiore 7:a31236c2e75c 2 *
Mike Fiore 7:a31236c2e75c 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
Mike Fiore 7:a31236c2e75c 4 * and associated documentation files (the "Software"), to deal in the Software without restriction,
Mike Fiore 7:a31236c2e75c 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
Mike Fiore 7:a31236c2e75c 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
Mike Fiore 7:a31236c2e75c 7 * furnished to do so, subject to the following conditions:
Mike Fiore 7:a31236c2e75c 8 *
Mike Fiore 7:a31236c2e75c 9 * The above copyright notice and this permission notice shall be included in all copies or
Mike Fiore 7:a31236c2e75c 10 * substantial portions of the Software.
Mike Fiore 7:a31236c2e75c 11 *
Mike Fiore 7:a31236c2e75c 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
Mike Fiore 7:a31236c2e75c 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
Mike Fiore 7:a31236c2e75c 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
Mike Fiore 7:a31236c2e75c 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Mike Fiore 7:a31236c2e75c 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Mike Fiore 7:a31236c2e75c 17 */
Mike Fiore 7:a31236c2e75c 18
Mike Fiore 7:a31236c2e75c 19 #include "ModeGps.h"
Mike Fiore 7:a31236c2e75c 20 #include "MTSLog.h"
Mike Fiore 7:a31236c2e75c 21 #include "rtos.h"
Mike Fiore 7:a31236c2e75c 22 #include "mbed.h"
Mike Fiore 7:a31236c2e75c 23 #include "limits.h"
Mike Fiore 7:a31236c2e75c 24 #define PACKETSIZE 11
Mike Fiore 7:a31236c2e75c 25
Mike Fiore 7:a31236c2e75c 26 ModeGps::ModeGps(DOGS102* lcd, ButtonHandler* buttons, mDot* dot, LoRaHandler* lora, GPSPARSER* gps, SensorHandler* sensors, ModeJoin* join)
Mike Fiore 7:a31236c2e75c 27 : Mode(lcd, buttons, dot, lora, gps, sensors),
Mike Fiore 7:a31236c2e75c 28 _help(lcd),
Mike Fiore 7:a31236c2e75c 29 _sem(lcd, _band),
Mike Fiore 7:a31236c2e75c 30 _sem_join(lcd, _band),
Mike Fiore 7:a31236c2e75c 31 _join(join)
Mike Fiore 7:a31236c2e75c 32 {}
Mike Fiore 7:a31236c2e75c 33
Mike Fiore 7:a31236c2e75c 34 string ModeGps::intToString(int num){
Mike Fiore 7:a31236c2e75c 35 char buf[3];
Mike Fiore 7:a31236c2e75c 36 snprintf(buf, sizeof(buf), "%d", num);
Mike Fiore 7:a31236c2e75c 37 return buf;
Mike Fiore 7:a31236c2e75c 38 }
Mike Fiore 7:a31236c2e75c 39
Mike Fiore 7:a31236c2e75c 40 void ModeGps::init(){
Mike Fiore 7:a31236c2e75c 41 //resets all parameters when re-entering mode
Mike Fiore 7:a31236c2e75c 42 _interval = 5;
Mike Fiore 7:a31236c2e75c 43 _padding = 0;
Mike Fiore 7:a31236c2e75c 44 _power = 20;
Mike Fiore 7:a31236c2e75c 45 _band = _dot->getFrequencyBand();
Mike Fiore 7:a31236c2e75c 46 _parameter = POWER;
Mike Fiore 7:a31236c2e75c 47 _drAll = false;
Mike Fiore 7:a31236c2e75c 48 _link_check = false;
Mike Fiore 7:a31236c2e75c 49 _GPS = false;
Mike Fiore 7:a31236c2e75c 50 _sub_band = _dot->getFrequencySubBand();
Mike Fiore 7:a31236c2e75c 51 _data_rate = mDot::DR0;
Mike Fiore 7:a31236c2e75c 52 _max_padding = _dot->getMaxPacketLength() - PACKETSIZE;
Mike Fiore 7:a31236c2e75c 53 _Sw2 = "Power";
Mike Fiore 7:a31236c2e75c 54 _Sw1 = intToString(_power);
Mike Fiore 7:a31236c2e75c 55 _help.display();
Mike Fiore 7:a31236c2e75c 56 osDelay(2000);
Mike Fiore 7:a31236c2e75c 57
Mike Fiore 7:a31236c2e75c 58 if(_band == mDot::FB_EU868){
Mike Fiore 7:a31236c2e75c 59 _sem.display(_link_check, _snr, _rssi, _power, _sub_band, _padding, _data_rate);
Mike Fiore 7:a31236c2e75c 60 _sem.initial();
Mike Fiore 7:a31236c2e75c 61 _state = PARAMETERS;
Mike Fiore 7:a31236c2e75c 62 _send_timer.start();
Mike Fiore 7:a31236c2e75c 63 } else { _state = BAND_CHANGE;
Mike Fiore 7:a31236c2e75c 64 _sem_join.displayEditFsb(_data_rate, _power, _sub_band, _dot->getNetworkName(), _dot->getNetworkPassphrase());
Mike Fiore 7:a31236c2e75c 65 }
Mike Fiore 7:a31236c2e75c 66 }
Mike Fiore 7:a31236c2e75c 67
Mike Fiore 7:a31236c2e75c 68 void ModeGps::drIncrement(){
Mike Fiore 7:a31236c2e75c 69 _data_rate++;
Mike Fiore 7:a31236c2e75c 70 if ((_data_rate > mDot::DR4 && (_band == mDot::FB_US915 || _band == mDot::FB_AU915)) || _data_rate > mDot::DR6) {
Mike Fiore 7:a31236c2e75c 71 _drAll = true;
Mike Fiore 7:a31236c2e75c 72 _data_rate = 0;
Mike Fiore 7:a31236c2e75c 73 }
Mike Fiore 7:a31236c2e75c 74 _dot->setTxDataRate(_data_rate);
Mike Fiore 7:a31236c2e75c 75 logInfo("new data rate %s, POWER %lu", mDot::DataRateStr(_data_rate).c_str(), _power);
Mike Fiore 7:a31236c2e75c 76 _max_padding = _dot->getMaxPacketLength() - PACKETSIZE;
Mike Fiore 7:a31236c2e75c 77 }
Mike Fiore 7:a31236c2e75c 78
Mike Fiore 7:a31236c2e75c 79 void ModeGps::changeDataRate(){
Mike Fiore 7:a31236c2e75c 80 if(_drAll) {
Mike Fiore 7:a31236c2e75c 81 _data_rate = -1;
Mike Fiore 7:a31236c2e75c 82 _drAll = false;
Mike Fiore 7:a31236c2e75c 83 }
Mike Fiore 7:a31236c2e75c 84 drIncrement();
Mike Fiore 7:a31236c2e75c 85 }
Mike Fiore 7:a31236c2e75c 86
Mike Fiore 7:a31236c2e75c 87 void ModeGps::changeParameter(){
Mike Fiore 7:a31236c2e75c 88 _parameter++;
Mike Fiore 7:a31236c2e75c 89 if(_band == mDot::FB_EU868 && _parameter == FSB){
Mike Fiore 7:a31236c2e75c 90 _parameter++;
Mike Fiore 7:a31236c2e75c 91 }
Mike Fiore 7:a31236c2e75c 92 if(_parameter>INTERVAL){
Mike Fiore 7:a31236c2e75c 93 _parameter = 0;
Mike Fiore 7:a31236c2e75c 94 }
Mike Fiore 7:a31236c2e75c 95 switch(_parameter) {
Mike Fiore 7:a31236c2e75c 96 case DATA_RATE:
Mike Fiore 7:a31236c2e75c 97 _Sw2 = "Data Rate";
Mike Fiore 7:a31236c2e75c 98 _Sw1 = intToString(_data_rate);
Mike Fiore 7:a31236c2e75c 99 if(_drAll){
Mike Fiore 7:a31236c2e75c 100 _Sw1 = "All";
Mike Fiore 7:a31236c2e75c 101 }
Mike Fiore 7:a31236c2e75c 102 break;
Mike Fiore 7:a31236c2e75c 103 case FSB:
Mike Fiore 7:a31236c2e75c 104 _Sw2 = "FSB";
Mike Fiore 7:a31236c2e75c 105 _Sw1 = intToString(_sub_band);
Mike Fiore 7:a31236c2e75c 106 break;
Mike Fiore 7:a31236c2e75c 107 case PADDING:
Mike Fiore 7:a31236c2e75c 108 _Sw2 = "Padding";
Mike Fiore 7:a31236c2e75c 109 _Sw1 = intToString(_padding);
Mike Fiore 7:a31236c2e75c 110 break;
Mike Fiore 7:a31236c2e75c 111 case POWER:
Mike Fiore 7:a31236c2e75c 112 _Sw2 = "Power";
Mike Fiore 7:a31236c2e75c 113 _Sw1 = intToString(_power);
Mike Fiore 7:a31236c2e75c 114 break;
Mike Fiore 7:a31236c2e75c 115 case INTERVAL:
Mike Fiore 7:a31236c2e75c 116 _Sw2 = "Interval";
Mike Fiore 7:a31236c2e75c 117 _Sw1 = intToString(_interval);
Mike Fiore 7:a31236c2e75c 118 break;
Mike Fiore 7:a31236c2e75c 119 default:
Mike Fiore 7:a31236c2e75c 120 break;
Mike Fiore 7:a31236c2e75c 121 }
Mike Fiore 7:a31236c2e75c 122 }
Mike Fiore 7:a31236c2e75c 123
Mike Fiore 7:a31236c2e75c 124 void ModeGps::editParameter(){
Mike Fiore 7:a31236c2e75c 125 switch(_parameter) {
Mike Fiore 7:a31236c2e75c 126 case POWER:
Mike Fiore 7:a31236c2e75c 127 if(_power<20){
Mike Fiore 7:a31236c2e75c 128 _power+=3;
Mike Fiore 7:a31236c2e75c 129 } else {
Mike Fiore 7:a31236c2e75c 130 _power = 2;
Mike Fiore 7:a31236c2e75c 131 }
Mike Fiore 7:a31236c2e75c 132 _Sw1 = intToString(_power);
Mike Fiore 7:a31236c2e75c 133 _dot->setTxPower(_power);
Mike Fiore 7:a31236c2e75c 134 break;
Mike Fiore 7:a31236c2e75c 135
Mike Fiore 7:a31236c2e75c 136 case DATA_RATE:
Mike Fiore 7:a31236c2e75c 137 changeDataRate();
Mike Fiore 7:a31236c2e75c 138 if(_drAll) {
Mike Fiore 7:a31236c2e75c 139 _Sw1="All";
Mike Fiore 7:a31236c2e75c 140 } else {
Mike Fiore 7:a31236c2e75c 141 _Sw1 = intToString(_data_rate);
Mike Fiore 7:a31236c2e75c 142 }
Mike Fiore 7:a31236c2e75c 143 break;
Mike Fiore 7:a31236c2e75c 144
Mike Fiore 7:a31236c2e75c 145 case FSB:
Mike Fiore 7:a31236c2e75c 146 _send_timer.stop();
Mike Fiore 7:a31236c2e75c 147 _send_timer.reset();
Mike Fiore 7:a31236c2e75c 148 _state = BAND_CHANGE;
Mike Fiore 7:a31236c2e75c 149 _dot->resetNetworkSession();
Mike Fiore 7:a31236c2e75c 150 _lora->resetActivityLed();
Mike Fiore 7:a31236c2e75c 151 _sem_join.displayEditFsb(mDot::DR0, 20, _sub_band, _dot->getNetworkName(), _dot->getNetworkPassphrase());
Mike Fiore 7:a31236c2e75c 152 break;
Mike Fiore 7:a31236c2e75c 153
Mike Fiore 7:a31236c2e75c 154 case PADDING:
Mike Fiore 7:a31236c2e75c 155 if(_padding<_max_padding){
Mike Fiore 7:a31236c2e75c 156 _padding += 10 - (_padding % 10);
Mike Fiore 7:a31236c2e75c 157 } else {
Mike Fiore 7:a31236c2e75c 158 _padding = 0;
Mike Fiore 7:a31236c2e75c 159 }
Mike Fiore 7:a31236c2e75c 160 if(_padding>_max_padding){
Mike Fiore 7:a31236c2e75c 161 _padding = _max_padding;
Mike Fiore 7:a31236c2e75c 162 }
Mike Fiore 7:a31236c2e75c 163 _Sw1 = intToString(_padding);
Mike Fiore 7:a31236c2e75c 164 break;
Mike Fiore 7:a31236c2e75c 165
Mike Fiore 7:a31236c2e75c 166 default:
Mike Fiore 7:a31236c2e75c 167 if(_interval<60){
Mike Fiore 7:a31236c2e75c 168 _interval += 5;
Mike Fiore 7:a31236c2e75c 169 } else {
Mike Fiore 7:a31236c2e75c 170 _interval = 5;
Mike Fiore 7:a31236c2e75c 171 }
Mike Fiore 7:a31236c2e75c 172 _Sw1 = intToString(_interval);
Mike Fiore 7:a31236c2e75c 173 break;
Mike Fiore 7:a31236c2e75c 174 }
Mike Fiore 7:a31236c2e75c 175 }
Mike Fiore 7:a31236c2e75c 176
Mike Fiore 7:a31236c2e75c 177 void ModeGps::formatData(){
Mike Fiore 7:a31236c2e75c 178 _send_data.clear();
Mike Fiore 7:a31236c2e75c 179 uint32_t lat = 0;
Mike Fiore 7:a31236c2e75c 180 uint32_t lng = 0;
Mike Fiore 7:a31236c2e75c 181 double degrees = 0;
Mike Fiore 7:a31236c2e75c 182 double minutes = 0;
Mike Fiore 7:a31236c2e75c 183 double seconds = 0;
Mike Fiore 7:a31236c2e75c 184 _temp_C += 0.5;
Mike Fiore 7:a31236c2e75c 185
Mike Fiore 7:a31236c2e75c 186 if(_GPS) {
Mike Fiore 7:a31236c2e75c 187 degrees = _latitude.degrees;
Mike Fiore 7:a31236c2e75c 188 minutes = _latitude.minutes;
Mike Fiore 7:a31236c2e75c 189 seconds = _latitude.seconds;
Mike Fiore 7:a31236c2e75c 190 if(degrees<0) {
Mike Fiore 7:a31236c2e75c 191 lat = ~(int)((degrees - minutes/60.0 - seconds/600000.0)*(-INT_MAX/90.0 + 1.5));
Mike Fiore 7:a31236c2e75c 192 } else {
Mike Fiore 7:a31236c2e75c 193 lat = (int)((degrees + minutes/60.0 + seconds/600000.0)*(INT_MAX/90.0 + 0.5));
Mike Fiore 7:a31236c2e75c 194 }
Mike Fiore 7:a31236c2e75c 195 degrees = _longitude.degrees;
Mike Fiore 7:a31236c2e75c 196 minutes = _longitude.minutes;
Mike Fiore 7:a31236c2e75c 197 seconds = _longitude.seconds;
Mike Fiore 7:a31236c2e75c 198 if(degrees<0) {
Mike Fiore 7:a31236c2e75c 199 lng = ~(int)((degrees - minutes/60.0 - seconds/600000.0)*(-INT_MAX/180.0 + 1.5));
Mike Fiore 7:a31236c2e75c 200 } else {
Mike Fiore 7:a31236c2e75c 201 lng = (int)((degrees + minutes/60.0 + seconds/600000.0)*(INT_MAX/180.0 + 0.5));
Mike Fiore 7:a31236c2e75c 202 }
Mike Fiore 7:a31236c2e75c 203 }
Mike Fiore 7:a31236c2e75c 204 _send_data.push_back(0);
Mike Fiore 7:a31236c2e75c 205 _send_data.push_back((int8_t) _temp_C);
Mike Fiore 7:a31236c2e75c 206 _send_data.push_back(0);
Mike Fiore 7:a31236c2e75c 207 for(int i=24; i>=0; i-=8){
Mike Fiore 7:a31236c2e75c 208 _send_data.push_back((lat>>i)&0xFF);
Mike Fiore 7:a31236c2e75c 209 }
Mike Fiore 7:a31236c2e75c 210 for(int i=24; i>=0; i-=8){
Mike Fiore 7:a31236c2e75c 211 _send_data.push_back((lng>>i)&0xFF);
Mike Fiore 7:a31236c2e75c 212 }
Mike Fiore 7:a31236c2e75c 213 for(int i=0; i<(_padding>_max_padding ? _max_padding:_padding); i++){
Mike Fiore 7:a31236c2e75c 214 _send_data.push_back(0);
Mike Fiore 7:a31236c2e75c 215 }
Mike Fiore 7:a31236c2e75c 216 }
Mike Fiore 7:a31236c2e75c 217
Mike Fiore 7:a31236c2e75c 218 void ModeGps::setBand(){
Mike Fiore 7:a31236c2e75c 219 _sub_band++;
Mike Fiore 7:a31236c2e75c 220 if(_sub_band > mDot::FSB_8) _sub_band = mDot::FSB_ALL;
Mike Fiore 7:a31236c2e75c 221 _dot->setFrequencySubBand(_sub_band);
Mike Fiore 7:a31236c2e75c 222 }
Mike Fiore 7:a31236c2e75c 223
Mike Fiore 7:a31236c2e75c 224 void ModeGps::updateScreen(){
Mike Fiore 7:a31236c2e75c 225 _temp_C = _sensors->getTemp(SensorHandler::CELSIUS);
Mike Fiore 7:a31236c2e75c 226 if(_gps->getLockStatus() && _gps_available) {
Mike Fiore 7:a31236c2e75c 227 _GPS = true;
Mike Fiore 7:a31236c2e75c 228 _latitude = _gps->getLatitude();
Mike Fiore 7:a31236c2e75c 229 _longitude = _gps->getLongitude();
Mike Fiore 7:a31236c2e75c 230 _time = _gps->getTimestamp();
Mike Fiore 7:a31236c2e75c 231 } else {
Mike Fiore 7:a31236c2e75c 232 _GPS = false;
Mike Fiore 7:a31236c2e75c 233 }
Mike Fiore 7:a31236c2e75c 234 _sem.updateStats( _GPS, _longitude, _latitude, _time, _temp_C);
Mike Fiore 7:a31236c2e75c 235 _sem.updateSw1(_Sw1, _Sw2);
Mike Fiore 7:a31236c2e75c 236 _sem.updateSw2(_Sw2);
Mike Fiore 7:a31236c2e75c 237 }
Mike Fiore 7:a31236c2e75c 238
Mike Fiore 7:a31236c2e75c 239 void ModeGps::send(){
Mike Fiore 7:a31236c2e75c 240 _state = SENDING;
Mike Fiore 7:a31236c2e75c 241 _send_timer.stop();
Mike Fiore 7:a31236c2e75c 242 if(_band == mDot::FB_EU868) {
Mike Fiore 7:a31236c2e75c 243 while(_dot->getNextTxMs()>0) {
Mike Fiore 7:a31236c2e75c 244 _sem.updateNextCh((int)(_dot->getNextTxMs()/1000));
Mike Fiore 7:a31236c2e75c 245 osDelay(250);
Mike Fiore 7:a31236c2e75c 246 }
Mike Fiore 7:a31236c2e75c 247 }
Mike Fiore 7:a31236c2e75c 248 formatData();
Mike Fiore 7:a31236c2e75c 249 _sem.sending();
Mike Fiore 7:a31236c2e75c 250 _send_timer.reset();
Mike Fiore 7:a31236c2e75c 251 _send_timer.start();
Mike Fiore 7:a31236c2e75c 252 _lora->send(_send_data);
Mike Fiore 7:a31236c2e75c 253 osDelay(500);
Mike Fiore 7:a31236c2e75c 254 }
Mike Fiore 7:a31236c2e75c 255
Mike Fiore 7:a31236c2e75c 256 bool ModeGps::start(){
Mike Fiore 7:a31236c2e75c 257 init();
Mike Fiore 7:a31236c2e75c 258 _button_timer.start();
Mike Fiore 7:a31236c2e75c 259 ButtonHandler::ButtonEvent be;
Mike Fiore 7:a31236c2e75c 260 osSignalClear(_main_id, buttonSignal | loraSignal);
Mike Fiore 7:a31236c2e75c 261 while (true) {
Mike Fiore 7:a31236c2e75c 262 if(_state==PARAMETERS){
Mike Fiore 7:a31236c2e75c 263 updateScreen();
Mike Fiore 7:a31236c2e75c 264 }
Mike Fiore 7:a31236c2e75c 265 osEvent e = Thread::signal_wait(0, 250);
Mike Fiore 7:a31236c2e75c 266 if (e.status == osEventSignal) {
Mike Fiore 7:a31236c2e75c 267 if (e.value.signals & buttonSignal) {
Mike Fiore 7:a31236c2e75c 268 _button_timer.reset();
Mike Fiore 7:a31236c2e75c 269 be = _buttons->getButtonEvent();
Mike Fiore 7:a31236c2e75c 270
Mike Fiore 7:a31236c2e75c 271 switch(be) {
Mike Fiore 7:a31236c2e75c 272 case ButtonHandler::sw1_press:
Mike Fiore 7:a31236c2e75c 273 switch(_state) {
Mike Fiore 7:a31236c2e75c 274 case BAND_CHANGE:
Mike Fiore 7:a31236c2e75c 275 setBand();
Mike Fiore 7:a31236c2e75c 276 _sem_join.updateJoinFsb(_sub_band);
Mike Fiore 7:a31236c2e75c 277 break;
Mike Fiore 7:a31236c2e75c 278
Mike Fiore 7:a31236c2e75c 279 case PARAMETERS:
Mike Fiore 7:a31236c2e75c 280 editParameter();
Mike Fiore 7:a31236c2e75c 281 break;
Mike Fiore 7:a31236c2e75c 282
Mike Fiore 7:a31236c2e75c 283 default:
Mike Fiore 7:a31236c2e75c 284 break;
Mike Fiore 7:a31236c2e75c 285 }
Mike Fiore 7:a31236c2e75c 286 break;
Mike Fiore 7:a31236c2e75c 287 case ButtonHandler::sw2_press:
Mike Fiore 7:a31236c2e75c 288 switch(_state) {
Mike Fiore 7:a31236c2e75c 289 case BAND_CHANGE:
Mike Fiore 7:a31236c2e75c 290 if(_join->start()){
Mike Fiore 7:a31236c2e75c 291 _state = PARAMETERS;
Mike Fiore 7:a31236c2e75c 292 _send_timer.start();
Mike Fiore 7:a31236c2e75c 293 _sem.display(_link_check, _snr, _rssi, _power, _sub_band, _padding, DATA_RATE);
Mike Fiore 7:a31236c2e75c 294 _sem.initial();
Mike Fiore 7:a31236c2e75c 295 _dot->setTxDataRate(_data_rate);
Mike Fiore 7:a31236c2e75c 296 } else _sem_join.displayEditFsb(mDot::DR0, 20, _sub_band, _dot->getNetworkName(), _dot->getNetworkPassphrase());
Mike Fiore 7:a31236c2e75c 297 break;
Mike Fiore 7:a31236c2e75c 298
Mike Fiore 7:a31236c2e75c 299 case PARAMETERS:
Mike Fiore 7:a31236c2e75c 300 changeParameter();
Mike Fiore 7:a31236c2e75c 301 break;
Mike Fiore 7:a31236c2e75c 302
Mike Fiore 7:a31236c2e75c 303 default:
Mike Fiore 7:a31236c2e75c 304 break;
Mike Fiore 7:a31236c2e75c 305 }
Mike Fiore 7:a31236c2e75c 306 break;
Mike Fiore 7:a31236c2e75c 307
Mike Fiore 7:a31236c2e75c 308 case ButtonHandler::sw1_hold:
Mike Fiore 7:a31236c2e75c 309 _send_timer.stop();
Mike Fiore 7:a31236c2e75c 310 _send_timer.reset();
Mike Fiore 7:a31236c2e75c 311 return true;
Mike Fiore 7:a31236c2e75c 312
Mike Fiore 7:a31236c2e75c 313 default:
Mike Fiore 7:a31236c2e75c 314 break;
Mike Fiore 7:a31236c2e75c 315 }
Mike Fiore 7:a31236c2e75c 316 }
Mike Fiore 7:a31236c2e75c 317 }
Mike Fiore 7:a31236c2e75c 318 if (e.value.signals & loraSignal) {
Mike Fiore 7:a31236c2e75c 319 _ls = _lora->getStatus();
Mike Fiore 7:a31236c2e75c 320 switch (_ls) {
Mike Fiore 7:a31236c2e75c 321
Mike Fiore 7:a31236c2e75c 322 case LoRaHandler::send_success:
Mike Fiore 7:a31236c2e75c 323 _sem.sendResult(" Send Sucess!");
Mike Fiore 7:a31236c2e75c 324 osDelay(500);
Mike Fiore 7:a31236c2e75c 325 _link_check = true;
Mike Fiore 7:a31236c2e75c 326 _snr = _dot->getSnrStats();
Mike Fiore 7:a31236c2e75c 327 _rssi = _dot->getRssiStats();
Mike Fiore 7:a31236c2e75c 328 _button_timer.reset();
Mike Fiore 7:a31236c2e75c 329 _state = PARAMETERS;
Mike Fiore 7:a31236c2e75c 330 _sem.display(_link_check, _snr, _rssi, _power, _sub_band, _padding, _data_rate);
Mike Fiore 7:a31236c2e75c 331 if(_drAll){
Mike Fiore 7:a31236c2e75c 332 drIncrement();
Mike Fiore 7:a31236c2e75c 333 }
Mike Fiore 7:a31236c2e75c 334 break;
Mike Fiore 7:a31236c2e75c 335
Mike Fiore 7:a31236c2e75c 336 case LoRaHandler::send_failure:
Mike Fiore 7:a31236c2e75c 337 _sem.sendResult(" Send Failed.");
Mike Fiore 7:a31236c2e75c 338 osDelay(500);
Mike Fiore 7:a31236c2e75c 339 _link_check = false;
Mike Fiore 7:a31236c2e75c 340 _button_timer.reset();
Mike Fiore 7:a31236c2e75c 341 _state = PARAMETERS;
Mike Fiore 7:a31236c2e75c 342 _sem.display(_link_check, _snr, _rssi, _power, _sub_band, _padding, _data_rate);
Mike Fiore 7:a31236c2e75c 343 if(_drAll){
Mike Fiore 7:a31236c2e75c 344 drIncrement();
Mike Fiore 7:a31236c2e75c 345 }
Mike Fiore 7:a31236c2e75c 346 break;
Mike Fiore 7:a31236c2e75c 347
Mike Fiore 7:a31236c2e75c 348 default:
Mike Fiore 7:a31236c2e75c 349 break;
Mike Fiore 7:a31236c2e75c 350 }
Mike Fiore 7:a31236c2e75c 351 }
Mike Fiore 7:a31236c2e75c 352 if(_send_timer.read_ms() > _interval*1000 && _button_timer.read_ms() > 3000){
Mike Fiore 7:a31236c2e75c 353 send();
Mike Fiore 7:a31236c2e75c 354 }
Mike Fiore 7:a31236c2e75c 355 }
Mike Fiore 7:a31236c2e75c 356 }