dev

Dependencies:   MTS-Serial libmDot-mbed5

Fork of Dot-AT-Firmware by MultiTech

Committer:
Mike Fiore
Date:
Fri Jul 10 09:43:56 2015 -0500
Revision:
2:e5eebd74d36d
Parent:
1:e52ae6584f1c
Child:
4:666017851052
update from rev 6d77074fdfa315ba86bedecc44515b11bfa6e9a0 - add support for commas in payloads of +SEND and +SENDI

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 2:e5eebd74d36d 15 std::string text;
Mike Fiore 1:e52ae6584f1c 16
Mike Fiore 1:e52ae6584f1c 17 sscanf(args[1].c_str(), "%lu", &interval);
Mike Fiore 1:e52ae6584f1c 18
Mike Fiore 2:e5eebd74d36d 19 for (size_t i = 2; i < args.size(); i++) {
Mike Fiore 2:e5eebd74d36d 20 text.append(args[i]);
Mike Fiore 2:e5eebd74d36d 21 if (i != args.size() - 1)
Mike Fiore 2:e5eebd74d36d 22 text.append(",");
Mike Fiore 2:e5eebd74d36d 23 }
Mike Fiore 2:e5eebd74d36d 24 std::vector<uint8_t> data(text.begin(), text.end());
Mike Fiore 2:e5eebd74d36d 25
Mike Fiore 1:e52ae6584f1c 26 while (true) {
Mike Fiore 1:e52ae6584f1c 27 if (_dot->getJoinMode() == mDot::AUTO_OTA) {
Mike Fiore 1:e52ae6584f1c 28 Timer timer;
Mike Fiore 1:e52ae6584f1c 29 timer.start();
Mike Fiore 1:e52ae6584f1c 30 uint32_t backoff = 2000;
Mike Fiore 1:e52ae6584f1c 31 while (!_dot->getNetworkJoinStatus()) {
Mike Fiore 1:e52ae6584f1c 32 _serial.writef("Joining network... ");
Mike Fiore 1:e52ae6584f1c 33 if (_dot->joinNetworkOnce() == mDot::MDOT_OK) {
Mike Fiore 1:e52ae6584f1c 34 _serial.writef("Network Joined\r\n");
Mike Fiore 1:e52ae6584f1c 35 } else {
Mike Fiore 1:e52ae6584f1c 36 _serial.writef("Join failed\r\n");
Mike Fiore 1:e52ae6584f1c 37 }
Mike Fiore 1:e52ae6584f1c 38
Mike Fiore 1:e52ae6584f1c 39 if (CommandTerminal::waitForEscape(backoff)) {
Mike Fiore 1:e52ae6584f1c 40 return 0;
Mike Fiore 1:e52ae6584f1c 41 }
Mike Fiore 1:e52ae6584f1c 42
Mike Fiore 1:e52ae6584f1c 43 if (backoff < 60 * 60 * 1000) {
Mike Fiore 1:e52ae6584f1c 44 backoff *= 2;
Mike Fiore 1:e52ae6584f1c 45 }
Mike Fiore 1:e52ae6584f1c 46 }
Mike Fiore 1:e52ae6584f1c 47 } else if (!_dot->getNetworkJoinStatus()) {
Mike Fiore 1:e52ae6584f1c 48 setErrorMessage(mDot::getReturnCodeString(mDot::MDOT_NOT_JOINED));
Mike Fiore 1:e52ae6584f1c 49 return 1;
Mike Fiore 1:e52ae6584f1c 50 }
Mike Fiore 1:e52ae6584f1c 51
Mike Fiore 1:e52ae6584f1c 52 if ((code = _dot->send(data, _dot->getTxWait())) != mDot::MDOT_OK) {
Mike Fiore 1:e52ae6584f1c 53 std::string error = mDot::getReturnCodeString(code);
Mike Fiore 1:e52ae6584f1c 54
Mike Fiore 1:e52ae6584f1c 55 if (code != mDot::MDOT_NOT_JOINED)
Mike Fiore 1:e52ae6584f1c 56 error += + " - " + _dot->getLastError();
Mike Fiore 1:e52ae6584f1c 57
Mike Fiore 1:e52ae6584f1c 58 if (code == mDot::MDOT_INVALID_PARAM) {
Mike Fiore 1:e52ae6584f1c 59 setErrorMessage(error);
Mike Fiore 1:e52ae6584f1c 60 return 1;
Mike Fiore 1:e52ae6584f1c 61 } else {
Mike Fiore 1:e52ae6584f1c 62 _serial.writef("%s\r\n", error.c_str());
Mike Fiore 1:e52ae6584f1c 63 }
Mike Fiore 1:e52ae6584f1c 64 }
Mike Fiore 1:e52ae6584f1c 65
Mike Fiore 1:e52ae6584f1c 66 if (code == mDot::MDOT_OK) {
Mike Fiore 1:e52ae6584f1c 67 if (CommandTerminal::waitForEscape(3000, _dot, CommandTerminal::WAIT_SEND)) {
Mike Fiore 1:e52ae6584f1c 68 return 0;
Mike Fiore 1:e52ae6584f1c 69 }
Mike Fiore 1:e52ae6584f1c 70
Mike Fiore 1:e52ae6584f1c 71 if (_dot->getTxWait() || _dot->getAck() > 0) {
Mike Fiore 1:e52ae6584f1c 72 std::vector<uint8_t> rx_data;
Mike Fiore 1:e52ae6584f1c 73
Mike Fiore 1:e52ae6584f1c 74 if (_dot->recv(rx_data) == mDot::MDOT_OK) {
Mike Fiore 1:e52ae6584f1c 75 if (!rx_data.empty()) {
Mike Fiore 1:e52ae6584f1c 76 if (_dot->getVerbose())
Mike Fiore 1:e52ae6584f1c 77 _serial.writef("Packet data:\r\n");
Mike Fiore 1:e52ae6584f1c 78 _serial.writef("%s\r\n", CommandTerminal::formatPacketData(rx_data, _dot->getRxOutput()).c_str());
Mike Fiore 1:e52ae6584f1c 79 }
Mike Fiore 1:e52ae6584f1c 80 }
Mike Fiore 1:e52ae6584f1c 81 }
Mike Fiore 1:e52ae6584f1c 82 }
Mike Fiore 1:e52ae6584f1c 83
Mike Fiore 1:e52ae6584f1c 84 if (CommandTerminal::waitForEscape(interval)) {
Mike Fiore 1:e52ae6584f1c 85 return 0;
Mike Fiore 1:e52ae6584f1c 86 }
Mike Fiore 1:e52ae6584f1c 87 }
Mike Fiore 1:e52ae6584f1c 88
Mike Fiore 1:e52ae6584f1c 89 return 0;
Mike Fiore 1:e52ae6584f1c 90 }
Mike Fiore 1:e52ae6584f1c 91
Mike Fiore 1:e52ae6584f1c 92 bool CmdSendStringOnInterval::verify(std::vector<std::string> args) {
Mike Fiore 2:e5eebd74d36d 93 if (args.size() >= 3) {
Mike Fiore 1:e52ae6584f1c 94 uint32_t interval;
Mike Fiore 2:e5eebd74d36d 95 size_t size = 0;
Mike Fiore 2:e5eebd74d36d 96
Mike Fiore 1:e52ae6584f1c 97 if (sscanf(args[1].c_str(), "%lu", &interval) != 1) {
Mike Fiore 1:e52ae6584f1c 98 setErrorMessage("Invalid argument");
Mike Fiore 1:e52ae6584f1c 99 return false;
Mike Fiore 1:e52ae6584f1c 100 }
Mike Fiore 1:e52ae6584f1c 101
Mike Fiore 1:e52ae6584f1c 102 if (interval < 100 || interval > INT_MAX) {
Mike Fiore 1:e52ae6584f1c 103 setErrorMessage("Invalid interval, expects (100-2147483647) ms");
Mike Fiore 1:e52ae6584f1c 104 return false;
Mike Fiore 1:e52ae6584f1c 105 }
Mike Fiore 1:e52ae6584f1c 106
Mike Fiore 2:e5eebd74d36d 107 for (int i = 2; i < args.size(); i++)
Mike Fiore 2:e5eebd74d36d 108 size += args[i].size();
Mike Fiore 2:e5eebd74d36d 109 if (size > 242) {
Mike Fiore 1:e52ae6584f1c 110 setErrorMessage("Invalid packet, expects (string:242)");
Mike Fiore 1:e52ae6584f1c 111 return false;
Mike Fiore 1:e52ae6584f1c 112 }
Mike Fiore 1:e52ae6584f1c 113
Mike Fiore 1:e52ae6584f1c 114 return true;
Mike Fiore 1:e52ae6584f1c 115 }
Mike Fiore 1:e52ae6584f1c 116
Mike Fiore 1:e52ae6584f1c 117 setErrorMessage("Invalid arguments");
Mike Fiore 1:e52ae6584f1c 118 return false;
Mike Fiore 1:e52ae6584f1c 119 }