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.

Dependencies:   SX1272lib mbed

Fork of Elmo-Terminal by Michal Leksinski

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?

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