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:
Jason Reiss
Date:
Fri Sep 11 13:16:33 2020 -0500
Revision:
27:5fafd3b26ac3
Parent:
23:4f0a981c0349
Child:
28:c222ca8383f4
Update to Dot 3.3.6

Who changed what in which revision?

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