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
- Committer:
- WGorniak
- Date:
- 2015-10-01
- Revision:
- 6:453b018a9ba0
- Parent:
- 2:8d8295a51f68
File content as of revision 6:453b018a9ba0:
#include "Terminal.h" #include "Cmd.h" Terminal::Terminal(Settings* settings, Serial *serial, InterruptIn* pinStart) : settings_(settings), serial_(serial), pinStart_(pinStart), buttonStart_(false) { cmdFactory_ = new CmdFactory(settings_, serial_); if (NULL != pinStart_) { pinStart_->rise(this, &Terminal::buttonPressed); pinStart_->enable_irq(); } } Terminal::~Terminal() { if (NULL != pinStart_) { pinStart_->disable_irq(); } delete cmdFactory_; } void Terminal::buttonPressed() { buttonStart_ = true; } void Terminal::executeCmd(string rxBuffer) { list<string> tokens = tokenize(rxBuffer); const bool single = (tokens.front() == "s"); if (single) { tokens.pop_front(); } Cmd* cmd = NULL; if (!tokens.empty()) { cmd = cmdFactory_->createCmd(tokens.front()); tokens.pop_front(); } if(NULL != cmd) { //serial_->printf("\n odpowiedz %s\r\n", cmd->getResponse().c_str()); cmd->execute(tokens); uint32_t uiPrompt = 0; buttonStart_ = false; while((!(cmd->process())) && !buttonStart_ && !single && (!(serial_->readable()))) { serial_->printf("%c\r", "/|\\-"[uiPrompt++ & 3]); } delete cmd; serial_->printf(".\r"); } } void Terminal::start(void) { DigitalOut led1(LED1); string rxBuffer; while(1) { if(serial_->readable()) { char c = serial_->getc(); serial_->printf("%c", c); if (c==127) // backspace sends del ? { rxBuffer.resize(rxBuffer.size() > 0 ? (rxBuffer.size()-1) : 0); } else { rxBuffer += c; } } if(rxBuffer.find("\r") != std::string::npos) { serial_->printf("\r\n"); // omit string that contains only '\r' char if(1 != rxBuffer.length()) { // remove carriage return char rxBuffer = rxBuffer.substr(0, rxBuffer.length() - 1); executeCmd(rxBuffer); } rxBuffer.clear(); } if (buttonStart_) { executeCmd("pp"); } led1 = !led1; //wait(0.5); } } list<string> Terminal::tokenize(const string& str, const string& delimiters) { list<string> tokens; // Skip delimiters at beginning. string::size_type startPos = str.find_first_not_of(delimiters, 0); //serial_->printf("\n lastpos = %i\r\n", lastPos); // Find first "delimiter". string::size_type pos = str.find_first_of(delimiters, startPos); //serial_->printf("\n pos = %i\r\n", pos); while (string::npos != pos || string::npos != startPos) { // Found a token, add it to the vector. tokens.push_back(str.substr(startPos, pos - startPos)); // Skip delimiters. Note the "not_of" startPos = str.find_first_not_of(delimiters, pos); // Find next "non-delimiter" pos = str.find_first_of(delimiters, startPos); } return tokens; }