Vicent Ibanyez / Mbed 2 deprecated EcotronV10
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?

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