DeepPass / mDot_AT_firmware

Dependencies:   MTS-Serial libmDot mbed-rtos mbed-src

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