Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@0:57215055833e, 2019-10-23 (annotated)
- Committer:
- elpatosilva
- Date:
- Wed Oct 23 14:07:50 2019 +0000
- Revision:
- 0:57215055833e
first commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
elpatosilva | 0:57215055833e | 1 | #include "mbed.h" |
elpatosilva | 0:57215055833e | 2 | |
elpatosilva | 0:57215055833e | 3 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
elpatosilva | 0:57215055833e | 4 | // Conf IO |
elpatosilva | 0:57215055833e | 5 | DigitalOut led1(LED1); // HeartBeat |
elpatosilva | 0:57215055833e | 6 | |
elpatosilva | 0:57215055833e | 7 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
elpatosilva | 0:57215055833e | 8 | // Timers |
elpatosilva | 0:57215055833e | 9 | Ticker timer100ms; |
elpatosilva | 0:57215055833e | 10 | |
elpatosilva | 0:57215055833e | 11 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
elpatosilva | 0:57215055833e | 12 | // Comunicación Serial |
elpatosilva | 0:57215055833e | 13 | |
elpatosilva | 0:57215055833e | 14 | #define RXBUFFERSIZE 256 |
elpatosilva | 0:57215055833e | 15 | #define TXBUFFERSIZE 256 |
elpatosilva | 0:57215055833e | 16 | #define RXCMDTIME 50000 |
elpatosilva | 0:57215055833e | 17 | #define TXCMDTIME 50000 |
elpatosilva | 0:57215055833e | 18 | // Header |
elpatosilva | 0:57215055833e | 19 | const uint8_t header[7] = {0x55, 0x4E, 0x45, 0x52, 0x00, 0x00, 0x3A}; |
elpatosilva | 0:57215055833e | 20 | |
elpatosilva | 0:57215055833e | 21 | Serial pc(USBTX, USBRX); // tx, rx |
elpatosilva | 0:57215055833e | 22 | |
elpatosilva | 0:57215055833e | 23 | ////////////////////////////////////////// |
elpatosilva | 0:57215055833e | 24 | // Tipos de dato |
elpatosilva | 0:57215055833e | 25 | ////////////////////////////////////////// |
elpatosilva | 0:57215055833e | 26 | |
elpatosilva | 0:57215055833e | 27 | /* |
elpatosilva | 0:57215055833e | 28 | * Indices de lectura y escritura del buffer circular |
elpatosilva | 0:57215055833e | 29 | * checksum y marcas de tiempo para el envio por puerto serie |
elpatosilva | 0:57215055833e | 30 | * empty indica si la cola esta vacia o llena cuando indexR=indexW |
elpatosilva | 0:57215055833e | 31 | */ |
elpatosilva | 0:57215055833e | 32 | typedef struct{ |
elpatosilva | 0:57215055833e | 33 | uint8_t indexR; |
elpatosilva | 0:57215055833e | 34 | uint8_t indexW; |
elpatosilva | 0:57215055833e | 35 | uint8_t buf[RXBUFFERSIZE]; |
elpatosilva | 0:57215055833e | 36 | uint8_t chksum; |
elpatosilva | 0:57215055833e | 37 | bool empty; |
elpatosilva | 0:57215055833e | 38 | uint64_t cmdTime; |
elpatosilva | 0:57215055833e | 39 | uint8_t chksumHeader; |
elpatosilva | 0:57215055833e | 40 | } _txbuffer; |
elpatosilva | 0:57215055833e | 41 | |
elpatosilva | 0:57215055833e | 42 | /* |
elpatosilva | 0:57215055833e | 43 | * Indices de lectura y escritura del buffer circular |
elpatosilva | 0:57215055833e | 44 | * marcas de tiempo, indice de comando y tamaño del comando |
elpatosilva | 0:57215055833e | 45 | */ |
elpatosilva | 0:57215055833e | 46 | typedef struct{ |
elpatosilva | 0:57215055833e | 47 | uint8_t indexR; |
elpatosilva | 0:57215055833e | 48 | uint8_t indexW; |
elpatosilva | 0:57215055833e | 49 | uint8_t buf[RXBUFFERSIZE]; |
elpatosilva | 0:57215055833e | 50 | uint64_t cmdTime; |
elpatosilva | 0:57215055833e | 51 | uint8_t cmdIndex; |
elpatosilva | 0:57215055833e | 52 | uint8_t stage; |
elpatosilva | 0:57215055833e | 53 | bool cmd; |
elpatosilva | 0:57215055833e | 54 | uint8_t chksum; |
elpatosilva | 0:57215055833e | 55 | uint16_t payloadSize; |
elpatosilva | 0:57215055833e | 56 | } _rxbuffer; |
elpatosilva | 0:57215055833e | 57 | |
elpatosilva | 0:57215055833e | 58 | |
elpatosilva | 0:57215055833e | 59 | /////////////////////////////// |
elpatosilva | 0:57215055833e | 60 | // Variables |
elpatosilva | 0:57215055833e | 61 | //////////////////////////////// |
elpatosilva | 0:57215055833e | 62 | |
elpatosilva | 0:57215055833e | 63 | // defino los buffer |
elpatosilva | 0:57215055833e | 64 | _txbuffer TX; |
elpatosilva | 0:57215055833e | 65 | _rxbuffer RX; |
elpatosilva | 0:57215055833e | 66 | |
elpatosilva | 0:57215055833e | 67 | |
elpatosilva | 0:57215055833e | 68 | /////////////////////////////// |
elpatosilva | 0:57215055833e | 69 | // Prototipos Serial |
elpatosilva | 0:57215055833e | 70 | /////////////////////////////// |
elpatosilva | 0:57215055833e | 71 | |
elpatosilva | 0:57215055833e | 72 | void serialSetup(uint16_t); |
elpatosilva | 0:57215055833e | 73 | |
elpatosilva | 0:57215055833e | 74 | |
elpatosilva | 0:57215055833e | 75 | /* Escribe en el puerto serie los datos del buffer |
elpatosilva | 0:57215055833e | 76 | * en cualquier escribo solo de a 1 byte por llamada |
elpatosilva | 0:57215055833e | 77 | */ |
elpatosilva | 0:57215055833e | 78 | void serialSubmit(); |
elpatosilva | 0:57215055833e | 79 | |
elpatosilva | 0:57215055833e | 80 | |
elpatosilva | 0:57215055833e | 81 | /* Carga al buffer lo recibido por puerto serie |
elpatosilva | 0:57215055833e | 82 | */ |
elpatosilva | 0:57215055833e | 83 | void serialReceive(); |
elpatosilva | 0:57215055833e | 84 | |
elpatosilva | 0:57215055833e | 85 | |
elpatosilva | 0:57215055833e | 86 | /* Busca si hay un frame en el buffer que esté correcto y verifica el checksum |
elpatosilva | 0:57215055833e | 87 | * Si hay un header mueve el indice RX.cmdIndex a la posicion donde comienza el comando |
elpatosilva | 0:57215055833e | 88 | * y setea a true el flag RX.cmd. Mueve RX.indexR a esa posición para liberar el espacio |
elpatosilva | 0:57215055833e | 89 | * ocupado por el header. No procesa un nuevo comando hasta que no se ha procesado el anterior |
elpatosilva | 0:57215055833e | 90 | * notificandolo con clearCmd() |
elpatosilva | 0:57215055833e | 91 | */ |
elpatosilva | 0:57215055833e | 92 | void getFrame(); |
elpatosilva | 0:57215055833e | 93 | |
elpatosilva | 0:57215055833e | 94 | |
elpatosilva | 0:57215055833e | 95 | /* |
elpatosilva | 0:57215055833e | 96 | * Escribe en el buffer de salida un frame con un tamaño de comando+payload+checksum = s |
elpatosilva | 0:57215055833e | 97 | * retorna true cuando termina de escribir, falso si no hay suficiente espacio (y restablece los indices) |
elpatosilva | 0:57215055833e | 98 | */ |
elpatosilva | 0:57215055833e | 99 | bool serialEnqueueHeader(uint16_t); |
elpatosilva | 0:57215055833e | 100 | |
elpatosilva | 0:57215055833e | 101 | |
elpatosilva | 0:57215055833e | 102 | /* Escribe el byte en el buffer de salida, retorna falso si no hay lugar suficiente para hacerlo |
elpatosilva | 0:57215055833e | 103 | */ |
elpatosilva | 0:57215055833e | 104 | bool serialEnqueueData(uint8_t); |
elpatosilva | 0:57215055833e | 105 | |
elpatosilva | 0:57215055833e | 106 | |
elpatosilva | 0:57215055833e | 107 | /* Encola el checksum |
elpatosilva | 0:57215055833e | 108 | */ |
elpatosilva | 0:57215055833e | 109 | bool serialEnqueueChksum(); |
elpatosilva | 0:57215055833e | 110 | |
elpatosilva | 0:57215055833e | 111 | /* Borra el comando actual para que se pueda recibir el siguiente |
elpatosilva | 0:57215055833e | 112 | */ |
elpatosilva | 0:57215055833e | 113 | void cleanCmd(); |
elpatosilva | 0:57215055833e | 114 | |
elpatosilva | 0:57215055833e | 115 | |
elpatosilva | 0:57215055833e | 116 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
elpatosilva | 0:57215055833e | 117 | // Prototipos de Utilidades |
elpatosilva | 0:57215055833e | 118 | void heartBeat(); |
elpatosilva | 0:57215055833e | 119 | |
elpatosilva | 0:57215055833e | 120 | |
elpatosilva | 0:57215055833e | 121 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
elpatosilva | 0:57215055833e | 122 | // Funciones |
elpatosilva | 0:57215055833e | 123 | |
elpatosilva | 0:57215055833e | 124 | |
elpatosilva | 0:57215055833e | 125 | /* |
elpatosilva | 0:57215055833e | 126 | * Señal de activo, dos parpadeos de 100ms cada dos segundos |
elpatosilva | 0:57215055833e | 127 | */ |
elpatosilva | 0:57215055833e | 128 | void heartBeat(){ |
elpatosilva | 0:57215055833e | 129 | static int count = 0; |
elpatosilva | 0:57215055833e | 130 | switch (count++){ |
elpatosilva | 0:57215055833e | 131 | case 0: |
elpatosilva | 0:57215055833e | 132 | case 2: |
elpatosilva | 0:57215055833e | 133 | led1 = 0; |
elpatosilva | 0:57215055833e | 134 | break; |
elpatosilva | 0:57215055833e | 135 | case 1: |
elpatosilva | 0:57215055833e | 136 | case 3: |
elpatosilva | 0:57215055833e | 137 | led1 = 1; |
elpatosilva | 0:57215055833e | 138 | break; |
elpatosilva | 0:57215055833e | 139 | case 20: |
elpatosilva | 0:57215055833e | 140 | count = 0; |
elpatosilva | 0:57215055833e | 141 | break; |
elpatosilva | 0:57215055833e | 142 | } |
elpatosilva | 0:57215055833e | 143 | } |
elpatosilva | 0:57215055833e | 144 | |
elpatosilva | 0:57215055833e | 145 | |
elpatosilva | 0:57215055833e | 146 | |
elpatosilva | 0:57215055833e | 147 | void serialSetup(uint16_t br){ |
elpatosilva | 0:57215055833e | 148 | RX.indexR=0; |
elpatosilva | 0:57215055833e | 149 | RX.indexW=0; |
elpatosilva | 0:57215055833e | 150 | RX.stage=0; |
elpatosilva | 0:57215055833e | 151 | RX.cmd=false; |
elpatosilva | 0:57215055833e | 152 | TX.indexR=0; |
elpatosilva | 0:57215055833e | 153 | TX.indexW=0; |
elpatosilva | 0:57215055833e | 154 | TX.empty=true; |
elpatosilva | 0:57215055833e | 155 | // Calculo el checksum del header |
elpatosilva | 0:57215055833e | 156 | TX.chksumHeader = header[0]; |
elpatosilva | 0:57215055833e | 157 | for (uint8_t i = 1 ; i < 4 ; i++){ |
elpatosilva | 0:57215055833e | 158 | TX.chksumHeader ^= header[i]; |
elpatosilva | 0:57215055833e | 159 | } |
elpatosilva | 0:57215055833e | 160 | pc.baud(19200); |
elpatosilva | 0:57215055833e | 161 | pc.attach(&serialReceive); |
elpatosilva | 0:57215055833e | 162 | } |
elpatosilva | 0:57215055833e | 163 | |
elpatosilva | 0:57215055833e | 164 | |
elpatosilva | 0:57215055833e | 165 | |
elpatosilva | 0:57215055833e | 166 | //////////////////////////////////////////////////////////////////////// |
elpatosilva | 0:57215055833e | 167 | // Funciones para el manejo del protocolo |
elpatosilva | 0:57215055833e | 168 | //////////////////////////////////////////////////////////////////////// |
elpatosilva | 0:57215055833e | 169 | |
elpatosilva | 0:57215055833e | 170 | // Carga al buffer lo recibido por puerto serie |
elpatosilva | 0:57215055833e | 171 | void serialReceive(){ |
elpatosilva | 0:57215055833e | 172 | while (pc.readable() && (uint8_t)(RX.indexW+1) != RX.indexR){ |
elpatosilva | 0:57215055833e | 173 | RX.buf[RX.indexW++] = pc.getc();; |
elpatosilva | 0:57215055833e | 174 | } |
elpatosilva | 0:57215055833e | 175 | } |
elpatosilva | 0:57215055833e | 176 | |
elpatosilva | 0:57215055833e | 177 | |
elpatosilva | 0:57215055833e | 178 | |
elpatosilva | 0:57215055833e | 179 | /* Escribe en el puerto serie los datos del buffer |
elpatosilva | 0:57215055833e | 180 | * en cualquier escribo solo de a 1 byte por llamada |
elpatosilva | 0:57215055833e | 181 | */ |
elpatosilva | 0:57215055833e | 182 | void serialSubmit(){ |
elpatosilva | 0:57215055833e | 183 | if(TX.indexR!=TX.indexW){ |
elpatosilva | 0:57215055833e | 184 | pc.putc(TX.buf[TX.indexR++]); |
elpatosilva | 0:57215055833e | 185 | } |
elpatosilva | 0:57215055833e | 186 | TX.empty = (TX.indexR==TX.indexW); |
elpatosilva | 0:57215055833e | 187 | } |
elpatosilva | 0:57215055833e | 188 | |
elpatosilva | 0:57215055833e | 189 | |
elpatosilva | 0:57215055833e | 190 | |
elpatosilva | 0:57215055833e | 191 | /* Busca si hay un frame en el buffer que esté correcto y verifica el checksum |
elpatosilva | 0:57215055833e | 192 | * Si hay un header mueve el indice RX.cmdIndex a la posicion donde comienza el comando |
elpatosilva | 0:57215055833e | 193 | * y setea a true el flag RX.cmd. Mueve RX.indexR a esa posición para liberar el espacio |
elpatosilva | 0:57215055833e | 194 | * ocupado por el header |
elpatosilva | 0:57215055833e | 195 | */ |
elpatosilva | 0:57215055833e | 196 | void getFrame(){ |
elpatosilva | 0:57215055833e | 197 | uint8_t index; |
elpatosilva | 0:57215055833e | 198 | |
elpatosilva | 0:57215055833e | 199 | // No logré completar el comando dentro de la ventana de tiempo, considero vacio el buffer de entrada |
elpatosilva | 0:57215055833e | 200 | if(RX.stage > 0 && RX.cmdTime+RXCMDTIME < us_ticker_read()){ |
elpatosilva | 0:57215055833e | 201 | RX.indexR = RX.indexW; |
elpatosilva | 0:57215055833e | 202 | RX.stage = 0; |
elpatosilva | 0:57215055833e | 203 | return; |
elpatosilva | 0:57215055833e | 204 | } |
elpatosilva | 0:57215055833e | 205 | |
elpatosilva | 0:57215055833e | 206 | // mientras hay bytes disponibles en el buffer, proceso desde donde quedé |
elpatosilva | 0:57215055833e | 207 | index = RX.indexR+RX.stage; |
elpatosilva | 0:57215055833e | 208 | while (index != RX.indexW){ |
elpatosilva | 0:57215055833e | 209 | switch (RX.stage){ |
elpatosilva | 0:57215055833e | 210 | case 0: |
elpatosilva | 0:57215055833e | 211 | RX.cmdTime = us_ticker_read(); |
elpatosilva | 0:57215055833e | 212 | case 1: |
elpatosilva | 0:57215055833e | 213 | case 2: |
elpatosilva | 0:57215055833e | 214 | case 3:{ |
elpatosilva | 0:57215055833e | 215 | if(RX.buf[index] == header[RX.stage]){ |
elpatosilva | 0:57215055833e | 216 | RX.stage++; |
elpatosilva | 0:57215055833e | 217 | index++; |
elpatosilva | 0:57215055833e | 218 | }else{ // No coincide con un header, descarto hasta acá y empiezo de nuevo en el proximo ciclo |
elpatosilva | 0:57215055833e | 219 | RX.indexR +=RX.stage; |
elpatosilva | 0:57215055833e | 220 | RX.stage=0; |
elpatosilva | 0:57215055833e | 221 | return; |
elpatosilva | 0:57215055833e | 222 | } |
elpatosilva | 0:57215055833e | 223 | break; |
elpatosilva | 0:57215055833e | 224 | } |
elpatosilva | 0:57215055833e | 225 | case 4:{ |
elpatosilva | 0:57215055833e | 226 | RX.payloadSize = RX.buf[index]; |
elpatosilva | 0:57215055833e | 227 | RX.stage++; |
elpatosilva | 0:57215055833e | 228 | index++; |
elpatosilva | 0:57215055833e | 229 | break; |
elpatosilva | 0:57215055833e | 230 | } |
elpatosilva | 0:57215055833e | 231 | case 5:{ |
elpatosilva | 0:57215055833e | 232 | RX.payloadSize += RX.buf[index]*256; |
elpatosilva | 0:57215055833e | 233 | RX.stage++; |
elpatosilva | 0:57215055833e | 234 | index++; |
elpatosilva | 0:57215055833e | 235 | break; |
elpatosilva | 0:57215055833e | 236 | } |
elpatosilva | 0:57215055833e | 237 | case 6:{ |
elpatosilva | 0:57215055833e | 238 | if (RX.buf[index] == header[RX.stage]){ // Llego al separador ":", marco la posicion sigiente como cmdIndex |
elpatosilva | 0:57215055833e | 239 | RX.stage++; |
elpatosilva | 0:57215055833e | 240 | index++; |
elpatosilva | 0:57215055833e | 241 | }else{ |
elpatosilva | 0:57215055833e | 242 | RX.indexR += 3; // Continuo desde la direccion de tamaño del payload |
elpatosilva | 0:57215055833e | 243 | RX.stage = 0; |
elpatosilva | 0:57215055833e | 244 | return; |
elpatosilva | 0:57215055833e | 245 | } |
elpatosilva | 0:57215055833e | 246 | break; |
elpatosilva | 0:57215055833e | 247 | } |
elpatosilva | 0:57215055833e | 248 | case 7:{ |
elpatosilva | 0:57215055833e | 249 | // empiezo a incrementar index hasta alcanzar el fin de trama (RX.indexR+RX.payloadSize+7) |
elpatosilva | 0:57215055833e | 250 | // No avanzo si aún hay un comando por ejecutar |
elpatosilva | 0:57215055833e | 251 | if(!RX.cmd && index == (uint8_t)(RX.indexR+RX.payloadSize+6)){ // alcance la posicion del checksum |
elpatosilva | 0:57215055833e | 252 | // Calculo checksum y comparo |
elpatosilva | 0:57215055833e | 253 | RX.chksum = RX.buf[RX.indexR]; |
elpatosilva | 0:57215055833e | 254 | for (uint16_t i = 1 ; i < RX.payloadSize+6 ; i++){ |
elpatosilva | 0:57215055833e | 255 | RX.chksum ^= RX.buf[(uint8_t)(RX.indexR+i)]; |
elpatosilva | 0:57215055833e | 256 | } |
elpatosilva | 0:57215055833e | 257 | if(RX.buf[(uint8_t)(RX.indexR+RX.payloadSize+6)] == RX.chksum){ |
elpatosilva | 0:57215055833e | 258 | RX.cmd = true; |
elpatosilva | 0:57215055833e | 259 | RX.cmdIndex = RX.indexR+7; |
elpatosilva | 0:57215055833e | 260 | RX.indexR = RX.cmdIndex; |
elpatosilva | 0:57215055833e | 261 | TX.cmdTime = us_ticker_read(); // marca de tiempo para responder el comando |
elpatosilva | 0:57215055833e | 262 | RX.stage = 0; |
elpatosilva | 0:57215055833e | 263 | return; |
elpatosilva | 0:57215055833e | 264 | }else{ |
elpatosilva | 0:57215055833e | 265 | RX.indexR += 3; // checksum incorrecto, continuo procesando desde la direccion de tamaño del payload |
elpatosilva | 0:57215055833e | 266 | RX.stage = 0; |
elpatosilva | 0:57215055833e | 267 | } |
elpatosilva | 0:57215055833e | 268 | return; |
elpatosilva | 0:57215055833e | 269 | }else{ |
elpatosilva | 0:57215055833e | 270 | index++; |
elpatosilva | 0:57215055833e | 271 | } |
elpatosilva | 0:57215055833e | 272 | break; |
elpatosilva | 0:57215055833e | 273 | } |
elpatosilva | 0:57215055833e | 274 | default:{ |
elpatosilva | 0:57215055833e | 275 | RX.stage = 0; |
elpatosilva | 0:57215055833e | 276 | return; |
elpatosilva | 0:57215055833e | 277 | } |
elpatosilva | 0:57215055833e | 278 | } |
elpatosilva | 0:57215055833e | 279 | } |
elpatosilva | 0:57215055833e | 280 | } |
elpatosilva | 0:57215055833e | 281 | |
elpatosilva | 0:57215055833e | 282 | |
elpatosilva | 0:57215055833e | 283 | |
elpatosilva | 0:57215055833e | 284 | /* |
elpatosilva | 0:57215055833e | 285 | * Escribe en el buffer de salida un frame con un tamaño de comando+payload+checksum = s |
elpatosilva | 0:57215055833e | 286 | * retorna true cuando termina de escribir, falso si no hay suficiente espacio (y restablece los indices) |
elpatosilva | 0:57215055833e | 287 | */ |
elpatosilva | 0:57215055833e | 288 | bool serialEnqueueHeader(uint16_t s){ |
elpatosilva | 0:57215055833e | 289 | uint8_t index = TX.indexW; |
elpatosilva | 0:57215055833e | 290 | // Inicializo chechsum |
elpatosilva | 0:57215055833e | 291 | TX.chksum = TX.chksumHeader; |
elpatosilva | 0:57215055833e | 292 | |
elpatosilva | 0:57215055833e | 293 | // escribo la cabecera |
elpatosilva | 0:57215055833e | 294 | for (uint8_t i = 0 ; i < 4 ; i++){ |
elpatosilva | 0:57215055833e | 295 | if(TX.indexR != TX.indexW || TX.empty){ |
elpatosilva | 0:57215055833e | 296 | TX.buf[TX.indexW++] = header[i]; |
elpatosilva | 0:57215055833e | 297 | }else{ |
elpatosilva | 0:57215055833e | 298 | TX.indexW = index; |
elpatosilva | 0:57215055833e | 299 | return false; |
elpatosilva | 0:57215055833e | 300 | } |
elpatosilva | 0:57215055833e | 301 | } |
elpatosilva | 0:57215055833e | 302 | // Escribo el tamaño |
elpatosilva | 0:57215055833e | 303 | if(TX.indexR != TX.indexW || TX.empty){ |
elpatosilva | 0:57215055833e | 304 | TX.buf[TX.indexW++] = (uint8_t)s; |
elpatosilva | 0:57215055833e | 305 | TX.chksum ^= (uint8_t)s; |
elpatosilva | 0:57215055833e | 306 | }else{ |
elpatosilva | 0:57215055833e | 307 | TX.indexW = index; |
elpatosilva | 0:57215055833e | 308 | return false; |
elpatosilva | 0:57215055833e | 309 | } |
elpatosilva | 0:57215055833e | 310 | if(TX.indexR != TX.indexW || TX.empty){ |
elpatosilva | 0:57215055833e | 311 | TX.buf[TX.indexW++] = (uint8_t)(s/256); |
elpatosilva | 0:57215055833e | 312 | TX.chksum ^= (uint8_t)(s/256); |
elpatosilva | 0:57215055833e | 313 | }else{ |
elpatosilva | 0:57215055833e | 314 | TX.indexW = index; |
elpatosilva | 0:57215055833e | 315 | return false; |
elpatosilva | 0:57215055833e | 316 | } |
elpatosilva | 0:57215055833e | 317 | // escribo el separador |
elpatosilva | 0:57215055833e | 318 | if(TX.indexR != TX.indexW || TX.empty){ |
elpatosilva | 0:57215055833e | 319 | TX.buf[TX.indexW++] = header[6]; |
elpatosilva | 0:57215055833e | 320 | TX.chksum ^= header[6]; |
elpatosilva | 0:57215055833e | 321 | }else{ |
elpatosilva | 0:57215055833e | 322 | TX.indexW = index; |
elpatosilva | 0:57215055833e | 323 | return false; |
elpatosilva | 0:57215055833e | 324 | } |
elpatosilva | 0:57215055833e | 325 | return true; |
elpatosilva | 0:57215055833e | 326 | } |
elpatosilva | 0:57215055833e | 327 | |
elpatosilva | 0:57215055833e | 328 | // Escribe el byte en el buffer de salida, retorna falso si no hay lugar suficiente para hacerlo |
elpatosilva | 0:57215055833e | 329 | bool serialEnqueueData(uint8_t d){ |
elpatosilva | 0:57215055833e | 330 | if(TX.indexR != TX.indexW || TX.empty){ |
elpatosilva | 0:57215055833e | 331 | TX.buf[TX.indexW++] = d; |
elpatosilva | 0:57215055833e | 332 | TX.chksum ^= d; |
elpatosilva | 0:57215055833e | 333 | return true; |
elpatosilva | 0:57215055833e | 334 | }else{ |
elpatosilva | 0:57215055833e | 335 | TX.indexW--; |
elpatosilva | 0:57215055833e | 336 | return false; |
elpatosilva | 0:57215055833e | 337 | } |
elpatosilva | 0:57215055833e | 338 | } |
elpatosilva | 0:57215055833e | 339 | |
elpatosilva | 0:57215055833e | 340 | // Encola el checksum |
elpatosilva | 0:57215055833e | 341 | bool serialEnqueueChksum(){ |
elpatosilva | 0:57215055833e | 342 | return serialEnqueueData(TX.chksum); |
elpatosilva | 0:57215055833e | 343 | } |
elpatosilva | 0:57215055833e | 344 | |
elpatosilva | 0:57215055833e | 345 | |
elpatosilva | 0:57215055833e | 346 | /* |
elpatosilva | 0:57215055833e | 347 | * Borra el comando actual para que getFrame pueda recibir el siguiente |
elpatosilva | 0:57215055833e | 348 | * Necesario por cada overflow de us_ticker_read() |
elpatosilva | 0:57215055833e | 349 | */ |
elpatosilva | 0:57215055833e | 350 | void cleanCmd(){ |
elpatosilva | 0:57215055833e | 351 | RX.cmd = false; |
elpatosilva | 0:57215055833e | 352 | RX.cmdTime = 0; |
elpatosilva | 0:57215055833e | 353 | RX.indexR = RX.cmdIndex+RX.payloadSize; |
elpatosilva | 0:57215055833e | 354 | TX.cmdTime = 0; |
elpatosilva | 0:57215055833e | 355 | } |
elpatosilva | 0:57215055833e | 356 | |
elpatosilva | 0:57215055833e | 357 | |
elpatosilva | 0:57215055833e | 358 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
elpatosilva | 0:57215055833e | 359 | // MAIN |
elpatosilva | 0:57215055833e | 360 | |
elpatosilva | 0:57215055833e | 361 | |
elpatosilva | 0:57215055833e | 362 | int main(){ |
elpatosilva | 0:57215055833e | 363 | uint32_t maxUsTicker = us_ticker_read(); |
elpatosilva | 0:57215055833e | 364 | timer100ms.attach(&heartBeat, 0.1); |
elpatosilva | 0:57215055833e | 365 | serialSetup(19200); |
elpatosilva | 0:57215055833e | 366 | while(1){ |
elpatosilva | 0:57215055833e | 367 | // Overflow de us_ticker_read(), reseteo todo lo que utiliza este dato |
elpatosilva | 0:57215055833e | 368 | if(maxUsTicker > us_ticker_read()){ |
elpatosilva | 0:57215055833e | 369 | maxUsTicker = us_ticker_read(); |
elpatosilva | 0:57215055833e | 370 | cleanCmd(); |
elpatosilva | 0:57215055833e | 371 | } |
elpatosilva | 0:57215055833e | 372 | } |
elpatosilva | 0:57215055833e | 373 | } |
elpatosilva | 0:57215055833e | 374 |