AT command firmware for MultiTech Dot devices.
Fork of mDot_AT_firmware by
CmdSendStringOnInterval.cpp
00001 #include "CmdSendStringOnInterval.h" 00002 #include "CommandTerminal.h" 00003 00004 CmdSendStringOnInterval::CmdSendStringOnInterval() : 00005 #if MTS_CMD_TERM_VERBOSE 00006 Command("Send On Interval", "AT+SENDI", "Sends supplied packet data on interval between sends, output any received packets (escape sequence: +++)", "(1-2147483647) ms,(string:242)") 00007 #else 00008 Command("AT+SENDI") 00009 #endif 00010 { 00011 00012 } 00013 00014 uint32_t CmdSendStringOnInterval::action(const std::vector<std::string>& args) { 00015 00016 int32_t code; 00017 int interval; 00018 std::string* text = new std::string(); 00019 00020 sscanf(args[1].c_str(), "%d", &interval); 00021 00022 for (size_t i = 2; i < args.size(); i++) { 00023 text->append(args[i]); 00024 if (i != args.size() - 1) 00025 text->append(","); 00026 } 00027 00028 std::vector<uint8_t> data(text->begin(), text->end()); 00029 std::vector<uint8_t> mt; 00030 delete text; 00031 00032 while (true) { 00033 if (CommandTerminal::Dot()->getJoinMode() == mDot::AUTO_OTA) { 00034 Timer timer; 00035 timer.start(); 00036 while (!CommandTerminal::Dot()->getNetworkJoinStatus()) { 00037 CommandTerminal::Serial()->writef("Joining network... "); 00038 if (CommandTerminal::Dot()->joinNetworkOnce() == mDot::MDOT_OK) { 00039 CommandTerminal::Serial()->writef("Network Joined\r\n"); 00040 } else { 00041 CommandTerminal::Serial()->writef("%s\r\n", CommandTerminal::Dot()->getLastError().c_str()); 00042 } 00043 00044 if (CommandTerminal::waitForEscape(CommandTerminal::Dot()->getNextTxMs())) { 00045 return 0; 00046 } 00047 } 00048 } else if (!CommandTerminal::Dot()->getNetworkJoinStatus()) { 00049 CommandTerminal::setErrorMessage(mDot::getReturnCodeString(mDot::MDOT_NOT_JOINED)); 00050 return 1; 00051 } 00052 00053 if ((code = CommandTerminal::Dot()->send(data, CommandTerminal::Dot()->getTxWait())) != mDot::MDOT_OK) { 00054 std::string error = CommandTerminal::Dot()->getLastError(); 00055 00056 if (code == mDot::MDOT_INVALID_PARAM) { 00057 return 1; 00058 } else { 00059 CommandTerminal::Serial()->writef("%s\r\n", error.c_str()); 00060 } 00061 } 00062 00063 if (code == mDot::MDOT_OK) { 00064 if (CommandTerminal::waitForEscape(3000, CommandTerminal::Dot(), CommandTerminal::WAIT_SEND)) { 00065 return 0; 00066 } 00067 00068 if (CommandTerminal::Dot()->getTxWait() || CommandTerminal::Dot()->getAck() > 0) { 00069 printRecvData(); 00070 } else if (!CommandTerminal::Dot()->getTxWait()) { 00071 CommandTerminal::Dot()->cancelRxWindow(); 00072 } 00073 } 00074 00075 if (CommandTerminal::waitForEscape(interval)) { 00076 return 0; 00077 } 00078 } 00079 } 00080 00081 bool CmdSendStringOnInterval::verify(const std::vector<std::string>& args) { 00082 if (args.size() >= 3) { 00083 int interval; 00084 size_t size = 0; 00085 00086 if (sscanf(args[1].c_str(), "%d", &interval) != 1) { 00087 #if MTS_CMD_TERM_VERBOSE 00088 CommandTerminal::setErrorMessage("Invalid argument"); 00089 #endif 00090 return false; 00091 } 00092 00093 if (interval < 1 || interval > INT_MAX-1) { 00094 #if MTS_CMD_TERM_VERBOSE 00095 CommandTerminal::setErrorMessage("Invalid interval, expects (1-2147483646) ms"); 00096 #endif 00097 return false; 00098 } 00099 00100 for (size_t i = 2; i < args.size() - 1; i++) 00101 size += args[i].size() + 1; 00102 if (size > 242) { 00103 #if MTS_CMD_TERM_VERBOSE 00104 CommandTerminal::setErrorMessage("Invalid packet, expects (string:242)"); 00105 #endif 00106 return false; 00107 } 00108 00109 return true; 00110 } 00111 00112 #if MTS_CMD_TERM_VERBOSE 00113 CommandTerminal::setErrorMessage("Invalid arguments"); 00114 #endif 00115 return false; 00116 }
Generated on Wed Dec 6 2023 19:34:05 by 1.7.2