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

Committer:
WGorniak
Date:
Thu Oct 01 13:13:08 2015 +0000
Revision:
6:453b018a9ba0
Parent:
2:8d8295a51f68
removed sstream from radiocontext

Who changed what in which revision?

UserRevisionLine numberNew 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 }