X2D lib first commit

X2D.cpp

Committer:
sev2000
Date:
2019-11-10
Revision:
5:dcbebd42186a
Parent:
4:844c00dd0366
Child:
6:e373216c80bf

File content as of revision 5:dcbebd42186a:

#include "mbed.h" 
#include "X2D.h" 

#define BUF_SIZE    1000
#define BIT_SIZE    145

int processData(void);

DigitalOut Reg_Data(PC_1);
DigitalOut RxTx(PB_0);
DigitalOut Tx(PA_9);
DigitalOut UART(PA_0, 1);

DigitalIn CD(PC_0);
//DigitalIn Rx(PB_7);
DigitalIn BU(PA_4);
DigitalIn CLR(PA_1);
DigitalIn RSTO(PC_2);

InterruptIn Rx(PB_7, PullUp);

pulse_t timeDiff;
CircularBuffer<pulse_t, BUF_SIZE> PulseWidth;
bool dataBits[BIT_SIZE]={0}; // 18 Nibbles +1


long startedAt=0;
long endedAt=0;

Timer xTime; 

void getPulseF(void)
{
        endedAt = xTime.read_us(); // set timer end for last pin
        timeDiff.v = endedAt - startedAt;
        timeDiff.pin = 1;
        PulseWidth.push(timeDiff);
        startedAt= endedAt; //  set timer start for this pin
}

void getPulseR(void)
{
        endedAt = xTime.read_us(); // set timer end for last pin
        timeDiff.v = endedAt - startedAt;
        timeDiff.pin = 0;
        PulseWidth.push(timeDiff);
        startedAt= endedAt; //  set timer start for this pin
}

void wait_posedge(void)
{
    if(CLR != 0)
    {
        while(CLR != 0) ;
    }
    else ;
    while(CLR == 0) ;
}

void wait_negedge(void)
{
    if(CLR == 0)
    {
        while(CLR == 0) ;
    }   
    else ;
    while(CLR != 0) ;
}

unsigned long read_ctrl_reg(void)
{
    unsigned long return_value = 0;
    unsigned long curr_bit = 0 ;
    int i ;
    
    RxTx = 1;
    //Reg_Data = 0;
    wait_posedge();
    //wait_ms(10);
    Reg_Data = 1;
    RxTx = 1;

    for(i=0;i<=23;i++)
    {
        //DBG("i= %d", i);
        wait_posedge();
        curr_bit = Rx ;
        return_value |= ((curr_bit) << (23-i)) ;
    }
    //wait_negedge();

    Reg_Data = 0;   //clr pin reg_data

    wait(1) ;
    return return_value ;
}

void write_ctrl_reg(unsigned long write_data)
{
    int i ;

    DBG("Write_reg = %X",write_data);
    wait_posedge();   //find posedge for Tcr
    Reg_Data = 1;   //set pin reg_data to Register mode
    RxTx = 0;       //set pin rxtx to Tx mode
  //  wait_negedge();
    //delay(50) ;       //delay for Tcc

    for(i=0;i<=23;i++) //low code effciency may result in wrong writing
    {
        if(((write_data >> (23-i)) & 0x1) == 0)
        {
            Tx = 0;
        }
        else
        {
            Tx = 1;
        }
        wait_posedge();
    }
    RxTx = 1;       //set pin rxtx to Rx
    Reg_Data = 0;   //set pin reg_data
    Tx = 0;
    wait(0.1);
}

void SendBit(bool value)
{
//    DBG("%d ", value);
    Tx = !Tx;
    if(value)
        {
        wait_us(800);
        Tx = !Tx;
        wait_us(800);
        }
    else
        {
        wait_us(1600);
        }
}
    
void SendByte(char value)
{
int i=0;
bool bit;
static char cnt=0;

    pc.printf("%0.2X ", value);
    for(i=0; i<8; i++)
        {
        bit = (bool)(0x01 & (value>>i)); // LSB first
        SendBit(bit); 
        if(bit)
            cnt++;
        else
            cnt=0;
        if(cnt == 5)
            SendBit(0);
        }
}

void SendPreamble(void)
{
int i;

    pc.printf("\r\n");
    Tx=1;
    for(i=0; i<17; i++)
        SendBit(0);
    for(i=0; i<6; i++)
        SendBit(1);
    SendBit(0);

}

void SendPostamble(void)
{
int i;

    for(i=0; i<8; i++)  // Send 0xFF
        SendBit(1);
    for(i=0; i<8; i++)
        SendBit(0);

}

void SendFrame(char *data, int length)
{

int i, chksum=0;

    RxTx = 0;       //set pin rxtx to Tx
    wait_ms(1);

    SendPreamble();

    for(i=0; i<length; i++)
        {
        SendByte(data[i]);
        chksum += data[i];
        }
    chksum = ~chksum +1;

    SendByte((char)(chksum>>8));
    SendByte((char)chksum);
    SendPostamble();

    RxTx = 1;       //set pin rxtx to Rx
}

void SendCmd(prog prog, int zone)
{
char tab[8]={0xF1,0xE6,0x01,0x10,0x01,0x00,0x03,0x64};    // Zone1 Sun
char maison[2]={0xF1,0xE6};
char source = 0x01;
char dest = 0;
char trans = 0x01;
int i;

    dest = 0x10 + zone-1;
    tab[3] = dest;
    tab[6] = prog;

    for(i=0; i<3; i++)
        {
        tab[5]=i;    //message count
        SendFrame(tab, 8);
        wait_ms(30);
        }

}

int detectPreamble(void)
{
pulse_t pulse;
int cnt = 0;
char tmp[32]={0};
char timing[8*1024]={0};
char state=0;
char s=0, l=0, bit_ptr=0;

    while (!PulseWidth.empty())
    {
        PulseWidth.pop(pulse);
        sprintf(tmp, "%d, %ld|", pulse.pin, pulse.v);
        strcat(timing, tmp);
        
        if ((pulse.v > 700) && (pulse.v < 1000))
                { // short off detected
                    s++;
                    l=0;
                }
        else if ((pulse.v > 1500) && (pulse.v < 1800))
                { // long off detected
                    l++;
                    s=0;
                }
        else
                {
                    l=0;
                    s=0;
                    bit_ptr=0;
                    state=0;
                }
        switch(state)
            {
            case 0:     // Detect preamble 
                        if(s >= 12) // out of 12
                            state=1;
                        //pc.printf("%d ", s);
                        break;
            case 1:     // wait start bit (first long)
                        //pc.printf("OK2");
                        s=0;
                        if (l==1)
                            {
                            state = 2;
                            //bit_ptr++; inculde start bit in payload
                            }
                        l=0;
                        break;
            case 2: 
                        //pc.printf(" %d", pulse.v);
            
                        if (s == 2)
                            { 
                            dataBits[bit_ptr] = 1;
                            l=0;
                            s=0;
                            bit_ptr++;
                            }
                        if (l == 1 && s==0)
                            {
                            dataBits[bit_ptr] = 0;
                            l=0;
                            s=0;
                            bit_ptr++;
                            }
                        if(bit_ptr > BIT_SIZE)
                            {
                            state=0;
                            bit_ptr=0;
                            printf("Frame too long ; dropped");
                            }
                            
                        break;
            }
                        
        if(pulse.v > 30000 && cnt>0)     // End of frame
              {
              processData();
              //timing[0]=0;
              state=0;
              bit_ptr=0;
              //PulseWidth.reset();
//              WARN(" Waiting...");
              }
       
        cnt++;
    }
    if (cnt>0)      // if buffer wasn't empty
        {
        processData();
        //pc.printf("%s\r\n", timing);
        }

    return(0);
}

int processData(void)
{
int x=0;
int i = 0;
int j=  0;
char nibble[18]={0}, cnt=0;
int chksum=0, etx_ptr=16;

/*    pc.printf("\r\n");
    for (x=0;x<128;x++)
    {
        if(x%8==0)
            pc.printf(" ");
        pc.printf("%d", dataBits[x]);
    }
*/
x=0;

    for (i=0; i<etx_ptr; i++)
        {
        for (j=0;j<8;j++)
            {
            if ( dataBits[x])
                {
                nibble[i] |= 1<<j;
                cnt++;
                }
            else
                {
                if (cnt == 5)
                    j--;
                cnt=0;
                }
            dataBits[x] =0; // clean variable
            x++;
            }
        if (cnt >= 8)    // End of Frame detection
            etx_ptr=i;
        }
                

    for (i=0; i<etx_ptr-2; i++)   // Calculate Checksum
        chksum += nibble[i];
    chksum = ~chksum +1;
        
#ifdef __DEBUG__
    for (i=0; i<etx_ptr; i++)
        pc.printf("%0.2X ",nibble[i]);
    if ( (char)(chksum>>8) != nibble[etx_ptr-2] || (char)chksum != nibble[etx_ptr-1] )
        pc.printf("  CRC Error");
    pc.printf("\r\n");
#endif
    
    return 0;
}


void Init_X2D()
{
int Ctrl_Reg = 0;

    Rx.fall(&getPulseF);
    Rx.rise(&getPulseR);
    UART = 1;

    write_ctrl_reg(0x01E22F); // 1200 baud, deviation =1, Asynchrone
    Ctrl_Reg = read_ctrl_reg();
    DBG("Ctrl_reg = %X", Ctrl_Reg);

    RxTx = 1;       //set pin rxtx to Rx
    Reg_Data = 0;   //set pin reg_data 
    Tx = 0;

    xTime.start();
    xTime.reset();
    startedAt = xTime.read_us(); // set initial timer end

    //thread.start(getData);
}