guido glorioso
/
Tp-Terminado-tp2
fe
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Tue Jul 12 2022 21:33:46 by 1.7.2