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
- Committer:
- vortex
- Date:
- 2012-01-21
- Revision:
- 0:bd7d090b088c
File content as of revision 0:bd7d090b088c:
/************************************
Software del mbed para el Ecotron.
(c) Miquel Carbonell Piqueres
Diciembre de 2011.
************************************/
/************************************
Arhivo: ecocommand.cpp
Clase para la interpretacion de comandos
************************************/
#include "mbed.h"
#include "ecocommand.h"
char *estados[NUMESTADOS]={"OK","PARAMS","COMAND","FORCEBATT","LOBATT"};
char *comandoRx[NUMCOMMANDSRX]={"$VM+VER?","$VM+CHKBAT=?","$VM+CHKBAT=ON","$VM+CHKBAT=OFF",
"$VM+CHKBAT=","$VM+OUT#","$VM+OUT%","$VM+IN#?","$VM+IN%?","$VM+IN?","$VM+?","$VM+TX="};
char *comandoTx[NUMCOMMANDSTX]={"IN#","IN%","H=1.0/S=0.1","OUT#","OUT%","STATUS("};
ecocommand::ecocommand(){
Estado=ESTADO_OK;
}
char *ecocommand::EstadoActual(){
switch(Estado){
case ESTADO_OK:
case ESTADO_PARAMS:
case ESTADO_COMAND:
case ESTADO_FORCEBATT:
case ESTADO_LOBATT:
return estados[Estado];
}
return NULL;
}
char *ecocommand::InterpretarComando(char *c, entradas *e, salidas *s){
int i=VerComandoRx(c);
if (i==ERROR_COD){
Estado=ESTADO_COMAND;
return NULL;
}
switch (i){
case COMANDO_VER:
Estado=ESTADO_OK;
sprintf(buffer,"H=1.0/S=1.0");
break;
case COMANDO_CHX:
case COMANDO_CHN:
case COMANDO_CHF:
case COMANDO_CHK: //No hay bateria en la version actual.
Estado=ESTADO_PARAMS;
break;
case COMANDO_OUD:
i=NumSalida(c);
Estado=ESTADO_OK;
VerOpcionSalidaDigital(i,c,s);
break;
case COMANDO_OUA:
i=NumSalida(c);
Estado=ESTADO_OK;
VerOpcionSalidaAnalogica(i,c,s);
break;
case COMANDO_IND:
Estado=ESTADO_OK;
VerEntradasDigitales(e);
break;
case COMANDO_INA:
Estado=ESTADO_OK;
VerEntradasAnalogicas(e);
break;
case COMANDO_INX:
Estado=ESTADO_OK;
VerEntradas(e);
break;
case COMANDO_TOT:
Estado=ESTADO_OK;
InformeGlobal(e,s);
break;
case COMANDO_TTX:
Estado=ESTADO_OK;
//Guardar el numero en flash.
sprintf(buffer,"STATUS(OK)");
break;
default:
Estado=ESTADO_COMAND;
}
switch (Estado){
case ESTADO_COMAND:
sprintf(buffer,"STATUS(COMAND)");
break;
case ESTADO_PARAMS:
sprintf(buffer,"STATUS(PARAMS)");
break;
default:
return buffer;
}
return buffer;
}
int ecocommand::VerComandoRx(char *c){
int i;
for (i=0; i<NUMCOMMANDSRX; ++i)
if (!strcmp(c,comandoRx[i]))
return i;
return ERROR_COD;
}
/****
Esta funcion averigua el numero de salida pasado
como texto en el comando c. Si no es un numero valido
devuelve ERROR_PARAMS.
****/
int ecocommand::NumSalida(char *c){
int i;
char n[3];
n[0]=c[8];
n[1]=c[9];
n[2]='\x0';
i=atoi(n);
if (i<=0)
return ERROR_PAR;
return i;
}
/****
Devuelve la cadena correspondiente a las distintas
opciones posibles de entrada como son "?", "=ON", "=OFF",
para la salida numero i.
Si la salida i no existe, devuelve null.
Si las opciones no son vlaidas, devuelve null.
****/
void ecocommand::VerOpcionSalidaDigital(int i,char *c, salidas *s){
if (!strcmp(&c[10],"=?")){
switch (s->VerSalidaDigital(i)){
case E_NOTIPO:
case E_NOEXIST:
Estado=ESTADO_PARAMS;
return;
case ID_DIGITAL_ON:
Estado=ESTADO_OK;
sprintf(buffer,"OUT#%d=ON",i);
return;
case ID_DIGITAL_OFF:
Estado=ESTADO_OK;
sprintf(buffer,"OUT#%d=OFF",i);
return;
default:
Estado=ESTADO_PARAMS;
return;
}
}
if (!strcmp(&c[10],"=ON")){
if (s->PonSalidaDigital(i,true)){
Estado=ESTADO_OK;
sprintf(buffer,"OUT#%d=ON",i);
return;
}
else{
Estado=ESTADO_PARAMS;
return;
}
}
if (!strcmp(&c[10],"=OFF")){
if (s->PonSalidaDigital(i,false)){
Estado=ESTADO_OK;
sprintf(buffer,"OUT#%d=OFF",i);
return;
}
else{
Estado=ESTADO_PARAMS;
return;
}
}
Estado=ESTADO_PARAMS;
}
void ecocommand::VerOpcionSalidaAnalogica(int i,char *c,salidas *s){
int j;
float f;
if (!strcmp(&c[10],"=?")){
j=s->VerSalidaAnalogica(i);
switch (j){
case E_NOTIPO:
case E_NOEXIST:
Estado=ESTADO_PARAMS;
return;
default:
Estado=ESTADO_OK;
sprintf(buffer,"OUT%%%d=%d",i,j);
return;
}
}
f=atof(&c[11]); //f= valor requerido en la salida.
if (s->PonSalidaAnalogica(i,f)){
Estado=ESTADO_OK;
sprintf(buffer,"OUT%%%d=%f.1",i,f);
return;
}
Estado=ESTADO_PARAMS;
}
void ecocommand::VerEntradasDigitales(entradas *e){
int i;
char bufferLocal[8];
sprintf(buffer,"IN#={");
for (i=0; i<MAX_ENTRADAS; ++i)
if (e->TipoEntrada(i)==ID_DIGITAL){
if (e->VerEntradaDigital(i)==ID_DIGITAL_ON)
sprintf(bufferLocal,"%d=1",i);
else
sprintf(bufferLocal,"%d=0",i);
strcat(buffer,bufferLocal);
if (i<MAX_ENTRADAS-1)
strcat(buffer,";");
}
strcat(buffer,"}");
}
void ecocommand::VerEntradasAnalogicas(entradas *e){
int i;
float f;
char bufferLocal[8];
sprintf(buffer,"IN%={");
for (i=0; i<MAX_ENTRADAS; ++i)
if (e->TipoEntrada(i)==ID_ANALOGICA){
f=e->VerEntradaAnalogica(i);
sprintf(bufferLocal,"%d=%f.1",i,f);
strcat(buffer,bufferLocal);
if (i<MAX_ENTRADAS-1)
strcat(buffer,";");
}
strcat(buffer,"}");
}
void ecocommand::VerEntradas(entradas *e){
char bufferLocal[MAX_COD];
VerEntradasDigitales(e);
strcpy(bufferLocal,buffer);
VerEntradasAnalogicas(e);
strcat(bufferLocal,buffer);
strcpy(buffer,bufferLocal);
}
void ecocommand::InformeGlobal(entradas *e, salidas *s){
char bufferLocal[MAX_COD];
int i;
VerEntradas(e);
strcpy(bufferLocal,buffer);
for (i=0; i<MAX_SALIDAS; ++i){
if (s->TipoSalida(i+1)==ID_DIGITAL){
VerOpcionSalidaDigital(i+1,"$VM+OUT#nn=?",s);
strcat(bufferLocal,buffer);
}
else{
VerOpcionSalidaAnalogica(i+1,"$VM+OUT%nn=?",s);
strcat(bufferLocal,buffer);
}
strcat(bufferLocal,";");
}
strcpy(buffer,bufferLocal);
}