with 36errors

Dependencies:   MTS-Serial libxDot-dev-mbed5-deprecated

Fork of Dot-AT-Firmware by MultiTech

Committer:
faendder
Date:
Sun Jul 09 23:37:23 2017 +0000
Revision:
18:75cd82d6298c
Parent:
16:d5cf2af81a6d
i have 36 errors but i dont now how fixit

Who changed what in which revision?

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