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:
Wed Sep 28 16:23:09 2016 +0000
Revision:
18:4e02a7a01625
Parent:
15:36db31c18231
Child:
19:5b812e1b8f3d
update libmDot and channel plans

Who changed what in which revision?

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