Custom "Installer Assistant" software. Modified Single Sweep Mode. Goes right into single sweep mode upon power-up and displays signal strength. Works with mbed-os 5.1.2 and mdot lib 5.1.5

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

Fork of MTDOT-BOX-EVB-Factory-Firmware by MultiTech

Committer:
ScottHoppeMultitech
Date:
Thu Dec 28 21:35:48 2017 +0000
Revision:
12:671b15182260
Parent:
7:a31236c2e75c
Custom mDotBox software -modified single sweep mode - goes straight into a single sweep mode and display signal strength. Works With mbed-os 5.1.2 and mdot lib 5.1.5

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 #include "ModeConfig.h"
Mike Fiore 1:71125aa00e33 20 #include "ctype.h"
Mike Fiore 1:71125aa00e33 21 #include "Command.h"
Mike Fiore 1:71125aa00e33 22 #include "ButtonHandler.h"
Mike Fiore 1:71125aa00e33 23 #include <cstdarg>
Mike Fiore 1:71125aa00e33 24 #include <deque>
Mike Fiore 1:71125aa00e33 25
Mike Fiore 1:71125aa00e33 26 const char ModeConfig::newline[] = "\r\n";
Mike Fiore 1:71125aa00e33 27
Mike Fiore 1:71125aa00e33 28 // Command error text...
Mike Fiore 1:71125aa00e33 29 const char ModeConfig::command_error[] = "Command not found!\r\n";
Mike Fiore 1:71125aa00e33 30
Mike Fiore 1:71125aa00e33 31 // Response texts...
Mike Fiore 1:71125aa00e33 32 const char ModeConfig::done[] = "\r\nOK\r\n";
Mike Fiore 1:71125aa00e33 33 const char ModeConfig::error[] = "\r\nERROR\r\n";
Mike Fiore 1:71125aa00e33 34
Mike Fiore 1:71125aa00e33 35 void ModeConfig::addCommand(Command* cmd) {
Mike Fiore 1:71125aa00e33 36 _commands.push_back(cmd);
Mike Fiore 1:71125aa00e33 37 }
Mike Fiore 1:71125aa00e33 38
Mike Fiore 1:71125aa00e33 39 ModeConfig::ModeConfig(DOGS102* lcd, ButtonHandler* buttons, mDot* dot, LoRaHandler* lora, GPSPARSER* gps, SensorHandler* sensors)
Mike Fiore 1:71125aa00e33 40 : Mode(lcd, buttons, dot, lora, gps, sensors),
Mike Fiore 1:71125aa00e33 41 _lc(lcd),
Mike Fiore 1:71125aa00e33 42 _serial(USBTX, USBRX, 512, 512)
Mike Fiore 1:71125aa00e33 43 {
Mike Fiore 1:71125aa00e33 44 _serial.baud(115200);
Mike Fiore 1:71125aa00e33 45
Mike Fiore 1:71125aa00e33 46 addCommand(new CmdAttention(_dot));
Mike Fiore 1:71125aa00e33 47 addCommand(new CmdIdentification(_dot, _serial));
Mike Fiore 1:71125aa00e33 48 addCommand(new CmdFactoryDefault(_dot));
Mike Fiore 1:71125aa00e33 49 addCommand(new CmdSaveConfig(_dot));
Mike Fiore 1:71125aa00e33 50 addCommand(new CmdDisplayConfig(_dot, _serial));
Mike Fiore 1:71125aa00e33 51
Mike Fiore 1:71125aa00e33 52 addCommand(new CmdFrequencyBand(_dot, _serial));
Mike Fiore 1:71125aa00e33 53 addCommand(new CmdFrequencySubBand(_dot, _serial));
Mike Fiore 1:71125aa00e33 54 addCommand(new CmdPublicNetwork(_dot, _serial));
Mike Fiore 1:71125aa00e33 55 addCommand(new CmdDeviceId(_dot, _serial));
Mike Fiore 1:71125aa00e33 56
Mike Fiore 1:71125aa00e33 57 addCommand(new CmdNetworkAddress(_dot, _serial));
Mike Fiore 1:71125aa00e33 58 addCommand(new CmdNetworkSessionKey(_dot, _serial));
Mike Fiore 1:71125aa00e33 59 addCommand(new CmdDataSessionKey(_dot, _serial));
Mike Fiore 1:71125aa00e33 60 addCommand(new CmdNetworkKey(_dot, _serial));
Mike Fiore 1:71125aa00e33 61 addCommand(new CmdNetworkId(_dot, _serial));
Mike Fiore 1:71125aa00e33 62
Mike Fiore 1:71125aa00e33 63 addCommand(new CmdNetworkJoinMode(_dot, _serial));
Mike Fiore 1:71125aa00e33 64 addCommand(new CmdTxDataRate(_dot, _serial));
Mike Fiore 1:71125aa00e33 65 addCommand(new CmdTxPower(_dot, _serial));
Mike Fiore 1:71125aa00e33 66
Mike Fiore 1:71125aa00e33 67 addCommand(new CmdMinimumSize(_dot, _serial));
Mike Fiore 1:71125aa00e33 68 addCommand(new CmdMaximumSize(_dot, _serial));
Mike Fiore 1:71125aa00e33 69 addCommand(new CmdMinimumPower(_dot, _serial));
Mike Fiore 1:71125aa00e33 70 addCommand(new CmdMaximumPower(_dot, _serial));
Mike Fiore 1:71125aa00e33 71 addCommand(new CmdData(_dot, _serial));
Mike Fiore 1:71125aa00e33 72 addCommand(new CmdGetSurveyDataFile(_dot, _serial));
Mike Fiore 1:71125aa00e33 73 addCommand(new CmdDeleteSurveyDataFile(_dot, _serial));
Mike Fiore 1:71125aa00e33 74 addCommand(new CmdDummy(_dot, "Exit to main menu", "AT+EXIT", "Exit configuration and return to the main menu"));
Mike Fiore 1:71125aa00e33 75
Mike Fiore 1:71125aa00e33 76 #if MTS_RADIO_DEBUG_COMMANDS
Mike Fiore 1:71125aa00e33 77 addCommand(new CmdWriteProtectedConfig(_dot));
Mike Fiore 7:a31236c2e75c 78 addCommand(new CmdSendContinuous(_dot));
Mike Fiore 7:a31236c2e75c 79 addCommand(new CmdTxFrequency(_dot));
Mike Fiore 1:71125aa00e33 80 #endif
Mike Fiore 1:71125aa00e33 81 }
Mike Fiore 1:71125aa00e33 82
Mike Fiore 1:71125aa00e33 83 void ModeConfig::printHelp() {
Mike Fiore 1:71125aa00e33 84 const char* name = NULL;
Mike Fiore 1:71125aa00e33 85 const char* text = NULL;
Mike Fiore 1:71125aa00e33 86 const char* desc = NULL;
Mike Fiore 1:71125aa00e33 87 const char* tab = "\t";
Mike Fiore 1:71125aa00e33 88
Mike Fiore 1:71125aa00e33 89 std::string header("Command");
Mike Fiore 1:71125aa00e33 90 header.append(tab);
Mike Fiore 1:71125aa00e33 91 header.append(tab);
Mike Fiore 1:71125aa00e33 92 header.append("Name");
Mike Fiore 1:71125aa00e33 93 header.append(tab);
Mike Fiore 1:71125aa00e33 94 header.append(tab);
Mike Fiore 1:71125aa00e33 95 header.append(tab);
Mike Fiore 1:71125aa00e33 96 header.append("Description");
Mike Fiore 1:71125aa00e33 97
Mike Fiore 1:71125aa00e33 98 write(newline);
Mike Fiore 1:71125aa00e33 99 write(header.c_str());
Mike Fiore 1:71125aa00e33 100 write(newline);
Mike Fiore 1:71125aa00e33 101 write(newline);
Mike Fiore 1:71125aa00e33 102 for (std::vector<Command*>::iterator it = _commands.begin(); it != _commands.end(); ++it) {
Mike Fiore 1:71125aa00e33 103 name = (*it)->name();
Mike Fiore 1:71125aa00e33 104 text = (*it)->text();
Mike Fiore 1:71125aa00e33 105 desc = (*it)->desc();
Mike Fiore 1:71125aa00e33 106 write(text);
Mike Fiore 1:71125aa00e33 107 if (strlen(text) < 8)
Mike Fiore 1:71125aa00e33 108 write(tab);
Mike Fiore 1:71125aa00e33 109 write(tab);
Mike Fiore 1:71125aa00e33 110 write(name);
Mike Fiore 1:71125aa00e33 111 if (strlen(name) < 8)
Mike Fiore 1:71125aa00e33 112 write(tab);
Mike Fiore 1:71125aa00e33 113 if (strlen(name) < 16)
Mike Fiore 1:71125aa00e33 114 write(tab);
Mike Fiore 1:71125aa00e33 115 write(tab);
Mike Fiore 1:71125aa00e33 116 write(desc);
Mike Fiore 1:71125aa00e33 117 write(newline);
Mike Fiore 1:71125aa00e33 118 }
Mike Fiore 1:71125aa00e33 119
Mike Fiore 1:71125aa00e33 120 write(newline);
Mike Fiore 1:71125aa00e33 121 }
Mike Fiore 1:71125aa00e33 122
Mike Fiore 1:71125aa00e33 123 bool ModeConfig::writeable() {
Mike Fiore 1:71125aa00e33 124 return _serial.writeable();
Mike Fiore 1:71125aa00e33 125 }
Mike Fiore 1:71125aa00e33 126
Mike Fiore 1:71125aa00e33 127 bool ModeConfig::readable() {
Mike Fiore 1:71125aa00e33 128 return _serial.readable();
Mike Fiore 1:71125aa00e33 129 }
Mike Fiore 1:71125aa00e33 130
Mike Fiore 1:71125aa00e33 131 char ModeConfig::read() {
Mike Fiore 1:71125aa00e33 132 char ch;
Mike Fiore 1:71125aa00e33 133 _serial.read(&ch, 1);
Mike Fiore 1:71125aa00e33 134 return ch;
Mike Fiore 1:71125aa00e33 135 }
Mike Fiore 1:71125aa00e33 136
Mike Fiore 1:71125aa00e33 137 void ModeConfig::write(const char* message) {
Mike Fiore 1:71125aa00e33 138 while (!writeable())
Mike Fiore 1:71125aa00e33 139 ;
Mike Fiore 1:71125aa00e33 140 _serial.write(message, strlen(message));
Mike Fiore 1:71125aa00e33 141 }
Mike Fiore 1:71125aa00e33 142
Mike Fiore 1:71125aa00e33 143 void ModeConfig::writef(const char* format, ...) {
Mike Fiore 1:71125aa00e33 144 char buff[256];
Mike Fiore 1:71125aa00e33 145
Mike Fiore 1:71125aa00e33 146 va_list ap;
Mike Fiore 1:71125aa00e33 147 va_start(ap, format);
Mike Fiore 1:71125aa00e33 148 int size = vsnprintf(buff, 256, format, ap);
Mike Fiore 1:71125aa00e33 149 while (!writeable())
Mike Fiore 1:71125aa00e33 150 ;
Mike Fiore 1:71125aa00e33 151 _serial.write(buff, size);
Mike Fiore 1:71125aa00e33 152 va_end(ap);
Mike Fiore 1:71125aa00e33 153 }
Mike Fiore 1:71125aa00e33 154
Mike Fiore 1:71125aa00e33 155 bool ModeConfig::start() {
Mike Fiore 1:71125aa00e33 156 char ch;
Mike Fiore 1:71125aa00e33 157 bool running = true;
Mike Fiore 1:71125aa00e33 158 bool echo = _dot->getEcho();
Mike Fiore 1:71125aa00e33 159 std::string command;
Mike Fiore 1:71125aa00e33 160 std::deque<std::string> history;
Mike Fiore 1:71125aa00e33 161 int history_index = -1;
Mike Fiore 1:71125aa00e33 162 std::vector<std::string> args;
Mike Fiore 1:71125aa00e33 163
Mike Fiore 1:71125aa00e33 164 osSignalClear(_main_id, buttonSignal);
Mike Fiore 1:71125aa00e33 165
Mike Fiore 1:71125aa00e33 166 _lc.display();
Mike Fiore 1:71125aa00e33 167
Mike Fiore 1:71125aa00e33 168 //Run terminal session
Mike Fiore 1:71125aa00e33 169 while (running) {
Mike Fiore 1:71125aa00e33 170 _lc.roll();
Mike Fiore 1:71125aa00e33 171
Mike Fiore 1:71125aa00e33 172 osEvent e = Thread::signal_wait(buttonSignal, 20);
Mike Fiore 1:71125aa00e33 173 if (e.status == osEventSignal) {
Mike Fiore 1:71125aa00e33 174 ButtonHandler::ButtonEvent _be = _buttons->getButtonEvent();
Mike Fiore 1:71125aa00e33 175 switch (_be) {
Mike Fiore 1:71125aa00e33 176 case ButtonHandler::sw1_press:
Mike Fiore 1:71125aa00e33 177 break;
Mike Fiore 1:71125aa00e33 178 case ButtonHandler::sw2_press:
Mike Fiore 1:71125aa00e33 179 break;
Mike Fiore 1:71125aa00e33 180 case ButtonHandler::sw1_hold:
Mike Fiore 1:71125aa00e33 181 return true;
Mike Fiore 1:71125aa00e33 182 default:
Mike Fiore 1:71125aa00e33 183 break;
Mike Fiore 1:71125aa00e33 184 }
Mike Fiore 1:71125aa00e33 185 }
Mike Fiore 1:71125aa00e33 186
Mike Fiore 1:71125aa00e33 187 ch = '\0';
Mike Fiore 1:71125aa00e33 188
Mike Fiore 1:71125aa00e33 189 // read characters
Mike Fiore 1:71125aa00e33 190 if (readable()) {
Mike Fiore 1:71125aa00e33 191 ch = read();
Mike Fiore 1:71125aa00e33 192
Mike Fiore 1:71125aa00e33 193 if (ch == '\b' || ch == 0x7f) {
Mike Fiore 1:71125aa00e33 194 if (!command.empty()) {
Mike Fiore 1:71125aa00e33 195 writef("\b \b");
Mike Fiore 1:71125aa00e33 196 command.erase(command.size() - 1);
Mike Fiore 1:71125aa00e33 197 }
Mike Fiore 1:71125aa00e33 198 continue;
Mike Fiore 1:71125aa00e33 199 } else if (ch == 0x1b || ch == 0x09) {
Mike Fiore 1:71125aa00e33 200 osDelay(20);
Mike Fiore 1:71125aa00e33 201 // catch escape sequence, or tab
Mike Fiore 1:71125aa00e33 202 char ch1, ch2;
Mike Fiore 1:71125aa00e33 203
Mike Fiore 1:71125aa00e33 204 if (readable()) {
Mike Fiore 1:71125aa00e33 205 ch1 = read();
Mike Fiore 1:71125aa00e33 206 if (readable())
Mike Fiore 1:71125aa00e33 207 ch2 = read();
Mike Fiore 1:71125aa00e33 208
Mike Fiore 1:71125aa00e33 209 if (ch1 == 0x5b && ch2 == 0x41) {
Mike Fiore 1:71125aa00e33 210 // up key
Mike Fiore 1:71125aa00e33 211 for (int i = 0; i < command.size()+1; i++) {
Mike Fiore 1:71125aa00e33 212 writef("\b \b");
Mike Fiore 1:71125aa00e33 213 }
Mike Fiore 1:71125aa00e33 214 if (history.size() > 0) {
Mike Fiore 1:71125aa00e33 215 if (++history_index >= history.size() - 1)
Mike Fiore 1:71125aa00e33 216 history_index = history.size() - 1;
Mike Fiore 1:71125aa00e33 217
Mike Fiore 1:71125aa00e33 218 command = history[history_index];
Mike Fiore 1:71125aa00e33 219 writef("%s", history[history_index].c_str());
Mike Fiore 1:71125aa00e33 220 } else {
Mike Fiore 1:71125aa00e33 221 command.clear();
Mike Fiore 1:71125aa00e33 222 }
Mike Fiore 1:71125aa00e33 223 } else if (ch1 == 0x5b && ch2 == 0x42) {
Mike Fiore 1:71125aa00e33 224
Mike Fiore 1:71125aa00e33 225 // down key
Mike Fiore 1:71125aa00e33 226 for (int i = 0; i < command.size()+1; i++) {
Mike Fiore 1:71125aa00e33 227 writef("\b \b");
Mike Fiore 1:71125aa00e33 228 }
Mike Fiore 1:71125aa00e33 229
Mike Fiore 1:71125aa00e33 230 if (--history_index < 0) {
Mike Fiore 1:71125aa00e33 231 history_index = -1;
Mike Fiore 1:71125aa00e33 232 command.clear();
Mike Fiore 1:71125aa00e33 233 } else {
Mike Fiore 1:71125aa00e33 234 command = history[history_index];
Mike Fiore 1:71125aa00e33 235 writef("%s", history[history_index].c_str());
Mike Fiore 1:71125aa00e33 236 }
Mike Fiore 1:71125aa00e33 237 }
Mike Fiore 1:71125aa00e33 238 }
Mike Fiore 1:71125aa00e33 239 while (readable()) read();
Mike Fiore 1:71125aa00e33 240 continue;
Mike Fiore 1:71125aa00e33 241 } else {
Mike Fiore 1:71125aa00e33 242 command += ch;
Mike Fiore 1:71125aa00e33 243 }
Mike Fiore 1:71125aa00e33 244
Mike Fiore 1:71125aa00e33 245 // echo chars if enabled
Mike Fiore 1:71125aa00e33 246 if (echo && !(ch == '\r' || ch == '\n'))
Mike Fiore 1:71125aa00e33 247 writef("%c", ch);
Mike Fiore 1:71125aa00e33 248 }
Mike Fiore 1:71125aa00e33 249
Mike Fiore 1:71125aa00e33 250 // look for end of command line
Mike Fiore 1:71125aa00e33 251 if (command.find("\n") != std::string::npos || command.find("\r") != std::string::npos) {
Mike Fiore 1:71125aa00e33 252 // remove new line or cr character
Mike Fiore 1:71125aa00e33 253 command.erase(command.size() - 1);
Mike Fiore 1:71125aa00e33 254 write("\r"); // match standard modem output
Mike Fiore 1:71125aa00e33 255 write(newline);
Mike Fiore 1:71125aa00e33 256 } else {
Mike Fiore 1:71125aa00e33 257 continue;
Mike Fiore 1:71125aa00e33 258 }
Mike Fiore 1:71125aa00e33 259
Mike Fiore 1:71125aa00e33 260 // trim whitespace from command
Mike Fiore 1:71125aa00e33 261 mts::Text::trim(command, "\r\n\t ");
Mike Fiore 1:71125aa00e33 262
Mike Fiore 1:71125aa00e33 263 if (command.size() < 1) {
Mike Fiore 1:71125aa00e33 264 command.clear();
Mike Fiore 1:71125aa00e33 265 continue;
Mike Fiore 1:71125aa00e33 266 }
Mike Fiore 1:71125aa00e33 267
Mike Fiore 1:71125aa00e33 268 // parse command and args
Mike Fiore 1:71125aa00e33 269 args.clear();
Mike Fiore 1:71125aa00e33 270
Mike Fiore 1:71125aa00e33 271 // find first '=' character
Mike Fiore 1:71125aa00e33 272 size_t delim_index = command.find("=");
Mike Fiore 1:71125aa00e33 273 if (delim_index != std::string::npos) {
Mike Fiore 1:71125aa00e33 274 args.push_back(command.substr(0, delim_index));
Mike Fiore 1:71125aa00e33 275 } else {
Mike Fiore 1:71125aa00e33 276 // find first ' ' character
Mike Fiore 1:71125aa00e33 277 delim_index = command.find(" ");
Mike Fiore 1:71125aa00e33 278 if (delim_index != std::string::npos) {
Mike Fiore 1:71125aa00e33 279 args.push_back(command.substr(0, delim_index));
Mike Fiore 1:71125aa00e33 280 } else {
Mike Fiore 1:71125aa00e33 281 args.push_back(command);
Mike Fiore 1:71125aa00e33 282 }
Mike Fiore 1:71125aa00e33 283 }
Mike Fiore 1:71125aa00e33 284
Mike Fiore 1:71125aa00e33 285 if (delim_index != std::string::npos) {
Mike Fiore 1:71125aa00e33 286 std::vector<std::string> params = mts::Text::split(command.substr(delim_index + 1), ",");
Mike Fiore 1:71125aa00e33 287 args.insert(args.end(), params.begin(), params.end());
Mike Fiore 1:71125aa00e33 288 }
Mike Fiore 1:71125aa00e33 289
Mike Fiore 1:71125aa00e33 290 args[0] = mts::Text::toUpper(args[0]);
Mike Fiore 1:71125aa00e33 291
Mike Fiore 1:71125aa00e33 292 // print help
Mike Fiore 1:71125aa00e33 293 if ((args[0].find("?") == 0 || args[0].find("HELP") == 0) && args.size() == 1) {
Mike Fiore 1:71125aa00e33 294 printHelp();
Mike Fiore 1:71125aa00e33 295 command.clear();
Mike Fiore 1:71125aa00e33 296 } else if (args[0].find("AT+EXIT") == 0 && args[0].length() == 7) {
Mike Fiore 1:71125aa00e33 297 write(done);
Mike Fiore 1:71125aa00e33 298 return true;
Mike Fiore 1:71125aa00e33 299 } else {
Mike Fiore 1:71125aa00e33 300 bool found = false;
Mike Fiore 1:71125aa00e33 301 bool query = false;
Mike Fiore 1:71125aa00e33 302
Mike Fiore 1:71125aa00e33 303 std::string lookfor = args[0];
Mike Fiore 1:71125aa00e33 304
Mike Fiore 1:71125aa00e33 305 // per command help
Mike Fiore 1:71125aa00e33 306 if ((args[0].find("?") == 0 || args[0].find("HELP") == 0))
Mike Fiore 1:71125aa00e33 307 lookfor = mts::Text::toUpper(args[1]);
Mike Fiore 1:71125aa00e33 308
Mike Fiore 1:71125aa00e33 309 // trim off any trailing '?' and mark as a query command
Mike Fiore 1:71125aa00e33 310 if (args[0].rfind("?") == args[0].length() - 1) {
Mike Fiore 1:71125aa00e33 311 query = true;
Mike Fiore 1:71125aa00e33 312 lookfor = args[0].substr(0, args[0].length() - 1);
Mike Fiore 1:71125aa00e33 313 }
Mike Fiore 1:71125aa00e33 314
Mike Fiore 1:71125aa00e33 315 // search for command
Mike Fiore 1:71125aa00e33 316 for (std::vector<Command*>::iterator it = _commands.begin(); it != _commands.end() && !found; ++it) {
Mike Fiore 1:71125aa00e33 317 Command* cmd = *it;
Mike Fiore 1:71125aa00e33 318
Mike Fiore 1:71125aa00e33 319 // match CMD or CMD? syntax if command is queryable
Mike Fiore 1:71125aa00e33 320 if (lookfor == cmd->text() && (!query || (query && cmd->queryable()))) {
Mike Fiore 1:71125aa00e33 321 found = true;
Mike Fiore 1:71125aa00e33 322 if (args[0] == "HELP") {
Mike Fiore 1:71125aa00e33 323 writef("%s%s", cmd->help(), newline);
Mike Fiore 1:71125aa00e33 324 write(done);
Mike Fiore 1:71125aa00e33 325 }
Mike Fiore 1:71125aa00e33 326
Mike Fiore 1:71125aa00e33 327 else if (args.size() > 1 && args[1] == "?") {
Mike Fiore 1:71125aa00e33 328 writef("%s%s", cmd->usage().c_str(), newline);
Mike Fiore 1:71125aa00e33 329 write(done);
Mike Fiore 1:71125aa00e33 330 } else if (!cmd->verify(args)) {
Mike Fiore 1:71125aa00e33 331 writef("%s%s", cmd->errorMessage().c_str(), newline);
Mike Fiore 1:71125aa00e33 332 writef("%s", error);
Mike Fiore 1:71125aa00e33 333 } else {
Mike Fiore 1:71125aa00e33 334 if (cmd->action(args) == 0) {
Mike Fiore 1:71125aa00e33 335 writef("%s", done);
Mike Fiore 1:71125aa00e33 336 } else {
Mike Fiore 1:71125aa00e33 337 writef("%s%s", cmd->errorMessage().c_str(), newline);
Mike Fiore 1:71125aa00e33 338 writef("%s", error);
Mike Fiore 1:71125aa00e33 339 }
Mike Fiore 1:71125aa00e33 340 }
Mike Fiore 1:71125aa00e33 341 }
Mike Fiore 1:71125aa00e33 342 }
Mike Fiore 1:71125aa00e33 343
Mike Fiore 1:71125aa00e33 344 if (!found) {
Mike Fiore 1:71125aa00e33 345 writef("%s", command_error);
Mike Fiore 1:71125aa00e33 346 writef("%s", error);
Mike Fiore 1:71125aa00e33 347 }
Mike Fiore 1:71125aa00e33 348 }
Mike Fiore 1:71125aa00e33 349
Mike Fiore 1:71125aa00e33 350 if (history.size() == 0 || history.front() != command)
Mike Fiore 1:71125aa00e33 351 history.push_front(command);
Mike Fiore 1:71125aa00e33 352 history_index = -1;
Mike Fiore 1:71125aa00e33 353 command.clear();
Mike Fiore 1:71125aa00e33 354
Mike Fiore 1:71125aa00e33 355 while (history.size() > 10)
Mike Fiore 1:71125aa00e33 356 history.pop_back();
Mike Fiore 1:71125aa00e33 357
Mike Fiore 1:71125aa00e33 358 }
Mike Fiore 1:71125aa00e33 359 return false;
Mike Fiore 1:71125aa00e33 360 }