MultiTech / Mbed OS mDot_AT_firmware_CUSTOM

Dependencies:   libmDot-Custom MTS-Serial

Fork of mDot_AT_firmware_CUSTOM by Jason Reiss

To change channel plans replace AS923 with AU915, EU868, KR920 or US915 on line 15

#define CHANNEL_PLAN CP_AS923

See Supported Channel Plans

Committer:
jreiss
Date:
Mon Aug 29 14:05:16 2016 +0000
Revision:
12:98445fa50cd3
Parent:
11:05e0f30c03a6
Child:
15:36db31c18231
at firmware with libmDot with custom channel plan support;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jreiss 12:98445fa50cd3 1 #include "ctype.h"
jreiss 12:98445fa50cd3 2 #include "CommandTerminal.h"
jreiss 12:98445fa50cd3 3 #include "Command.h"
jreiss 12:98445fa50cd3 4 #include "MTSLog.h"
jreiss 12:98445fa50cd3 5 #include <cstdarg>
jreiss 12:98445fa50cd3 6 #include <deque>
jreiss 12:98445fa50cd3 7 #if defined(TARGET_XDOT_L151CC)
jreiss 12:98445fa50cd3 8 #include "xdot_low_power.h"
jreiss 12:98445fa50cd3 9 #endif
jreiss 12:98445fa50cd3 10
jreiss 12:98445fa50cd3 11 #if defined(TARGET_MTS_MDOT_F411RE)
jreiss 12:98445fa50cd3 12 const char CommandTerminal::banner[] = "\r\n\nMultiTech Systems LoRa XBee Module\r\n\n";
jreiss 12:98445fa50cd3 13 #else
jreiss 12:98445fa50cd3 14 const char CommandTerminal::banner[] = "\r\n\nMultiTech Systems LoRa xDot Module\r\n\n";
jreiss 12:98445fa50cd3 15 #endif
jreiss 12:98445fa50cd3 16 const char CommandTerminal::helpline[] = "Enter '?' for help\r\n";
jreiss 12:98445fa50cd3 17
jreiss 12:98445fa50cd3 18 const char CommandTerminal::newline[] = "\r\n";
jreiss 12:98445fa50cd3 19
jreiss 12:98445fa50cd3 20 // Command error text...
jreiss 12:98445fa50cd3 21 const char CommandTerminal::command_error[] = "Command not found!\r\n";
jreiss 12:98445fa50cd3 22
jreiss 12:98445fa50cd3 23 // Response texts...
jreiss 12:98445fa50cd3 24 const char CommandTerminal::help[] = "\r\nHelp\r\n";
jreiss 12:98445fa50cd3 25 const char CommandTerminal::cmd_error[] = "Invalid command\r\n";
jreiss 12:98445fa50cd3 26 const char CommandTerminal::connect[] = "\r\nCONNECT\r\n";
jreiss 12:98445fa50cd3 27 const char CommandTerminal::no_carrier[] = "\r\nNO CARRIER\r\n";
jreiss 12:98445fa50cd3 28 const char CommandTerminal::done[] = "\r\nOK\r\n";
jreiss 12:98445fa50cd3 29 const char CommandTerminal::error[] = "\r\nERROR\r\n";
jreiss 12:98445fa50cd3 30
jreiss 12:98445fa50cd3 31 // Escape sequence...
jreiss 12:98445fa50cd3 32 const char CommandTerminal::escape_sequence[] = "+++";
jreiss 12:98445fa50cd3 33
jreiss 12:98445fa50cd3 34 mts::ATSerial* CommandTerminal::_serialp = NULL;
jreiss 12:98445fa50cd3 35 mDot* CommandTerminal::_dot = NULL;
jreiss 12:98445fa50cd3 36
jreiss 12:98445fa50cd3 37 CommandTerminal::RadioEvent* CommandTerminal::_events = new RadioEvent();
jreiss 12:98445fa50cd3 38
jreiss 12:98445fa50cd3 39 static bool serial_data_mode = false;
jreiss 12:98445fa50cd3 40 static bool peer_to_peer = false;
jreiss 12:98445fa50cd3 41
jreiss 12:98445fa50cd3 42 std::string CommandTerminal::_errorMessage = "";
jreiss 12:98445fa50cd3 43
jreiss 12:98445fa50cd3 44 void CommandTerminal::setErrorMessage(const char* message) {
jreiss 12:98445fa50cd3 45 _errorMessage.assign(message);
jreiss 12:98445fa50cd3 46 }
jreiss 12:98445fa50cd3 47
jreiss 12:98445fa50cd3 48 void CommandTerminal::setErrorMessage(const std::string& message) {
jreiss 12:98445fa50cd3 49 _errorMessage.assign(message);
jreiss 12:98445fa50cd3 50 }
jreiss 12:98445fa50cd3 51
jreiss 12:98445fa50cd3 52 const Command CommandTerminal::_commands[NO_OF_COMMANDS] = {
jreiss 12:98445fa50cd3 53 CmdAttention(),
jreiss 12:98445fa50cd3 54 CmdIdentification(),
jreiss 12:98445fa50cd3 55 CmdResetCpu(),
jreiss 12:98445fa50cd3 56 CmdDummy("Enable/Disable Echo", "ATE", "ATE0: disable, ATE1: enable", "(0,1)"),
jreiss 12:98445fa50cd3 57 CmdDummy("Enable/Disable Verbose", "ATV", "ATV0: disable, ATV1: enable", "(0,1)"),
jreiss 12:98445fa50cd3 58 CmdDummy("Hardware Flow Control", "AT&K", "AT&K0: disable, AT&K3: enable", "(0,3)"),
jreiss 12:98445fa50cd3 59
jreiss 12:98445fa50cd3 60 CmdFactoryDefault(),
jreiss 12:98445fa50cd3 61 CmdSaveConfig(),
jreiss 12:98445fa50cd3 62 CmdDisplayConfig(),
jreiss 12:98445fa50cd3 63 CmdDisplayStats(),
jreiss 12:98445fa50cd3 64 CmdResetStats(),
jreiss 12:98445fa50cd3 65 CmdSerialBaudRate(),
jreiss 12:98445fa50cd3 66 CmdDebugBaudRate(),
jreiss 12:98445fa50cd3 67 CmdStartUpMode(),
jreiss 12:98445fa50cd3 68
jreiss 12:98445fa50cd3 69 CmdFrequencyBand(),
jreiss 12:98445fa50cd3 70 CmdFrequencySubBand(),
jreiss 12:98445fa50cd3 71 CmdPublicNetwork(),
jreiss 12:98445fa50cd3 72 CmdDeviceId(),
jreiss 12:98445fa50cd3 73 CmdDeviceClass(),
jreiss 12:98445fa50cd3 74
jreiss 12:98445fa50cd3 75 CmdAppPort(),
jreiss 12:98445fa50cd3 76 CmdNetworkAddress(),
jreiss 12:98445fa50cd3 77 CmdNetworkSessionKey(),
jreiss 12:98445fa50cd3 78 CmdDataSessionKey(),
jreiss 12:98445fa50cd3 79 CmdUplinkCounter(),
jreiss 12:98445fa50cd3 80 CmdDownlinkCounter(),
jreiss 12:98445fa50cd3 81 CmdSaveSession(),
jreiss 12:98445fa50cd3 82 CmdRestoreSession(),
jreiss 12:98445fa50cd3 83 CmdNetworkKey(),
jreiss 12:98445fa50cd3 84 CmdNetworkId(),
jreiss 12:98445fa50cd3 85
jreiss 12:98445fa50cd3 86 CmdJoinDelay(),
jreiss 12:98445fa50cd3 87 CmdJoinRequest(),
jreiss 12:98445fa50cd3 88 CmdJoinRetries(),
jreiss 12:98445fa50cd3 89 CmdJoinByteOrder(),
jreiss 12:98445fa50cd3 90 CmdNetworkJoinMode(),
jreiss 12:98445fa50cd3 91 CmdPreserveSession(),
jreiss 12:98445fa50cd3 92 CmdNetworkJoinStatus(),
jreiss 12:98445fa50cd3 93 CmdNetworkLinkCheck(),
jreiss 12:98445fa50cd3 94 CmdLinkCheckCount(),
jreiss 12:98445fa50cd3 95 CmdLinkCheckThreshold(),
jreiss 12:98445fa50cd3 96 CmdEncryption(),
jreiss 12:98445fa50cd3 97
jreiss 12:98445fa50cd3 98 CmdRssi(),
jreiss 12:98445fa50cd3 99 CmdSnr(),
jreiss 12:98445fa50cd3 100 CmdDataPending(),
jreiss 12:98445fa50cd3 101
jreiss 12:98445fa50cd3 102 CmdSessionDataRate(),
jreiss 12:98445fa50cd3 103 CmdChannelMask(),
jreiss 12:98445fa50cd3 104
jreiss 12:98445fa50cd3 105 CmdTxDataRate(),
jreiss 12:98445fa50cd3 106 CmdTxPower(),
jreiss 12:98445fa50cd3 107 CmdAntennaGain(),
jreiss 12:98445fa50cd3 108 CmdTxFrequency(),
jreiss 12:98445fa50cd3 109 CmdTxInverted(),
jreiss 12:98445fa50cd3 110 CmdTxWait(),
jreiss 12:98445fa50cd3 111 CmdTxChannel(),
jreiss 12:98445fa50cd3 112 CmdTxNextMs(),
jreiss 12:98445fa50cd3 113 CmdTimeOnAir(),
jreiss 12:98445fa50cd3 114
jreiss 12:98445fa50cd3 115 CmdRxDelay(),
jreiss 12:98445fa50cd3 116 CmdRxOutput(),
jreiss 12:98445fa50cd3 117 CmdRxInverted(),
jreiss 12:98445fa50cd3 118
jreiss 12:98445fa50cd3 119 CmdErrorCorrection(),
jreiss 12:98445fa50cd3 120 CmdCRC(),
jreiss 12:98445fa50cd3 121 CmdAdaptiveDataRate(),
jreiss 12:98445fa50cd3 122
jreiss 12:98445fa50cd3 123 CmdACKAttempts(),
jreiss 12:98445fa50cd3 124 CmdRepeat(),
jreiss 12:98445fa50cd3 125 CmdMacCmd(),
jreiss 12:98445fa50cd3 126
jreiss 12:98445fa50cd3 127 CmdSendString(),
jreiss 12:98445fa50cd3 128 CmdSendBinary(),
jreiss 12:98445fa50cd3 129 CmdReceiveOnce(),
jreiss 12:98445fa50cd3 130
jreiss 12:98445fa50cd3 131 CmdDummy("Serial Data Mode", "AT+SD", "Enter serial data mode, exit with '+++'", "NONE"),
jreiss 12:98445fa50cd3 132 CmdDummy("Sleep Mode", "AT+SLEEP", "Enter sleep mode (0:deepsleep,1:sleep)", "(0,1)"),
jreiss 12:98445fa50cd3 133 CmdSerialClearOnError(),
jreiss 12:98445fa50cd3 134 CmdWakeMode(),
jreiss 12:98445fa50cd3 135 CmdWakeInterval(),
jreiss 12:98445fa50cd3 136 CmdWakePin(),
jreiss 12:98445fa50cd3 137 CmdWakeDelay(),
jreiss 12:98445fa50cd3 138 CmdWakeTimeout(),
jreiss 12:98445fa50cd3 139 CmdPing(),
jreiss 12:98445fa50cd3 140 CmdLogLevel(),
jreiss 12:98445fa50cd3 141
jreiss 12:98445fa50cd3 142 CmdDummy("***** Test Commands *****", "", "", ""),
jreiss 12:98445fa50cd3 143 CmdRxDataRate(),
jreiss 12:98445fa50cd3 144 CmdRxFrequency(),
jreiss 12:98445fa50cd3 145 CmdReceiveContinuous(),
jreiss 12:98445fa50cd3 146 CmdSendStringOnInterval(),
jreiss 12:98445fa50cd3 147 };
jreiss 12:98445fa50cd3 148
jreiss 12:98445fa50cd3 149 const verify_ptr_t CommandTerminal::_verify[NO_OF_COMMANDS] = {
jreiss 12:98445fa50cd3 150 CmdDummy::verify,
jreiss 12:98445fa50cd3 151 CmdDummy::verify,
jreiss 12:98445fa50cd3 152 CmdDummy::verify,
jreiss 12:98445fa50cd3 153 CmdDummy::verify,
jreiss 12:98445fa50cd3 154 CmdDummy::verify,
jreiss 12:98445fa50cd3 155 CmdDummy::verify,
jreiss 12:98445fa50cd3 156
jreiss 12:98445fa50cd3 157 CmdDummy::verify,
jreiss 12:98445fa50cd3 158 CmdDummy::verify,
jreiss 12:98445fa50cd3 159 CmdDummy::verify,
jreiss 12:98445fa50cd3 160 CmdDummy::verify,
jreiss 12:98445fa50cd3 161 CmdDummy::verify,
jreiss 12:98445fa50cd3 162 CmdSerialBaudRate::verify,
jreiss 12:98445fa50cd3 163 CmdDebugBaudRate::verify,
jreiss 12:98445fa50cd3 164 CmdStartUpMode::verify,
jreiss 12:98445fa50cd3 165
jreiss 12:98445fa50cd3 166 CmdFrequencyBand::verify,
jreiss 12:98445fa50cd3 167 CmdFrequencySubBand::verify,
jreiss 12:98445fa50cd3 168 CmdPublicNetwork::verify,
jreiss 12:98445fa50cd3 169 CmdDeviceId::verify,
jreiss 12:98445fa50cd3 170 CmdDeviceClass::verify,
jreiss 12:98445fa50cd3 171
jreiss 12:98445fa50cd3 172 CmdAppPort::verify,
jreiss 12:98445fa50cd3 173 CmdNetworkAddress::verify,
jreiss 12:98445fa50cd3 174 CmdNetworkSessionKey::verify,
jreiss 12:98445fa50cd3 175 CmdDataSessionKey::verify,
jreiss 12:98445fa50cd3 176 CmdUplinkCounter::verify,
jreiss 12:98445fa50cd3 177 CmdDownlinkCounter::verify,
jreiss 12:98445fa50cd3 178 CmdDummy::verify,
jreiss 12:98445fa50cd3 179 CmdDummy::verify,
jreiss 12:98445fa50cd3 180 CmdNetworkKey::verify,
jreiss 12:98445fa50cd3 181 CmdNetworkId::verify,
jreiss 12:98445fa50cd3 182
jreiss 12:98445fa50cd3 183 CmdJoinDelay::verify,
jreiss 12:98445fa50cd3 184 CmdJoinRequest::verify,
jreiss 12:98445fa50cd3 185 CmdJoinRetries::verify,
jreiss 12:98445fa50cd3 186 CmdJoinByteOrder::verify,
jreiss 12:98445fa50cd3 187 CmdNetworkJoinMode::verify,
jreiss 12:98445fa50cd3 188 CmdPreserveSession::verify,
jreiss 12:98445fa50cd3 189 CmdDummy::verify,
jreiss 12:98445fa50cd3 190 CmdDummy::verify,
jreiss 12:98445fa50cd3 191 CmdLinkCheckCount::verify,
jreiss 12:98445fa50cd3 192 CmdLinkCheckThreshold::verify,
jreiss 12:98445fa50cd3 193 CmdEncryption::verify,
jreiss 12:98445fa50cd3 194
jreiss 12:98445fa50cd3 195 CmdDummy::verify,
jreiss 12:98445fa50cd3 196 CmdDummy::verify,
jreiss 12:98445fa50cd3 197 CmdDummy::verify,
jreiss 12:98445fa50cd3 198
jreiss 12:98445fa50cd3 199 CmdSessionDataRate::verify,
jreiss 12:98445fa50cd3 200 CmdChannelMask::verify,
jreiss 12:98445fa50cd3 201
jreiss 12:98445fa50cd3 202 CmdTxDataRate::verify,
jreiss 12:98445fa50cd3 203 CmdTxPower::verify,
jreiss 12:98445fa50cd3 204 CmdAntennaGain::verify,
jreiss 12:98445fa50cd3 205 CmdTxFrequency::verify,
jreiss 12:98445fa50cd3 206 CmdTxInverted::verify,
jreiss 12:98445fa50cd3 207 CmdTxWait::verify,
jreiss 12:98445fa50cd3 208 CmdTxChannel::verify,
jreiss 12:98445fa50cd3 209 CmdTxNextMs::verify,
jreiss 12:98445fa50cd3 210 CmdTimeOnAir::verify,
jreiss 12:98445fa50cd3 211
jreiss 12:98445fa50cd3 212 CmdRxDelay::verify,
jreiss 12:98445fa50cd3 213 CmdRxOutput::verify,
jreiss 12:98445fa50cd3 214 CmdRxInverted::verify,
jreiss 12:98445fa50cd3 215
jreiss 12:98445fa50cd3 216 CmdErrorCorrection::verify,
jreiss 12:98445fa50cd3 217 CmdCRC::verify,
jreiss 12:98445fa50cd3 218 CmdAdaptiveDataRate::verify,
jreiss 12:98445fa50cd3 219
jreiss 12:98445fa50cd3 220 CmdACKAttempts::verify,
jreiss 12:98445fa50cd3 221 CmdRepeat::verify,
jreiss 12:98445fa50cd3 222 CmdMacCmd::verify,
jreiss 12:98445fa50cd3 223
jreiss 12:98445fa50cd3 224 CmdSendString::verify,
jreiss 12:98445fa50cd3 225 CmdSendBinary::verify,
jreiss 12:98445fa50cd3 226 CmdReceiveOnce::verify,
jreiss 12:98445fa50cd3 227
jreiss 12:98445fa50cd3 228 CmdDummy::verify,
jreiss 12:98445fa50cd3 229 CmdDummy::verify,
jreiss 12:98445fa50cd3 230 CmdSerialClearOnError::verify,
jreiss 12:98445fa50cd3 231 CmdWakeMode::verify,
jreiss 12:98445fa50cd3 232 CmdWakeInterval::verify,
jreiss 12:98445fa50cd3 233 CmdWakePin::verify,
jreiss 12:98445fa50cd3 234 CmdWakeDelay::verify,
jreiss 12:98445fa50cd3 235 CmdWakeTimeout::verify,
jreiss 12:98445fa50cd3 236 CmdDummy::verify,
jreiss 12:98445fa50cd3 237 CmdLogLevel::verify,
jreiss 12:98445fa50cd3 238
jreiss 12:98445fa50cd3 239 CmdDummy::verify,
jreiss 12:98445fa50cd3 240 CmdRxDataRate::verify,
jreiss 12:98445fa50cd3 241 CmdRxFrequency::verify,
jreiss 12:98445fa50cd3 242 CmdReceiveContinuous::verify,
jreiss 12:98445fa50cd3 243 CmdSendStringOnInterval::verify,
jreiss 12:98445fa50cd3 244 };
jreiss 12:98445fa50cd3 245
jreiss 12:98445fa50cd3 246 const action_ptr_t CommandTerminal::_action[NO_OF_COMMANDS] = {
jreiss 12:98445fa50cd3 247 CmdAttention::action,
jreiss 12:98445fa50cd3 248 CmdIdentification::action,
jreiss 12:98445fa50cd3 249 CmdResetCpu::action,
jreiss 12:98445fa50cd3 250 CmdDummy::action,
jreiss 12:98445fa50cd3 251 CmdDummy::action,
jreiss 12:98445fa50cd3 252 CmdDummy::action,
jreiss 12:98445fa50cd3 253
jreiss 12:98445fa50cd3 254 CmdFactoryDefault::action,
jreiss 12:98445fa50cd3 255 CmdSaveConfig::action,
jreiss 12:98445fa50cd3 256 CmdDisplayConfig::action,
jreiss 12:98445fa50cd3 257 CmdDisplayStats::action,
jreiss 12:98445fa50cd3 258 CmdResetStats::action,
jreiss 12:98445fa50cd3 259 CmdSerialBaudRate::action,
jreiss 12:98445fa50cd3 260 CmdDebugBaudRate::action,
jreiss 12:98445fa50cd3 261 CmdStartUpMode::action,
jreiss 12:98445fa50cd3 262
jreiss 12:98445fa50cd3 263 CmdFrequencyBand::action,
jreiss 12:98445fa50cd3 264 CmdFrequencySubBand::action,
jreiss 12:98445fa50cd3 265 CmdPublicNetwork::action,
jreiss 12:98445fa50cd3 266 CmdDeviceId::action,
jreiss 12:98445fa50cd3 267 CmdDeviceClass::action,
jreiss 12:98445fa50cd3 268
jreiss 12:98445fa50cd3 269 CmdAppPort::action,
jreiss 12:98445fa50cd3 270 CmdNetworkAddress::action,
jreiss 12:98445fa50cd3 271 CmdNetworkSessionKey::action,
jreiss 12:98445fa50cd3 272 CmdDataSessionKey::action,
jreiss 12:98445fa50cd3 273 CmdUplinkCounter::action,
jreiss 12:98445fa50cd3 274 CmdDownlinkCounter::action,
jreiss 12:98445fa50cd3 275 CmdSaveSession::action,
jreiss 12:98445fa50cd3 276 CmdRestoreSession::action,
jreiss 12:98445fa50cd3 277 CmdNetworkKey::action,
jreiss 12:98445fa50cd3 278 CmdNetworkId::action,
jreiss 12:98445fa50cd3 279
jreiss 12:98445fa50cd3 280 CmdJoinDelay::action,
jreiss 12:98445fa50cd3 281 CmdJoinRequest::action,
jreiss 12:98445fa50cd3 282 CmdJoinRetries::action,
jreiss 12:98445fa50cd3 283 CmdJoinByteOrder::action,
jreiss 12:98445fa50cd3 284 CmdNetworkJoinMode::action,
jreiss 12:98445fa50cd3 285 CmdPreserveSession::action,
jreiss 12:98445fa50cd3 286 CmdNetworkJoinStatus::action,
jreiss 12:98445fa50cd3 287 CmdNetworkLinkCheck::action,
jreiss 12:98445fa50cd3 288 CmdLinkCheckCount::action,
jreiss 12:98445fa50cd3 289 CmdLinkCheckThreshold::action,
jreiss 12:98445fa50cd3 290 CmdEncryption::action,
jreiss 12:98445fa50cd3 291
jreiss 12:98445fa50cd3 292 CmdRssi::action,
jreiss 12:98445fa50cd3 293 CmdSnr::action,
jreiss 12:98445fa50cd3 294 CmdDataPending::action,
jreiss 12:98445fa50cd3 295
jreiss 12:98445fa50cd3 296 CmdSessionDataRate::action,
jreiss 12:98445fa50cd3 297 CmdChannelMask::action,
jreiss 12:98445fa50cd3 298
jreiss 12:98445fa50cd3 299 CmdTxDataRate::action,
jreiss 12:98445fa50cd3 300 CmdTxPower::action,
jreiss 12:98445fa50cd3 301 CmdAntennaGain::action,
jreiss 12:98445fa50cd3 302 CmdTxFrequency::action,
jreiss 12:98445fa50cd3 303 CmdTxInverted::action,
jreiss 12:98445fa50cd3 304 CmdTxWait::action,
jreiss 12:98445fa50cd3 305 CmdTxChannel::action,
jreiss 12:98445fa50cd3 306 CmdTxNextMs::action,
jreiss 12:98445fa50cd3 307 CmdTimeOnAir::action,
jreiss 12:98445fa50cd3 308
jreiss 12:98445fa50cd3 309 CmdRxDelay::action,
jreiss 12:98445fa50cd3 310 CmdRxOutput::action,
jreiss 12:98445fa50cd3 311 CmdRxInverted::action,
jreiss 12:98445fa50cd3 312
jreiss 12:98445fa50cd3 313 CmdErrorCorrection::action,
jreiss 12:98445fa50cd3 314 CmdCRC::action,
jreiss 12:98445fa50cd3 315 CmdAdaptiveDataRate::action,
jreiss 12:98445fa50cd3 316
jreiss 12:98445fa50cd3 317 CmdACKAttempts::action,
jreiss 12:98445fa50cd3 318 CmdRepeat::action,
jreiss 12:98445fa50cd3 319 CmdMacCmd::action,
jreiss 12:98445fa50cd3 320
jreiss 12:98445fa50cd3 321 CmdSendString::action,
jreiss 12:98445fa50cd3 322 CmdSendBinary::action,
jreiss 12:98445fa50cd3 323 CmdReceiveOnce::action,
jreiss 12:98445fa50cd3 324
jreiss 12:98445fa50cd3 325 CmdDummy::action,
jreiss 12:98445fa50cd3 326 CmdDummy::action,
jreiss 12:98445fa50cd3 327 CmdSerialClearOnError::action,
jreiss 12:98445fa50cd3 328 CmdWakeMode::action,
jreiss 12:98445fa50cd3 329 CmdWakeInterval::action,
jreiss 12:98445fa50cd3 330 CmdWakePin::action,
jreiss 12:98445fa50cd3 331 CmdWakeDelay::action,
jreiss 12:98445fa50cd3 332 CmdWakeTimeout::action,
jreiss 12:98445fa50cd3 333 CmdPing::action,
jreiss 12:98445fa50cd3 334 CmdLogLevel::action,
jreiss 12:98445fa50cd3 335
jreiss 12:98445fa50cd3 336 CmdDummy::action,
jreiss 12:98445fa50cd3 337 CmdRxDataRate::action,
jreiss 12:98445fa50cd3 338 CmdRxFrequency::action,
jreiss 12:98445fa50cd3 339 CmdReceiveContinuous::action,
jreiss 12:98445fa50cd3 340 CmdSendStringOnInterval::action,
jreiss 12:98445fa50cd3 341
jreiss 12:98445fa50cd3 342 };
jreiss 12:98445fa50cd3 343
jreiss 12:98445fa50cd3 344 CommandTerminal::CommandTerminal(mts::ATSerial& serial) :
jreiss 12:98445fa50cd3 345 _serial(serial),
jreiss 12:98445fa50cd3 346 _mode(mDot::COMMAND_MODE),
jreiss 12:98445fa50cd3 347 _sleep_standby(true),
jreiss 12:98445fa50cd3 348 #if defined(TARGET_MTS_MDOT_F411RE)
jreiss 12:98445fa50cd3 349 _xbee_on_sleep(XBEE_ON_SLEEP),
jreiss 12:98445fa50cd3 350 #else
jreiss 12:98445fa50cd3 351 _xbee_on_sleep(GPIO2),
jreiss 12:98445fa50cd3 352 #endif
jreiss 12:98445fa50cd3 353 _autoOTAEnabled(false),
jreiss 12:98445fa50cd3 354 _idle_thread(idle, NULL, osPriorityLow)
jreiss 12:98445fa50cd3 355 {
jreiss 12:98445fa50cd3 356 _serialp = &serial;
jreiss 12:98445fa50cd3 357 }
jreiss 12:98445fa50cd3 358
jreiss 12:98445fa50cd3 359 void CommandTerminal::init() {
jreiss 12:98445fa50cd3 360 _dot->setEvents(_events);
jreiss 12:98445fa50cd3 361 }
jreiss 12:98445fa50cd3 362
jreiss 12:98445fa50cd3 363 void CommandTerminal::printHelp() {
jreiss 12:98445fa50cd3 364 const char* name = NULL;
jreiss 12:98445fa50cd3 365 const char* text = NULL;
jreiss 12:98445fa50cd3 366 const char* desc = NULL;
jreiss 12:98445fa50cd3 367 const char* tab = "\t";
jreiss 12:98445fa50cd3 368
jreiss 12:98445fa50cd3 369 std::string header("Command");
jreiss 12:98445fa50cd3 370 header.append(tab);
jreiss 12:98445fa50cd3 371 header.append(tab);
jreiss 12:98445fa50cd3 372 header.append("Name");
jreiss 12:98445fa50cd3 373 header.append(tab);
jreiss 12:98445fa50cd3 374 header.append(tab);
jreiss 12:98445fa50cd3 375 header.append(tab);
jreiss 12:98445fa50cd3 376 header.append("Description");
jreiss 12:98445fa50cd3 377
jreiss 12:98445fa50cd3 378 write(newline);
jreiss 12:98445fa50cd3 379 write(header.c_str());
jreiss 12:98445fa50cd3 380 write(newline);
jreiss 12:98445fa50cd3 381 write(newline);
jreiss 12:98445fa50cd3 382
jreiss 12:98445fa50cd3 383 for (int i = 0; i < NO_OF_COMMANDS; i++) {
jreiss 12:98445fa50cd3 384 name = _commands[i].name();
jreiss 12:98445fa50cd3 385 text = _commands[i].text();
jreiss 12:98445fa50cd3 386 desc = _commands[i].desc();
jreiss 12:98445fa50cd3 387 write(text);
jreiss 12:98445fa50cd3 388 if (strlen(text) < 8)
jreiss 12:98445fa50cd3 389 write(tab);
jreiss 12:98445fa50cd3 390 write(tab);
jreiss 12:98445fa50cd3 391 write(name);
jreiss 12:98445fa50cd3 392 if (strlen(name) < 8)
jreiss 12:98445fa50cd3 393 write(tab);
jreiss 12:98445fa50cd3 394 if (strlen(name) < 16)
jreiss 12:98445fa50cd3 395 write(tab);
jreiss 12:98445fa50cd3 396 write(tab);
jreiss 12:98445fa50cd3 397 write(desc);
jreiss 12:98445fa50cd3 398 write(newline);
jreiss 12:98445fa50cd3 399 }
jreiss 12:98445fa50cd3 400
jreiss 12:98445fa50cd3 401 write(newline);
jreiss 12:98445fa50cd3 402 }
jreiss 12:98445fa50cd3 403
jreiss 12:98445fa50cd3 404 bool CommandTerminal::writeable() {
jreiss 12:98445fa50cd3 405 return _serialp->writeable();
jreiss 12:98445fa50cd3 406 }
jreiss 12:98445fa50cd3 407
jreiss 12:98445fa50cd3 408 bool CommandTerminal::readable() {
jreiss 12:98445fa50cd3 409 return _serialp->readable();
jreiss 12:98445fa50cd3 410 }
jreiss 12:98445fa50cd3 411
jreiss 12:98445fa50cd3 412 char CommandTerminal::read() {
jreiss 12:98445fa50cd3 413 char ch;
jreiss 12:98445fa50cd3 414 _serialp->read(&ch, 1);
jreiss 12:98445fa50cd3 415 return ch;
jreiss 12:98445fa50cd3 416 }
jreiss 12:98445fa50cd3 417
jreiss 12:98445fa50cd3 418 void CommandTerminal::write(const char* message) {
jreiss 12:98445fa50cd3 419 while (!writeable())
jreiss 12:98445fa50cd3 420 ;
jreiss 12:98445fa50cd3 421 _serialp->write(message, strlen(message));
jreiss 12:98445fa50cd3 422 }
jreiss 12:98445fa50cd3 423
jreiss 12:98445fa50cd3 424 void CommandTerminal::writef(const char* format, ...) {
jreiss 12:98445fa50cd3 425 char buff[256];
jreiss 12:98445fa50cd3 426
jreiss 12:98445fa50cd3 427 va_list ap;
jreiss 12:98445fa50cd3 428 va_start(ap, format);
jreiss 12:98445fa50cd3 429 int size = vsnprintf(buff, 256, format, ap);
jreiss 12:98445fa50cd3 430 while (!writeable())
jreiss 12:98445fa50cd3 431 ;
jreiss 12:98445fa50cd3 432 _serialp->write(buff, size);
jreiss 12:98445fa50cd3 433 va_end(ap);
jreiss 12:98445fa50cd3 434 }
jreiss 12:98445fa50cd3 435
jreiss 12:98445fa50cd3 436 void CommandTerminal::serialLoop() {
jreiss 12:98445fa50cd3 437 Timer serial_read_timer;
jreiss 12:98445fa50cd3 438 std::vector<uint8_t> serial_buffer;
jreiss 12:98445fa50cd3 439 std::vector<uint8_t> data;
jreiss 12:98445fa50cd3 440 int timeout = 0;
jreiss 12:98445fa50cd3 441
jreiss 12:98445fa50cd3 442 serial_read_timer.start();
jreiss 12:98445fa50cd3 443
jreiss 12:98445fa50cd3 444 if (_dot->getStartUpMode() == mDot::SERIAL_MODE) {
jreiss 12:98445fa50cd3 445 _xbee_on_sleep = GPIO_PIN_SET;
jreiss 12:98445fa50cd3 446
jreiss 12:98445fa50cd3 447 timeout = _dot->getWakeDelay();
jreiss 12:98445fa50cd3 448
jreiss 12:98445fa50cd3 449 // wait for timeout or start of serial data
jreiss 12:98445fa50cd3 450 while (!readable() && serial_read_timer.read_ms() < timeout && !_serialp->escaped()) {
jreiss 12:98445fa50cd3 451 osDelay(2);
jreiss 12:98445fa50cd3 452 }
jreiss 12:98445fa50cd3 453 }
jreiss 12:98445fa50cd3 454
jreiss 12:98445fa50cd3 455 if (!readable() && _events->SendAck()) {
jreiss 12:98445fa50cd3 456 logDebug("SERIAL NOT READABLE and ACK REQUESTED");
jreiss 12:98445fa50cd3 457 goto L_SEND;
jreiss 12:98445fa50cd3 458 }
jreiss 12:98445fa50cd3 459
jreiss 12:98445fa50cd3 460 if (readable() && !_serialp->escaped()) {
jreiss 12:98445fa50cd3 461
jreiss 12:98445fa50cd3 462 serial_read_timer.reset();
jreiss 12:98445fa50cd3 463 timeout = _dot->getWakeTimeout();
jreiss 12:98445fa50cd3 464
jreiss 12:98445fa50cd3 465 while (serial_read_timer.read_ms() < timeout && serial_buffer.size() <= _dot->getMaxPacketLength()) {
jreiss 12:98445fa50cd3 466 while (readable() && serial_buffer.size() < _dot->getMaxPacketLength()) {
jreiss 12:98445fa50cd3 467 serial_buffer.push_back(read());
jreiss 12:98445fa50cd3 468 serial_read_timer.reset();
jreiss 12:98445fa50cd3 469
jreiss 12:98445fa50cd3 470 if (_serialp->escaped())
jreiss 12:98445fa50cd3 471 break;
jreiss 12:98445fa50cd3 472 }
jreiss 12:98445fa50cd3 473 }
jreiss 12:98445fa50cd3 474
jreiss 12:98445fa50cd3 475 serial_read_timer.stop(), serial_read_timer.reset();
jreiss 12:98445fa50cd3 476
jreiss 12:98445fa50cd3 477 if (!serial_buffer.empty()) {
jreiss 12:98445fa50cd3 478 if (_dot->getStartUpMode() == mDot::SERIAL_MODE)
jreiss 12:98445fa50cd3 479 _xbee_on_sleep = GPIO_PIN_RESET;
jreiss 12:98445fa50cd3 480
jreiss 12:98445fa50cd3 481 L_SEND:
jreiss 12:98445fa50cd3 482 // wait for any duty cycle limit to expire
jreiss 12:98445fa50cd3 483 while (_dot->getNextTxMs() > 0 && !_serialp->escaped()) {
jreiss 12:98445fa50cd3 484 osDelay(10);
jreiss 12:98445fa50cd3 485 }
jreiss 12:98445fa50cd3 486
jreiss 12:98445fa50cd3 487 if (_dot->getIsIdle()) {
jreiss 12:98445fa50cd3 488 logDebug("Received serial data, sending out radio.");
jreiss 12:98445fa50cd3 489
jreiss 12:98445fa50cd3 490 if (_dot->send(serial_buffer, false) != mDot::MDOT_OK) {
jreiss 12:98445fa50cd3 491 logDebug("Send failed.");
jreiss 12:98445fa50cd3 492 // If the data should be tossed after send failure, clear buffer
jreiss 12:98445fa50cd3 493 if (_dot->getSerialClearOnError()) {
jreiss 12:98445fa50cd3 494 serial_buffer.clear();
jreiss 12:98445fa50cd3 495 }
jreiss 12:98445fa50cd3 496 } else {
jreiss 12:98445fa50cd3 497
jreiss 12:98445fa50cd3 498 // wait for send to finish
jreiss 12:98445fa50cd3 499 while (!_dot->getIsIdle() && !_serialp->escaped()) {
jreiss 12:98445fa50cd3 500 osDelay(10);
jreiss 12:98445fa50cd3 501 }
jreiss 12:98445fa50cd3 502
jreiss 12:98445fa50cd3 503 // call recv to wait for any packet before sending again
jreiss 12:98445fa50cd3 504 if (!_serialp->escaped())
jreiss 12:98445fa50cd3 505 _dot->recv(data);
jreiss 12:98445fa50cd3 506
jreiss 12:98445fa50cd3 507 // Clear the serial buffer if send is success
jreiss 12:98445fa50cd3 508 serial_buffer.clear();
jreiss 12:98445fa50cd3 509
jreiss 12:98445fa50cd3 510 // In class C mode pending data will be sent automatically without uplink
jreiss 12:98445fa50cd3 511 if (_dot->getClass() != "C") {
jreiss 12:98445fa50cd3 512 if (_dot->getDataPending()) {
jreiss 12:98445fa50cd3 513 logDebug("Data is pending");
jreiss 12:98445fa50cd3 514 goto L_SEND;
jreiss 12:98445fa50cd3 515 }
jreiss 12:98445fa50cd3 516 if (_dot->getAckRequested()) {
jreiss 12:98445fa50cd3 517 logDebug("Ack requested");
jreiss 12:98445fa50cd3 518 goto L_SEND;
jreiss 12:98445fa50cd3 519 }
jreiss 12:98445fa50cd3 520 }
jreiss 12:98445fa50cd3 521 }
jreiss 12:98445fa50cd3 522 } else {
jreiss 12:98445fa50cd3 523 logDebug("Radio is busy, cannot send.\r\n");
jreiss 12:98445fa50cd3 524 osDelay(10);
jreiss 12:98445fa50cd3 525 }
jreiss 12:98445fa50cd3 526
jreiss 12:98445fa50cd3 527 } else {
jreiss 12:98445fa50cd3 528 logDebug("No data received from serial to send.\r\n");
jreiss 12:98445fa50cd3 529 }
jreiss 12:98445fa50cd3 530 }
jreiss 12:98445fa50cd3 531
jreiss 12:98445fa50cd3 532 if (!_serialp->readable() && _dot->getStartUpMode() == mDot::SERIAL_MODE && !_serialp->escaped()) {
jreiss 12:98445fa50cd3 533 sleep(true);
jreiss 12:98445fa50cd3 534 }
jreiss 12:98445fa50cd3 535
jreiss 12:98445fa50cd3 536 if (_serialp->escaped()) {
jreiss 12:98445fa50cd3 537 _serialp->clearEscaped();
jreiss 12:98445fa50cd3 538 _serialp->rxClear();
jreiss 12:98445fa50cd3 539 serial_data_mode = false;
jreiss 12:98445fa50cd3 540 _mode = mDot::COMMAND_MODE;
jreiss 12:98445fa50cd3 541 logDebug("Exit Serial Mode");
jreiss 12:98445fa50cd3 542 write(done);
jreiss 12:98445fa50cd3 543 return;
jreiss 12:98445fa50cd3 544 }
jreiss 12:98445fa50cd3 545
jreiss 12:98445fa50cd3 546 if (!_dot->getNetworkJoinStatus()) {
jreiss 12:98445fa50cd3 547 serial_data_mode = false;
jreiss 12:98445fa50cd3 548 _mode = mDot::COMMAND_MODE;
jreiss 12:98445fa50cd3 549 logDebug("Exit Serial Mode");
jreiss 12:98445fa50cd3 550 write(no_carrier);
jreiss 12:98445fa50cd3 551 return;
jreiss 12:98445fa50cd3 552 }
jreiss 12:98445fa50cd3 553 }
jreiss 12:98445fa50cd3 554
jreiss 12:98445fa50cd3 555 bool CommandTerminal::autoJoinCheck() {
jreiss 12:98445fa50cd3 556
jreiss 12:98445fa50cd3 557 std::string escape_buffer;
jreiss 12:98445fa50cd3 558 int sleep = 1000;
jreiss 12:98445fa50cd3 559 Timer tmr;
jreiss 12:98445fa50cd3 560 tmr.start();
jreiss 12:98445fa50cd3 561 int cnt = 0;
jreiss 12:98445fa50cd3 562
jreiss 12:98445fa50cd3 563 while (!_dot->getNetworkJoinStatus()) {
jreiss 12:98445fa50cd3 564 if (!serial_data_mode) {
jreiss 12:98445fa50cd3 565 write("\r\nJoining network... ");
jreiss 12:98445fa50cd3 566 }
jreiss 12:98445fa50cd3 567 logInfo("Joining network... ");
jreiss 12:98445fa50cd3 568
jreiss 12:98445fa50cd3 569 if (_dot->getNextTxMs() > 0) {
jreiss 12:98445fa50cd3 570 if (!serial_data_mode) {
jreiss 12:98445fa50cd3 571 writef("\r\nWaiting %lu s before next join attempt\r\n", _dot->getNextTxMs() / 1000);
jreiss 12:98445fa50cd3 572 }
jreiss 12:98445fa50cd3 573 logInfo("Waiting %lu s before next join attempt", _dot->getNextTxMs() / 1000);
jreiss 12:98445fa50cd3 574
jreiss 12:98445fa50cd3 575 tmr.reset();
jreiss 12:98445fa50cd3 576 while (_dot->getNextTxMs() > 0 && !_serial.escaped()) {
jreiss 12:98445fa50cd3 577 osDelay(20);
jreiss 12:98445fa50cd3 578 }
jreiss 12:98445fa50cd3 579 }
jreiss 12:98445fa50cd3 580
jreiss 12:98445fa50cd3 581 if (!_serial.escaped() && _dot->joinNetworkOnce() == mDot::MDOT_OK) {
jreiss 12:98445fa50cd3 582 if (!serial_data_mode) {
jreiss 12:98445fa50cd3 583 write("Network Joined\r\n");
jreiss 12:98445fa50cd3 584 write(done);
jreiss 12:98445fa50cd3 585 }
jreiss 12:98445fa50cd3 586 logInfo("Network Joined");
jreiss 12:98445fa50cd3 587 return false;
jreiss 12:98445fa50cd3 588 }
jreiss 12:98445fa50cd3 589
jreiss 12:98445fa50cd3 590 if (!serial_data_mode) {
jreiss 12:98445fa50cd3 591 write("Network Join failed\r\n");
jreiss 12:98445fa50cd3 592 write(error);
jreiss 12:98445fa50cd3 593 }
jreiss 12:98445fa50cd3 594 logInfo("Network Join failed");
jreiss 12:98445fa50cd3 595
jreiss 12:98445fa50cd3 596 if (!_serial.escaped() && _dot->getFrequencySubBand() != 0 && _dot->getJoinRetries() > 0 && cnt++ > _dot->getJoinRetries()) {
jreiss 12:98445fa50cd3 597 cnt = 0;
jreiss 12:98445fa50cd3 598
jreiss 12:98445fa50cd3 599 if (_dot->getFrequencyBand() == mDot::FB_US915 || _dot->getFrequencyBand() == mDot::FB_AU915 ) {
jreiss 12:98445fa50cd3 600 uint8_t band = ((_dot->getFrequencySubBand()) % 8) + 1;
jreiss 12:98445fa50cd3 601 logWarning("Join retries exhausted, switching to sub band %u", band);
jreiss 12:98445fa50cd3 602 _dot->setFrequencySubBand(band);
jreiss 12:98445fa50cd3 603 }
jreiss 12:98445fa50cd3 604 }
jreiss 12:98445fa50cd3 605
jreiss 12:98445fa50cd3 606 tmr.reset();
jreiss 12:98445fa50cd3 607 while (tmr.read_ms() < sleep && !_serial.escaped()) {
jreiss 12:98445fa50cd3 608 osDelay(10);
jreiss 12:98445fa50cd3 609 }
jreiss 12:98445fa50cd3 610
jreiss 12:98445fa50cd3 611 if (_serial.escaped()) {
jreiss 12:98445fa50cd3 612 _serial.clearEscaped();
jreiss 12:98445fa50cd3 613 serial_data_mode = false;
jreiss 12:98445fa50cd3 614 _mode = mDot::COMMAND_MODE;
jreiss 12:98445fa50cd3 615 if (!serial_data_mode) {
jreiss 12:98445fa50cd3 616 write("Join Canceled\r\n");
jreiss 12:98445fa50cd3 617 write(done);
jreiss 12:98445fa50cd3 618 }
jreiss 12:98445fa50cd3 619 logInfo("Join Canceled\r\n");
jreiss 12:98445fa50cd3 620 return true;
jreiss 12:98445fa50cd3 621 }
jreiss 12:98445fa50cd3 622 }
jreiss 12:98445fa50cd3 623
jreiss 12:98445fa50cd3 624 return false;
jreiss 12:98445fa50cd3 625 }
jreiss 12:98445fa50cd3 626
jreiss 12:98445fa50cd3 627 void CommandTerminal::start() {
jreiss 12:98445fa50cd3 628
jreiss 12:98445fa50cd3 629 char ch;
jreiss 12:98445fa50cd3 630 bool running = true;
jreiss 12:98445fa50cd3 631 bool echo = _dot->getEcho();
jreiss 12:98445fa50cd3 632 std::string command;
jreiss 12:98445fa50cd3 633 std::deque<std::string> history;
jreiss 12:98445fa50cd3 634 int history_index = -1;
jreiss 12:98445fa50cd3 635 std::vector<std::string> args;
jreiss 12:98445fa50cd3 636 bool join_canceled = false;
jreiss 12:98445fa50cd3 637
jreiss 12:98445fa50cd3 638 _autoOTAEnabled = _dot->getJoinMode() == mDot::AUTO_OTA;
jreiss 12:98445fa50cd3 639
jreiss 12:98445fa50cd3 640 if (_dot->getStartUpMode() == mDot::SERIAL_MODE) {
jreiss 12:98445fa50cd3 641
jreiss 12:98445fa50cd3 642 serial_data_mode = true;
jreiss 12:98445fa50cd3 643 _mode = mDot::SERIAL_MODE;
jreiss 12:98445fa50cd3 644
jreiss 12:98445fa50cd3 645 std::string escape_buffer;
jreiss 12:98445fa50cd3 646 char ch;
jreiss 12:98445fa50cd3 647
jreiss 12:98445fa50cd3 648 if (!_dot->getStandbyFlag()) {
jreiss 12:98445fa50cd3 649 // wake up from power-on/reset
jreiss 12:98445fa50cd3 650
jreiss 12:98445fa50cd3 651 int escape_timeout = 1000;
jreiss 12:98445fa50cd3 652 Timer tmr;
jreiss 12:98445fa50cd3 653 Timer escape_tmr;
jreiss 12:98445fa50cd3 654
jreiss 12:98445fa50cd3 655 // wait one second for possible escape by user pressing '+' key
jreiss 12:98445fa50cd3 656 tmr.reset();
jreiss 12:98445fa50cd3 657 tmr.start();
jreiss 12:98445fa50cd3 658 escape_tmr.reset();
jreiss 12:98445fa50cd3 659 escape_tmr.start();
jreiss 12:98445fa50cd3 660 while (tmr.read_ms() < escape_timeout) {
jreiss 12:98445fa50cd3 661 if (_serial.readable()) {
jreiss 12:98445fa50cd3 662 _serial.read(&ch, 1);
jreiss 12:98445fa50cd3 663 escape_buffer += ch;
jreiss 12:98445fa50cd3 664 }
jreiss 12:98445fa50cd3 665
jreiss 12:98445fa50cd3 666 if (escape_buffer.find("+") != std::string::npos) {
jreiss 12:98445fa50cd3 667 logInfo("Escape detected");
jreiss 12:98445fa50cd3 668 join_canceled = true;
jreiss 12:98445fa50cd3 669 serial_data_mode = false;
jreiss 12:98445fa50cd3 670 _mode = mDot::COMMAND_MODE;
jreiss 12:98445fa50cd3 671 command.clear();
jreiss 12:98445fa50cd3 672 break;
jreiss 12:98445fa50cd3 673 }
jreiss 12:98445fa50cd3 674
jreiss 12:98445fa50cd3 675 if (escape_tmr.read_ms() > escape_timeout)
jreiss 12:98445fa50cd3 676 escape_buffer.clear();
jreiss 12:98445fa50cd3 677
jreiss 12:98445fa50cd3 678 osDelay(1);
jreiss 12:98445fa50cd3 679 }
jreiss 12:98445fa50cd3 680 }
jreiss 12:98445fa50cd3 681
jreiss 12:98445fa50cd3 682 if (_mode == mDot::SERIAL_MODE && !_dot->getNetworkJoinStatus() && _dot->getJoinMode() == mDot::OTA) {
jreiss 12:98445fa50cd3 683 if (_dot->joinNetworkOnce() != mDot::MDOT_OK) {
jreiss 12:98445fa50cd3 684 serial_data_mode = false;
jreiss 12:98445fa50cd3 685 _mode = mDot::COMMAND_MODE;
jreiss 12:98445fa50cd3 686
jreiss 12:98445fa50cd3 687 logWarning("Start Up Mode set to SERIAL_MODE, but join failed.");
jreiss 12:98445fa50cd3 688 _serial.writef("Network Not Joined\r\n");
jreiss 12:98445fa50cd3 689 _serial.writef(error);
jreiss 12:98445fa50cd3 690 }
jreiss 12:98445fa50cd3 691 }
jreiss 12:98445fa50cd3 692 }
jreiss 12:98445fa50cd3 693
jreiss 12:98445fa50cd3 694 if (_dot->getJoinMode() == mDot::PEER_TO_PEER) {
jreiss 12:98445fa50cd3 695 peer_to_peer = true;
jreiss 12:98445fa50cd3 696 } else {
jreiss 12:98445fa50cd3 697 peer_to_peer = false;
jreiss 12:98445fa50cd3 698 }
jreiss 12:98445fa50cd3 699
jreiss 12:98445fa50cd3 700 //Run terminal session
jreiss 12:98445fa50cd3 701 while (running) {
jreiss 12:98445fa50cd3 702
jreiss 12:98445fa50cd3 703 // wait for input to reduce at command idle current
jreiss 12:98445fa50cd3 704 while (!readable() || _mode == mDot::SERIAL_MODE) {
jreiss 12:98445fa50cd3 705 if (!join_canceled && _autoOTAEnabled) {
jreiss 12:98445fa50cd3 706 join_canceled = autoJoinCheck();
jreiss 12:98445fa50cd3 707 if (join_canceled)
jreiss 12:98445fa50cd3 708 command.clear();
jreiss 12:98445fa50cd3 709 }
jreiss 12:98445fa50cd3 710
jreiss 12:98445fa50cd3 711 if (!_autoOTAEnabled || (!join_canceled && _autoOTAEnabled)) {
jreiss 12:98445fa50cd3 712 switch (_mode) {
jreiss 12:98445fa50cd3 713 case mDot::SERIAL_MODE:
jreiss 12:98445fa50cd3 714 // signal wakeup, read serial and output to radio
jreiss 12:98445fa50cd3 715 serialLoop();
jreiss 12:98445fa50cd3 716 continue;
jreiss 12:98445fa50cd3 717 break;
jreiss 12:98445fa50cd3 718 default:
jreiss 12:98445fa50cd3 719 break;
jreiss 12:98445fa50cd3 720 }
jreiss 12:98445fa50cd3 721 }
jreiss 12:98445fa50cd3 722
jreiss 12:98445fa50cd3 723 ch = '\0';
jreiss 12:98445fa50cd3 724
jreiss 12:98445fa50cd3 725 wait(0.00001); // 10 us
jreiss 12:98445fa50cd3 726 _serial.escaped();
jreiss 12:98445fa50cd3 727 }
jreiss 12:98445fa50cd3 728
jreiss 12:98445fa50cd3 729 // read characters
jreiss 12:98445fa50cd3 730 if (readable()) {
jreiss 12:98445fa50cd3 731 ch = read();
jreiss 12:98445fa50cd3 732
jreiss 12:98445fa50cd3 733 if (ch == '\b' || ch == 0x7f) {
jreiss 12:98445fa50cd3 734 if (!command.empty()) {
jreiss 12:98445fa50cd3 735 writef("\b \b");
jreiss 12:98445fa50cd3 736 command.erase(command.size() - 1);
jreiss 12:98445fa50cd3 737 }
jreiss 12:98445fa50cd3 738 continue;
jreiss 12:98445fa50cd3 739 } else if (ch == 0x1b || ch == 0x09) {
jreiss 12:98445fa50cd3 740 osDelay(20);
jreiss 12:98445fa50cd3 741 // catch escape sequence, or tab
jreiss 12:98445fa50cd3 742 char ch1 = 0x00, ch2 = 0x00;
jreiss 12:98445fa50cd3 743
jreiss 12:98445fa50cd3 744 if (readable()) {
jreiss 12:98445fa50cd3 745 ch1 = read();
jreiss 12:98445fa50cd3 746 if (readable())
jreiss 12:98445fa50cd3 747 ch2 = read();
jreiss 12:98445fa50cd3 748
jreiss 12:98445fa50cd3 749 if (ch1 == 0x5b && ch2 == 0x41) {
jreiss 12:98445fa50cd3 750 // up key
jreiss 12:98445fa50cd3 751 for (size_t i = 0; i < command.size() + 1; i++) {
jreiss 12:98445fa50cd3 752 writef("\b \b");
jreiss 12:98445fa50cd3 753 }
jreiss 12:98445fa50cd3 754 if (history.size() > 0) {
jreiss 12:98445fa50cd3 755 if (++history_index >= int(history.size() - 1))
jreiss 12:98445fa50cd3 756 history_index = history.size() - 1;
jreiss 12:98445fa50cd3 757
jreiss 12:98445fa50cd3 758 command = history[history_index];
jreiss 12:98445fa50cd3 759 writef("%s", history[history_index].c_str());
jreiss 12:98445fa50cd3 760 } else {
jreiss 12:98445fa50cd3 761 command.clear();
jreiss 12:98445fa50cd3 762 }
jreiss 12:98445fa50cd3 763 } else if (ch1 == 0x5b && ch2 == 0x42) {
jreiss 12:98445fa50cd3 764
jreiss 12:98445fa50cd3 765 // down key
jreiss 12:98445fa50cd3 766 for (size_t i = 0; i < command.size() + 1; i++) {
jreiss 12:98445fa50cd3 767 writef("\b \b");
jreiss 12:98445fa50cd3 768 }
jreiss 12:98445fa50cd3 769
jreiss 12:98445fa50cd3 770 if (--history_index < 0) {
jreiss 12:98445fa50cd3 771 history_index = -1;
jreiss 12:98445fa50cd3 772 command.clear();
jreiss 12:98445fa50cd3 773 } else {
jreiss 12:98445fa50cd3 774 command = history[history_index];
jreiss 12:98445fa50cd3 775 writef("%s", history[history_index].c_str());
jreiss 12:98445fa50cd3 776 }
jreiss 12:98445fa50cd3 777 }
jreiss 12:98445fa50cd3 778 }
jreiss 12:98445fa50cd3 779 while (readable())
jreiss 12:98445fa50cd3 780 read();
jreiss 12:98445fa50cd3 781 continue;
jreiss 12:98445fa50cd3 782 } else {
jreiss 12:98445fa50cd3 783 command += ch;
jreiss 12:98445fa50cd3 784 }
jreiss 12:98445fa50cd3 785
jreiss 12:98445fa50cd3 786 // echo chars if enabled
jreiss 12:98445fa50cd3 787 if (echo && !(ch == '\r' || ch == '\n'))
jreiss 12:98445fa50cd3 788 writef("%c", ch);
jreiss 12:98445fa50cd3 789 }
jreiss 12:98445fa50cd3 790
jreiss 12:98445fa50cd3 791 // look for end of command line
jreiss 12:98445fa50cd3 792 if (command.find("\n") != std::string::npos || command.find("\r") != std::string::npos) {
jreiss 12:98445fa50cd3 793 // remove new line or cr character
jreiss 12:98445fa50cd3 794 command.erase(command.size() - 1);
jreiss 12:98445fa50cd3 795 write("\r"); // match standard modem output
jreiss 12:98445fa50cd3 796 write(newline);
jreiss 12:98445fa50cd3 797 } else {
jreiss 12:98445fa50cd3 798 continue;
jreiss 12:98445fa50cd3 799 }
jreiss 12:98445fa50cd3 800
jreiss 12:98445fa50cd3 801 // trim whitespace from command
jreiss 12:98445fa50cd3 802 mts::Text::trim(command, "\r\n\t ");
jreiss 12:98445fa50cd3 803
jreiss 12:98445fa50cd3 804 if (command.size() < 1) {
jreiss 12:98445fa50cd3 805 command.clear();
jreiss 12:98445fa50cd3 806 continue;
jreiss 12:98445fa50cd3 807 }
jreiss 12:98445fa50cd3 808
jreiss 12:98445fa50cd3 809 // parse command and args
jreiss 12:98445fa50cd3 810 args.clear();
jreiss 12:98445fa50cd3 811
jreiss 12:98445fa50cd3 812 // find first '=' character
jreiss 12:98445fa50cd3 813 size_t delim_index = command.find("=");
jreiss 12:98445fa50cd3 814 if (delim_index != std::string::npos) {
jreiss 12:98445fa50cd3 815 args.push_back(command.substr(0, delim_index));
jreiss 12:98445fa50cd3 816 } else {
jreiss 12:98445fa50cd3 817 // find first ' ' character
jreiss 12:98445fa50cd3 818 delim_index = command.find(" ");
jreiss 12:98445fa50cd3 819 if (delim_index != std::string::npos) {
jreiss 12:98445fa50cd3 820 args.push_back(command.substr(0, delim_index));
jreiss 12:98445fa50cd3 821 } else {
jreiss 12:98445fa50cd3 822 args.push_back(command);
jreiss 12:98445fa50cd3 823 }
jreiss 12:98445fa50cd3 824 }
jreiss 12:98445fa50cd3 825
jreiss 12:98445fa50cd3 826 if (delim_index != std::string::npos) {
jreiss 12:98445fa50cd3 827 std::vector<std::string> params = mts::Text::split(command.substr(delim_index + 1), ",");
jreiss 12:98445fa50cd3 828 args.insert(args.end(), params.begin(), params.end());
jreiss 12:98445fa50cd3 829 }
jreiss 12:98445fa50cd3 830
jreiss 12:98445fa50cd3 831 args[0] = mts::Text::toUpper(args[0]);
jreiss 12:98445fa50cd3 832
jreiss 12:98445fa50cd3 833 // print help
jreiss 12:98445fa50cd3 834 if ((args[0].find("?") == 0 || args[0].find("HELP") == 0) && args.size() == 1) {
jreiss 12:98445fa50cd3 835 printHelp();
jreiss 12:98445fa50cd3 836 command.clear();
jreiss 12:98445fa50cd3 837 } else if ((args[0].find("ATE?") == 0 && args[0].length() == 4) || (args[0].find("ATE") == 0 && args[0].length() == 3)) {
jreiss 12:98445fa50cd3 838 writef("%d\r\n", _dot->getEcho());
jreiss 12:98445fa50cd3 839 write(done);
jreiss 12:98445fa50cd3 840 } else if (args[0].find("ATE0") == 0 && args[0].length() == 4) {
jreiss 12:98445fa50cd3 841 _dot->setEcho(false);
jreiss 12:98445fa50cd3 842 write(done);
jreiss 12:98445fa50cd3 843 echo = _dot->getEcho();
jreiss 12:98445fa50cd3 844 } else if (args[0].find("ATE1") == 0 && args[0].length() == 4) {
jreiss 12:98445fa50cd3 845 _dot->setEcho(true);
jreiss 12:98445fa50cd3 846 write(done);
jreiss 12:98445fa50cd3 847 echo = _dot->getEcho();
jreiss 12:98445fa50cd3 848 } else if ((args[0].find("ATV?") == 0 && args[0].length() == 4) || (args[0].find("ATV") == 0 && args[0].length() == 3)) {
jreiss 12:98445fa50cd3 849 writef("%d\r\n", _dot->getVerbose());
jreiss 12:98445fa50cd3 850 write(done);
jreiss 12:98445fa50cd3 851 } else if (args[0].find("ATV0") == 0 && args[0].length() == 4) {
jreiss 12:98445fa50cd3 852 _dot->setVerbose(false);
jreiss 12:98445fa50cd3 853 write(done);
jreiss 12:98445fa50cd3 854 } else if (args[0].find("ATV1") == 0 && args[0].length() == 4) {
jreiss 12:98445fa50cd3 855 _dot->setVerbose(true);
jreiss 12:98445fa50cd3 856 write(done);
jreiss 12:98445fa50cd3 857 } else if ((args[0].find("AT&K?") == 0 && args[0].length() == 5) || (args[0].find("AT&K") == 0 && args[0].length() == 4)) {
jreiss 12:98445fa50cd3 858 writef("%d\r\n", (_dot->getFlowControl() ? 3 : 0));
jreiss 12:98445fa50cd3 859 write(done);
jreiss 12:98445fa50cd3 860 } else if (args[0].find("AT&K0") == 0 && args[0].length() == 5) {
jreiss 12:98445fa50cd3 861 _dot->setFlowControl(false);
jreiss 12:98445fa50cd3 862 write(done);
jreiss 12:98445fa50cd3 863 } else if (args[0].find("AT&K3") == 0 && args[0].length() == 5) {
jreiss 12:98445fa50cd3 864 _dot->setFlowControl(true);
jreiss 12:98445fa50cd3 865 write(done);
jreiss 12:98445fa50cd3 866 } else if (args[0] == "AT+SD") {
jreiss 12:98445fa50cd3 867 if (_dot->getNetworkJoinStatus()) {
jreiss 12:98445fa50cd3 868 logDebug("Enter Serial Mode");
jreiss 12:98445fa50cd3 869 write(connect);
jreiss 12:98445fa50cd3 870 serial_data_mode = true;
jreiss 12:98445fa50cd3 871 _mode = mDot::SERIAL_MODE;
jreiss 12:98445fa50cd3 872 } else {
jreiss 12:98445fa50cd3 873 logDebug("Network Not Joined");
jreiss 12:98445fa50cd3 874 write("Network Not Joined\r\n");
jreiss 12:98445fa50cd3 875 write(error);
jreiss 12:98445fa50cd3 876 }
jreiss 12:98445fa50cd3 877 } else if (args[0] == "AT+SLEEP") {
jreiss 12:98445fa50cd3 878 if (args.size() > 2 && (args[1] != "?")) {
jreiss 12:98445fa50cd3 879 write("Invalid argument\r\n");
jreiss 12:98445fa50cd3 880 write(error);
jreiss 12:98445fa50cd3 881 } else {
jreiss 12:98445fa50cd3 882 if (args.size() > 1 && args[1] == "?") {
jreiss 12:98445fa50cd3 883 write("(0:deepsleep,1:sleep)\r\n");
jreiss 12:98445fa50cd3 884 write(done);
jreiss 12:98445fa50cd3 885 } else {
jreiss 12:98445fa50cd3 886 _sleep_standby = !(args.size() > 1 && args[1] == "1");
jreiss 12:98445fa50cd3 887 write(done);
jreiss 12:98445fa50cd3 888 this->sleep(_sleep_standby);
jreiss 12:98445fa50cd3 889 wait(0.1);
jreiss 12:98445fa50cd3 890 }
jreiss 12:98445fa50cd3 891 }
jreiss 12:98445fa50cd3 892 } else {
jreiss 12:98445fa50cd3 893 bool found = false;
jreiss 12:98445fa50cd3 894 bool query = false;
jreiss 12:98445fa50cd3 895
jreiss 12:98445fa50cd3 896 std::string lookfor = args[0];
jreiss 12:98445fa50cd3 897
jreiss 12:98445fa50cd3 898 // per command help
jreiss 12:98445fa50cd3 899 if ((args[0].find("?") == 0 || args[0].find("HELP") == 0))
jreiss 12:98445fa50cd3 900 lookfor = mts::Text::toUpper(args[1]);
jreiss 12:98445fa50cd3 901
jreiss 12:98445fa50cd3 902 // trim off any trailing '?' and mark as a query command
jreiss 12:98445fa50cd3 903 if (args[0].rfind("?") == args[0].length() - 1) {
jreiss 12:98445fa50cd3 904 query = true;
jreiss 12:98445fa50cd3 905 lookfor = args[0].substr(0, args[0].length() - 1);
jreiss 12:98445fa50cd3 906 }
jreiss 12:98445fa50cd3 907
jreiss 12:98445fa50cd3 908 // search for command
jreiss 12:98445fa50cd3 909 for (int i = 0; i < NO_OF_COMMANDS; i++) {
jreiss 12:98445fa50cd3 910
jreiss 12:98445fa50cd3 911 // match CMD or CMD? syntax if command is queryable
jreiss 12:98445fa50cd3 912 if (lookfor == _commands[i].text() && (!query || (query && _commands[i].queryable()))) {
jreiss 12:98445fa50cd3 913 found = true;
jreiss 12:98445fa50cd3 914 if (args[0] == "HELP") {
jreiss 12:98445fa50cd3 915 writef("%s%s", _commands[i].help().c_str(), newline);
jreiss 12:98445fa50cd3 916 write(done);
jreiss 12:98445fa50cd3 917 }
jreiss 12:98445fa50cd3 918
jreiss 12:98445fa50cd3 919 else if (args.size() > 1 && args[1] == "?") {
jreiss 12:98445fa50cd3 920 writef("%s%s", _commands[i].usage().c_str(), newline);
jreiss 12:98445fa50cd3 921 write(done);
jreiss 12:98445fa50cd3 922 } else if (!_verify[i](args)) {
jreiss 12:98445fa50cd3 923 writef("%s%s", _errorMessage.c_str(), newline);
jreiss 12:98445fa50cd3 924 writef("%s", error);
jreiss 12:98445fa50cd3 925 } else {
jreiss 12:98445fa50cd3 926 if (_action[i](args) == 0) {
jreiss 12:98445fa50cd3 927 writef("%s", done);
jreiss 12:98445fa50cd3 928 } else {
jreiss 12:98445fa50cd3 929 writef("%s%s", _errorMessage.c_str(), newline);
jreiss 12:98445fa50cd3 930 writef("%s", error);
jreiss 12:98445fa50cd3 931 }
jreiss 12:98445fa50cd3 932 }
jreiss 12:98445fa50cd3 933 }
jreiss 12:98445fa50cd3 934 }
jreiss 12:98445fa50cd3 935
jreiss 12:98445fa50cd3 936 if (!found) {
jreiss 12:98445fa50cd3 937 writef("%s", command_error);
jreiss 12:98445fa50cd3 938 writef("%s", error);
jreiss 12:98445fa50cd3 939 }
jreiss 12:98445fa50cd3 940 }
jreiss 12:98445fa50cd3 941
jreiss 12:98445fa50cd3 942 if (history.size() == 0 || history.front() != command)
jreiss 12:98445fa50cd3 943 history.push_front(command);
jreiss 12:98445fa50cd3 944 history_index = -1;
jreiss 12:98445fa50cd3 945 command.clear();
jreiss 12:98445fa50cd3 946
jreiss 12:98445fa50cd3 947 while (history.size() > 10)
jreiss 12:98445fa50cd3 948 history.pop_back();
jreiss 12:98445fa50cd3 949 }
jreiss 12:98445fa50cd3 950 }
jreiss 12:98445fa50cd3 951
jreiss 12:98445fa50cd3 952 void CommandTerminal::sleep(bool standby) {
jreiss 12:98445fa50cd3 953 _xbee_on_sleep = GPIO_PIN_RESET;
jreiss 12:98445fa50cd3 954
jreiss 12:98445fa50cd3 955 _serial.rxClear();
jreiss 12:98445fa50cd3 956 _serial.txClear();
jreiss 12:98445fa50cd3 957
jreiss 12:98445fa50cd3 958 #if defined(TARGET_XDOT_L151CC)
jreiss 12:98445fa50cd3 959 xdot_save_gpio_state();
jreiss 12:98445fa50cd3 960
jreiss 12:98445fa50cd3 961 /* GPIO Ports Clock Enable */
jreiss 12:98445fa50cd3 962 __GPIOA_CLK_ENABLE();
jreiss 12:98445fa50cd3 963 __GPIOB_CLK_ENABLE();
jreiss 12:98445fa50cd3 964 __GPIOC_CLK_ENABLE();
jreiss 12:98445fa50cd3 965 __GPIOH_CLK_ENABLE();
jreiss 12:98445fa50cd3 966
jreiss 12:98445fa50cd3 967 GPIO_InitTypeDef GPIO_InitStruct;
jreiss 12:98445fa50cd3 968
jreiss 12:98445fa50cd3 969 // UART1_TX, UART1_RTS & UART1_CTS to analog nopull - RX could be a wakeup source
jreiss 12:98445fa50cd3 970 GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_11 | GPIO_PIN_12;
jreiss 12:98445fa50cd3 971 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
jreiss 12:98445fa50cd3 972 GPIO_InitStruct.Pull = GPIO_NOPULL;
jreiss 12:98445fa50cd3 973 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
jreiss 12:98445fa50cd3 974
jreiss 12:98445fa50cd3 975 // I2C_SDA & I2C_SCL to analog nopull
jreiss 12:98445fa50cd3 976 GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9;
jreiss 12:98445fa50cd3 977 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
jreiss 12:98445fa50cd3 978 GPIO_InitStruct.Pull = GPIO_NOPULL;
jreiss 12:98445fa50cd3 979 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
jreiss 12:98445fa50cd3 980
jreiss 12:98445fa50cd3 981 // SPI_MOSI, SPI_MISO, SPI_SCK, & SPI_NSS to analog nopull
jreiss 12:98445fa50cd3 982 GPIO_InitStruct.Pin = GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
jreiss 12:98445fa50cd3 983 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
jreiss 12:98445fa50cd3 984 GPIO_InitStruct.Pull = GPIO_NOPULL;
jreiss 12:98445fa50cd3 985 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
jreiss 12:98445fa50cd3 986
jreiss 12:98445fa50cd3 987 // iterate through potential wake pins - leave the configured wake pin alone if one is needed
jreiss 12:98445fa50cd3 988 if (_dot->getWakePin() != WAKE || _dot->getWakeMode() == mDot::RTC_ALARM) {
jreiss 12:98445fa50cd3 989 GPIO_InitStruct.Pin = GPIO_PIN_0;
jreiss 12:98445fa50cd3 990 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
jreiss 12:98445fa50cd3 991 GPIO_InitStruct.Pull = GPIO_NOPULL;
jreiss 12:98445fa50cd3 992 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
jreiss 12:98445fa50cd3 993 }
jreiss 12:98445fa50cd3 994 if (_dot->getWakePin() != GPIO0 || _dot->getWakeMode() == mDot::RTC_ALARM) {
jreiss 12:98445fa50cd3 995 GPIO_InitStruct.Pin = GPIO_PIN_4;
jreiss 12:98445fa50cd3 996 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
jreiss 12:98445fa50cd3 997 GPIO_InitStruct.Pull = GPIO_NOPULL;
jreiss 12:98445fa50cd3 998 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
jreiss 12:98445fa50cd3 999 }
jreiss 12:98445fa50cd3 1000 if (_dot->getWakePin() != GPIO1 || _dot->getWakeMode() == mDot::RTC_ALARM) {
jreiss 12:98445fa50cd3 1001 GPIO_InitStruct.Pin = GPIO_PIN_5;
jreiss 12:98445fa50cd3 1002 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
jreiss 12:98445fa50cd3 1003 GPIO_InitStruct.Pull = GPIO_NOPULL;
jreiss 12:98445fa50cd3 1004 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
jreiss 12:98445fa50cd3 1005 }
jreiss 12:98445fa50cd3 1006 if (_dot->getWakePin() != GPIO2 || _dot->getWakeMode() == mDot::RTC_ALARM) {
jreiss 12:98445fa50cd3 1007 GPIO_InitStruct.Pin = GPIO_PIN_0;
jreiss 12:98445fa50cd3 1008 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
jreiss 12:98445fa50cd3 1009 GPIO_InitStruct.Pull = GPIO_NOPULL;
jreiss 12:98445fa50cd3 1010 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
jreiss 12:98445fa50cd3 1011 }
jreiss 12:98445fa50cd3 1012 if (_dot->getWakePin() != GPIO3 || _dot->getWakeMode() == mDot::RTC_ALARM) {
jreiss 12:98445fa50cd3 1013 GPIO_InitStruct.Pin = GPIO_PIN_2;
jreiss 12:98445fa50cd3 1014 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
jreiss 12:98445fa50cd3 1015 GPIO_InitStruct.Pull = GPIO_NOPULL;
jreiss 12:98445fa50cd3 1016 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
jreiss 12:98445fa50cd3 1017 }
jreiss 12:98445fa50cd3 1018 if (_dot->getWakePin() != UART1_RX || _dot->getWakeMode() == mDot::RTC_ALARM) {
jreiss 12:98445fa50cd3 1019 GPIO_InitStruct.Pin = GPIO_PIN_10;
jreiss 12:98445fa50cd3 1020 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
jreiss 12:98445fa50cd3 1021 GPIO_InitStruct.Pull = GPIO_NOPULL;
jreiss 12:98445fa50cd3 1022 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
jreiss 12:98445fa50cd3 1023 }
jreiss 12:98445fa50cd3 1024 #endif
jreiss 12:98445fa50cd3 1025
jreiss 12:98445fa50cd3 1026 _dot->sleep(_dot->getWakeInterval(), _dot->getWakeMode(), standby);
jreiss 12:98445fa50cd3 1027
jreiss 12:98445fa50cd3 1028 #if defined(TARGET_XDOT_L151CC)
jreiss 12:98445fa50cd3 1029 xdot_restore_gpio_state();
jreiss 12:98445fa50cd3 1030 #endif
jreiss 12:98445fa50cd3 1031 }
jreiss 12:98445fa50cd3 1032
jreiss 12:98445fa50cd3 1033 std::string CommandTerminal::formatPacketData(const std::vector<uint8_t>& data, const uint8_t& format) {
jreiss 12:98445fa50cd3 1034 if (format == mDot::HEXADECIMAL)
jreiss 12:98445fa50cd3 1035 return mts::Text::bin2hexString(data);
jreiss 12:98445fa50cd3 1036 else
jreiss 12:98445fa50cd3 1037 return std::string(data.begin(), data.end());
jreiss 12:98445fa50cd3 1038 }
jreiss 12:98445fa50cd3 1039
jreiss 12:98445fa50cd3 1040 bool CommandTerminal::waitForEscape(int timeout, mDot* dot, WaitType wait) {
jreiss 12:98445fa50cd3 1041 Timer timer;
jreiss 12:98445fa50cd3 1042
jreiss 12:98445fa50cd3 1043 timer.start();
jreiss 12:98445fa50cd3 1044 while (timer.read_ms() < timeout) {
jreiss 12:98445fa50cd3 1045
jreiss 12:98445fa50cd3 1046 if (dot != NULL) {
jreiss 12:98445fa50cd3 1047 if (wait == WAIT_SEND && (!dot->getIsTransmitting())) {
jreiss 12:98445fa50cd3 1048 return false;
jreiss 12:98445fa50cd3 1049 }
jreiss 12:98445fa50cd3 1050 }
jreiss 12:98445fa50cd3 1051
jreiss 12:98445fa50cd3 1052 if (_serialp != NULL && _serialp->escaped()) {
jreiss 12:98445fa50cd3 1053 _serialp->clearEscaped();
jreiss 12:98445fa50cd3 1054 return true;
jreiss 12:98445fa50cd3 1055 }
jreiss 12:98445fa50cd3 1056
jreiss 12:98445fa50cd3 1057 osDelay(10);
jreiss 12:98445fa50cd3 1058 }
jreiss 12:98445fa50cd3 1059
jreiss 12:98445fa50cd3 1060 return false;
jreiss 12:98445fa50cd3 1061 }
jreiss 12:98445fa50cd3 1062
jreiss 12:98445fa50cd3 1063 void CommandTerminal::wakeup(void) {
jreiss 12:98445fa50cd3 1064 }
jreiss 12:98445fa50cd3 1065
jreiss 12:98445fa50cd3 1066 void CommandTerminal::RadioEvent::PacketRx(uint8_t port, uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr, lora::DownlinkControl ctrl, uint8_t slot, uint8_t retries) {
jreiss 12:98445fa50cd3 1067 mDotEvent::PacketRx(port, payload, size, rssi, snr, ctrl, retries);
jreiss 12:98445fa50cd3 1068
jreiss 12:98445fa50cd3 1069 if (serial_data_mode) {
jreiss 12:98445fa50cd3 1070 logDebug("Rx %d bytes", size);
jreiss 12:98445fa50cd3 1071 if (size > 0) {
jreiss 12:98445fa50cd3 1072 CommandTerminal::Serial()->write((char*) RxPayload, RxPayloadSize);
jreiss 12:98445fa50cd3 1073 }
jreiss 12:98445fa50cd3 1074 if (!CommandTerminal::Serial()->readable() && _dot->getAckRequested() && _dot->getClass() == "C") {
jreiss 12:98445fa50cd3 1075 _sendAck = true;
jreiss 12:98445fa50cd3 1076 }
jreiss 12:98445fa50cd3 1077 }
jreiss 12:98445fa50cd3 1078 }
jreiss 12:98445fa50cd3 1079
jreiss 12:98445fa50cd3 1080 CommandTerminal::~CommandTerminal() {
jreiss 12:98445fa50cd3 1081 delete _events;
jreiss 12:98445fa50cd3 1082 }
jreiss 12:98445fa50cd3 1083