proculus_display_pulga

Source/main.cpp

Committer:
ruschigo
Date:
2020-04-27
Revision:
1:2e4f9cb1c3e9
Child:
2:afae00ebf9ba

File content as of revision 1:2e4f9cb1c3e9:

#include "mbed.h"
#include "proculus_display.h"

unsigned int sensor_open;//fim de curso fake

#define SCREEN_CALIBRATING 0x14

uint16_t screen_id = 0x00;

void serial_tx_irq(){
    debug_serial->puts("TX");
}

void serial_rx_irq(){
    int i = 0, j, k;
    struct proculus_pkt pkt;
    uint16_t data[255];
    char msg[100];
    //char rx_buffer[100];
    pkt.buffer = data;
    int unknow = 0;
    //wait(SERIAL_DELAY/1000);
    sprintf(msg, "rx_to_rcv=%d",rx_to_rcv);
    debug_serial->puts("_|_");
    debug_serial->puts(msg);
    while(serial1.readable() || rx_to_rcv >0){
        //while(!serial1.readable()); 
        serial_rx_buffer[i] = serial1.getc();
        /*if(i == 0 && serial_rx_buffer[0] == 0x5a){//header packet start
            i++;
            rx_to_rcv--;
            while(serial_rx_buffer[i] != 0xa5){
                if(serial1.readable())
                    serial_rx_buffer[i] = serial1.getc();
            }
        }*/
        i++;
        /*THIS IS ALTERNATIVE TO SOLVE A BUG, BUT NOT FIX THE BUG
        BUG: Uart interrupt is activates twice, then it read the header_h (5a)
        close the interruption, open a new one starting from header_l (5a)
        then nothing will work fine at all, creating the rx_to_rcv, i know how
        many bytes should be read, then just stay here until it complete the
        full packet*/
        rx_to_rcv --;
        if(rx_to_rcv <= 0)
            break;
    }
#ifdef DEBUG_SERIAL
    //debug_puts(rx_buffer, i);//print pure data to be read as hex
    if(i>1){
        debug_serial->puts("_|_");
        raw_to_string(serial_rx_buffer, msg, i);
        debug_serial->puts(msg);
        debug_serial->puts("_|_");
        sprintf(msg, "i=%d",i);
        debug_serial->puts(msg);
        debug_serial->puts("_|_");
    }
    
#endif
    if(i>1  && rx_to_rcv == 0){
        if(serial_rx_buffer[3] >= 0x80 && serial_rx_buffer[3] <= 0x84)  
            //serial_to_proculus_pkt(&pkt);
        {    
            j = 0;
            k = 0;
            pkt.header_h = serial_rx_buffer[0];
            pkt.header_l = serial_rx_buffer[1];
            pkt.count = serial_rx_buffer[2];
            pkt.cmd = serial_rx_buffer[3];
            if(pkt.cmd == R_CTRL_REG){
                pkt.address = serial_rx_buffer[4];
                pkt.lenght = serial_rx_buffer[5];
                while(j < pkt.lenght){
                    pkt.buffer[i] = serial_rx_buffer[6 + j];
                    j++;
                }
            }
            else{
                pkt.address = serial_rx_buffer[4] << 8;
                pkt.address |= serial_rx_buffer[5];
                pkt.lenght = serial_rx_buffer[6];
                while(j < pkt.lenght){
                    pkt.buffer[j] = serial_rx_buffer[7 + k] << 8;
                    pkt.buffer[j] |= serial_rx_buffer[8 + k];
                    j++;
                    k += 2;
                }
            }
            unknow=0;
        }
        else
            unknow = 1;//received something unknow
    }
    
    if(unknow ==0){
        //sprintf(msg, "rx_buffer[0]=%x|i=%d", rx_buffer[0],i);
        //debug_serial->puts(msg);
    
        if(serial_rx_buffer[3] == R_VP){
        //if(pkt.address == 0x32){
            //data[0] = data[0] + 1;
            //proculus_set_vp(0x5, 10, pkt.buffer);
        //}
        }
        if(pkt.cmd == R_CTRL_REG){//
        //if(serial_rx_buffer[3] == R_CTRL_REG){//from a read control register comand
            //sprintf(msg, "pkt.address=%x",pkt.address );
            //sprintf(msg, "serial_rx_buffer[4]=%x",serial_rx_buffer[4]);
            //debug_serial->puts(msg);
            //debug_serial->puts("_|_");
            if(pkt.address == PIC_ID_H){//
            //if(serial_rx_buffer[4] == PIC_ID_H){//read screen cmd
                //screen_id = (serial_rx_buffer[6] << 8 );
                //screen_id |= serial_rx_buffer[7];
                screen_id = (pkt.buffer[0] << 8 );
                screen_id |= pkt.buffer[1];
                sprintf(msg, "screen_id=%x",screen_id);
                debug_serial->puts(msg);
                debug_serial->puts("_|_");
                if(screen_id == SCREEN_CALIBRATING)
                    jump_to_screen(0x46);
                else
                    jump_to_screen(0);
            }else
                jump_to_screen(96);
        }
    }
    else{
        debug_serial->puts("unknowPKT");
        debug_serial->puts("_|_");
    }
     //sprintf(msg, "pkt.address=%x", serial_rx_buffer[1]);
    //strcpy(serial_rx_buffer, "init");
    //debug_serial->puts(msg);
        
}


//stop all measures, and stop any action
int system_stop(){
    return 0;
}

int get_screen_at_irq(){
    int i = 0;
    strcpy(serial_rx_buffer, "");
    while(serial1.readable()){//clean anything in buffer before send cmd
        serial_rx_buffer[i] = serial1.getc();
        i++;
    }
    //serial1.attach(0);
    while(rx_to_rcv);
    proculus_get_ctrl(0x3, PIC_ID_H, 0x2);
    //serial1.attach(&serial_rx_irq);
    return 0;    
}

int main()
{
    //simulate sensor "fim de curso"
    sensor_open = 0;
    
    uint16_t data[100];//buffer to store vp datas
    uint16_t ctrl_data[2];//buffer to store ctrl_reg datas
    int i = 0x00, j=0;
    struct proculus_pkt pkt;
    //setup the device rx irq handler
    serial1.attach(&serial_rx_irq, RawSerial::RxIrq);
    //serial1->attach(&serial_tx_irq, RawSerial::TxIrq);
    //serial1->attach(&serial_rx_irq);
    //setup the baud rate to match with display
    serial1.baud(115200);
#ifdef DEBUG_SERIAL
    debug_serial->baud(115200);
    debug_serial->puts("start");
#endif
    wait(3);
    sensor_open = 0;
    while(1) {
        
        if(!sensor_open){//are the device secure to operate?
            get_screen_at_irq();
            wait(3);
        }else{
            system_stop();
            jump_to_screen(SCREEN_CALIBRATING);
#ifdef DEBUG_CONSOLE
            debug_serial->puts("Check if the device is properly closed");
#endif
        }
        //if(sensor_open != 0)//simulates that the door is open for 3 seconds
        //{
        //    sensor_open--;
        //    wait(1);
        //}
    }
}