teste de publish
Dependencies: DS1820 HighSpeedAnalogIn devices mbed
IRPack.cpp
- Committer:
- brunofgc
- Date:
- 2018-01-29
- Revision:
- 20:da1b8d80ba00
- Parent:
- 7:ae9c47f62946
- Child:
- 21:b9315cdd9275
File content as of revision 20:da1b8d80ba00:
#include "IRPack.h" //bool dataIn[maxBytesMsg*8]; uint16_t bits[maxBitsMsg*2][2]; int indexIr=0,botao; int startBitAlto=0, startBitBaixo=0, bitBaixo[maxBitsMsg], bitAlto[maxBitsMsg], i; //unsigned char byte=0,msg[maxBytesMsg],msgBytes=0; Timer IrTmr; Timer IrDetect; bool irInAntes=1; CircularBuffer bufIROut(maxBitsMsg*2*4); //PwmOut IrOut(P1_18); DigitalIn IrIn(P1_24); //Não utilizado na placa int round(float in){ int x = floor(in); float y = in-x; if(y>=0.5){ x++; } return x; } uint16_t pulseDuration_us(bool high,DigitalIn pin,unsigned long int timeout){ //unsigned long int durationBefore, duration; unsigned long int duration; //IrTmr.reset(); //IrTmr.start(); //durationBefore = us_ticker_read(); duration=0; do{ duration++; wait_us(1); }while((duration < timeout) && (pin==high)); //IrTmr.stop(); if(duration < timeout){ return duration; } else{ return 65535; } } void enviaComandoIR(uint8_t freq,uint8_t port){ float sd1Duty = SD1.read(); float sd2Duty = SD2.read(); float sd3Duty = SD3.read(); float sd4Duty = SD4.read(); float sd5Duty = SD5.read(); float sd6Duty = SD6.read(); unsigned long int duration; float frequencia = freq*1000.0; float periodo = 1000000.0/frequencia; PwmOut *SD; switch(port){ case 0: SD = &SD1; break; case 1: SD = &SD2; break; case 2: SD = &SD3; break; case 3: SD = &SD4; break; case 4: SD = &SD5; break; case 5: SD = &SD6; break; } SD1.write(0.0f); SD2.write(0.0f); SD3.write(0.0f); SD4.write(0.0f); SD5.write(0.0f); SD6.write(0.0f); //pc.printf("Enviando o pacote IR na porta %lu com periodo %f e frequencia %f.\r\n",port,periodo,frequencia); //SD->period(1.0/(freq*1000.0)); SD->period_us(periodo); pc.printf("Iniciando o envio IR.\r\n"); /*SD->write(0.5); if(startBitAlto!=65535){wait_us(startBitAlto);} SD->write(0.0); if(startBitBaixo!=65535){wait_us(startBitBaixo);}*/ /*for(i=0;i<indexIr;i++){ SD->write(0.5); if(bitAlto[i]!=65535){ duration = us_ticker_read(); while((us_ticker_read()-duration)<bits[i][0]); } SD->write(0.0); if(bitBaixo[i]!=65535){ duration = us_ticker_read(); while((us_ticker_read()-duration)<bits[i][1]); } }*/ for(i=0;i<indexIr;i++){ SD->write(0.5); if(bitAlto[i]!=65535){ wait_us(bits[i][0]); } SD->write(0.0); if(bitBaixo[i]!=65535){ wait_us(bits[i][1]); } } pc.printf("Finalizado o envio IR.\r\n"); SD1.period_us(pwmPeriod); SD1.write(sd1Duty); SD2.write(sd2Duty); SD3.write(sd3Duty); SD4.write(sd4Duty); SD5.write(sd5Duty); SD6.write(sd6Duty); } /*static const long hextable[] = { [0 ... 255] = -1, // bit aligned access into this table is considerably ['0'] = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, // faster for most modern processors, ['A'] = 10, 11, 12, 13, 14, 15, // for the space conscious, reduce to ['a'] = 10, 11, 12, 13, 14, 15 // signed char. };*/ uint8_t hextable(char c){ uint8_t ret=0; if(c>='a'){ ret = c-87; }else if(c>='A'){ ret = c-55; }else{ ret = c-48; } return ret; } uint16_t hexdec(char *hex,uint16_t tam) { uint16_t ret = 0; //uint8_t auxHex=0; uint16_t i; for(i=0;i<tam;i++){ //ret += hextable[hex[i]] << (i*4); ret += hextable(hex[i]) << (i*4); //pc.printf("%c",hex[i]); } //pc.printf("\r\n"); return ret; } void deserializaPacoteIR(char *strIr){ uint16_t len; uint16_t i; len = strlen(strIr); len = len/4; //Separando de quatro em quatro pra formar um uint16_t for(i=0;i<len;i++){ bits[i/2][(i%2)]=hexdec(strIr,4); strIr = strIr+4; } indexIr = len/2; } void serializaPacoteIR(uint8_t connectionID){ char aux[50]; uint32_t length; char *ptr; uint16_t i; union{ char c[2]; uint16_t v; }u; sdCardBuf.del(); for(i=0;i<indexIr;i++){ u.v = bits[i][0]; sprintf(aux,"%01X%01X%01X%01X" ,u.c[0]&0xF ,u.c[0]>>4 ,u.c[1]&0xF ,u.c[1]>>4 ); sdCardBuf.fill(aux,strlen(aux)); u.v = bits[i][1]; sprintf(aux,"%01X%01X%01X%01X" ,u.c[0]&0xF ,u.c[0]>>4 ,u.c[1]&0xF ,u.c[1]>>4 ); sdCardBuf.fill(aux,strlen(aux)); } length = sdCardBuf.getLength(); ptr = sdCardBuf.get(); modemCom::cipSend(connID,ptr,length); //pc.printf("Conteudo de sdCardBuf <%s>.\r\n",ptr); } bool detectaIRIn(){ bool detectado=0; if((irInAntes!=IrIn) && (!IrIn)){ bits[0][0] = pulseDuration_us(0,IrIn,10000); bits[0][1] = pulseDuration_us(1,IrIn,10000); if((bits[0][0]>100)&&(bits[0][1]>100)){ indexIr = 1; do{ bits[indexIr][0] = pulseDuration_us(0,IrIn,10000); bits[indexIr][1] = pulseDuration_us(1,IrIn,10000); indexIr++; }while((bits[indexIr-1][0]!=65535)&&(bits[indexIr-1][1]!=65535)); detectado=1; } } irInAntes = IrIn; ledUsoGeral = !IrIn; return detectado; } void pesquisaIRIn(){ if((irInAntes!=IrIn) && (!IrIn)){ startBitAlto = pulseDuration_us(0,IrIn,10000); startBitBaixo = pulseDuration_us(1,IrIn,10000); if((startBitAlto>1000)&&(startBitBaixo>1000)){ indexIr = 0; do{ bitAlto[indexIr] = pulseDuration_us(0,IrIn,10000); bitBaixo[indexIr] = pulseDuration_us(1,IrIn,10000); //dataIn[indexIr] = (bitBaixo[indexIr] > 1000); indexIr++; }while((bitAlto[indexIr-1]!=(-1))&&(bitBaixo[indexIr-1]!=(-1))); pc.printf("Capturado um quadro com %lu bits. sbH %ld, sbL %ld <",indexIr,startBitAlto, startBitBaixo); for(i=0;i<(indexIr);i++){ pc.printf("[H%ld L%ld] ",bitAlto[i],bitBaixo[i]); } pc.printf(">.\n\n"); /*pc.printf("%lu bits 0b",indexIr); for(i=0;i<indexIr;i++){ pc.printf("%u",dataIn[i]); } pc.printf("\n\n");*/ /*//Montando os bytes; byte=0; msgBytes=0; for(i=0;i<=indexIr;i++){ if((i!=0)&&((i%8) == 0)){ msg[msgBytes]=byte; msgBytes++; byte=0; } byte+= dataIn[i]<<(i%8); } //Exibindo pacote pc.printf("Resultado 0x"); for(i=0;i<msgBytes;i++){ pc.printf("%02X",msg[i]); } pc.printf("\n\n"); //Atuando nos leds botao=0; for(i=0;i<msgBytes;i++){ botao+=msg[i]<<(8*i); } //pc.printf("Botao pressionado %X\n",botao); switch(botao){ case 0xfb040707: //1 led2=1; break; case 0xfa050707: //2 led3=1; break; case 0xf9060707: //3 led4=1; break; case 0xf7080707: //4 led2=0; break; case 0xf6090707: //5 led3=0; break; case 0xf50a0707: //6 led4=0; break; }*/ //descritorPacoteIR(int startBitAlto, int startBitBaixo, int *bitAlto, int *bitBaixo, int numBits) //descritorPacoteIR(startBitAlto,startBitBaixo,bitAlto,bitBaixo,indexIr); } } irInAntes = IrIn; ledUsoGeral = !IrIn; } /* float razaoBit(int iH, int iL){ float H=(float)iH,L=(float)iL; float razao = L/H; if(razao>=1){ return (float) round(razao); }else if(razao>=0.5){ return 0.5; }else if(razao>=0.25){ return 0.25; }else if(razao>=0.125){ return 0.125; }else{ return -1; } } void descritorPacoteIR(int startBitAlto, int startBitBaixo, int *bitAlto, int *bitBaixo, int numBits){ unsigned int razao_maiorQue4=0; unsigned int razao_4=0; unsigned int razao_3=0; unsigned int razao_2=0; unsigned int razao_1=0; unsigned int razao_0_5=0; unsigned int razao_0_25=0; unsigned int razao_0_125=0; unsigned int razao_menorQue_0_125=0; //Indice 0 ALto, 1 Baixo; unsigned long int bitRazao_maiorQue4[2]= {0,0}; unsigned long int bitRazao_4[2]= {0,0}; unsigned long int bitRazao_3[2]= {0,0}; unsigned long int bitRazao_2[2]= {0,0}; unsigned long int bitRazao_1[2]= {0,0}; unsigned long int bitRazao_0_5[2]= {0,0}; unsigned long int bitRazao_0_25[2]= {0,0}; unsigned long int bitRazao_0_125[2]= {0,0}; unsigned long int bitRazao_menorQue_0_125[2]= {0,0}; unsigned long int indiceMaiorNEventos[2] = {0,0}; unsigned long int indiceSegundoMaiorNEventos[2] = {0,0}; unsigned int bitAlto_H=0; unsigned int bitAlto_L=0; unsigned int bitBaixo_H=0; unsigned int bitBaixo_L=0; unsigned int stopBitAlto = bitAlto[numBits-1]; int i; //printf("startBitAlto %d, startBitBaixo %d, stopBitAlto %d, stopBitBaixo %d numBits %d\n",startBitAlto,startBitBaixo,bitAlto[numBits-1],bitBaixo[numBits-1],numBits); //Despresando o stopBit pois esse já sabemos como faz for(i=0;i<numBits-1;i++){ //printf("Razao entre [L %05d e H %05d]=%1.2f\n",bitBaixo[i],bitAlto[i],razaoBit(bitAlto[i],bitBaixo[i])); //Detecção de padroes if(razaoBit(bitAlto[i],bitBaixo[i])>=4){ razao_maiorQue4++; bitRazao_maiorQue4[0]+= bitAlto[i]; bitRazao_maiorQue4[1]+=bitBaixo[i]; }else if(razaoBit(bitAlto[i],bitBaixo[i])==4){ razao_4++; bitRazao_4[0]+= bitAlto[i]; bitRazao_4[1]+=bitBaixo[i]; }else if(razaoBit(bitAlto[i],bitBaixo[i])==3){ razao_3++; bitRazao_3[0]+= bitAlto[i]; bitRazao_3[1]+=bitBaixo[i]; }else if(razaoBit(bitAlto[i],bitBaixo[i])==2){ razao_2++; bitRazao_2[0]+= bitAlto[i]; bitRazao_2[1]+=bitBaixo[i]; }else if(razaoBit(bitAlto[i],bitBaixo[i])==1){ razao_1++; bitRazao_1[0]+= bitAlto[i]; bitRazao_1[1]+=bitBaixo[i]; }else if(razaoBit(bitAlto[i],bitBaixo[i])==0.5){ razao_0_5++; bitRazao_0_5[0]+= bitAlto[i]; bitRazao_0_5[1]+=bitBaixo[i]; }else if(razaoBit(bitAlto[i],bitBaixo[i])==0.25){ razao_0_25++; bitRazao_0_25[0]+= bitAlto[i]; bitRazao_0_25[1]+=bitBaixo[i]; }else if(razaoBit(bitAlto[i],bitBaixo[i])==0.125){ razao_0_125++; bitRazao_0_125[0]+= bitAlto[i]; bitRazao_0_125[1]+=bitBaixo[i]; }else { razao_menorQue_0_125++; bitRazao_menorQue_0_125[0]+= bitAlto[i]; bitRazao_menorQue_0_125[1]+=bitBaixo[i]; } } printf("Razoes <0.125 = %d\n 0.125 = %d\n 0.25 = %d\n 0.5 = %d\n 1 = %d\n 2 = %d\n 3 = %d\n 4 = %d\n maior que 4 = %d\n" ,razao_menorQue_0_125 ,razao_0_125 ,razao_0_25 ,razao_0_5 ,razao_1 ,razao_2 ,razao_3 ,razao_4 ,razao_maiorQue4 ); //Buscando os dois maiores em numero de eventos por Indice; //Buscando o primeiro for(i=0;i<9;i++){ //Buscando nos indices maior numero eventos switch(i){ case 0: if(razao_maiorQue4>indiceMaiorNEventos[0]){ indiceMaiorNEventos[0] = razao_maiorQue4; indiceMaiorNEventos[1] = i; } break; case 1: if(razao_4>indiceMaiorNEventos[0]){ indiceMaiorNEventos[0] = razao_4; indiceMaiorNEventos[1] = i; } break; case 2: if(razao_3>indiceMaiorNEventos[0]){ indiceMaiorNEventos[0] = razao_3; indiceMaiorNEventos[1] = i; } break; case 3: if(razao_2>indiceMaiorNEventos[0]){ indiceMaiorNEventos[0] = razao_2; indiceMaiorNEventos[1] = i; } break; case 4: if(razao_1>indiceMaiorNEventos[0]){ indiceMaiorNEventos[0] = razao_1; indiceMaiorNEventos[1] = i; } break; case 5: if(razao_0_5>indiceMaiorNEventos[0]){ indiceMaiorNEventos[0] = razao_0_5; indiceMaiorNEventos[1] = i; } break; case 6: if(razao_0_25>indiceMaiorNEventos[0]){ indiceMaiorNEventos[0] = razao_0_25; indiceMaiorNEventos[1] = i; } break; case 7: if(razao_0_125>indiceMaiorNEventos[0]){ indiceMaiorNEventos[0] = razao_0_125; indiceMaiorNEventos[1] = i; } break; case 8: if(razao_menorQue_0_125>indiceMaiorNEventos[0]){ indiceMaiorNEventos[0] = razao_menorQue_0_125; indiceMaiorNEventos[1] = i; } break; } } //Buscando o segundo //Buscando o primeiro for(i=0;i<9;i++){ //Buscando nos indices maior numero eventos if(i!=indiceMaiorNEventos[1]){ switch(i){ case 0: if(razao_maiorQue4>indiceSegundoMaiorNEventos[0]){ indiceSegundoMaiorNEventos[0] = razao_maiorQue4; indiceSegundoMaiorNEventos[1] = i; } break; case 1: if(razao_4>indiceSegundoMaiorNEventos[0]){ indiceSegundoMaiorNEventos[0] = razao_4; indiceSegundoMaiorNEventos[1] = i; } break; case 2: if(razao_3>indiceSegundoMaiorNEventos[0]){ indiceSegundoMaiorNEventos[0] = razao_3; indiceSegundoMaiorNEventos[1] = i; } break; case 3: if(razao_2>indiceSegundoMaiorNEventos[0]){ indiceSegundoMaiorNEventos[0] = razao_2; indiceSegundoMaiorNEventos[1] = i; } break; case 4: if(razao_1>indiceSegundoMaiorNEventos[0]){ indiceSegundoMaiorNEventos[0] = razao_1; indiceSegundoMaiorNEventos[1] = i; } break; case 5: if(razao_0_5>indiceSegundoMaiorNEventos[0]){ indiceSegundoMaiorNEventos[0] = razao_0_5; indiceSegundoMaiorNEventos[1] = i; } break; case 6: if(razao_0_25>indiceSegundoMaiorNEventos[0]){ indiceSegundoMaiorNEventos[0] = razao_0_25; indiceSegundoMaiorNEventos[1] = i; } break; case 7: if(razao_0_125>indiceSegundoMaiorNEventos[0]){ indiceSegundoMaiorNEventos[0] = razao_0_125; indiceSegundoMaiorNEventos[1] = i; } break; case 8: if(razao_menorQue_0_125>indiceSegundoMaiorNEventos[0]){ indiceSegundoMaiorNEventos[0] = razao_menorQue_0_125; indiceSegundoMaiorNEventos[1] = i; } break; } } } //printf("Indice de maior aparecimento foi o de %d.\nIndice de segundo maior aparecimento foi o de %d.\n",indiceMaiorNEventos[1],indiceSegundoMaiorNEventos[1]); //Calculando bitAlto switch(indiceMaiorNEventos[1]){ case 0: bitAlto_H = round(bitRazao_maiorQue4[0]/indiceMaiorNEventos[0]); bitAlto_L = round(bitRazao_maiorQue4[1]/indiceMaiorNEventos[0]); break; case 1: bitAlto_H = round(bitRazao_4[0]/indiceMaiorNEventos[0]); bitAlto_L = round(bitRazao_4[1]/indiceMaiorNEventos[0]); break; case 2: bitAlto_H = round(bitRazao_3[0]/indiceMaiorNEventos[0]); bitAlto_L = round(bitRazao_3[1]/indiceMaiorNEventos[0]); break; case 3: bitAlto_H = round(bitRazao_2[0]/indiceMaiorNEventos[0]); bitAlto_L = round(bitRazao_2[1]/indiceMaiorNEventos[0]); break; case 4: bitAlto_H = round(bitRazao_1[0]/indiceMaiorNEventos[0]); bitAlto_L = round(bitRazao_1[1]/indiceMaiorNEventos[0]); break; case 5: bitAlto_H = round(bitRazao_0_5[0]/indiceMaiorNEventos[0]); bitAlto_L = round(bitRazao_0_5[1]/indiceMaiorNEventos[0]); break; case 6: bitAlto_H = round(bitRazao_0_25[0]/indiceMaiorNEventos[0]); bitAlto_L = round(bitRazao_0_25[1]/indiceMaiorNEventos[0]); break; case 7: bitAlto_H = round(bitRazao_0_125[0]/indiceMaiorNEventos[0]); bitAlto_L = round(bitRazao_0_125[1]/indiceMaiorNEventos[0]); break; case 8: bitAlto_H = round(bitRazao_menorQue_0_125[0]/indiceMaiorNEventos[0]); bitAlto_L = round(bitRazao_menorQue_0_125[1]/indiceMaiorNEventos[0]); break; } //Calculando bitBaixo switch(indiceSegundoMaiorNEventos[1]){ case 0: bitBaixo_H = round(bitRazao_maiorQue4[0]/indiceSegundoMaiorNEventos[0]); bitBaixo_L = round(bitRazao_maiorQue4[1]/indiceSegundoMaiorNEventos[0]); break; case 1: bitBaixo_H = round(bitRazao_4[0]/indiceSegundoMaiorNEventos[0]); bitBaixo_L = round(bitRazao_4[1]/indiceSegundoMaiorNEventos[0]); break; case 2: bitBaixo_H = round(bitRazao_3[0]/indiceSegundoMaiorNEventos[0]); bitBaixo_L = round(bitRazao_3[1]/indiceSegundoMaiorNEventos[0]); break; case 3: bitBaixo_H = round(bitRazao_2[0]/indiceSegundoMaiorNEventos[0]); bitBaixo_L = round(bitRazao_2[1]/indiceSegundoMaiorNEventos[0]); break; case 4: bitBaixo_H = round(bitRazao_1[0]/indiceSegundoMaiorNEventos[0]); bitBaixo_L = round(bitRazao_1[1]/indiceSegundoMaiorNEventos[0]); break; case 5: bitBaixo_H = round(bitRazao_0_5[0]/indiceSegundoMaiorNEventos[0]); bitBaixo_L = round(bitRazao_0_5[1]/indiceSegundoMaiorNEventos[0]); break; case 6: bitBaixo_H = round(bitRazao_0_25[0]/indiceSegundoMaiorNEventos[0]); bitBaixo_L = round(bitRazao_0_25[1]/indiceSegundoMaiorNEventos[0]); break; case 7: bitBaixo_H = round(bitRazao_0_125[0]/indiceSegundoMaiorNEventos[0]); bitBaixo_L = round(bitRazao_0_125[1]/indiceSegundoMaiorNEventos[0]); break; case 8: bitBaixo_H = round(bitRazao_menorQue_0_125[0]/indiceSegundoMaiorNEventos[0]); bitBaixo_L = round(bitRazao_menorQue_0_125[1]/indiceSegundoMaiorNEventos[0]); break; } printf("\n\nFinalmente.\n"); printf("startBitAlto = %ld, startBitBaixo = %ld\n", startBitAlto,startBitBaixo); printf("bitAlto_H = %ld bitAlto_l = %ld\n",bitAlto_H,bitAlto_L); printf("bitBaixo_H = %ld bitBaixo_l = %ld\n",bitBaixo_H,bitBaixo_L); printf("stopBitAlto = %ld\n",stopBitAlto); return; }*/