few changes for RTS/CTS control

Dependencies:   MTS-Serial libmDot mbed-rtos mbed

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(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 }