By connecting to the "ACM" port exposed on the USB of the STM32 (used as a service and connected to a PC) it is possible to send alphanumeric command (eg with "minicom") in order to perform: -Digital Output. -Switched pulse. -Digittal Input. -Analogic Input. -Request of a brief (returned by the serial line): 'H' or '?'. Note that all the commands can be given on a single string and it will be executed readily just at the instant each one is completely received.

Dependencies:   regex mbed

Committer:
lsola
Date:
Wed Jan 17 07:35:05 2018 +0000
Revision:
3:a425b8b0a4c2
Parent:
1:cae05f3e5d56
Come mistakes fixed in header comments.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lsola 0:2c26b4ba7cf3 1 /**
lsola 0:2c26b4ba7cf3 2 * Funzionalità Esposte
lsola 0:2c26b4ba7cf3 3 * Collegandosi alla porta "ACM" esposta sulla USB dell'STM32 (adibita a servizio e collegata p.e. ad un PC) è possibile inviare i
lsola 0:2c26b4ba7cf3 4 * seguenti comandi in formato testo (es. con minicom).
lsola 0:2c26b4ba7cf3 5 * -DigitalOutput: comando 'DO P<portName [B-G]> *<pinNumber [0-15]> <value [01]>;'.
lsola 0:2c26b4ba7cf3 6 * -Switch impulsivo: comango 'DP P<portName> *<pinNumber [0-15]> <time>;'.
lsola 0:2c26b4ba7cf3 7 * Dal momento in cui viene chiamata l'uscita specificata viene negata fino allo scadere del tempo specificato.
lsola 0:2c26b4ba7cf3 8 * Notare che può essere chiamata in modo rientrante e a raffica: l'effetto è esattamente quello programmato: vengono
lsola 0:2c26b4ba7cf3 9 * istanziati tanti "Timeout" ogni richiesta e disallocati dopo lo scadere del proprio tempo.
lsola 0:2c26b4ba7cf3 10 * -Digit al Input: comando 'DI P<portName> *<pinNumber [0-15]>;'. Ritorna '[01];' in base al livello di tensione
lsola 0:2c26b4ba7cf3 11 * presente sul pin specificato (0 o 1).
lsola 0:2c26b4ba7cf3 12 * -Analogic Input: comando 'AI <analogic input name (at the moment only [ADC_TEMP, ADC_VREF, ADC_VBAT])>;'
lsola 0:2c26b4ba7cf3 13 * Dove <time> è un valore float con precisione massima di 10^-3 Sec (es.: 0.00x è valildo, 0.000x non è valido).
lsola 0:2c26b4ba7cf3 14 * Risposta: 'OK;' per ogni comando corretto, '<ERROR <wrong sequence> [(Port=<portName>, Pin=<pinNumber>)][analogic input name])\n\r'
lsola 0:2c26b4ba7cf3 15 * in ogni altro caso.
lsola 1:cae05f3e5d56 16 * Risposta: 'OK;' per ogni comando corretto, suggerimento come risposta a 'H' o '?', 'ERROR <wrong sequence> [(Port=<portName>, Pin=<pinNumber>)][<analogic input name>])\n\r'
lsola 0:2c26b4ba7cf3 17 * in ogni altro caso.
lsola 0:2c26b4ba7cf3 18 * N.B.: i comandi sono riportati facendo uso della seguente serie di espansioni:
lsola 1:cae05f3e5d56 19 * <s> per indicare un valore numerico o alfanumerico con significato 's'; [x-y] per indicare una range di interi da 'x' a 'y';
lsola 0:2c26b4ba7cf3 20 * [a,b,c,....] per indicare una serie di possibili stringhe (alfanumeriche) 'a', 'b', 'c',...; * e + come nelle standard re.
lsola 0:2c26b4ba7cf3 21 *
lsola 0:2c26b4ba7cf3 22 * Exposed functionality
lsola 0:2c26b4ba7cf3 23 * By connecting to the "ACM" port exposed on the USB of the STM32 (used as a service and connected to a PC) it is possible to send the
lsola 1:cae05f3e5d56 24 * following commands in text format (eg. with "minicom").
lsola 1:cae05f3e5d56 25 * -Digital Output: command 'DO P<portName [B-G]> *<pinNumber [0-15]> <value [01]>;'.
lsola 3:a425b8b0a4c2 26 * -Digital Pulse: command 'DP P<portName> *<pinNumber [0-15]> <time>;'.
lsola 1:cae05f3e5d56 27 * Where <time> is a float value with a maximum accuracy of 10 ^ -3 Sec (eg: 0.00x is valildo, 0.000x is not valid). *
lsola 3:a425b8b0a4c2 28 * From the moment the specified comand is given, the corresponding digital output is swhitched until the specified time expires.
lsola 1:cae05f3e5d56 29 * Note that it can be called reentrant and burst: the effect is exactly the one programmed: many "Timeouts" are instantiated every request and disallowed
lsola 0:2c26b4ba7cf3 30 * after the expiration of its time.
lsola 1:cae05f3e5d56 31 * -Digital Input: command 'DI P<portName> *<pinNumber [0-15]>;'. Return '[01];' according to the voltage level present on the specified pin (0 or 1).
lsola 0:2c26b4ba7cf3 32 * -Analogic Input: command 'AI <analogic input name (at the moment only [ADC_TEMP, ADC_VREF, ADC_VBAT])>;'
lsola 1:cae05f3e5d56 33 * -Request of a brief: 'H' or '?'.
lsola 1:cae05f3e5d56 34 * Answer: 'OK;' for each correct command, command bried for brief request, 'ERROR <wrong sequence> [(Port = <portName>, Pin = <pinNumber>)] [<analogic input name>])\n\r' in any other case.
lsola 1:cae05f3e5d56 35 * N.B .: commands are shown using the following series of expansions:
lsola 0:2c26b4ba7cf3 36 * <s> to indicate a numeric or alphanumeric value with meaning 's'; [x-y] to indicate a range of integers from 'x' to 'y';
lsola 1:cae05f3e5d56 37 * [a, b, c, ....] to indicate a series of possible strings (alphanumeric) 'a', 'b', 'c', ...; * and + as in Standards RE.
lsola 0:2c26b4ba7cf3 38 *
lsola 0:2c26b4ba7cf3 39 * @author Lorenzo Sola
lsola 0:2c26b4ba7cf3 40 * @date 18/12/2017
lsola 0:2c26b4ba7cf3 41 * @email lorenzo.sola@alice.it
lsola 0:2c26b4ba7cf3 42 */
lsola 0:2c26b4ba7cf3 43
lsola 0:2c26b4ba7cf3 44 #define COMMAND_LIST_HELP "- \"DO P<portName [B-G]> *<pinNumber [0-15]> <value [01]>;\"\n\r- \"DP P<portName> *<pinNumber [0-15]> <time>;\"\n\r- \"DI P<portName> *<pinNumber [0-15]>;\"\n\r- \"AI <analogic input name (at the moment only [ADC_TEMP, ADC_VREF, ADC_VBAT])>;\"\n\r- \"H\" or \"?\" : print this help string on serial line.\n\r"
lsola 0:2c26b4ba7cf3 45
lsola 0:2c26b4ba7cf3 46 #include "mbed.h"
lsola 0:2c26b4ba7cf3 47 #include "USBSerial.h"
lsola 0:2c26b4ba7cf3 48 // #include <regex.h>
lsola 0:2c26b4ba7cf3 49 // #include <errno.h>
lsola 0:2c26b4ba7cf3 50 #include <string>
lsola 0:2c26b4ba7cf3 51 #include <unordered_map>
lsola 0:2c26b4ba7cf3 52 #include <list>
lsola 0:2c26b4ba7cf3 53
lsola 0:2c26b4ba7cf3 54 //Virtual serial port over USB
lsola 0:2c26b4ba7cf3 55 USBSerial* serial;
lsola 0:2c26b4ba7cf3 56
lsola 0:2c26b4ba7cf3 57 #define CMD_BUFF_LENGTH 16
lsola 0:2c26b4ba7cf3 58 #define CHAR_BUFF_LENGTH 10
lsola 0:2c26b4ba7cf3 59 #define OUT_BUFF_LEN 50
lsola 0:2c26b4ba7cf3 60 #define NO_DATA_ACTION_TIME 4000 //(in ms)
lsola 0:2c26b4ba7cf3 61
lsola 0:2c26b4ba7cf3 62 char cmdBuff[CMD_BUFF_LENGTH];
lsola 0:2c26b4ba7cf3 63 int cmdBuffIdx;
lsola 0:2c26b4ba7cf3 64 char portName; //(A,B,C,....)
lsola 0:2c26b4ba7cf3 65 char adcInPinName[CHAR_BUFF_LENGTH];
lsola 0:2c26b4ba7cf3 66 int pinNumber;
lsola 0:2c26b4ba7cf3 67 int dValue;
lsola 0:2c26b4ba7cf3 68 float tValue;
lsola 0:2c26b4ba7cf3 69 char dataBuff[CHAR_BUFF_LENGTH];
lsola 0:2c26b4ba7cf3 70 int dataBuffIdx;
lsola 0:2c26b4ba7cf3 71 char outBuff[OUT_BUFF_LEN];
lsola 0:2c26b4ba7cf3 72 char c;
lsola 0:2c26b4ba7cf3 73 int tmpInt;
lsola 0:2c26b4ba7cf3 74 enum states {q0, D, DO, DP, DI, OP_, Port, Pin, DValue, OP_OK, TValue, A, AI, analogInName, H} state = q0;
lsola 0:2c26b4ba7cf3 75 enum operations {none, readPort, writePort, pulse, adcIn} operation = none;
lsola 0:2c26b4ba7cf3 76 typedef unordered_map<std::string, PortOut> PortOutMap;
lsola 0:2c26b4ba7cf3 77 typedef unordered_map<std::string, PortIn> PortInMap;
lsola 0:2c26b4ba7cf3 78 typedef unordered_map<std::string, AnalogIn> AnalogInMap;
lsola 0:2c26b4ba7cf3 79
lsola 0:2c26b4ba7cf3 80 void flushSerial()
lsola 0:2c26b4ba7cf3 81 {
lsola 0:2c26b4ba7cf3 82 wait_ms(10);
lsola 0:2c26b4ba7cf3 83 int i;
lsola 0:2c26b4ba7cf3 84 do {
lsola 0:2c26b4ba7cf3 85 i = serial->available();
lsola 0:2c26b4ba7cf3 86 while (--i >= 0) {
lsola 0:2c26b4ba7cf3 87 serial->_getc();
lsola 0:2c26b4ba7cf3 88 }
lsola 0:2c26b4ba7cf3 89 } while (i > 0);
lsola 0:2c26b4ba7cf3 90 }
lsola 0:2c26b4ba7cf3 91
lsola 0:2c26b4ba7cf3 92 void writeLongStringOnSerial(const char* str)
lsola 0:2c26b4ba7cf3 93 {
lsola 0:2c26b4ba7cf3 94 char* end = (char*)str + strlen(str);
lsola 0:2c26b4ba7cf3 95 int nWrite = 0;
lsola 0:2c26b4ba7cf3 96 while(str < end) {
lsola 0:2c26b4ba7cf3 97 if(serial->writeable()) {
lsola 0:2c26b4ba7cf3 98 nWrite = end - str;
lsola 0:2c26b4ba7cf3 99 if(nWrite > 16) nWrite = 16;
lsola 0:2c26b4ba7cf3 100 serial->writeBlock((uint8_t*) str, nWrite);
lsola 0:2c26b4ba7cf3 101 str += nWrite;
lsola 0:2c26b4ba7cf3 102 } else {
lsola 0:2c26b4ba7cf3 103 wait_ms(10);
lsola 0:2c26b4ba7cf3 104 }
lsola 0:2c26b4ba7cf3 105 }
lsola 0:2c26b4ba7cf3 106 }
lsola 0:2c26b4ba7cf3 107
lsola 0:2c26b4ba7cf3 108 class Flipper
lsola 0:2c26b4ba7cf3 109 {
lsola 0:2c26b4ba7cf3 110 private:
lsola 0:2c26b4ba7cf3 111 PortOut port;
lsola 0:2c26b4ba7cf3 112 int pin;
lsola 0:2c26b4ba7cf3 113 bool running;
lsola 0:2c26b4ba7cf3 114 Timeout timeout;
lsola 0:2c26b4ba7cf3 115 int inState;
lsola 0:2c26b4ba7cf3 116 public:
lsola 0:2c26b4ba7cf3 117 Flipper(PortOut portOut, int pinNumber) : port(portOut), pin(pinNumber), running(0) {
lsola 0:2c26b4ba7cf3 118 }
lsola 0:2c26b4ba7cf3 119 void flipPin() {
lsola 0:2c26b4ba7cf3 120 inState = port.read();
lsola 0:2c26b4ba7cf3 121 inState ^= (1 << pin);
lsola 0:2c26b4ba7cf3 122 port.write(inState);
lsola 0:2c26b4ba7cf3 123 running = 0;
lsola 0:2c26b4ba7cf3 124 return;
lsola 0:2c26b4ba7cf3 125 }
lsola 0:2c26b4ba7cf3 126 void start(float time) {
lsola 0:2c26b4ba7cf3 127 flipPin();
lsola 0:2c26b4ba7cf3 128 running = 1;
lsola 0:2c26b4ba7cf3 129 timeout.attach(callback(this, &Flipper::flipPin), time);
lsola 0:2c26b4ba7cf3 130 return;
lsola 0:2c26b4ba7cf3 131 }
lsola 0:2c26b4ba7cf3 132 bool getRunning() {
lsola 0:2c26b4ba7cf3 133 return running;
lsola 0:2c26b4ba7cf3 134 }
lsola 0:2c26b4ba7cf3 135 };
lsola 0:2c26b4ba7cf3 136 typedef list<Flipper*> FlipperList;
lsola 0:2c26b4ba7cf3 137 FlipperList flipperList;
lsola 0:2c26b4ba7cf3 138
lsola 0:2c26b4ba7cf3 139 /**
lsola 0:2c26b4ba7cf3 140 * Pulizia di 1 BitFlipper scaduto tra quelli presenti in flipperList.
lsola 0:2c26b4ba7cf3 141 * @return true: 1 BitFlipper eliminato dalla lista; false: nessun BitFlipper scaduto presente in lista.
lsola 0:2c26b4ba7cf3 142 */
lsola 0:2c26b4ba7cf3 143 inline void DropExpiredBitFlipper()
lsola 0:2c26b4ba7cf3 144 {
lsola 0:2c26b4ba7cf3 145 //Pulizia BitFlipper con timer scaduto.
lsola 0:2c26b4ba7cf3 146 FlipperList::iterator fvI = flipperList.begin();
lsola 0:2c26b4ba7cf3 147 // if(fvI == flipperList.end()) serial->writeBlock((uint8_t*)"None BitFLipper in vector.\n\r", 28);
lsola 0:2c26b4ba7cf3 148 //Il ciclo deve essere interrotto ad ogni cancellazione perchè la posizione dopo una cancellazione non è più valida e prima o poi l'informazione posizionale dell'iteratore arriva ad elementi cancellati.
lsola 0:2c26b4ba7cf3 149 while(fvI != flipperList.end()) {
lsola 0:2c26b4ba7cf3 150 if(! (*fvI)->getRunning()) {
lsola 0:2c26b4ba7cf3 151 // serial->writeBlock((uint8_t*)"Erasing BitFlipper.\n\r", 21);
lsola 0:2c26b4ba7cf3 152 delete *fvI; //Non so perchè ma questa fa vatta per forza prima di quella dopo altrimenti crasha.
lsola 0:2c26b4ba7cf3 153 flipperList.erase(fvI);
lsola 0:2c26b4ba7cf3 154 // serial->writeBlock((uint8_t*)"BitFlipper Erased.\n\r", 20);
lsola 0:2c26b4ba7cf3 155 return;
lsola 0:2c26b4ba7cf3 156 }
lsola 0:2c26b4ba7cf3 157 fvI++;
lsola 0:2c26b4ba7cf3 158 }
lsola 0:2c26b4ba7cf3 159 return;
lsola 0:2c26b4ba7cf3 160 }
lsola 0:2c26b4ba7cf3 161
lsola 0:2c26b4ba7cf3 162 void writeErrorMessage()
lsola 0:2c26b4ba7cf3 163 {
lsola 0:2c26b4ba7cf3 164 string errorString("\r\nERROR: \"");
lsola 0:2c26b4ba7cf3 165 errorString += cmdBuff;
lsola 0:2c26b4ba7cf3 166 //Per comporre il messaggio utlizzo appositamente uno string per stressare appena la CPU (praticamente di niente).
lsola 0:2c26b4ba7cf3 167 switch(operation) {
lsola 0:2c26b4ba7cf3 168 case readPort:
lsola 0:2c26b4ba7cf3 169 case writePort:
lsola 0:2c26b4ba7cf3 170 case pulse:
lsola 0:2c26b4ba7cf3 171 errorString += "\" (Port=";
lsola 0:2c26b4ba7cf3 172 errorString += portName;
lsola 0:2c26b4ba7cf3 173 errorString += ", Pin=";
lsola 0:2c26b4ba7cf3 174 errorString += (char)(pinNumber + '0');
lsola 0:2c26b4ba7cf3 175 errorString += ")\n\r";
lsola 0:2c26b4ba7cf3 176 break;
lsola 0:2c26b4ba7cf3 177 case adcIn:
lsola 0:2c26b4ba7cf3 178 errorString += "\" (ADC \"";
lsola 0:2c26b4ba7cf3 179 errorString += adcInPinName;
lsola 0:2c26b4ba7cf3 180 errorString += "\")\n\r";
lsola 0:2c26b4ba7cf3 181 break;
lsola 0:2c26b4ba7cf3 182 default:
lsola 0:2c26b4ba7cf3 183 errorString += "\"\n\r";
lsola 0:2c26b4ba7cf3 184 }
lsola 0:2c26b4ba7cf3 185 serial->writeBlock((uint8_t*)errorString.c_str(), errorString.length());
lsola 0:2c26b4ba7cf3 186 // memset(cmdBuff, 0, CMD_BUFF_LENGTH);
lsola 0:2c26b4ba7cf3 187 flushSerial();
lsola 0:2c26b4ba7cf3 188 }
lsola 0:2c26b4ba7cf3 189
lsola 0:2c26b4ba7cf3 190 void resetState()
lsola 0:2c26b4ba7cf3 191 {
lsola 0:2c26b4ba7cf3 192 portName = '/';
lsola 0:2c26b4ba7cf3 193 pinNumber = -1;
lsola 0:2c26b4ba7cf3 194 dValue = -1;
lsola 0:2c26b4ba7cf3 195 state = q0;
lsola 0:2c26b4ba7cf3 196 memset(dataBuff, 0, CHAR_BUFF_LENGTH);
lsola 0:2c26b4ba7cf3 197 memset(cmdBuff, 0, CMD_BUFF_LENGTH);
lsola 0:2c26b4ba7cf3 198 dataBuffIdx = 0;
lsola 0:2c26b4ba7cf3 199 cmdBuffIdx = 0;
lsola 0:2c26b4ba7cf3 200 operation = none;
lsola 0:2c26b4ba7cf3 201 }
lsola 0:2c26b4ba7cf3 202
lsola 0:2c26b4ba7cf3 203 #define FAULT { \
lsola 0:2c26b4ba7cf3 204 writeErrorMessage(); \
lsola 0:2c26b4ba7cf3 205 resetState(); \
lsola 0:2c26b4ba7cf3 206 }
lsola 0:2c26b4ba7cf3 207
lsola 0:2c26b4ba7cf3 208 int main(void)
lsola 0:2c26b4ba7cf3 209 {
lsola 0:2c26b4ba7cf3 210 serial = new USBSerial(0x1f00, 0x2012, 0x0001, false);
lsola 0:2c26b4ba7cf3 211 serial->printf("I am a virtual serial port.\n\r");
lsola 0:2c26b4ba7cf3 212 cmdBuffIdx = 0;
lsola 0:2c26b4ba7cf3 213 memset(cmdBuff, 0, CMD_BUFF_LENGTH);
lsola 0:2c26b4ba7cf3 214 dataBuffIdx = 0;
lsola 0:2c26b4ba7cf3 215 memset(dataBuff, 0, CHAR_BUFF_LENGTH);
lsola 0:2c26b4ba7cf3 216 /*********************Lezione su "initializer_list"********************/
lsola 0:2c26b4ba7cf3 217 //PortOutMap portMap(initializer_list<PortOutMap::value_type>({PortOutMap::value_type("pa", PortOut(PortB))}));
lsola 0:2c26b4ba7cf3 218
lsola 0:2c26b4ba7cf3 219 //Oppure (che è lo stesso per via del fatto che il compilatore interpreta argomenti di tipo "array" come "initializer_list" inizialittata con array):
lsola 0:2c26b4ba7cf3 220 //PortOutMap portMap({PortOutMap::value_type("pa", PortOut(PortB))});
lsola 0:2c26b4ba7cf3 221
lsola 0:2c26b4ba7cf3 222 //Oppure (per lo stesso motivo sopra applicato ricorsivamente fino a PortOutMap:value_type anch'esso inizializzabile con un "initializer_list"):
lsola 0:2c26b4ba7cf3 223 //PortOutMap portMap({{"pa", PortOut(PortB)}});
lsola 0:2c26b4ba7cf3 224 /*********************Fine lezione su "initializer_list"********************/
lsola 0:2c26b4ba7cf3 225
lsola 0:2c26b4ba7cf3 226 //Ed inizializzando con tutte le porte:
lsola 0:2c26b4ba7cf3 227 PortOutMap dOutPortMap( {{"PB", PortOut(PortB)}, {"PC", PortOut(PortC)}, {"PD", PortOut(PortD)}, {"PE", PortOut(PortE)}, {"PF", PortOut(PortF)}, {"PG", PortOut(PortG)}});
lsola 0:2c26b4ba7cf3 228 PortInMap dInPortMap( {{"PA", PortIn(PortA,0x3F)}}); //PortIn(PortA,0x18)
lsola 0:2c26b4ba7cf3 229 AnalogInMap adcInMap( {{"ADC_TEMP", AnalogIn(ADC_TEMP)}, {"ADC_VREF", AnalogIn(ADC_VREF)}, {"ADC_VBAT", AnalogIn(ADC_VBAT)}});
lsola 0:2c26b4ba7cf3 230
lsola 0:2c26b4ba7cf3 231 //Timer utile per eseguire operazioni specifiche dopo un certo tempo di assenza di dati in arrivo (come p.e. azzeramento del buffer e reset dello stato).
lsola 0:2c26b4ba7cf3 232 Timer serialEmptyTime;
lsola 0:2c26b4ba7cf3 233
lsola 0:2c26b4ba7cf3 234 // regex_t compiledRe;
lsola 0:2c26b4ba7cf3 235 // int errorNumber;
lsola 0:2c26b4ba7cf3 236 // if((errorNumber == regcomp(&compiledRe, "[DA][GS]ET P[ABCDEFGH] [01]", REG_EXTENDED)) != 0) {
lsola 0:2c26b4ba7cf3 237 // string errorMessage("ERROR: ");
lsola 0:2c26b4ba7cf3 238 // errorMessage+=strerror(errorNumber);
lsola 0:2c26b4ba7cf3 239 // serial->writeBlock(errorMessage.c_str(),errorMessage.length());
lsola 0:2c26b4ba7cf3 240 // }
lsola 0:2c26b4ba7cf3 241
lsola 0:2c26b4ba7cf3 242 int inState;
lsola 0:2c26b4ba7cf3 243 bool inputSkip = false;//Posta a true fa saltare l'attesa di input da seriale mantenendo il vecchio carattere come input dell'automa.
lsola 0:2c26b4ba7cf3 244 flushSerial();
lsola 0:2c26b4ba7cf3 245 serialEmptyTime.start();
lsola 0:2c26b4ba7cf3 246
lsola 0:2c26b4ba7cf3 247 while (1) {
lsola 0:2c26b4ba7cf3 248 if (serial->readable() || inputSkip) {
lsola 0:2c26b4ba7cf3 249 serialEmptyTime.reset();
lsola 0:2c26b4ba7cf3 250 if (cmdBuffIdx >= CMD_BUFF_LENGTH) { //Comando troppo lingo per essere valido: evito di sforare il buffer.
lsola 0:2c26b4ba7cf3 251 cmdBuffIdx = 0;
lsola 0:2c26b4ba7cf3 252 state = q0;
lsola 0:2c26b4ba7cf3 253 inputSkip = false;
lsola 0:2c26b4ba7cf3 254 writeErrorMessage();
lsola 0:2c26b4ba7cf3 255 } else {
lsola 0:2c26b4ba7cf3 256 if(!inputSkip) {
lsola 0:2c26b4ba7cf3 257 c = serial->getc();
lsola 0:2c26b4ba7cf3 258 cmdBuff[cmdBuffIdx++] = c;
lsola 0:2c26b4ba7cf3 259 } else inputSkip = false;
lsola 0:2c26b4ba7cf3 260 switch (state) {
lsola 0:2c26b4ba7cf3 261 case q0:
lsola 0:2c26b4ba7cf3 262 // serial->printf("State q0\r\n");
lsola 0:2c26b4ba7cf3 263 switch (c) {
lsola 0:2c26b4ba7cf3 264 case 'D':
lsola 0:2c26b4ba7cf3 265 state = D;
lsola 0:2c26b4ba7cf3 266 break;
lsola 0:2c26b4ba7cf3 267 case ' ':
lsola 0:2c26b4ba7cf3 268 case '\r':
lsola 0:2c26b4ba7cf3 269 case '\n':
lsola 0:2c26b4ba7cf3 270 case ';':
lsola 0:2c26b4ba7cf3 271 cmdBuffIdx = 0;
lsola 0:2c26b4ba7cf3 272 break;
lsola 0:2c26b4ba7cf3 273 case 'A':
lsola 0:2c26b4ba7cf3 274 state = A;
lsola 0:2c26b4ba7cf3 275 break;
lsola 0:2c26b4ba7cf3 276 case 'H':
lsola 0:2c26b4ba7cf3 277 case '?':
lsola 0:2c26b4ba7cf3 278 state = H;
lsola 0:2c26b4ba7cf3 279 inputSkip = true;
lsola 0:2c26b4ba7cf3 280 break;
lsola 0:2c26b4ba7cf3 281 default:
lsola 0:2c26b4ba7cf3 282 FAULT;
lsola 0:2c26b4ba7cf3 283 }
lsola 0:2c26b4ba7cf3 284 break;
lsola 0:2c26b4ba7cf3 285 case D:
lsola 0:2c26b4ba7cf3 286 // serial->printf("State D\r\n");
lsola 0:2c26b4ba7cf3 287 switch(c) {
lsola 0:2c26b4ba7cf3 288 case 'O':
lsola 0:2c26b4ba7cf3 289 state = DO;
lsola 0:2c26b4ba7cf3 290 break;
lsola 0:2c26b4ba7cf3 291 case 'P':
lsola 0:2c26b4ba7cf3 292 state = DP;
lsola 0:2c26b4ba7cf3 293 break;
lsola 0:2c26b4ba7cf3 294 case 'I':
lsola 0:2c26b4ba7cf3 295 state = DI;
lsola 0:2c26b4ba7cf3 296 break;
lsola 0:2c26b4ba7cf3 297 default:
lsola 0:2c26b4ba7cf3 298 FAULT;
lsola 0:2c26b4ba7cf3 299 }
lsola 0:2c26b4ba7cf3 300 break;
lsola 0:2c26b4ba7cf3 301 case DP:
lsola 0:2c26b4ba7cf3 302 if (c == ' ') {
lsola 0:2c26b4ba7cf3 303 state = OP_;
lsola 0:2c26b4ba7cf3 304 operation = pulse;
lsola 0:2c26b4ba7cf3 305 } else FAULT;
lsola 0:2c26b4ba7cf3 306 break;
lsola 0:2c26b4ba7cf3 307 case DO:
lsola 0:2c26b4ba7cf3 308 if (c == ' ') {
lsola 0:2c26b4ba7cf3 309 state = OP_;
lsola 0:2c26b4ba7cf3 310 operation = writePort;
lsola 0:2c26b4ba7cf3 311 } else FAULT;
lsola 0:2c26b4ba7cf3 312 break;
lsola 0:2c26b4ba7cf3 313 case DI:
lsola 0:2c26b4ba7cf3 314 if (c == ' ') {
lsola 0:2c26b4ba7cf3 315 state = OP_;
lsola 0:2c26b4ba7cf3 316 operation = readPort;
lsola 0:2c26b4ba7cf3 317 } else FAULT;
lsola 0:2c26b4ba7cf3 318 break;
lsola 0:2c26b4ba7cf3 319 case OP_:
lsola 0:2c26b4ba7cf3 320 if (c == 'P') {
lsola 0:2c26b4ba7cf3 321 state = Port;
lsola 0:2c26b4ba7cf3 322 } else FAULT;
lsola 0:2c26b4ba7cf3 323 break;
lsola 0:2c26b4ba7cf3 324 case Port: {
lsola 0:2c26b4ba7cf3 325 portName = c;
lsola 0:2c26b4ba7cf3 326 if (portName >= 'A' && portName <= 'H') {
lsola 0:2c26b4ba7cf3 327 switch (operation) {
lsola 0:2c26b4ba7cf3 328 case writePort:
lsola 0:2c26b4ba7cf3 329 state = Pin;
lsola 0:2c26b4ba7cf3 330 break;
lsola 0:2c26b4ba7cf3 331 case readPort:
lsola 0:2c26b4ba7cf3 332 state = Pin;
lsola 0:2c26b4ba7cf3 333 break;
lsola 0:2c26b4ba7cf3 334 case pulse:
lsola 0:2c26b4ba7cf3 335 state = Pin;
lsola 0:2c26b4ba7cf3 336 break;
lsola 0:2c26b4ba7cf3 337 default:
lsola 0:2c26b4ba7cf3 338 FAULT;
lsola 0:2c26b4ba7cf3 339 }
lsola 0:2c26b4ba7cf3 340 } else {
lsola 0:2c26b4ba7cf3 341 FAULT;
lsola 0:2c26b4ba7cf3 342 }
lsola 0:2c26b4ba7cf3 343 break;
lsola 0:2c26b4ba7cf3 344 }
lsola 0:2c26b4ba7cf3 345 // case OP_Pn: {
lsola 0:2c26b4ba7cf3 346 // serial->printf("State OP_Pn\r\n");
lsola 0:2c26b4ba7cf3 347 // if (c == ' ') {
lsola 0:2c26b4ba7cf3 348 // state = Pin;
lsola 0:2c26b4ba7cf3 349 // }
lsola 0:2c26b4ba7cf3 350 // else FAULT;
lsola 0:2c26b4ba7cf3 351 // break;
lsola 0:2c26b4ba7cf3 352 // }
lsola 0:2c26b4ba7cf3 353 case Pin: {
lsola 0:2c26b4ba7cf3 354 switch (c) {
lsola 0:2c26b4ba7cf3 355 case ' ': {
lsola 0:2c26b4ba7cf3 356 if(dataBuffIdx == 0) break;
lsola 0:2c26b4ba7cf3 357 }
lsola 0:2c26b4ba7cf3 358 case ';': {
lsola 0:2c26b4ba7cf3 359 if (dataBuffIdx == 0) {
lsola 0:2c26b4ba7cf3 360 FAULT;
lsola 0:2c26b4ba7cf3 361 } else {
lsola 0:2c26b4ba7cf3 362 pinNumber = atoi(dataBuff);
lsola 0:2c26b4ba7cf3 363 //DEBUG
lsola 0:2c26b4ba7cf3 364 // serial->printf("\n\rDEBUG: pinNumber=%d\n\r", pinNumber);
lsola 0:2c26b4ba7cf3 365 //------
lsola 0:2c26b4ba7cf3 366 memset(dataBuff, 0, CHAR_BUFF_LENGTH);
lsola 0:2c26b4ba7cf3 367 dataBuffIdx = 0;
lsola 0:2c26b4ba7cf3 368 //***Controllo valore***
lsola 0:2c26b4ba7cf3 369 //***Fine controllo valore***
lsola 0:2c26b4ba7cf3 370 if (pinNumber < 0 || pinNumber > 15) {
lsola 0:2c26b4ba7cf3 371 FAULT;
lsola 0:2c26b4ba7cf3 372 break;
lsola 0:2c26b4ba7cf3 373 }
lsola 0:2c26b4ba7cf3 374 switch (operation) {
lsola 0:2c26b4ba7cf3 375 case writePort:
lsola 0:2c26b4ba7cf3 376 state = DValue;
lsola 0:2c26b4ba7cf3 377 break;
lsola 0:2c26b4ba7cf3 378 case readPort:
lsola 0:2c26b4ba7cf3 379 state = OP_OK;
lsola 0:2c26b4ba7cf3 380 inputSkip = true;
lsola 0:2c26b4ba7cf3 381 break;
lsola 0:2c26b4ba7cf3 382 case pulse:
lsola 0:2c26b4ba7cf3 383 state = TValue;
lsola 0:2c26b4ba7cf3 384 break;
lsola 0:2c26b4ba7cf3 385 default:
lsola 0:2c26b4ba7cf3 386 FAULT;
lsola 0:2c26b4ba7cf3 387 }
lsola 0:2c26b4ba7cf3 388 }
lsola 0:2c26b4ba7cf3 389 break;
lsola 0:2c26b4ba7cf3 390 }
lsola 0:2c26b4ba7cf3 391 default: {
lsola 0:2c26b4ba7cf3 392 if (dataBuffIdx >= 2) {
lsola 0:2c26b4ba7cf3 393 FAULT;
lsola 0:2c26b4ba7cf3 394 } else {
lsola 0:2c26b4ba7cf3 395 dataBuff[dataBuffIdx++] = c;
lsola 0:2c26b4ba7cf3 396 }
lsola 0:2c26b4ba7cf3 397 }
lsola 0:2c26b4ba7cf3 398 }
lsola 0:2c26b4ba7cf3 399 break;
lsola 0:2c26b4ba7cf3 400 }
lsola 0:2c26b4ba7cf3 401 case DValue: {
lsola 0:2c26b4ba7cf3 402 // serial->printf("State S\n\r");
lsola 0:2c26b4ba7cf3 403 switch (c) {
lsola 0:2c26b4ba7cf3 404 case ' ':
lsola 0:2c26b4ba7cf3 405 break;
lsola 0:2c26b4ba7cf3 406 default:
lsola 0:2c26b4ba7cf3 407 dValue = c - '0';
lsola 0:2c26b4ba7cf3 408 if ((dValue == 0 || dValue == 1) && operation == writePort) state = OP_OK;
lsola 0:2c26b4ba7cf3 409 else FAULT;
lsola 0:2c26b4ba7cf3 410 }
lsola 0:2c26b4ba7cf3 411 break;
lsola 0:2c26b4ba7cf3 412 }
lsola 0:2c26b4ba7cf3 413 case TValue: {
lsola 0:2c26b4ba7cf3 414 switch (c) {
lsola 0:2c26b4ba7cf3 415 case ' ': {
lsola 0:2c26b4ba7cf3 416 if(dataBuffIdx == 0) break;
lsola 0:2c26b4ba7cf3 417 }
lsola 0:2c26b4ba7cf3 418 case ';': {
lsola 0:2c26b4ba7cf3 419 if (dataBuffIdx == 0) {
lsola 0:2c26b4ba7cf3 420 FAULT;
lsola 0:2c26b4ba7cf3 421 } else {
lsola 0:2c26b4ba7cf3 422 tValue = atof(dataBuff);
lsola 0:2c26b4ba7cf3 423 //DEBUG
lsola 0:2c26b4ba7cf3 424 // serial->printf("\n\rDEBUG: pinNumber=%d\n\r", pinNumber);
lsola 0:2c26b4ba7cf3 425 //------
lsola 0:2c26b4ba7cf3 426 memset(dataBuff, 0, CHAR_BUFF_LENGTH);
lsola 0:2c26b4ba7cf3 427 dataBuffIdx = 0;
lsola 0:2c26b4ba7cf3 428 //***Controllo valore***
lsola 0:2c26b4ba7cf3 429 //***Fine controllo valore***
lsola 0:2c26b4ba7cf3 430 switch (operation) {
lsola 0:2c26b4ba7cf3 431 case pulse:
lsola 0:2c26b4ba7cf3 432 state = OP_OK;
lsola 0:2c26b4ba7cf3 433 inputSkip = true;
lsola 0:2c26b4ba7cf3 434 break;
lsola 0:2c26b4ba7cf3 435 default:
lsola 0:2c26b4ba7cf3 436 FAULT;
lsola 0:2c26b4ba7cf3 437 }
lsola 0:2c26b4ba7cf3 438 }
lsola 0:2c26b4ba7cf3 439 break;
lsola 0:2c26b4ba7cf3 440 }
lsola 0:2c26b4ba7cf3 441 default: {
lsola 0:2c26b4ba7cf3 442 if (dataBuffIdx >= 6) {
lsola 0:2c26b4ba7cf3 443 FAULT;
lsola 0:2c26b4ba7cf3 444 } else {
lsola 0:2c26b4ba7cf3 445 dataBuff[dataBuffIdx++] = c;
lsola 0:2c26b4ba7cf3 446 }
lsola 0:2c26b4ba7cf3 447 }
lsola 0:2c26b4ba7cf3 448 }
lsola 0:2c26b4ba7cf3 449 break;
lsola 0:2c26b4ba7cf3 450 }
lsola 0:2c26b4ba7cf3 451 case OP_OK: {
lsola 0:2c26b4ba7cf3 452 switch (c) {
lsola 0:2c26b4ba7cf3 453 case ';': {
lsola 0:2c26b4ba7cf3 454 switch (operation) {
lsola 0:2c26b4ba7cf3 455 case writePort: {
lsola 0:2c26b4ba7cf3 456 PortOutMap::iterator pi;
lsola 0:2c26b4ba7cf3 457 if ((pi = dOutPortMap.find(string("P") + portName)) != dOutPortMap.end()) {
lsola 0:2c26b4ba7cf3 458 inState = pi->second.read();
lsola 0:2c26b4ba7cf3 459 if (dValue == 1) inState |= (1 << pinNumber);
lsola 0:2c26b4ba7cf3 460 else inState &= ~(1 << pinNumber);
lsola 0:2c26b4ba7cf3 461 pi->second.write(inState);
lsola 0:2c26b4ba7cf3 462 // Composizione messaggio di debug. Con il "printf" funziona solo con minicom per cui uso la writeBlock.
lsola 0:2c26b4ba7cf3 463 // //serial->printf("DEBUG: setting port %c, pin %d, at value %d\r\n", portName, pinNumber, dValue);
lsola 0:2c26b4ba7cf3 464 // strcpy(outBuff, "DEBUG: setting port ");
lsola 0:2c26b4ba7cf3 465 // strcat(outBuff, &portName);
lsola 0:2c26b4ba7cf3 466 // strcat(outBuff, ", pin ");
lsola 0:2c26b4ba7cf3 467 // pinNumber += '0';
lsola 0:2c26b4ba7cf3 468 // strcat(outBuff, (char*)&(pinNumber));
lsola 0:2c26b4ba7cf3 469 // strcat(outBuff, ", at value ");
lsola 0:2c26b4ba7cf3 470 // dValue += '0';
lsola 0:2c26b4ba7cf3 471 // strcat(outBuff, (char*)&dValue);
lsola 0:2c26b4ba7cf3 472 serial->writeBlock((uint8_t*)"OK;", 3);
lsola 0:2c26b4ba7cf3 473 } else {
lsola 0:2c26b4ba7cf3 474 // serial->printf("Digital Output not available on port \"%c\"\r\n", portName);
lsola 0:2c26b4ba7cf3 475 snprintf(outBuff, OUT_BUFF_LEN, "Digital Output not available on port \"%c\";", portName);
lsola 0:2c26b4ba7cf3 476 serial->writeBlock((uint8_t*)outBuff, strlen(outBuff));
lsola 0:2c26b4ba7cf3 477 }
lsola 0:2c26b4ba7cf3 478 break;
lsola 0:2c26b4ba7cf3 479 }
lsola 0:2c26b4ba7cf3 480 case readPort: {
lsola 0:2c26b4ba7cf3 481 PortInMap::iterator pi;
lsola 0:2c26b4ba7cf3 482 if ((pi = dInPortMap.find(string("P") + portName)) != dInPortMap.end()) {
lsola 0:2c26b4ba7cf3 483 inState = pi->second.read();
lsola 0:2c26b4ba7cf3 484 inState &= (1 << pinNumber);
lsola 0:2c26b4ba7cf3 485 inState = (inState ? 1 : 0);
lsola 0:2c26b4ba7cf3 486 snprintf(outBuff, OUT_BUFF_LEN, "%i;", inState);
lsola 0:2c26b4ba7cf3 487 serial->writeBlock((uint8_t*)outBuff, strlen(outBuff));
lsola 0:2c26b4ba7cf3 488 } else {
lsola 0:2c26b4ba7cf3 489 snprintf(outBuff, OUT_BUFF_LEN, "Digital Input not available on port \"%c\";", portName);
lsola 0:2c26b4ba7cf3 490 serial->writeBlock((uint8_t*)outBuff, strlen(outBuff));
lsola 0:2c26b4ba7cf3 491 }
lsola 0:2c26b4ba7cf3 492 break;
lsola 0:2c26b4ba7cf3 493 }
lsola 0:2c26b4ba7cf3 494 case pulse: {
lsola 0:2c26b4ba7cf3 495 PortOutMap::iterator pi;
lsola 0:2c26b4ba7cf3 496 if ((pi = dOutPortMap.find(string("P") + portName)) != dOutPortMap.end()) {
lsola 0:2c26b4ba7cf3 497 // DropExpiredBitFlipper();
lsola 0:2c26b4ba7cf3 498 Flipper* f = new Flipper(pi->second, pinNumber);
lsola 0:2c26b4ba7cf3 499 f->start(tValue);
lsola 0:2c26b4ba7cf3 500 flipperList.push_back(f);
lsola 0:2c26b4ba7cf3 501 serial->writeBlock((uint8_t*)"OK;", 3);
lsola 0:2c26b4ba7cf3 502 } else {
lsola 0:2c26b4ba7cf3 503 // serial->printf("Digital Output not available on port \"%c\"\r\n", portName);
lsola 0:2c26b4ba7cf3 504 snprintf(outBuff, OUT_BUFF_LEN, "Digital Output not available on port \"%c\";", portName);
lsola 0:2c26b4ba7cf3 505 serial->writeBlock((uint8_t*)outBuff, strlen(outBuff));
lsola 0:2c26b4ba7cf3 506 }
lsola 0:2c26b4ba7cf3 507 break;
lsola 0:2c26b4ba7cf3 508 }
lsola 0:2c26b4ba7cf3 509 case adcIn: {
lsola 0:2c26b4ba7cf3 510 AnalogInMap::iterator pi;
lsola 0:2c26b4ba7cf3 511 if ((pi = adcInMap.find(string(adcInPinName))) != adcInMap.end()) {
lsola 0:2c26b4ba7cf3 512 // DropExpiredBitFlipper();
lsola 0:2c26b4ba7cf3 513 inState = pi->second.read_u16();
lsola 0:2c26b4ba7cf3 514 snprintf(outBuff, OUT_BUFF_LEN, "%i;", inState);
lsola 0:2c26b4ba7cf3 515 serial->writeBlock((uint8_t*)outBuff, strlen(outBuff));
lsola 0:2c26b4ba7cf3 516 } else {
lsola 0:2c26b4ba7cf3 517 // serial->printf("Digital Output not available on port \"%c\"\r\n", portName);
lsola 0:2c26b4ba7cf3 518 snprintf(outBuff, OUT_BUFF_LEN, "ADC Input \"%s\" not available;", adcInPinName);
lsola 0:2c26b4ba7cf3 519 serial->writeBlock((uint8_t*)outBuff, strlen(outBuff));
lsola 0:2c26b4ba7cf3 520 }
lsola 0:2c26b4ba7cf3 521 break;
lsola 0:2c26b4ba7cf3 522 }
lsola 0:2c26b4ba7cf3 523 default:
lsola 0:2c26b4ba7cf3 524 FAULT;
lsola 0:2c26b4ba7cf3 525 }
lsola 0:2c26b4ba7cf3 526 resetState();
lsola 0:2c26b4ba7cf3 527 break;
lsola 0:2c26b4ba7cf3 528 }
lsola 0:2c26b4ba7cf3 529 case ' ':
lsola 0:2c26b4ba7cf3 530 break;
lsola 0:2c26b4ba7cf3 531 default:
lsola 0:2c26b4ba7cf3 532 FAULT;
lsola 0:2c26b4ba7cf3 533 }
lsola 0:2c26b4ba7cf3 534 break;
lsola 0:2c26b4ba7cf3 535 }
lsola 0:2c26b4ba7cf3 536 case A:
lsola 0:2c26b4ba7cf3 537 switch (c) {
lsola 0:2c26b4ba7cf3 538 case 'I':
lsola 0:2c26b4ba7cf3 539 state = AI;
lsola 0:2c26b4ba7cf3 540 break;
lsola 0:2c26b4ba7cf3 541 default:
lsola 0:2c26b4ba7cf3 542 FAULT;
lsola 0:2c26b4ba7cf3 543 }
lsola 0:2c26b4ba7cf3 544 break;
lsola 0:2c26b4ba7cf3 545 case AI:
lsola 0:2c26b4ba7cf3 546 switch (c) {
lsola 0:2c26b4ba7cf3 547 case ' ': {
lsola 0:2c26b4ba7cf3 548 state = analogInName;
lsola 0:2c26b4ba7cf3 549 operation = adcIn;
lsola 0:2c26b4ba7cf3 550 break;
lsola 0:2c26b4ba7cf3 551 default:
lsola 0:2c26b4ba7cf3 552 FAULT;
lsola 0:2c26b4ba7cf3 553 }
lsola 0:2c26b4ba7cf3 554 }
lsola 0:2c26b4ba7cf3 555 break;
lsola 0:2c26b4ba7cf3 556 case analogInName:
lsola 0:2c26b4ba7cf3 557 switch (c) {
lsola 0:2c26b4ba7cf3 558 case ' ': {
lsola 0:2c26b4ba7cf3 559 if(dataBuffIdx == 0) break;
lsola 0:2c26b4ba7cf3 560 }
lsola 0:2c26b4ba7cf3 561 case ';': {
lsola 0:2c26b4ba7cf3 562 if (dataBuffIdx == 0) {
lsola 0:2c26b4ba7cf3 563 FAULT;
lsola 0:2c26b4ba7cf3 564 } else {
lsola 0:2c26b4ba7cf3 565 strncpy(adcInPinName, dataBuff, CHAR_BUFF_LENGTH); //Si poteva anche usare direttamente adcInPinName dentro all'assegnamento ciclico ma così è "uniforme" (in futuro si potrebbe fare una macro o funzione per questo genere di operazione).
lsola 0:2c26b4ba7cf3 566 //DEBUG
lsola 0:2c26b4ba7cf3 567 // serial->printf("\n\rDEBUG: adcInPinName=%s\n\r", adcInPinName);
lsola 0:2c26b4ba7cf3 568 //------
lsola 0:2c26b4ba7cf3 569 memset(dataBuff, 0, CHAR_BUFF_LENGTH);
lsola 0:2c26b4ba7cf3 570 dataBuffIdx = 0;
lsola 0:2c26b4ba7cf3 571 //***Controllo valore***
lsola 0:2c26b4ba7cf3 572 //***Fine controllo valore***
lsola 0:2c26b4ba7cf3 573 switch (operation) {
lsola 0:2c26b4ba7cf3 574 case adcIn:
lsola 0:2c26b4ba7cf3 575 state = OP_OK;
lsola 0:2c26b4ba7cf3 576 inputSkip = true;
lsola 0:2c26b4ba7cf3 577 break;
lsola 0:2c26b4ba7cf3 578 default:
lsola 0:2c26b4ba7cf3 579 FAULT;
lsola 0:2c26b4ba7cf3 580 }
lsola 0:2c26b4ba7cf3 581 }
lsola 0:2c26b4ba7cf3 582 break;
lsola 0:2c26b4ba7cf3 583 }
lsola 0:2c26b4ba7cf3 584 default: {
lsola 0:2c26b4ba7cf3 585 if (dataBuffIdx >= CHAR_BUFF_LENGTH-1) {
lsola 0:2c26b4ba7cf3 586 FAULT;
lsola 0:2c26b4ba7cf3 587 } else {
lsola 0:2c26b4ba7cf3 588 dataBuff[dataBuffIdx++] = c;
lsola 0:2c26b4ba7cf3 589 }
lsola 0:2c26b4ba7cf3 590 }
lsola 0:2c26b4ba7cf3 591 }
lsola 0:2c26b4ba7cf3 592 break;
lsola 0:2c26b4ba7cf3 593 case H:
lsola 0:2c26b4ba7cf3 594 serial->writeBlock((uint8_t*)"\n\rCommand Help:\n\r", 17);
lsola 0:2c26b4ba7cf3 595 writeLongStringOnSerial(COMMAND_LIST_HELP);
lsola 0:2c26b4ba7cf3 596 resetState();
lsola 0:2c26b4ba7cf3 597 flushSerial();
lsola 0:2c26b4ba7cf3 598 break;
lsola 0:2c26b4ba7cf3 599 }
lsola 0:2c26b4ba7cf3 600 }
lsola 0:2c26b4ba7cf3 601 } else {
lsola 0:2c26b4ba7cf3 602 if (serialEmptyTime.read_ms() > NO_DATA_ACTION_TIME) {
lsola 0:2c26b4ba7cf3 603 serialEmptyTime.reset();
lsola 0:2c26b4ba7cf3 604 resetState();
lsola 0:2c26b4ba7cf3 605 memset(cmdBuff, 0, CMD_BUFF_LENGTH);
lsola 0:2c26b4ba7cf3 606 cmdBuffIdx = 0;
lsola 0:2c26b4ba7cf3 607 //serial->writeBlock((uint8_t*)"DEBUG: timeout", 14);
lsola 0:2c26b4ba7cf3 608 }
lsola 0:2c26b4ba7cf3 609 DropExpiredBitFlipper();
lsola 0:2c26b4ba7cf3 610 }
lsola 0:2c26b4ba7cf3 611 }
lsola 0:2c26b4ba7cf3 612 delete serial;
lsola 0:2c26b4ba7cf3 613 }