few changes for RTS/CTS control
Dependencies: MTS-Serial libmDot mbed-rtos mbed
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 On Interval", "AT+SENDI", "Sends supplied packet data on interval between sends, output any received 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 int interval; 00015 std::string text; 00016 00017 sscanf(args[1].c_str(), "%d", &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 while (!_dot->getNetworkJoinStatus()) { 00031 _serial.writef("Joining network... "); 00032 if (_dot->joinNetworkOnce() == mDot::MDOT_OK) { 00033 _serial.writef("Network Joined\r\n"); 00034 } else { 00035 _serial.writef("%s\r\n", _dot->getLastError().c_str()); 00036 } 00037 00038 if (CommandTerminal::waitForEscape(_dot->getNextTxMs())) { 00039 return 0; 00040 } 00041 } 00042 } else if (!_dot->getNetworkJoinStatus()) { 00043 setErrorMessage(mDot::getReturnCodeString(mDot::MDOT_NOT_JOINED)); 00044 return 1; 00045 } 00046 00047 if ((code = _dot->send(data, _dot->getTxWait())) != mDot::MDOT_OK) { 00048 std::string error = _dot->getLastError(); 00049 00050 if (code == mDot::MDOT_INVALID_PARAM) { 00051 setErrorMessage(_dot->getLastError());; 00052 return 1; 00053 } else { 00054 _serial.writef("%s\r\n", error.c_str()); 00055 } 00056 } 00057 00058 if (code == mDot::MDOT_OK) { 00059 if (CommandTerminal::waitForEscape(3000, _dot, CommandTerminal::WAIT_SEND)) { 00060 return 0; 00061 } 00062 00063 if (_dot->getTxWait() || _dot->getAck() > 0) { 00064 std::vector<uint8_t> rx_data; 00065 00066 if (_dot->recv(rx_data) == mDot::MDOT_OK) { 00067 if (!rx_data.empty()) { 00068 if (_dot->getVerbose()) 00069 _serial.writef("Packet data:\r\n"); 00070 _serial.writef("%s\r\n", CommandTerminal::formatPacketData(rx_data, _dot->getRxOutput()).c_str()); 00071 } 00072 } 00073 } 00074 } 00075 00076 if (CommandTerminal::waitForEscape(interval)) { 00077 return 0; 00078 } 00079 } 00080 00081 return 0; 00082 } 00083 00084 bool CmdSendStringOnInterval::verify(std::vector<std::string> args) { 00085 if (args.size() >= 3) { 00086 int interval; 00087 size_t size = 0; 00088 00089 if (sscanf(args[1].c_str(), "%d", &interval) != 1) { 00090 setErrorMessage("Invalid argument"); 00091 return false; 00092 } 00093 00094 if (interval < 100 || interval > INT_MAX) { 00095 setErrorMessage("Invalid interval, expects (100-2147483647) ms"); 00096 return false; 00097 } 00098 00099 for (size_t i = 2; i < args.size() - 1; i++) 00100 size += args[i].size() + 1; 00101 if (size > 242) { 00102 setErrorMessage("Invalid packet, expects (string:242)"); 00103 return false; 00104 } 00105 00106 return true; 00107 } 00108 00109 setErrorMessage("Invalid arguments"); 00110 return false; 00111 }
Generated on Tue Jul 12 2022 16:01:23 by 1.7.2