AT command firmware for MultiTech Dot devices.

Fork of mDot_AT_firmware by MultiTech

Dot Library Not Included!

Because these example programs can be used for both mDot and xDot devices, the LoRa stack is not included. The libmDot library should be imported if building for mDot devices. The libxDot library should be imported if building for xDot devices. The AT firmware was last tested with mbed-os-5.4.7. Using a version past mbed-os-5.4.7 will cause the build to fail. The library used with the AT firmware has to match the mbed-os version.

Dot Library Version 3 Updates

Dot Library versions 3.x.x require a channel plan to be injected into the stack. The Dot-Examples and Dot-AT-Firmware do this by defining a macro called "CHANNEL_PLAN" that controls the channel plan that will be used in the examples. Available channel plans will be in the Dot Library repository in the plans folder.

Revision 20 and earlier of Dot-Examples and revision 15 and earlier of Dot-AT-Firmware should be used with Dot Library versions prior to 3.0.0.

Fota Library

Th Fota Library must be added to compile for mDot 3.1.0 with Fota support. Latest dev libraries and 3.2.0 release will include Fota with libmDot/libxDot.

AT Firmware Description

This AT Firmware is what ships on mDot and xDot devices. It provides an AT command interface for using the mDot or xDot for LoRa communication.

AT command documentation can be found on Multitech.com.

The firmware changelog can be found here. The library changelog can be found here.

Dot Libraries

Dot Library Limitations

The commit messages in libmDot-mbed5 and libmDot-dev-mbed5 specify the version of the Dot library the commit contains and the version of mbed-os it was compiled against. We recommend building your application with the version of mbed-os specified in the commit message of the version of the Dot library you're using. This will ensure that you don't run into any runtime issues caused by differences in the mbed-os versions.

Stable and development libraries are available for both mDot and xDot platforms. The library chosen must match the target platform. Compiling for the mDot platform with the xDot library or vice versa will not succeed.

mDot Library

Development library for mDot.

libmDot-dev

Stable library for mDot.

libmDot

xDot Library

Development library for xDot.

libxDot-dev

Stable library for xDot.

libxDot

Committer:
Mike Fiore
Date:
Fri Nov 04 14:25:43 2016 -0500
Revision:
14:f9a77400b622
Parent:
11:05e0f30c03a6
Child:
16:d5cf2af81a6d
update from git revision 2.0.16

Who changed what in which revision?

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