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:
Jason Reiss
Date:
Wed Aug 31 11:57:27 2016 -0500
Revision:
15:36db31c18231
Parent:
12:98445fa50cd3
Child:
18:4e02a7a01625
Use DYNAMIC or FIXED channel plan instead of US915 or EU868
Add US915 and EU868 examples

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 break;
Jason Reiss 15:36db31c18231 759 default:
Jason Reiss 15:36db31c18231 760 break;
Jason Reiss 15:36db31c18231 761 }
Jason Reiss 15:36db31c18231 762 }
Jason Reiss 15:36db31c18231 763
Jason Reiss 15:36db31c18231 764 ch = '\0';
Jason Reiss 15:36db31c18231 765
Jason Reiss 15:36db31c18231 766 wait(0.00001); // 10 us
Jason Reiss 15:36db31c18231 767 _serial.escaped();
Jason Reiss 15:36db31c18231 768 }
Jason Reiss 15:36db31c18231 769
Jason Reiss 15:36db31c18231 770 // read characters
Jason Reiss 15:36db31c18231 771 if (readable()) {
Jason Reiss 15:36db31c18231 772 ch = read();
Jason Reiss 15:36db31c18231 773
Jason Reiss 15:36db31c18231 774 if (ch == '\b' || ch == 0x7f) {
Jason Reiss 15:36db31c18231 775 if (!command.empty()) {
Jason Reiss 15:36db31c18231 776 writef("\b \b");
Jason Reiss 15:36db31c18231 777 command.erase(command.size() - 1);
Jason Reiss 15:36db31c18231 778 }
Jason Reiss 15:36db31c18231 779 continue;
Jason Reiss 15:36db31c18231 780 } else if (ch == 0x1b || ch == 0x09) {
Jason Reiss 15:36db31c18231 781 osDelay(20);
Jason Reiss 15:36db31c18231 782 // catch escape sequence, or tab
Jason Reiss 15:36db31c18231 783 char ch1 = 0x00, ch2 = 0x00;
Jason Reiss 15:36db31c18231 784
Jason Reiss 15:36db31c18231 785 if (readable()) {
Jason Reiss 15:36db31c18231 786 ch1 = read();
Jason Reiss 15:36db31c18231 787 if (readable())
Jason Reiss 15:36db31c18231 788 ch2 = read();
Jason Reiss 15:36db31c18231 789
Jason Reiss 15:36db31c18231 790 if (ch1 == 0x5b && ch2 == 0x41) {
Jason Reiss 15:36db31c18231 791 // up key
Jason Reiss 15:36db31c18231 792 for (size_t i = 0; i < command.size() + 1; i++) {
Jason Reiss 15:36db31c18231 793 writef("\b \b");
Jason Reiss 15:36db31c18231 794 }
Jason Reiss 15:36db31c18231 795 if (history.size() > 0) {
Jason Reiss 15:36db31c18231 796 if (++history_index >= int(history.size() - 1))
Jason Reiss 15:36db31c18231 797 history_index = history.size() - 1;
Jason Reiss 15:36db31c18231 798
Jason Reiss 15:36db31c18231 799 command = history[history_index];
Jason Reiss 15:36db31c18231 800 writef("%s", history[history_index].c_str());
Jason Reiss 15:36db31c18231 801 } else {
Jason Reiss 15:36db31c18231 802 command.clear();
Jason Reiss 15:36db31c18231 803 }
Jason Reiss 15:36db31c18231 804 } else if (ch1 == 0x5b && ch2 == 0x42) {
Jason Reiss 15:36db31c18231 805
Jason Reiss 15:36db31c18231 806 // down key
Jason Reiss 15:36db31c18231 807 for (size_t i = 0; i < command.size() + 1; i++) {
Jason Reiss 15:36db31c18231 808 writef("\b \b");
Jason Reiss 15:36db31c18231 809 }
Jason Reiss 15:36db31c18231 810
Jason Reiss 15:36db31c18231 811 if (--history_index < 0) {
Jason Reiss 15:36db31c18231 812 history_index = -1;
Jason Reiss 15:36db31c18231 813 command.clear();
Jason Reiss 15:36db31c18231 814 } else {
Jason Reiss 15:36db31c18231 815 command = history[history_index];
Jason Reiss 15:36db31c18231 816 writef("%s", history[history_index].c_str());
Jason Reiss 15:36db31c18231 817 }
Jason Reiss 15:36db31c18231 818 }
Jason Reiss 15:36db31c18231 819 }
Jason Reiss 15:36db31c18231 820 while (readable())
Jason Reiss 15:36db31c18231 821 read();
Jason Reiss 15:36db31c18231 822 continue;
Jason Reiss 15:36db31c18231 823 } else {
Jason Reiss 15:36db31c18231 824 command += ch;
Jason Reiss 15:36db31c18231 825 }
Jason Reiss 15:36db31c18231 826
Jason Reiss 15:36db31c18231 827 // echo chars if enabled
Jason Reiss 15:36db31c18231 828 if (echo && !(ch == '\r' || ch == '\n'))
Jason Reiss 15:36db31c18231 829 writef("%c", ch);
Jason Reiss 15:36db31c18231 830 }
Jason Reiss 15:36db31c18231 831
Jason Reiss 15:36db31c18231 832 // look for end of command line
Jason Reiss 15:36db31c18231 833 if (command.find("\n") != std::string::npos || command.find("\r") != std::string::npos) {
Jason Reiss 15:36db31c18231 834 // remove new line or cr character
Jason Reiss 15:36db31c18231 835 command.erase(command.size() - 1);
Jason Reiss 15:36db31c18231 836 write("\r"); // match standard modem output
Jason Reiss 15:36db31c18231 837 write(newline);
Jason Reiss 15:36db31c18231 838 } else {
Jason Reiss 15:36db31c18231 839 continue;
Jason Reiss 15:36db31c18231 840 }
Jason Reiss 15:36db31c18231 841
Jason Reiss 15:36db31c18231 842 // trim whitespace from command
Jason Reiss 15:36db31c18231 843 mts::Text::trim(command, "\r\n\t ");
Jason Reiss 15:36db31c18231 844
Jason Reiss 15:36db31c18231 845 if (command.size() < 1) {
Jason Reiss 15:36db31c18231 846 command.clear();
Jason Reiss 15:36db31c18231 847 continue;
Jason Reiss 15:36db31c18231 848 }
Jason Reiss 15:36db31c18231 849
Jason Reiss 15:36db31c18231 850 // parse command and args
Jason Reiss 15:36db31c18231 851 args.clear();
Jason Reiss 15:36db31c18231 852
Jason Reiss 15:36db31c18231 853 // find first '=' character
Jason Reiss 15:36db31c18231 854 size_t delim_index = command.find("=");
Jason Reiss 15:36db31c18231 855 if (delim_index != std::string::npos) {
Jason Reiss 15:36db31c18231 856 args.push_back(command.substr(0, delim_index));
Jason Reiss 15:36db31c18231 857 } else {
Jason Reiss 15:36db31c18231 858 // find first ' ' character
Jason Reiss 15:36db31c18231 859 delim_index = command.find(" ");
Jason Reiss 15:36db31c18231 860 if (delim_index != std::string::npos) {
Jason Reiss 15:36db31c18231 861 args.push_back(command.substr(0, delim_index));
Jason Reiss 15:36db31c18231 862 } else {
Jason Reiss 15:36db31c18231 863 args.push_back(command);
Jason Reiss 15:36db31c18231 864 }
Jason Reiss 15:36db31c18231 865 }
Jason Reiss 15:36db31c18231 866
Jason Reiss 15:36db31c18231 867 if (delim_index != std::string::npos) {
Jason Reiss 15:36db31c18231 868 std::vector<std::string> params = mts::Text::split(command.substr(delim_index + 1), ",");
Jason Reiss 15:36db31c18231 869 args.insert(args.end(), params.begin(), params.end());
Jason Reiss 15:36db31c18231 870 }
Jason Reiss 15:36db31c18231 871
Jason Reiss 15:36db31c18231 872 args[0] = mts::Text::toUpper(args[0]);
Jason Reiss 15:36db31c18231 873
Jason Reiss 15:36db31c18231 874 // print help
Jason Reiss 15:36db31c18231 875 if ((args[0].find("?") == 0 || args[0].find("HELP") == 0) && args.size() == 1) {
Jason Reiss 15:36db31c18231 876 printHelp();
Jason Reiss 15:36db31c18231 877 command.clear();
Jason Reiss 15:36db31c18231 878 } else if ((args[0].find("ATE?") == 0 && args[0].length() == 4) || (args[0].find("ATE") == 0 && args[0].length() == 3)) {
Jason Reiss 15:36db31c18231 879 writef("%d\r\n", _dot->getEcho());
Jason Reiss 15:36db31c18231 880 write(done);
Jason Reiss 15:36db31c18231 881 } else if (args[0].find("ATE0") == 0 && args[0].length() == 4) {
Jason Reiss 15:36db31c18231 882 _dot->setEcho(false);
Jason Reiss 15:36db31c18231 883 write(done);
Jason Reiss 15:36db31c18231 884 echo = _dot->getEcho();
Jason Reiss 15:36db31c18231 885 } else if (args[0].find("ATE1") == 0 && args[0].length() == 4) {
Jason Reiss 15:36db31c18231 886 _dot->setEcho(true);
Jason Reiss 15:36db31c18231 887 write(done);
Jason Reiss 15:36db31c18231 888 echo = _dot->getEcho();
Jason Reiss 15:36db31c18231 889 } else if ((args[0].find("ATV?") == 0 && args[0].length() == 4) || (args[0].find("ATV") == 0 && args[0].length() == 3)) {
Jason Reiss 15:36db31c18231 890 writef("%d\r\n", _dot->getVerbose());
Jason Reiss 15:36db31c18231 891 write(done);
Jason Reiss 15:36db31c18231 892 } else if (args[0].find("ATV0") == 0 && args[0].length() == 4) {
Jason Reiss 15:36db31c18231 893 _dot->setVerbose(false);
Jason Reiss 15:36db31c18231 894 write(done);
Jason Reiss 15:36db31c18231 895 } else if (args[0].find("ATV1") == 0 && args[0].length() == 4) {
Jason Reiss 15:36db31c18231 896 _dot->setVerbose(true);
Jason Reiss 15:36db31c18231 897 write(done);
Jason Reiss 15:36db31c18231 898 } 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 899 writef("%d\r\n", (_dot->getFlowControl() ? 3 : 0));
Jason Reiss 15:36db31c18231 900 write(done);
Jason Reiss 15:36db31c18231 901 } else if (args[0].find("AT&K0") == 0 && args[0].length() == 5) {
Jason Reiss 15:36db31c18231 902 _dot->setFlowControl(false);
Jason Reiss 15:36db31c18231 903 write(done);
Jason Reiss 15:36db31c18231 904 } else if (args[0].find("AT&K3") == 0 && args[0].length() == 5) {
Jason Reiss 15:36db31c18231 905 _dot->setFlowControl(true);
Jason Reiss 15:36db31c18231 906 write(done);
Jason Reiss 15:36db31c18231 907 } else if (args[0] == "AT+SD") {
Jason Reiss 15:36db31c18231 908 if (_dot->getNetworkJoinStatus()) {
Jason Reiss 15:36db31c18231 909 logDebug("Enter Serial Mode");
Jason Reiss 15:36db31c18231 910 write(connect);
Jason Reiss 15:36db31c18231 911 serial_data_mode = true;
Jason Reiss 15:36db31c18231 912 _mode = mDot::SERIAL_MODE;
Jason Reiss 15:36db31c18231 913 } else {
Jason Reiss 15:36db31c18231 914 logDebug("Network Not Joined");
Jason Reiss 15:36db31c18231 915 write("Network Not Joined\r\n");
Jason Reiss 15:36db31c18231 916 write(error);
Jason Reiss 15:36db31c18231 917 }
Jason Reiss 15:36db31c18231 918 } else if (args[0] == "AT+SLEEP") {
Jason Reiss 15:36db31c18231 919 if (args.size() > 2 && (args[1] != "?")) {
Jason Reiss 15:36db31c18231 920 write("Invalid argument\r\n");
Jason Reiss 15:36db31c18231 921 write(error);
Jason Reiss 15:36db31c18231 922 } else {
Jason Reiss 15:36db31c18231 923 if (args.size() > 1 && args[1] == "?") {
Jason Reiss 15:36db31c18231 924 write("(0:deepsleep,1:sleep)\r\n");
Jason Reiss 15:36db31c18231 925 write(done);
Jason Reiss 15:36db31c18231 926 } else {
Jason Reiss 15:36db31c18231 927 _sleep_standby = !(args.size() > 1 && args[1] == "1");
Jason Reiss 15:36db31c18231 928 write(done);
Jason Reiss 15:36db31c18231 929 this->sleep(_sleep_standby);
Jason Reiss 15:36db31c18231 930 wait(0.1);
Jason Reiss 15:36db31c18231 931 }
Jason Reiss 15:36db31c18231 932 }
Jason Reiss 15:36db31c18231 933 } else {
Jason Reiss 15:36db31c18231 934 bool found = false;
Jason Reiss 15:36db31c18231 935 bool query = false;
Jason Reiss 15:36db31c18231 936
Jason Reiss 15:36db31c18231 937 std::string lookfor = args[0];
Jason Reiss 15:36db31c18231 938
Jason Reiss 15:36db31c18231 939 // per command help
Jason Reiss 15:36db31c18231 940 if ((args[0].find("?") == 0 || args[0].find("HELP") == 0))
Jason Reiss 15:36db31c18231 941 lookfor = mts::Text::toUpper(args[1]);
Jason Reiss 15:36db31c18231 942
Jason Reiss 15:36db31c18231 943 // trim off any trailing '?' and mark as a query command
Jason Reiss 15:36db31c18231 944 if (args[0].rfind("?") == args[0].length() - 1) {
Jason Reiss 15:36db31c18231 945 query = true;
Jason Reiss 15:36db31c18231 946 lookfor = args[0].substr(0, args[0].length() - 1);
Jason Reiss 15:36db31c18231 947 }
Jason Reiss 15:36db31c18231 948
Jason Reiss 15:36db31c18231 949 // search for command
Jason Reiss 15:36db31c18231 950 for (int i = 0; i < NO_OF_COMMANDS; i++) {
Jason Reiss 15:36db31c18231 951
Jason Reiss 15:36db31c18231 952 // match CMD or CMD? syntax if command is queryable
Jason Reiss 15:36db31c18231 953 if (lookfor == _commands[i].text() && (!query || (query && _commands[i].queryable()))) {
Jason Reiss 15:36db31c18231 954 found = true;
Jason Reiss 15:36db31c18231 955 if (args[0] == "HELP") {
Jason Reiss 15:36db31c18231 956 writef("%s%s", _commands[i].help().c_str(), newline);
Jason Reiss 15:36db31c18231 957 write(done);
Jason Reiss 15:36db31c18231 958 }
Jason Reiss 15:36db31c18231 959
Jason Reiss 15:36db31c18231 960 else if (args.size() > 1 && args[1] == "?") {
Jason Reiss 15:36db31c18231 961 writef("%s%s", _commands[i].usage().c_str(), newline);
Jason Reiss 15:36db31c18231 962 write(done);
Jason Reiss 15:36db31c18231 963 } else if (!_verify[i](args)) {
Jason Reiss 15:36db31c18231 964 writef("%s%s", _errorMessage.c_str(), newline);
Jason Reiss 15:36db31c18231 965 writef("%s", error);
Jason Reiss 15:36db31c18231 966 } else {
Jason Reiss 15:36db31c18231 967 if (_action[i](args) == 0) {
Jason Reiss 15:36db31c18231 968 writef("%s", done);
Jason Reiss 15:36db31c18231 969 } else {
Jason Reiss 15:36db31c18231 970 writef("%s%s", _errorMessage.c_str(), newline);
Jason Reiss 15:36db31c18231 971 writef("%s", error);
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
Jason Reiss 15:36db31c18231 977 if (!found) {
Jason Reiss 15:36db31c18231 978 writef("%s", command_error);
Jason Reiss 15:36db31c18231 979 writef("%s", error);
Jason Reiss 15:36db31c18231 980 }
Jason Reiss 15:36db31c18231 981 }
Jason Reiss 15:36db31c18231 982
Jason Reiss 15:36db31c18231 983 if (history.size() == 0 || history.front() != command)
Jason Reiss 15:36db31c18231 984 history.push_front(command);
Jason Reiss 15:36db31c18231 985 history_index = -1;
Jason Reiss 15:36db31c18231 986 command.clear();
Jason Reiss 15:36db31c18231 987
Jason Reiss 15:36db31c18231 988 while (history.size() > 10)
Jason Reiss 15:36db31c18231 989 history.pop_back();
Jason Reiss 15:36db31c18231 990 }
Jason Reiss 15:36db31c18231 991 }
Jason Reiss 15:36db31c18231 992
Jason Reiss 15:36db31c18231 993 void CommandTerminal::sleep(bool standby) {
Jason Reiss 15:36db31c18231 994 _xbee_on_sleep = GPIO_PIN_RESET;
Jason Reiss 15:36db31c18231 995
Jason Reiss 15:36db31c18231 996 _serial.rxClear();
Jason Reiss 15:36db31c18231 997 _serial.txClear();
Jason Reiss 15:36db31c18231 998
Jason Reiss 15:36db31c18231 999 #if defined(TARGET_XDOT_L151CC)
Jason Reiss 15:36db31c18231 1000 xdot_save_gpio_state();
Jason Reiss 15:36db31c18231 1001
Jason Reiss 15:36db31c18231 1002 /* GPIO Ports Clock Enable */
Jason Reiss 15:36db31c18231 1003 __GPIOA_CLK_ENABLE();
Jason Reiss 15:36db31c18231 1004 __GPIOB_CLK_ENABLE();
Jason Reiss 15:36db31c18231 1005 __GPIOC_CLK_ENABLE();
Jason Reiss 15:36db31c18231 1006 __GPIOH_CLK_ENABLE();
Jason Reiss 15:36db31c18231 1007
Jason Reiss 15:36db31c18231 1008 GPIO_InitTypeDef GPIO_InitStruct;
Jason Reiss 15:36db31c18231 1009
Jason Reiss 15:36db31c18231 1010 // UART1_TX, UART1_RTS & UART1_CTS to analog nopull - RX could be a wakeup source
Jason Reiss 15:36db31c18231 1011 GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_11 | GPIO_PIN_12;
Jason Reiss 15:36db31c18231 1012 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
Jason Reiss 15:36db31c18231 1013 GPIO_InitStruct.Pull = GPIO_NOPULL;
Jason Reiss 15:36db31c18231 1014 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
Jason Reiss 15:36db31c18231 1015
Jason Reiss 15:36db31c18231 1016 // I2C_SDA & I2C_SCL to analog nopull
Jason Reiss 15:36db31c18231 1017 GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9;
Jason Reiss 15:36db31c18231 1018 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
Jason Reiss 15:36db31c18231 1019 GPIO_InitStruct.Pull = GPIO_NOPULL;
Jason Reiss 15:36db31c18231 1020 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
Jason Reiss 15:36db31c18231 1021
Jason Reiss 15:36db31c18231 1022 // SPI_MOSI, SPI_MISO, SPI_SCK, & SPI_NSS to analog nopull
Jason Reiss 15:36db31c18231 1023 GPIO_InitStruct.Pin = GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
Jason Reiss 15:36db31c18231 1024 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
Jason Reiss 15:36db31c18231 1025 GPIO_InitStruct.Pull = GPIO_NOPULL;
Jason Reiss 15:36db31c18231 1026 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
Jason Reiss 15:36db31c18231 1027
Jason Reiss 15:36db31c18231 1028 // iterate through potential wake pins - leave the configured wake pin alone if one is needed
Jason Reiss 15:36db31c18231 1029 if (_dot->getWakePin() != WAKE || _dot->getWakeMode() == mDot::RTC_ALARM) {
Jason Reiss 15:36db31c18231 1030 GPIO_InitStruct.Pin = GPIO_PIN_0;
Jason Reiss 15:36db31c18231 1031 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
Jason Reiss 15:36db31c18231 1032 GPIO_InitStruct.Pull = GPIO_NOPULL;
Jason Reiss 15:36db31c18231 1033 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
Jason Reiss 15:36db31c18231 1034 }
Jason Reiss 15:36db31c18231 1035 if (_dot->getWakePin() != GPIO0 || _dot->getWakeMode() == mDot::RTC_ALARM) {
Jason Reiss 15:36db31c18231 1036 GPIO_InitStruct.Pin = GPIO_PIN_4;
Jason Reiss 15:36db31c18231 1037 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
Jason Reiss 15:36db31c18231 1038 GPIO_InitStruct.Pull = GPIO_NOPULL;
Jason Reiss 15:36db31c18231 1039 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
Jason Reiss 15:36db31c18231 1040 }
Jason Reiss 15:36db31c18231 1041 if (_dot->getWakePin() != GPIO1 || _dot->getWakeMode() == mDot::RTC_ALARM) {
Jason Reiss 15:36db31c18231 1042 GPIO_InitStruct.Pin = GPIO_PIN_5;
Jason Reiss 15:36db31c18231 1043 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
Jason Reiss 15:36db31c18231 1044 GPIO_InitStruct.Pull = GPIO_NOPULL;
Jason Reiss 15:36db31c18231 1045 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
Jason Reiss 15:36db31c18231 1046 }
Jason Reiss 15:36db31c18231 1047 if (_dot->getWakePin() != GPIO2 || _dot->getWakeMode() == mDot::RTC_ALARM) {
Jason Reiss 15:36db31c18231 1048 GPIO_InitStruct.Pin = GPIO_PIN_0;
Jason Reiss 15:36db31c18231 1049 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
Jason Reiss 15:36db31c18231 1050 GPIO_InitStruct.Pull = GPIO_NOPULL;
Jason Reiss 15:36db31c18231 1051 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
Jason Reiss 15:36db31c18231 1052 }
Jason Reiss 15:36db31c18231 1053 if (_dot->getWakePin() != GPIO3 || _dot->getWakeMode() == mDot::RTC_ALARM) {
Jason Reiss 15:36db31c18231 1054 GPIO_InitStruct.Pin = GPIO_PIN_2;
Jason Reiss 15:36db31c18231 1055 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
Jason Reiss 15:36db31c18231 1056 GPIO_InitStruct.Pull = GPIO_NOPULL;
Jason Reiss 15:36db31c18231 1057 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
Jason Reiss 15:36db31c18231 1058 }
Jason Reiss 15:36db31c18231 1059 if (_dot->getWakePin() != UART1_RX || _dot->getWakeMode() == mDot::RTC_ALARM) {
Jason Reiss 15:36db31c18231 1060 GPIO_InitStruct.Pin = GPIO_PIN_10;
Jason Reiss 15:36db31c18231 1061 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
Jason Reiss 15:36db31c18231 1062 GPIO_InitStruct.Pull = GPIO_NOPULL;
Jason Reiss 15:36db31c18231 1063 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
Jason Reiss 15:36db31c18231 1064 }
Jason Reiss 15:36db31c18231 1065 #endif
Jason Reiss 15:36db31c18231 1066
Jason Reiss 15:36db31c18231 1067 _dot->sleep(_dot->getWakeInterval(), _dot->getWakeMode(), standby);
Jason Reiss 15:36db31c18231 1068
Jason Reiss 15:36db31c18231 1069 #if defined(TARGET_XDOT_L151CC)
Jason Reiss 15:36db31c18231 1070 xdot_restore_gpio_state();
Jason Reiss 15:36db31c18231 1071 #endif
Jason Reiss 15:36db31c18231 1072 }
Jason Reiss 15:36db31c18231 1073
Jason Reiss 15:36db31c18231 1074 std::string CommandTerminal::formatPacketData(const std::vector<uint8_t>& data, const uint8_t& format) {
Jason Reiss 15:36db31c18231 1075 if (format == mDot::HEXADECIMAL)
Jason Reiss 15:36db31c18231 1076 return mts::Text::bin2hexString(data);
Jason Reiss 15:36db31c18231 1077 else
Jason Reiss 15:36db31c18231 1078 return std::string(data.begin(), data.end());
Jason Reiss 15:36db31c18231 1079 }
Jason Reiss 15:36db31c18231 1080
Jason Reiss 15:36db31c18231 1081 bool CommandTerminal::waitForEscape(int timeout, mDot* dot, WaitType wait) {
Jason Reiss 15:36db31c18231 1082 Timer timer;
Jason Reiss 15:36db31c18231 1083
Jason Reiss 15:36db31c18231 1084 timer.start();
Jason Reiss 15:36db31c18231 1085 while (timer.read_ms() < timeout) {
Jason Reiss 15:36db31c18231 1086
Jason Reiss 15:36db31c18231 1087 if (dot != NULL) {
Jason Reiss 15:36db31c18231 1088 if (wait == WAIT_SEND && (!dot->getIsTransmitting())) {
Jason Reiss 15:36db31c18231 1089 return false;
Jason Reiss 15:36db31c18231 1090 }
Jason Reiss 15:36db31c18231 1091 }
Jason Reiss 15:36db31c18231 1092
Jason Reiss 15:36db31c18231 1093 if (_serialp != NULL && _serialp->escaped()) {
Jason Reiss 15:36db31c18231 1094 _serialp->clearEscaped();
Jason Reiss 15:36db31c18231 1095 return true;
Jason Reiss 15:36db31c18231 1096 }
Jason Reiss 15:36db31c18231 1097
Jason Reiss 15:36db31c18231 1098 osDelay(10);
Jason Reiss 15:36db31c18231 1099 }
Jason Reiss 15:36db31c18231 1100
Jason Reiss 15:36db31c18231 1101 return false;
Jason Reiss 15:36db31c18231 1102 }
Jason Reiss 15:36db31c18231 1103
Jason Reiss 15:36db31c18231 1104 void CommandTerminal::wakeup(void) {
Jason Reiss 15:36db31c18231 1105 }
Jason Reiss 15:36db31c18231 1106
Jason Reiss 15:36db31c18231 1107 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 1108 mDotEvent::PacketRx(port, payload, size, rssi, snr, ctrl, retries);
Jason Reiss 15:36db31c18231 1109
Jason Reiss 15:36db31c18231 1110 if (serial_data_mode) {
Jason Reiss 15:36db31c18231 1111 logDebug("Rx %d bytes", size);
Jason Reiss 15:36db31c18231 1112 if (size > 0) {
Jason Reiss 15:36db31c18231 1113 CommandTerminal::Serial()->write((char*) RxPayload, RxPayloadSize);
Jason Reiss 15:36db31c18231 1114 }
Jason Reiss 15:36db31c18231 1115 if (!CommandTerminal::Serial()->readable() && _dot->getAckRequested() && _dot->getClass() == "C") {
Jason Reiss 15:36db31c18231 1116 _sendAck = true;
Jason Reiss 15:36db31c18231 1117 }
Jason Reiss 15:36db31c18231 1118 }
Jason Reiss 15:36db31c18231 1119 }
Jason Reiss 15:36db31c18231 1120
Jason Reiss 15:36db31c18231 1121 CommandTerminal::~CommandTerminal() {
Jason Reiss 15:36db31c18231 1122 delete _events;
Jason Reiss 15:36db31c18231 1123 }