few changes for RTS/CTS control
Dependencies: MTS-Serial libmDot mbed-rtos mbed
Fork of mDot_AT_firmware by
CommandTerminal/Command.cpp@11:77b7911263da, 2016-10-25 (annotated)
- Committer:
- serg838
- Date:
- Tue Oct 25 05:39:39 2016 +0000
- Revision:
- 11:77b7911263da
- Parent:
- 9:ff62b20f7000
RTS/CTS changes
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Mike Fiore |
1:e52ae6584f1c | 1 | #include "Command.h" |
Mike Fiore |
1:e52ae6584f1c | 2 | #include <algorithm> |
Mike Fiore |
1:e52ae6584f1c | 3 | |
Mike Fiore |
1:e52ae6584f1c | 4 | const char Command::newline[] = "\r\n"; |
Mike Fiore |
1:e52ae6584f1c | 5 | |
Mike Fiore |
9:ff62b20f7000 | 6 | Command::Command(mDot* dot) : _dot(dot), _name(""), _text(""), _desc("") |
Mike Fiore |
1:e52ae6584f1c | 7 | { |
Mike Fiore |
1:e52ae6584f1c | 8 | _usage = "NONE"; |
Mike Fiore |
1:e52ae6584f1c | 9 | _queryable = false; |
Mike Fiore |
1:e52ae6584f1c | 10 | } |
Mike Fiore |
1:e52ae6584f1c | 11 | |
Mike Fiore |
1:e52ae6584f1c | 12 | Command::Command(mDot* dot, const char* name, const char* text, const char* desc) : |
Mike Fiore |
1:e52ae6584f1c | 13 | _dot(dot), _name(name), _text(text), _desc(desc) |
Mike Fiore |
1:e52ae6584f1c | 14 | { |
Mike Fiore |
1:e52ae6584f1c | 15 | _usage = "NONE"; |
Mike Fiore |
1:e52ae6584f1c | 16 | _queryable = false; |
Mike Fiore |
1:e52ae6584f1c | 17 | } |
Mike Fiore |
1:e52ae6584f1c | 18 | |
Mike Fiore |
1:e52ae6584f1c | 19 | std::string &Command::errorMessage() |
Mike Fiore |
1:e52ae6584f1c | 20 | { |
Mike Fiore |
1:e52ae6584f1c | 21 | return _errorMessage; |
Mike Fiore |
1:e52ae6584f1c | 22 | } |
Mike Fiore |
1:e52ae6584f1c | 23 | |
Mike Fiore |
1:e52ae6584f1c | 24 | void Command::setErrorMessage(const char* message) |
Mike Fiore |
1:e52ae6584f1c | 25 | { |
Mike Fiore |
1:e52ae6584f1c | 26 | _errorMessage.assign(message); |
Mike Fiore |
1:e52ae6584f1c | 27 | } |
Mike Fiore |
1:e52ae6584f1c | 28 | |
Mike Fiore |
1:e52ae6584f1c | 29 | void Command::setErrorMessage(const std::string& message) |
Mike Fiore |
1:e52ae6584f1c | 30 | { |
Mike Fiore |
1:e52ae6584f1c | 31 | _errorMessage.assign(message); |
Mike Fiore |
1:e52ae6584f1c | 32 | } |
Mike Fiore |
1:e52ae6584f1c | 33 | |
Mike Fiore |
9:ff62b20f7000 | 34 | std::string Command::usage() const |
Mike Fiore |
1:e52ae6584f1c | 35 | { |
Mike Fiore |
1:e52ae6584f1c | 36 | std::string usage(_text); |
Mike Fiore |
1:e52ae6584f1c | 37 | usage.append(": "); |
Mike Fiore |
1:e52ae6584f1c | 38 | usage.append(_usage); |
Mike Fiore |
1:e52ae6584f1c | 39 | return usage; |
Mike Fiore |
1:e52ae6584f1c | 40 | } |
Mike Fiore |
1:e52ae6584f1c | 41 | |
Mike Fiore |
9:ff62b20f7000 | 42 | bool Command::queryable() const |
Mike Fiore |
1:e52ae6584f1c | 43 | { |
Mike Fiore |
1:e52ae6584f1c | 44 | return _queryable; |
Mike Fiore |
1:e52ae6584f1c | 45 | } |
Mike Fiore |
1:e52ae6584f1c | 46 | |
Mike Fiore |
1:e52ae6584f1c | 47 | void Command::readByteArray(const std::string& input, std::vector<uint8_t>& out, size_t len) |
Mike Fiore |
1:e52ae6584f1c | 48 | { |
Mike Fiore |
1:e52ae6584f1c | 49 | // if input length is greater than expected byte output |
Mike Fiore |
1:e52ae6584f1c | 50 | // there must be a delimiter included |
Mike Fiore |
1:e52ae6584f1c | 51 | if (input.length() > len * 2) |
Mike Fiore |
1:e52ae6584f1c | 52 | { |
Mike Fiore |
1:e52ae6584f1c | 53 | std::vector < std::string > bytes; |
Mike Fiore |
1:e52ae6584f1c | 54 | if (input.find(" ") != std::string::npos) |
Mike Fiore |
1:e52ae6584f1c | 55 | bytes = mts::Text::split(input, " "); |
Mike Fiore |
1:e52ae6584f1c | 56 | else if (input.find(":") != std::string::npos) |
Mike Fiore |
1:e52ae6584f1c | 57 | bytes = mts::Text::split(input, ":"); |
Mike Fiore |
1:e52ae6584f1c | 58 | else if (input.find("-") != std::string::npos) |
Mike Fiore |
1:e52ae6584f1c | 59 | bytes = mts::Text::split(input, "-"); |
Mike Fiore |
1:e52ae6584f1c | 60 | else if (input.find(".") != std::string::npos) |
Mike Fiore |
1:e52ae6584f1c | 61 | bytes = mts::Text::split(input, "."); |
Mike Fiore |
1:e52ae6584f1c | 62 | |
Mike Fiore |
1:e52ae6584f1c | 63 | if (bytes.size() != len) { |
Mike Fiore |
1:e52ae6584f1c | 64 | return; |
Mike Fiore |
1:e52ae6584f1c | 65 | } |
Mike Fiore |
1:e52ae6584f1c | 66 | |
Mike Fiore |
9:ff62b20f7000 | 67 | int temp; |
Mike Fiore |
1:e52ae6584f1c | 68 | // Read in the key components... |
Mike Fiore |
1:e52ae6584f1c | 69 | for (size_t i = 0; i < len; i++) |
Mike Fiore |
1:e52ae6584f1c | 70 | { |
Mike Fiore |
1:e52ae6584f1c | 71 | sscanf(bytes[i].c_str(), "%02x", &temp); |
Mike Fiore |
1:e52ae6584f1c | 72 | out.push_back(temp); |
Mike Fiore |
1:e52ae6584f1c | 73 | } |
Mike Fiore |
1:e52ae6584f1c | 74 | } |
Mike Fiore |
1:e52ae6584f1c | 75 | else |
Mike Fiore |
1:e52ae6584f1c | 76 | { |
Mike Fiore |
1:e52ae6584f1c | 77 | // no delims |
Mike Fiore |
9:ff62b20f7000 | 78 | int temp; |
Mike Fiore |
1:e52ae6584f1c | 79 | |
Mike Fiore |
1:e52ae6584f1c | 80 | // Read in the key components... |
Mike Fiore |
1:e52ae6584f1c | 81 | for (size_t i = 0; i < len; i++) |
Mike Fiore |
1:e52ae6584f1c | 82 | { |
Mike Fiore |
1:e52ae6584f1c | 83 | if (i * 2 < input.size()) |
Mike Fiore |
1:e52ae6584f1c | 84 | { |
Mike Fiore |
1:e52ae6584f1c | 85 | sscanf(input.substr(i * 2).c_str(), "%02x", &temp); |
Mike Fiore |
1:e52ae6584f1c | 86 | out.push_back(temp); |
Mike Fiore |
1:e52ae6584f1c | 87 | } |
Mike Fiore |
1:e52ae6584f1c | 88 | } |
Mike Fiore |
1:e52ae6584f1c | 89 | } |
Mike Fiore |
1:e52ae6584f1c | 90 | } |
Mike Fiore |
1:e52ae6584f1c | 91 | |
Mike Fiore |
1:e52ae6584f1c | 92 | bool Command::isHexString(const std::string& str, size_t bytes) { |
Mike Fiore |
9:ff62b20f7000 | 93 | int numDelims = bytes - 1; |
Mike Fiore |
1:e52ae6584f1c | 94 | size_t minSize = bytes * 2; |
Mike Fiore |
1:e52ae6584f1c | 95 | size_t maxSize = minSize + numDelims; |
Mike Fiore |
1:e52ae6584f1c | 96 | |
Mike Fiore |
1:e52ae6584f1c | 97 | if (str.size() == minSize) { |
Mike Fiore |
1:e52ae6584f1c | 98 | return str.find_first_not_of("0123456789abcdefABCDEF") == std::string::npos; |
Mike Fiore |
1:e52ae6584f1c | 99 | } |
Mike Fiore |
1:e52ae6584f1c | 100 | else if (str.size() == maxSize) { |
Mike Fiore |
1:e52ae6584f1c | 101 | if (str.find_first_of(":-.") == std::string::npos) { |
Mike Fiore |
1:e52ae6584f1c | 102 | // no delim found |
Mike Fiore |
1:e52ae6584f1c | 103 | return false; |
Mike Fiore |
1:e52ae6584f1c | 104 | } |
Mike Fiore |
1:e52ae6584f1c | 105 | if (str.find(":") != std::string::npos && std::count(str.begin(), str.end(), ':') != numDelims) { |
Mike Fiore |
1:e52ae6584f1c | 106 | return false; |
Mike Fiore |
1:e52ae6584f1c | 107 | } |
Mike Fiore |
1:e52ae6584f1c | 108 | if (str.find(".") != std::string::npos && std::count(str.begin(), str.end(), '.') != numDelims) { |
Mike Fiore |
1:e52ae6584f1c | 109 | return false; |
Mike Fiore |
1:e52ae6584f1c | 110 | } |
Mike Fiore |
1:e52ae6584f1c | 111 | if (str.find("-") != std::string::npos && std::count(str.begin(), str.end(), '-') != numDelims) { |
Mike Fiore |
1:e52ae6584f1c | 112 | return false; |
Mike Fiore |
1:e52ae6584f1c | 113 | } |
Mike Fiore |
1:e52ae6584f1c | 114 | |
Mike Fiore |
1:e52ae6584f1c | 115 | return str.find_first_not_of("0123456789abcdefABCDEF:-.") == std::string::npos; |
Mike Fiore |
1:e52ae6584f1c | 116 | } |
Mike Fiore |
1:e52ae6584f1c | 117 | |
Mike Fiore |
1:e52ae6584f1c | 118 | return false; |
Mike Fiore |
1:e52ae6584f1c | 119 | } |
Mike Fiore |
1:e52ae6584f1c | 120 | |
Mike Fiore |
1:e52ae6584f1c | 121 | bool Command::verify(std::vector<std::string> args) { |
Mike Fiore |
1:e52ae6584f1c | 122 | if (args.size() == 1) |
Mike Fiore |
1:e52ae6584f1c | 123 | return true; |
Mike Fiore |
1:e52ae6584f1c | 124 | |
Mike Fiore |
1:e52ae6584f1c | 125 | setErrorMessage("Invalid arguments"); |
Mike Fiore |
1:e52ae6584f1c | 126 | return false; |
Mike Fiore |
1:e52ae6584f1c | 127 | } |
Mike Fiore |
1:e52ae6584f1c | 128 |