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:
jenkins@jenkinsdm1
Date:
Thu Mar 14 08:23:20 2019 -0500
Revision:
16:e76cec0eec43
Parent:
12:05435282f899
dotbox-firmware revision 3.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){
jenkins@jenkinsdm1 12:05435282f899 35 char buf[4];
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();
jenkins@jenkinsdm1 12:05435282f899 51 _data_rate = _dot->getMinDatarate();
jenkins@jenkinsdm1 12:05435282f899 52 _dot->setTxDataRate(_data_rate);
Mike Fiore 7:a31236c2e75c 53 _max_padding = _dot->getMaxPacketLength() - PACKETSIZE;
Mike Fiore 7:a31236c2e75c 54 _Sw2 = "Power";
Mike Fiore 7:a31236c2e75c 55 _Sw1 = intToString(_power);
Mike Fiore 7:a31236c2e75c 56 _help.display();
Mike Fiore 7:a31236c2e75c 57 osDelay(2000);
Mike Fiore 7:a31236c2e75c 58
jenkins@jenkinsdm1 12:05435282f899 59 if (lora::ChannelPlan::IsPlanDynamic(_band)) {
Mike Fiore 7:a31236c2e75c 60 _sem.display(_link_check, _snr, _rssi, _power, _sub_band, _padding, _data_rate);
Mike Fiore 7:a31236c2e75c 61 _sem.initial();
Mike Fiore 7:a31236c2e75c 62 _state = PARAMETERS;
Mike Fiore 7:a31236c2e75c 63 _send_timer.start();
Mike Fiore 7:a31236c2e75c 64 } else { _state = BAND_CHANGE;
Mike Fiore 7:a31236c2e75c 65 _sem_join.displayEditFsb(_data_rate, _power, _sub_band, _dot->getNetworkName(), _dot->getNetworkPassphrase());
Mike Fiore 7:a31236c2e75c 66 }
Mike Fiore 7:a31236c2e75c 67 }
Mike Fiore 7:a31236c2e75c 68
Mike Fiore 7:a31236c2e75c 69 void ModeGps::drIncrement(){
Mike Fiore 7:a31236c2e75c 70 _data_rate++;
jenkins@jenkinsdm1 12:05435282f899 71 //no fsk and japan data rates are different
jenkins@jenkinsdm1 12:05435282f899 72 if (_data_rate > _dot->getMaxDatarate() || _data_rate > mDot::DR6) {
Mike Fiore 7:a31236c2e75c 73 _drAll = true;
jenkins@jenkinsdm1 12:05435282f899 74 _data_rate = _dot->getMinDatarate();
Mike Fiore 7:a31236c2e75c 75 }
Mike Fiore 7:a31236c2e75c 76 _dot->setTxDataRate(_data_rate);
Mike Fiore 7:a31236c2e75c 77 logInfo("new data rate %s, POWER %lu", mDot::DataRateStr(_data_rate).c_str(), _power);
Mike Fiore 7:a31236c2e75c 78 _max_padding = _dot->getMaxPacketLength() - PACKETSIZE;
Mike Fiore 7:a31236c2e75c 79 }
Mike Fiore 7:a31236c2e75c 80
Mike Fiore 7:a31236c2e75c 81 void ModeGps::changeDataRate(){
Mike Fiore 7:a31236c2e75c 82 if(_drAll) {
jenkins@jenkinsdm1 12:05435282f899 83 _data_rate = _dot->getMinDatarate() - 1;
Mike Fiore 7:a31236c2e75c 84 _drAll = false;
Mike Fiore 7:a31236c2e75c 85 }
Mike Fiore 7:a31236c2e75c 86 drIncrement();
Mike Fiore 7:a31236c2e75c 87 }
Mike Fiore 7:a31236c2e75c 88
Mike Fiore 7:a31236c2e75c 89 void ModeGps::changeParameter(){
Mike Fiore 7:a31236c2e75c 90 _parameter++;
jenkins@jenkinsdm1 12:05435282f899 91 if(lora::ChannelPlan::IsPlanDynamic(_band) && _parameter == FSB){
Mike Fiore 7:a31236c2e75c 92 _parameter++;
Mike Fiore 7:a31236c2e75c 93 }
Mike Fiore 7:a31236c2e75c 94 if(_parameter>INTERVAL){
Mike Fiore 7:a31236c2e75c 95 _parameter = 0;
Mike Fiore 7:a31236c2e75c 96 }
Mike Fiore 7:a31236c2e75c 97 switch(_parameter) {
Mike Fiore 7:a31236c2e75c 98 case DATA_RATE:
Mike Fiore 7:a31236c2e75c 99 _Sw2 = "Data Rate";
Mike Fiore 7:a31236c2e75c 100 _Sw1 = intToString(_data_rate);
Mike Fiore 7:a31236c2e75c 101 if(_drAll){
Mike Fiore 7:a31236c2e75c 102 _Sw1 = "All";
Mike Fiore 7:a31236c2e75c 103 }
Mike Fiore 7:a31236c2e75c 104 break;
Mike Fiore 7:a31236c2e75c 105 case FSB:
Mike Fiore 7:a31236c2e75c 106 _Sw2 = "FSB";
Mike Fiore 7:a31236c2e75c 107 _Sw1 = intToString(_sub_band);
Mike Fiore 7:a31236c2e75c 108 break;
Mike Fiore 7:a31236c2e75c 109 case PADDING:
Mike Fiore 7:a31236c2e75c 110 _Sw2 = "Padding";
Mike Fiore 7:a31236c2e75c 111 _Sw1 = intToString(_padding);
Mike Fiore 7:a31236c2e75c 112 break;
Mike Fiore 7:a31236c2e75c 113 case POWER:
Mike Fiore 7:a31236c2e75c 114 _Sw2 = "Power";
Mike Fiore 7:a31236c2e75c 115 _Sw1 = intToString(_power);
Mike Fiore 7:a31236c2e75c 116 break;
Mike Fiore 7:a31236c2e75c 117 case INTERVAL:
Mike Fiore 7:a31236c2e75c 118 _Sw2 = "Interval";
Mike Fiore 7:a31236c2e75c 119 _Sw1 = intToString(_interval);
Mike Fiore 7:a31236c2e75c 120 break;
Mike Fiore 7:a31236c2e75c 121 default:
Mike Fiore 7:a31236c2e75c 122 break;
Mike Fiore 7:a31236c2e75c 123 }
Mike Fiore 7:a31236c2e75c 124 }
Mike Fiore 7:a31236c2e75c 125
Mike Fiore 7:a31236c2e75c 126 void ModeGps::editParameter(){
Mike Fiore 7:a31236c2e75c 127 switch(_parameter) {
Mike Fiore 7:a31236c2e75c 128 case POWER:
Mike Fiore 7:a31236c2e75c 129 if(_power<20){
Mike Fiore 7:a31236c2e75c 130 _power+=3;
Mike Fiore 7:a31236c2e75c 131 } else {
Mike Fiore 7:a31236c2e75c 132 _power = 2;
Mike Fiore 7:a31236c2e75c 133 }
Mike Fiore 7:a31236c2e75c 134 _Sw1 = intToString(_power);
Mike Fiore 7:a31236c2e75c 135 _dot->setTxPower(_power);
Mike Fiore 7:a31236c2e75c 136 break;
Mike Fiore 7:a31236c2e75c 137
Mike Fiore 7:a31236c2e75c 138 case DATA_RATE:
Mike Fiore 7:a31236c2e75c 139 changeDataRate();
Mike Fiore 7:a31236c2e75c 140 if(_drAll) {
Mike Fiore 7:a31236c2e75c 141 _Sw1="All";
Mike Fiore 7:a31236c2e75c 142 } else {
Mike Fiore 7:a31236c2e75c 143 _Sw1 = intToString(_data_rate);
Mike Fiore 7:a31236c2e75c 144 }
Mike Fiore 7:a31236c2e75c 145 break;
Mike Fiore 7:a31236c2e75c 146
Mike Fiore 7:a31236c2e75c 147 case FSB:
Mike Fiore 7:a31236c2e75c 148 _send_timer.stop();
Mike Fiore 7:a31236c2e75c 149 _send_timer.reset();
Mike Fiore 7:a31236c2e75c 150 _state = BAND_CHANGE;
Mike Fiore 7:a31236c2e75c 151 _dot->resetNetworkSession();
Mike Fiore 7:a31236c2e75c 152 _lora->resetActivityLed();
Mike Fiore 7:a31236c2e75c 153 _sem_join.displayEditFsb(mDot::DR0, 20, _sub_band, _dot->getNetworkName(), _dot->getNetworkPassphrase());
Mike Fiore 7:a31236c2e75c 154 break;
Mike Fiore 7:a31236c2e75c 155
Mike Fiore 7:a31236c2e75c 156 case PADDING:
Mike Fiore 7:a31236c2e75c 157 if(_padding<_max_padding){
Mike Fiore 7:a31236c2e75c 158 _padding += 10 - (_padding % 10);
Mike Fiore 7:a31236c2e75c 159 } else {
Mike Fiore 7:a31236c2e75c 160 _padding = 0;
Mike Fiore 7:a31236c2e75c 161 }
Mike Fiore 7:a31236c2e75c 162 if(_padding>_max_padding){
Mike Fiore 7:a31236c2e75c 163 _padding = _max_padding;
Mike Fiore 7:a31236c2e75c 164 }
Mike Fiore 7:a31236c2e75c 165 _Sw1 = intToString(_padding);
Mike Fiore 7:a31236c2e75c 166 break;
Mike Fiore 7:a31236c2e75c 167
Mike Fiore 7:a31236c2e75c 168 default:
Mike Fiore 7:a31236c2e75c 169 if(_interval<60){
Mike Fiore 7:a31236c2e75c 170 _interval += 5;
Mike Fiore 7:a31236c2e75c 171 } else {
Mike Fiore 7:a31236c2e75c 172 _interval = 5;
Mike Fiore 7:a31236c2e75c 173 }
Mike Fiore 7:a31236c2e75c 174 _Sw1 = intToString(_interval);
Mike Fiore 7:a31236c2e75c 175 break;
Mike Fiore 7:a31236c2e75c 176 }
Mike Fiore 7:a31236c2e75c 177 }
Mike Fiore 7:a31236c2e75c 178
Mike Fiore 7:a31236c2e75c 179 void ModeGps::formatData(){
Mike Fiore 7:a31236c2e75c 180 _send_data.clear();
Mike Fiore 7:a31236c2e75c 181 uint32_t lat = 0;
Mike Fiore 7:a31236c2e75c 182 uint32_t lng = 0;
Mike Fiore 7:a31236c2e75c 183 double degrees = 0;
Mike Fiore 7:a31236c2e75c 184 double minutes = 0;
Mike Fiore 7:a31236c2e75c 185 double seconds = 0;
Mike Fiore 7:a31236c2e75c 186 _temp_C += 0.5;
Mike Fiore 7:a31236c2e75c 187
Mike Fiore 7:a31236c2e75c 188 if(_GPS) {
Mike Fiore 7:a31236c2e75c 189 degrees = _latitude.degrees;
Mike Fiore 7:a31236c2e75c 190 minutes = _latitude.minutes;
Mike Fiore 7:a31236c2e75c 191 seconds = _latitude.seconds;
Mike Fiore 7:a31236c2e75c 192 if(degrees<0) {
Mike Fiore 7:a31236c2e75c 193 lat = ~(int)((degrees - minutes/60.0 - seconds/600000.0)*(-INT_MAX/90.0 + 1.5));
Mike Fiore 7:a31236c2e75c 194 } else {
Mike Fiore 7:a31236c2e75c 195 lat = (int)((degrees + minutes/60.0 + seconds/600000.0)*(INT_MAX/90.0 + 0.5));
Mike Fiore 7:a31236c2e75c 196 }
Mike Fiore 7:a31236c2e75c 197 degrees = _longitude.degrees;
Mike Fiore 7:a31236c2e75c 198 minutes = _longitude.minutes;
Mike Fiore 7:a31236c2e75c 199 seconds = _longitude.seconds;
Mike Fiore 7:a31236c2e75c 200 if(degrees<0) {
Mike Fiore 7:a31236c2e75c 201 lng = ~(int)((degrees - minutes/60.0 - seconds/600000.0)*(-INT_MAX/180.0 + 1.5));
Mike Fiore 7:a31236c2e75c 202 } else {
Mike Fiore 7:a31236c2e75c 203 lng = (int)((degrees + minutes/60.0 + seconds/600000.0)*(INT_MAX/180.0 + 0.5));
Mike Fiore 7:a31236c2e75c 204 }
Mike Fiore 7:a31236c2e75c 205 }
Mike Fiore 7:a31236c2e75c 206 _send_data.push_back(0);
Mike Fiore 7:a31236c2e75c 207 _send_data.push_back((int8_t) _temp_C);
Mike Fiore 7:a31236c2e75c 208 _send_data.push_back(0);
Mike Fiore 7:a31236c2e75c 209 for(int i=24; i>=0; i-=8){
Mike Fiore 7:a31236c2e75c 210 _send_data.push_back((lat>>i)&0xFF);
Mike Fiore 7:a31236c2e75c 211 }
Mike Fiore 7:a31236c2e75c 212 for(int i=24; i>=0; i-=8){
Mike Fiore 7:a31236c2e75c 213 _send_data.push_back((lng>>i)&0xFF);
Mike Fiore 7:a31236c2e75c 214 }
Mike Fiore 7:a31236c2e75c 215 for(int i=0; i<(_padding>_max_padding ? _max_padding:_padding); i++){
Mike Fiore 7:a31236c2e75c 216 _send_data.push_back(0);
Mike Fiore 7:a31236c2e75c 217 }
Mike Fiore 7:a31236c2e75c 218 }
Mike Fiore 7:a31236c2e75c 219
Mike Fiore 7:a31236c2e75c 220 void ModeGps::setBand(){
Mike Fiore 7:a31236c2e75c 221 _sub_band++;
Mike Fiore 7:a31236c2e75c 222 if(_sub_band > mDot::FSB_8) _sub_band = mDot::FSB_ALL;
Mike Fiore 7:a31236c2e75c 223 _dot->setFrequencySubBand(_sub_band);
Mike Fiore 7:a31236c2e75c 224 }
Mike Fiore 7:a31236c2e75c 225
Mike Fiore 7:a31236c2e75c 226 void ModeGps::updateScreen(){
Mike Fiore 7:a31236c2e75c 227 _temp_C = _sensors->getTemp(SensorHandler::CELSIUS);
Mike Fiore 7:a31236c2e75c 228 if(_gps->getLockStatus() && _gps_available) {
Mike Fiore 7:a31236c2e75c 229 _GPS = true;
Mike Fiore 7:a31236c2e75c 230 _latitude = _gps->getLatitude();
Mike Fiore 7:a31236c2e75c 231 _longitude = _gps->getLongitude();
Mike Fiore 7:a31236c2e75c 232 _time = _gps->getTimestamp();
Mike Fiore 7:a31236c2e75c 233 } else {
Mike Fiore 7:a31236c2e75c 234 _GPS = false;
Mike Fiore 7:a31236c2e75c 235 }
Mike Fiore 7:a31236c2e75c 236 _sem.updateStats( _GPS, _longitude, _latitude, _time, _temp_C);
Mike Fiore 7:a31236c2e75c 237 _sem.updateSw1(_Sw1, _Sw2);
Mike Fiore 7:a31236c2e75c 238 _sem.updateSw2(_Sw2);
Mike Fiore 7:a31236c2e75c 239 }
Mike Fiore 7:a31236c2e75c 240
Mike Fiore 7:a31236c2e75c 241 void ModeGps::send(){
Mike Fiore 7:a31236c2e75c 242 _state = SENDING;
Mike Fiore 7:a31236c2e75c 243 _send_timer.stop();
jenkins@jenkinsdm1 12:05435282f899 244 while(_dot->getNextTxMs()>0) {
jenkins@jenkinsdm1 12:05435282f899 245 _sem.updateNextCh((int)(_dot->getNextTxMs()/1000));
jenkins@jenkinsdm1 12:05435282f899 246 osDelay(250);
jenkins@jenkinsdm1 12:05435282f899 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;
jenkins@jenkinsdm1 12:05435282f899 260 uint32_t e;
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 }
jenkins@jenkinsdm1 12:05435282f899 265 e = osThreadFlagsWait(loraSignal | buttonSignal, osFlagsWaitAny, 250);
jenkins@jenkinsdm1 12:05435282f899 266 if (e == buttonSignal) {
jenkins@jenkinsdm1 12:05435282f899 267 be = _buttons->getButtonEvent();
Mike Fiore 7:a31236c2e75c 268
jenkins@jenkinsdm1 12:05435282f899 269 switch(be) {
jenkins@jenkinsdm1 12:05435282f899 270 case ButtonHandler::sw1_press:
jenkins@jenkinsdm1 12:05435282f899 271 switch(_state) {
jenkins@jenkinsdm1 12:05435282f899 272 case BAND_CHANGE:
Mike Fiore 7:a31236c2e75c 273 setBand();
Mike Fiore 7:a31236c2e75c 274 _sem_join.updateJoinFsb(_sub_band);
Mike Fiore 7:a31236c2e75c 275 break;
Mike Fiore 7:a31236c2e75c 276
Mike Fiore 7:a31236c2e75c 277 case PARAMETERS:
Mike Fiore 7:a31236c2e75c 278 editParameter();
Mike Fiore 7:a31236c2e75c 279 break;
Mike Fiore 7:a31236c2e75c 280
Mike Fiore 7:a31236c2e75c 281 default:
Mike Fiore 7:a31236c2e75c 282 break;
Mike Fiore 7:a31236c2e75c 283 }
Mike Fiore 7:a31236c2e75c 284 break;
Mike Fiore 7:a31236c2e75c 285 case ButtonHandler::sw2_press:
Mike Fiore 7:a31236c2e75c 286 switch(_state) {
Mike Fiore 7:a31236c2e75c 287 case BAND_CHANGE:
Mike Fiore 7:a31236c2e75c 288 if(_join->start()){
Mike Fiore 7:a31236c2e75c 289 _state = PARAMETERS;
Mike Fiore 7:a31236c2e75c 290 _send_timer.start();
Mike Fiore 7:a31236c2e75c 291 _sem.display(_link_check, _snr, _rssi, _power, _sub_band, _padding, DATA_RATE);
Mike Fiore 7:a31236c2e75c 292 _sem.initial();
Mike Fiore 7:a31236c2e75c 293 _dot->setTxDataRate(_data_rate);
Mike Fiore 7:a31236c2e75c 294 } else _sem_join.displayEditFsb(mDot::DR0, 20, _sub_band, _dot->getNetworkName(), _dot->getNetworkPassphrase());
Mike Fiore 7:a31236c2e75c 295 break;
Mike Fiore 7:a31236c2e75c 296
Mike Fiore 7:a31236c2e75c 297 case PARAMETERS:
Mike Fiore 7:a31236c2e75c 298 changeParameter();
Mike Fiore 7:a31236c2e75c 299 break;
Mike Fiore 7:a31236c2e75c 300
Mike Fiore 7:a31236c2e75c 301 default:
Mike Fiore 7:a31236c2e75c 302 break;
Mike Fiore 7:a31236c2e75c 303 }
Mike Fiore 7:a31236c2e75c 304 break;
Mike Fiore 7:a31236c2e75c 305
Mike Fiore 7:a31236c2e75c 306 case ButtonHandler::sw1_hold:
Mike Fiore 7:a31236c2e75c 307 _send_timer.stop();
Mike Fiore 7:a31236c2e75c 308 _send_timer.reset();
Mike Fiore 7:a31236c2e75c 309 return true;
Mike Fiore 7:a31236c2e75c 310
Mike Fiore 7:a31236c2e75c 311 default:
Mike Fiore 7:a31236c2e75c 312 break;
Mike Fiore 7:a31236c2e75c 313 }
Mike Fiore 7:a31236c2e75c 314 }
jenkins@jenkinsdm1 12:05435282f899 315 if (e == loraSignal) {
Mike Fiore 7:a31236c2e75c 316 _ls = _lora->getStatus();
Mike Fiore 7:a31236c2e75c 317 switch (_ls) {
Mike Fiore 7:a31236c2e75c 318
Mike Fiore 7:a31236c2e75c 319 case LoRaHandler::send_success:
Mike Fiore 7:a31236c2e75c 320 _sem.sendResult(" Send Sucess!");
Mike Fiore 7:a31236c2e75c 321 osDelay(500);
Mike Fiore 7:a31236c2e75c 322 _link_check = true;
Mike Fiore 7:a31236c2e75c 323 _snr = _dot->getSnrStats();
Mike Fiore 7:a31236c2e75c 324 _rssi = _dot->getRssiStats();
Mike Fiore 7:a31236c2e75c 325 _button_timer.reset();
Mike Fiore 7:a31236c2e75c 326 _state = PARAMETERS;
Mike Fiore 7:a31236c2e75c 327 _sem.display(_link_check, _snr, _rssi, _power, _sub_band, _padding, _data_rate);
Mike Fiore 7:a31236c2e75c 328 if(_drAll){
Mike Fiore 7:a31236c2e75c 329 drIncrement();
Mike Fiore 7:a31236c2e75c 330 }
Mike Fiore 7:a31236c2e75c 331 break;
Mike Fiore 7:a31236c2e75c 332
Mike Fiore 7:a31236c2e75c 333 case LoRaHandler::send_failure:
Mike Fiore 7:a31236c2e75c 334 _sem.sendResult(" Send Failed.");
Mike Fiore 7:a31236c2e75c 335 osDelay(500);
Mike Fiore 7:a31236c2e75c 336 _link_check = false;
Mike Fiore 7:a31236c2e75c 337 _button_timer.reset();
Mike Fiore 7:a31236c2e75c 338 _state = PARAMETERS;
Mike Fiore 7:a31236c2e75c 339 _sem.display(_link_check, _snr, _rssi, _power, _sub_band, _padding, _data_rate);
Mike Fiore 7:a31236c2e75c 340 if(_drAll){
Mike Fiore 7:a31236c2e75c 341 drIncrement();
Mike Fiore 7:a31236c2e75c 342 }
Mike Fiore 7:a31236c2e75c 343 break;
jenkins@jenkinsdm1 12:05435282f899 344
jenkins@jenkinsdm1 12:05435282f899 345 case LoRaHandler::send_failure_payload:
jenkins@jenkinsdm1 12:05435282f899 346 _sem.sendResult("Payload too large");
jenkins@jenkinsdm1 12:05435282f899 347 osDelay(1000);
jenkins@jenkinsdm1 12:05435282f899 348 _sem.sendResult("Change Datarate");
jenkins@jenkinsdm1 12:05435282f899 349 osDelay(1000);
jenkins@jenkinsdm1 12:05435282f899 350 _link_check = false;
jenkins@jenkinsdm1 12:05435282f899 351 _button_timer.reset();
jenkins@jenkinsdm1 12:05435282f899 352 _state = PARAMETERS;
jenkins@jenkinsdm1 12:05435282f899 353 _sem.display(_link_check, _snr, _rssi, _power, _sub_band, _padding, _data_rate);
jenkins@jenkinsdm1 12:05435282f899 354 if(_drAll){
jenkins@jenkinsdm1 12:05435282f899 355 drIncrement();
jenkins@jenkinsdm1 12:05435282f899 356 }
jenkins@jenkinsdm1 12:05435282f899 357 break;
jenkins@jenkinsdm1 12:05435282f899 358
Mike Fiore 7:a31236c2e75c 359 default:
Mike Fiore 7:a31236c2e75c 360 break;
Mike Fiore 7:a31236c2e75c 361 }
Mike Fiore 7:a31236c2e75c 362 }
Mike Fiore 7:a31236c2e75c 363 if(_send_timer.read_ms() > _interval*1000 && _button_timer.read_ms() > 3000){
Mike Fiore 7:a31236c2e75c 364 send();
Mike Fiore 7:a31236c2e75c 365 }
Mike Fiore 7:a31236c2e75c 366 }
Mike Fiore 7:a31236c2e75c 367 }