Facundo Sussini
/
TP2_Protocolos
Integrantes: Facundo Carmona, Facundo Sussini. 6B Tecnica
main.cpp
- Committer:
- Susso
- Date:
- 2019-06-27
- Revision:
- 0:2751a945563b
File content as of revision 0:2751a945563b:
#include "mbed.h" #include "tsi_sensor.h" /* This defines will be replaced by PinNames soon */ #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 //elaciono palabras con numeros #define verificacion 0 #define inicio 0 #define accion 1 #define eleccion 2 #define pata 3 #define estado 4 #define verificacionA 5 #define verificacionB 6 #define fin 7 #define escritura 1 #define leida 2 /* lista de combinaciones y sus respectivos numeros hexagesimales: WLR0 ----> 79 WLR1 ----> 78 WLG0 ----> 6c WLG1 ----> 6d WLB0 ----> 69 WLB1 ----> 68 RLB- ----> 71 RLG- ----> 74 RLR- ----> 61 RA0- ----> 0e RA1- ----> 0f RI0- ----> 06 RI0- ----> 07 */ //defino entradas y salidas DigitalOut rojo(LED_RED); DigitalOut verde(LED_GREEN); DigitalOut azul(LED_BLUE); AnalogIn preset(A0); DigitalIn entrada1(D2); DigitalIn entrada2(D3); TSIAnalogSlider tsi(ELEC0, ELEC1, 40); //Creamos los tres leds pra usar DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); //Definimos que el puerto serie se llama pc Serial pc(USBTX, USBRX); //Variable donde se guarda lo leido char c = '\0'; //bit usado como flag para procesar datos bool newdata = false; //Se pone en true cuando hay nuevos datos //Callback cuando se detecta una entrada void onCharReceived() { //Copiamos lo leido en c c=pc.getc(); newdata = true; } //defino funcion principal void correo(); //defino variables a usar char lectura=0, accione=0, action=0, sondeo=0, reinicio=0, x=0,trama[9], exorcismo=0, examenA=0, examenB=0, bloqueo1=0; char exa[17]= {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; int main() { //Apagamos los leds rojo = 1; verde = 1; azul = 1; //Ejecutar onCharReceived por cada entrada por puerto pc.attach(&onCharReceived); while (true) { correo();//llamo a la funcion } } /*----------------------funcion principal-------------------------------------*/ void correo() { switch(lectura) {//maquina de estados principal /* cuando debo verificar cada dato que recibo de la PC */ default: case verificacion: if(newdata) {//cuando recibo datos de la PC newdata = false; switch(sondeo) {// maquina de estados cada vez que recibo un dato y verifico si esta bien el protocolo enviado default: case inicio://bit de inicio if(c=='$') {// si el bit es correcto trama[0]=c;// agrego lo recibido en un vector sondeo=accion;// paso a la siguiente maquina de estado } break; case accion:// bit de leida o de escritura if(c=='W'||c=='R') {// si recibo W o R trama[1]=c;// agrego lo recibido en un vector if(c=='W')// si el bit es W action=escritura;//defino la accion que se hara despues de comprobar else if(c=='R') action=leida;//defino la accion que se hara despues de comprobar sondeo=eleccion;// paso a la siguiente maquina de estado } else sondeo=inicio;// si el bit no es el deseado, vuelvo al inicio de espera del bit de inicio break; case eleccion://bit de led, analogica y digital if(c=='L'||c=='A'||c=='I') {// si reibo los bits deseados trama[2]=c;// agrego lo recibido en un vector sondeo=pata;// paso a la siguiente maquina de estado } else sondeo=inicio;// si el bit no es el deseado, vuelvo al inicio de espera del bit de inicio break; case pata:// bit de pata o led a modificar if(c=='R'||c=='G'||c=='B'||c=='0'||c=='1') {// si recibo los bits deseados trama[3]=c;// agrego lo recibido en un vector sondeo=estado;// paso a la siguiente maquina de estado } else sondeo=inicio;// si el bit no es el deseado, vuelvo al inicio de espera del bit de inicio break; case estado:// bit de estado de led o nada if(c=='0'||c=='1'||c=='-') {// si recibo los bits deseados trama[4]=c;// agrego lo recibido en un vector sondeo=verificacionA;// paso a la siguiente maquina de estado } else sondeo=inicio;// si el bit no es el deseado, vuelvo al inicio de espera del bit de inicio break; case verificacionA:// bit de verificacion if(c=='A'||c=='B'||c=='C'||c=='D'||c=='E'||c=='F'||c=='0'||c=='1'||c=='2'||c=='3'||c=='4'||c=='5'||c=='6'||c=='7'||c=='8'||c=='9') {// si recibo los bits deseados trama[5]=c;// agrego lo recibido en un vector sondeo=verificacionB;// paso a la siguiente maquina de estado } else sondeo=inicio;// si el bit no es el deseado, vuelvo al inicio de espera del bit de inicio break; case verificacionB:// bit de verificacion if(c=='A'||c=='B'||c=='C'||c=='D'||c=='E'||c=='F'||c=='0'||c=='1'||c=='2'||c=='3'||c=='4'||c=='5'||c=='6'||c=='7'||c=='8'||c=='9') {// si recibo los bits deseados trama[6]=c;// agrego lo recibido en un vector sondeo=fin;// paso a la siguiente maquina de estado } else sondeo=inicio;// si el bit no es el deseado, vuelvo al inicio de espera del bit de inicio break; case fin:// bit de fin trama[7]=c;// agrego lo recibido en un vector if(c=='!') {// si recibo el bit deseados bloqueo1=0;// reseteo bloqueo exorcismo= trama[1] ^ trama[2] ^ trama[3] ^ trama[4];// hago un xor con los bits que recibo examenA= exorcismo % 16;//convierto el el resultado de xor a hexagesimal examenB= exorcismo / 16;//convierto el el resultado de xor a hexagesimal sondeo=inicio;// reseteo la maquina de estados de verificacion } else sondeo=inicio;// si el bit no es el deseado, vuelvo al inicio de espera del bit de inicio break; } break; } if(trama[5]==exa[examenB] && trama[6]==exa[examenA] && trama[7]=='!' && bloqueo1==0) {// si la verificacion es correcta y se termino de leer el protocolo bloqueo1=1;//se usa para que solo para que solo se entre una vez y no se repita hasta que no se termine de leer el protocolo completo if(action==escritura)//si se decidio escribir lectura=escritura;// despues de leer el protocolo paso a escribir else if(action==leida)// si se decidio leer lectura=leida;// despues de leer el protocolo paso a leer } else if(trama[5]!=exa[examenB] && trama[6]!=exa[examenA] && trama[7]=='!' && bloqueo1==0) {// si la verificacion es incorrecta y se termino de leer el protocolo bloqueo1=1;//se usa para que solo para que solo se entre una vez y no se repita hasta que no se termine de leer el protocolo completo printf("Ah ,ah ,ah. No dijiste la palabra magica \r\n"); lectura=sondeo;// si la verificacion es incorecta, vuelvo al inicio de la verificacion } break; case leida:// maquina de estado para leer if(trama[1]=='R' && trama[2]=='L' && trama[3]=='B' && trama[4]=='-') {// si quiero saber el estado del led azul if(azul==1)// si el led esta encendido printf("$RLB0!"); else// si el led esta apagado printf("$RLB1!"); } else if(trama[1]=='R' && trama[2]=='L' && trama[3]=='G' && trama[4]=='-') {// si quiero saber el estado del led verde if(verde==1)// si el led esta encendido printf("$RLG0!"); else// si el led esta apagado printf("$RLG1!"); } else if(trama[1]=='R' && trama[2]=='L' && trama[3]=='R' && trama[4]=='-') {// si quiero saber el estado del led rojo if(rojo==1)// si el led esta encendido printf("$RLR0!"); else// si el led esta apagado printf("$RLR1!"); } else if(trama[1]=='R' && trama[2]=='A' && trama[3]=='0' && trama[4]=='-')// si quiero saber el valor del preset o Analog0 printf("$RA0-%1.1f!\n\r",preset.read()); else if(trama[1]=='R' && trama[2]=='A' && trama[3]=='1' && trama[4]=='-')// si quiero saber el valor del tsi o Analog1 printf("$RA1-%1.1f!\n\r",tsi.readPercentage()); else if(trama[1]=='R' && trama[2]=='I' && trama[3]=='0' && trama[4]=='-')// si quiero saber el estado de la entrada digital 0 printf("$RI0-%d!\n\r",entrada1.read()); else if(trama[1]=='R' && trama[2]=='I' && trama[3]=='1' && trama[4]=='-')// si quiero saber el estado de la entrada digital 1 printf("$RI1-%d!\n\r",entrada2.read()); lectura=verificacion; break; case escritura:// maquina de estado para escribir if(trama[1]=='W' && trama[2]=='L' && trama[3]=='R' && trama[4]=='0')// si quiero apagar el led rojo rojo=1;// apago led rojo else if(trama[1]=='W' && trama[2]=='L' && trama[3]=='R' && trama[4]=='1')// si quiero encender el led rojo rojo=0;// enciendo led rojo else if(trama[1]=='W' && trama[2]=='L' && trama[3]=='G' && trama[4]=='0')// si quiero apagar el led verde verde=1;// apago led verde else if(trama[1]=='W' && trama[2]=='L' && trama[3]=='G' && trama[4]=='1')// si quiero encender el led verde verde=0;// enciendo led verde else if(trama[1]=='W' && trama[2]=='L' && trama[3]=='B' && trama[4]=='0')// si quiero apagar el led azul azul=1;// apago led azul else if(trama[1]=='W' && trama[2]=='L' && trama[3]=='B' && trama[4]=='1')// si quiero encender el led azul azul=0;// enciendo led azul lectura=verificacion;// vuelvo a la maquina de estado de verificacion break; } }