serial teste pulga to pulga

Revision:
1:10de89ea1f70
Child:
2:b39f5ce4d5bd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/main.cpp	Sat May 02 03:01:56 2020 +0000
@@ -0,0 +1,546 @@
+#include "definitions.txt"
+
+
+/*Defines for PicID of display*/
+#define SCREEN_OFF 0x00
+#define SCREEN_STARTUP 0x01
+#define SCREEN_INIT 10
+#define SCREEN_CALIBRATING 0x14
+#define SCREEN_MAIN_MENU 0x28
+#define SCREEN_IN_OPERATION 0x32
+
+#define OPTION_CMD_VP 0x8/* OKadress to write cmd, send from display to mcu
+the value in this address must be the ascii value for the char*/
+#define MOV_MOTOR_VP 0x102
+#define DRIVE_PRESSURE_VP 0x100 //Pressao P.P tela 40
+#define PEEP_TARGET_VP 0x340 //OK Pressao Peep tela 40
+#define TINS_VP 0x110 //T. INspiracao tela40
+#define BPM_VP 0x120 //Bpm tela 40
+#define BREATH_TURN_ONOFF_VP 0x03E1//OK Botão Inicia da tela 40
+#define ASSISTED_SENSIBILITY_VP 0x350 //Modo Assistido tela 40
+#define KI_VP 0x110
+#define KP_VP 0x112
+#define KD_VP 0x114
+#define FIO2_VP 0x125 //FiO2 Tela 40
+#define ONOFF_ASSISTED_MODE_VP 0x170 //MODO ASSISTIDO tela 40
+
+Timer timer_main;
+
+RawSerial serial_to_pulga(P0_11, P0_8);
+
+float rx_pot[4];
+
+/*convert float data to fixed point data type*/
+uint16_t float_to_fixed(float input, int fix_bits)
+{
+    return (uint16_t)(input * (1 << fix_bits));
+}
+
+
+
+/*Do the scale converstion between analogic input (0 - 1) to Scale type wished
+@scale: scale to convert the pot val
+@pot_val: Analog input from potentiometer, it will take only 2 decimal digits,
+it is necessary to avoid floating of number to control code 
+*/
+float calc_scaled_value(unsigned int scale, float pot_val){
+    float ret;
+    int temp;
+    temp = (pot_val * 100);
+    pot_val = (temp / 100); 
+    switch(scale){
+        case SCALE_PP_PRESSURE:
+            ret = (pot_val * 34) + 1; 
+            break;
+        case SCALE_PEEP_PRESSURE:
+            ret = (10 * pot_val) + 5;
+            break;
+        case SCALE_BPM:
+            ret = (20 * pot_val) + 10;
+            break;
+        case SCALE_TINSP:
+            ret = (2.5 * pot_val) + 0.5;
+            break;
+        case SCALE_FIO2:
+            ret = (79 * pot_val) + 21;
+            break;
+        case SCALE_SENS_ASSISTED_MOD:
+            ret = (9 * pot_val) + 1;
+            break;
+        default:
+            ret = pot_val;
+            break;
+    }
+    return ret;
+}
+
+
+int update_parameter(float scaled_value, uint16_t vp, float min, float max, int fix_bits){
+    uint16_t data[1];
+    uint16_t aux;
+    if(scaled_value > max) scaled_value = max;
+    if(scaled_value < min) scaled_value = min;
+    if(fix_bits >0){
+        scaled_value = scaled_value * 10;
+        data[0] = (uint16_t)scaled_value;
+    }
+    else
+        data[0] = (uint16_t)scaled_value;
+    proculus_set_vp(0x5, vp, data);
+    return 0;
+}
+
+
+
+/*specific routine to get the screen at rx irq routine*/
+void get_screen_at_irq(){
+    proculus_get_ctrl(0x3, PIC_ID_H, 0x2); 
+}
+
+void update_screen(){
+    //update P.P Pressure
+    update_parameter(calc_scaled_value(SCALE_PP_PRESSURE, rx_pot[0]),
+                     DRIVE_PRESSURE_VP, 1.0, 35, 1
+                     );
+    //update BPM ok
+    update_parameter(calc_scaled_value(SCALE_BPM, rx_pot[1]),
+                     BPM_VP, 10, 30, 0
+                     );
+    //update TINSP
+    update_parameter(calc_scaled_value(SCALE_TINSP, rx_pot[2]),
+                     TINS_VP, 0.5, 3.0, 1
+                     );
+    //update FIO2 (Oxigen%)
+    update_parameter(calc_scaled_value(SCALE_FIO2, rx_pot[3]),
+                     FIO2_VP, 21, 100, 0
+                     );
+}
+
+int bc = 0;//byte couter
+int i_rx = 0;//counter to start receive rx at serial
+
+#define DELAY_UART 2000 //us
+void serial_rx_irq(){
+    int time_us;
+    char debug_msg[100];
+    char temp_char[10];
+    char rx_buffer[50] = "0";
+    int i = 0, j=0, k;
+    int bytes_to_rcv = 0;
+    struct proculus_pkt pkt; //to manage data
+    uint16_t data[255];//to store data
+    pkt.buffer = data;
+    int unknow = 1;//if unknow pkt come
+    /*
+    *Never remove the timer serial_timer, it keep the mininum time between
+    *two uart datas, if you have problem with serial, try change the DELAY_UART
+    *value, mbed api do not says anything about this timing issue
+    */
+    serial_timer.reset();//restart timer
+    serial_timer.start();
+    time_us = serial_timer.read_us();
+    while(time_us<DELAY_UART){
+        time_us = serial_timer.read_us();
+    }
+    //if(time_us >= DELAY_UART) 
+    //{
+        /*if(serial_rx_buffer[0] != 0x5a){ 
+            i_rx = 0;
+            //bc = 255;
+        }
+        if(i_rx >1 && serial_rx_buffer[1] != 0xa5){
+            i_rx = 0;
+            //bc = 255;
+        }*/
+        
+        while(serial1.readable()){//get only one byte per interrupt
+            serial_timer.reset();//restart timer
+            serial_timer.start();
+            time_us = serial_timer.read_us();
+            while(time_us<DELAY_UART){
+                time_us = serial_timer.read_us();
+            }
+            if(serial_rx_buffer[0] != 0x5a){ 
+               i_rx = 0;
+            //bc = 255;
+            }
+            if(i_rx >1 && serial_rx_buffer[1] != 0xa5){
+                i_rx = 0;
+            //bc = 255;
+            }
+            serial_rx_buffer[i_rx] = serial1.getc();
+            if(i_rx == 2)//get bc(how many byts will come
+                bc = serial_rx_buffer[2];
+            //sprintf(debug_msg,"serial_rx_buffer[%d] = %x\n",i_rx ,serial_rx_buffer[i_rx]);
+            //pc.puts(debug_msg);
+            if(bc > 0 && i_rx >2)//avoid decrement it when it  was got
+                bc--;
+            i_rx++;
+        }
+        
+        /*if(i_rx == 2)//get bc(how many byts will come
+            bc = serial_rx_buffer[2];*/
+        
+    //}
+    /*while(serial1.readable()){
+        serial_rx_buffer[i] = serial1.getc();
+        serial_timer.reset();
+        time_us = serial_timer.read_us();
+        while(time_us < DELAY_UART) 
+        {
+          time_us = serial_timer.read_us();
+        }
+        i++;
+    }*/
+    //serial_timer.reset();//restart timer
+    //serial_timer.start();
+    serial_timer.stop();
+    //j = 0;
+    //sprintf(debug_msg, "rx_bytes:%d \n bc = %d\n", i_rx, bc);
+    //pc.puts(debug_msg);
+    if(bc == 0 && i_rx >0){//packt was received
+        /*if(serial_rx_buffer[2] >= 0x80 && serial_rx_buffer[2] <= 0x84)  
+        {    
+            serial_to_proculus_pkt_2(serial_rx_buffer, &pkt);
+            unknow=0;
+        }*/
+        if(serial_rx_buffer[3] >= 0x80 && serial_rx_buffer[3] <= 0x84)  
+        {    
+            serial_to_proculus_pkt(serial_rx_buffer, &pkt);
+            unknow=0;
+        }
+        else
+            unknow = 1;//received something unknow
+    }
+    
+    if(unknow == 0){ 
+        if(pkt.cmd == W_VP){
+            switch(pkt.address){
+                case PEEP_TARGET_VP:
+                    display_option = 'e';
+                    display_data = pkt.buffer[0];//ISSUE is this data in fix point?
+                    display_ctrl = DISPLAY_CMD_DATA_ARRIVE;
+                    break;
+                case ASSISTED_SENSIBILITY_VP:
+                    display_option = 's';
+                    display_data = pkt.buffer[0];//ISSUE is this data in fix point?
+                    display_ctrl = DISPLAY_CMD_DATA_ARRIVE;
+                    break;   
+                default:
+                    break;
+            }
+        }   
+        if(pkt.cmd == R_VP){
+            switch(pkt.address){
+            case OPTION_CMD_VP:
+                display_ctrl = DISPLAY_CMD_START;//active in next serial loop to do the ctrl
+                display_option = (char)pkt.buffer[0];
+                switch(display_option){//if this CMD needs data claim for it
+                case 'm':
+                    proculus_get_vp(0x4, MOV_MOTOR_VP, 0x1);
+                    display_ctrl = DISPLAY_CMD_WAITING_DATA; //wait for data from display
+                    break;
+                case 'p'://just show value in display
+                //    update_parameter(calc_scaled_value(SCALE_PP_PRESSURE, Pot1.read()),
+                 //    DRIVE_PRESSURE_VP, 'p', 1.0, 35, 3
+                  //   );
+                    break;
+                case 'e':
+                    proculus_get_vp(0x4, PEEP_TARGET_VP, 0x1);
+                    display_ctrl = DISPLAY_CMD_WAITING_DATA; //wait for data from display
+                    break;
+                case 't':
+                    //update_parameter(calc_scaled_value(SCALE_TINSP, Pot3.read()),
+                    // TINS_VP, 't', 0.5, 3.0, 4
+                    // );
+                    break;
+                case 'c':
+                    //update_parameter(calc_scaled_value(SCALE_BPM, Pot2.read()),
+                    // BPM_VP, 'c', 10, 30, 8
+                    // );
+                    break;
+                case 'S':
+                    proculus_get_vp(0x4, BREATH_TURN_ONOFF_VP, 0x1);
+                    display_ctrl = DISPLAY_CMD_WAITING_DATA; //wait for data from display
+                    break;
+                case 's':
+                    proculus_get_vp(0x4, ASSISTED_SENSIBILITY_VP, 0x1);
+                    display_ctrl = DISPLAY_CMD_WAITING_DATA; //wait for data from display
+                    break;
+                case 'I':
+                    proculus_get_vp(0x4, KI_VP, 0x1);
+                    display_ctrl = DISPLAY_CMD_WAITING_DATA; //wait for data from display
+                    break;
+                case 'P':
+                    proculus_get_vp(0x4, KP_VP, 0x1);
+                    display_ctrl = DISPLAY_CMD_WAITING_DATA; //wait for data from display
+                    break;
+                case 'D':
+                    proculus_get_vp(0x4, KD_VP, 0x1);
+                    display_ctrl = DISPLAY_CMD_WAITING_DATA; //wait for data from display
+                    break;
+                case 'o':
+                    //update_parameter(calc_scaled_value(SCALE_FIO2, Pot4.read()),
+                    // FIO2_VP, 'o', 0.5, 21, 100
+                    // );
+                    break;
+                case 'A':
+                    proculus_get_vp(0x4, ONOFF_ASSISTED_MODE_VP, 0x1);
+                    display_ctrl = DISPLAY_CMD_WAITING_DATA; //wait for data from display
+                    break;    
+                default:
+                    //print warning
+                    break;
+                }//switch    
+                break;
+            case BREATH_TURN_ONOFF_VP://TEST OK
+                display_option = 'S';
+                display_data = pkt.buffer[0];//for while let it as single uint16
+                display_ctrl = DISPLAY_CMD_DATA_ARRIVE; //wait for data from display
+                break;
+            case PEEP_TARGET_VP:
+                display_option = 'e';
+                display_data = pkt.buffer[0];//ISSUE is this data in fix point?
+                display_ctrl = DISPLAY_CMD_DATA_ARRIVE;
+                break;
+            case ASSISTED_SENSIBILITY_VP:
+                //sprintf(debug_msg,"Assi_sens = %x \n", pkt.buffer[0]);
+                //pc.puts(debug_msg);
+                display_option = 's';
+                display_data = pkt.buffer[0];//ISSUE is this data in fix point?
+                display_ctrl = DISPLAY_CMD_DATA_ARRIVE;
+                break; 
+            default:
+                 break;
+            }//switch
+        }//if
+        if(pkt.cmd == R_CTRL_REG){//from a read control register comand
+            //pc.puts("control reg \n");
+            if(pkt.address == PIC_ID_H){//read screen cmd
+                screen_id = (pkt.buffer[0] << 8 );
+                screen_id |= pkt.buffer[1];
+                //sprintf(debug_msg,"screen_id = %x \n", screen_id);
+                //pc.puts(debug_msg);
+                //if(PISTON_HOM_PIN == HIGH){
+                    switch(screen_id){
+                        case SCREEN_CALIBRATING:
+                            jump_to_screen(SCREEN_MAIN_MENU);
+                            break;
+                        case SCREEN_INIT:
+                            jump_to_screen(SCREEN_CALIBRATING);
+                            break; 
+                        case SCREEN_OFF:
+                            jump_to_screen(SCREEN_STARTUP);
+                            break;
+                        case SCREEN_STARTUP:
+                            jump_to_screen(SCREEN_INIT);
+                            break;
+                        default:
+                            //print warning
+                            break;
+                    }
+                //}else{
+                  //  jump_to_screen(SCREEN_MAIN_MENU);
+                //}
+            }
+        }
+        i = 0;
+        while(i<100){
+            serial_rx_buffer[i] = 0x0;
+            i++;
+        }    
+        i_rx = 0;
+    }
+}
+
+struct pulga_pkt {
+    uint8_t header_h;
+    uint8_t header_l;
+    uint8_t count;
+    uint8_t cmd;
+    uint16_t address;
+    uint16_t *buffer;
+};
+
+
+//PULGA TO PULGA SERIAL PROTOCOL P2PS
+/*9A A9       BC          CMD       DATA
+  HH HL   Byte to come   Command    datas
+*/
+
+#define PULGA_CMD_SEND_POT_DATA 0x40
+/*
+*serial_to_proculus_pkt: get the data received in serial rx and translate
+*to proculus_pkt
+*@pkt is pointer to the struct to store datas
+*/
+int serial_to_pulga_pkt(char *serial_data, struct pulga_pkt *pkt){
+    pkt->header_h = serial_data[0];
+    pkt->header_l = serial_data[1];
+    pkt->count = serial_data[2];
+    pkt->cmd = serial_data[3];
+    if(pkt->cmd == PULGA_CMD_SEND_POT_DATA){
+        pkt->address = serial_data[4];
+        pkt->buffer[0] = (serial_data[5] << 8);
+        pkt->buffer[0] |= serial_data[6];
+    }
+    return 0;
+}
+char rx_pulga_buffer[100];
+void clear_pulga_buffer(){
+    int i = 0;
+    char msg[30] = "PKT:";
+    char t[3];
+    while(i<10){
+        sprintf(t,"%x",rx_pulga_buffer[i]);
+        strcat(msg, t);
+        rx_pulga_buffer[i] = 0x0;
+        i++;
+    }   
+    pc.puts(msg);
+    pc.puts("\n"); 
+}
+
+//***********************************************************************************************
+#define DELAY_P2PS 10000 //us
+
+int rx_i = 0;
+int pulga_bc = 0;
+Timer pulga_rx_timer;
+void serial_pulga_rx(){
+    int i=0, unknow = 1;
+    struct pulga_pkt pulga_pkt;
+    uint16_t data[2];
+    int time_us;
+    char debug_msg[100];
+    pulga_pkt.buffer = data;
+    pulga_rx_timer.reset();//restart timer
+    pulga_rx_timer.start();
+    //time_us = pulga_rx_timer.read_us();
+    //while(time_us<DELAY_P2PS){
+    //    time_us = pulga_rx_timer.read_us();
+    //}
+    /*if(rx_pulga_buffer[0] != 0x9a){ 
+        rx_i = 0;
+    }
+    if(rx_i >1 && rx_pulga_buffer[1] != 0xa9){
+        rx_i = 0;
+    }*/
+        
+    while(serial_to_pulga.readable()){//get only one byte per interrupt
+        if(rx_pulga_buffer[0] != 0x9a){//avoid noise 
+            rx_i = 0;
+            pulga_bc = 0;
+            clear_pulga_buffer();
+        }
+        if(rx_i >1 && rx_pulga_buffer[1] != 0xa9){//avoid noise
+            rx_i = 0;
+            pulga_bc = 0;
+            clear_pulga_buffer();
+        }
+        if( i>3 && rx_pulga_buffer[3] < 0x40 || rx_pulga_buffer[3] > 0x49){//avoid noise
+            rx_i = 0;
+            pulga_bc = 0;
+            clear_pulga_buffer();
+        }
+        
+        /*pulga_rx_timer.reset();//restart timer
+        pulga_rx_timer.start();
+        time_us = pulga_rx_timer.read_us();
+        while(time_us<DELAY_P2PS){
+            time_us = pulga_rx_timer.read_us();
+        }*/
+        rx_pulga_buffer[rx_i] = serial_to_pulga.getc();
+        
+        if(rx_i == 2)//get bc(how many byts will come
+            pulga_bc = rx_pulga_buffer[2];
+        
+        if(pulga_bc > 0 && rx_i > 2)//avoid decrement it when it  was got
+            pulga_bc--;
+        /*   
+        sprintf(debug_msg,"rx_pulga_buffer[%d] = %x\n",rx_i ,rx_pulga_buffer[rx_i]);
+        pc.puts(debug_msg);
+        sprintf(debug_msg,"pulga_bc = %d\n",pulga_bc);
+        pc.puts(debug_msg);
+        */
+        
+        rx_i++;
+        if(pulga_bc == 0 && rx_i > 2)
+            rx_i = 0;
+    }
+        
+    /*if(rx_i == 2)//get bc(how many byts will come
+        pulga_bc = rx_pulga_buffer[2];*/
+    
+    if(pulga_bc == 0 && rx_i >0){
+        //
+        if(rx_pulga_buffer[3] >= 0x40 && rx_pulga_buffer[3] <= 0x49)  
+        {    
+            serial_to_pulga_pkt(rx_pulga_buffer, &pulga_pkt);
+            unknow=0;
+        }
+        else
+            unknow = 1;//received something unknow
+    }
+    if(unknow == 0){
+        //Do logic Here
+        if(pulga_pkt.cmd == PULGA_CMD_SEND_POT_DATA){
+            rx_pot[pulga_pkt.address - 1] = (pulga_pkt.buffer[0] / 1000);
+        }
+        clear_pulga_buffer();
+        rx_i = 0;
+        pulga_bc = 0;
+    }
+        
+}
+
+void Setup() 
+//Description: Main setup function, called after power on or reset
+//Inputs:   void
+//Outputs:  void
+{
+    
+    //setup the device rx irq handler
+    serial1.attach(&serial_rx_irq, RawSerial::RxIrq);
+    serial_to_pulga.attach(&serial_pulga_rx, RawSerial::RxIrq);
+    //setup the baud rate to match with display
+    serial1.baud(115200);
+    serial_to_pulga.baud(9600);
+    
+    //display_timeout.attach(&get_screen_at_irq, 0.5);
+    display_ticker.attach(&get_screen_at_irq, 0.4);
+    //display_ticker.attach(&update_screen, 0.3);
+    
+}
+
+void Send_to_pulga(){
+    char temp[20];
+    if(display_option != '\0')
+    {
+        serial_to_pulga.putc(display_option);
+        display_option = '\0';
+    }
+    
+    if(display_ctrl == DISPLAY_CMD_DATA_ARRIVE)
+    {
+        sprintf(temp, "%f", display_data);
+        serial_to_pulga.puts(temp);
+        display_ctrl = DISPLAY_CMD_DONE;
+    }
+}
+
+//***********************************************************************************************
+int main()
+{
+    //wait(3);//time to display setup. not sure about this value
+    Setup();
+    jump_to_screen(SCREEN_STARTUP);
+    while (true) {
+        //update_screen();
+        //Send_to_pulga();
+        //pc.puts("teste \n");
+        serial_to_pulga.puts("test output\n");
+        //serial_to_pulga.puts("puts \n");
+        wait(0.3);
+    }
+}
\ No newline at end of file