guido glorioso
/
Tp-Terminado
f
main.cpp
- Committer:
- guidoglorioso
- Date:
- 2019-12-12
- Revision:
- 0:cd3f9689553a
File content as of revision 0:cd3f9689553a:
#include "mbed.h" #include "tsi_sensor.h" #define INICIO 0 #define RW 1 #define DISP 2 #define DISP_W 3 #define DISP_R 4 #define EST 5 #define VERIF 6 #define FIN 7 #define PWMD 8 #define PWMU 9 /* Cosas del TSI */ #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z) #define ELEC0 9 #define ELEC1 10 #elif defined (TARGET_KL05Z) #define ELEC0 9 #define ELEC1 8 #else #error TARGET NOT DEFINED #endif //Definimos que el puerto serie se llama pc Serial pc(USBTX, USBRX); //Variable donde se guarda lo recibido unsigned char c = '\0'; unsigned char slider=0, pote=0, verif; //bit usado como flag para procesar datos bool newdata = false; //Se pone en true cuando hay nuevos datos bool ejec = false; //Se pone en true cuando hay una trama correcta unsigned char rec[7]= {0}; //Creamos los tres leds pra usar DigitalIn bt1(PTA4,PullUp); DigitalIn bt2(PTA5,PullUp); DigitalOut LR(LED1); DigitalOut LG(LED2); DigitalOut LB(LED3); AnalogIn analo(PTB0); AnalogOut pwm (PTE30); //Callback cuando se detecta una entrada void onCharReceived() { //Copiamos lo leido en c c = pc.getc(); newdata = true; } bool recibiendo(void) { static unsigned char est=INICIO; switch(est) { default: case INICIO: if (c=='$') { //Si $ lo guardo en el char 0 de rec rec[0]=c; est=RW; } //Hacemos NULL c para que no vuelva a ejecutar c = '\0'; break; case RW: if ((c=='W')||(c=='R')) { //Si W o R lo guardo en el char 1 de rec rec[1]=c; est=DISP; } else { if(c=='P') { rec[1]=c; est=PWMD; } else { if(c=='$') { rec[0]=c; rec[1]=0; rec[2]=0; rec[3]=0; rec[4]=0; rec[5]=0; rec[6]=0; est=RW; } else { rec[0]=0; rec[1]=0; rec[2]=0; rec[3]=0; rec[4]=0; rec[5]=0; rec[6]=0; est=INICIO; } } } //Hacemos NULL c para que no vuelva a ejecutar c = '\0'; break; case DISP: if ((rec[1]=='R')&&((c=='L')||(c=='A')||(c=='D'))) { //Si leo y recibo L, A o D lo guardo en el char 2 de rec rec[2]=c; est=DISP_R; } else { if ((rec[1]=='W')&&(c=='L')) { //Si escribo y recibo L lo guardo en el char 2 de rec rec[2]=c; est=DISP_W; } else { if(c=='P') { rec[2]=c; rec[3]=0; rec[4]=0; est=VERIF; } else { if(c=='$') { rec[0]=c; rec[1]=0; rec[2]=0; rec[3]=0; rec[4]=0; rec[5]=0; rec[6]=0; est=RW; } else { rec[0]=0; rec[1]=0; rec[2]=0; rec[3]=0; rec[4]=0; rec[5]=0; rec[6]=0; est=INICIO; } } } } //Hacemos NULL c para que no vuelva a ejecutar c = '\0'; break; case DISP_W: if ((c=='R')||(c=='G')||(c=='B')) { //Si escribo y recibo G, B o R lo guardo en el char 3 de rec rec[3]=c; est=EST; } else { if(c=='$') { rec[0]=c; rec[1]=0; rec[2]=0; rec[3]=0; rec[4]=0; rec[5]=0; rec[6]=0; est=RW; } else { rec[0]=0; rec[1]=0; rec[2]=0; rec[3]=0; rec[4]=0; rec[5]=0; rec[6]=0; est=INICIO; } } c=0; break; case DISP_R: if ((c=='1')||(c=='2')||(c=='3')) { //Si leo y recibo 1 o 2 lo guardo en el char 3 de rec rec[3]=c; rec[4]=0; est=VERIF; } else { if(c=='$') { rec[0]=c; rec[1]=0; rec[2]=0; rec[3]=0; rec[4]=0; rec[5]=0; rec[6]=0; est=RW; } else { rec[0]=0; rec[1]=0; rec[2]=0; rec[3]=0; rec[4]=0; rec[5]=0; rec[6]=0; est=INICIO; } } //Hacemos NULL c para que no vuelva a ejecutar c=0; break; case EST: if ((c=='1')||(c=='0')) { //Si escribo y recibo 1 o 0 lo guardo en el char 4 de rec rec[4]=c; est=VERIF; } else { if(c=='$') { rec[0]=c; rec[1]=0; rec[2]=0; rec[3]=0; rec[4]=0; rec[5]=0; rec[6]=0; est=RW; } else { rec[0]=0; rec[1]=0; rec[2]=0; rec[3]=0; rec[4]=0; rec[5]=0; rec[6]=0; est=INICIO; } } //Hacemos NULL c para que no vuelva a ejecutar c=0; break; case VERIF: if(c==verif) { rec[5]=c;//Guarda la verificacion de la trama en rec 5 est=FIN; } else { if(c=='$') { rec[0]=c; rec[1]=0; rec[2]=0; rec[3]=0; rec[4]=0; rec[5]=0; rec[6]=0; est=RW; } else { rec[0]=0; rec[1]=0; rec[2]=0; rec[3]=0; rec[4]=0; rec[5]=0; rec[6]=0; est=INICIO; } } c=0; break; case FIN: if(c=='!') { //Si recibo !0 lo guardo en el char 6 de rec rec[6]=c; est=INICIO; //Hacemos NULL c para que no vuelva a ejecutar c=0; return (true); } else { if((c=='$')||((rec[5]=='$')&&((c=='W')||(c=='R')))) { if(c=='$') { rec[0]='$'; rec[1]=0; rec[2]=0; rec[3]=0; rec[4]=0; rec[5]=0; rec[6]=0; est=RW; } else { rec[0]='$'; rec[1]=c; rec[2]=0; rec[3]=0; rec[4]=0; rec[5]=0; rec[6]=0; est=DISP; } } else { rec[0]=0; rec[1]=0; rec[2]=0; rec[3]=0; rec[4]=0; rec[5]=0; rec[6]=0; est=INICIO; } } //Hacemos NULL c para que no vuelva a ejecutar c=0; break; case PWMD: if ((c>='0')&&(c<='9')) { //Si recibo de 0 a 9 o de A a F lo guardo en el char 2 de rec rec[2]=c; est=PWMU; } else { if(c=='$') { rec[0]=c; rec[1]=0; rec[2]=0; rec[3]=0; rec[4]=0; rec[5]=0; rec[6]=0; est=RW; } else { rec[0]=0; rec[1]=0; rec[2]=0; rec[3]=0; rec[4]=0; rec[5]=0; rec[6]=0; est=INICIO; } } //Hacemos NULL c para que no vuelva a ejecutar c=0; break; case PWMU: if (((c>='0')&&(c<='9'))||((c>='A')&&(c<='F'))) { //Si recibo de 0 a 9 o de A a F lo guardo en el char 2 de rec rec[3]=c; est=VERIF; } else { if(c=='$') { rec[0]=c; rec[1]=0; rec[2]=0; rec[3]=0; rec[4]=0; rec[5]=0; rec[6]=0; est=RW; } else { rec[0]=0; rec[1]=0; rec[2]=0; rec[3]=0; rec[4]=0; rec[5]=0; rec[6]=0; est=INICIO; } } //Hacemos NULL c para que no vuelva a ejecutar c=0; break; } return (false); } void interpretacion(void) { static unsigned char aux, aux2, aux3; if(rec[1]=='W') { if(rec[3]=='R') { if(rec[4]=='1') LR=0; if(rec[4]=='0') LR=1; printf("\n$RL1%d!\r\n",!LR); } if(rec[3]=='B') { if(rec[4]=='1') LB=0; if(rec[4]=='0') LB=1; printf("\n$RL3%d!\r\n",!LB); } if(rec[3]=='G') { if(rec[4]=='1') LG=0; if(rec[4]=='0') LG=1; printf("\n$RL2%d!\r\n",!LG); } } if(rec[1]=='R') { if(rec[2]=='L') { if(rec[3]=='1') printf("\n$RL1%d!\r\n",!LR); if(rec[3]=='2') printf("\n$RL2%d!\r\n",!LG); if(rec[3]=='3') printf("\n$RL3%d!\r\n",!LB); } if(rec[2]=='A') { if(rec[3]=='1') printf("\n$RA1%02X!\r\n",slider); if(rec[3]=='2') printf("\n$RA2%02X!\r\n",pote); } if(rec[2]=='D') { if(rec[3]=='1') printf("\n$RD1%d!\r\n",!bt1); if(rec[3]=='2') printf("\n$RD2%d!\r\n",!bt2); } if(rec[2]=='P') { aux = pwm*100; printf("\n$P%02X!\r\n", aux); } } if (rec[1]=='P') { if (rec[3]>='A') aux3 = rec[3]-'A'+10; else aux3 = rec[3]-'0'; aux2 = (16*(rec[2]-'0'))+aux3; pwm = (float) aux2/100; printf("\n$P%02X!\r\n", aux2); } } int main() { //Apagamos los leds LG=1; LR=1; LB=1; pwm=1; TSIAnalogSlider tsi(ELEC0, ELEC1, 40); //Ejecutar onCharReceived por cada entrada por puerto pc.attach(&onCharReceived); while (true) { verif=rec[1]^rec[2]^rec[3]; slider=255*tsi.readPercentage(); pote=255*analo.read(); if(newdata) { ejec=recibiendo(); newdata = false; } if(ejec) { interpretacion(); ejec=0; } } }