Facundo Sussini
/
TP2_Protocolos
Integrantes: Facundo Carmona, Facundo Sussini. 6B Tecnica
Diff: main.cpp
- Revision:
- 0:2751a945563b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Jun 27 00:15:41 2019 +0000 @@ -0,0 +1,230 @@ +#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; + } +}