serial teste pulga to pulga
Source/main.cpp
- Committer:
- ruschigo
- Date:
- 2020-05-03
- Revision:
- 2:b39f5ce4d5bd
- Parent:
- 1:10de89ea1f70
File content as of revision 2:b39f5ce4d5bd:
#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 #define MODSERIAL_DEFAULT_RX_BUFFER_SIZE 512 #define MODSERIAL_DEFAULT_TX_BUFFER_SIZE 1024 Timer timer_main; Serial 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 void clear_display_buffer(){ int i = 0; char msg[30] = "DISPLAY:"; char t[3]; while(i<7){ sprintf(t,"%x",serial_rx_buffer[i]); strcat(msg, t); serial_rx_buffer[i] = 0x0; i++; } //pc.puts(msg); //pc.puts("\n"); } #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 while(serial1.readable()){ serial_rx_buffer[i_rx] = serial1.getc(); i_rx++; if(i_rx>=8){ i_rx = 0; //pc_puts(rx_pulga_buffer, 7); break; } } /* *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(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); //} } } clear_display_buffer(); 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<7){ 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; while(serial_to_pulga.readable()){ rx_pulga_buffer[rx_i] = serial_to_pulga.getc(); rx_i++; if(rx_i>=7){ rx_i = 0; //pc_puts(rx_pulga_buffer, 7); break; } } //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(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; } } 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 pc_puts(const char *str, int size){ int i = 0; while(i < size){ pc.putc(str[i]); i++; } return 0; }*/ //*********************************************************************************************** int main() { wait(3);//time to display setup. not sure about this value Setup(); jump_to_screen(SCREEN_STARTUP); int i = 0; while (true) { //jump_to_screen(SCREEN_STARTUP); //update_screen(); //Send_to_pulga(); serial_pulga_rx(); wait(0.2); serial_rx_irq(); } }