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.
ecocommand.cpp@0:bd7d090b088c, 2012-01-21 (annotated)
- Committer:
- vortex
- Date:
- Sat Jan 21 08:57:07 2012 +0000
- Revision:
- 0:bd7d090b088c
Rev 1.0 NO PROBADA
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| vortex | 0:bd7d090b088c | 1 | /************************************ |
| vortex | 0:bd7d090b088c | 2 | Software del mbed para el Ecotron. |
| vortex | 0:bd7d090b088c | 3 | (c) Miquel Carbonell Piqueres |
| vortex | 0:bd7d090b088c | 4 | Diciembre de 2011. |
| vortex | 0:bd7d090b088c | 5 | ************************************/ |
| vortex | 0:bd7d090b088c | 6 | /************************************ |
| vortex | 0:bd7d090b088c | 7 | Arhivo: ecocommand.cpp |
| vortex | 0:bd7d090b088c | 8 | Clase para la interpretacion de comandos |
| vortex | 0:bd7d090b088c | 9 | ************************************/ |
| vortex | 0:bd7d090b088c | 10 | |
| vortex | 0:bd7d090b088c | 11 | #include "mbed.h" |
| vortex | 0:bd7d090b088c | 12 | #include "ecocommand.h" |
| vortex | 0:bd7d090b088c | 13 | |
| vortex | 0:bd7d090b088c | 14 | |
| vortex | 0:bd7d090b088c | 15 | char *estados[NUMESTADOS]={"OK","PARAMS","COMAND","FORCEBATT","LOBATT"}; |
| vortex | 0:bd7d090b088c | 16 | |
| vortex | 0:bd7d090b088c | 17 | char *comandoRx[NUMCOMMANDSRX]={"$VM+VER?","$VM+CHKBAT=?","$VM+CHKBAT=ON","$VM+CHKBAT=OFF", |
| vortex | 0:bd7d090b088c | 18 | "$VM+CHKBAT=","$VM+OUT#","$VM+OUT%","$VM+IN#?","$VM+IN%?","$VM+IN?","$VM+?","$VM+TX="}; |
| vortex | 0:bd7d090b088c | 19 | |
| vortex | 0:bd7d090b088c | 20 | char *comandoTx[NUMCOMMANDSTX]={"IN#","IN%","H=1.0/S=0.1","OUT#","OUT%","STATUS("}; |
| vortex | 0:bd7d090b088c | 21 | |
| vortex | 0:bd7d090b088c | 22 | |
| vortex | 0:bd7d090b088c | 23 | ecocommand::ecocommand(){ |
| vortex | 0:bd7d090b088c | 24 | |
| vortex | 0:bd7d090b088c | 25 | Estado=ESTADO_OK; |
| vortex | 0:bd7d090b088c | 26 | } |
| vortex | 0:bd7d090b088c | 27 | |
| vortex | 0:bd7d090b088c | 28 | char *ecocommand::EstadoActual(){ |
| vortex | 0:bd7d090b088c | 29 | |
| vortex | 0:bd7d090b088c | 30 | switch(Estado){ |
| vortex | 0:bd7d090b088c | 31 | case ESTADO_OK: |
| vortex | 0:bd7d090b088c | 32 | case ESTADO_PARAMS: |
| vortex | 0:bd7d090b088c | 33 | case ESTADO_COMAND: |
| vortex | 0:bd7d090b088c | 34 | case ESTADO_FORCEBATT: |
| vortex | 0:bd7d090b088c | 35 | case ESTADO_LOBATT: |
| vortex | 0:bd7d090b088c | 36 | return estados[Estado]; |
| vortex | 0:bd7d090b088c | 37 | } |
| vortex | 0:bd7d090b088c | 38 | return NULL; |
| vortex | 0:bd7d090b088c | 39 | } |
| vortex | 0:bd7d090b088c | 40 | |
| vortex | 0:bd7d090b088c | 41 | char *ecocommand::InterpretarComando(char *c, entradas *e, salidas *s){ |
| vortex | 0:bd7d090b088c | 42 | |
| vortex | 0:bd7d090b088c | 43 | int i=VerComandoRx(c); |
| vortex | 0:bd7d090b088c | 44 | if (i==ERROR_COD){ |
| vortex | 0:bd7d090b088c | 45 | Estado=ESTADO_COMAND; |
| vortex | 0:bd7d090b088c | 46 | return NULL; |
| vortex | 0:bd7d090b088c | 47 | } |
| vortex | 0:bd7d090b088c | 48 | switch (i){ |
| vortex | 0:bd7d090b088c | 49 | case COMANDO_VER: |
| vortex | 0:bd7d090b088c | 50 | Estado=ESTADO_OK; |
| vortex | 0:bd7d090b088c | 51 | sprintf(buffer,"H=1.0/S=1.0"); |
| vortex | 0:bd7d090b088c | 52 | break; |
| vortex | 0:bd7d090b088c | 53 | case COMANDO_CHX: |
| vortex | 0:bd7d090b088c | 54 | case COMANDO_CHN: |
| vortex | 0:bd7d090b088c | 55 | case COMANDO_CHF: |
| vortex | 0:bd7d090b088c | 56 | case COMANDO_CHK: //No hay bateria en la version actual. |
| vortex | 0:bd7d090b088c | 57 | Estado=ESTADO_PARAMS; |
| vortex | 0:bd7d090b088c | 58 | break; |
| vortex | 0:bd7d090b088c | 59 | case COMANDO_OUD: |
| vortex | 0:bd7d090b088c | 60 | i=NumSalida(c); |
| vortex | 0:bd7d090b088c | 61 | Estado=ESTADO_OK; |
| vortex | 0:bd7d090b088c | 62 | VerOpcionSalidaDigital(i,c,s); |
| vortex | 0:bd7d090b088c | 63 | break; |
| vortex | 0:bd7d090b088c | 64 | case COMANDO_OUA: |
| vortex | 0:bd7d090b088c | 65 | i=NumSalida(c); |
| vortex | 0:bd7d090b088c | 66 | Estado=ESTADO_OK; |
| vortex | 0:bd7d090b088c | 67 | VerOpcionSalidaAnalogica(i,c,s); |
| vortex | 0:bd7d090b088c | 68 | break; |
| vortex | 0:bd7d090b088c | 69 | case COMANDO_IND: |
| vortex | 0:bd7d090b088c | 70 | Estado=ESTADO_OK; |
| vortex | 0:bd7d090b088c | 71 | VerEntradasDigitales(e); |
| vortex | 0:bd7d090b088c | 72 | break; |
| vortex | 0:bd7d090b088c | 73 | case COMANDO_INA: |
| vortex | 0:bd7d090b088c | 74 | Estado=ESTADO_OK; |
| vortex | 0:bd7d090b088c | 75 | VerEntradasAnalogicas(e); |
| vortex | 0:bd7d090b088c | 76 | break; |
| vortex | 0:bd7d090b088c | 77 | case COMANDO_INX: |
| vortex | 0:bd7d090b088c | 78 | Estado=ESTADO_OK; |
| vortex | 0:bd7d090b088c | 79 | VerEntradas(e); |
| vortex | 0:bd7d090b088c | 80 | break; |
| vortex | 0:bd7d090b088c | 81 | case COMANDO_TOT: |
| vortex | 0:bd7d090b088c | 82 | Estado=ESTADO_OK; |
| vortex | 0:bd7d090b088c | 83 | InformeGlobal(e,s); |
| vortex | 0:bd7d090b088c | 84 | break; |
| vortex | 0:bd7d090b088c | 85 | case COMANDO_TTX: |
| vortex | 0:bd7d090b088c | 86 | Estado=ESTADO_OK; |
| vortex | 0:bd7d090b088c | 87 | //Guardar el numero en flash. |
| vortex | 0:bd7d090b088c | 88 | sprintf(buffer,"STATUS(OK)"); |
| vortex | 0:bd7d090b088c | 89 | break; |
| vortex | 0:bd7d090b088c | 90 | default: |
| vortex | 0:bd7d090b088c | 91 | Estado=ESTADO_COMAND; |
| vortex | 0:bd7d090b088c | 92 | } |
| vortex | 0:bd7d090b088c | 93 | switch (Estado){ |
| vortex | 0:bd7d090b088c | 94 | case ESTADO_COMAND: |
| vortex | 0:bd7d090b088c | 95 | sprintf(buffer,"STATUS(COMAND)"); |
| vortex | 0:bd7d090b088c | 96 | break; |
| vortex | 0:bd7d090b088c | 97 | case ESTADO_PARAMS: |
| vortex | 0:bd7d090b088c | 98 | sprintf(buffer,"STATUS(PARAMS)"); |
| vortex | 0:bd7d090b088c | 99 | break; |
| vortex | 0:bd7d090b088c | 100 | default: |
| vortex | 0:bd7d090b088c | 101 | return buffer; |
| vortex | 0:bd7d090b088c | 102 | } |
| vortex | 0:bd7d090b088c | 103 | return buffer; |
| vortex | 0:bd7d090b088c | 104 | } |
| vortex | 0:bd7d090b088c | 105 | |
| vortex | 0:bd7d090b088c | 106 | |
| vortex | 0:bd7d090b088c | 107 | int ecocommand::VerComandoRx(char *c){ |
| vortex | 0:bd7d090b088c | 108 | |
| vortex | 0:bd7d090b088c | 109 | int i; |
| vortex | 0:bd7d090b088c | 110 | for (i=0; i<NUMCOMMANDSRX; ++i) |
| vortex | 0:bd7d090b088c | 111 | if (!strcmp(c,comandoRx[i])) |
| vortex | 0:bd7d090b088c | 112 | return i; |
| vortex | 0:bd7d090b088c | 113 | return ERROR_COD; |
| vortex | 0:bd7d090b088c | 114 | } |
| vortex | 0:bd7d090b088c | 115 | |
| vortex | 0:bd7d090b088c | 116 | /**** |
| vortex | 0:bd7d090b088c | 117 | Esta funcion averigua el numero de salida pasado |
| vortex | 0:bd7d090b088c | 118 | como texto en el comando c. Si no es un numero valido |
| vortex | 0:bd7d090b088c | 119 | devuelve ERROR_PARAMS. |
| vortex | 0:bd7d090b088c | 120 | ****/ |
| vortex | 0:bd7d090b088c | 121 | int ecocommand::NumSalida(char *c){ |
| vortex | 0:bd7d090b088c | 122 | |
| vortex | 0:bd7d090b088c | 123 | int i; |
| vortex | 0:bd7d090b088c | 124 | char n[3]; |
| vortex | 0:bd7d090b088c | 125 | n[0]=c[8]; |
| vortex | 0:bd7d090b088c | 126 | n[1]=c[9]; |
| vortex | 0:bd7d090b088c | 127 | n[2]='\x0'; |
| vortex | 0:bd7d090b088c | 128 | i=atoi(n); |
| vortex | 0:bd7d090b088c | 129 | if (i<=0) |
| vortex | 0:bd7d090b088c | 130 | return ERROR_PAR; |
| vortex | 0:bd7d090b088c | 131 | return i; |
| vortex | 0:bd7d090b088c | 132 | } |
| vortex | 0:bd7d090b088c | 133 | |
| vortex | 0:bd7d090b088c | 134 | /**** |
| vortex | 0:bd7d090b088c | 135 | Devuelve la cadena correspondiente a las distintas |
| vortex | 0:bd7d090b088c | 136 | opciones posibles de entrada como son "?", "=ON", "=OFF", |
| vortex | 0:bd7d090b088c | 137 | para la salida numero i. |
| vortex | 0:bd7d090b088c | 138 | Si la salida i no existe, devuelve null. |
| vortex | 0:bd7d090b088c | 139 | Si las opciones no son vlaidas, devuelve null. |
| vortex | 0:bd7d090b088c | 140 | ****/ |
| vortex | 0:bd7d090b088c | 141 | void ecocommand::VerOpcionSalidaDigital(int i,char *c, salidas *s){ |
| vortex | 0:bd7d090b088c | 142 | |
| vortex | 0:bd7d090b088c | 143 | if (!strcmp(&c[10],"=?")){ |
| vortex | 0:bd7d090b088c | 144 | switch (s->VerSalidaDigital(i)){ |
| vortex | 0:bd7d090b088c | 145 | case E_NOTIPO: |
| vortex | 0:bd7d090b088c | 146 | case E_NOEXIST: |
| vortex | 0:bd7d090b088c | 147 | Estado=ESTADO_PARAMS; |
| vortex | 0:bd7d090b088c | 148 | return; |
| vortex | 0:bd7d090b088c | 149 | case ID_DIGITAL_ON: |
| vortex | 0:bd7d090b088c | 150 | Estado=ESTADO_OK; |
| vortex | 0:bd7d090b088c | 151 | sprintf(buffer,"OUT#%d=ON",i); |
| vortex | 0:bd7d090b088c | 152 | return; |
| vortex | 0:bd7d090b088c | 153 | case ID_DIGITAL_OFF: |
| vortex | 0:bd7d090b088c | 154 | Estado=ESTADO_OK; |
| vortex | 0:bd7d090b088c | 155 | sprintf(buffer,"OUT#%d=OFF",i); |
| vortex | 0:bd7d090b088c | 156 | return; |
| vortex | 0:bd7d090b088c | 157 | default: |
| vortex | 0:bd7d090b088c | 158 | Estado=ESTADO_PARAMS; |
| vortex | 0:bd7d090b088c | 159 | return; |
| vortex | 0:bd7d090b088c | 160 | } |
| vortex | 0:bd7d090b088c | 161 | } |
| vortex | 0:bd7d090b088c | 162 | if (!strcmp(&c[10],"=ON")){ |
| vortex | 0:bd7d090b088c | 163 | if (s->PonSalidaDigital(i,true)){ |
| vortex | 0:bd7d090b088c | 164 | Estado=ESTADO_OK; |
| vortex | 0:bd7d090b088c | 165 | sprintf(buffer,"OUT#%d=ON",i); |
| vortex | 0:bd7d090b088c | 166 | return; |
| vortex | 0:bd7d090b088c | 167 | } |
| vortex | 0:bd7d090b088c | 168 | else{ |
| vortex | 0:bd7d090b088c | 169 | Estado=ESTADO_PARAMS; |
| vortex | 0:bd7d090b088c | 170 | return; |
| vortex | 0:bd7d090b088c | 171 | } |
| vortex | 0:bd7d090b088c | 172 | } |
| vortex | 0:bd7d090b088c | 173 | if (!strcmp(&c[10],"=OFF")){ |
| vortex | 0:bd7d090b088c | 174 | if (s->PonSalidaDigital(i,false)){ |
| vortex | 0:bd7d090b088c | 175 | Estado=ESTADO_OK; |
| vortex | 0:bd7d090b088c | 176 | sprintf(buffer,"OUT#%d=OFF",i); |
| vortex | 0:bd7d090b088c | 177 | return; |
| vortex | 0:bd7d090b088c | 178 | } |
| vortex | 0:bd7d090b088c | 179 | else{ |
| vortex | 0:bd7d090b088c | 180 | Estado=ESTADO_PARAMS; |
| vortex | 0:bd7d090b088c | 181 | return; |
| vortex | 0:bd7d090b088c | 182 | } |
| vortex | 0:bd7d090b088c | 183 | } |
| vortex | 0:bd7d090b088c | 184 | Estado=ESTADO_PARAMS; |
| vortex | 0:bd7d090b088c | 185 | } |
| vortex | 0:bd7d090b088c | 186 | |
| vortex | 0:bd7d090b088c | 187 | |
| vortex | 0:bd7d090b088c | 188 | void ecocommand::VerOpcionSalidaAnalogica(int i,char *c,salidas *s){ |
| vortex | 0:bd7d090b088c | 189 | |
| vortex | 0:bd7d090b088c | 190 | int j; |
| vortex | 0:bd7d090b088c | 191 | float f; |
| vortex | 0:bd7d090b088c | 192 | if (!strcmp(&c[10],"=?")){ |
| vortex | 0:bd7d090b088c | 193 | j=s->VerSalidaAnalogica(i); |
| vortex | 0:bd7d090b088c | 194 | switch (j){ |
| vortex | 0:bd7d090b088c | 195 | case E_NOTIPO: |
| vortex | 0:bd7d090b088c | 196 | case E_NOEXIST: |
| vortex | 0:bd7d090b088c | 197 | Estado=ESTADO_PARAMS; |
| vortex | 0:bd7d090b088c | 198 | return; |
| vortex | 0:bd7d090b088c | 199 | default: |
| vortex | 0:bd7d090b088c | 200 | Estado=ESTADO_OK; |
| vortex | 0:bd7d090b088c | 201 | sprintf(buffer,"OUT%%%d=%d",i,j); |
| vortex | 0:bd7d090b088c | 202 | return; |
| vortex | 0:bd7d090b088c | 203 | } |
| vortex | 0:bd7d090b088c | 204 | } |
| vortex | 0:bd7d090b088c | 205 | f=atof(&c[11]); //f= valor requerido en la salida. |
| vortex | 0:bd7d090b088c | 206 | if (s->PonSalidaAnalogica(i,f)){ |
| vortex | 0:bd7d090b088c | 207 | Estado=ESTADO_OK; |
| vortex | 0:bd7d090b088c | 208 | sprintf(buffer,"OUT%%%d=%f.1",i,f); |
| vortex | 0:bd7d090b088c | 209 | return; |
| vortex | 0:bd7d090b088c | 210 | } |
| vortex | 0:bd7d090b088c | 211 | Estado=ESTADO_PARAMS; |
| vortex | 0:bd7d090b088c | 212 | } |
| vortex | 0:bd7d090b088c | 213 | |
| vortex | 0:bd7d090b088c | 214 | void ecocommand::VerEntradasDigitales(entradas *e){ |
| vortex | 0:bd7d090b088c | 215 | |
| vortex | 0:bd7d090b088c | 216 | int i; |
| vortex | 0:bd7d090b088c | 217 | char bufferLocal[8]; |
| vortex | 0:bd7d090b088c | 218 | sprintf(buffer,"IN#={"); |
| vortex | 0:bd7d090b088c | 219 | for (i=0; i<MAX_ENTRADAS; ++i) |
| vortex | 0:bd7d090b088c | 220 | if (e->TipoEntrada(i)==ID_DIGITAL){ |
| vortex | 0:bd7d090b088c | 221 | if (e->VerEntradaDigital(i)==ID_DIGITAL_ON) |
| vortex | 0:bd7d090b088c | 222 | sprintf(bufferLocal,"%d=1",i); |
| vortex | 0:bd7d090b088c | 223 | else |
| vortex | 0:bd7d090b088c | 224 | sprintf(bufferLocal,"%d=0",i); |
| vortex | 0:bd7d090b088c | 225 | strcat(buffer,bufferLocal); |
| vortex | 0:bd7d090b088c | 226 | if (i<MAX_ENTRADAS-1) |
| vortex | 0:bd7d090b088c | 227 | strcat(buffer,";"); |
| vortex | 0:bd7d090b088c | 228 | } |
| vortex | 0:bd7d090b088c | 229 | strcat(buffer,"}"); |
| vortex | 0:bd7d090b088c | 230 | } |
| vortex | 0:bd7d090b088c | 231 | |
| vortex | 0:bd7d090b088c | 232 | void ecocommand::VerEntradasAnalogicas(entradas *e){ |
| vortex | 0:bd7d090b088c | 233 | |
| vortex | 0:bd7d090b088c | 234 | int i; |
| vortex | 0:bd7d090b088c | 235 | float f; |
| vortex | 0:bd7d090b088c | 236 | char bufferLocal[8]; |
| vortex | 0:bd7d090b088c | 237 | sprintf(buffer,"IN%={"); |
| vortex | 0:bd7d090b088c | 238 | for (i=0; i<MAX_ENTRADAS; ++i) |
| vortex | 0:bd7d090b088c | 239 | if (e->TipoEntrada(i)==ID_ANALOGICA){ |
| vortex | 0:bd7d090b088c | 240 | f=e->VerEntradaAnalogica(i); |
| vortex | 0:bd7d090b088c | 241 | sprintf(bufferLocal,"%d=%f.1",i,f); |
| vortex | 0:bd7d090b088c | 242 | strcat(buffer,bufferLocal); |
| vortex | 0:bd7d090b088c | 243 | if (i<MAX_ENTRADAS-1) |
| vortex | 0:bd7d090b088c | 244 | strcat(buffer,";"); |
| vortex | 0:bd7d090b088c | 245 | } |
| vortex | 0:bd7d090b088c | 246 | strcat(buffer,"}"); |
| vortex | 0:bd7d090b088c | 247 | } |
| vortex | 0:bd7d090b088c | 248 | |
| vortex | 0:bd7d090b088c | 249 | void ecocommand::VerEntradas(entradas *e){ |
| vortex | 0:bd7d090b088c | 250 | |
| vortex | 0:bd7d090b088c | 251 | char bufferLocal[MAX_COD]; |
| vortex | 0:bd7d090b088c | 252 | VerEntradasDigitales(e); |
| vortex | 0:bd7d090b088c | 253 | strcpy(bufferLocal,buffer); |
| vortex | 0:bd7d090b088c | 254 | VerEntradasAnalogicas(e); |
| vortex | 0:bd7d090b088c | 255 | strcat(bufferLocal,buffer); |
| vortex | 0:bd7d090b088c | 256 | strcpy(buffer,bufferLocal); |
| vortex | 0:bd7d090b088c | 257 | } |
| vortex | 0:bd7d090b088c | 258 | |
| vortex | 0:bd7d090b088c | 259 | void ecocommand::InformeGlobal(entradas *e, salidas *s){ |
| vortex | 0:bd7d090b088c | 260 | |
| vortex | 0:bd7d090b088c | 261 | char bufferLocal[MAX_COD]; |
| vortex | 0:bd7d090b088c | 262 | int i; |
| vortex | 0:bd7d090b088c | 263 | VerEntradas(e); |
| vortex | 0:bd7d090b088c | 264 | strcpy(bufferLocal,buffer); |
| vortex | 0:bd7d090b088c | 265 | for (i=0; i<MAX_SALIDAS; ++i){ |
| vortex | 0:bd7d090b088c | 266 | if (s->TipoSalida(i+1)==ID_DIGITAL){ |
| vortex | 0:bd7d090b088c | 267 | VerOpcionSalidaDigital(i+1,"$VM+OUT#nn=?",s); |
| vortex | 0:bd7d090b088c | 268 | strcat(bufferLocal,buffer); |
| vortex | 0:bd7d090b088c | 269 | } |
| vortex | 0:bd7d090b088c | 270 | else{ |
| vortex | 0:bd7d090b088c | 271 | VerOpcionSalidaAnalogica(i+1,"$VM+OUT%nn=?",s); |
| vortex | 0:bd7d090b088c | 272 | strcat(bufferLocal,buffer); |
| vortex | 0:bd7d090b088c | 273 | } |
| vortex | 0:bd7d090b088c | 274 | strcat(bufferLocal,";"); |
| vortex | 0:bd7d090b088c | 275 | } |
| vortex | 0:bd7d090b088c | 276 | strcpy(buffer,bufferLocal); |
| vortex | 0:bd7d090b088c | 277 | } |