Elmo Terminal provides functionality to test Lora radio and access SX1272 chip registers delivered with Elmo board. This firmware allows the user to control the LoRa radio parameters (eg. frequency, bandwidth, spreading factor etc.) by entering console commands via serial terminal. Application also contains "Ping-Pong" and data transmission functionalities.
Fork of Elmo-Terminal by
Terminal.cpp@12:26045241f50f, 2015-10-22 (annotated)
- Committer:
- WGorniak
- Date:
- Thu Oct 22 08:03:32 2015 +0000
- Revision:
- 12:26045241f50f
- Parent:
- 9:ba094ace2376
updated sx lib
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
WGorniak | 2:8d8295a51f68 | 1 | #include "Terminal.h" |
WGorniak | 2:8d8295a51f68 | 2 | #include "Cmd.h" |
WGorniak | 2:8d8295a51f68 | 3 | |
WGorniak | 2:8d8295a51f68 | 4 | Terminal::Terminal(Settings* settings, Serial *serial, InterruptIn* pinStart) |
WGorniak | 2:8d8295a51f68 | 5 | : settings_(settings), serial_(serial), pinStart_(pinStart), buttonStart_(false) |
WGorniak | 2:8d8295a51f68 | 6 | { |
WGorniak | 2:8d8295a51f68 | 7 | cmdFactory_ = new CmdFactory(settings_, serial_); |
WGorniak | 2:8d8295a51f68 | 8 | |
WGorniak | 2:8d8295a51f68 | 9 | if (NULL != pinStart_) |
WGorniak | 2:8d8295a51f68 | 10 | { |
WGorniak | 2:8d8295a51f68 | 11 | pinStart_->rise(this, &Terminal::buttonPressed); |
WGorniak | 2:8d8295a51f68 | 12 | pinStart_->enable_irq(); |
WGorniak | 2:8d8295a51f68 | 13 | } |
WGorniak | 2:8d8295a51f68 | 14 | } |
WGorniak | 2:8d8295a51f68 | 15 | |
WGorniak | 2:8d8295a51f68 | 16 | Terminal::~Terminal() |
WGorniak | 2:8d8295a51f68 | 17 | { |
WGorniak | 2:8d8295a51f68 | 18 | if (NULL != pinStart_) |
WGorniak | 2:8d8295a51f68 | 19 | { |
WGorniak | 2:8d8295a51f68 | 20 | pinStart_->disable_irq(); |
WGorniak | 2:8d8295a51f68 | 21 | } |
WGorniak | 2:8d8295a51f68 | 22 | delete cmdFactory_; |
WGorniak | 2:8d8295a51f68 | 23 | } |
WGorniak | 2:8d8295a51f68 | 24 | |
WGorniak | 2:8d8295a51f68 | 25 | void Terminal::buttonPressed() |
WGorniak | 2:8d8295a51f68 | 26 | { |
WGorniak | 2:8d8295a51f68 | 27 | buttonStart_ = true; |
WGorniak | 2:8d8295a51f68 | 28 | } |
WGorniak | 2:8d8295a51f68 | 29 | |
WGorniak | 2:8d8295a51f68 | 30 | |
WGorniak | 2:8d8295a51f68 | 31 | void Terminal::executeCmd(string rxBuffer) |
WGorniak | 2:8d8295a51f68 | 32 | { |
WGorniak | 2:8d8295a51f68 | 33 | list<string> tokens = tokenize(rxBuffer); |
WGorniak | 2:8d8295a51f68 | 34 | |
WGorniak | 2:8d8295a51f68 | 35 | const bool single = (tokens.front() == "s"); |
WGorniak | 2:8d8295a51f68 | 36 | if (single) |
WGorniak | 2:8d8295a51f68 | 37 | { |
WGorniak | 2:8d8295a51f68 | 38 | tokens.pop_front(); |
WGorniak | 2:8d8295a51f68 | 39 | } |
WGorniak | 2:8d8295a51f68 | 40 | |
WGorniak | 2:8d8295a51f68 | 41 | Cmd* cmd = NULL; |
WGorniak | 2:8d8295a51f68 | 42 | |
WGorniak | 2:8d8295a51f68 | 43 | if (!tokens.empty()) |
WGorniak | 2:8d8295a51f68 | 44 | { |
WGorniak | 2:8d8295a51f68 | 45 | cmd = cmdFactory_->createCmd(tokens.front()); |
WGorniak | 2:8d8295a51f68 | 46 | tokens.pop_front(); |
WGorniak | 2:8d8295a51f68 | 47 | } |
WGorniak | 2:8d8295a51f68 | 48 | |
WGorniak | 2:8d8295a51f68 | 49 | if(NULL != cmd) |
WGorniak | 2:8d8295a51f68 | 50 | { |
WGorniak | 2:8d8295a51f68 | 51 | //serial_->printf("\n odpowiedz %s\r\n", cmd->getResponse().c_str()); |
WGorniak | 2:8d8295a51f68 | 52 | |
WGorniak | 2:8d8295a51f68 | 53 | cmd->execute(tokens); |
WGorniak | 2:8d8295a51f68 | 54 | |
WGorniak | 2:8d8295a51f68 | 55 | uint32_t uiPrompt = 0; |
WGorniak | 2:8d8295a51f68 | 56 | |
WGorniak | 2:8d8295a51f68 | 57 | buttonStart_ = false; |
WGorniak | 2:8d8295a51f68 | 58 | while((!(cmd->process())) && !buttonStart_ && !single && (!(serial_->readable()))) |
WGorniak | 2:8d8295a51f68 | 59 | { |
WGorniak | 2:8d8295a51f68 | 60 | serial_->printf("%c\r", "/|\\-"[uiPrompt++ & 3]); |
WGorniak | 2:8d8295a51f68 | 61 | } |
WGorniak | 2:8d8295a51f68 | 62 | |
WGorniak | 2:8d8295a51f68 | 63 | delete cmd; |
WGorniak | 9:ba094ace2376 | 64 | pinStart_->enable_irq(); |
WGorniak | 2:8d8295a51f68 | 65 | serial_->printf(".\r"); |
WGorniak | 2:8d8295a51f68 | 66 | } |
WGorniak | 2:8d8295a51f68 | 67 | } |
WGorniak | 2:8d8295a51f68 | 68 | |
WGorniak | 2:8d8295a51f68 | 69 | void Terminal::start(void) |
WGorniak | 2:8d8295a51f68 | 70 | { |
WGorniak | 2:8d8295a51f68 | 71 | DigitalOut led1(LED1); |
WGorniak | 2:8d8295a51f68 | 72 | string rxBuffer; |
WGorniak | 2:8d8295a51f68 | 73 | |
WGorniak | 2:8d8295a51f68 | 74 | while(1) |
WGorniak | 2:8d8295a51f68 | 75 | { |
WGorniak | 2:8d8295a51f68 | 76 | if(serial_->readable()) |
WGorniak | 2:8d8295a51f68 | 77 | { |
WGorniak | 2:8d8295a51f68 | 78 | char c = serial_->getc(); |
WGorniak | 2:8d8295a51f68 | 79 | serial_->printf("%c", c); |
WGorniak | 2:8d8295a51f68 | 80 | |
WGorniak | 2:8d8295a51f68 | 81 | if (c==127) // backspace sends del ? |
WGorniak | 2:8d8295a51f68 | 82 | { |
WGorniak | 2:8d8295a51f68 | 83 | rxBuffer.resize(rxBuffer.size() > 0 ? (rxBuffer.size()-1) : 0); |
WGorniak | 2:8d8295a51f68 | 84 | } else |
WGorniak | 2:8d8295a51f68 | 85 | { |
WGorniak | 2:8d8295a51f68 | 86 | rxBuffer += c; |
WGorniak | 2:8d8295a51f68 | 87 | } |
WGorniak | 2:8d8295a51f68 | 88 | } |
WGorniak | 2:8d8295a51f68 | 89 | |
WGorniak | 2:8d8295a51f68 | 90 | if(rxBuffer.find("\r") != std::string::npos) |
WGorniak | 2:8d8295a51f68 | 91 | { |
WGorniak | 2:8d8295a51f68 | 92 | serial_->printf("\r\n"); |
WGorniak | 2:8d8295a51f68 | 93 | // omit string that contains only '\r' char |
WGorniak | 2:8d8295a51f68 | 94 | if(1 != rxBuffer.length()) |
WGorniak | 2:8d8295a51f68 | 95 | { |
WGorniak | 2:8d8295a51f68 | 96 | // remove carriage return char |
WGorniak | 2:8d8295a51f68 | 97 | rxBuffer = rxBuffer.substr(0, rxBuffer.length() - 1); |
WGorniak | 2:8d8295a51f68 | 98 | executeCmd(rxBuffer); |
WGorniak | 2:8d8295a51f68 | 99 | } |
WGorniak | 2:8d8295a51f68 | 100 | rxBuffer.clear(); |
WGorniak | 2:8d8295a51f68 | 101 | } |
WGorniak | 2:8d8295a51f68 | 102 | |
WGorniak | 2:8d8295a51f68 | 103 | if (buttonStart_) |
WGorniak | 2:8d8295a51f68 | 104 | { |
WGorniak | 2:8d8295a51f68 | 105 | executeCmd("pp"); |
WGorniak | 2:8d8295a51f68 | 106 | } |
WGorniak | 2:8d8295a51f68 | 107 | |
WGorniak | 2:8d8295a51f68 | 108 | led1 = !led1; |
WGorniak | 2:8d8295a51f68 | 109 | //wait(0.5); |
WGorniak | 2:8d8295a51f68 | 110 | } |
WGorniak | 2:8d8295a51f68 | 111 | } |
WGorniak | 2:8d8295a51f68 | 112 | |
WGorniak | 2:8d8295a51f68 | 113 | list<string> Terminal::tokenize(const string& str, const string& delimiters) |
WGorniak | 2:8d8295a51f68 | 114 | { |
WGorniak | 2:8d8295a51f68 | 115 | list<string> tokens; |
WGorniak | 2:8d8295a51f68 | 116 | |
WGorniak | 2:8d8295a51f68 | 117 | // Skip delimiters at beginning. |
WGorniak | 2:8d8295a51f68 | 118 | string::size_type startPos = str.find_first_not_of(delimiters, 0); |
WGorniak | 2:8d8295a51f68 | 119 | //serial_->printf("\n lastpos = %i\r\n", lastPos); |
WGorniak | 2:8d8295a51f68 | 120 | // Find first "delimiter". |
WGorniak | 2:8d8295a51f68 | 121 | string::size_type pos = str.find_first_of(delimiters, startPos); |
WGorniak | 2:8d8295a51f68 | 122 | //serial_->printf("\n pos = %i\r\n", pos); |
WGorniak | 2:8d8295a51f68 | 123 | |
WGorniak | 2:8d8295a51f68 | 124 | while (string::npos != pos || string::npos != startPos) |
WGorniak | 2:8d8295a51f68 | 125 | { |
WGorniak | 2:8d8295a51f68 | 126 | // Found a token, add it to the vector. |
WGorniak | 2:8d8295a51f68 | 127 | tokens.push_back(str.substr(startPos, pos - startPos)); |
WGorniak | 2:8d8295a51f68 | 128 | // Skip delimiters. Note the "not_of" |
WGorniak | 2:8d8295a51f68 | 129 | startPos = str.find_first_not_of(delimiters, pos); |
WGorniak | 2:8d8295a51f68 | 130 | // Find next "non-delimiter" |
WGorniak | 2:8d8295a51f68 | 131 | pos = str.find_first_of(delimiters, startPos); |
WGorniak | 2:8d8295a51f68 | 132 | } |
WGorniak | 2:8d8295a51f68 | 133 | return tokens; |
WGorniak | 2:8d8295a51f68 | 134 | } |