pachas

Dependencies:   mbed QEI FastPWM

Committer:
miguelangel_2511
Date:
Fri May 15 20:29:30 2020 +0000
Revision:
12:3bc2465b034a
Parent:
11:5cb7ae8bd831
hola papu

Who changed what in which revision?

UserRevisionLine numberNew contents of line
miguelangel_2511 0:9d0b9785d3d6 1
miguelangel_2511 0:9d0b9785d3d6 2 /* File inclusion */
miguelangel_2511 0:9d0b9785d3d6 3 #include "mbed.h"
miguelangel_2511 0:9d0b9785d3d6 4 #include "stdint.h"
miguelangel_2511 0:9d0b9785d3d6 5 #include "QEI.h"
miguelangel_2511 0:9d0b9785d3d6 6 #include "project_defines.h"
miguelangel_2511 0:9d0b9785d3d6 7 #include "buttons.h"
miguelangel_2511 0:9d0b9785d3d6 8 #include "encoder_interface.h"
miguelangel_2511 6:d38287621cca 9 #include "nextion_interface.h"
miguelangel_2511 7:f4e248182d31 10 #include "pressure_sensors.h"
miguelangel_2511 8:208d965a3bd2 11 #include "stepper_motor_driver.h"
miguelangel_2511 0:9d0b9785d3d6 12 #include "ventilator.h"
miguelangel_2511 12:3bc2465b034a 13 #include "electric_valves.h"
miguelangel_2511 0:9d0b9785d3d6 14
miguelangel_2511 8:208d965a3bd2 15 /* Object definition */
miguelangel_2511 8:208d965a3bd2 16 Ticker ticker_int_1ms; // Ticker interrupt
miguelangel_2511 11:5cb7ae8bd831 17 DigitalOut test_pin(LED1);
miguelangel_2511 0:9d0b9785d3d6 18
miguelangel_2511 2:6f618b905d4f 19 /* Global variable definition */
miguelangel_2511 7:f4e248182d31 20
miguelangel_2511 7:f4e248182d31 21 volatile uint8_t read_pressure_sensors_flag;
miguelangel_2511 7:f4e248182d31 22 volatile uint8_t pressure_sensor_display_update_flag;
miguelangel_2511 7:f4e248182d31 23 volatile uint8_t pressure_sensor_waveform_update_flag;
miguelangel_2511 7:f4e248182d31 24
miguelangel_2511 2:6f618b905d4f 25 uint16_t volume_setpoint = VOLUME_SETPOINT_VALUE_DEFAULT;
miguelangel_2511 2:6f618b905d4f 26 uint8_t resp_frequency = RESP_FREQUENCY_VALUE_DEFAULT;
miguelangel_2511 2:6f618b905d4f 27 float inspiration_time = INSPIRATION_TIME_VALUE_DEFAULT;
miguelangel_2511 2:6f618b905d4f 28 float expiration_time = EXPIRATION_TIME_VALUE_DEFAULT;
miguelangel_2511 0:9d0b9785d3d6 29
miguelangel_2511 2:6f618b905d4f 30
miguelangel_2511 1:aa5df1878126 31 Main_Screen_State_t main_screen_state = MAIN_SCREEN_DEFAULT_STATE;
miguelangel_2511 0:9d0b9785d3d6 32 uint8_t first_time_in_state = 1;
miguelangel_2511 0:9d0b9785d3d6 33
miguelangel_2511 0:9d0b9785d3d6 34 /* Function definition */
miguelangel_2511 8:208d965a3bd2 35
miguelangel_2511 8:208d965a3bd2 36 void System_Initialize(void){
miguelangel_2511 8:208d965a3bd2 37 Buttons_Initialize();
miguelangel_2511 12:3bc2465b034a 38 Valves_Initialize();
miguelangel_2511 8:208d965a3bd2 39 Nextion_Interface_Initialize();
miguelangel_2511 8:208d965a3bd2 40 Pressure_Sensors_Initialize();
miguelangel_2511 8:208d965a3bd2 41 ticker_int_1ms.attach(&Ticker_ISR, 0.001);
miguelangel_2511 8:208d965a3bd2 42 Stepper_Driver_Init();
miguelangel_2511 8:208d965a3bd2 43 }
miguelangel_2511 8:208d965a3bd2 44
miguelangel_2511 8:208d965a3bd2 45
miguelangel_2511 6:d38287621cca 46 void Nextion_Encoder_Interaction(void){
miguelangel_2511 0:9d0b9785d3d6 47
miguelangel_2511 1:aa5df1878126 48 switch(main_screen_state){
miguelangel_2511 0:9d0b9785d3d6 49 case Main_Screen_Cursor_Disable:
miguelangel_2511 0:9d0b9785d3d6 50 if(Get_Button_Press(1 << ENTER_SW)){
miguelangel_2511 0:9d0b9785d3d6 51 rotary_encoder.reset();
miguelangel_2511 1:aa5df1878126 52 main_screen_state = Main_Screen_Cursor_Enable;
miguelangel_2511 8:208d965a3bd2 53 first_time_in_state = 1;
miguelangel_2511 0:9d0b9785d3d6 54 }
miguelangel_2511 0:9d0b9785d3d6 55
miguelangel_2511 0:9d0b9785d3d6 56 break;
miguelangel_2511 0:9d0b9785d3d6 57
miguelangel_2511 0:9d0b9785d3d6 58 case Main_Screen_Cursor_Enable:
miguelangel_2511 0:9d0b9785d3d6 59 if(first_time_in_state){
miguelangel_2511 0:9d0b9785d3d6 60 first_time_in_state = 0;
miguelangel_2511 0:9d0b9785d3d6 61 Parameter_Selection_Box_Update();
miguelangel_2511 0:9d0b9785d3d6 62 }else if(parameter_selection_index_change_flag){
miguelangel_2511 0:9d0b9785d3d6 63 parameter_selection_index_change_flag = 0;
miguelangel_2511 0:9d0b9785d3d6 64 Parameter_Selection_Box_Update();
miguelangel_2511 0:9d0b9785d3d6 65 }else{
miguelangel_2511 0:9d0b9785d3d6 66 //Does nothing
miguelangel_2511 0:9d0b9785d3d6 67 }
miguelangel_2511 0:9d0b9785d3d6 68
miguelangel_2511 0:9d0b9785d3d6 69 if(Get_Button_Press(1 << ENTER_SW)){
miguelangel_2511 1:aa5df1878126 70 main_screen_state = (Main_Screen_State_t)(2 + parameter_selection_index);
miguelangel_2511 0:9d0b9785d3d6 71 first_time_in_state = 1;
miguelangel_2511 0:9d0b9785d3d6 72 }
miguelangel_2511 0:9d0b9785d3d6 73
miguelangel_2511 0:9d0b9785d3d6 74 break;
miguelangel_2511 0:9d0b9785d3d6 75
miguelangel_2511 0:9d0b9785d3d6 76
miguelangel_2511 0:9d0b9785d3d6 77 case Main_Screen_Volume_Setpoint_Adjust:
miguelangel_2511 0:9d0b9785d3d6 78 if(first_time_in_state){
miguelangel_2511 0:9d0b9785d3d6 79 first_time_in_state = 0;
miguelangel_2511 8:208d965a3bd2 80 nextion_display.printf("t1.pco=%d", ADJUST_COLOR); // Change font color
miguelangel_2511 6:d38287621cca 81 nextion_display.printf("%c%c%c", 0xff, 0xff, 0xff);
miguelangel_2511 11:5cb7ae8bd831 82
miguelangel_2511 11:5cb7ae8bd831 83 /* Read pressure sensors if necessary */
miguelangel_2511 11:5cb7ae8bd831 84 if(read_pressure_sensors_flag){
miguelangel_2511 11:5cb7ae8bd831 85 Pressure_Sensors_Read();
miguelangel_2511 11:5cb7ae8bd831 86 Calculate_Flow_From_Pressure();
miguelangel_2511 11:5cb7ae8bd831 87 Calculate_Volume_From_Flow();
miguelangel_2511 11:5cb7ae8bd831 88 read_pressure_sensors_flag = 0;
miguelangel_2511 11:5cb7ae8bd831 89 }
miguelangel_2511 11:5cb7ae8bd831 90
miguelangel_2511 0:9d0b9785d3d6 91 Volume_Setpoint_Display_Update();
miguelangel_2511 0:9d0b9785d3d6 92 }else if(volume_setpoint_index_change_flag){
miguelangel_2511 0:9d0b9785d3d6 93 volume_setpoint_index_change_flag = 0;
miguelangel_2511 0:9d0b9785d3d6 94 Volume_Setpoint_Display_Update();
miguelangel_2511 0:9d0b9785d3d6 95 }else{
miguelangel_2511 0:9d0b9785d3d6 96 //Does nothing
miguelangel_2511 0:9d0b9785d3d6 97 }
miguelangel_2511 0:9d0b9785d3d6 98
miguelangel_2511 0:9d0b9785d3d6 99 if(Get_Button_Press(1 << ENTER_SW)){
miguelangel_2511 1:aa5df1878126 100 main_screen_state = Main_Screen_Cursor_Disable;
miguelangel_2511 0:9d0b9785d3d6 101 first_time_in_state = 1;
miguelangel_2511 0:9d0b9785d3d6 102 Volume_Setpoint_Fix();
miguelangel_2511 0:9d0b9785d3d6 103 Parameter_Selection_Box_Remove();
miguelangel_2511 0:9d0b9785d3d6 104 }
miguelangel_2511 0:9d0b9785d3d6 105
miguelangel_2511 0:9d0b9785d3d6 106 break;
miguelangel_2511 0:9d0b9785d3d6 107
miguelangel_2511 0:9d0b9785d3d6 108 case Main_Screen_Resp_Frequency_Adjust:
miguelangel_2511 0:9d0b9785d3d6 109 if(first_time_in_state){
miguelangel_2511 0:9d0b9785d3d6 110 first_time_in_state = 0;
miguelangel_2511 8:208d965a3bd2 111 nextion_display.printf("t4.pco=%d", ADJUST_COLOR); // Change font color
miguelangel_2511 6:d38287621cca 112 nextion_display.printf("%c%c%c", 0xff, 0xff, 0xff);
miguelangel_2511 11:5cb7ae8bd831 113
miguelangel_2511 11:5cb7ae8bd831 114 /* Read pressure sensors if necessary */
miguelangel_2511 11:5cb7ae8bd831 115 if(read_pressure_sensors_flag){
miguelangel_2511 11:5cb7ae8bd831 116 Pressure_Sensors_Read();
miguelangel_2511 11:5cb7ae8bd831 117 Calculate_Flow_From_Pressure();
miguelangel_2511 11:5cb7ae8bd831 118 Calculate_Volume_From_Flow();
miguelangel_2511 11:5cb7ae8bd831 119 read_pressure_sensors_flag = 0;
miguelangel_2511 11:5cb7ae8bd831 120 }
miguelangel_2511 11:5cb7ae8bd831 121
miguelangel_2511 0:9d0b9785d3d6 122 Resp_Frequency_Display_Update();
miguelangel_2511 0:9d0b9785d3d6 123 }else if(resp_frequency_index_change_flag){
miguelangel_2511 0:9d0b9785d3d6 124 resp_frequency_index_change_flag = 0;
miguelangel_2511 0:9d0b9785d3d6 125 Resp_Frequency_Display_Update();
miguelangel_2511 0:9d0b9785d3d6 126 }else{
miguelangel_2511 0:9d0b9785d3d6 127 //Does nothing
miguelangel_2511 0:9d0b9785d3d6 128 }
miguelangel_2511 0:9d0b9785d3d6 129
miguelangel_2511 0:9d0b9785d3d6 130 if(Get_Button_Press(1 << ENTER_SW)){
miguelangel_2511 1:aa5df1878126 131 main_screen_state = Main_Screen_Cursor_Disable;
miguelangel_2511 0:9d0b9785d3d6 132 first_time_in_state = 1;
miguelangel_2511 0:9d0b9785d3d6 133 Resp_Frequency_Fix();
miguelangel_2511 6:d38287621cca 134 Parameter_Selection_Box_Remove();
miguelangel_2511 0:9d0b9785d3d6 135 }
miguelangel_2511 0:9d0b9785d3d6 136
miguelangel_2511 0:9d0b9785d3d6 137 break;
miguelangel_2511 0:9d0b9785d3d6 138
miguelangel_2511 0:9d0b9785d3d6 139
miguelangel_2511 0:9d0b9785d3d6 140 case Main_Screen_I_E_Ratio_Adjust:
miguelangel_2511 0:9d0b9785d3d6 141 if(first_time_in_state){
miguelangel_2511 0:9d0b9785d3d6 142 first_time_in_state = 0;
miguelangel_2511 8:208d965a3bd2 143 nextion_display.printf("t7.pco=%d", ADJUST_COLOR); // Change font color
miguelangel_2511 6:d38287621cca 144 nextion_display.printf("%c%c%c", 0xff, 0xff, 0xff);
miguelangel_2511 11:5cb7ae8bd831 145
miguelangel_2511 11:5cb7ae8bd831 146 /* Read pressure sensors if necessary */
miguelangel_2511 11:5cb7ae8bd831 147 if(read_pressure_sensors_flag){
miguelangel_2511 11:5cb7ae8bd831 148 Pressure_Sensors_Read();
miguelangel_2511 11:5cb7ae8bd831 149 Calculate_Flow_From_Pressure();
miguelangel_2511 11:5cb7ae8bd831 150 Calculate_Volume_From_Flow();
miguelangel_2511 11:5cb7ae8bd831 151 read_pressure_sensors_flag = 0;
miguelangel_2511 11:5cb7ae8bd831 152 }
miguelangel_2511 11:5cb7ae8bd831 153
miguelangel_2511 0:9d0b9785d3d6 154 I_E_Ratio_Display_Update();
miguelangel_2511 0:9d0b9785d3d6 155 }else if(i_e_ratio_index_change_flag){
miguelangel_2511 0:9d0b9785d3d6 156 i_e_ratio_index_change_flag = 0;
miguelangel_2511 0:9d0b9785d3d6 157 I_E_Ratio_Display_Update();
miguelangel_2511 0:9d0b9785d3d6 158 }else{
miguelangel_2511 0:9d0b9785d3d6 159 //Does nothing
miguelangel_2511 0:9d0b9785d3d6 160 }
miguelangel_2511 0:9d0b9785d3d6 161
miguelangel_2511 0:9d0b9785d3d6 162 if(Get_Button_Press(1 << ENTER_SW)){
miguelangel_2511 1:aa5df1878126 163 main_screen_state = Main_Screen_Cursor_Disable;
miguelangel_2511 0:9d0b9785d3d6 164 first_time_in_state = 1;
miguelangel_2511 0:9d0b9785d3d6 165 I_E_Ratio_Fix();
miguelangel_2511 0:9d0b9785d3d6 166 Parameter_Selection_Box_Remove();
miguelangel_2511 0:9d0b9785d3d6 167 }
miguelangel_2511 0:9d0b9785d3d6 168
miguelangel_2511 0:9d0b9785d3d6 169 break;
miguelangel_2511 0:9d0b9785d3d6 170
miguelangel_2511 0:9d0b9785d3d6 171 default:
miguelangel_2511 0:9d0b9785d3d6 172 break;
miguelangel_2511 0:9d0b9785d3d6 173
miguelangel_2511 6:d38287621cca 174 }
miguelangel_2511 7:f4e248182d31 175 }
miguelangel_2511 7:f4e248182d31 176
miguelangel_2511 7:f4e248182d31 177
miguelangel_2511 7:f4e248182d31 178 void Nextion_Update_Sensor_Values(void){
miguelangel_2511 7:f4e248182d31 179
miguelangel_2511 8:208d965a3bd2 180 static float previous_pressure_02_psi = 0;
miguelangel_2511 8:208d965a3bd2 181 static float previous_volume_ml = 0;
miguelangel_2511 8:208d965a3bd2 182 static float previous_flow_lpm = 0;
miguelangel_2511 7:f4e248182d31 183 float delta;
miguelangel_2511 7:f4e248182d31 184
miguelangel_2511 7:f4e248182d31 185 /* Check if anu value has change in a meningful way */
miguelangel_2511 8:208d965a3bd2 186 delta = volume_ml - previous_volume_ml;
miguelangel_2511 8:208d965a3bd2 187 if((delta > VOLUME_DISPLAY_THRESHOLD) || (delta < -PRESSURE_DISPLAY_THRESHOLD)){
miguelangel_2511 8:208d965a3bd2 188 Volume_Display_Update();
miguelangel_2511 7:f4e248182d31 189 }
miguelangel_2511 7:f4e248182d31 190
miguelangel_2511 7:f4e248182d31 191 delta = pressure_02_psi - previous_pressure_02_psi;
miguelangel_2511 7:f4e248182d31 192 if((delta > PRESSURE_DISPLAY_THRESHOLD) || (delta < -PRESSURE_DISPLAY_THRESHOLD)){
miguelangel_2511 8:208d965a3bd2 193 Pressure_Display_Update();
miguelangel_2511 7:f4e248182d31 194 }
miguelangel_2511 7:f4e248182d31 195
miguelangel_2511 8:208d965a3bd2 196 delta = flow_lpm - previous_flow_lpm;
miguelangel_2511 8:208d965a3bd2 197 if((delta > FLOW_DISPLAY_THRESHOLD) || (delta < -PRESSURE_DISPLAY_THRESHOLD)){
miguelangel_2511 8:208d965a3bd2 198 Flow_Display_Update();
miguelangel_2511 7:f4e248182d31 199 }
miguelangel_2511 7:f4e248182d31 200
miguelangel_2511 7:f4e248182d31 201
miguelangel_2511 7:f4e248182d31 202 /* Update the previous values */
miguelangel_2511 8:208d965a3bd2 203 previous_volume_ml = volume_ml;
miguelangel_2511 7:f4e248182d31 204 previous_pressure_02_psi = pressure_02_psi;
miguelangel_2511 8:208d965a3bd2 205 previous_flow_lpm = flow_lpm;
miguelangel_2511 8:208d965a3bd2 206
miguelangel_2511 7:f4e248182d31 207 }
miguelangel_2511 7:f4e248182d31 208
miguelangel_2511 7:f4e248182d31 209
miguelangel_2511 8:208d965a3bd2 210 void Nextion_Update_Waveform_Values(void){
miguelangel_2511 8:208d965a3bd2 211 Nextion_Plot_Volume_Waveform();
miguelangel_2511 8:208d965a3bd2 212 Nextion_Plot_Pressure_Waveform();
miguelangel_2511 8:208d965a3bd2 213 Nextion_Plot_Flow_Waveform();
miguelangel_2511 8:208d965a3bd2 214 }
miguelangel_2511 8:208d965a3bd2 215
miguelangel_2511 8:208d965a3bd2 216
miguelangel_2511 8:208d965a3bd2 217 // Ticker Interrupt Service Routine
miguelangel_2511 8:208d965a3bd2 218 void Ticker_ISR(void){
miguelangel_2511 8:208d965a3bd2 219
miguelangel_2511 8:208d965a3bd2 220 static uint8_t debounce_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 221 static uint8_t encoder_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 222 static uint8_t sensor_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 223 static uint8_t sensor_waveform_conta_1ms = 0;
miguelangel_2511 11:5cb7ae8bd831 224 static uint16_t sensor_display_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 225
miguelangel_2511 8:208d965a3bd2 226 debounce_conta_1ms++;
miguelangel_2511 8:208d965a3bd2 227 encoder_conta_1ms++;
miguelangel_2511 8:208d965a3bd2 228 sensor_conta_1ms++;
miguelangel_2511 8:208d965a3bd2 229 sensor_waveform_conta_1ms++;
miguelangel_2511 8:208d965a3bd2 230 sensor_display_conta_1ms++;
miguelangel_2511 7:f4e248182d31 231
miguelangel_2511 10:b2d87404309a 232
miguelangel_2511 11:5cb7ae8bd831 233
miguelangel_2511 8:208d965a3bd2 234 // Read buttons and performs debounce action
miguelangel_2511 8:208d965a3bd2 235 if(debounce_conta_1ms == DEBOUNCE_PERIOD_MS){
miguelangel_2511 8:208d965a3bd2 236 debounce_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 237 Button_Debounce();
miguelangel_2511 8:208d965a3bd2 238 }
miguelangel_2511 8:208d965a3bd2 239 // Read encoder and update the proper indexes
miguelangel_2511 8:208d965a3bd2 240 if(encoder_conta_1ms == ENCODER_READ_PERIOD_MS){
miguelangel_2511 8:208d965a3bd2 241 encoder_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 242 Encoder_Read();
miguelangel_2511 8:208d965a3bd2 243 }
miguelangel_2511 8:208d965a3bd2 244 // Indicates if it is time to acquire a new sample from the sensors
miguelangel_2511 8:208d965a3bd2 245 if(sensor_conta_1ms == PRESSURE_SENSOR_READ_PERIOD_MS){
miguelangel_2511 8:208d965a3bd2 246 sensor_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 247 read_pressure_sensors_flag = 1;
miguelangel_2511 8:208d965a3bd2 248 }
miguelangel_2511 8:208d965a3bd2 249 // Indicates if it is time to plot the volume, flow and pressure values */
miguelangel_2511 8:208d965a3bd2 250 if(sensor_waveform_conta_1ms == SENSOR_WAVEFORM_PLOT_PERIOD_MS){
miguelangel_2511 8:208d965a3bd2 251 sensor_waveform_conta_1ms = 0;
miguelangel_2511 8:208d965a3bd2 252 pressure_sensor_waveform_update_flag = 1;
miguelangel_2511 10:b2d87404309a 253 test_pin = !test_pin;
miguelangel_2511 8:208d965a3bd2 254 }
miguelangel_2511 8:208d965a3bd2 255 // Indicates if it is time to display the volume, flow and pressure values */
miguelangel_2511 8:208d965a3bd2 256 if(sensor_display_conta_1ms == SENSOR_DISPLAY_PERIOD_MS){
miguelangel_2511 8:208d965a3bd2 257 sensor_display_conta_1ms = 0;
miguelangel_2511 12:3bc2465b034a 258 //pressure_sensor_display_update_flag = 1;
miguelangel_2511 8:208d965a3bd2 259 }
miguelangel_2511 8:208d965a3bd2 260
miguelangel_2511 8:208d965a3bd2 261 }
miguelangel_2511 7:f4e248182d31 262
miguelangel_2511 7:f4e248182d31 263