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 libmDot mbed-rtos mbed-src
Fork of mDot_AT_firmware by
CmdSendStringOnInterval.cpp
00001 #include "CmdSendStringOnInterval.h" 00002 #include "CommandTerminal.h" 00003 00004 CmdSendStringOnInterval::CmdSendStringOnInterval(mDot* dot, mts::MTSSerial& serial) 00005 : 00006 Command(dot, "Send Continuous", "AT+SENDI", "Sends supplied packet data on interval between sends, output any recevied packets (escape sequence: +++)"), 00007 _serial(serial) { 00008 _help = std::string(text()) + ": " + std::string(desc()); 00009 _usage = "(100-2147483647) ms,(string:242)"; 00010 } 00011 00012 uint32_t CmdSendStringOnInterval::action(std::vector<std::string> args) { 00013 int32_t code; 00014 uint32_t interval; 00015 std::string text; 00016 00017 sscanf(args[1].c_str(), "%lu", &interval); 00018 00019 for (size_t i = 2; i < args.size(); i++) { 00020 text.append(args[i]); 00021 if (i != args.size() - 1) 00022 text.append(","); 00023 } 00024 std::vector<uint8_t> data(text.begin(), text.end()); 00025 00026 while (true) { 00027 if (_dot->getJoinMode() == mDot::AUTO_OTA) { 00028 Timer timer; 00029 timer.start(); 00030 uint32_t backoff = 2000; 00031 while (!_dot->getNetworkJoinStatus()) { 00032 _serial.writef("Joining network... "); 00033 if (_dot->joinNetworkOnce() == mDot::MDOT_OK) { 00034 _serial.writef("Network Joined\r\n"); 00035 } else { 00036 _serial.writef("Join failed\r\n"); 00037 } 00038 00039 if (CommandTerminal::waitForEscape(backoff)) { 00040 return 0; 00041 } 00042 00043 if (backoff < 60 * 60 * 1000) { 00044 backoff *= 2; 00045 } 00046 } 00047 } else if (!_dot->getNetworkJoinStatus()) { 00048 setErrorMessage(mDot::getReturnCodeString(mDot::MDOT_NOT_JOINED)); 00049 return 1; 00050 } 00051 00052 if ((code = _dot->send(data, _dot->getTxWait())) != mDot::MDOT_OK) { 00053 std::string error = mDot::getReturnCodeString(code); 00054 00055 if (code != mDot::MDOT_NOT_JOINED) 00056 error += + " - " + _dot->getLastError(); 00057 00058 if (code == mDot::MDOT_INVALID_PARAM) { 00059 setErrorMessage(error); 00060 return 1; 00061 } else { 00062 _serial.writef("%s\r\n", error.c_str()); 00063 } 00064 } 00065 00066 if (code == mDot::MDOT_OK) { 00067 if (CommandTerminal::waitForEscape(3000, _dot, CommandTerminal::WAIT_SEND)) { 00068 return 0; 00069 } 00070 00071 if (_dot->getTxWait() || _dot->getAck() > 0) { 00072 std::vector<uint8_t> rx_data; 00073 00074 if (_dot->recv(rx_data) == mDot::MDOT_OK) { 00075 if (!rx_data.empty()) { 00076 if (_dot->getVerbose()) 00077 _serial.writef("Packet data:\r\n"); 00078 _serial.writef("%s\r\n", CommandTerminal::formatPacketData(rx_data, _dot->getRxOutput()).c_str()); 00079 } 00080 } 00081 } 00082 } 00083 00084 if (CommandTerminal::waitForEscape(interval)) { 00085 return 0; 00086 } 00087 } 00088 00089 return 0; 00090 } 00091 00092 bool CmdSendStringOnInterval::verify(std::vector<std::string> args) { 00093 if (args.size() >= 3) { 00094 uint32_t interval; 00095 size_t size = 0; 00096 00097 if (sscanf(args[1].c_str(), "%lu", &interval) != 1) { 00098 setErrorMessage("Invalid argument"); 00099 return false; 00100 } 00101 00102 if (interval < 100 || interval > INT_MAX) { 00103 setErrorMessage("Invalid interval, expects (100-2147483647) ms"); 00104 return false; 00105 } 00106 00107 for (int i = 2; i < args.size(); i++) 00108 size += args[i].size(); 00109 if (size > 242) { 00110 setErrorMessage("Invalid packet, expects (string:242)"); 00111 return false; 00112 } 00113 00114 return true; 00115 } 00116 00117 setErrorMessage("Invalid arguments"); 00118 return false; 00119 }
Generated on Tue Jul 12 2022 21:40:57 by
1.7.2
