AT command firmware for MultiTech Dot devices.

Fork of mDot_AT_firmware by MultiTech

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers CmdSendStringOnInterval.cpp Source File

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 }