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
Mode/ModeConfig.cpp@12:671b15182260, 2017-12-28 (annotated)
- 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?
User | Revision | Line number | New 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 | } |