MultiTech / Mbed OS mDot_AT_firmware_CUSTOM

Dependencies:   libmDot-Custom MTS-Serial

Fork of mDot_AT_firmware_CUSTOM by Jason Reiss

To change channel plans replace AS923 with AU915, EU868, KR920 or US915 on line 15

#define CHANNEL_PLAN CP_AS923

See Supported Channel Plans

Committer:
Jason Reiss
Date:
Mon Aug 29 10:05:41 2016 -0500
Revision:
14:e80ace5a6834
Parent:
9:ff62b20f7000
Update commands

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