serial teste pulga to pulga

Committer:
ruschigo
Date:
Sun May 03 15:22:29 2020 +0000
Revision:
2:b39f5ce4d5bd
Parent:
1:10de89ea1f70
a

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ruschigo 1:10de89ea1f70 1 #include "definitions.txt"
ruschigo 1:10de89ea1f70 2
ruschigo 1:10de89ea1f70 3
ruschigo 1:10de89ea1f70 4 /*Defines for PicID of display*/
ruschigo 1:10de89ea1f70 5 #define SCREEN_OFF 0x00
ruschigo 1:10de89ea1f70 6 #define SCREEN_STARTUP 0x01
ruschigo 1:10de89ea1f70 7 #define SCREEN_INIT 10
ruschigo 1:10de89ea1f70 8 #define SCREEN_CALIBRATING 0x14
ruschigo 1:10de89ea1f70 9 #define SCREEN_MAIN_MENU 0x28
ruschigo 1:10de89ea1f70 10 #define SCREEN_IN_OPERATION 0x32
ruschigo 1:10de89ea1f70 11
ruschigo 1:10de89ea1f70 12 #define OPTION_CMD_VP 0x8/* OKadress to write cmd, send from display to mcu
ruschigo 1:10de89ea1f70 13 the value in this address must be the ascii value for the char*/
ruschigo 1:10de89ea1f70 14 #define MOV_MOTOR_VP 0x102
ruschigo 1:10de89ea1f70 15 #define DRIVE_PRESSURE_VP 0x100 //Pressao P.P tela 40
ruschigo 1:10de89ea1f70 16 #define PEEP_TARGET_VP 0x340 //OK Pressao Peep tela 40
ruschigo 1:10de89ea1f70 17 #define TINS_VP 0x110 //T. INspiracao tela40
ruschigo 1:10de89ea1f70 18 #define BPM_VP 0x120 //Bpm tela 40
ruschigo 1:10de89ea1f70 19 #define BREATH_TURN_ONOFF_VP 0x03E1//OK Botão Inicia da tela 40
ruschigo 1:10de89ea1f70 20 #define ASSISTED_SENSIBILITY_VP 0x350 //Modo Assistido tela 40
ruschigo 1:10de89ea1f70 21 #define KI_VP 0x110
ruschigo 1:10de89ea1f70 22 #define KP_VP 0x112
ruschigo 1:10de89ea1f70 23 #define KD_VP 0x114
ruschigo 1:10de89ea1f70 24 #define FIO2_VP 0x125 //FiO2 Tela 40
ruschigo 1:10de89ea1f70 25 #define ONOFF_ASSISTED_MODE_VP 0x170 //MODO ASSISTIDO tela 40
ruschigo 1:10de89ea1f70 26
ruschigo 2:b39f5ce4d5bd 27 #define MODSERIAL_DEFAULT_RX_BUFFER_SIZE 512
ruschigo 2:b39f5ce4d5bd 28 #define MODSERIAL_DEFAULT_TX_BUFFER_SIZE 1024
ruschigo 2:b39f5ce4d5bd 29
ruschigo 1:10de89ea1f70 30 Timer timer_main;
ruschigo 1:10de89ea1f70 31
ruschigo 2:b39f5ce4d5bd 32 Serial serial_to_pulga(P0_11, P0_8);
ruschigo 1:10de89ea1f70 33
ruschigo 1:10de89ea1f70 34 float rx_pot[4];
ruschigo 1:10de89ea1f70 35
ruschigo 1:10de89ea1f70 36 /*convert float data to fixed point data type*/
ruschigo 1:10de89ea1f70 37 uint16_t float_to_fixed(float input, int fix_bits)
ruschigo 1:10de89ea1f70 38 {
ruschigo 1:10de89ea1f70 39 return (uint16_t)(input * (1 << fix_bits));
ruschigo 1:10de89ea1f70 40 }
ruschigo 1:10de89ea1f70 41
ruschigo 1:10de89ea1f70 42
ruschigo 1:10de89ea1f70 43
ruschigo 1:10de89ea1f70 44 /*Do the scale converstion between analogic input (0 - 1) to Scale type wished
ruschigo 1:10de89ea1f70 45 @scale: scale to convert the pot val
ruschigo 1:10de89ea1f70 46 @pot_val: Analog input from potentiometer, it will take only 2 decimal digits,
ruschigo 1:10de89ea1f70 47 it is necessary to avoid floating of number to control code
ruschigo 1:10de89ea1f70 48 */
ruschigo 1:10de89ea1f70 49 float calc_scaled_value(unsigned int scale, float pot_val){
ruschigo 1:10de89ea1f70 50 float ret;
ruschigo 1:10de89ea1f70 51 int temp;
ruschigo 1:10de89ea1f70 52 temp = (pot_val * 100);
ruschigo 1:10de89ea1f70 53 pot_val = (temp / 100);
ruschigo 1:10de89ea1f70 54 switch(scale){
ruschigo 1:10de89ea1f70 55 case SCALE_PP_PRESSURE:
ruschigo 1:10de89ea1f70 56 ret = (pot_val * 34) + 1;
ruschigo 1:10de89ea1f70 57 break;
ruschigo 1:10de89ea1f70 58 case SCALE_PEEP_PRESSURE:
ruschigo 1:10de89ea1f70 59 ret = (10 * pot_val) + 5;
ruschigo 1:10de89ea1f70 60 break;
ruschigo 1:10de89ea1f70 61 case SCALE_BPM:
ruschigo 1:10de89ea1f70 62 ret = (20 * pot_val) + 10;
ruschigo 1:10de89ea1f70 63 break;
ruschigo 1:10de89ea1f70 64 case SCALE_TINSP:
ruschigo 1:10de89ea1f70 65 ret = (2.5 * pot_val) + 0.5;
ruschigo 1:10de89ea1f70 66 break;
ruschigo 1:10de89ea1f70 67 case SCALE_FIO2:
ruschigo 1:10de89ea1f70 68 ret = (79 * pot_val) + 21;
ruschigo 1:10de89ea1f70 69 break;
ruschigo 1:10de89ea1f70 70 case SCALE_SENS_ASSISTED_MOD:
ruschigo 1:10de89ea1f70 71 ret = (9 * pot_val) + 1;
ruschigo 1:10de89ea1f70 72 break;
ruschigo 1:10de89ea1f70 73 default:
ruschigo 1:10de89ea1f70 74 ret = pot_val;
ruschigo 1:10de89ea1f70 75 break;
ruschigo 1:10de89ea1f70 76 }
ruschigo 1:10de89ea1f70 77 return ret;
ruschigo 1:10de89ea1f70 78 }
ruschigo 1:10de89ea1f70 79
ruschigo 1:10de89ea1f70 80
ruschigo 1:10de89ea1f70 81 int update_parameter(float scaled_value, uint16_t vp, float min, float max, int fix_bits){
ruschigo 1:10de89ea1f70 82 uint16_t data[1];
ruschigo 1:10de89ea1f70 83 uint16_t aux;
ruschigo 1:10de89ea1f70 84 if(scaled_value > max) scaled_value = max;
ruschigo 1:10de89ea1f70 85 if(scaled_value < min) scaled_value = min;
ruschigo 1:10de89ea1f70 86 if(fix_bits >0){
ruschigo 1:10de89ea1f70 87 scaled_value = scaled_value * 10;
ruschigo 1:10de89ea1f70 88 data[0] = (uint16_t)scaled_value;
ruschigo 1:10de89ea1f70 89 }
ruschigo 1:10de89ea1f70 90 else
ruschigo 1:10de89ea1f70 91 data[0] = (uint16_t)scaled_value;
ruschigo 1:10de89ea1f70 92 proculus_set_vp(0x5, vp, data);
ruschigo 1:10de89ea1f70 93 return 0;
ruschigo 1:10de89ea1f70 94 }
ruschigo 1:10de89ea1f70 95
ruschigo 1:10de89ea1f70 96
ruschigo 1:10de89ea1f70 97
ruschigo 1:10de89ea1f70 98 /*specific routine to get the screen at rx irq routine*/
ruschigo 1:10de89ea1f70 99 void get_screen_at_irq(){
ruschigo 1:10de89ea1f70 100 proculus_get_ctrl(0x3, PIC_ID_H, 0x2);
ruschigo 1:10de89ea1f70 101 }
ruschigo 1:10de89ea1f70 102
ruschigo 1:10de89ea1f70 103 void update_screen(){
ruschigo 1:10de89ea1f70 104 //update P.P Pressure
ruschigo 1:10de89ea1f70 105 update_parameter(calc_scaled_value(SCALE_PP_PRESSURE, rx_pot[0]),
ruschigo 1:10de89ea1f70 106 DRIVE_PRESSURE_VP, 1.0, 35, 1
ruschigo 1:10de89ea1f70 107 );
ruschigo 1:10de89ea1f70 108 //update BPM ok
ruschigo 1:10de89ea1f70 109 update_parameter(calc_scaled_value(SCALE_BPM, rx_pot[1]),
ruschigo 1:10de89ea1f70 110 BPM_VP, 10, 30, 0
ruschigo 1:10de89ea1f70 111 );
ruschigo 1:10de89ea1f70 112 //update TINSP
ruschigo 1:10de89ea1f70 113 update_parameter(calc_scaled_value(SCALE_TINSP, rx_pot[2]),
ruschigo 1:10de89ea1f70 114 TINS_VP, 0.5, 3.0, 1
ruschigo 1:10de89ea1f70 115 );
ruschigo 1:10de89ea1f70 116 //update FIO2 (Oxigen%)
ruschigo 1:10de89ea1f70 117 update_parameter(calc_scaled_value(SCALE_FIO2, rx_pot[3]),
ruschigo 1:10de89ea1f70 118 FIO2_VP, 21, 100, 0
ruschigo 1:10de89ea1f70 119 );
ruschigo 1:10de89ea1f70 120 }
ruschigo 1:10de89ea1f70 121
ruschigo 1:10de89ea1f70 122 int bc = 0;//byte couter
ruschigo 1:10de89ea1f70 123 int i_rx = 0;//counter to start receive rx at serial
ruschigo 1:10de89ea1f70 124
ruschigo 2:b39f5ce4d5bd 125 void clear_display_buffer(){
ruschigo 2:b39f5ce4d5bd 126 int i = 0;
ruschigo 2:b39f5ce4d5bd 127 char msg[30] = "DISPLAY:";
ruschigo 2:b39f5ce4d5bd 128 char t[3];
ruschigo 2:b39f5ce4d5bd 129 while(i<7){
ruschigo 2:b39f5ce4d5bd 130 sprintf(t,"%x",serial_rx_buffer[i]);
ruschigo 2:b39f5ce4d5bd 131 strcat(msg, t);
ruschigo 2:b39f5ce4d5bd 132 serial_rx_buffer[i] = 0x0;
ruschigo 2:b39f5ce4d5bd 133 i++;
ruschigo 2:b39f5ce4d5bd 134 }
ruschigo 2:b39f5ce4d5bd 135 //pc.puts(msg);
ruschigo 2:b39f5ce4d5bd 136 //pc.puts("\n");
ruschigo 2:b39f5ce4d5bd 137 }
ruschigo 2:b39f5ce4d5bd 138
ruschigo 1:10de89ea1f70 139 #define DELAY_UART 2000 //us
ruschigo 1:10de89ea1f70 140 void serial_rx_irq(){
ruschigo 1:10de89ea1f70 141 int time_us;
ruschigo 1:10de89ea1f70 142 char debug_msg[100];
ruschigo 1:10de89ea1f70 143 char temp_char[10];
ruschigo 1:10de89ea1f70 144 char rx_buffer[50] = "0";
ruschigo 1:10de89ea1f70 145 int i = 0, j=0, k;
ruschigo 1:10de89ea1f70 146 int bytes_to_rcv = 0;
ruschigo 1:10de89ea1f70 147 struct proculus_pkt pkt; //to manage data
ruschigo 1:10de89ea1f70 148 uint16_t data[255];//to store data
ruschigo 1:10de89ea1f70 149 pkt.buffer = data;
ruschigo 1:10de89ea1f70 150 int unknow = 1;//if unknow pkt come
ruschigo 2:b39f5ce4d5bd 151 while(serial1.readable()){
ruschigo 2:b39f5ce4d5bd 152 serial_rx_buffer[i_rx] = serial1.getc();
ruschigo 2:b39f5ce4d5bd 153 i_rx++;
ruschigo 2:b39f5ce4d5bd 154 if(i_rx>=8){
ruschigo 2:b39f5ce4d5bd 155 i_rx = 0;
ruschigo 2:b39f5ce4d5bd 156 //pc_puts(rx_pulga_buffer, 7);
ruschigo 2:b39f5ce4d5bd 157 break;
ruschigo 2:b39f5ce4d5bd 158 }
ruschigo 2:b39f5ce4d5bd 159 }
ruschigo 1:10de89ea1f70 160 /*
ruschigo 1:10de89ea1f70 161 *Never remove the timer serial_timer, it keep the mininum time between
ruschigo 1:10de89ea1f70 162 *two uart datas, if you have problem with serial, try change the DELAY_UART
ruschigo 1:10de89ea1f70 163 *value, mbed api do not says anything about this timing issue
ruschigo 1:10de89ea1f70 164 */
ruschigo 2:b39f5ce4d5bd 165 /*serial_timer.reset();//restart timer
ruschigo 1:10de89ea1f70 166 serial_timer.start();
ruschigo 1:10de89ea1f70 167 time_us = serial_timer.read_us();
ruschigo 1:10de89ea1f70 168 while(time_us<DELAY_UART){
ruschigo 1:10de89ea1f70 169 time_us = serial_timer.read_us();
ruschigo 2:b39f5ce4d5bd 170 }*/
ruschigo 1:10de89ea1f70 171 //if(time_us >= DELAY_UART)
ruschigo 1:10de89ea1f70 172 //{
ruschigo 1:10de89ea1f70 173 /*if(serial_rx_buffer[0] != 0x5a){
ruschigo 1:10de89ea1f70 174 i_rx = 0;
ruschigo 1:10de89ea1f70 175 //bc = 255;
ruschigo 1:10de89ea1f70 176 }
ruschigo 1:10de89ea1f70 177 if(i_rx >1 && serial_rx_buffer[1] != 0xa5){
ruschigo 1:10de89ea1f70 178 i_rx = 0;
ruschigo 1:10de89ea1f70 179 //bc = 255;
ruschigo 1:10de89ea1f70 180 }*/
ruschigo 1:10de89ea1f70 181
ruschigo 2:b39f5ce4d5bd 182 /* while(serial1.readable()){//get only one byte per interrupt
ruschigo 1:10de89ea1f70 183 serial_timer.reset();//restart timer
ruschigo 1:10de89ea1f70 184 serial_timer.start();
ruschigo 1:10de89ea1f70 185 time_us = serial_timer.read_us();
ruschigo 1:10de89ea1f70 186 while(time_us<DELAY_UART){
ruschigo 1:10de89ea1f70 187 time_us = serial_timer.read_us();
ruschigo 1:10de89ea1f70 188 }
ruschigo 1:10de89ea1f70 189 if(serial_rx_buffer[0] != 0x5a){
ruschigo 1:10de89ea1f70 190 i_rx = 0;
ruschigo 1:10de89ea1f70 191 //bc = 255;
ruschigo 1:10de89ea1f70 192 }
ruschigo 1:10de89ea1f70 193 if(i_rx >1 && serial_rx_buffer[1] != 0xa5){
ruschigo 1:10de89ea1f70 194 i_rx = 0;
ruschigo 1:10de89ea1f70 195 //bc = 255;
ruschigo 1:10de89ea1f70 196 }
ruschigo 1:10de89ea1f70 197 serial_rx_buffer[i_rx] = serial1.getc();
ruschigo 1:10de89ea1f70 198 if(i_rx == 2)//get bc(how many byts will come
ruschigo 1:10de89ea1f70 199 bc = serial_rx_buffer[2];
ruschigo 1:10de89ea1f70 200 //sprintf(debug_msg,"serial_rx_buffer[%d] = %x\n",i_rx ,serial_rx_buffer[i_rx]);
ruschigo 1:10de89ea1f70 201 //pc.puts(debug_msg);
ruschigo 1:10de89ea1f70 202 if(bc > 0 && i_rx >2)//avoid decrement it when it was got
ruschigo 1:10de89ea1f70 203 bc--;
ruschigo 1:10de89ea1f70 204 i_rx++;
ruschigo 1:10de89ea1f70 205 }
ruschigo 1:10de89ea1f70 206
ruschigo 1:10de89ea1f70 207 /*if(i_rx == 2)//get bc(how many byts will come
ruschigo 1:10de89ea1f70 208 bc = serial_rx_buffer[2];*/
ruschigo 1:10de89ea1f70 209
ruschigo 1:10de89ea1f70 210 //}
ruschigo 1:10de89ea1f70 211 /*while(serial1.readable()){
ruschigo 1:10de89ea1f70 212 serial_rx_buffer[i] = serial1.getc();
ruschigo 1:10de89ea1f70 213 serial_timer.reset();
ruschigo 1:10de89ea1f70 214 time_us = serial_timer.read_us();
ruschigo 1:10de89ea1f70 215 while(time_us < DELAY_UART)
ruschigo 1:10de89ea1f70 216 {
ruschigo 1:10de89ea1f70 217 time_us = serial_timer.read_us();
ruschigo 1:10de89ea1f70 218 }
ruschigo 1:10de89ea1f70 219 i++;
ruschigo 1:10de89ea1f70 220 }*/
ruschigo 1:10de89ea1f70 221 //serial_timer.reset();//restart timer
ruschigo 1:10de89ea1f70 222 //serial_timer.start();
ruschigo 2:b39f5ce4d5bd 223 //serial_timer.stop();
ruschigo 1:10de89ea1f70 224 //j = 0;
ruschigo 1:10de89ea1f70 225 //sprintf(debug_msg, "rx_bytes:%d \n bc = %d\n", i_rx, bc);
ruschigo 1:10de89ea1f70 226 //pc.puts(debug_msg);
ruschigo 2:b39f5ce4d5bd 227 if(i_rx == 0){//packt was received
ruschigo 1:10de89ea1f70 228 /*if(serial_rx_buffer[2] >= 0x80 && serial_rx_buffer[2] <= 0x84)
ruschigo 1:10de89ea1f70 229 {
ruschigo 1:10de89ea1f70 230 serial_to_proculus_pkt_2(serial_rx_buffer, &pkt);
ruschigo 1:10de89ea1f70 231 unknow=0;
ruschigo 1:10de89ea1f70 232 }*/
ruschigo 1:10de89ea1f70 233 if(serial_rx_buffer[3] >= 0x80 && serial_rx_buffer[3] <= 0x84)
ruschigo 1:10de89ea1f70 234 {
ruschigo 1:10de89ea1f70 235 serial_to_proculus_pkt(serial_rx_buffer, &pkt);
ruschigo 1:10de89ea1f70 236 unknow=0;
ruschigo 1:10de89ea1f70 237 }
ruschigo 1:10de89ea1f70 238 else
ruschigo 1:10de89ea1f70 239 unknow = 1;//received something unknow
ruschigo 1:10de89ea1f70 240 }
ruschigo 1:10de89ea1f70 241
ruschigo 1:10de89ea1f70 242 if(unknow == 0){
ruschigo 1:10de89ea1f70 243 if(pkt.cmd == W_VP){
ruschigo 1:10de89ea1f70 244 switch(pkt.address){
ruschigo 1:10de89ea1f70 245 case PEEP_TARGET_VP:
ruschigo 1:10de89ea1f70 246 display_option = 'e';
ruschigo 1:10de89ea1f70 247 display_data = pkt.buffer[0];//ISSUE is this data in fix point?
ruschigo 1:10de89ea1f70 248 display_ctrl = DISPLAY_CMD_DATA_ARRIVE;
ruschigo 1:10de89ea1f70 249 break;
ruschigo 1:10de89ea1f70 250 case ASSISTED_SENSIBILITY_VP:
ruschigo 1:10de89ea1f70 251 display_option = 's';
ruschigo 1:10de89ea1f70 252 display_data = pkt.buffer[0];//ISSUE is this data in fix point?
ruschigo 1:10de89ea1f70 253 display_ctrl = DISPLAY_CMD_DATA_ARRIVE;
ruschigo 1:10de89ea1f70 254 break;
ruschigo 1:10de89ea1f70 255 default:
ruschigo 1:10de89ea1f70 256 break;
ruschigo 1:10de89ea1f70 257 }
ruschigo 1:10de89ea1f70 258 }
ruschigo 1:10de89ea1f70 259 if(pkt.cmd == R_VP){
ruschigo 1:10de89ea1f70 260 switch(pkt.address){
ruschigo 1:10de89ea1f70 261 case OPTION_CMD_VP:
ruschigo 1:10de89ea1f70 262 display_ctrl = DISPLAY_CMD_START;//active in next serial loop to do the ctrl
ruschigo 1:10de89ea1f70 263 display_option = (char)pkt.buffer[0];
ruschigo 1:10de89ea1f70 264 switch(display_option){//if this CMD needs data claim for it
ruschigo 1:10de89ea1f70 265 case 'm':
ruschigo 1:10de89ea1f70 266 proculus_get_vp(0x4, MOV_MOTOR_VP, 0x1);
ruschigo 1:10de89ea1f70 267 display_ctrl = DISPLAY_CMD_WAITING_DATA; //wait for data from display
ruschigo 1:10de89ea1f70 268 break;
ruschigo 1:10de89ea1f70 269 case 'p'://just show value in display
ruschigo 1:10de89ea1f70 270 // update_parameter(calc_scaled_value(SCALE_PP_PRESSURE, Pot1.read()),
ruschigo 1:10de89ea1f70 271 // DRIVE_PRESSURE_VP, 'p', 1.0, 35, 3
ruschigo 1:10de89ea1f70 272 // );
ruschigo 1:10de89ea1f70 273 break;
ruschigo 1:10de89ea1f70 274 case 'e':
ruschigo 1:10de89ea1f70 275 proculus_get_vp(0x4, PEEP_TARGET_VP, 0x1);
ruschigo 1:10de89ea1f70 276 display_ctrl = DISPLAY_CMD_WAITING_DATA; //wait for data from display
ruschigo 1:10de89ea1f70 277 break;
ruschigo 1:10de89ea1f70 278 case 't':
ruschigo 1:10de89ea1f70 279 //update_parameter(calc_scaled_value(SCALE_TINSP, Pot3.read()),
ruschigo 1:10de89ea1f70 280 // TINS_VP, 't', 0.5, 3.0, 4
ruschigo 1:10de89ea1f70 281 // );
ruschigo 1:10de89ea1f70 282 break;
ruschigo 1:10de89ea1f70 283 case 'c':
ruschigo 1:10de89ea1f70 284 //update_parameter(calc_scaled_value(SCALE_BPM, Pot2.read()),
ruschigo 1:10de89ea1f70 285 // BPM_VP, 'c', 10, 30, 8
ruschigo 1:10de89ea1f70 286 // );
ruschigo 1:10de89ea1f70 287 break;
ruschigo 1:10de89ea1f70 288 case 'S':
ruschigo 1:10de89ea1f70 289 proculus_get_vp(0x4, BREATH_TURN_ONOFF_VP, 0x1);
ruschigo 1:10de89ea1f70 290 display_ctrl = DISPLAY_CMD_WAITING_DATA; //wait for data from display
ruschigo 1:10de89ea1f70 291 break;
ruschigo 1:10de89ea1f70 292 case 's':
ruschigo 1:10de89ea1f70 293 proculus_get_vp(0x4, ASSISTED_SENSIBILITY_VP, 0x1);
ruschigo 1:10de89ea1f70 294 display_ctrl = DISPLAY_CMD_WAITING_DATA; //wait for data from display
ruschigo 1:10de89ea1f70 295 break;
ruschigo 1:10de89ea1f70 296 case 'I':
ruschigo 1:10de89ea1f70 297 proculus_get_vp(0x4, KI_VP, 0x1);
ruschigo 1:10de89ea1f70 298 display_ctrl = DISPLAY_CMD_WAITING_DATA; //wait for data from display
ruschigo 1:10de89ea1f70 299 break;
ruschigo 1:10de89ea1f70 300 case 'P':
ruschigo 1:10de89ea1f70 301 proculus_get_vp(0x4, KP_VP, 0x1);
ruschigo 1:10de89ea1f70 302 display_ctrl = DISPLAY_CMD_WAITING_DATA; //wait for data from display
ruschigo 1:10de89ea1f70 303 break;
ruschigo 1:10de89ea1f70 304 case 'D':
ruschigo 1:10de89ea1f70 305 proculus_get_vp(0x4, KD_VP, 0x1);
ruschigo 1:10de89ea1f70 306 display_ctrl = DISPLAY_CMD_WAITING_DATA; //wait for data from display
ruschigo 1:10de89ea1f70 307 break;
ruschigo 1:10de89ea1f70 308 case 'o':
ruschigo 1:10de89ea1f70 309 //update_parameter(calc_scaled_value(SCALE_FIO2, Pot4.read()),
ruschigo 1:10de89ea1f70 310 // FIO2_VP, 'o', 0.5, 21, 100
ruschigo 1:10de89ea1f70 311 // );
ruschigo 1:10de89ea1f70 312 break;
ruschigo 1:10de89ea1f70 313 case 'A':
ruschigo 1:10de89ea1f70 314 proculus_get_vp(0x4, ONOFF_ASSISTED_MODE_VP, 0x1);
ruschigo 1:10de89ea1f70 315 display_ctrl = DISPLAY_CMD_WAITING_DATA; //wait for data from display
ruschigo 1:10de89ea1f70 316 break;
ruschigo 1:10de89ea1f70 317 default:
ruschigo 1:10de89ea1f70 318 //print warning
ruschigo 1:10de89ea1f70 319 break;
ruschigo 1:10de89ea1f70 320 }//switch
ruschigo 1:10de89ea1f70 321 break;
ruschigo 1:10de89ea1f70 322 case BREATH_TURN_ONOFF_VP://TEST OK
ruschigo 1:10de89ea1f70 323 display_option = 'S';
ruschigo 1:10de89ea1f70 324 display_data = pkt.buffer[0];//for while let it as single uint16
ruschigo 1:10de89ea1f70 325 display_ctrl = DISPLAY_CMD_DATA_ARRIVE; //wait for data from display
ruschigo 1:10de89ea1f70 326 break;
ruschigo 1:10de89ea1f70 327 case PEEP_TARGET_VP:
ruschigo 1:10de89ea1f70 328 display_option = 'e';
ruschigo 1:10de89ea1f70 329 display_data = pkt.buffer[0];//ISSUE is this data in fix point?
ruschigo 1:10de89ea1f70 330 display_ctrl = DISPLAY_CMD_DATA_ARRIVE;
ruschigo 1:10de89ea1f70 331 break;
ruschigo 1:10de89ea1f70 332 case ASSISTED_SENSIBILITY_VP:
ruschigo 1:10de89ea1f70 333 //sprintf(debug_msg,"Assi_sens = %x \n", pkt.buffer[0]);
ruschigo 1:10de89ea1f70 334 //pc.puts(debug_msg);
ruschigo 1:10de89ea1f70 335 display_option = 's';
ruschigo 1:10de89ea1f70 336 display_data = pkt.buffer[0];//ISSUE is this data in fix point?
ruschigo 1:10de89ea1f70 337 display_ctrl = DISPLAY_CMD_DATA_ARRIVE;
ruschigo 1:10de89ea1f70 338 break;
ruschigo 1:10de89ea1f70 339 default:
ruschigo 1:10de89ea1f70 340 break;
ruschigo 1:10de89ea1f70 341 }//switch
ruschigo 1:10de89ea1f70 342 }//if
ruschigo 1:10de89ea1f70 343 if(pkt.cmd == R_CTRL_REG){//from a read control register comand
ruschigo 1:10de89ea1f70 344 //pc.puts("control reg \n");
ruschigo 1:10de89ea1f70 345 if(pkt.address == PIC_ID_H){//read screen cmd
ruschigo 1:10de89ea1f70 346 screen_id = (pkt.buffer[0] << 8 );
ruschigo 1:10de89ea1f70 347 screen_id |= pkt.buffer[1];
ruschigo 1:10de89ea1f70 348 //sprintf(debug_msg,"screen_id = %x \n", screen_id);
ruschigo 1:10de89ea1f70 349 //pc.puts(debug_msg);
ruschigo 1:10de89ea1f70 350 //if(PISTON_HOM_PIN == HIGH){
ruschigo 1:10de89ea1f70 351 switch(screen_id){
ruschigo 1:10de89ea1f70 352 case SCREEN_CALIBRATING:
ruschigo 1:10de89ea1f70 353 jump_to_screen(SCREEN_MAIN_MENU);
ruschigo 1:10de89ea1f70 354 break;
ruschigo 1:10de89ea1f70 355 case SCREEN_INIT:
ruschigo 1:10de89ea1f70 356 jump_to_screen(SCREEN_CALIBRATING);
ruschigo 1:10de89ea1f70 357 break;
ruschigo 1:10de89ea1f70 358 case SCREEN_OFF:
ruschigo 1:10de89ea1f70 359 jump_to_screen(SCREEN_STARTUP);
ruschigo 1:10de89ea1f70 360 break;
ruschigo 1:10de89ea1f70 361 case SCREEN_STARTUP:
ruschigo 1:10de89ea1f70 362 jump_to_screen(SCREEN_INIT);
ruschigo 1:10de89ea1f70 363 break;
ruschigo 1:10de89ea1f70 364 default:
ruschigo 1:10de89ea1f70 365 //print warning
ruschigo 1:10de89ea1f70 366 break;
ruschigo 1:10de89ea1f70 367 }
ruschigo 1:10de89ea1f70 368 //}else{
ruschigo 1:10de89ea1f70 369 // jump_to_screen(SCREEN_MAIN_MENU);
ruschigo 1:10de89ea1f70 370 //}
ruschigo 1:10de89ea1f70 371 }
ruschigo 1:10de89ea1f70 372 }
ruschigo 2:b39f5ce4d5bd 373 clear_display_buffer();
ruschigo 1:10de89ea1f70 374 i_rx = 0;
ruschigo 1:10de89ea1f70 375 }
ruschigo 1:10de89ea1f70 376 }
ruschigo 1:10de89ea1f70 377
ruschigo 1:10de89ea1f70 378 struct pulga_pkt {
ruschigo 1:10de89ea1f70 379 uint8_t header_h;
ruschigo 1:10de89ea1f70 380 uint8_t header_l;
ruschigo 1:10de89ea1f70 381 uint8_t count;
ruschigo 1:10de89ea1f70 382 uint8_t cmd;
ruschigo 1:10de89ea1f70 383 uint16_t address;
ruschigo 1:10de89ea1f70 384 uint16_t *buffer;
ruschigo 1:10de89ea1f70 385 };
ruschigo 1:10de89ea1f70 386
ruschigo 1:10de89ea1f70 387
ruschigo 1:10de89ea1f70 388 //PULGA TO PULGA SERIAL PROTOCOL P2PS
ruschigo 1:10de89ea1f70 389 /*9A A9 BC CMD DATA
ruschigo 1:10de89ea1f70 390 HH HL Byte to come Command datas
ruschigo 1:10de89ea1f70 391 */
ruschigo 1:10de89ea1f70 392
ruschigo 1:10de89ea1f70 393 #define PULGA_CMD_SEND_POT_DATA 0x40
ruschigo 1:10de89ea1f70 394 /*
ruschigo 1:10de89ea1f70 395 *serial_to_proculus_pkt: get the data received in serial rx and translate
ruschigo 1:10de89ea1f70 396 *to proculus_pkt
ruschigo 1:10de89ea1f70 397 *@pkt is pointer to the struct to store datas
ruschigo 1:10de89ea1f70 398 */
ruschigo 1:10de89ea1f70 399 int serial_to_pulga_pkt(char *serial_data, struct pulga_pkt *pkt){
ruschigo 1:10de89ea1f70 400 pkt->header_h = serial_data[0];
ruschigo 1:10de89ea1f70 401 pkt->header_l = serial_data[1];
ruschigo 1:10de89ea1f70 402 pkt->count = serial_data[2];
ruschigo 1:10de89ea1f70 403 pkt->cmd = serial_data[3];
ruschigo 1:10de89ea1f70 404 if(pkt->cmd == PULGA_CMD_SEND_POT_DATA){
ruschigo 1:10de89ea1f70 405 pkt->address = serial_data[4];
ruschigo 1:10de89ea1f70 406 pkt->buffer[0] = (serial_data[5] << 8);
ruschigo 1:10de89ea1f70 407 pkt->buffer[0] |= serial_data[6];
ruschigo 1:10de89ea1f70 408 }
ruschigo 1:10de89ea1f70 409 return 0;
ruschigo 1:10de89ea1f70 410 }
ruschigo 1:10de89ea1f70 411 char rx_pulga_buffer[100];
ruschigo 1:10de89ea1f70 412 void clear_pulga_buffer(){
ruschigo 1:10de89ea1f70 413 int i = 0;
ruschigo 1:10de89ea1f70 414 char msg[30] = "PKT:";
ruschigo 1:10de89ea1f70 415 char t[3];
ruschigo 2:b39f5ce4d5bd 416 while(i<7){
ruschigo 1:10de89ea1f70 417 sprintf(t,"%x",rx_pulga_buffer[i]);
ruschigo 1:10de89ea1f70 418 strcat(msg, t);
ruschigo 1:10de89ea1f70 419 rx_pulga_buffer[i] = 0x0;
ruschigo 1:10de89ea1f70 420 i++;
ruschigo 1:10de89ea1f70 421 }
ruschigo 2:b39f5ce4d5bd 422 //pc.puts(msg);
ruschigo 2:b39f5ce4d5bd 423 //pc.puts("\n");
ruschigo 1:10de89ea1f70 424 }
ruschigo 1:10de89ea1f70 425
ruschigo 1:10de89ea1f70 426 //***********************************************************************************************
ruschigo 1:10de89ea1f70 427 #define DELAY_P2PS 10000 //us
ruschigo 1:10de89ea1f70 428
ruschigo 1:10de89ea1f70 429 int rx_i = 0;
ruschigo 1:10de89ea1f70 430 int pulga_bc = 0;
ruschigo 1:10de89ea1f70 431 Timer pulga_rx_timer;
ruschigo 1:10de89ea1f70 432 void serial_pulga_rx(){
ruschigo 1:10de89ea1f70 433 int i=0, unknow = 1;
ruschigo 1:10de89ea1f70 434 struct pulga_pkt pulga_pkt;
ruschigo 1:10de89ea1f70 435 uint16_t data[2];
ruschigo 1:10de89ea1f70 436 int time_us;
ruschigo 1:10de89ea1f70 437 char debug_msg[100];
ruschigo 1:10de89ea1f70 438 pulga_pkt.buffer = data;
ruschigo 2:b39f5ce4d5bd 439 while(serial_to_pulga.readable()){
ruschigo 2:b39f5ce4d5bd 440 rx_pulga_buffer[rx_i] = serial_to_pulga.getc();
ruschigo 2:b39f5ce4d5bd 441 rx_i++;
ruschigo 2:b39f5ce4d5bd 442 if(rx_i>=7){
ruschigo 2:b39f5ce4d5bd 443 rx_i = 0;
ruschigo 2:b39f5ce4d5bd 444 //pc_puts(rx_pulga_buffer, 7);
ruschigo 2:b39f5ce4d5bd 445 break;
ruschigo 2:b39f5ce4d5bd 446 }
ruschigo 2:b39f5ce4d5bd 447 }
ruschigo 2:b39f5ce4d5bd 448 //pulga_rx_timer.reset();//restart timer
ruschigo 2:b39f5ce4d5bd 449 //pulga_rx_timer.start();
ruschigo 1:10de89ea1f70 450 //time_us = pulga_rx_timer.read_us();
ruschigo 1:10de89ea1f70 451 //while(time_us<DELAY_P2PS){
ruschigo 1:10de89ea1f70 452 // time_us = pulga_rx_timer.read_us();
ruschigo 1:10de89ea1f70 453 //}
ruschigo 1:10de89ea1f70 454 /*if(rx_pulga_buffer[0] != 0x9a){
ruschigo 1:10de89ea1f70 455 rx_i = 0;
ruschigo 1:10de89ea1f70 456 }
ruschigo 1:10de89ea1f70 457 if(rx_i >1 && rx_pulga_buffer[1] != 0xa9){
ruschigo 1:10de89ea1f70 458 rx_i = 0;
ruschigo 1:10de89ea1f70 459 }*/
ruschigo 2:b39f5ce4d5bd 460 /*
ruschigo 1:10de89ea1f70 461 while(serial_to_pulga.readable()){//get only one byte per interrupt
ruschigo 1:10de89ea1f70 462 if(rx_pulga_buffer[0] != 0x9a){//avoid noise
ruschigo 1:10de89ea1f70 463 rx_i = 0;
ruschigo 1:10de89ea1f70 464 pulga_bc = 0;
ruschigo 1:10de89ea1f70 465 clear_pulga_buffer();
ruschigo 1:10de89ea1f70 466 }
ruschigo 1:10de89ea1f70 467 if(rx_i >1 && rx_pulga_buffer[1] != 0xa9){//avoid noise
ruschigo 1:10de89ea1f70 468 rx_i = 0;
ruschigo 1:10de89ea1f70 469 pulga_bc = 0;
ruschigo 1:10de89ea1f70 470 clear_pulga_buffer();
ruschigo 1:10de89ea1f70 471 }
ruschigo 1:10de89ea1f70 472 if( i>3 && rx_pulga_buffer[3] < 0x40 || rx_pulga_buffer[3] > 0x49){//avoid noise
ruschigo 1:10de89ea1f70 473 rx_i = 0;
ruschigo 1:10de89ea1f70 474 pulga_bc = 0;
ruschigo 1:10de89ea1f70 475 clear_pulga_buffer();
ruschigo 1:10de89ea1f70 476 }
ruschigo 1:10de89ea1f70 477
ruschigo 2:b39f5ce4d5bd 478 pulga_rx_timer.reset();//restart timer
ruschigo 1:10de89ea1f70 479 pulga_rx_timer.start();
ruschigo 1:10de89ea1f70 480 time_us = pulga_rx_timer.read_us();
ruschigo 1:10de89ea1f70 481 while(time_us<DELAY_P2PS){
ruschigo 1:10de89ea1f70 482 time_us = pulga_rx_timer.read_us();
ruschigo 2:b39f5ce4d5bd 483 }
ruschigo 1:10de89ea1f70 484 rx_pulga_buffer[rx_i] = serial_to_pulga.getc();
ruschigo 1:10de89ea1f70 485
ruschigo 1:10de89ea1f70 486 if(rx_i == 2)//get bc(how many byts will come
ruschigo 1:10de89ea1f70 487 pulga_bc = rx_pulga_buffer[2];
ruschigo 1:10de89ea1f70 488
ruschigo 1:10de89ea1f70 489 if(pulga_bc > 0 && rx_i > 2)//avoid decrement it when it was got
ruschigo 1:10de89ea1f70 490 pulga_bc--;
ruschigo 2:b39f5ce4d5bd 491
ruschigo 1:10de89ea1f70 492 sprintf(debug_msg,"rx_pulga_buffer[%d] = %x\n",rx_i ,rx_pulga_buffer[rx_i]);
ruschigo 1:10de89ea1f70 493 pc.puts(debug_msg);
ruschigo 1:10de89ea1f70 494 sprintf(debug_msg,"pulga_bc = %d\n",pulga_bc);
ruschigo 1:10de89ea1f70 495 pc.puts(debug_msg);
ruschigo 2:b39f5ce4d5bd 496
ruschigo 1:10de89ea1f70 497
ruschigo 1:10de89ea1f70 498 rx_i++;
ruschigo 1:10de89ea1f70 499 if(pulga_bc == 0 && rx_i > 2)
ruschigo 1:10de89ea1f70 500 rx_i = 0;
ruschigo 1:10de89ea1f70 501 }
ruschigo 2:b39f5ce4d5bd 502 */
ruschigo 1:10de89ea1f70 503 /*if(rx_i == 2)//get bc(how many byts will come
ruschigo 1:10de89ea1f70 504 pulga_bc = rx_pulga_buffer[2];*/
ruschigo 1:10de89ea1f70 505
ruschigo 2:b39f5ce4d5bd 506 if(rx_i ==0){
ruschigo 1:10de89ea1f70 507 if(rx_pulga_buffer[3] >= 0x40 && rx_pulga_buffer[3] <= 0x49)
ruschigo 1:10de89ea1f70 508 {
ruschigo 1:10de89ea1f70 509 serial_to_pulga_pkt(rx_pulga_buffer, &pulga_pkt);
ruschigo 1:10de89ea1f70 510 unknow=0;
ruschigo 1:10de89ea1f70 511 }
ruschigo 1:10de89ea1f70 512 else
ruschigo 1:10de89ea1f70 513 unknow = 1;//received something unknow
ruschigo 1:10de89ea1f70 514 }
ruschigo 1:10de89ea1f70 515 if(unknow == 0){
ruschigo 1:10de89ea1f70 516 //Do logic Here
ruschigo 1:10de89ea1f70 517 if(pulga_pkt.cmd == PULGA_CMD_SEND_POT_DATA){
ruschigo 1:10de89ea1f70 518 rx_pot[pulga_pkt.address - 1] = (pulga_pkt.buffer[0] / 1000);
ruschigo 1:10de89ea1f70 519 }
ruschigo 1:10de89ea1f70 520 clear_pulga_buffer();
ruschigo 1:10de89ea1f70 521 rx_i = 0;
ruschigo 1:10de89ea1f70 522 }
ruschigo 1:10de89ea1f70 523
ruschigo 1:10de89ea1f70 524 }
ruschigo 1:10de89ea1f70 525
ruschigo 1:10de89ea1f70 526 void Setup()
ruschigo 1:10de89ea1f70 527 //Description: Main setup function, called after power on or reset
ruschigo 1:10de89ea1f70 528 //Inputs: void
ruschigo 1:10de89ea1f70 529 //Outputs: void
ruschigo 1:10de89ea1f70 530 {
ruschigo 1:10de89ea1f70 531
ruschigo 1:10de89ea1f70 532 //setup the device rx irq handler
ruschigo 2:b39f5ce4d5bd 533 //serial1.attach(&serial_rx_irq, RawSerial::RxIrq);
ruschigo 2:b39f5ce4d5bd 534 //serial_to_pulga.attach(&serial_pulga_rx, RawSerial::RxIrq);
ruschigo 1:10de89ea1f70 535 //setup the baud rate to match with display
ruschigo 1:10de89ea1f70 536 serial1.baud(115200);
ruschigo 1:10de89ea1f70 537 serial_to_pulga.baud(9600);
ruschigo 1:10de89ea1f70 538
ruschigo 1:10de89ea1f70 539 //display_timeout.attach(&get_screen_at_irq, 0.5);
ruschigo 1:10de89ea1f70 540 display_ticker.attach(&get_screen_at_irq, 0.4);
ruschigo 1:10de89ea1f70 541 //display_ticker.attach(&update_screen, 0.3);
ruschigo 1:10de89ea1f70 542
ruschigo 1:10de89ea1f70 543 }
ruschigo 1:10de89ea1f70 544
ruschigo 1:10de89ea1f70 545 void Send_to_pulga(){
ruschigo 1:10de89ea1f70 546 char temp[20];
ruschigo 1:10de89ea1f70 547 if(display_option != '\0')
ruschigo 1:10de89ea1f70 548 {
ruschigo 1:10de89ea1f70 549 serial_to_pulga.putc(display_option);
ruschigo 1:10de89ea1f70 550 display_option = '\0';
ruschigo 1:10de89ea1f70 551 }
ruschigo 1:10de89ea1f70 552
ruschigo 1:10de89ea1f70 553 if(display_ctrl == DISPLAY_CMD_DATA_ARRIVE)
ruschigo 1:10de89ea1f70 554 {
ruschigo 1:10de89ea1f70 555 sprintf(temp, "%f", display_data);
ruschigo 1:10de89ea1f70 556 serial_to_pulga.puts(temp);
ruschigo 1:10de89ea1f70 557 display_ctrl = DISPLAY_CMD_DONE;
ruschigo 1:10de89ea1f70 558 }
ruschigo 1:10de89ea1f70 559 }
ruschigo 1:10de89ea1f70 560
ruschigo 2:b39f5ce4d5bd 561 /*int pc_puts(const char *str, int size){
ruschigo 2:b39f5ce4d5bd 562 int i = 0;
ruschigo 2:b39f5ce4d5bd 563 while(i < size){
ruschigo 2:b39f5ce4d5bd 564 pc.putc(str[i]);
ruschigo 2:b39f5ce4d5bd 565 i++;
ruschigo 2:b39f5ce4d5bd 566 }
ruschigo 2:b39f5ce4d5bd 567 return 0;
ruschigo 2:b39f5ce4d5bd 568 }*/
ruschigo 2:b39f5ce4d5bd 569
ruschigo 1:10de89ea1f70 570 //***********************************************************************************************
ruschigo 1:10de89ea1f70 571 int main()
ruschigo 1:10de89ea1f70 572 {
ruschigo 2:b39f5ce4d5bd 573 wait(3);//time to display setup. not sure about this value
ruschigo 1:10de89ea1f70 574 Setup();
ruschigo 1:10de89ea1f70 575 jump_to_screen(SCREEN_STARTUP);
ruschigo 2:b39f5ce4d5bd 576 int i = 0;
ruschigo 1:10de89ea1f70 577 while (true) {
ruschigo 2:b39f5ce4d5bd 578 //jump_to_screen(SCREEN_STARTUP);
ruschigo 1:10de89ea1f70 579 //update_screen();
ruschigo 1:10de89ea1f70 580 //Send_to_pulga();
ruschigo 2:b39f5ce4d5bd 581 serial_pulga_rx();
ruschigo 2:b39f5ce4d5bd 582 wait(0.2);
ruschigo 2:b39f5ce4d5bd 583 serial_rx_irq();
ruschigo 1:10de89ea1f70 584 }
ruschigo 1:10de89ea1f70 585 }