with 36errors

Dependencies:   MTS-Serial libxDot-dev-mbed5-deprecated

Fork of Dot-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 : 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)") {
00006 
00007 }
00008 
00009 uint32_t CmdSendStringOnInterval::action(std::vector<std::string> args) {
00010     
00011     int32_t code;
00012     int interval;
00013     std::string text;
00014 
00015     sscanf(args[1].c_str(), "%d", &interval);
00016 
00017     for (size_t i = 2; i < args.size(); i++) {
00018         text.append(args[i]);
00019         if (i != args.size() - 1)
00020             text.append(",");
00021     }
00022     std::vector<uint8_t> data(text.begin(), text.end());
00023 
00024     while (true) {
00025         if (CommandTerminal::Dot()->getJoinMode() == mDot::AUTO_OTA) {
00026             Timer timer;
00027             timer.start();
00028             while (!CommandTerminal::Dot()->getNetworkJoinStatus()) {
00029                 CommandTerminal::Serial()->writef("Joining network... ");
00030                 if (CommandTerminal::Dot()->joinNetworkOnce() == mDot::MDOT_OK) {
00031                     CommandTerminal::Serial()->writef("Network Joined\r\n");
00032                 } else {
00033                     CommandTerminal::Serial()->writef("%s\r\n", CommandTerminal::Dot()->getLastError().c_str());
00034                 }
00035 
00036                 if (CommandTerminal::waitForEscape(CommandTerminal::Dot()->getNextTxMs())) {
00037                     return 0;
00038                 }
00039             }
00040         } else if (!CommandTerminal::Dot()->getNetworkJoinStatus()) {
00041             CommandTerminal::setErrorMessage(mDot::getReturnCodeString(mDot::MDOT_NOT_JOINED));
00042             return 1;
00043         }
00044 
00045         if ((code = CommandTerminal::Dot()->send(data, CommandTerminal::Dot()->getTxWait())) != mDot::MDOT_OK) {
00046             std::string error = CommandTerminal::Dot()->getLastError();
00047 
00048             if (code == mDot::MDOT_INVALID_PARAM) {
00049                 CommandTerminal::setErrorMessage(CommandTerminal::Dot()->getLastError());;
00050                 return 1;
00051             } else {
00052                 CommandTerminal::Serial()->writef("%s\r\n", error.c_str());
00053             }
00054         }
00055 
00056         if (code == mDot::MDOT_OK) {
00057             if (CommandTerminal::waitForEscape(3000, CommandTerminal::Dot(), CommandTerminal::WAIT_SEND)) {
00058                 return 0;
00059             }
00060 
00061             if (CommandTerminal::Dot()->getTxWait() || CommandTerminal::Dot()->getAck() > 0) {
00062                 std::vector<uint8_t> rx_data;
00063 
00064                 if (CommandTerminal::Dot()->recv(rx_data) == mDot::MDOT_OK) {
00065                     if (!rx_data.empty()) {
00066                         if (CommandTerminal::Dot()->getRxOutput() == mDot::HEXADECIMAL) {
00067                             for (size_t i = 0; i < data.size(); i++) {
00068                                 CommandTerminal::Serial()->writef("%02x", data[i]);
00069                             }
00070                             CommandTerminal::Serial()->writef("\r\n");
00071                         } else {
00072                             CommandTerminal::Serial()->writef("%s\r\n", CommandTerminal::formatPacketData(data, CommandTerminal::Dot()->getRxOutput()).c_str());
00073                         }
00074                     }
00075                 }
00076             } else if (!CommandTerminal::Dot()->getTxWait()) {
00077                 CommandTerminal::Dot()->cancelRxWindow();
00078             }
00079         }
00080 
00081         if (CommandTerminal::waitForEscape(interval)) {
00082             return 0;
00083         }
00084     }
00085 
00086     return 0;
00087 }
00088 
00089 bool CmdSendStringOnInterval::verify(std::vector<std::string> args) {
00090     if (args.size() >= 3) {
00091         int interval;
00092         size_t size = 0;
00093 
00094         if (sscanf(args[1].c_str(), "%d", &interval) != 1) {
00095             CommandTerminal::setErrorMessage("Invalid argument");
00096             return false;
00097         }
00098 
00099         if (interval < 1 || interval > INT_MAX-1) {
00100             CommandTerminal::setErrorMessage("Invalid interval, expects (1-2147483646) ms");
00101             return false;
00102         }
00103 
00104         for (size_t i = 2; i < args.size() - 1; i++)
00105             size += args[i].size() + 1;
00106         if (size > 242) {
00107             CommandTerminal::setErrorMessage("Invalid packet, expects (string:242)");
00108             return false;
00109         }
00110 
00111         return true;
00112     }
00113 
00114     CommandTerminal::setErrorMessage("Invalid arguments");
00115     return false;
00116 }