dev

Dependencies:   MTS-Serial libmDot-mbed5

Fork of Dot-AT-Firmware by MultiTech

Committer:
Mike Fiore
Date:
Thu Jun 25 10:23:41 2015 -0500
Revision:
1:e52ae6584f1c
Child:
2:e5eebd74d36d
update debug, add command source files

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Mike Fiore 1:e52ae6584f1c 1 #include "CmdSendStringOnInterval.h"
Mike Fiore 1:e52ae6584f1c 2 #include "CommandTerminal.h"
Mike Fiore 1:e52ae6584f1c 3
Mike Fiore 1:e52ae6584f1c 4 CmdSendStringOnInterval::CmdSendStringOnInterval(mDot* dot, mts::MTSSerial& serial)
Mike Fiore 1:e52ae6584f1c 5 :
Mike Fiore 1:e52ae6584f1c 6 Command(dot, "Send Continuous", "AT+SENDI", "Sends supplied packet data on interval between sends, output any recevied packets (escape sequence: +++)"),
Mike Fiore 1:e52ae6584f1c 7 _serial(serial) {
Mike Fiore 1:e52ae6584f1c 8 _help = std::string(text()) + ": " + std::string(desc());
Mike Fiore 1:e52ae6584f1c 9 _usage = "(100-2147483647) ms,(string:242)";
Mike Fiore 1:e52ae6584f1c 10 }
Mike Fiore 1:e52ae6584f1c 11
Mike Fiore 1:e52ae6584f1c 12 uint32_t CmdSendStringOnInterval::action(std::vector<std::string> args) {
Mike Fiore 1:e52ae6584f1c 13 int32_t code;
Mike Fiore 1:e52ae6584f1c 14 uint32_t interval;
Mike Fiore 1:e52ae6584f1c 15 std::vector<uint8_t> data(args[2].begin(), args[2].end());
Mike Fiore 1:e52ae6584f1c 16
Mike Fiore 1:e52ae6584f1c 17 sscanf(args[1].c_str(), "%lu", &interval);
Mike Fiore 1:e52ae6584f1c 18
Mike Fiore 1:e52ae6584f1c 19 while (true) {
Mike Fiore 1:e52ae6584f1c 20 if (_dot->getJoinMode() == mDot::AUTO_OTA) {
Mike Fiore 1:e52ae6584f1c 21 Timer timer;
Mike Fiore 1:e52ae6584f1c 22 timer.start();
Mike Fiore 1:e52ae6584f1c 23 uint32_t backoff = 2000;
Mike Fiore 1:e52ae6584f1c 24 while (!_dot->getNetworkJoinStatus()) {
Mike Fiore 1:e52ae6584f1c 25 _serial.writef("Joining network... ");
Mike Fiore 1:e52ae6584f1c 26 if (_dot->joinNetworkOnce() == mDot::MDOT_OK) {
Mike Fiore 1:e52ae6584f1c 27 _serial.writef("Network Joined\r\n");
Mike Fiore 1:e52ae6584f1c 28 } else {
Mike Fiore 1:e52ae6584f1c 29 _serial.writef("Join failed\r\n");
Mike Fiore 1:e52ae6584f1c 30 }
Mike Fiore 1:e52ae6584f1c 31
Mike Fiore 1:e52ae6584f1c 32 if (CommandTerminal::waitForEscape(backoff)) {
Mike Fiore 1:e52ae6584f1c 33 return 0;
Mike Fiore 1:e52ae6584f1c 34 }
Mike Fiore 1:e52ae6584f1c 35
Mike Fiore 1:e52ae6584f1c 36 if (backoff < 60 * 60 * 1000) {
Mike Fiore 1:e52ae6584f1c 37 backoff *= 2;
Mike Fiore 1:e52ae6584f1c 38 }
Mike Fiore 1:e52ae6584f1c 39 }
Mike Fiore 1:e52ae6584f1c 40 } else if (!_dot->getNetworkJoinStatus()) {
Mike Fiore 1:e52ae6584f1c 41 setErrorMessage(mDot::getReturnCodeString(mDot::MDOT_NOT_JOINED));
Mike Fiore 1:e52ae6584f1c 42 return 1;
Mike Fiore 1:e52ae6584f1c 43 }
Mike Fiore 1:e52ae6584f1c 44
Mike Fiore 1:e52ae6584f1c 45 if ((code = _dot->send(data, _dot->getTxWait())) != mDot::MDOT_OK) {
Mike Fiore 1:e52ae6584f1c 46 std::string error = mDot::getReturnCodeString(code);
Mike Fiore 1:e52ae6584f1c 47
Mike Fiore 1:e52ae6584f1c 48 if (code != mDot::MDOT_NOT_JOINED)
Mike Fiore 1:e52ae6584f1c 49 error += + " - " + _dot->getLastError();
Mike Fiore 1:e52ae6584f1c 50
Mike Fiore 1:e52ae6584f1c 51 if (code == mDot::MDOT_INVALID_PARAM) {
Mike Fiore 1:e52ae6584f1c 52 setErrorMessage(error);
Mike Fiore 1:e52ae6584f1c 53 return 1;
Mike Fiore 1:e52ae6584f1c 54 } else {
Mike Fiore 1:e52ae6584f1c 55 _serial.writef("%s\r\n", error.c_str());
Mike Fiore 1:e52ae6584f1c 56 }
Mike Fiore 1:e52ae6584f1c 57 }
Mike Fiore 1:e52ae6584f1c 58
Mike Fiore 1:e52ae6584f1c 59 if (code == mDot::MDOT_OK) {
Mike Fiore 1:e52ae6584f1c 60 if (CommandTerminal::waitForEscape(3000, _dot, CommandTerminal::WAIT_SEND)) {
Mike Fiore 1:e52ae6584f1c 61 return 0;
Mike Fiore 1:e52ae6584f1c 62 }
Mike Fiore 1:e52ae6584f1c 63
Mike Fiore 1:e52ae6584f1c 64 if (_dot->getTxWait() || _dot->getAck() > 0) {
Mike Fiore 1:e52ae6584f1c 65 std::vector<uint8_t> rx_data;
Mike Fiore 1:e52ae6584f1c 66
Mike Fiore 1:e52ae6584f1c 67 if (_dot->recv(rx_data) == mDot::MDOT_OK) {
Mike Fiore 1:e52ae6584f1c 68 if (!rx_data.empty()) {
Mike Fiore 1:e52ae6584f1c 69 if (_dot->getVerbose())
Mike Fiore 1:e52ae6584f1c 70 _serial.writef("Packet data:\r\n");
Mike Fiore 1:e52ae6584f1c 71 _serial.writef("%s\r\n", CommandTerminal::formatPacketData(rx_data, _dot->getRxOutput()).c_str());
Mike Fiore 1:e52ae6584f1c 72 }
Mike Fiore 1:e52ae6584f1c 73 }
Mike Fiore 1:e52ae6584f1c 74 }
Mike Fiore 1:e52ae6584f1c 75 }
Mike Fiore 1:e52ae6584f1c 76
Mike Fiore 1:e52ae6584f1c 77 if (CommandTerminal::waitForEscape(interval)) {
Mike Fiore 1:e52ae6584f1c 78 return 0;
Mike Fiore 1:e52ae6584f1c 79 }
Mike Fiore 1:e52ae6584f1c 80 }
Mike Fiore 1:e52ae6584f1c 81
Mike Fiore 1:e52ae6584f1c 82 return 0;
Mike Fiore 1:e52ae6584f1c 83 }
Mike Fiore 1:e52ae6584f1c 84
Mike Fiore 1:e52ae6584f1c 85 bool CmdSendStringOnInterval::verify(std::vector<std::string> args) {
Mike Fiore 1:e52ae6584f1c 86 if (args.size() == 3) {
Mike Fiore 1:e52ae6584f1c 87 uint32_t interval;
Mike Fiore 1:e52ae6584f1c 88 if (sscanf(args[1].c_str(), "%lu", &interval) != 1) {
Mike Fiore 1:e52ae6584f1c 89 setErrorMessage("Invalid argument");
Mike Fiore 1:e52ae6584f1c 90 return false;
Mike Fiore 1:e52ae6584f1c 91 }
Mike Fiore 1:e52ae6584f1c 92
Mike Fiore 1:e52ae6584f1c 93 if (interval < 100 || interval > INT_MAX) {
Mike Fiore 1:e52ae6584f1c 94 setErrorMessage("Invalid interval, expects (100-2147483647) ms");
Mike Fiore 1:e52ae6584f1c 95 return false;
Mike Fiore 1:e52ae6584f1c 96 }
Mike Fiore 1:e52ae6584f1c 97
Mike Fiore 1:e52ae6584f1c 98 if (args[2].size() > 242) {
Mike Fiore 1:e52ae6584f1c 99 setErrorMessage("Invalid packet, expects (string:242)");
Mike Fiore 1:e52ae6584f1c 100 return false;
Mike Fiore 1:e52ae6584f1c 101 }
Mike Fiore 1:e52ae6584f1c 102
Mike Fiore 1:e52ae6584f1c 103 return true;
Mike Fiore 1:e52ae6584f1c 104 }
Mike Fiore 1:e52ae6584f1c 105
Mike Fiore 1:e52ae6584f1c 106 setErrorMessage("Invalid arguments");
Mike Fiore 1:e52ae6584f1c 107 return false;
Mike Fiore 1:e52ae6584f1c 108 }