![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
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.
src/main.cpp@3:a425b8b0a4c2, 2018-01-17 (annotated)
- 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?
User | Revision | Line number | New 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 | } |