Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: MTS-Serial libxDot-dev-mbed5-deprecated
Fork of Dot-AT-Firmware by
Diff: CommandTerminal/CommandTerminal.cpp
- Revision:
- 4:666017851052
- Parent:
- 2:e5eebd74d36d
- Child:
- 6:e27eaad36a0c
diff -r 1ee9417f6707 -r 666017851052 CommandTerminal/CommandTerminal.cpp
--- a/CommandTerminal/CommandTerminal.cpp Tue Aug 18 15:58:59 2015 +0000
+++ b/CommandTerminal/CommandTerminal.cpp Tue Aug 18 11:21:43 2015 -0500
@@ -1,12 +1,10 @@
#include "ctype.h"
#include "CommandTerminal.h"
#include "Command.h"
+#include "MTSLog.h"
#include <cstdarg>
-extern "C" {
-#include "wakeup.h"
- extern void pin_function(PinName pin, int data);
-}
+#include <deque>
const char CommandTerminal::banner[] = "\r\n\nMultiTech Systems LoRa XBee Module\r\n\n";
const char CommandTerminal::helpline[] = "Enter '?' for help\r\n";
@@ -36,14 +34,13 @@
_serial(serial),
_dot(dot),
_mode(mDot::COMMAND_MODE),
- _sleep_standby(false),
+ _idle_thread(idle, NULL, osPriorityLow),
+ _sleep_standby(true),
_xbee_on_sleep(XBEE_ON_SLEEP),
_serial_up(false) {
_serialp = &serial;
- wakeup_init(_dot->getSerialWakeInterval());
-
addCommand(new CmdAttention(_dot));
addCommand(new CmdIdentification(_dot, serial));
addCommand(new CmdResetCpu(_dot, serial));
@@ -54,6 +51,7 @@
addCommand(new CmdSaveConfig(_dot));
addCommand(new CmdDisplayConfig(_dot, serial));
addCommand(new CmdDisplayStats(_dot, serial));
+ addCommand(new CmdResetStats(_dot, serial));
addCommand(new CmdSerialBaudRate(_dot, serial));
addCommand(new CmdDebugBaudRate(_dot, serial));
addCommand(new CmdStartUpMode(_dot, serial));
@@ -71,6 +69,7 @@
addCommand(new CmdJoinRequest(_dot, serial));
addCommand(new CmdJoinRetries(_dot, serial));
+ addCommand(new CmdJoinByteOrder(_dot, serial));
addCommand(new CmdNetworkJoinMode(_dot, serial));
addCommand(new CmdNetworkJoinStatus(_dot, serial));
addCommand(new CmdNetworkLinkCheck(_dot, serial));
@@ -109,10 +108,13 @@
addCommand(new CmdReceiveOnce(_dot, serial));
addCommand(new CmdReceiveContinuous(_dot, serial));
- addCommand(new CmdDummy(_dot, "Serial Data Mode", "AT+SD", "Reads serial data and sends Lora packets (escape sequence: +++)"));
- addCommand(new CmdSerialWakeInterval(_dot, serial));
- addCommand(new CmdSerialWakeDelay(_dot, serial));
- addCommand(new CmdSerialReceiveTimeout(_dot, serial));
+ addCommand(new CmdDummy(_dot, "Serial Data Mode", "AT+SD", "Reads serial data, sends packet, then sleeps using wake settings"));
+ addCommand(new CmdDummy(_dot, "Sleep Mode", "AT+SLEEP", "Enter sleep mode"));
+ addCommand(new CmdWakeMode(_dot, serial));
+ addCommand(new CmdWakeInterval(_dot, serial));
+ // addCommand(new CmdWakePin(_dot, serial));
+ addCommand(new CmdWakeDelay(_dot, serial));
+ addCommand(new CmdWakeTimeout(_dot, serial));
addCommand(new CmdPing(_dot, serial));
addCommand(new CmdLogLevel(_dot, serial));
}
@@ -233,10 +235,11 @@
}
if (_serial_up) {
- osDelay(_dot->getSerialWakeDelay());
+ osDelay(_dot->getWakeDelay());
serial_read_timer.start();
- while (_serial_up && serial_read_timer.read_ms() < _dot->getSerialReceiveTimeout()) {
+ uint16_t timeout = _dot->getWakeTimeout();
+ while (_serial_up && serial_read_timer.read_ms() < timeout) {
while (readable() && serial_buffer.size() < max_send_size) {
serial_buffer.push_back(read());
serial_read_timer.reset();
@@ -251,7 +254,7 @@
std::vector<uint8_t> recv_buffer;
DEBUG_PRINTF("Received serial data, sending out radio.\r\n");
- if (!_dot->send(serial_buffer))
+ if (_dot->send(serial_buffer) != mDot::MDOT_OK)
DEBUG_PRINTF("Send failed.\r\n");
if (_dot->recv(recv_buffer))
_serial.writef("%s\r\n", formatPacketData(recv_buffer, _dot->getRxOutput()).c_str());
@@ -352,12 +355,14 @@
void CommandTerminal::start() {
- _dot->resetNetworkSession();
+ wakeup(_sleep_standby);
char ch;
bool running = true;
bool echo = _dot->getEcho();
std::string command;
+ std::deque<std::string> history;
+ int history_index = -1;
std::vector<std::string> args;
if (_dot->getStartUpMode() == mDot::SERIAL_MODE) {
@@ -423,12 +428,54 @@
if (readable()) {
ch = read();
- if (ch == '\b') {
+ if (ch == '\b' || ch == 0x7f) {
if (!command.empty()) {
writef("\b \b");
command.erase(command.size() - 1);
}
continue;
+ } else if (ch == 0x1b || ch == 0x09) {
+ osDelay(20);
+ // catch escape sequence, or tab
+ char ch1, ch2;
+
+ if (readable()) {
+ ch1 = read();
+ if (readable())
+ ch2 = read();
+
+ if (ch1 == 0x5b && ch2 == 0x41) {
+ // up key
+ for (int i = 0; i < command.size()+1; i++) {
+ writef("\b \b");
+ }
+ if (history.size() > 0) {
+ if (++history_index >= history.size() - 1)
+ history_index = history.size() - 1;
+
+ command = history[history_index];
+ writef("%s", history[history_index].c_str());
+ } else {
+ command.clear();
+ }
+ } else if (ch1 == 0x5b && ch2 == 0x42) {
+
+ // down key
+ for (int i = 0; i < command.size()+1; i++) {
+ writef("\b \b");
+ }
+
+ if (--history_index < 0) {
+ history_index = -1;
+ command.clear();
+ } else {
+ command = history[history_index];
+ writef("%s", history[history_index].c_str());
+ }
+ }
+ }
+ while (readable()) read();
+ continue;
} else {
command += ch;
}
@@ -501,6 +548,21 @@
} else if (args[0] == "AT+SD") {
DEBUG_PRINTF("Enter Serial Mode\r\n");
_mode = mDot::SERIAL_MODE;
+ } else if (args[0] == "AT+SLEEP") {
+ if (args.size() > 1 && (args[1] != "?")) {
+ write("Invalid argument\r\n");
+ write(error);
+ } else {
+ if (args.size() > 1 && args[1] == "?") {
+ write("AT+SLEEP: NONE\r\n");
+ write(done);
+ } else {
+ _sleep_standby = !(args.size() > 1 && args[1] == "1");
+ this->sleep(_sleep_standby);
+ wait(0.1);
+ write(done);
+ }
+ }
} else {
bool found = false;
bool query = false;
@@ -552,8 +614,13 @@
}
}
+ if (history.size() == 0 || history.front() != command)
+ history.push_front(command);
+ history_index = -1;
command.clear();
+ while (history.size() > 10)
+ history.pop_back();
}
}
@@ -568,65 +635,10 @@
_serial_up = false;
_xbee_on_sleep = GPIO_PIN_RESET;
- HAL_PWREx_EnableMainRegulatorLowVoltage();
- HAL_PWREx_EnableFlashPowerDown();
- HAL_PWREx_EnableLowRegulatorLowVoltage();
-
- DEBUG_PRINTF("Sleep\r\n");
- _dot->sleep();
-
- if (standby) {
-
- DEBUG_PRINTF("RECORD UPLINK: %lu\r\n", _dot->getUpLinkCounter());
-
- RTC_WriteBackupRegister(RTC_BKP_DR0, _dot->getUpLinkCounter());
-
- HAL_PWR_EnableBkUpAccess();
-
- HAL_EnableDBGStandbyMode();
-
- HAL_PWR_DisableWakeUpPin (PWR_WAKEUP_PIN1);
-
- __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); // InterruptIn wakeon_serial(XBEE_DIN);
- // Application is reloaded after wake-up from standby
-HAL_PWR_EnterSTANDBYMode ();
+ _serial.rxClear();
+ _serial.txClear();
- } else {
- pin_function(PA_0, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0));
- pin_function(PA_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0));
- // pin_function(PA_2, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0));
- // pin_function(PA_3, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0));
- pin_function(PA_4, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0));
- pin_function(PA_5, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0));
- pin_function(PA_6, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0));
- pin_function(PA_7, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0));
- // pin_function(PA_8, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0));
- // pin_function(PA_9, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0));
- // pin_function(PA_10, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0));
- pin_function(PA_11, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0));
- pin_function(PA_12, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0));
- pin_function(PA_15, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0));
-
- pin_function(PB_0, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0));
- pin_function(PB_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0));
- pin_function(PB_2, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0));
-
- pin_function(PC_1, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0));
- pin_function(PC_4, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0));
- pin_function(PC_5, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0));
- pin_function(PC_9, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0));
- // pin_function(PC_13, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0));
-
- pin_function(PD_2, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0));
-
- HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
- }
-
- wakeup_clear();
- EXTI->PR = (1 << 22);
-
- // After wake-up from STOP reconfigure the PLL
- SetSysClock();
+ _dot->sleep(_dot->getWakeInterval(), _dot->getWakeMode(), standby);
}
bool CommandTerminal::waitForEscape(int timeout, mDot* dot, WaitType wait) {
@@ -665,16 +677,5 @@
}
void CommandTerminal::wakeup(bool standby) {
- HAL_PWREx_DisableMainRegulatorLowVoltage();
- HAL_PWREx_DisableFlashPowerDown();
- HAL_PWREx_DisableLowRegulatorLowVoltage();
-
- if (standby) {
- HAL_DisableDBGStandbyMode();
-
- HAL_PWR_EnableWakeUpPin (PWR_WAKEUP_PIN1);
- }
-
- _dot->wakeup();
}
