fe

Dependencies:   mbed tsi_sensor

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "tsi_sensor.h"
00003 
00004 #define INICIO 0
00005 #define RW 1
00006 #define DISP 2
00007 #define DISP_W 3
00008 #define DISP_R 4
00009 #define EST 5
00010 #define VERIF 6
00011 #define FIN 7
00012 #define PWMD 8
00013 #define PWMU 9
00014 
00015 /* Cosas del TSI */
00016 #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
00017 #define ELEC0 9
00018 #define ELEC1 10
00019 #elif defined (TARGET_KL05Z)
00020 #define ELEC0 9
00021 #define ELEC1 8
00022 #else
00023 #error TARGET NOT DEFINED
00024 #endif
00025 
00026 //Definimos que el puerto serie se llama pc
00027 Serial pc(USBTX, USBRX);
00028 
00029 //Variable donde se guarda lo recibido
00030 unsigned char   c = '\0';
00031 
00032 unsigned char slider=0, pote=0, verif;
00033 
00034 //bit usado como flag para procesar datos
00035 bool newdata = false;   //Se pone en true cuando hay nuevos datos
00036 bool ejec = false;   //Se pone en true cuando hay una trama correcta
00037 unsigned char rec[7]= {0};
00038 
00039 //Creamos los tres leds pra usar
00040 DigitalIn bt1(PTA4,PullUp);
00041 DigitalIn bt2(PTA5,PullUp);
00042 DigitalOut LR(LED1);
00043 DigitalOut LG(LED2);
00044 DigitalOut LB(LED3);
00045 AnalogIn analo(PTB0);
00046 AnalogOut pwm (PTE30);
00047 
00048 //Callback cuando se detecta una entrada
00049 void onCharReceived()
00050 {
00051     //Copiamos lo leido en c
00052     c = pc.getc();
00053     newdata = true;
00054 }
00055 
00056 bool recibiendo(void)
00057 {
00058     static unsigned char est=INICIO;
00059     switch(est) {
00060         default:
00061         case INICIO:
00062             if (c=='$') { //Si $ lo guardo en el char 0 de rec
00063                 rec[0]=c;
00064                 est=RW;
00065             }
00066             //Hacemos NULL c para que no vuelva a ejecutar
00067             c = '\0';
00068             break;
00069 
00070         case RW:
00071             if ((c=='W')||(c=='R')) { //Si W o R lo guardo en el char 1 de rec
00072 
00073                 rec[1]=c;
00074                 est=DISP;
00075             }   else    {
00076                 if(c=='P') {
00077                     rec[1]=c;
00078                     est=PWMD;
00079                 }   else    {
00080                     if(c=='$') {
00081                         rec[0]=c;
00082                         rec[1]=0;
00083                         rec[2]=0;
00084                         rec[3]=0;
00085                         rec[4]=0;
00086                         rec[5]=0;
00087                         rec[6]=0;
00088                         est=RW;
00089                     } else {
00090                         rec[0]=0;
00091                         rec[1]=0;
00092                         rec[2]=0;
00093                         rec[3]=0;
00094                         rec[4]=0;
00095                         rec[5]=0;
00096                         rec[6]=0;
00097                         est=INICIO;
00098                     }
00099                 }
00100             }
00101             //Hacemos NULL c para que no vuelva a ejecutar
00102             c = '\0';
00103             break;
00104 
00105         case DISP:
00106             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
00107                 rec[2]=c;
00108                 est=DISP_R;
00109             } else {
00110                 if ((rec[1]=='W')&&(c=='L')) { //Si escribo y recibo L lo guardo en el char 2 de rec
00111                     rec[2]=c;
00112                     est=DISP_W;
00113                 }   else    {
00114                     if(c=='P') {
00115                         rec[2]=c;
00116                         rec[3]=0;
00117                         rec[4]=0;
00118                         est=VERIF;
00119                     } else {
00120                         if(c=='$') {
00121                             rec[0]=c;
00122                             rec[1]=0;
00123                             rec[2]=0;
00124                             rec[3]=0;
00125                             rec[4]=0;
00126                             rec[5]=0;
00127                             rec[6]=0;
00128                             est=RW;
00129                         } else {
00130                             rec[0]=0;
00131                             rec[1]=0;
00132                             rec[2]=0;
00133                             rec[3]=0;
00134                             rec[4]=0;
00135                             rec[5]=0;
00136                             rec[6]=0;
00137                             est=INICIO;
00138                         }
00139                     }
00140                 }
00141             }
00142             //Hacemos NULL c para que no vuelva a ejecutar
00143             c = '\0';
00144             break;
00145 
00146         case DISP_W:
00147             if ((c=='R')||(c=='G')||(c=='B')) { //Si escribo y recibo G, B o R lo guardo en el char 3 de rec
00148                 rec[3]=c;
00149                 est=EST;
00150             }   else    {
00151                 if(c=='$') {
00152                     rec[0]=c;
00153                     rec[1]=0;
00154                     rec[2]=0;
00155                     rec[3]=0;
00156                     rec[4]=0;
00157                     rec[5]=0;
00158                     rec[6]=0;
00159                     est=RW;
00160                 } else {
00161                     rec[0]=0;
00162                     rec[1]=0;
00163                     rec[2]=0;
00164                     rec[3]=0;
00165                     rec[4]=0;
00166                     rec[5]=0;
00167                     rec[6]=0;
00168                     est=INICIO;
00169                 }
00170             }
00171             c=0;
00172             break;
00173 
00174         case DISP_R:
00175             if ((c=='1')||(c=='2')||(c=='3')) { //Si leo y recibo 1 o 2 lo guardo en el char 3 de rec
00176                 rec[3]=c;
00177                 rec[4]=0;
00178                 est=VERIF;
00179             }   else    {
00180                 if(c=='$') {
00181                     rec[0]=c;
00182                     rec[1]=0;
00183                     rec[2]=0;
00184                     rec[3]=0;
00185                     rec[4]=0;
00186                     rec[5]=0;
00187                     rec[6]=0;
00188                     est=RW;
00189                 } else {
00190                     rec[0]=0;
00191                     rec[1]=0;
00192                     rec[2]=0;
00193                     rec[3]=0;
00194                     rec[4]=0;
00195                     rec[5]=0;
00196                     rec[6]=0;
00197                     est=INICIO;
00198                 }
00199             }
00200             //Hacemos NULL c para que no vuelva a ejecutar
00201             c=0;
00202             break;
00203 
00204         case EST:
00205             if ((c=='1')||(c=='0')) { //Si escribo y recibo 1 o 0 lo guardo en el char 4 de rec
00206                 rec[4]=c;
00207                 est=VERIF;
00208             }   else    {
00209                 if(c=='$') {
00210                     rec[0]=c;
00211                     rec[1]=0;
00212                     rec[2]=0;
00213                     rec[3]=0;
00214                     rec[4]=0;
00215                     rec[5]=0;
00216                     rec[6]=0;
00217                     est=RW;
00218                 } else {
00219                     rec[0]=0;
00220                     rec[1]=0;
00221                     rec[2]=0;
00222                     rec[3]=0;
00223                     rec[4]=0;
00224                     rec[5]=0;
00225                     rec[6]=0;
00226                     est=INICIO;
00227                 }
00228             }
00229             //Hacemos NULL c para que no vuelva a ejecutar
00230             c=0;
00231             break;
00232 
00233         case VERIF:
00234             if(c==verif) {
00235                 rec[5]=c;//Guarda la verificacion de la trama en rec 5
00236                 est=FIN;
00237             }   else    {
00238                 if(c=='$') {
00239                     rec[0]=c;
00240                     rec[1]=0;
00241                     rec[2]=0;
00242                     rec[3]=0;
00243                     rec[4]=0;
00244                     rec[5]=0;
00245                     rec[6]=0;
00246                     est=RW;
00247                 } else {
00248                     rec[0]=0;
00249                     rec[1]=0;
00250                     rec[2]=0;
00251                     rec[3]=0;
00252                     rec[4]=0;
00253                     rec[5]=0;
00254                     rec[6]=0;
00255                     est=INICIO;
00256                 }
00257             }
00258             c=0;
00259             break;
00260 
00261         case FIN:
00262             if(c=='!') { //Si recibo !0 lo guardo en el char 6 de rec
00263                 rec[6]=c;
00264                 est=INICIO;
00265                 //Hacemos NULL c para que no vuelva a ejecutar
00266                 c=0;
00267                 return (true);
00268             }   else    {
00269                 if((c=='$')||((rec[5]=='$')&&((c=='W')||(c=='R')))) {
00270                     if(c=='$') {
00271                         rec[0]='$';
00272                         rec[1]=0;
00273                         rec[2]=0;
00274                         rec[3]=0;
00275                         rec[4]=0;
00276                         rec[5]=0;
00277                         rec[6]=0;
00278                         est=RW;
00279                     } else {
00280                         rec[0]='$';
00281                         rec[1]=c;
00282                         rec[2]=0;
00283                         rec[3]=0;
00284                         rec[4]=0;
00285                         rec[5]=0;
00286                         rec[6]=0;
00287                         est=DISP;
00288                     }
00289                 } else {
00290                     rec[0]=0;
00291                     rec[1]=0;
00292                     rec[2]=0;
00293                     rec[3]=0;
00294                     rec[4]=0;
00295                     rec[5]=0;
00296                     rec[6]=0;
00297                     est=INICIO;
00298                 }
00299             }
00300             //Hacemos NULL c para que no vuelva a ejecutar
00301             c=0;
00302             break;
00303 
00304         case PWMD:
00305             if ((c>='0')&&(c<='9')) { //Si recibo de 0 a 9 o de A a F lo guardo en el char 2 de rec
00306                 rec[2]=c;
00307                 est=PWMU;
00308             }   else    {
00309                 if(c=='$') {
00310                     rec[0]=c;
00311                     rec[1]=0;
00312                     rec[2]=0;
00313                     rec[3]=0;
00314                     rec[4]=0;
00315                     rec[5]=0;
00316                     rec[6]=0;
00317                     est=RW;
00318                 } else {
00319                     rec[0]=0;
00320                     rec[1]=0;
00321                     rec[2]=0;
00322                     rec[3]=0;
00323                     rec[4]=0;
00324                     rec[5]=0;
00325                     rec[6]=0;
00326                     est=INICIO;
00327                 }
00328             }
00329             //Hacemos NULL c para que no vuelva a ejecutar
00330             c=0;
00331             break;
00332         case PWMU:
00333             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
00334                 rec[3]=c;
00335                 est=VERIF;
00336             }   else    {
00337                 if(c=='$') {
00338                     rec[0]=c;
00339                     rec[1]=0;
00340                     rec[2]=0;
00341                     rec[3]=0;
00342                     rec[4]=0;
00343                     rec[5]=0;
00344                     rec[6]=0;
00345                     est=RW;
00346                 } else {
00347                     rec[0]=0;
00348                     rec[1]=0;
00349                     rec[2]=0;
00350                     rec[3]=0;
00351                     rec[4]=0;
00352                     rec[5]=0;
00353                     rec[6]=0;
00354                     est=INICIO;
00355                 }
00356             }
00357             //Hacemos NULL c para que no vuelva a ejecutar
00358             c=0;
00359             break;
00360     }
00361     return (false);
00362 }
00363 
00364 void interpretacion(void)
00365 {
00366     static unsigned char aux, aux2, aux3;
00367     if(rec[1]=='W') {
00368         if(rec[3]=='R') {
00369             if(rec[4]=='1')
00370                 LR=0;
00371             if(rec[4]=='0')
00372                 LR=1;
00373             printf("\n$RL1%d!\r\n",!LR);
00374         }
00375         if(rec[3]=='B') {
00376             if(rec[4]=='1')
00377                 LB=0;
00378             if(rec[4]=='0')
00379                 LB=1;
00380             printf("\n$RL3%d!\r\n",!LB);
00381         }
00382         if(rec[3]=='G') {
00383             if(rec[4]=='1')
00384                 LG=0;
00385             if(rec[4]=='0')
00386                 LG=1;
00387             printf("\n$RL2%d!\r\n",!LG);
00388         }
00389 
00390     }
00391     if(rec[1]=='R') {
00392         if(rec[2]=='L') {
00393             if(rec[3]=='1')
00394                 printf("\n$RL1%d!\r\n",!LR);
00395             if(rec[3]=='2')
00396                 printf("\n$RL2%d!\r\n",!LG);
00397             if(rec[3]=='3')
00398                 printf("\n$RL3%d!\r\n",!LB);
00399         }
00400         if(rec[2]=='A') {
00401             if(rec[3]=='1')
00402                 printf("\n$RA1%02X!\r\n",slider);
00403             if(rec[3]=='2')
00404                 printf("\n$RA2%02X!\r\n",pote);
00405         }
00406         if(rec[2]=='D') {
00407             if(rec[3]=='1')
00408                 printf("\n$RD1%d!\r\n",!bt1);
00409             if(rec[3]=='2')
00410                 printf("\n$RD2%d!\r\n",!bt2);
00411         }
00412         if(rec[2]=='P') {
00413             aux = pwm*100;
00414             printf("\n$P%02X!\r\n", aux);
00415         }
00416     }
00417     if (rec[1]=='P') {
00418         if (rec[3]>='A')
00419             aux3 = rec[3]-'A'+10;
00420         else
00421             aux3 = rec[3]-'0';
00422         aux2 = (16*(rec[2]-'0'))+aux3;
00423         pwm = (float) aux2/100;
00424         printf("\n$P%02X!\r\n", aux2);
00425     }
00426 }
00427 
00428 int main()
00429 {
00430 //Apagamos los leds
00431     LG=1;
00432     LR=1;
00433     LB=1;
00434 
00435     pwm=1;
00436 
00437     TSIAnalogSlider tsi(ELEC0, ELEC1, 40);
00438 
00439 //Ejecutar onCharReceived por cada entrada por puerto
00440     pc.attach(&onCharReceived);
00441 
00442     while (true) {
00443         verif=rec[1]^rec[2]^rec[3];
00444         slider=255*tsi.readPercentage();
00445         pote=255*analo.read();
00446         if(newdata) {
00447             ejec=recibiendo();
00448             newdata = false;
00449         }
00450         if(ejec) {
00451             interpretacion();
00452             ejec=0;
00453         }
00454     }
00455 }