MTDOT-BOX-EVB-Factory-Firmware

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

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 1:71125aa00e33 1 /* Copyright (c) <2016> <MultiTech Systems>, MIT License
Mike Fiore 1:71125aa00e33 2 *
Mike Fiore 1:71125aa00e33 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
Mike Fiore 1:71125aa00e33 4 * and associated documentation files (the "Software"), to deal in the Software without restriction,
Mike Fiore 1:71125aa00e33 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
Mike Fiore 1:71125aa00e33 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
Mike Fiore 1:71125aa00e33 7 * furnished to do so, subject to the following conditions:
Mike Fiore 1:71125aa00e33 8 *
Mike Fiore 1:71125aa00e33 9 * The above copyright notice and this permission notice shall be included in all copies or
Mike Fiore 1:71125aa00e33 10 * substantial portions of the Software.
Mike Fiore 1:71125aa00e33 11 *
Mike Fiore 1:71125aa00e33 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
Mike Fiore 1:71125aa00e33 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
Mike Fiore 1:71125aa00e33 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
Mike Fiore 1:71125aa00e33 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Mike Fiore 1:71125aa00e33 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Mike Fiore 1:71125aa00e33 17 */
Mike Fiore 1:71125aa00e33 18
Mike Fiore 1:71125aa00e33 19 // mbed headers
Mike Fiore 1:71125aa00e33 20 #include "mbed.h"
Mike Fiore 1:71125aa00e33 21 #include "rtos.h"
Mike Fiore 1:71125aa00e33 22 // MTS headers
Mike Fiore 1:71125aa00e33 23 #include "mDot.h"
Mike Fiore 1:71125aa00e33 24 #include "MTSLog.h"
Mike Fiore 1:71125aa00e33 25 // display headers
Mike Fiore 1:71125aa00e33 26 #include "DOGS102.h"
Mike Fiore 1:71125aa00e33 27 #include "NCP5623B.h"
Mike Fiore 1:71125aa00e33 28 #include "LayoutStartup.h"
Mike Fiore 1:71125aa00e33 29 #include "LayoutScrollSelect.h"
Mike Fiore 1:71125aa00e33 30 #include "LayoutConfig.h"
Mike Fiore 1:71125aa00e33 31 #include "LayoutHelp.h"
Mike Fiore 1:71125aa00e33 32 // button header
Mike Fiore 1:71125aa00e33 33 #include "ButtonHandler.h"
Mike Fiore 1:71125aa00e33 34 // LoRa header
Mike Fiore 1:71125aa00e33 35 #include "LoRaHandler.h"
Mike Fiore 1:71125aa00e33 36 // Sensor header
Mike Fiore 1:71125aa00e33 37 #include "SensorHandler.h"
Mike Fiore 1:71125aa00e33 38 // mode objects
Mike Fiore 1:71125aa00e33 39 #include "ModeJoin.h"
Mike Fiore 1:71125aa00e33 40 #include "ModeSingle.h"
Mike Fiore 1:71125aa00e33 41 #include "ModeSweep.h"
Mike Fiore 1:71125aa00e33 42 #include "ModeDemo.h"
Mike Fiore 1:71125aa00e33 43 #include "ModeConfig.h"
Mike Fiore 7:a31236c2e75c 44 #include "ModeGps.h"
Mike Fiore 7:a31236c2e75c 45 #include "ModeData.h"
jenkins@jenkinsdm1 12:05435282f899 46 #include "ModeRegion.h"
Mike Fiore 1:71125aa00e33 47 // misc heders
Mike Fiore 1:71125aa00e33 48 #include "FileName.h"
Mike Fiore 1:71125aa00e33 49 #include <string>
Mike Fiore 1:71125aa00e33 50
jenkins@jenkinsdm1 12:05435282f899 51 #ifndef CHANNEL_PLAN
jenkins@jenkinsdm1 12:05435282f899 52 #define CHANNEL_PLAN CP_US915
jenkins@jenkinsdm1 12:05435282f899 53 #endif
jenkins@jenkinsdm1 12:05435282f899 54
Mike Fiore 7:a31236c2e75c 55 #define DISABLE_DUTY_CYCLE true
Mike Fiore 7:a31236c2e75c 56
Mike Fiore 1:71125aa00e33 57 // LCD and LED controllers
Mike Fiore 1:71125aa00e33 58 SPI lcd_spi(SPI1_MOSI, SPI1_MISO, SPI1_SCK);
Mike Fiore 1:71125aa00e33 59 DigitalOut lcd_spi_cs(SPI1_CS, 1);
Mike Fiore 1:71125aa00e33 60 DigitalOut lcd_cd(XBEE_ON_SLEEP, 1);
Mike Fiore 1:71125aa00e33 61 DOGS102* lcd;
jenkins@jenkinsdm1 12:05435282f899 62
jenkins@jenkinsdm1 12:05435282f899 63 I2C i2c(I2C_SDA, I2C_SCL);
jenkins@jenkinsdm1 12:05435282f899 64 static const int i2c_freq = 400000; // i2c bus frequency in Hz
jenkins@jenkinsdm1 12:05435282f899 65
Mike Fiore 1:71125aa00e33 66 NCP5623B* led_cont;
Mike Fiore 1:71125aa00e33 67
Mike Fiore 1:71125aa00e33 68 // Thread informaiton
Mike Fiore 1:71125aa00e33 69 osThreadId main_id;
Mike Fiore 1:71125aa00e33 70
Mike Fiore 1:71125aa00e33 71 // Button controller
Mike Fiore 1:71125aa00e33 72 ButtonHandler* buttons;
Mike Fiore 1:71125aa00e33 73
Mike Fiore 1:71125aa00e33 74 // LoRa controller
Mike Fiore 7:a31236c2e75c 75 LoRaHandler* lora_handler;
Mike Fiore 7:a31236c2e75c 76
jenkins@jenkinsdm1 12:05435282f899 77 lora::ChannelPlan* plan;
Mike Fiore 1:71125aa00e33 78 mDot* dot;
Mike Fiore 1:71125aa00e33 79
Mike Fiore 1:71125aa00e33 80 // GPS
Mike Fiore 1:71125aa00e33 81 GPSPARSER* gps;
jenkins@jenkinsdm1 12:05435282f899 82 MTSSerial gps_serial(XBEE_DOUT, XBEE_DIN, 256, 2048);
Mike Fiore 1:71125aa00e33 83
Mike Fiore 1:71125aa00e33 84 // Sensors
Mike Fiore 1:71125aa00e33 85 SensorHandler* sensors;
Mike Fiore 1:71125aa00e33 86
Mike Fiore 1:71125aa00e33 87 // Modes
Mike Fiore 1:71125aa00e33 88 ModeJoin* modeJoin;
Mike Fiore 1:71125aa00e33 89 ModeSingle* modeSingle;
Mike Fiore 1:71125aa00e33 90 ModeSweep* modeSweep;
Mike Fiore 1:71125aa00e33 91 ModeDemo* modeDemo;
Mike Fiore 1:71125aa00e33 92 ModeConfig* modeConfig;
Mike Fiore 7:a31236c2e75c 93 ModeGps* modeGps;
Mike Fiore 7:a31236c2e75c 94 ModeData* modeData;
jenkins@jenkinsdm1 12:05435282f899 95 ModeRegion* modeRegion;
Mike Fiore 1:71125aa00e33 96
Mike Fiore 1:71125aa00e33 97 // Serial debug port
jenkins@jenkinsdm1 12:05435282f899 98 Serial debug_port(USBTX, USBRX);
Mike Fiore 1:71125aa00e33 99
Mike Fiore 1:71125aa00e33 100 // Survey Data File
Mike Fiore 7:a31236c2e75c 101 char file_name[] = "SurveyData.txt";
Mike Fiore 1:71125aa00e33 102
jenkins@jenkinsdm1 12:05435282f899 103 // Channel plan file
jenkins@jenkinsdm1 12:05435282f899 104 char file_cp[] = "ChannelPlan";
jenkins@jenkinsdm1 12:05435282f899 105
Mike Fiore 1:71125aa00e33 106 // Prototypes
Mike Fiore 1:71125aa00e33 107 void mainMenu();
Mike Fiore 1:71125aa00e33 108
Mike Fiore 1:71125aa00e33 109 int main() {
jenkins@jenkinsdm1 12:05435282f899 110 debug_port.baud(115200);
jenkins@jenkinsdm1 12:05435282f899 111
jenkins@jenkinsdm1 12:05435282f899 112 i2c.frequency(i2c_freq);
Mike Fiore 1:71125aa00e33 113
Mike Fiore 1:71125aa00e33 114 lcd = new DOGS102(lcd_spi, lcd_spi_cs, lcd_cd);
Mike Fiore 1:71125aa00e33 115 // NCP5623B::LEDs 1 & 2 are the screen backlight - not used on default build
Mike Fiore 1:71125aa00e33 116 // NCP5623B::LED3 is EVB LED2
jenkins@jenkinsdm1 12:05435282f899 117 led_cont = new NCP5623B(i2c);
jenkins@jenkinsdm1 12:05435282f899 118 gps = new GPSPARSER(&gps_serial, led_cont);
jenkins@jenkinsdm1 12:05435282f899 119 sensors = new SensorHandler(i2c);
Mike Fiore 1:71125aa00e33 120
Mike Fiore 1:71125aa00e33 121 main_id = Thread::gettid();
Mike Fiore 1:71125aa00e33 122 buttons = new ButtonHandler(main_id);
jenkins@jenkinsdm1 12:05435282f899 123 MTSLog::setLogLevel(MTSLog::TRACE_LEVEL);
jenkins@jenkinsdm1 12:05435282f899 124
jenkins@jenkinsdm1 12:05435282f899 125 logDebug("Loading default plan");
jenkins@jenkinsdm1 12:05435282f899 126
jenkins@jenkinsdm1 12:05435282f899 127 #if CHANNEL_PLAN == CP_AS923
jenkins@jenkinsdm1 12:05435282f899 128 plan = new lora::ChannelPlan_AS923();
jenkins@jenkinsdm1 12:05435282f899 129 #elif CHANNEL_PLAN == CP_US915
jenkins@jenkinsdm1 12:05435282f899 130 plan = new lora::ChannelPlan_US915();
jenkins@jenkinsdm1 12:05435282f899 131 #elif CHANNEL_PLAN == CP_AU915
jenkins@jenkinsdm1 12:05435282f899 132 plan = new lora::ChannelPlan_AU915();
jenkins@jenkinsdm1 12:05435282f899 133 #elif CHANNEL_PLAN == CP_EU868
jenkins@jenkinsdm1 12:05435282f899 134 plan = new lora::ChannelPlan_EU868();
jenkins@jenkinsdm1 12:05435282f899 135 #elif CHANNEL_PLAN == CP_KR920
jenkins@jenkinsdm1 12:05435282f899 136 plan = new lora::ChannelPlan_KR920();
jenkins@jenkinsdm1 12:05435282f899 137 #elif CHANNEL_PLAN == CP_IN865
jenkins@jenkinsdm1 12:05435282f899 138 plan = new lora::ChannelPlan_IN865();
jenkins@jenkinsdm1 12:05435282f899 139 #elif CHANNEL_PLAN == CP_AS923_JAPAN
jenkins@jenkinsdm1 12:05435282f899 140 plan = new lora::ChannelPlan_AS923_Japan();
jenkins@jenkinsdm1 12:05435282f899 141 #endif
jenkins@jenkinsdm1 12:05435282f899 142 mDot* dot = mDot::getInstance(plan);
jenkins@jenkinsdm1 12:05435282f899 143
jenkins@jenkinsdm1 12:05435282f899 144 uint8_t cplan[] = { 0 };
jenkins@jenkinsdm1 12:05435282f899 145 mDot::mdot_file file;
jenkins@jenkinsdm1 12:05435282f899 146 vector<mDot::mdot_file> files = dot->listUserFiles();
jenkins@jenkinsdm1 12:05435282f899 147
jenkins@jenkinsdm1 12:05435282f899 148 for (vector<mDot::mdot_file>::iterator it = files.begin(); it != files.end(); it++) {
jenkins@jenkinsdm1 12:05435282f899 149 if (strcmp(file_cp,it->name)==0) {
jenkins@jenkinsdm1 12:05435282f899 150 file = dot->openUserFile(it->name, mDot::FM_RDWR);
jenkins@jenkinsdm1 12:05435282f899 151 dot->seekUserFile(file, 0, SEEK_SET);
jenkins@jenkinsdm1 12:05435282f899 152 dot->readUserFile(file, cplan, 1);
jenkins@jenkinsdm1 12:05435282f899 153 dot->closeUserFile(file);
jenkins@jenkinsdm1 12:05435282f899 154 }
jenkins@jenkinsdm1 12:05435282f899 155 }
jenkins@jenkinsdm1 12:05435282f899 156
jenkins@jenkinsdm1 12:05435282f899 157 if(cplan[0]) {
jenkins@jenkinsdm1 12:05435282f899 158 if(cplan[0] != CHANNEL_PLAN){
jenkins@jenkinsdm1 12:05435282f899 159 logDebug("Loading saved channel plan");
jenkins@jenkinsdm1 12:05435282f899 160 switch (cplan[0]){
jenkins@jenkinsdm1 12:05435282f899 161 case CP_AS923:
jenkins@jenkinsdm1 12:05435282f899 162 delete plan;
jenkins@jenkinsdm1 12:05435282f899 163 plan = new lora::ChannelPlan_AS923();
jenkins@jenkinsdm1 12:05435282f899 164 break;
jenkins@jenkinsdm1 12:05435282f899 165
jenkins@jenkinsdm1 12:05435282f899 166 case CP_US915:
jenkins@jenkinsdm1 12:05435282f899 167 delete plan;
jenkins@jenkinsdm1 12:05435282f899 168 plan = new lora::ChannelPlan_US915();
jenkins@jenkinsdm1 12:05435282f899 169 break;
jenkins@jenkinsdm1 12:05435282f899 170
jenkins@jenkinsdm1 12:05435282f899 171 case CP_AU915:
jenkins@jenkinsdm1 12:05435282f899 172 delete plan;
jenkins@jenkinsdm1 12:05435282f899 173 plan = new lora::ChannelPlan_AU915();
jenkins@jenkinsdm1 12:05435282f899 174 break;
jenkins@jenkinsdm1 12:05435282f899 175
jenkins@jenkinsdm1 12:05435282f899 176 case CP_EU868:
jenkins@jenkinsdm1 12:05435282f899 177 delete plan;
jenkins@jenkinsdm1 12:05435282f899 178 plan = new lora::ChannelPlan_EU868();
jenkins@jenkinsdm1 12:05435282f899 179 break;
jenkins@jenkinsdm1 12:05435282f899 180
jenkins@jenkinsdm1 12:05435282f899 181 case CP_KR920:
jenkins@jenkinsdm1 12:05435282f899 182 delete plan;
jenkins@jenkinsdm1 12:05435282f899 183 plan = new lora::ChannelPlan_KR920();
jenkins@jenkinsdm1 12:05435282f899 184 break;
jenkins@jenkinsdm1 12:05435282f899 185
jenkins@jenkinsdm1 12:05435282f899 186 case CP_AS923_JAPAN:
jenkins@jenkinsdm1 12:05435282f899 187 delete plan;
jenkins@jenkinsdm1 12:05435282f899 188 plan = new lora::ChannelPlan_AS923_Japan();
jenkins@jenkinsdm1 12:05435282f899 189 break;
jenkins@jenkinsdm1 12:05435282f899 190
jenkins@jenkinsdm1 16:e76cec0eec43 191 case CP_IN865:
jenkins@jenkinsdm1 16:e76cec0eec43 192 delete plan;
jenkins@jenkinsdm1 16:e76cec0eec43 193 plan = new lora::ChannelPlan_IN865();
jenkins@jenkinsdm1 16:e76cec0eec43 194 break;
jenkins@jenkinsdm1 16:e76cec0eec43 195
jenkins@jenkinsdm1 12:05435282f899 196 default:
jenkins@jenkinsdm1 12:05435282f899 197 logInfo("Saved channel plan not valid Defaulting US915");
jenkins@jenkinsdm1 12:05435282f899 198 delete plan;
jenkins@jenkinsdm1 12:05435282f899 199 plan = new lora::ChannelPlan_US915();
jenkins@jenkinsdm1 12:05435282f899 200 break;
jenkins@jenkinsdm1 12:05435282f899 201 }
jenkins@jenkinsdm1 12:05435282f899 202 dot->setChannelPlan(plan);
jenkins@jenkinsdm1 12:05435282f899 203 }
jenkins@jenkinsdm1 12:05435282f899 204 }
jenkins@jenkinsdm1 12:05435282f899 205 lora_handler = new LoRaHandler(main_id, dot);
Mike Fiore 7:a31236c2e75c 206
Mike Fiore 7:a31236c2e75c 207 dot->setDisableDutyCycle(DISABLE_DUTY_CYCLE);
Mike Fiore 7:a31236c2e75c 208 dot->setLinkCheckThreshold(0);
Mike Fiore 7:a31236c2e75c 209 dot->setLinkCheckCount(0);
jenkins@jenkinsdm1 12:05435282f899 210 //Adr off to make sure modes work, auto sleep off seems to cause issues, haven't looked into it yet
jenkins@jenkinsdm1 12:05435282f899 211 dot->setAdr(false);
jenkins@jenkinsdm1 12:05435282f899 212 dot->setLogLevel(MTSLog::DEBUG_LEVEL);
jenkins@jenkinsdm1 12:05435282f899 213 dot->setAutoSleep(false);
Mike Fiore 7:a31236c2e75c 214 // Seed the RNG
Mike Fiore 7:a31236c2e75c 215 srand(dot->getRadioRandom());
Mike Fiore 7:a31236c2e75c 216
Mike Fiore 1:71125aa00e33 217 led_cont->setLEDCurrent(16);
Mike Fiore 1:71125aa00e33 218
Mike Fiore 7:a31236c2e75c 219 modeJoin = new ModeJoin(lcd, buttons, dot, lora_handler, gps, sensors);
Mike Fiore 7:a31236c2e75c 220 modeSingle = new ModeSingle(lcd, buttons, dot, lora_handler, gps, sensors);
Mike Fiore 7:a31236c2e75c 221 modeSweep = new ModeSweep(lcd, buttons, dot, lora_handler, gps, sensors);
Mike Fiore 7:a31236c2e75c 222 modeDemo = new ModeDemo(lcd, buttons, dot, lora_handler, gps, sensors);
Mike Fiore 7:a31236c2e75c 223 modeConfig = new ModeConfig(lcd, buttons, dot, lora_handler, gps, sensors);
Mike Fiore 7:a31236c2e75c 224 modeGps = new ModeGps(lcd, buttons, dot, lora_handler, gps, sensors, modeJoin);
Mike Fiore 7:a31236c2e75c 225 modeData = new ModeData(lcd, buttons, dot, lora_handler, gps, sensors);
jenkins@jenkinsdm1 12:05435282f899 226 modeRegion = new ModeRegion(lcd, buttons, dot, lora_handler, gps, sensors, file_cp);
Mike Fiore 1:71125aa00e33 227
Mike Fiore 1:71125aa00e33 228 osDelay(1000);
Mike Fiore 1:71125aa00e33 229 logInfo("%sGPS detected", gps->gpsDetected() ? "" : "no ");
Mike Fiore 1:71125aa00e33 230
jenkins@jenkinsdm1 12:05435282f899 231 if(!cplan[0]) {
jenkins@jenkinsdm1 12:05435282f899 232 dot->saveUserFile(file_cp, cplan, 1);
jenkins@jenkinsdm1 12:05435282f899 233 modeRegion->start();
jenkins@jenkinsdm1 12:05435282f899 234 }
jenkins@jenkinsdm1 12:05435282f899 235
Mike Fiore 1:71125aa00e33 236 // display startup screen for 3 seconds
Mike Fiore 1:71125aa00e33 237 LayoutStartup ls(lcd, dot);
Mike Fiore 1:71125aa00e33 238 ls.display();
Mike Fiore 1:71125aa00e33 239 ls.updateGPS(gps->gpsDetected());
Mike Fiore 1:71125aa00e33 240 osDelay(3000);
Mike Fiore 1:71125aa00e33 241 logInfo("displaying main menu");
Mike Fiore 1:71125aa00e33 242 mainMenu();
Mike Fiore 1:71125aa00e33 243
Mike Fiore 1:71125aa00e33 244 return 0;
Mike Fiore 1:71125aa00e33 245 }
Mike Fiore 1:71125aa00e33 246
Mike Fiore 1:71125aa00e33 247 void mainMenu() {
Mike Fiore 1:71125aa00e33 248 bool mode_selected = false;
Mike Fiore 1:71125aa00e33 249 std::string selected;
Mike Fiore 1:71125aa00e33 250 std::string product;
jenkins@jenkinsdm1 12:05435282f899 251
Mike Fiore 1:71125aa00e33 252 typedef enum {
Mike Fiore 1:71125aa00e33 253 demo = 1,
Mike Fiore 1:71125aa00e33 254 config,
Mike Fiore 1:71125aa00e33 255 single,
Mike Fiore 7:a31236c2e75c 256 sweep,
Mike Fiore 7:a31236c2e75c 257 gps,
jenkins@jenkinsdm1 12:05435282f899 258 data,
jenkins@jenkinsdm1 12:05435282f899 259 region
Mike Fiore 1:71125aa00e33 260 } menu_items;
Mike Fiore 1:71125aa00e33 261
Mike Fiore 1:71125aa00e33 262 std::string menu_strings[] = {
Mike Fiore 1:71125aa00e33 263 "Select Mode",
Mike Fiore 1:71125aa00e33 264 "LoRa Demo",
Mike Fiore 1:71125aa00e33 265 "Configuration",
Mike Fiore 1:71125aa00e33 266 "Survey Single",
Mike Fiore 7:a31236c2e75c 267 "Survey Sweep",
Mike Fiore 7:a31236c2e75c 268 "Survey GPS",
jenkins@jenkinsdm1 12:05435282f899 269 "View Data",
jenkins@jenkinsdm1 12:05435282f899 270 "Select Region"
Mike Fiore 1:71125aa00e33 271 };
jenkins@jenkinsdm1 12:05435282f899 272
Mike Fiore 1:71125aa00e33 273 std::vector<std::string> items;
Mike Fiore 1:71125aa00e33 274 items.push_back(menu_strings[demo]);
Mike Fiore 1:71125aa00e33 275 items.push_back(menu_strings[config]);
Mike Fiore 1:71125aa00e33 276 items.push_back(menu_strings[single]);
Mike Fiore 1:71125aa00e33 277 items.push_back(menu_strings[sweep]);
Mike Fiore 7:a31236c2e75c 278 items.push_back(menu_strings[gps]);
Mike Fiore 7:a31236c2e75c 279 items.push_back(menu_strings[data]);
jenkins@jenkinsdm1 12:05435282f899 280 items.push_back(menu_strings[region]);
Mike Fiore 1:71125aa00e33 281
Mike Fiore 1:71125aa00e33 282 while (true) {
Mike Fiore 1:71125aa00e33 283 // reset session between modes
Mike Fiore 1:71125aa00e33 284 dot->resetNetworkSession();
jenkins@jenkinsdm1 12:05435282f899 285 selected = "";
jenkins@jenkinsdm1 12:05435282f899 286 //dot->getChannelPlanName causes hard faults, not sure why.
jenkins@jenkinsdm1 12:05435282f899 287 product = "DOT-BOX/EVB " + plan->GetPlanName();
jenkins@jenkinsdm1 12:05435282f899 288 if(product.size() > 17)
jenkins@jenkinsdm1 12:05435282f899 289 product = "DOT-BOX/EVB JAPAN";
Mike Fiore 1:71125aa00e33 290 LayoutScrollSelect menu(lcd, items, product, menu_strings[0]);
Mike Fiore 1:71125aa00e33 291 menu.display();
Mike Fiore 1:71125aa00e33 292
Mike Fiore 1:71125aa00e33 293 while (! mode_selected) {
jenkins@jenkinsdm1 12:05435282f899 294 lora_handler->resetActivityLed();
Mike Fiore 1:71125aa00e33 295 osEvent e = Thread::signal_wait(buttonSignal);
Mike Fiore 1:71125aa00e33 296 if (e.status == osEventSignal) {
Mike Fiore 1:71125aa00e33 297 ButtonHandler::ButtonEvent ev = buttons->getButtonEvent();
Mike Fiore 1:71125aa00e33 298 switch (ev) {
Mike Fiore 1:71125aa00e33 299 case ButtonHandler::sw1_press:
Mike Fiore 1:71125aa00e33 300 selected = menu.select();
Mike Fiore 1:71125aa00e33 301 mode_selected = true;
Mike Fiore 1:71125aa00e33 302 break;
Mike Fiore 1:71125aa00e33 303 case ButtonHandler::sw2_press:
Mike Fiore 1:71125aa00e33 304 menu.scroll();
Mike Fiore 1:71125aa00e33 305 break;
Mike Fiore 1:71125aa00e33 306 case ButtonHandler::sw1_hold:
Mike Fiore 1:71125aa00e33 307 break;
Mike Fiore 1:71125aa00e33 308 default:
Mike Fiore 1:71125aa00e33 309 break;
Mike Fiore 1:71125aa00e33 310 }
Mike Fiore 1:71125aa00e33 311 }
Mike Fiore 1:71125aa00e33 312 }
Mike Fiore 1:71125aa00e33 313 if (selected == menu_strings[demo]) {
Mike Fiore 1:71125aa00e33 314 if (modeJoin->start())
Mike Fiore 1:71125aa00e33 315 modeDemo->start();
Mike Fiore 1:71125aa00e33 316 } else if (selected == menu_strings[config]) {
Mike Fiore 1:71125aa00e33 317 modeConfig->start();
Mike Fiore 1:71125aa00e33 318 } else if (selected == menu_strings[single]) {
Mike Fiore 1:71125aa00e33 319 if (modeJoin->start())
Mike Fiore 1:71125aa00e33 320 modeSingle->start();
Mike Fiore 1:71125aa00e33 321 } else if (selected == menu_strings[sweep]) {
Mike Fiore 1:71125aa00e33 322 if (modeJoin->start())
Mike Fiore 1:71125aa00e33 323 modeSweep->start();
Mike Fiore 7:a31236c2e75c 324 } else if (selected == menu_strings[gps]) {
jenkins@jenkinsdm1 12:05435282f899 325 if (plan->IsPlanDynamic()) {
jenkins@jenkinsdm1 12:05435282f899 326 if(modeJoin->start())
jenkins@jenkinsdm1 12:05435282f899 327 modeGps->start();
Mike Fiore 7:a31236c2e75c 328 }
jenkins@jenkinsdm1 12:05435282f899 329 else {
jenkins@jenkinsdm1 12:05435282f899 330 modeGps->start();
jenkins@jenkinsdm1 12:05435282f899 331 }
Mike Fiore 7:a31236c2e75c 332 } else if (selected == menu_strings[data]) {
Mike Fiore 7:a31236c2e75c 333 modeData->start();
jenkins@jenkinsdm1 12:05435282f899 334 } else if (selected == menu_strings[region]) {
jenkins@jenkinsdm1 12:05435282f899 335 modeRegion->start();
jenkins@jenkinsdm1 12:05435282f899 336 }
jenkins@jenkinsdm1 12:05435282f899 337 lora_handler->resetActivityLed();
Mike Fiore 1:71125aa00e33 338 mode_selected = false;
Mike Fiore 1:71125aa00e33 339 }
Mike Fiore 1:71125aa00e33 340 }