Elmo Terminal provides functionality to test Lora radio and access SX1272 chip registers delivered with Elmo board. Also contains example ping-pong application.
Dependencies: SX1272lib mbed-src
Terminal.cpp@2:8d8295a51f68, 2015-10-01 (annotated)
- Committer:
- WGorniak
- Date:
- Thu Oct 01 09:40:30 2015 +0200
- Revision:
- 2:8d8295a51f68
added terminal app
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 | 2:8d8295a51f68 | 64 | serial_->printf(".\r"); |
WGorniak | 2:8d8295a51f68 | 65 | } |
WGorniak | 2:8d8295a51f68 | 66 | } |
WGorniak | 2:8d8295a51f68 | 67 | |
WGorniak | 2:8d8295a51f68 | 68 | void Terminal::start(void) |
WGorniak | 2:8d8295a51f68 | 69 | { |
WGorniak | 2:8d8295a51f68 | 70 | DigitalOut led1(LED1); |
WGorniak | 2:8d8295a51f68 | 71 | string rxBuffer; |
WGorniak | 2:8d8295a51f68 | 72 | |
WGorniak | 2:8d8295a51f68 | 73 | while(1) |
WGorniak | 2:8d8295a51f68 | 74 | { |
WGorniak | 2:8d8295a51f68 | 75 | if(serial_->readable()) |
WGorniak | 2:8d8295a51f68 | 76 | { |
WGorniak | 2:8d8295a51f68 | 77 | char c = serial_->getc(); |
WGorniak | 2:8d8295a51f68 | 78 | serial_->printf("%c", c); |
WGorniak | 2:8d8295a51f68 | 79 | |
WGorniak | 2:8d8295a51f68 | 80 | if (c==127) // backspace sends del ? |
WGorniak | 2:8d8295a51f68 | 81 | { |
WGorniak | 2:8d8295a51f68 | 82 | rxBuffer.resize(rxBuffer.size() > 0 ? (rxBuffer.size()-1) : 0); |
WGorniak | 2:8d8295a51f68 | 83 | } else |
WGorniak | 2:8d8295a51f68 | 84 | { |
WGorniak | 2:8d8295a51f68 | 85 | rxBuffer += c; |
WGorniak | 2:8d8295a51f68 | 86 | } |
WGorniak | 2:8d8295a51f68 | 87 | } |
WGorniak | 2:8d8295a51f68 | 88 | |
WGorniak | 2:8d8295a51f68 | 89 | if(rxBuffer.find("\r") != std::string::npos) |
WGorniak | 2:8d8295a51f68 | 90 | { |
WGorniak | 2:8d8295a51f68 | 91 | serial_->printf("\r\n"); |
WGorniak | 2:8d8295a51f68 | 92 | // omit string that contains only '\r' char |
WGorniak | 2:8d8295a51f68 | 93 | if(1 != rxBuffer.length()) |
WGorniak | 2:8d8295a51f68 | 94 | { |
WGorniak | 2:8d8295a51f68 | 95 | // remove carriage return char |
WGorniak | 2:8d8295a51f68 | 96 | rxBuffer = rxBuffer.substr(0, rxBuffer.length() - 1); |
WGorniak | 2:8d8295a51f68 | 97 | executeCmd(rxBuffer); |
WGorniak | 2:8d8295a51f68 | 98 | } |
WGorniak | 2:8d8295a51f68 | 99 | rxBuffer.clear(); |
WGorniak | 2:8d8295a51f68 | 100 | } |
WGorniak | 2:8d8295a51f68 | 101 | |
WGorniak | 2:8d8295a51f68 | 102 | if (buttonStart_) |
WGorniak | 2:8d8295a51f68 | 103 | { |
WGorniak | 2:8d8295a51f68 | 104 | executeCmd("pp"); |
WGorniak | 2:8d8295a51f68 | 105 | } |
WGorniak | 2:8d8295a51f68 | 106 | |
WGorniak | 2:8d8295a51f68 | 107 | led1 = !led1; |
WGorniak | 2:8d8295a51f68 | 108 | //wait(0.5); |
WGorniak | 2:8d8295a51f68 | 109 | } |
WGorniak | 2:8d8295a51f68 | 110 | } |
WGorniak | 2:8d8295a51f68 | 111 | |
WGorniak | 2:8d8295a51f68 | 112 | list<string> Terminal::tokenize(const string& str, const string& delimiters) |
WGorniak | 2:8d8295a51f68 | 113 | { |
WGorniak | 2:8d8295a51f68 | 114 | list<string> tokens; |
WGorniak | 2:8d8295a51f68 | 115 | |
WGorniak | 2:8d8295a51f68 | 116 | // Skip delimiters at beginning. |
WGorniak | 2:8d8295a51f68 | 117 | string::size_type startPos = str.find_first_not_of(delimiters, 0); |
WGorniak | 2:8d8295a51f68 | 118 | //serial_->printf("\n lastpos = %i\r\n", lastPos); |
WGorniak | 2:8d8295a51f68 | 119 | // Find first "delimiter". |
WGorniak | 2:8d8295a51f68 | 120 | string::size_type pos = str.find_first_of(delimiters, startPos); |
WGorniak | 2:8d8295a51f68 | 121 | //serial_->printf("\n pos = %i\r\n", pos); |
WGorniak | 2:8d8295a51f68 | 122 | |
WGorniak | 2:8d8295a51f68 | 123 | while (string::npos != pos || string::npos != startPos) |
WGorniak | 2:8d8295a51f68 | 124 | { |
WGorniak | 2:8d8295a51f68 | 125 | // Found a token, add it to the vector. |
WGorniak | 2:8d8295a51f68 | 126 | tokens.push_back(str.substr(startPos, pos - startPos)); |
WGorniak | 2:8d8295a51f68 | 127 | // Skip delimiters. Note the "not_of" |
WGorniak | 2:8d8295a51f68 | 128 | startPos = str.find_first_not_of(delimiters, pos); |
WGorniak | 2:8d8295a51f68 | 129 | // Find next "non-delimiter" |
WGorniak | 2:8d8295a51f68 | 130 | pos = str.find_first_of(delimiters, startPos); |
WGorniak | 2:8d8295a51f68 | 131 | } |
WGorniak | 2:8d8295a51f68 | 132 | return tokens; |
WGorniak | 2:8d8295a51f68 | 133 | } |