serial teste pulga to pulga

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