teste de publish

Dependencies:   DS1820 HighSpeedAnalogIn devices mbed

IRPack.cpp

Committer:
brunofgc
Date:
2018-06-08
Revision:
38:07d3907b74e5
Parent:
37:0e95c85f0160

File content as of revision 38:07d3907b74e5:

#include "IRPack.h"
//bool dataIn[maxBytesMsg*8];
uint16_t bits[maxBitsMsg*4][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,0);

//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; 
 durationBefore = us_ticker_read();
 do{   
   wait_us(1);
   timeout--;
 }while(timeout && (pin==high));
 duration = us_ticker_read() - durationBefore;
 
 //IrTmr.stop();
 if(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();
    
    float frequencia = freq*1000.0;
    float periodo = 1000000.0/frequencia;        
    PwmOut *SD;    
    
    SD1.write(0.0f);
    SD2.write(0.0f);
    SD3.write(0.0f);
    SD4.write(0.0f);
    SD5.write(0.0f);
    SD6.write(0.0f);    
    
    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;    
    }
    
    //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");    
    for(i=0;i<indexIr;i++){
        SD->write(0.5);        
        wait_us(bits[i][0]);

        SD->write(0.0);
        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(connectionID,ptr,length);
    //pc.printf("Conteudo de sdCardBuf <%s>.\r\n",ptr);    
}

bool detectaIRIn(){
        bool detectado=0;
        if((irInAntes!=IrIn) && (!IrIn)){            
            indexIr = 0;
            do{
                bits[indexIr][0] = pulseDuration_us(0,IrIn,65000);
                bits[indexIr][1] = pulseDuration_us(1,IrIn,65000);
                indexIr++;
            }while((bits[indexIr-1][0]!=65535)&&(bits[indexIr-1][1]!=65535));
            detectado=1;
        }
        irInAntes = IrIn;
        pc.printf("Total de indexIr = %lu bits.\r\n",indexIr);
        return detectado;
}

void pesquisaIRIn(){
        if((irInAntes!=IrIn) && (!IrIn)){                       
            indexIr = 0;
            do{
                bitAlto[indexIr]  = pulseDuration_us(0,IrIn,65000);
                bitBaixo[indexIr] = pulseDuration_us(1,IrIn,65000);
                //dataIn[indexIr] = (bitBaixo[indexIr] > 1000);
                indexIr++;                
            }while((bitAlto[indexIr-1]!=65535)&&(bitBaixo[indexIr-1]!=65535));
            
            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");
        }
        irInAntes = 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;
}*/