Started a gui menuflow
Dependencies: LCD_DISCO_F429ZI mbed TS_DISCO_F429ZI BSP_DISCO_F429ZI
Ventilation.c@2:5828e6917e75, 2020-06-09 (annotated)
- Committer:
- Clancy_SENDSOR
- Date:
- Tue Jun 09 22:57:20 2020 +0000
- Revision:
- 2:5828e6917e75
added ventilation files
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Clancy_SENDSOR | 2:5828e6917e75 | 1 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2 | /* Includes ------------------------------------------------------------------*/ |
Clancy_SENDSOR | 2:5828e6917e75 | 3 | #define EXTERN extern |
Clancy_SENDSOR | 2:5828e6917e75 | 4 | #include <stdlib.h> |
Clancy_SENDSOR | 2:5828e6917e75 | 5 | #include <string.h> |
Clancy_SENDSOR | 2:5828e6917e75 | 6 | #include "SS.h" |
Clancy_SENDSOR | 2:5828e6917e75 | 7 | #include "main.h" |
Clancy_SENDSOR | 2:5828e6917e75 | 8 | #include "_SS_OnOffActioner.h" |
Clancy_SENDSOR | 2:5828e6917e75 | 9 | #include "_SS_Pwm.h" |
Clancy_SENDSOR | 2:5828e6917e75 | 10 | #include "Monitoring.h" |
Clancy_SENDSOR | 2:5828e6917e75 | 11 | #include "Safety.h" |
Clancy_SENDSOR | 2:5828e6917e75 | 12 | #include "_SS_Data_Logging.h" |
Clancy_SENDSOR | 2:5828e6917e75 | 13 | #include "_SS_Record_Settings.h" |
Clancy_SENDSOR | 2:5828e6917e75 | 14 | #include "_SS_I2CX_SDP600.h" |
Clancy_SENDSOR | 2:5828e6917e75 | 15 | #include "_SS_I2CX_X201641.h" |
Clancy_SENDSOR | 2:5828e6917e75 | 16 | #include "_SS_OptimaComm.h" |
Clancy_SENDSOR | 2:5828e6917e75 | 17 | #undef EXTERN |
Clancy_SENDSOR | 2:5828e6917e75 | 18 | |
Clancy_SENDSOR | 2:5828e6917e75 | 19 | #define INIT_VARIABLES |
Clancy_SENDSOR | 2:5828e6917e75 | 20 | #define EXTERN |
Clancy_SENDSOR | 2:5828e6917e75 | 21 | #include "Ventilation.h" |
Clancy_SENDSOR | 2:5828e6917e75 | 22 | #undef EXTERN |
Clancy_SENDSOR | 2:5828e6917e75 | 23 | #undef INIT_VARIABLES |
Clancy_SENDSOR | 2:5828e6917e75 | 24 | |
Clancy_SENDSOR | 2:5828e6917e75 | 25 | |
Clancy_SENDSOR | 2:5828e6917e75 | 26 | /* Internal constants --------------------------------------------------------*/ |
Clancy_SENDSOR | 2:5828e6917e75 | 27 | // ******************* Min-max PI or PDF *************************************** |
Clancy_SENDSOR | 2:5828e6917e75 | 28 | #define MAX_VOLTAGE_REF MAX_PI_OUTPUT // MAX_PI_OUTPUT = 1343 = 18.5micros = 93.3%, want 80% |
Clancy_SENDSOR | 2:5828e6917e75 | 29 | #define MIN_VOLTAGE_REF MIN_PI_OUTPUT |
Clancy_SENDSOR | 2:5828e6917e75 | 30 | #define INTEGRAL_MAX (2147483647) |
Clancy_SENDSOR | 2:5828e6917e75 | 31 | #define INTEGRAL_MIN (-2147483648) |
Clancy_SENDSOR | 2:5828e6917e75 | 32 | |
Clancy_SENDSOR | 2:5828e6917e75 | 33 | |
Clancy_SENDSOR | 2:5828e6917e75 | 34 | #ifndef C_M3_DEVICETEST_TARGET |
Clancy_SENDSOR | 2:5828e6917e75 | 35 | /* Internal variables --------------------------------------------------------*/ |
Clancy_SENDSOR | 2:5828e6917e75 | 36 | // ******************* MANAGED CONSTANT SPEED **************************** |
Clancy_SENDSOR | 2:5828e6917e75 | 37 | static u16 uiBlowerSpeedSetting; |
Clancy_SENDSOR | 2:5828e6917e75 | 38 | static int32_t lIntegral_Speed_I; |
Clancy_SENDSOR | 2:5828e6917e75 | 39 | static bool bMaxPIOutputSpeedI; |
Clancy_SENDSOR | 2:5828e6917e75 | 40 | static bool bMinPIOutputSpeedI; |
Clancy_SENDSOR | 2:5828e6917e75 | 41 | |
Clancy_SENDSOR | 2:5828e6917e75 | 42 | |
Clancy_SENDSOR | 2:5828e6917e75 | 43 | // ************* MANAGED BAROMETRIC VENTILATION ************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 44 | static u16 uiIpapSettingTemp; |
Clancy_SENDSOR | 2:5828e6917e75 | 45 | static u16 uiTeBaroSet; |
Clancy_SENDSOR | 2:5828e6917e75 | 46 | static int32_t lIntegral_Pressure_I; |
Clancy_SENDSOR | 2:5828e6917e75 | 47 | static bool bMaxPIOutputPressureI; |
Clancy_SENDSOR | 2:5828e6917e75 | 48 | static bool bMinPIOutputPressureI; |
Clancy_SENDSOR | 2:5828e6917e75 | 49 | static u16 uiTiD; |
Clancy_SENDSOR | 2:5828e6917e75 | 50 | static u8 ucIndexTableSlope; |
Clancy_SENDSOR | 2:5828e6917e75 | 51 | #define TEMPO_TRIGGER_EXPI 30 |
Clancy_SENDSOR | 2:5828e6917e75 | 52 | static u8 ucTempoTriggerExpiAuto; |
Clancy_SENDSOR | 2:5828e6917e75 | 53 | #define MIN_THRESHOLD_EXPI_TRIGGER_AUTO 25 |
Clancy_SENDSOR | 2:5828e6917e75 | 54 | static u8 ucExpiTriggerTreshold; |
Clancy_SENDSOR | 2:5828e6917e75 | 55 | static u8 fFirstCycleInspi; |
Clancy_SENDSOR | 2:5828e6917e75 | 56 | |
Clancy_SENDSOR | 2:5828e6917e75 | 57 | // ----------- Main blower management during expiration ------------------- |
Clancy_SENDSOR | 2:5828e6917e75 | 58 | static u16 uiPWMatTheEndOfInspiration; |
Clancy_SENDSOR | 2:5828e6917e75 | 59 | static bool fFirstCycleExpi; |
Clancy_SENDSOR | 2:5828e6917e75 | 60 | static u16 uiEpapSettingTemp; |
Clancy_SENDSOR | 2:5828e6917e75 | 61 | static int32_t lIntegral_Pressure_E; |
Clancy_SENDSOR | 2:5828e6917e75 | 62 | static bool bMaxPIOutputPressureE; |
Clancy_SENDSOR | 2:5828e6917e75 | 63 | static bool bMinPIOutputPressureE; |
Clancy_SENDSOR | 2:5828e6917e75 | 64 | static u16 uiPWMatTheEndOfExpiration; |
Clancy_SENDSOR | 2:5828e6917e75 | 65 | static u16 uiTeD; |
Clancy_SENDSOR | 2:5828e6917e75 | 66 | static bool fBlockCloseLoop; |
Clancy_SENDSOR | 2:5828e6917e75 | 67 | |
Clancy_SENDSOR | 2:5828e6917e75 | 68 | static u16 uiTiTyp; |
Clancy_SENDSOR | 2:5828e6917e75 | 69 | |
Clancy_SENDSOR | 2:5828e6917e75 | 70 | // ************* MANAGED VOLUMETRIC VENTILATION ************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 71 | static u32 ulMaxIFlowSet; |
Clancy_SENDSOR | 2:5828e6917e75 | 72 | static u32 ulMinIFlowSet; |
Clancy_SENDSOR | 2:5828e6917e75 | 73 | static u32 ulDecFlowStep; |
Clancy_SENDSOR | 2:5828e6917e75 | 74 | static u16 uiTeVoluSet; |
Clancy_SENDSOR | 2:5828e6917e75 | 75 | static u16 uiProximalPressureAtTheEndOfInspiration; |
Clancy_SENDSOR | 2:5828e6917e75 | 76 | static int32_t lIntegral_Flow_I; |
Clancy_SENDSOR | 2:5828e6917e75 | 77 | static bool bMaxPIOutputFlowI; |
Clancy_SENDSOR | 2:5828e6917e75 | 78 | static bool bMinPIOutputFlowI; |
Clancy_SENDSOR | 2:5828e6917e75 | 79 | static int16_t iVtAdjust=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 80 | static u8 ucCounterHPAlarm=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 81 | |
Clancy_SENDSOR | 2:5828e6917e75 | 82 | |
Clancy_SENDSOR | 2:5828e6917e75 | 83 | // ******************* MANAGED_CPAP_VENTILATION ****************************** |
Clancy_SENDSOR | 2:5828e6917e75 | 84 | #define EXPIRATORY_DISCONNECTION_TIME_OUT 500 // 500ms |
Clancy_SENDSOR | 2:5828e6917e75 | 85 | #define CPAP_DISCONNECTION_TEST_PERIODICITY 4000 // 4s |
Clancy_SENDSOR | 2:5828e6917e75 | 86 | static u16 uiDisconnectionTime; |
Clancy_SENDSOR | 2:5828e6917e75 | 87 | static u16 uiDisconnectionTimeInCPAP; |
Clancy_SENDSOR | 2:5828e6917e75 | 88 | static u16 uiMemoPWMDuringDisconnection; |
Clancy_SENDSOR | 2:5828e6917e75 | 89 | //static u8 ucStandByMode; |
Clancy_SENDSOR | 2:5828e6917e75 | 90 | |
Clancy_SENDSOR | 2:5828e6917e75 | 91 | // ***************** MANAGED INSPIRATORY TRIGGER ***************************** |
Clancy_SENDSOR | 2:5828e6917e75 | 92 | #define MAX_DELTA_FLOW 100 // 1 l/min |
Clancy_SENDSOR | 2:5828e6917e75 | 93 | #define SIZE_DELTA_INSPIRATORY_FLOW_BUFFER 40 |
Clancy_SENDSOR | 2:5828e6917e75 | 94 | #define NUMBER_TRIGGER_VALID 20 |
Clancy_SENDSOR | 2:5828e6917e75 | 95 | #define NUMBER_MIN_FLOW_VALUE 30 |
Clancy_SENDSOR | 2:5828e6917e75 | 96 | //static int16_t iBufferIFlowDelta[SIZE_DELTA_INSPIRATORY_FLOW_BUFFER]; |
Clancy_SENDSOR | 2:5828e6917e75 | 97 | static u8 ucInspiTriggerScheduler; |
Clancy_SENDSOR | 2:5828e6917e75 | 98 | static u8 ucMinFlowCounter; |
Clancy_SENDSOR | 2:5828e6917e75 | 99 | static int16_t iInspiratoryFlowMin; |
Clancy_SENDSOR | 2:5828e6917e75 | 100 | //static int16_t iOldInspiratoryFlowSmoothingMesForTrigger; |
Clancy_SENDSOR | 2:5828e6917e75 | 101 | #define SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER 250 |
Clancy_SENDSOR | 2:5828e6917e75 | 102 | static int16_t iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER]; |
Clancy_SENDSOR | 2:5828e6917e75 | 103 | // static int16_t iBufferConductance[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER]; |
Clancy_SENDSOR | 2:5828e6917e75 | 104 | static u8 ucCounterTriggerValid; |
Clancy_SENDSOR | 2:5828e6917e75 | 105 | static int16_t iFlowBaseLineReference; |
Clancy_SENDSOR | 2:5828e6917e75 | 106 | static bool bDetectionConstantFlow; |
Clancy_SENDSOR | 2:5828e6917e75 | 107 | |
Clancy_SENDSOR | 2:5828e6917e75 | 108 | |
Clancy_SENDSOR | 2:5828e6917e75 | 109 | // *********************** MANAGED MONITORING FOR MLT ************************ |
Clancy_SENDSOR | 2:5828e6917e75 | 110 | static u16 uiMLT_PressureSetPoint; |
Clancy_SENDSOR | 2:5828e6917e75 | 111 | #ifdef MOTOR_LIFE_TESTING |
Clancy_SENDSOR | 2:5828e6917e75 | 112 | #define MLT_AVERAGE_MONITORING 1000 |
Clancy_SENDSOR | 2:5828e6917e75 | 113 | static u16 uiAverageMonitoringMLT; |
Clancy_SENDSOR | 2:5828e6917e75 | 114 | static u32 ulMLT_SumSpeedMes; |
Clancy_SENDSOR | 2:5828e6917e75 | 115 | static u32 ulMLT_SumCurrentMes; |
Clancy_SENDSOR | 2:5828e6917e75 | 116 | static u32 ulMLT_SumTemperatureMes; |
Clancy_SENDSOR | 2:5828e6917e75 | 117 | static u32 ulMLT_SumBlowerVoltage; |
Clancy_SENDSOR | 2:5828e6917e75 | 118 | static u16 uiMLT_EnableAlarm; |
Clancy_SENDSOR | 2:5828e6917e75 | 119 | #endif // #ifdef MOTOR_LIFE_TESTING |
Clancy_SENDSOR | 2:5828e6917e75 | 120 | |
Clancy_SENDSOR | 2:5828e6917e75 | 121 | |
Clancy_SENDSOR | 2:5828e6917e75 | 122 | // ************************ MANAGED CALIBRATION ****************************** |
Clancy_SENDSOR | 2:5828e6917e75 | 123 | typedef enum |
Clancy_SENDSOR | 2:5828e6917e75 | 124 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 125 | INIT_FLOW_CALIB_TEST=0, |
Clancy_SENDSOR | 2:5828e6917e75 | 126 | SET_GAS_TYPE, |
Clancy_SENDSOR | 2:5828e6917e75 | 127 | SET_GAS_STANDARD, |
Clancy_SENDSOR | 2:5828e6917e75 | 128 | START_FLOW_READING, |
Clancy_SENDSOR | 2:5828e6917e75 | 129 | SEND_FLOW_COMMAND, |
Clancy_SENDSOR | 2:5828e6917e75 | 130 | READ_FLOW_VALUE, |
Clancy_SENDSOR | 2:5828e6917e75 | 131 | SEND_HIGH_FLOW_CALIB_REQUEST, |
Clancy_SENDSOR | 2:5828e6917e75 | 132 | WAIT_FOR_HIGH_FLOW_CALIB_ACK, |
Clancy_SENDSOR | 2:5828e6917e75 | 133 | PREPARE_FAILURE_COMMAND, |
Clancy_SENDSOR | 2:5828e6917e75 | 134 | PREPARE_SUCCESS_COMMAND, |
Clancy_SENDSOR | 2:5828e6917e75 | 135 | SEND_COMMAND_TO_PF300, |
Clancy_SENDSOR | 2:5828e6917e75 | 136 | CHECK_COMMAND_FROM_PF300, |
Clancy_SENDSOR | 2:5828e6917e75 | 137 | END_OF_CALIBRATION, |
Clancy_SENDSOR | 2:5828e6917e75 | 138 | } type_enLowFlowCalibrationStep; |
Clancy_SENDSOR | 2:5828e6917e75 | 139 | |
Clancy_SENDSOR | 2:5828e6917e75 | 140 | typedef enum |
Clancy_SENDSOR | 2:5828e6917e75 | 141 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 142 | INIT_PRESSURE_CALIB_TEST=0, |
Clancy_SENDSOR | 2:5828e6917e75 | 143 | START_PRESSURE_READING, |
Clancy_SENDSOR | 2:5828e6917e75 | 144 | SEND_PRESSURE_COMMAND, |
Clancy_SENDSOR | 2:5828e6917e75 | 145 | READ_PRESSURE_VALUE, |
Clancy_SENDSOR | 2:5828e6917e75 | 146 | PRESSURE_CALIB_FAILURE_COMMAND, |
Clancy_SENDSOR | 2:5828e6917e75 | 147 | PRESSURE_CALIB_SUCCESS_COMMAND, |
Clancy_SENDSOR | 2:5828e6917e75 | 148 | PRESSURE_CALIB_SEND_COMMAND_TO_PF300, |
Clancy_SENDSOR | 2:5828e6917e75 | 149 | PRESSURE_CALIB_CHECK_COMMAND_FROM_PF300, |
Clancy_SENDSOR | 2:5828e6917e75 | 150 | PRESSURE_CALIB_END_OF_CALIBRATION, |
Clancy_SENDSOR | 2:5828e6917e75 | 151 | } type_enPressureCalibrationStep; |
Clancy_SENDSOR | 2:5828e6917e75 | 152 | |
Clancy_SENDSOR | 2:5828e6917e75 | 153 | #define SIZE_BUFFER_FLOW_VALUE 15 |
Clancy_SENDSOR | 2:5828e6917e75 | 154 | typedef struct |
Clancy_SENDSOR | 2:5828e6917e75 | 155 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 156 | unsigned char ucIndex; |
Clancy_SENDSOR | 2:5828e6917e75 | 157 | bool bFirstPartOfTheCRReceived; |
Clancy_SENDSOR | 2:5828e6917e75 | 158 | char szValue[SIZE_BUFFER_FLOW_VALUE]; |
Clancy_SENDSOR | 2:5828e6917e75 | 159 | } type_stFlow; |
Clancy_SENDSOR | 2:5828e6917e75 | 160 | |
Clancy_SENDSOR | 2:5828e6917e75 | 161 | // Flow and pressure calibration |
Clancy_SENDSOR | 2:5828e6917e75 | 162 | #define TIME_OUT_RECEPTION_PACKET_FROM_PF300 2000 // 2s |
Clancy_SENDSOR | 2:5828e6917e75 | 163 | #define SAMPLE_RATE_BETWEEN_TWO_FLOW 5000 // 5s |
Clancy_SENDSOR | 2:5828e6917e75 | 164 | #define SIZE_RX_BUFFER_PF300 20 |
Clancy_SENDSOR | 2:5828e6917e75 | 165 | static u16 uiCalibrationTimeOut; |
Clancy_SENDSOR | 2:5828e6917e75 | 166 | static unsigned char ucIndexAnswerFromPF300; |
Clancy_SENDSOR | 2:5828e6917e75 | 167 | static char szAnswerFromPF300[SIZE_RX_BUFFER_PF300]; |
Clancy_SENDSOR | 2:5828e6917e75 | 168 | static char szExpectedAnswerFromPF300[SIZE_RX_BUFFER_PF300]; |
Clancy_SENDSOR | 2:5828e6917e75 | 169 | static u8 ucNumberOfBytesToCheckFromPF300Answer; |
Clancy_SENDSOR | 2:5828e6917e75 | 170 | |
Clancy_SENDSOR | 2:5828e6917e75 | 171 | // Flow calibration |
Clancy_SENDSOR | 2:5828e6917e75 | 172 | static type_enLowFlowCalibrationStep enLowFlowCalibrationStep; |
Clancy_SENDSOR | 2:5828e6917e75 | 173 | static type_enLowFlowCalibrationStep enGoBackToStep; |
Clancy_SENDSOR | 2:5828e6917e75 | 174 | static unsigned long ulSumFlowTicks; |
Clancy_SENDSOR | 2:5828e6917e75 | 175 | static unsigned int uiFlowTicksSamplesCounter; |
Clancy_SENDSOR | 2:5828e6917e75 | 176 | //static type_stLUTFlowSensor stTemporayLUTFlowSensor; |
Clancy_SENDSOR | 2:5828e6917e75 | 177 | static bool bHighFlowCalibrationInProgress; |
Clancy_SENDSOR | 2:5828e6917e75 | 178 | static unsigned int uiMotorDutyCyleForFlowCalib; |
Clancy_SENDSOR | 2:5828e6917e75 | 179 | static unsigned int uiImHereMsgTimer; |
Clancy_SENDSOR | 2:5828e6917e75 | 180 | |
Clancy_SENDSOR | 2:5828e6917e75 | 181 | // Pressure calibration |
Clancy_SENDSOR | 2:5828e6917e75 | 182 | #define SAMPLE_RATE_BETWEEN_TWO_PRESSURE 10000 // 30s |
Clancy_SENDSOR | 2:5828e6917e75 | 183 | static type_enPressureCalibrationStep enPressureCalibrationStep; |
Clancy_SENDSOR | 2:5828e6917e75 | 184 | static type_enPressureCalibrationStep enPressureCalibGoBackToStep; |
Clancy_SENDSOR | 2:5828e6917e75 | 185 | static u32 ulSumPressureTicks; |
Clancy_SENDSOR | 2:5828e6917e75 | 186 | static u16 uiPressureTicksSamplesCounter; |
Clancy_SENDSOR | 2:5828e6917e75 | 187 | |
Clancy_SENDSOR | 2:5828e6917e75 | 188 | // List of command to PF300 |
Clancy_SENDSOR | 2:5828e6917e75 | 189 | static const char szPF300_CmdSwitchOffEcho[]={"%CM#5$0\r"}; // Command Echo from PF300 off |
Clancy_SENDSOR | 2:5828e6917e75 | 190 | static const char szPF300_AnswerSwitchOffEcho[]={"%CM#5"}; // Answer echo off from PF300 (WO \r) |
Clancy_SENDSOR | 2:5828e6917e75 | 191 | static const char szPF300_SetAirGasType[]={"%WS#1$0\r"}; // command Air |
Clancy_SENDSOR | 2:5828e6917e75 | 192 | static const char szPF300_AnswerAirGasType[]={"%WS#1$0"}; // Answer Air |
Clancy_SENDSOR | 2:5828e6917e75 | 193 | static const char szPF300_SetGasStandard[]={"%WS#3$1\r"}; // Command STPD |
Clancy_SENDSOR | 2:5828e6917e75 | 194 | static const char szPF300_AnswerGasStandard[]={"%WS#3$1"}; // Answer STPD |
Clancy_SENDSOR | 2:5828e6917e75 | 195 | static const char szPF300_ReadLowFlowCmd[]={"%RM#1\r"}; // Command read low flow |
Clancy_SENDSOR | 2:5828e6917e75 | 196 | static const char szPF300_ReadLowFlowAnswer[]={"%RM#1$"}; // Answer read low flow |
Clancy_SENDSOR | 2:5828e6917e75 | 197 | static const char szPF300_ReadHighFlowCmd[]={"%RM#0\r"}; // Command read high flow |
Clancy_SENDSOR | 2:5828e6917e75 | 198 | static const char szPF300_ReadHighFlowAnswer[]={"%RM#0$"}; // Answer read high flow |
Clancy_SENDSOR | 2:5828e6917e75 | 199 | static const char szPF300_ReadPdiffCmd[]={"%RM#3\r"}; // Command read pressure diff. |
Clancy_SENDSOR | 2:5828e6917e75 | 200 | static const char szPF300_ReadPdiffAnswer[]={"%RM#3$"}; // Answewr read pressure diff. |
Clancy_SENDSOR | 2:5828e6917e75 | 201 | |
Clancy_SENDSOR | 2:5828e6917e75 | 202 | // List of Command to Handset |
Clancy_SENDSOR | 2:5828e6917e75 | 203 | static const char szRequestHighFlowCalib[]={"@N"}; |
Clancy_SENDSOR | 2:5828e6917e75 | 204 | static const char szEndOfCalibOK[]={"@S"}; |
Clancy_SENDSOR | 2:5828e6917e75 | 205 | static const char szImHere[]={"@*"}; |
Clancy_SENDSOR | 2:5828e6917e75 | 206 | |
Clancy_SENDSOR | 2:5828e6917e75 | 207 | |
Clancy_SENDSOR | 2:5828e6917e75 | 208 | // ---------------- Management FRAM for settings ----------------------------- |
Clancy_SENDSOR | 2:5828e6917e75 | 209 | #ifdef RECORD_SETTINGS |
Clancy_SENDSOR | 2:5828e6917e75 | 210 | #endif // RECORD_SETTINGS |
Clancy_SENDSOR | 2:5828e6917e75 | 211 | |
Clancy_SENDSOR | 2:5828e6917e75 | 212 | // -------------------- Manage Motor starting -------------------------------- |
Clancy_SENDSOR | 2:5828e6917e75 | 213 | #ifndef TEMPERATURE_TRENDS |
Clancy_SENDSOR | 2:5828e6917e75 | 214 | static u8 ucStartVentilationScheduler=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 215 | #endif |
Clancy_SENDSOR | 2:5828e6917e75 | 216 | static enMaroubraModes enPreviousMode; |
Clancy_SENDSOR | 2:5828e6917e75 | 217 | static u16 uiPreviousDeviceMode; |
Clancy_SENDSOR | 2:5828e6917e75 | 218 | #endif // C_M3_DEVICETEST_TARGET |
Clancy_SENDSOR | 2:5828e6917e75 | 219 | |
Clancy_SENDSOR | 2:5828e6917e75 | 220 | |
Clancy_SENDSOR | 2:5828e6917e75 | 221 | #ifndef C_M3_DEVICETEST_TARGET |
Clancy_SENDSOR | 2:5828e6917e75 | 222 | #define SIZE_SLOPE2_TABLE 21 |
Clancy_SENDSOR | 2:5828e6917e75 | 223 | const unsigned char ucSlope2Table[SIZE_SLOPE2_TABLE]= { |
Clancy_SENDSOR | 2:5828e6917e75 | 224 | 0, 35, 50, 59, 65, 70, 74, 77, 80, 83, |
Clancy_SENDSOR | 2:5828e6917e75 | 225 | 85, 87, 89, 91, 92, 94, 95, 96, 98, 99, |
Clancy_SENDSOR | 2:5828e6917e75 | 226 | 100 }; |
Clancy_SENDSOR | 2:5828e6917e75 | 227 | |
Clancy_SENDSOR | 2:5828e6917e75 | 228 | // Table pente inspiratoire 2 |
Clancy_SENDSOR | 2:5828e6917e75 | 229 | #define SIZE_SLOPE3_TABLE 41 |
Clancy_SENDSOR | 2:5828e6917e75 | 230 | const unsigned char ucSlope3Table[SIZE_SLOPE3_TABLE]= { |
Clancy_SENDSOR | 2:5828e6917e75 | 231 | 0, 20, 35, 44, 50, 55, 59, 62, 65, 68, 70, |
Clancy_SENDSOR | 2:5828e6917e75 | 232 | 72, 74, 76, 77, 79, 80, 81, 83, 84, 85, 86, |
Clancy_SENDSOR | 2:5828e6917e75 | 233 | 87, 88, 89, 90, 91, 91, 92, 93, 94, 94, 95, |
Clancy_SENDSOR | 2:5828e6917e75 | 234 | 96, 96, 97, 98, 98, 99, 99, 100 }; |
Clancy_SENDSOR | 2:5828e6917e75 | 235 | |
Clancy_SENDSOR | 2:5828e6917e75 | 236 | // Table pente inspiratoire 3 |
Clancy_SENDSOR | 2:5828e6917e75 | 237 | #define SIZE_SLOPE4_TABLE 61 |
Clancy_SENDSOR | 2:5828e6917e75 | 238 | const unsigned char ucSlope4Table[SIZE_SLOPE4_TABLE]= { |
Clancy_SENDSOR | 2:5828e6917e75 | 239 | 0, 11, 26, 35, 41, 46, 50, 53, 56, 59, 61, |
Clancy_SENDSOR | 2:5828e6917e75 | 240 | 63, 65, 67, 68, 70, 71, 73, 74, 75, 76, 77, |
Clancy_SENDSOR | 2:5828e6917e75 | 241 | 78, 79, 80, 81, 82, 83, 83, 84, 85, 86, 86, |
Clancy_SENDSOR | 2:5828e6917e75 | 242 | 87, 88, 88, 89 ,90, 90, 91, 91, 92, 92, 93, |
Clancy_SENDSOR | 2:5828e6917e75 | 243 | 93, 94, 94, 95, 95, 96, 96, 96, 97, 97, 98, |
Clancy_SENDSOR | 2:5828e6917e75 | 244 | 98, 99, 99, 99, 100, 100 }; |
Clancy_SENDSOR | 2:5828e6917e75 | 245 | |
Clancy_SENDSOR | 2:5828e6917e75 | 246 | |
Clancy_SENDSOR | 2:5828e6917e75 | 247 | // Maximum allowed flow in expiration Flow=f(PEEP set) (example: flow-by max=29L/min @ 5hPa) |
Clancy_SENDSOR | 2:5828e6917e75 | 248 | const u16 uiMaximumFlowInExpiration[41]={ |
Clancy_SENDSOR | 2:5828e6917e75 | 249 | 0, 1300, 1830, 2250, 2600, 2900, 3180, 3430, 3670, 3900, |
Clancy_SENDSOR | 2:5828e6917e75 | 250 | 4110, 4310, 4500, 4680, 4860, 5030, 5200, 5360, 5510, 5660, |
Clancy_SENDSOR | 2:5828e6917e75 | 251 | 5810, 5950, 6090, 6230, 6360, 6500, 6620, 6750, 6870, 7000, |
Clancy_SENDSOR | 2:5828e6917e75 | 252 | 7120, 7230, 7350, 7460, 7580, 7690, 7800, 7900, 8010, 8110, 8220 |
Clancy_SENDSOR | 2:5828e6917e75 | 253 | }; |
Clancy_SENDSOR | 2:5828e6917e75 | 254 | #endif // C_M3_DEVICETEST_TARGET |
Clancy_SENDSOR | 2:5828e6917e75 | 255 | |
Clancy_SENDSOR | 2:5828e6917e75 | 256 | |
Clancy_SENDSOR | 2:5828e6917e75 | 257 | /* Internal functions --------------------------------------------------------*/ |
Clancy_SENDSOR | 2:5828e6917e75 | 258 | #ifndef C_M3_DEVICETEST_TARGET |
Clancy_SENDSOR | 2:5828e6917e75 | 259 | u16 ComputeTe(u16 uiF, u16 uiTi); |
Clancy_SENDSOR | 2:5828e6917e75 | 260 | void ComputeInspiratoryFlowSetPointInAVC(u16 uiTypeOfPatient, u16 uiVtc, u16 uiTi, u16 uiFlowShape, u32 *ulMaxFlow, u32 *ulMinFlow, u32 *ulFlowStep); |
Clancy_SENDSOR | 2:5828e6917e75 | 261 | unsigned char TestTriggerExpiratoire(unsigned char ucValeurSeuil, unsigned int uiPressureSetting); |
Clancy_SENDSOR | 2:5828e6917e75 | 262 | bool TestInspiratoryTrigger(bool bSpont, u16 uiTe, u16 uiFlowThreshold); |
Clancy_SENDSOR | 2:5828e6917e75 | 263 | int16_t UpdateInspiratoryFlowAverage(void); |
Clancy_SENDSOR | 2:5828e6917e75 | 264 | int16_t UpdateInspiratoryConductanceAverage(void); |
Clancy_SENDSOR | 2:5828e6917e75 | 265 | void ResetInspiratoryConductanceAverage(void); |
Clancy_SENDSOR | 2:5828e6917e75 | 266 | bool TestInspiratorySlowTrigger(int16_t iTheFlowBaseLine, u16 uiFlowTreshold); |
Clancy_SENDSOR | 2:5828e6917e75 | 267 | void ApplyDefaultValueToTemporaryVentilationSettings(void); |
Clancy_SENDSOR | 2:5828e6917e75 | 268 | void ApplyDefaultValueToTechnicalSettings(void); |
Clancy_SENDSOR | 2:5828e6917e75 | 269 | void ApplyAllDefaultValues(void); |
Clancy_SENDSOR | 2:5828e6917e75 | 270 | bool ApplyNewVentilationMode(void); |
Clancy_SENDSOR | 2:5828e6917e75 | 271 | void ApplyDefaultFlowLUT(void); |
Clancy_SENDSOR | 2:5828e6917e75 | 272 | void CheckFlowLUTRange(void); |
Clancy_SENDSOR | 2:5828e6917e75 | 273 | void ManageFlowCalibration(void); |
Clancy_SENDSOR | 2:5828e6917e75 | 274 | void ManagePressureCalibration(void); |
Clancy_SENDSOR | 2:5828e6917e75 | 275 | void ManageCstPressure(void); |
Clancy_SENDSOR | 2:5828e6917e75 | 276 | #endif // C_M3_DEVICETEST_TARGET |
Clancy_SENDSOR | 2:5828e6917e75 | 277 | |
Clancy_SENDSOR | 2:5828e6917e75 | 278 | |
Clancy_SENDSOR | 2:5828e6917e75 | 279 | |
Clancy_SENDSOR | 2:5828e6917e75 | 280 | #ifndef C_M3_DEVICETEST_TARGET |
Clancy_SENDSOR | 2:5828e6917e75 | 281 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 282 | * Function Name : InitSettings |
Clancy_SENDSOR | 2:5828e6917e75 | 283 | * Description : Initialize parameters for ventilation |
Clancy_SENDSOR | 2:5828e6917e75 | 284 | * Input : None |
Clancy_SENDSOR | 2:5828e6917e75 | 285 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 286 | * Return : None |
Clancy_SENDSOR | 2:5828e6917e75 | 287 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 288 | void InitSettings(void) |
Clancy_SENDSOR | 2:5828e6917e75 | 289 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 290 | uiPreviousDeviceMode=0xFF; |
Clancy_SENDSOR | 2:5828e6917e75 | 291 | enPreviousMode=NUMBER_OF_MODE; |
Clancy_SENDSOR | 2:5828e6917e75 | 292 | |
Clancy_SENDSOR | 2:5828e6917e75 | 293 | // --- Init Settings |
Clancy_SENDSOR | 2:5828e6917e75 | 294 | uiTechnicalDataMes[SW_VERSION_TEC_MES]=MAROUBRA_BLOWER_SW_VERSION; |
Clancy_SENDSOR | 2:5828e6917e75 | 295 | bComputeOffsetSensors=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 296 | |
Clancy_SENDSOR | 2:5828e6917e75 | 297 | #ifdef RECORD_SETTINGS |
Clancy_SENDSOR | 2:5828e6917e75 | 298 | // Read and init FRAM |
Clancy_SENDSOR | 2:5828e6917e75 | 299 | if (InitSettingsZoneAndTechnicalZoneInFRAM()==OPSTATUS_OK) |
Clancy_SENDSOR | 2:5828e6917e75 | 300 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 301 | if (ReadSettingsZoneAndTechnicalZoneInFRAM()==OPSTATUS_FAIL) |
Clancy_SENDSOR | 2:5828e6917e75 | 302 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 303 | uiFlagsAlarm[ALARM_FLAGS2]|=FRAM_FAILURE_ALARM_MASK; |
Clancy_SENDSOR | 2:5828e6917e75 | 304 | ApplyAllDefaultValues(); |
Clancy_SENDSOR | 2:5828e6917e75 | 305 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 306 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 307 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 308 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 309 | uiFlagsAlarm[ALARM_FLAGS2]|=FRAM_FAILURE_ALARM_MASK; |
Clancy_SENDSOR | 2:5828e6917e75 | 310 | ApplyAllDefaultValues(); |
Clancy_SENDSOR | 2:5828e6917e75 | 311 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 312 | #else |
Clancy_SENDSOR | 2:5828e6917e75 | 313 | ApplyAllDefaultValues(); |
Clancy_SENDSOR | 2:5828e6917e75 | 314 | #endif |
Clancy_SENDSOR | 2:5828e6917e75 | 315 | |
Clancy_SENDSOR | 2:5828e6917e75 | 316 | // Compute offsets sensors if necessary |
Clancy_SENDSOR | 2:5828e6917e75 | 317 | if (bComputeOffsetSensors==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 318 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 319 | // ------ Update Blower Flow sensor offset before ventilation ------- |
Clancy_SENDSOR | 2:5828e6917e75 | 320 | #ifdef SDP600_USED_I2C1_BUS |
Clancy_SENDSOR | 2:5828e6917e75 | 321 | SDP600_ComputeOffsetFlowSensorOnI2C1(SDP600_BLOWER_FLOW_SENSOR); |
Clancy_SENDSOR | 2:5828e6917e75 | 322 | #endif // SDP600_USED_I2C1_BUS |
Clancy_SENDSOR | 2:5828e6917e75 | 323 | |
Clancy_SENDSOR | 2:5828e6917e75 | 324 | #ifdef X201641_USED_I2C1_BUS |
Clancy_SENDSOR | 2:5828e6917e75 | 325 | X201641_ComputeOffsetFlowSensorOnI2C1(X201641_BLOWER_FLOW_SENSOR); |
Clancy_SENDSOR | 2:5828e6917e75 | 326 | #endif // X201641_USED_I2C1_BUS |
Clancy_SENDSOR | 2:5828e6917e75 | 327 | |
Clancy_SENDSOR | 2:5828e6917e75 | 328 | // ----- Update Proximal Pressure sensor offset before ventilation ------- |
Clancy_SENDSOR | 2:5828e6917e75 | 329 | ComputeOffsetProximalPressureSensor(); |
Clancy_SENDSOR | 2:5828e6917e75 | 330 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 331 | |
Clancy_SENDSOR | 2:5828e6917e75 | 332 | // Check Technical settings range |
Clancy_SENDSOR | 2:5828e6917e75 | 333 | CheckTechnicalSettingsRange(); |
Clancy_SENDSOR | 2:5828e6917e75 | 334 | |
Clancy_SENDSOR | 2:5828e6917e75 | 335 | // Check Flow LUT |
Clancy_SENDSOR | 2:5828e6917e75 | 336 | CheckFlowLUTRange(); |
Clancy_SENDSOR | 2:5828e6917e75 | 337 | |
Clancy_SENDSOR | 2:5828e6917e75 | 338 | // Check temporary ventilation setting range |
Clancy_SENDSOR | 2:5828e6917e75 | 339 | if (CheckTemporaryVentilationSettingRange()==OPSTATUS_FAIL) |
Clancy_SENDSOR | 2:5828e6917e75 | 340 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 341 | ApplyDefaultValueToTemporaryVentilationSettings(); |
Clancy_SENDSOR | 2:5828e6917e75 | 342 | uiFlagsAlarm[ALARM_FLAGS2]|=VENTILATION_SETTINGS_RANGE_ALARM_MASK; |
Clancy_SENDSOR | 2:5828e6917e75 | 343 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 344 | |
Clancy_SENDSOR | 2:5828e6917e75 | 345 | // --- Update computed settings (Te,...) |
Clancy_SENDSOR | 2:5828e6917e75 | 346 | UpdateSettings(); |
Clancy_SENDSOR | 2:5828e6917e75 | 347 | |
Clancy_SENDSOR | 2:5828e6917e75 | 348 | #ifdef MOTOR_LIFE_TESTING |
Clancy_SENDSOR | 2:5828e6917e75 | 349 | uiTechnicalDataSet[DEVICE_MODE_TEC]=PRESSURE_CST_MODE; |
Clancy_SENDSOR | 2:5828e6917e75 | 350 | uiTechnicalDataSet[START_STOP_VENTILATION]=1; |
Clancy_SENDSOR | 2:5828e6917e75 | 351 | #endif |
Clancy_SENDSOR | 2:5828e6917e75 | 352 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 353 | |
Clancy_SENDSOR | 2:5828e6917e75 | 354 | |
Clancy_SENDSOR | 2:5828e6917e75 | 355 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 356 | * Function Name : InitVentilation |
Clancy_SENDSOR | 2:5828e6917e75 | 357 | * Description : Initialize variables for ventilation |
Clancy_SENDSOR | 2:5828e6917e75 | 358 | * Function called : |
Clancy_SENDSOR | 2:5828e6917e75 | 359 | * - when we start ventilation |
Clancy_SENDSOR | 2:5828e6917e75 | 360 | * - when we change of ventilation mode |
Clancy_SENDSOR | 2:5828e6917e75 | 361 | * - when we change of device mode |
Clancy_SENDSOR | 2:5828e6917e75 | 362 | * Input : None |
Clancy_SENDSOR | 2:5828e6917e75 | 363 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 364 | * Return : None |
Clancy_SENDSOR | 2:5828e6917e75 | 365 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 366 | void InitVentilation(void) |
Clancy_SENDSOR | 2:5828e6917e75 | 367 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 368 | ucVentilationCycle=EXPIRATION_CYCLE; |
Clancy_SENDSOR | 2:5828e6917e75 | 369 | uiTiD=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 370 | uiTeD=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 371 | uiTiTyp = 1000; |
Clancy_SENDSOR | 2:5828e6917e75 | 372 | bManualBreath=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 373 | |
Clancy_SENDSOR | 2:5828e6917e75 | 374 | if (enPreviousMode==NUMBER_OF_MODE) |
Clancy_SENDSOR | 2:5828e6917e75 | 375 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 376 | // Start ventilation |
Clancy_SENDSOR | 2:5828e6917e75 | 377 | uiDisconnectionTime=EXPIRATORY_DISCONNECTION_TIME_OUT; |
Clancy_SENDSOR | 2:5828e6917e75 | 378 | uiDisconnectionTimeInCPAP=CPAP_DISCONNECTION_TEST_PERIODICITY; |
Clancy_SENDSOR | 2:5828e6917e75 | 379 | uiMemoPWMDuringDisconnection=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 380 | fBlockCloseLoop=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 381 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 382 | |
Clancy_SENDSOR | 2:5828e6917e75 | 383 | ClearAllVentilationAlarms(); |
Clancy_SENDSOR | 2:5828e6917e75 | 384 | ClearAllMeasures(); |
Clancy_SENDSOR | 2:5828e6917e75 | 385 | |
Clancy_SENDSOR | 2:5828e6917e75 | 386 | switch(uiTechnicalDataSet[DEVICE_MODE_TEC]) |
Clancy_SENDSOR | 2:5828e6917e75 | 387 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 388 | default: |
Clancy_SENDSOR | 2:5828e6917e75 | 389 | case VENTILATION_MODE: |
Clancy_SENDSOR | 2:5828e6917e75 | 390 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 391 | if (enVentilationMode==APCV_MODE || enVentilationMode==PS_MODE) |
Clancy_SENDSOR | 2:5828e6917e75 | 392 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 393 | if (enPreviousMode==APCV_MODE || enPreviousMode==PS_MODE) |
Clancy_SENDSOR | 2:5828e6917e75 | 394 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 395 | // --- We are already in pressure mode |
Clancy_SENDSOR | 2:5828e6917e75 | 396 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 397 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 398 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 399 | // --- Start a pressure mode |
Clancy_SENDSOR | 2:5828e6917e75 | 400 | fFirstCycleInspi=TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 401 | uiPWMatTheEndOfInspiration=MIN_VOLTAGE_REF; |
Clancy_SENDSOR | 2:5828e6917e75 | 402 | |
Clancy_SENDSOR | 2:5828e6917e75 | 403 | if (enPreviousMode!=AVC_MODE) |
Clancy_SENDSOR | 2:5828e6917e75 | 404 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 405 | uiPWMatTheEndOfExpiration=MIN_VOLTAGE_REF; |
Clancy_SENDSOR | 2:5828e6917e75 | 406 | lIntegral_Pressure_E=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 407 | bMaxPIOutputPressureE=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 408 | bMinPIOutputPressureE=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 409 | fFirstCycleExpi=TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 410 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 411 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 412 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 413 | else if (enVentilationMode==AVC_MODE) |
Clancy_SENDSOR | 2:5828e6917e75 | 414 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 415 | iVtAdjust=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 416 | fFirstCycleInspi=TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 417 | uiPWMatTheEndOfInspiration=MIN_VOLTAGE_REF; |
Clancy_SENDSOR | 2:5828e6917e75 | 418 | |
Clancy_SENDSOR | 2:5828e6917e75 | 419 | if (enPreviousMode!=APCV_MODE && enPreviousMode!=PS_MODE) |
Clancy_SENDSOR | 2:5828e6917e75 | 420 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 421 | uiPWMatTheEndOfExpiration=MIN_VOLTAGE_REF; |
Clancy_SENDSOR | 2:5828e6917e75 | 422 | lIntegral_Pressure_E=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 423 | bMaxPIOutputPressureE=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 424 | bMinPIOutputPressureE=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 425 | fFirstCycleExpi=TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 426 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 427 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 428 | else if (enVentilationMode==CPAP_MODE) |
Clancy_SENDSOR | 2:5828e6917e75 | 429 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 430 | Ki_Pressure_I=1000; |
Clancy_SENDSOR | 2:5828e6917e75 | 431 | uiPWMatTheEndOfInspiration=MIN_VOLTAGE_REF; |
Clancy_SENDSOR | 2:5828e6917e75 | 432 | lIntegral_Pressure_I=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 433 | bMaxPIOutputPressureI=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 434 | bMinPIOutputPressureI=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 435 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 436 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 437 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 438 | case ONE_CST_PWM_MODE: |
Clancy_SENDSOR | 2:5828e6917e75 | 439 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 440 | uiInspirationBlowerPWMTec=250; |
Clancy_SENDSOR | 2:5828e6917e75 | 441 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 442 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 443 | case TWO_CST_PWM_MODE: |
Clancy_SENDSOR | 2:5828e6917e75 | 444 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 445 | uiInspirationBlowerPWMTec=350; |
Clancy_SENDSOR | 2:5828e6917e75 | 446 | uiExpirationBlowerPWMTec=150; |
Clancy_SENDSOR | 2:5828e6917e75 | 447 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 448 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 449 | case CST_SPEED_MODE: |
Clancy_SENDSOR | 2:5828e6917e75 | 450 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 451 | uiBlowerSpeedSet=15000; |
Clancy_SENDSOR | 2:5828e6917e75 | 452 | uiBlowerSpeedSetting=5000; |
Clancy_SENDSOR | 2:5828e6917e75 | 453 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 454 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 455 | case FLOW_CAL_MODE: |
Clancy_SENDSOR | 2:5828e6917e75 | 456 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 457 | enLowFlowCalibrationStep=INIT_FLOW_CALIB_TEST; |
Clancy_SENDSOR | 2:5828e6917e75 | 458 | bHighFlowCalibrationInProgress=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 459 | stTemporayLUTFlowSensor.uiLUT_TableSize=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 460 | uiCalibrationTimeOut=(TIME_OUT_BLOWER_HANDSET_COMM*20); // 2s |
Clancy_SENDSOR | 2:5828e6917e75 | 461 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 462 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 463 | case PRESSURE_CAL_MODE: |
Clancy_SENDSOR | 2:5828e6917e75 | 464 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 465 | enPressureCalibrationStep=INIT_PRESSURE_CALIB_TEST; |
Clancy_SENDSOR | 2:5828e6917e75 | 466 | uiCalibrationTimeOut=(TIME_OUT_BLOWER_HANDSET_COMM*20); // 2s |
Clancy_SENDSOR | 2:5828e6917e75 | 467 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 468 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 469 | case PRESSURE_CST_MODE: |
Clancy_SENDSOR | 2:5828e6917e75 | 470 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 471 | uiMLT_PressureSetPoint=10; |
Clancy_SENDSOR | 2:5828e6917e75 | 472 | lIntegral_Pressure_I=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 473 | bMaxPIOutputPressureI=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 474 | bMinPIOutputPressureI=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 475 | |
Clancy_SENDSOR | 2:5828e6917e75 | 476 | #ifdef MOTOR_LIFE_TESTING |
Clancy_SENDSOR | 2:5828e6917e75 | 477 | uiMLT_EnableAlarm=5000; // 5s before enabling alarm |
Clancy_SENDSOR | 2:5828e6917e75 | 478 | uiAverageMonitoringMLT=MLT_AVERAGE_MONITORING; |
Clancy_SENDSOR | 2:5828e6917e75 | 479 | ulMLT_SumSpeedMes=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 480 | ulMLT_SumCurrentMes=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 481 | ulMLT_SumTemperatureMes=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 482 | ulMLT_SumBlowerVoltage=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 483 | #endif // #ifdef MOTOR_LIFE_TESTING |
Clancy_SENDSOR | 2:5828e6917e75 | 484 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 485 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 486 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 487 | enPreviousMode=enVentilationMode; |
Clancy_SENDSOR | 2:5828e6917e75 | 488 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 489 | |
Clancy_SENDSOR | 2:5828e6917e75 | 490 | |
Clancy_SENDSOR | 2:5828e6917e75 | 491 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 492 | * Function Name : StopAllActuators |
Clancy_SENDSOR | 2:5828e6917e75 | 493 | * Description : Stop all actuators |
Clancy_SENDSOR | 2:5828e6917e75 | 494 | * Input : None |
Clancy_SENDSOR | 2:5828e6917e75 | 495 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 496 | * Return : None |
Clancy_SENDSOR | 2:5828e6917e75 | 497 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 498 | void StopAllActuators(void) |
Clancy_SENDSOR | 2:5828e6917e75 | 499 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 500 | // Stop main blower |
Clancy_SENDSOR | 2:5828e6917e75 | 501 | SS_Xclose(mdrv); |
Clancy_SENDSOR | 2:5828e6917e75 | 502 | |
Clancy_SENDSOR | 2:5828e6917e75 | 503 | // Valve OFF |
Clancy_SENDSOR | 2:5828e6917e75 | 504 | SS_Xputdw(act, EV_CTL|FLAG_ACTIONER_OFF); |
Clancy_SENDSOR | 2:5828e6917e75 | 505 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 506 | |
Clancy_SENDSOR | 2:5828e6917e75 | 507 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 508 | * Function Name : CalculateHoseDrop |
Clancy_SENDSOR | 2:5828e6917e75 | 509 | * Description : Manage Ti, Te, DAC, Blower, PID |
Clancy_SENDSOR | 2:5828e6917e75 | 510 | * Input : None |
Clancy_SENDSOR | 2:5828e6917e75 | 511 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 512 | * Return : None |
Clancy_SENDSOR | 2:5828e6917e75 | 513 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 514 | u16 CalculateHoseDrop(void) |
Clancy_SENDSOR | 2:5828e6917e75 | 515 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 516 | u16 hoseDrop = (u16)(10*(iBlowerFlowSmoothingMes/100.0f/60.0f * 0.5f)); |
Clancy_SENDSOR | 2:5828e6917e75 | 517 | return hoseDrop; |
Clancy_SENDSOR | 2:5828e6917e75 | 518 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 519 | |
Clancy_SENDSOR | 2:5828e6917e75 | 520 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 521 | * Function Name : ManageCPAPVentilation |
Clancy_SENDSOR | 2:5828e6917e75 | 522 | * Description : Manage Ti, Te, DAC, Blower, PID |
Clancy_SENDSOR | 2:5828e6917e75 | 523 | * Input : None |
Clancy_SENDSOR | 2:5828e6917e75 | 524 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 525 | * Return : None |
Clancy_SENDSOR | 2:5828e6917e75 | 526 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 527 | void ManageCPAPVentilation(void) |
Clancy_SENDSOR | 2:5828e6917e75 | 528 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 529 | |
Clancy_SENDSOR | 2:5828e6917e75 | 530 | |
Clancy_SENDSOR | 2:5828e6917e75 | 531 | |
Clancy_SENDSOR | 2:5828e6917e75 | 532 | // *************************** UPDATE SETTINGS ******************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 533 | if (ApplyNewVentilationMode()==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 534 | return; |
Clancy_SENDSOR | 2:5828e6917e75 | 535 | |
Clancy_SENDSOR | 2:5828e6917e75 | 536 | // **************************** Cycle detection ****************************** |
Clancy_SENDSOR | 2:5828e6917e75 | 537 | // Test Synchronisation |
Clancy_SENDSOR | 2:5828e6917e75 | 538 | /*if (iBlowerFlowSmoothingMesForTrigger<(-500) && ucVentilationCycle==INSPIRATION_CYCLE) |
Clancy_SENDSOR | 2:5828e6917e75 | 539 | ucVentilationCycle=EXPIRATION_CYCLE; */ |
Clancy_SENDSOR | 2:5828e6917e75 | 540 | int32_t peakP = 2;//(int32_t)uiVentilationSet[PS_CPAP_SET]; |
Clancy_SENDSOR | 2:5828e6917e75 | 541 | // Cycle detection |
Clancy_SENDSOR | 2:5828e6917e75 | 542 | if (ucVentilationCycle==INSPIRATION_CYCLE) |
Clancy_SENDSOR | 2:5828e6917e75 | 543 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 544 | uiTiD++; |
Clancy_SENDSOR | 2:5828e6917e75 | 545 | if(uiTiD < (0.1f * uiTiTyp)) |
Clancy_SENDSOR | 2:5828e6917e75 | 546 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 547 | peakP =(int32_t)( uiVentilationSet[PS_CPAP_SET] * ((uiTiD* 1.0f)/(0.1f * uiTiTyp))); |
Clancy_SENDSOR | 2:5828e6917e75 | 548 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 549 | else if(uiTiD < (1.0f * uiTiTyp)) |
Clancy_SENDSOR | 2:5828e6917e75 | 550 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 551 | peakP = ((int32_t)uiVentilationSet[PS_CPAP_SET] - ((int32_t)(uiVentilationSet[PS_CPAP_SET] * (uiTiD * 1.0f)/(1.1f * uiTiTyp)))) + 20; |
Clancy_SENDSOR | 2:5828e6917e75 | 552 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 553 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 554 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 555 | peakP = 2; |
Clancy_SENDSOR | 2:5828e6917e75 | 556 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 557 | |
Clancy_SENDSOR | 2:5828e6917e75 | 558 | if (uiTiD>5000 || (uiTiD>TiBaroSet_P_MIN && TestTriggerExpiratoire(20, uiVentilationSet[PS_CPAP_SET])==TRUE)) |
Clancy_SENDSOR | 2:5828e6917e75 | 559 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 560 | ucVentilationCycle=EXPIRATION_CYCLE; |
Clancy_SENDSOR | 2:5828e6917e75 | 561 | uiPWMatTheEndOfInspiration = uiInspirationBlowerPWMTec; |
Clancy_SENDSOR | 2:5828e6917e75 | 562 | if(uiTiD < 2000) |
Clancy_SENDSOR | 2:5828e6917e75 | 563 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 564 | uiTiTyp = uiTiD; |
Clancy_SENDSOR | 2:5828e6917e75 | 565 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 566 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 567 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 568 | uiTiTyp = 2000; |
Clancy_SENDSOR | 2:5828e6917e75 | 569 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 570 | |
Clancy_SENDSOR | 2:5828e6917e75 | 571 | uiTeD=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 572 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 573 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 574 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 575 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 576 | uiTeD++; |
Clancy_SENDSOR | 2:5828e6917e75 | 577 | if (uiTeD>TE_SET_MAX) uiTeD=TE_SET_MAX; |
Clancy_SENDSOR | 2:5828e6917e75 | 578 | |
Clancy_SENDSOR | 2:5828e6917e75 | 579 | if (TestInspiratoryTrigger(TRUE, uiTeD, 15)==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 580 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 581 | ucVentilationCycle=INSPIRATION_CYCLE; |
Clancy_SENDSOR | 2:5828e6917e75 | 582 | uiTiD=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 583 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 584 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 585 | |
Clancy_SENDSOR | 2:5828e6917e75 | 586 | // Barometric Mode : error computation |
Clancy_SENDSOR | 2:5828e6917e75 | 587 | ControlPressure((int32_t)(peakP + CalculateHoseDrop())); |
Clancy_SENDSOR | 2:5828e6917e75 | 588 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 589 | |
Clancy_SENDSOR | 2:5828e6917e75 | 590 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 591 | * Function Name : ControlPressure |
Clancy_SENDSOR | 2:5828e6917e75 | 592 | * Description : Manage Ti, Te, DAC, Blower, PID |
Clancy_SENDSOR | 2:5828e6917e75 | 593 | * Input : None |
Clancy_SENDSOR | 2:5828e6917e75 | 594 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 595 | * Return : None |
Clancy_SENDSOR | 2:5828e6917e75 | 596 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 597 | int32_t previousError = 0; |
Clancy_SENDSOR | 2:5828e6917e75 | 598 | int32_t lIntegralSum = 0; |
Clancy_SENDSOR | 2:5828e6917e75 | 599 | void ControlPressure(int32_t setPressure)//pressure in cmH2O*10 |
Clancy_SENDSOR | 2:5828e6917e75 | 600 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 601 | int32_t lPropTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 602 | int32_t lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 603 | int32_t lDerivativeTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 604 | int32_t lOutputPressure; |
Clancy_SENDSOR | 2:5828e6917e75 | 605 | |
Clancy_SENDSOR | 2:5828e6917e75 | 606 | |
Clancy_SENDSOR | 2:5828e6917e75 | 607 | int32_t lError = setPressure - uiProximalPressureMes; |
Clancy_SENDSOR | 2:5828e6917e75 | 608 | |
Clancy_SENDSOR | 2:5828e6917e75 | 609 | lPropTerm = (int32_t)uiTechnicalDataSet[KP_CPAP_VENTED_PRESSURE_I] * lError; |
Clancy_SENDSOR | 2:5828e6917e75 | 610 | lIntegralTerm += (int32_t)(uiTechnicalDataSet[KI_CPAP_VENTED_PRESSURE_I] * lError); |
Clancy_SENDSOR | 2:5828e6917e75 | 611 | lDerivativeTerm = (int32_t)(uiTechnicalDataSet[KP_FLOW_I]*(lError - previousError/1000)); |
Clancy_SENDSOR | 2:5828e6917e75 | 612 | previousError = lError; |
Clancy_SENDSOR | 2:5828e6917e75 | 613 | |
Clancy_SENDSOR | 2:5828e6917e75 | 614 | // Close loop in pressure |
Clancy_SENDSOR | 2:5828e6917e75 | 615 | if ((lIntegralTerm + lIntegralSum) > INTEGRAL_MAX) |
Clancy_SENDSOR | 2:5828e6917e75 | 616 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 617 | lIntegralSum = INTEGRAL_MAX; |
Clancy_SENDSOR | 2:5828e6917e75 | 618 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 619 | else if ((lIntegralTerm - lIntegralSum)< INTEGRAL_MIN) |
Clancy_SENDSOR | 2:5828e6917e75 | 620 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 621 | lIntegralSum = INTEGRAL_MIN; |
Clancy_SENDSOR | 2:5828e6917e75 | 622 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 623 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 624 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 625 | lIntegralSum += lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 626 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 627 | |
Clancy_SENDSOR | 2:5828e6917e75 | 628 | lOutputPressure = (lDerivativeTerm>>19) + (lIntegralSum>>16) + (lPropTerm>>13) ; |
Clancy_SENDSOR | 2:5828e6917e75 | 629 | |
Clancy_SENDSOR | 2:5828e6917e75 | 630 | lOutputPressure+=uiPWMatTheEndOfInspiration; |
Clancy_SENDSOR | 2:5828e6917e75 | 631 | |
Clancy_SENDSOR | 2:5828e6917e75 | 632 | |
Clancy_SENDSOR | 2:5828e6917e75 | 633 | // Limit and Update blower PWM |
Clancy_SENDSOR | 2:5828e6917e75 | 634 | if (lOutputPressure>=((int32_t)MAX_VOLTAGE_REF)) |
Clancy_SENDSOR | 2:5828e6917e75 | 635 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 636 | bMaxPIOutputPressureI = TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 637 | uiInspirationBlowerPWMTec=MAX_VOLTAGE_REF; |
Clancy_SENDSOR | 2:5828e6917e75 | 638 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 639 | else if (lOutputPressure<((int32_t)MIN_VOLTAGE_REF)) |
Clancy_SENDSOR | 2:5828e6917e75 | 640 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 641 | bMinPIOutputPressureI = TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 642 | uiInspirationBlowerPWMTec=MIN_VOLTAGE_REF; |
Clancy_SENDSOR | 2:5828e6917e75 | 643 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 644 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 645 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 646 | bMaxPIOutputPressureI = FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 647 | bMinPIOutputPressureI = FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 648 | uiInspirationBlowerPWMTec = lOutputPressure; |
Clancy_SENDSOR | 2:5828e6917e75 | 649 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 650 | |
Clancy_SENDSOR | 2:5828e6917e75 | 651 | SS_Xputdw(mdrv, uiInspirationBlowerPWMTec); |
Clancy_SENDSOR | 2:5828e6917e75 | 652 | |
Clancy_SENDSOR | 2:5828e6917e75 | 653 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 654 | |
Clancy_SENDSOR | 2:5828e6917e75 | 655 | |
Clancy_SENDSOR | 2:5828e6917e75 | 656 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 657 | * Function Name : DavidCControlPressure |
Clancy_SENDSOR | 2:5828e6917e75 | 658 | * Description : Manage Ti, Te, DAC, Blower, PID |
Clancy_SENDSOR | 2:5828e6917e75 | 659 | * Input : None |
Clancy_SENDSOR | 2:5828e6917e75 | 660 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 661 | * Return : None |
Clancy_SENDSOR | 2:5828e6917e75 | 662 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 663 | void DavidCControlPressure(int32_t setPressure)//pressure in cmH2O*10 |
Clancy_SENDSOR | 2:5828e6917e75 | 664 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 665 | int32_t lPropTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 666 | int32_t lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 667 | int32_t lOutputPressure; |
Clancy_SENDSOR | 2:5828e6917e75 | 668 | u16 uiFlowMaxInExpi; |
Clancy_SENDSOR | 2:5828e6917e75 | 669 | int32_t lError = setPressure - uiProximalPressureMes; |
Clancy_SENDSOR | 2:5828e6917e75 | 670 | |
Clancy_SENDSOR | 2:5828e6917e75 | 671 | lIntegralTerm = (int32_t)Ki_Pressure_I * lError; |
Clancy_SENDSOR | 2:5828e6917e75 | 672 | if (Ki_Pressure_I<uiTechnicalDataSet[KI_CPAP_VENTED_PRESSURE_I]) |
Clancy_SENDSOR | 2:5828e6917e75 | 673 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 674 | Ki_Pressure_I++; |
Clancy_SENDSOR | 2:5828e6917e75 | 675 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 676 | |
Clancy_SENDSOR | 2:5828e6917e75 | 677 | // Close loop in pressure |
Clancy_SENDSOR | 2:5828e6917e75 | 678 | if ((lIntegral_Pressure_I>=0) && (lIntegralTerm>=0) && (bMaxPIOutputPressureI==FALSE)) |
Clancy_SENDSOR | 2:5828e6917e75 | 679 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 680 | if ((lIntegral_Pressure_I + lIntegralTerm) <0) |
Clancy_SENDSOR | 2:5828e6917e75 | 681 | lIntegral_Pressure_I = INTEGRAL_MAX; |
Clancy_SENDSOR | 2:5828e6917e75 | 682 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 683 | lIntegral_Pressure_I += lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 684 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 685 | else if ((lIntegral_Pressure_I<=0) && (lIntegralTerm<=0) && (bMinPIOutputPressureI==FALSE)) |
Clancy_SENDSOR | 2:5828e6917e75 | 686 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 687 | if ((lIntegral_Pressure_I + lIntegralTerm)>0) |
Clancy_SENDSOR | 2:5828e6917e75 | 688 | lIntegral_Pressure_I = INTEGRAL_MIN; |
Clancy_SENDSOR | 2:5828e6917e75 | 689 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 690 | lIntegral_Pressure_I += lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 691 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 692 | else if ((lIntegral_Pressure_I<=0) && (lIntegralTerm>=0)) |
Clancy_SENDSOR | 2:5828e6917e75 | 693 | lIntegral_Pressure_I += lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 694 | else if ((lIntegral_Pressure_I>=0) && (lIntegralTerm<=0)) |
Clancy_SENDSOR | 2:5828e6917e75 | 695 | lIntegral_Pressure_I += lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 696 | |
Clancy_SENDSOR | 2:5828e6917e75 | 697 | lPropTerm = (int32_t)uiTechnicalDataSet[KP_CPAP_VENTED_PRESSURE_I] * lError; |
Clancy_SENDSOR | 2:5828e6917e75 | 698 | |
Clancy_SENDSOR | 2:5828e6917e75 | 699 | lOutputPressure = (lIntegral_Pressure_I>>16) + (lPropTerm>>13); |
Clancy_SENDSOR | 2:5828e6917e75 | 700 | |
Clancy_SENDSOR | 2:5828e6917e75 | 701 | lOutputPressure+=uiPWMatTheEndOfInspiration; |
Clancy_SENDSOR | 2:5828e6917e75 | 702 | |
Clancy_SENDSOR | 2:5828e6917e75 | 703 | // Flow limiting |
Clancy_SENDSOR | 2:5828e6917e75 | 704 | uiFlowMaxInExpi=uiMaximumFlowInExpiration[uiVentilationSet[PS_CPAP_SET]/10]; |
Clancy_SENDSOR | 2:5828e6917e75 | 705 | if (lError>5 && iBlowerFlowSmoothingMes>(int16_t)uiFlowMaxInExpi) |
Clancy_SENDSOR | 2:5828e6917e75 | 706 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 707 | // Impossible to maintain the peep (patient disconnection) |
Clancy_SENDSOR | 2:5828e6917e75 | 708 | if (uiDisconnectionTime==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 709 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 710 | if (fBlockCloseLoop==FALSE) |
Clancy_SENDSOR | 2:5828e6917e75 | 711 | uiDisconnectionTimeInCPAP=CPAP_DISCONNECTION_TEST_PERIODICITY; |
Clancy_SENDSOR | 2:5828e6917e75 | 712 | fBlockCloseLoop=TRUE; // Block the close loop |
Clancy_SENDSOR | 2:5828e6917e75 | 713 | if (uiMemoPWMDuringDisconnection!=0) // Apply a fixed PWM value |
Clancy_SENDSOR | 2:5828e6917e75 | 714 | uiInspirationBlowerPWMTec=uiMemoPWMDuringDisconnection; |
Clancy_SENDSOR | 2:5828e6917e75 | 715 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 716 | uiInspirationBlowerPWMTec=MIN_VOLTAGE_REF; |
Clancy_SENDSOR | 2:5828e6917e75 | 717 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 718 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 719 | uiDisconnectionTime--; |
Clancy_SENDSOR | 2:5828e6917e75 | 720 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 721 | else if (iBlowerFlowSmoothingMes<(int16_t)uiFlowMaxInExpi && (lError>(-2) && lError<2)) |
Clancy_SENDSOR | 2:5828e6917e75 | 722 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 723 | // Good pressure : no disconnection |
Clancy_SENDSOR | 2:5828e6917e75 | 724 | uiDisconnectionTime=EXPIRATORY_DISCONNECTION_TIME_OUT; |
Clancy_SENDSOR | 2:5828e6917e75 | 725 | |
Clancy_SENDSOR | 2:5828e6917e75 | 726 | if (fBlockCloseLoop==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 727 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 728 | // The close loop was block before => unblock it |
Clancy_SENDSOR | 2:5828e6917e75 | 729 | fBlockCloseLoop=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 730 | lIntegral_Pressure_I=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 731 | bMaxPIOutputPressureI = FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 732 | bMinPIOutputPressureI = FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 733 | uiPWMatTheEndOfInspiration=uiInspirationBlowerPWMTec; |
Clancy_SENDSOR | 2:5828e6917e75 | 734 | return; |
Clancy_SENDSOR | 2:5828e6917e75 | 735 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 736 | else if (iBlowerFlowSmoothingMes>=0) |
Clancy_SENDSOR | 2:5828e6917e75 | 737 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 738 | // Record current PWM |
Clancy_SENDSOR | 2:5828e6917e75 | 739 | uiMemoPWMDuringDisconnection=uiInspirationBlowerPWMTec; |
Clancy_SENDSOR | 2:5828e6917e75 | 740 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 741 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 742 | |
Clancy_SENDSOR | 2:5828e6917e75 | 743 | // Unblock the close loop every 4s in case of none recorded PWM value |
Clancy_SENDSOR | 2:5828e6917e75 | 744 | if (fBlockCloseLoop==TRUE && uiMemoPWMDuringDisconnection==0 && uiDisconnectionTimeInCPAP==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 745 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 746 | uiDisconnectionTime=EXPIRATORY_DISCONNECTION_TIME_OUT; |
Clancy_SENDSOR | 2:5828e6917e75 | 747 | fBlockCloseLoop=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 748 | lIntegral_Pressure_I=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 749 | bMaxPIOutputPressureI = FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 750 | bMinPIOutputPressureI = FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 751 | uiPWMatTheEndOfInspiration=uiInspirationBlowerPWMTec; |
Clancy_SENDSOR | 2:5828e6917e75 | 752 | return; |
Clancy_SENDSOR | 2:5828e6917e75 | 753 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 754 | |
Clancy_SENDSOR | 2:5828e6917e75 | 755 | // Update Time counters |
Clancy_SENDSOR | 2:5828e6917e75 | 756 | if (uiDisconnectionTimeInCPAP!=0) |
Clancy_SENDSOR | 2:5828e6917e75 | 757 | uiDisconnectionTimeInCPAP--; |
Clancy_SENDSOR | 2:5828e6917e75 | 758 | |
Clancy_SENDSOR | 2:5828e6917e75 | 759 | // Update blower PWM |
Clancy_SENDSOR | 2:5828e6917e75 | 760 | if (fBlockCloseLoop==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 761 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 762 | bMaxPIOutputPressureI = TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 763 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 764 | else if (lOutputPressure>=((int32_t)MAX_VOLTAGE_REF)) |
Clancy_SENDSOR | 2:5828e6917e75 | 765 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 766 | bMaxPIOutputPressureI = TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 767 | uiInspirationBlowerPWMTec=MAX_VOLTAGE_REF; |
Clancy_SENDSOR | 2:5828e6917e75 | 768 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 769 | else if (lOutputPressure<((int32_t)MIN_VOLTAGE_REF)) |
Clancy_SENDSOR | 2:5828e6917e75 | 770 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 771 | bMinPIOutputPressureI = TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 772 | uiInspirationBlowerPWMTec=MIN_VOLTAGE_REF; |
Clancy_SENDSOR | 2:5828e6917e75 | 773 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 774 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 775 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 776 | bMaxPIOutputPressureI = FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 777 | bMinPIOutputPressureI = FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 778 | uiInspirationBlowerPWMTec = lOutputPressure; |
Clancy_SENDSOR | 2:5828e6917e75 | 779 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 780 | |
Clancy_SENDSOR | 2:5828e6917e75 | 781 | SS_Xputdw(mdrv, uiInspirationBlowerPWMTec); |
Clancy_SENDSOR | 2:5828e6917e75 | 782 | |
Clancy_SENDSOR | 2:5828e6917e75 | 783 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 784 | |
Clancy_SENDSOR | 2:5828e6917e75 | 785 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 786 | * Function Name : ManageOneCstPWM |
Clancy_SENDSOR | 2:5828e6917e75 | 787 | * Description : Manage Ti, Te, DAC, Blower, PID |
Clancy_SENDSOR | 2:5828e6917e75 | 788 | * Input : None |
Clancy_SENDSOR | 2:5828e6917e75 | 789 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 790 | * Return : None |
Clancy_SENDSOR | 2:5828e6917e75 | 791 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 792 | void ManageOneCstPWM(void) |
Clancy_SENDSOR | 2:5828e6917e75 | 793 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 794 | // *************************** UPDATE SETTINGS ******************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 795 | if (ApplyNewVentilationMode()==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 796 | return; |
Clancy_SENDSOR | 2:5828e6917e75 | 797 | |
Clancy_SENDSOR | 2:5828e6917e75 | 798 | // Update Blower Speed |
Clancy_SENDSOR | 2:5828e6917e75 | 799 | SS_Xputdw(mdrv, uiInspirationBlowerPWMTec); |
Clancy_SENDSOR | 2:5828e6917e75 | 800 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 801 | |
Clancy_SENDSOR | 2:5828e6917e75 | 802 | |
Clancy_SENDSOR | 2:5828e6917e75 | 803 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 804 | * Function Name : Manage2CstPWM |
Clancy_SENDSOR | 2:5828e6917e75 | 805 | * Description : Manage Ti, Te, DAC, Blower, PID |
Clancy_SENDSOR | 2:5828e6917e75 | 806 | * Input : None |
Clancy_SENDSOR | 2:5828e6917e75 | 807 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 808 | * Return : None |
Clancy_SENDSOR | 2:5828e6917e75 | 809 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 810 | void Manage2CstPWM(void) |
Clancy_SENDSOR | 2:5828e6917e75 | 811 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 812 | if (ucVentilationCycle==INSPIRATION_CYCLE) |
Clancy_SENDSOR | 2:5828e6917e75 | 813 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 814 | // ------------- INSPIRATION ------------ |
Clancy_SENDSOR | 2:5828e6917e75 | 815 | SS_Xputdw(mdrv, uiInspirationBlowerPWMTec); |
Clancy_SENDSOR | 2:5828e6917e75 | 816 | |
Clancy_SENDSOR | 2:5828e6917e75 | 817 | // Inspiratoy time |
Clancy_SENDSOR | 2:5828e6917e75 | 818 | uiTiD++; |
Clancy_SENDSOR | 2:5828e6917e75 | 819 | if (uiTiD>=uiVentilationSet[TI_BARO_SET]) |
Clancy_SENDSOR | 2:5828e6917e75 | 820 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 821 | ucVentilationCycle=EXPIRATION_CYCLE; |
Clancy_SENDSOR | 2:5828e6917e75 | 822 | uiTiD=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 823 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 824 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 825 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 826 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 827 | // ------------- EXPIRATION ------------ |
Clancy_SENDSOR | 2:5828e6917e75 | 828 | // *************************** UPDATE SETTINGS ******************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 829 | if (ApplyNewVentilationMode()==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 830 | return; |
Clancy_SENDSOR | 2:5828e6917e75 | 831 | |
Clancy_SENDSOR | 2:5828e6917e75 | 832 | SS_Xputdw(mdrv, uiExpirationBlowerPWMTec); |
Clancy_SENDSOR | 2:5828e6917e75 | 833 | |
Clancy_SENDSOR | 2:5828e6917e75 | 834 | // Expiratoy time |
Clancy_SENDSOR | 2:5828e6917e75 | 835 | uiTeD++; |
Clancy_SENDSOR | 2:5828e6917e75 | 836 | if (uiTeD>=uiTeBaroSet) |
Clancy_SENDSOR | 2:5828e6917e75 | 837 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 838 | ucVentilationCycle=INSPIRATION_CYCLE; |
Clancy_SENDSOR | 2:5828e6917e75 | 839 | uiTeD=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 840 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 841 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 842 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 843 | |
Clancy_SENDSOR | 2:5828e6917e75 | 844 | |
Clancy_SENDSOR | 2:5828e6917e75 | 845 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 846 | * Function Name : ManageCstSpeed |
Clancy_SENDSOR | 2:5828e6917e75 | 847 | * Description : Manage constant speed ventilation |
Clancy_SENDSOR | 2:5828e6917e75 | 848 | * Input : None |
Clancy_SENDSOR | 2:5828e6917e75 | 849 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 850 | * Return : None |
Clancy_SENDSOR | 2:5828e6917e75 | 851 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 852 | void ManageCstSpeed(void) |
Clancy_SENDSOR | 2:5828e6917e75 | 853 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 854 | int32_t lError; |
Clancy_SENDSOR | 2:5828e6917e75 | 855 | int32_t lPropTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 856 | int32_t lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 857 | int32_t lOutputSpeed; |
Clancy_SENDSOR | 2:5828e6917e75 | 858 | |
Clancy_SENDSOR | 2:5828e6917e75 | 859 | // *************************** UPDATE SETTINGS ******************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 860 | if (ApplyNewVentilationMode()==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 861 | return; |
Clancy_SENDSOR | 2:5828e6917e75 | 862 | |
Clancy_SENDSOR | 2:5828e6917e75 | 863 | // Update settings |
Clancy_SENDSOR | 2:5828e6917e75 | 864 | if (uiBlowerSpeedSetting<uiBlowerSpeedSet) |
Clancy_SENDSOR | 2:5828e6917e75 | 865 | uiBlowerSpeedSetting+=10; |
Clancy_SENDSOR | 2:5828e6917e75 | 866 | else if (uiBlowerSpeedSetting>uiBlowerSpeedSet) |
Clancy_SENDSOR | 2:5828e6917e75 | 867 | uiBlowerSpeedSetting-=10; |
Clancy_SENDSOR | 2:5828e6917e75 | 868 | |
Clancy_SENDSOR | 2:5828e6917e75 | 869 | uiTiD++; |
Clancy_SENDSOR | 2:5828e6917e75 | 870 | if ((uiTiD%10)==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 871 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 872 | // Barometric Mode : error computation |
Clancy_SENDSOR | 2:5828e6917e75 | 873 | lError=(int32_t)uiBlowerSpeedSetting-(int32_t)uiBlowerSpeedMes; |
Clancy_SENDSOR | 2:5828e6917e75 | 874 | lIntegralTerm = (int32_t)uiTechnicalDataSet[KI_SPEED_I_TEC] * lError; |
Clancy_SENDSOR | 2:5828e6917e75 | 875 | |
Clancy_SENDSOR | 2:5828e6917e75 | 876 | // Close loop in pressure |
Clancy_SENDSOR | 2:5828e6917e75 | 877 | if ((lIntegral_Speed_I>=0) && (lIntegralTerm>=0) && (bMaxPIOutputSpeedI==FALSE)) |
Clancy_SENDSOR | 2:5828e6917e75 | 878 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 879 | if ((lIntegral_Speed_I + lIntegralTerm) <0) |
Clancy_SENDSOR | 2:5828e6917e75 | 880 | lIntegral_Speed_I = INTEGRAL_MAX; |
Clancy_SENDSOR | 2:5828e6917e75 | 881 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 882 | lIntegral_Speed_I += lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 883 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 884 | else if ((lIntegral_Speed_I<=0) && (lIntegralTerm<=0) && (bMinPIOutputSpeedI==FALSE)) |
Clancy_SENDSOR | 2:5828e6917e75 | 885 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 886 | if ((lIntegral_Speed_I + lIntegralTerm)>0) |
Clancy_SENDSOR | 2:5828e6917e75 | 887 | lIntegral_Speed_I = INTEGRAL_MIN; |
Clancy_SENDSOR | 2:5828e6917e75 | 888 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 889 | lIntegral_Speed_I += lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 890 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 891 | else if ((lIntegral_Speed_I<=0) && (lIntegralTerm>=0)) |
Clancy_SENDSOR | 2:5828e6917e75 | 892 | lIntegral_Speed_I += lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 893 | else if ((lIntegral_Speed_I>=0) && (lIntegralTerm<=0)) |
Clancy_SENDSOR | 2:5828e6917e75 | 894 | lIntegral_Speed_I += lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 895 | |
Clancy_SENDSOR | 2:5828e6917e75 | 896 | lPropTerm = (int32_t)uiTechnicalDataSet[KP_SPEED_I_TEC] * lError; |
Clancy_SENDSOR | 2:5828e6917e75 | 897 | lOutputSpeed = (lIntegral_Speed_I>>16) + (lPropTerm>>13); |
Clancy_SENDSOR | 2:5828e6917e75 | 898 | |
Clancy_SENDSOR | 2:5828e6917e75 | 899 | if (lOutputSpeed>=((int32_t)MAX_VOLTAGE_REF)) |
Clancy_SENDSOR | 2:5828e6917e75 | 900 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 901 | bMaxPIOutputSpeedI = TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 902 | uiInspirationBlowerPWMTec=MAX_VOLTAGE_REF; |
Clancy_SENDSOR | 2:5828e6917e75 | 903 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 904 | else if (lOutputSpeed<((int32_t)MIN_VOLTAGE_REF)) |
Clancy_SENDSOR | 2:5828e6917e75 | 905 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 906 | bMinPIOutputSpeedI = TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 907 | uiInspirationBlowerPWMTec=MIN_VOLTAGE_REF; |
Clancy_SENDSOR | 2:5828e6917e75 | 908 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 909 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 910 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 911 | bMaxPIOutputSpeedI = FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 912 | bMinPIOutputSpeedI = FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 913 | uiInspirationBlowerPWMTec = lOutputSpeed; |
Clancy_SENDSOR | 2:5828e6917e75 | 914 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 915 | SS_Xputdw(mdrv, uiInspirationBlowerPWMTec); |
Clancy_SENDSOR | 2:5828e6917e75 | 916 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 917 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 918 | |
Clancy_SENDSOR | 2:5828e6917e75 | 919 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 920 | * Function Name : ManageFlowCalibration |
Clancy_SENDSOR | 2:5828e6917e75 | 921 | * Description : Manage Low flow calibration |
Clancy_SENDSOR | 2:5828e6917e75 | 922 | * Input : None |
Clancy_SENDSOR | 2:5828e6917e75 | 923 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 924 | * Return : None |
Clancy_SENDSOR | 2:5828e6917e75 | 925 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 926 | void ManageFlowCalibration(void) |
Clancy_SENDSOR | 2:5828e6917e75 | 927 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 928 | char cCharValue; |
Clancy_SENDSOR | 2:5828e6917e75 | 929 | char szTempBuf[SIZE_RX_BUFFER_PF300]; |
Clancy_SENDSOR | 2:5828e6917e75 | 930 | |
Clancy_SENDSOR | 2:5828e6917e75 | 931 | /* |
Clancy_SENDSOR | 2:5828e6917e75 | 932 | #ifdef USE_TSI_4040 |
Clancy_SENDSOR | 2:5828e6917e75 | 933 | switch(enTSICommScheduler) |
Clancy_SENDSOR | 2:5828e6917e75 | 934 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 935 | default: |
Clancy_SENDSOR | 2:5828e6917e75 | 936 | case TSI_SET_TYPE_OF_GAS: |
Clancy_SENDSOR | 2:5828e6917e75 | 937 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 938 | // Send Type of Gas command |
Clancy_SENDSOR | 2:5828e6917e75 | 939 | ucTSICommand=TSI_SEND_GAS_TYPE_AIR_CMD; |
Clancy_SENDSOR | 2:5828e6917e75 | 940 | if (SS_Xputdw(tsi, &ucTSICommand)==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 941 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 942 | enTSICommScheduler=TSI_CHECK_ANSWER; |
Clancy_SENDSOR | 2:5828e6917e75 | 943 | enTSIGoBackToStep=TSI_SET_FLOW_UNIT; |
Clancy_SENDSOR | 2:5828e6917e75 | 944 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 945 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 946 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 947 | case TSI_SET_FLOW_UNIT: |
Clancy_SENDSOR | 2:5828e6917e75 | 948 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 949 | // Send Type of Gas command |
Clancy_SENDSOR | 2:5828e6917e75 | 950 | ucTSICommand=TSI_SEND_FLOW_UNIT_STANDARD_CMD; |
Clancy_SENDSOR | 2:5828e6917e75 | 951 | if (SS_Xputdw(tsi, &ucTSICommand)==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 952 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 953 | enTSICommScheduler=TSI_CHECK_ANSWER; |
Clancy_SENDSOR | 2:5828e6917e75 | 954 | enTSIGoBackToStep=TSI_SET_SAMPLE_TIME; |
Clancy_SENDSOR | 2:5828e6917e75 | 955 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 956 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 957 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 958 | case TSI_SET_SAMPLE_TIME: |
Clancy_SENDSOR | 2:5828e6917e75 | 959 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 960 | // Send sample time |
Clancy_SENDSOR | 2:5828e6917e75 | 961 | ucTSICommand=TSI_SEND_SAMPLE_TIME_10MS_CMD; |
Clancy_SENDSOR | 2:5828e6917e75 | 962 | if (SS_Xputdw(tsi, &ucTSICommand)==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 963 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 964 | enTSICommScheduler=TSI_CHECK_ANSWER; |
Clancy_SENDSOR | 2:5828e6917e75 | 965 | enTSIGoBackToStep=TSI_READ_FLOW; |
Clancy_SENDSOR | 2:5828e6917e75 | 966 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 967 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 968 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 969 | case TSI_READ_FLOW: |
Clancy_SENDSOR | 2:5828e6917e75 | 970 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 971 | // Send sample time |
Clancy_SENDSOR | 2:5828e6917e75 | 972 | ucTSICommand=TSI_SEND_READ_FLOW_CMD; |
Clancy_SENDSOR | 2:5828e6917e75 | 973 | if (SS_Xputdw(tsi, &ucTSICommand)==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 974 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 975 | enTSICommScheduler=TSI_CHECK_ANSWER; |
Clancy_SENDSOR | 2:5828e6917e75 | 976 | enTSIGoBackToStep=TSI_CYCLE_DETECTION; |
Clancy_SENDSOR | 2:5828e6917e75 | 977 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 978 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 979 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 980 | case TSI_CYCLE_DETECTION: |
Clancy_SENDSOR | 2:5828e6917e75 | 981 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 982 | uiBlowerFlow=iFlowFromTSI; |
Clancy_SENDSOR | 2:5828e6917e75 | 983 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 984 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 985 | case TSI_CHECK_ANSWER: |
Clancy_SENDSOR | 2:5828e6917e75 | 986 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 987 | opstatus=SS_Xgetw(tsi, &uiDummy); |
Clancy_SENDSOR | 2:5828e6917e75 | 988 | if (opstatus==OPSTATUS_OK) |
Clancy_SENDSOR | 2:5828e6917e75 | 989 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 990 | enTSICommScheduler=enTSIGoBackToStep; |
Clancy_SENDSOR | 2:5828e6917e75 | 991 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 992 | else if (opstatus==OPSTATUS_FAIL) |
Clancy_SENDSOR | 2:5828e6917e75 | 993 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 994 | enTSICommScheduler=TSI_SET_TYPE_OF_GAS; |
Clancy_SENDSOR | 2:5828e6917e75 | 995 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 996 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 997 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 998 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 999 | #endif // #ifdef USE_TSI_4040 |
Clancy_SENDSOR | 2:5828e6917e75 | 1000 | */ |
Clancy_SENDSOR | 2:5828e6917e75 | 1001 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1002 | switch(enLowFlowCalibrationStep) |
Clancy_SENDSOR | 2:5828e6917e75 | 1003 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1004 | case INIT_FLOW_CALIB_TEST: |
Clancy_SENDSOR | 2:5828e6917e75 | 1005 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1006 | // Init comm with PF300 => wait 2s before sending first command to PF300 |
Clancy_SENDSOR | 2:5828e6917e75 | 1007 | // We need to wait for this delay in order to the handset to activate its transparent mode |
Clancy_SENDSOR | 2:5828e6917e75 | 1008 | if (uiCalibrationTimeOut==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1009 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1010 | bDisableMaroubraCommCommunication=TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 1011 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1012 | // Prepare command to PF300 |
Clancy_SENDSOR | 2:5828e6917e75 | 1013 | UpdateBufferToSend((char*)szPF300_CmdSwitchOffEcho); |
Clancy_SENDSOR | 2:5828e6917e75 | 1014 | enLowFlowCalibrationStep=SEND_COMMAND_TO_PF300; |
Clancy_SENDSOR | 2:5828e6917e75 | 1015 | strcpy(szExpectedAnswerFromPF300, szPF300_AnswerSwitchOffEcho); |
Clancy_SENDSOR | 2:5828e6917e75 | 1016 | ucNumberOfBytesToCheckFromPF300Answer=strlen(szPF300_AnswerSwitchOffEcho); |
Clancy_SENDSOR | 2:5828e6917e75 | 1017 | enGoBackToStep=SET_GAS_TYPE; |
Clancy_SENDSOR | 2:5828e6917e75 | 1018 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1019 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1020 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1021 | uiCalibrationTimeOut--; |
Clancy_SENDSOR | 2:5828e6917e75 | 1022 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1023 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1024 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1025 | case SET_GAS_TYPE: |
Clancy_SENDSOR | 2:5828e6917e75 | 1026 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1027 | // Prepare command to PF300 |
Clancy_SENDSOR | 2:5828e6917e75 | 1028 | UpdateBufferToSend((char*)szPF300_SetAirGasType); |
Clancy_SENDSOR | 2:5828e6917e75 | 1029 | enLowFlowCalibrationStep=SEND_COMMAND_TO_PF300; |
Clancy_SENDSOR | 2:5828e6917e75 | 1030 | strcpy(szExpectedAnswerFromPF300, szPF300_AnswerAirGasType); |
Clancy_SENDSOR | 2:5828e6917e75 | 1031 | ucNumberOfBytesToCheckFromPF300Answer=strlen(szPF300_AnswerAirGasType); |
Clancy_SENDSOR | 2:5828e6917e75 | 1032 | enGoBackToStep=SET_GAS_STANDARD; |
Clancy_SENDSOR | 2:5828e6917e75 | 1033 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1034 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1035 | case SET_GAS_STANDARD: |
Clancy_SENDSOR | 2:5828e6917e75 | 1036 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1037 | // Prepare command to PF300 |
Clancy_SENDSOR | 2:5828e6917e75 | 1038 | UpdateBufferToSend((char*)szPF300_SetGasStandard); |
Clancy_SENDSOR | 2:5828e6917e75 | 1039 | enLowFlowCalibrationStep=SEND_COMMAND_TO_PF300; |
Clancy_SENDSOR | 2:5828e6917e75 | 1040 | strcpy(szExpectedAnswerFromPF300, szPF300_AnswerGasStandard); |
Clancy_SENDSOR | 2:5828e6917e75 | 1041 | ucNumberOfBytesToCheckFromPF300Answer=strlen(szPF300_AnswerGasStandard); |
Clancy_SENDSOR | 2:5828e6917e75 | 1042 | enGoBackToStep=START_FLOW_READING; |
Clancy_SENDSOR | 2:5828e6917e75 | 1043 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1044 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1045 | case START_FLOW_READING: |
Clancy_SENDSOR | 2:5828e6917e75 | 1046 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1047 | // Set Min blower speed |
Clancy_SENDSOR | 2:5828e6917e75 | 1048 | uiMotorDutyCyleForFlowCalib=MIN_PI_OUTPUT; |
Clancy_SENDSOR | 2:5828e6917e75 | 1049 | SS_Xputdw(mdrv, uiMotorDutyCyleForFlowCalib); |
Clancy_SENDSOR | 2:5828e6917e75 | 1050 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1051 | // Init variable for flow sensor |
Clancy_SENDSOR | 2:5828e6917e75 | 1052 | uiCalibrationTimeOut=SAMPLE_RATE_BETWEEN_TWO_FLOW; |
Clancy_SENDSOR | 2:5828e6917e75 | 1053 | ulSumFlowTicks=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1054 | uiFlowTicksSamplesCounter=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1055 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1056 | // Next step |
Clancy_SENDSOR | 2:5828e6917e75 | 1057 | enLowFlowCalibrationStep=SEND_FLOW_COMMAND; |
Clancy_SENDSOR | 2:5828e6917e75 | 1058 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1059 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1060 | case SEND_FLOW_COMMAND: |
Clancy_SENDSOR | 2:5828e6917e75 | 1061 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1062 | if (uiCalibrationTimeOut!=0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1063 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1064 | uiCalibrationTimeOut--; |
Clancy_SENDSOR | 2:5828e6917e75 | 1065 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1066 | if (uiCalibrationTimeOut<(SAMPLE_RATE_BETWEEN_TWO_FLOW>>1)) |
Clancy_SENDSOR | 2:5828e6917e75 | 1067 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1068 | ulSumFlowTicks+=uiBlowerFlowRAWMes; |
Clancy_SENDSOR | 2:5828e6917e75 | 1069 | uiFlowTicksSamplesCounter++; |
Clancy_SENDSOR | 2:5828e6917e75 | 1070 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1071 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1072 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1073 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1074 | // Prepare next command (Read Low Flow) |
Clancy_SENDSOR | 2:5828e6917e75 | 1075 | enLowFlowCalibrationStep=SEND_COMMAND_TO_PF300; |
Clancy_SENDSOR | 2:5828e6917e75 | 1076 | if (bHighFlowCalibrationInProgress==FALSE) |
Clancy_SENDSOR | 2:5828e6917e75 | 1077 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1078 | UpdateBufferToSend((char*)szPF300_ReadLowFlowCmd); // %RM#1\r |
Clancy_SENDSOR | 2:5828e6917e75 | 1079 | strcpy(szExpectedAnswerFromPF300, szPF300_ReadLowFlowAnswer); // %RM#1$ |
Clancy_SENDSOR | 2:5828e6917e75 | 1080 | ucNumberOfBytesToCheckFromPF300Answer=strlen(szPF300_ReadLowFlowAnswer); |
Clancy_SENDSOR | 2:5828e6917e75 | 1081 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1082 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1083 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1084 | UpdateBufferToSend((char*)szPF300_ReadHighFlowCmd); // %RM#0\r |
Clancy_SENDSOR | 2:5828e6917e75 | 1085 | strcpy(szExpectedAnswerFromPF300, szPF300_ReadHighFlowAnswer); // %RM#0$ |
Clancy_SENDSOR | 2:5828e6917e75 | 1086 | ucNumberOfBytesToCheckFromPF300Answer=strlen(szPF300_ReadHighFlowAnswer); |
Clancy_SENDSOR | 2:5828e6917e75 | 1087 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1088 | enGoBackToStep=READ_FLOW_VALUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 1089 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1090 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1091 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1092 | case READ_FLOW_VALUE: |
Clancy_SENDSOR | 2:5828e6917e75 | 1093 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1094 | if (uiFlowTicksSamplesCounter!=0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1095 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1096 | // Read PF300 flow (l/min) |
Clancy_SENDSOR | 2:5828e6917e75 | 1097 | strcpy(szTempBuf, &szAnswerFromPF300[ucNumberOfBytesToCheckFromPF300Answer]); |
Clancy_SENDSOR | 2:5828e6917e75 | 1098 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1099 | // Store value of flow |
Clancy_SENDSOR | 2:5828e6917e75 | 1100 | if (stTemporayLUTFlowSensor.uiLUT_TableSize<LOW_FLOW_CALIB_NUMBER_OF_SAMPLES) |
Clancy_SENDSOR | 2:5828e6917e75 | 1101 | stTemporayLUTFlowSensor.uiFlowValue[stTemporayLUTFlowSensor.uiLUT_TableSize]=(unsigned int)atoi(szTempBuf); |
Clancy_SENDSOR | 2:5828e6917e75 | 1102 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1103 | stTemporayLUTFlowSensor.uiFlowValue[stTemporayLUTFlowSensor.uiLUT_TableSize]=(unsigned int)atoi(szTempBuf)*10; |
Clancy_SENDSOR | 2:5828e6917e75 | 1104 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1105 | // Store ticks value |
Clancy_SENDSOR | 2:5828e6917e75 | 1106 | stTemporayLUTFlowSensor.uiFlowSensorTicks[stTemporayLUTFlowSensor.uiLUT_TableSize]=ulSumFlowTicks/uiFlowTicksSamplesCounter; |
Clancy_SENDSOR | 2:5828e6917e75 | 1107 | uiCalibrationTimeOut=SAMPLE_RATE_BETWEEN_TWO_FLOW; |
Clancy_SENDSOR | 2:5828e6917e75 | 1108 | ulSumFlowTicks=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1109 | uiFlowTicksSamplesCounter=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1110 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1111 | // Check if current flow <0.1l/min |
Clancy_SENDSOR | 2:5828e6917e75 | 1112 | if (stTemporayLUTFlowSensor.uiFlowValue[stTemporayLUTFlowSensor.uiLUT_TableSize]<10) |
Clancy_SENDSOR | 2:5828e6917e75 | 1113 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1114 | enLowFlowCalibrationStep=PREPARE_FAILURE_COMMAND; |
Clancy_SENDSOR | 2:5828e6917e75 | 1115 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1116 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1117 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1118 | // Check if the last low flow is higher than 20l/min or lower than 2l/min |
Clancy_SENDSOR | 2:5828e6917e75 | 1119 | if (stTemporayLUTFlowSensor.uiLUT_TableSize==(LOW_FLOW_CALIB_NUMBER_OF_SAMPLES-1)) |
Clancy_SENDSOR | 2:5828e6917e75 | 1120 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1121 | // Check if the last low flow is higher than 20l/min or lower than 2l/min |
Clancy_SENDSOR | 2:5828e6917e75 | 1122 | if (stTemporayLUTFlowSensor.uiFlowValue[stTemporayLUTFlowSensor.uiLUT_TableSize]>2000 || stTemporayLUTFlowSensor.uiFlowValue[stTemporayLUTFlowSensor.uiLUT_TableSize]<200) |
Clancy_SENDSOR | 2:5828e6917e75 | 1123 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1124 | enLowFlowCalibrationStep=PREPARE_FAILURE_COMMAND; |
Clancy_SENDSOR | 2:5828e6917e75 | 1125 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1126 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1127 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1128 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1129 | // Next flow sample |
Clancy_SENDSOR | 2:5828e6917e75 | 1130 | if (stTemporayLUTFlowSensor.uiLUT_TableSize==LOW_FLOW_CALIB_NUMBER_OF_SAMPLES && stTemporayLUTFlowSensor.uiFlowValue[LOW_FLOW_CALIB_NUMBER_OF_SAMPLES]<(stTemporayLUTFlowSensor.uiFlowValue[LOW_FLOW_CALIB_NUMBER_OF_SAMPLES-1]+500)) |
Clancy_SENDSOR | 2:5828e6917e75 | 1131 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1132 | // No enough flow margin between the last value of the low flow and the first value of the high flow |
Clancy_SENDSOR | 2:5828e6917e75 | 1133 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1134 | else if (stTemporayLUTFlowSensor.uiLUT_TableSize!=0 && stTemporayLUTFlowSensor.uiFlowValue[stTemporayLUTFlowSensor.uiLUT_TableSize]<(stTemporayLUTFlowSensor.uiFlowValue[stTemporayLUTFlowSensor.uiLUT_TableSize-1]+50)) |
Clancy_SENDSOR | 2:5828e6917e75 | 1135 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1136 | // No enough margin between two consecutives flow |
Clancy_SENDSOR | 2:5828e6917e75 | 1137 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1138 | else if (stTemporayLUTFlowSensor.uiLUT_TableSize!=0 && stTemporayLUTFlowSensor.uiFlowSensorTicks[stTemporayLUTFlowSensor.uiLUT_TableSize]<=stTemporayLUTFlowSensor.uiFlowSensorTicks[stTemporayLUTFlowSensor.uiLUT_TableSize-1]) |
Clancy_SENDSOR | 2:5828e6917e75 | 1139 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1140 | // Same or less ticks between two consecutives flow |
Clancy_SENDSOR | 2:5828e6917e75 | 1141 | enLowFlowCalibrationStep=PREPARE_FAILURE_COMMAND; |
Clancy_SENDSOR | 2:5828e6917e75 | 1142 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1143 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1144 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1145 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1146 | stTemporayLUTFlowSensor.uiLUT_TableSize++; |
Clancy_SENDSOR | 2:5828e6917e75 | 1147 | if (stTemporayLUTFlowSensor.uiFlowValue[stTemporayLUTFlowSensor.uiLUT_TableSize-1]>=14000) |
Clancy_SENDSOR | 2:5828e6917e75 | 1148 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1149 | // End of calib => check the number of samples |
Clancy_SENDSOR | 2:5828e6917e75 | 1150 | if (stTemporayLUTFlowSensor.uiLUT_TableSize>(FLOW_CALIB_NUMBER_OF_SAMPLES>>1)) |
Clancy_SENDSOR | 2:5828e6917e75 | 1151 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1152 | enLowFlowCalibrationStep=PREPARE_SUCCESS_COMMAND; |
Clancy_SENDSOR | 2:5828e6917e75 | 1153 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1154 | // Transfer the temporary LUT in the definitive LUT |
Clancy_SENDSOR | 2:5828e6917e75 | 1155 | stLUTFlowSensor=stTemporayLUTFlowSensor; |
Clancy_SENDSOR | 2:5828e6917e75 | 1156 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1157 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1158 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1159 | enLowFlowCalibrationStep=PREPARE_FAILURE_COMMAND; |
Clancy_SENDSOR | 2:5828e6917e75 | 1160 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1161 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1162 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1163 | else if (stTemporayLUTFlowSensor.uiLUT_TableSize>FLOW_CALIB_NUMBER_OF_SAMPLES) |
Clancy_SENDSOR | 2:5828e6917e75 | 1164 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1165 | enLowFlowCalibrationStep=PREPARE_FAILURE_COMMAND; |
Clancy_SENDSOR | 2:5828e6917e75 | 1166 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1167 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1168 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1169 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1170 | // Prepare next flow reading |
Clancy_SENDSOR | 2:5828e6917e75 | 1171 | if (stTemporayLUTFlowSensor.uiLUT_TableSize<LOW_FLOW_CALIB_NUMBER_OF_SAMPLES) |
Clancy_SENDSOR | 2:5828e6917e75 | 1172 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1173 | // New motor speed |
Clancy_SENDSOR | 2:5828e6917e75 | 1174 | uiMotorDutyCyleForFlowCalib+=20; |
Clancy_SENDSOR | 2:5828e6917e75 | 1175 | enLowFlowCalibrationStep=SEND_FLOW_COMMAND; |
Clancy_SENDSOR | 2:5828e6917e75 | 1176 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1177 | else if (stTemporayLUTFlowSensor.uiLUT_TableSize==LOW_FLOW_CALIB_NUMBER_OF_SAMPLES && bHighFlowCalibrationInProgress==FALSE) |
Clancy_SENDSOR | 2:5828e6917e75 | 1178 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1179 | // Min speed for motor |
Clancy_SENDSOR | 2:5828e6917e75 | 1180 | uiMotorDutyCyleForFlowCalib=MIN_PI_OUTPUT; |
Clancy_SENDSOR | 2:5828e6917e75 | 1181 | SS_Xputdw(mdrv, uiMotorDutyCyleForFlowCalib); |
Clancy_SENDSOR | 2:5828e6917e75 | 1182 | enLowFlowCalibrationStep=SEND_HIGH_FLOW_CALIB_REQUEST; |
Clancy_SENDSOR | 2:5828e6917e75 | 1183 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1184 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1185 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1186 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1187 | // New motor speed |
Clancy_SENDSOR | 2:5828e6917e75 | 1188 | uiMotorDutyCyleForFlowCalib+=10; |
Clancy_SENDSOR | 2:5828e6917e75 | 1189 | enLowFlowCalibrationStep=SEND_FLOW_COMMAND; |
Clancy_SENDSOR | 2:5828e6917e75 | 1190 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1191 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1192 | // Update motor speed |
Clancy_SENDSOR | 2:5828e6917e75 | 1193 | if (uiMotorDutyCyleForFlowCalib<MAX_PI_OUTPUT) |
Clancy_SENDSOR | 2:5828e6917e75 | 1194 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1195 | SS_Xputdw(mdrv, uiMotorDutyCyleForFlowCalib); |
Clancy_SENDSOR | 2:5828e6917e75 | 1196 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1197 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1198 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1199 | enLowFlowCalibrationStep=PREPARE_FAILURE_COMMAND; |
Clancy_SENDSOR | 2:5828e6917e75 | 1200 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1201 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1202 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1203 | else // if (uiFlowTicksSamplesCounter!=0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1204 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1205 | enLowFlowCalibrationStep=PREPARE_FAILURE_COMMAND; |
Clancy_SENDSOR | 2:5828e6917e75 | 1206 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1207 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1208 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1209 | case SEND_HIGH_FLOW_CALIB_REQUEST: |
Clancy_SENDSOR | 2:5828e6917e75 | 1210 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1211 | if (TransferCommandToHandset((char*)szRequestHighFlowCalib)==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 1212 | enLowFlowCalibrationStep=WAIT_FOR_HIGH_FLOW_CALIB_ACK; |
Clancy_SENDSOR | 2:5828e6917e75 | 1213 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1214 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1215 | case WAIT_FOR_HIGH_FLOW_CALIB_ACK: |
Clancy_SENDSOR | 2:5828e6917e75 | 1216 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1217 | // Wait for acknownledge from handset |
Clancy_SENDSOR | 2:5828e6917e75 | 1218 | if (ReadByteReceive(&cCharValue)==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 1219 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1220 | if (cCharValue=='@') |
Clancy_SENDSOR | 2:5828e6917e75 | 1221 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1222 | // Continue flow calibration |
Clancy_SENDSOR | 2:5828e6917e75 | 1223 | bHighFlowCalibrationInProgress=TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 1224 | enLowFlowCalibrationStep=SEND_FLOW_COMMAND; |
Clancy_SENDSOR | 2:5828e6917e75 | 1225 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1226 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1227 | enLowFlowCalibrationStep=PREPARE_FAILURE_COMMAND; |
Clancy_SENDSOR | 2:5828e6917e75 | 1228 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1229 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1230 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1231 | case PREPARE_FAILURE_COMMAND: |
Clancy_SENDSOR | 2:5828e6917e75 | 1232 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1233 | if (TransferCommandToHandset((char*)szEndOfCalibFailed)==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 1234 | enLowFlowCalibrationStep=END_OF_CALIBRATION; |
Clancy_SENDSOR | 2:5828e6917e75 | 1235 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1236 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1237 | case PREPARE_SUCCESS_COMMAND: |
Clancy_SENDSOR | 2:5828e6917e75 | 1238 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1239 | if (TransferCommandToHandset((char*)szEndOfCalibOK)==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 1240 | enLowFlowCalibrationStep=END_OF_CALIBRATION; |
Clancy_SENDSOR | 2:5828e6917e75 | 1241 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1242 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1243 | case SEND_COMMAND_TO_PF300: |
Clancy_SENDSOR | 2:5828e6917e75 | 1244 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1245 | // Send a byte every 1ms |
Clancy_SENDSOR | 2:5828e6917e75 | 1246 | if (TransferBufferToPF300()==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 1247 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1248 | // Buffer sent !! |
Clancy_SENDSOR | 2:5828e6917e75 | 1249 | if (ucNumberOfBytesToCheckFromPF300Answer!=0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1250 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1251 | // Check answer from PF300 |
Clancy_SENDSOR | 2:5828e6917e75 | 1252 | ucIndexAnswerFromPF300=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1253 | uiCalibrationTimeOut=TIME_OUT_RECEPTION_PACKET_FROM_PF300; |
Clancy_SENDSOR | 2:5828e6917e75 | 1254 | enLowFlowCalibrationStep=CHECK_COMMAND_FROM_PF300; |
Clancy_SENDSOR | 2:5828e6917e75 | 1255 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1256 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1257 | enLowFlowCalibrationStep=enGoBackToStep; |
Clancy_SENDSOR | 2:5828e6917e75 | 1258 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1259 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1260 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1261 | case CHECK_COMMAND_FROM_PF300: |
Clancy_SENDSOR | 2:5828e6917e75 | 1262 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1263 | if (uiCalibrationTimeOut==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1264 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1265 | // Time-out in reception !! |
Clancy_SENDSOR | 2:5828e6917e75 | 1266 | ucIndexAnswerFromPF300=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1267 | enLowFlowCalibrationStep=PREPARE_FAILURE_COMMAND; |
Clancy_SENDSOR | 2:5828e6917e75 | 1268 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1269 | else if (ReadByteReceive(&cCharValue)==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 1270 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1271 | // Check last byte received |
Clancy_SENDSOR | 2:5828e6917e75 | 1272 | if (cCharValue=='\r') |
Clancy_SENDSOR | 2:5828e6917e75 | 1273 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1274 | // End of answer => check buffer content |
Clancy_SENDSOR | 2:5828e6917e75 | 1275 | ucIndexAnswerFromPF300=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1276 | strcpy(szTempBuf, szAnswerFromPF300); |
Clancy_SENDSOR | 2:5828e6917e75 | 1277 | szTempBuf[ucNumberOfBytesToCheckFromPF300Answer]=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1278 | if (strcmp(szTempBuf, szExpectedAnswerFromPF300)==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1279 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1280 | // Buffer OK !! |
Clancy_SENDSOR | 2:5828e6917e75 | 1281 | enLowFlowCalibrationStep=enGoBackToStep; |
Clancy_SENDSOR | 2:5828e6917e75 | 1282 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1283 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1284 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1285 | // Buffer wrong !! |
Clancy_SENDSOR | 2:5828e6917e75 | 1286 | enLowFlowCalibrationStep=PREPARE_FAILURE_COMMAND; |
Clancy_SENDSOR | 2:5828e6917e75 | 1287 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1288 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1289 | else if (cCharValue=='?') |
Clancy_SENDSOR | 2:5828e6917e75 | 1290 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1291 | // PF300 is lost => end of calibration |
Clancy_SENDSOR | 2:5828e6917e75 | 1292 | ucIndexAnswerFromPF300=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1293 | enLowFlowCalibrationStep=PREPARE_FAILURE_COMMAND; |
Clancy_SENDSOR | 2:5828e6917e75 | 1294 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1295 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1296 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1297 | // Store byte from PF300 into buffer |
Clancy_SENDSOR | 2:5828e6917e75 | 1298 | szAnswerFromPF300[ucIndexAnswerFromPF300++]=cCharValue; |
Clancy_SENDSOR | 2:5828e6917e75 | 1299 | if (ucIndexAnswerFromPF300>=SIZE_RX_BUFFER_PF300) |
Clancy_SENDSOR | 2:5828e6917e75 | 1300 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1301 | // Answer too long !! |
Clancy_SENDSOR | 2:5828e6917e75 | 1302 | ucIndexAnswerFromPF300=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1303 | enLowFlowCalibrationStep=PREPARE_FAILURE_COMMAND; |
Clancy_SENDSOR | 2:5828e6917e75 | 1304 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1305 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1306 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1307 | // Add 0 at the end of the string |
Clancy_SENDSOR | 2:5828e6917e75 | 1308 | szAnswerFromPF300[ucIndexAnswerFromPF300]=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1309 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1310 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1311 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1312 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1313 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1314 | // No byte received !! |
Clancy_SENDSOR | 2:5828e6917e75 | 1315 | uiCalibrationTimeOut--; |
Clancy_SENDSOR | 2:5828e6917e75 | 1316 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1317 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1318 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1319 | default: |
Clancy_SENDSOR | 2:5828e6917e75 | 1320 | case END_OF_CALIBRATION: |
Clancy_SENDSOR | 2:5828e6917e75 | 1321 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1322 | uiTechnicalDataSet[START_STOP_VENTILATION]=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1323 | bDisableMaroubraCommCommunication=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 1324 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1325 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1326 | } // switch |
Clancy_SENDSOR | 2:5828e6917e75 | 1327 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1328 | // Every 300ms, send '@*' to inform the handset that the blower works properly |
Clancy_SENDSOR | 2:5828e6917e75 | 1329 | if (uiImHereMsgTimer==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1330 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1331 | if (enLowFlowCalibrationStep!=SEND_COMMAND_TO_PF300) |
Clancy_SENDSOR | 2:5828e6917e75 | 1332 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1333 | uiImHereMsgTimer=300; |
Clancy_SENDSOR | 2:5828e6917e75 | 1334 | TransferCommandToHandset((char*)szImHere); |
Clancy_SENDSOR | 2:5828e6917e75 | 1335 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1336 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1337 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1338 | uiImHereMsgTimer--; |
Clancy_SENDSOR | 2:5828e6917e75 | 1339 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1340 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1341 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 1342 | * Function Name : ManagePressureCalibration |
Clancy_SENDSOR | 2:5828e6917e75 | 1343 | * Description : Manage pressure calibration |
Clancy_SENDSOR | 2:5828e6917e75 | 1344 | * Input : None |
Clancy_SENDSOR | 2:5828e6917e75 | 1345 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 1346 | * Return : None |
Clancy_SENDSOR | 2:5828e6917e75 | 1347 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 1348 | void ManagePressureCalibration(void) |
Clancy_SENDSOR | 2:5828e6917e75 | 1349 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1350 | char cCharValue; |
Clancy_SENDSOR | 2:5828e6917e75 | 1351 | char szTempBuf[SIZE_RX_BUFFER_PF300]; |
Clancy_SENDSOR | 2:5828e6917e75 | 1352 | u16 uiCalibPressureADCValue; |
Clancy_SENDSOR | 2:5828e6917e75 | 1353 | u16 uiCalibPressureValue; |
Clancy_SENDSOR | 2:5828e6917e75 | 1354 | u16 uiCalibPressureGain; |
Clancy_SENDSOR | 2:5828e6917e75 | 1355 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1356 | switch(enPressureCalibrationStep) |
Clancy_SENDSOR | 2:5828e6917e75 | 1357 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1358 | case INIT_PRESSURE_CALIB_TEST: |
Clancy_SENDSOR | 2:5828e6917e75 | 1359 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1360 | // Init comm with PF300 => wait 2s before sending first command to PF300 |
Clancy_SENDSOR | 2:5828e6917e75 | 1361 | // We need to wait for this delay in order to the handset to activate its transparent mode |
Clancy_SENDSOR | 2:5828e6917e75 | 1362 | if (uiCalibrationTimeOut==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1363 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1364 | bDisableMaroubraCommCommunication=TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 1365 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1366 | // Prepare command to PF300 |
Clancy_SENDSOR | 2:5828e6917e75 | 1367 | UpdateBufferToSend((char*)szPF300_CmdSwitchOffEcho); |
Clancy_SENDSOR | 2:5828e6917e75 | 1368 | strcpy(szExpectedAnswerFromPF300, szPF300_AnswerSwitchOffEcho); |
Clancy_SENDSOR | 2:5828e6917e75 | 1369 | ucNumberOfBytesToCheckFromPF300Answer=strlen(szPF300_AnswerSwitchOffEcho); |
Clancy_SENDSOR | 2:5828e6917e75 | 1370 | enPressureCalibrationStep=PRESSURE_CALIB_SEND_COMMAND_TO_PF300; |
Clancy_SENDSOR | 2:5828e6917e75 | 1371 | enPressureCalibGoBackToStep=START_PRESSURE_READING; |
Clancy_SENDSOR | 2:5828e6917e75 | 1372 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1373 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1374 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1375 | uiCalibrationTimeOut--; |
Clancy_SENDSOR | 2:5828e6917e75 | 1376 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1377 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1378 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1379 | case START_PRESSURE_READING: |
Clancy_SENDSOR | 2:5828e6917e75 | 1380 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1381 | // Set blower speed |
Clancy_SENDSOR | 2:5828e6917e75 | 1382 | SS_Xputdw(mdrv, 600); |
Clancy_SENDSOR | 2:5828e6917e75 | 1383 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1384 | // Init variable for flow sensor |
Clancy_SENDSOR | 2:5828e6917e75 | 1385 | uiCalibrationTimeOut=SAMPLE_RATE_BETWEEN_TWO_PRESSURE; |
Clancy_SENDSOR | 2:5828e6917e75 | 1386 | ulSumPressureTicks=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1387 | uiPressureTicksSamplesCounter=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1388 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1389 | enPressureCalibrationStep=SEND_PRESSURE_COMMAND; |
Clancy_SENDSOR | 2:5828e6917e75 | 1390 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1391 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1392 | case SEND_PRESSURE_COMMAND: |
Clancy_SENDSOR | 2:5828e6917e75 | 1393 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1394 | if (uiCalibrationTimeOut!=0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1395 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1396 | uiCalibrationTimeOut--; |
Clancy_SENDSOR | 2:5828e6917e75 | 1397 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1398 | if (uiCalibrationTimeOut<2000) |
Clancy_SENDSOR | 2:5828e6917e75 | 1399 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1400 | ulSumPressureTicks+=uiProximalPressureADCMes; |
Clancy_SENDSOR | 2:5828e6917e75 | 1401 | uiPressureTicksSamplesCounter++; |
Clancy_SENDSOR | 2:5828e6917e75 | 1402 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1403 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1404 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1405 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1406 | // Prepare next command |
Clancy_SENDSOR | 2:5828e6917e75 | 1407 | UpdateBufferToSend((char*)szPF300_ReadPdiffCmd); |
Clancy_SENDSOR | 2:5828e6917e75 | 1408 | strcpy(szExpectedAnswerFromPF300, szPF300_ReadPdiffAnswer); |
Clancy_SENDSOR | 2:5828e6917e75 | 1409 | ucNumberOfBytesToCheckFromPF300Answer=strlen(szPF300_ReadPdiffAnswer); |
Clancy_SENDSOR | 2:5828e6917e75 | 1410 | enPressureCalibrationStep=PRESSURE_CALIB_SEND_COMMAND_TO_PF300; |
Clancy_SENDSOR | 2:5828e6917e75 | 1411 | enPressureCalibGoBackToStep=READ_PRESSURE_VALUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 1412 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1413 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1414 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1415 | case READ_PRESSURE_VALUE: |
Clancy_SENDSOR | 2:5828e6917e75 | 1416 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1417 | if (uiPressureTicksSamplesCounter!=0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1418 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1419 | // Read PF300 pressure |
Clancy_SENDSOR | 2:5828e6917e75 | 1420 | strcpy(szTempBuf, &szAnswerFromPF300[ucNumberOfBytesToCheckFromPF300Answer]); |
Clancy_SENDSOR | 2:5828e6917e75 | 1421 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1422 | // Store value of Pressure |
Clancy_SENDSOR | 2:5828e6917e75 | 1423 | uiCalibPressureValue=(unsigned int)atoi(szTempBuf); |
Clancy_SENDSOR | 2:5828e6917e75 | 1424 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1425 | // Store ticks value |
Clancy_SENDSOR | 2:5828e6917e75 | 1426 | uiCalibPressureADCValue=ulSumPressureTicks/uiPressureTicksSamplesCounter; |
Clancy_SENDSOR | 2:5828e6917e75 | 1427 | uiCalibrationTimeOut=SAMPLE_RATE_BETWEEN_TWO_PRESSURE; |
Clancy_SENDSOR | 2:5828e6917e75 | 1428 | ulSumPressureTicks=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1429 | uiPressureTicksSamplesCounter=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1430 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1431 | // Check if current pressure<10cmH20 |
Clancy_SENDSOR | 2:5828e6917e75 | 1432 | if (uiCalibPressureValue<1000) |
Clancy_SENDSOR | 2:5828e6917e75 | 1433 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1434 | enPressureCalibrationStep=PRESSURE_CALIB_FAILURE_COMMAND; |
Clancy_SENDSOR | 2:5828e6917e75 | 1435 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1436 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1437 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1438 | // Compute pressure gain |
Clancy_SENDSOR | 2:5828e6917e75 | 1439 | uiCalibPressureGain=(10000UL*(uiCalibPressureADCValue-uiTechnicalDataSet[PPROX_OFFSET_TEC]))/uiCalibPressureValue; |
Clancy_SENDSOR | 2:5828e6917e75 | 1440 | uiCalibPressureGain+=5; |
Clancy_SENDSOR | 2:5828e6917e75 | 1441 | uiCalibPressureGain/=10; |
Clancy_SENDSOR | 2:5828e6917e75 | 1442 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1443 | // Check pressure gain range |
Clancy_SENDSOR | 2:5828e6917e75 | 1444 | if (uiCalibPressureGain<Tec_GainPprox_MIN || uiCalibPressureGain>Tec_GainPprox_MAX) |
Clancy_SENDSOR | 2:5828e6917e75 | 1445 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1446 | enPressureCalibrationStep=PRESSURE_CALIB_FAILURE_COMMAND; |
Clancy_SENDSOR | 2:5828e6917e75 | 1447 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1448 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1449 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1450 | enPressureCalibrationStep=PRESSURE_CALIB_SUCCESS_COMMAND; |
Clancy_SENDSOR | 2:5828e6917e75 | 1451 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1452 | // Transfer the temporary LUT in the definitive LUT |
Clancy_SENDSOR | 2:5828e6917e75 | 1453 | uiTechnicalDataSet[PPROX_GAIN_TEC]=uiCalibPressureGain; |
Clancy_SENDSOR | 2:5828e6917e75 | 1454 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1455 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1456 | else // if (uiPressureTicksSamplesCounter!=0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1457 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1458 | enPressureCalibrationStep=PRESSURE_CALIB_FAILURE_COMMAND; |
Clancy_SENDSOR | 2:5828e6917e75 | 1459 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1460 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1461 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1462 | case PRESSURE_CALIB_FAILURE_COMMAND: |
Clancy_SENDSOR | 2:5828e6917e75 | 1463 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1464 | if (TransferCommandToHandset((char*)szEndOfCalibFailed)==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 1465 | enPressureCalibrationStep=PRESSURE_CALIB_END_OF_CALIBRATION; |
Clancy_SENDSOR | 2:5828e6917e75 | 1466 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1467 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1468 | case PRESSURE_CALIB_SUCCESS_COMMAND: |
Clancy_SENDSOR | 2:5828e6917e75 | 1469 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1470 | if (TransferCommandToHandset((char*)szEndOfCalibOK)==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 1471 | enPressureCalibrationStep=PRESSURE_CALIB_END_OF_CALIBRATION; |
Clancy_SENDSOR | 2:5828e6917e75 | 1472 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1473 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1474 | case PRESSURE_CALIB_SEND_COMMAND_TO_PF300: |
Clancy_SENDSOR | 2:5828e6917e75 | 1475 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1476 | // Send a byte every 1ms |
Clancy_SENDSOR | 2:5828e6917e75 | 1477 | if (TransferBufferToPF300()==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 1478 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1479 | // Buffer sent !! |
Clancy_SENDSOR | 2:5828e6917e75 | 1480 | if (ucNumberOfBytesToCheckFromPF300Answer!=0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1481 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1482 | // Check answer from PF300 |
Clancy_SENDSOR | 2:5828e6917e75 | 1483 | ucIndexAnswerFromPF300=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1484 | uiCalibrationTimeOut=TIME_OUT_RECEPTION_PACKET_FROM_PF300; |
Clancy_SENDSOR | 2:5828e6917e75 | 1485 | enPressureCalibrationStep=PRESSURE_CALIB_CHECK_COMMAND_FROM_PF300; |
Clancy_SENDSOR | 2:5828e6917e75 | 1486 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1487 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1488 | enPressureCalibrationStep=enPressureCalibGoBackToStep; |
Clancy_SENDSOR | 2:5828e6917e75 | 1489 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1490 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1491 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1492 | case PRESSURE_CALIB_CHECK_COMMAND_FROM_PF300: |
Clancy_SENDSOR | 2:5828e6917e75 | 1493 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1494 | if (uiCalibrationTimeOut==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1495 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1496 | // Time-out in reception !! |
Clancy_SENDSOR | 2:5828e6917e75 | 1497 | ucIndexAnswerFromPF300=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1498 | enPressureCalibrationStep=PRESSURE_CALIB_FAILURE_COMMAND; |
Clancy_SENDSOR | 2:5828e6917e75 | 1499 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1500 | else if (ReadByteReceive(&cCharValue)==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 1501 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1502 | // Check last byte received |
Clancy_SENDSOR | 2:5828e6917e75 | 1503 | if (cCharValue=='\r') |
Clancy_SENDSOR | 2:5828e6917e75 | 1504 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1505 | // End of answer => check buffer content |
Clancy_SENDSOR | 2:5828e6917e75 | 1506 | ucIndexAnswerFromPF300=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1507 | strcpy(szTempBuf, szAnswerFromPF300); |
Clancy_SENDSOR | 2:5828e6917e75 | 1508 | szTempBuf[ucNumberOfBytesToCheckFromPF300Answer]=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1509 | if (strcmp(szTempBuf, szExpectedAnswerFromPF300)==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1510 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1511 | // Buffer OK !! |
Clancy_SENDSOR | 2:5828e6917e75 | 1512 | enPressureCalibrationStep=enPressureCalibGoBackToStep; |
Clancy_SENDSOR | 2:5828e6917e75 | 1513 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1514 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1515 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1516 | // Buffer wrong !! |
Clancy_SENDSOR | 2:5828e6917e75 | 1517 | enPressureCalibrationStep=PRESSURE_CALIB_FAILURE_COMMAND; |
Clancy_SENDSOR | 2:5828e6917e75 | 1518 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1519 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1520 | else if (cCharValue=='?') |
Clancy_SENDSOR | 2:5828e6917e75 | 1521 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1522 | // PF300 is lost => end of calibration |
Clancy_SENDSOR | 2:5828e6917e75 | 1523 | ucIndexAnswerFromPF300=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1524 | enPressureCalibrationStep=PRESSURE_CALIB_FAILURE_COMMAND; |
Clancy_SENDSOR | 2:5828e6917e75 | 1525 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1526 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1527 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1528 | // Store byte from PF300 into buffer |
Clancy_SENDSOR | 2:5828e6917e75 | 1529 | szAnswerFromPF300[ucIndexAnswerFromPF300++]=cCharValue; |
Clancy_SENDSOR | 2:5828e6917e75 | 1530 | if (ucIndexAnswerFromPF300>=SIZE_RX_BUFFER_PF300) |
Clancy_SENDSOR | 2:5828e6917e75 | 1531 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1532 | // Answer too long !! |
Clancy_SENDSOR | 2:5828e6917e75 | 1533 | ucIndexAnswerFromPF300=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1534 | enPressureCalibrationStep=PRESSURE_CALIB_FAILURE_COMMAND; |
Clancy_SENDSOR | 2:5828e6917e75 | 1535 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1536 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1537 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1538 | // Add 0 at the end of the string |
Clancy_SENDSOR | 2:5828e6917e75 | 1539 | szAnswerFromPF300[ucIndexAnswerFromPF300]=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1540 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1541 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1542 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1543 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1544 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1545 | // No byte received !! |
Clancy_SENDSOR | 2:5828e6917e75 | 1546 | uiCalibrationTimeOut--; |
Clancy_SENDSOR | 2:5828e6917e75 | 1547 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1548 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1549 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1550 | default: |
Clancy_SENDSOR | 2:5828e6917e75 | 1551 | case PRESSURE_CALIB_END_OF_CALIBRATION: |
Clancy_SENDSOR | 2:5828e6917e75 | 1552 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1553 | uiTechnicalDataSet[START_STOP_VENTILATION]=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1554 | bDisableMaroubraCommCommunication=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 1555 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1556 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1557 | } // switch |
Clancy_SENDSOR | 2:5828e6917e75 | 1558 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1559 | // Every 300ms, send '@*' to inform the handset that the blower works properly |
Clancy_SENDSOR | 2:5828e6917e75 | 1560 | if (uiImHereMsgTimer==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1561 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1562 | if (enPressureCalibrationStep!=PRESSURE_CALIB_SEND_COMMAND_TO_PF300) |
Clancy_SENDSOR | 2:5828e6917e75 | 1563 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1564 | uiImHereMsgTimer=300; |
Clancy_SENDSOR | 2:5828e6917e75 | 1565 | TransferCommandToHandset((char*)szImHere); |
Clancy_SENDSOR | 2:5828e6917e75 | 1566 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1567 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1568 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1569 | uiImHereMsgTimer--; |
Clancy_SENDSOR | 2:5828e6917e75 | 1570 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1571 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1572 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1573 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 1574 | * Function Name : ManageCstPressure |
Clancy_SENDSOR | 2:5828e6917e75 | 1575 | * Description : Manage constant pressure |
Clancy_SENDSOR | 2:5828e6917e75 | 1576 | * Input : None |
Clancy_SENDSOR | 2:5828e6917e75 | 1577 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 1578 | * Return : None |
Clancy_SENDSOR | 2:5828e6917e75 | 1579 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 1580 | void ManageCstPressure(void) |
Clancy_SENDSOR | 2:5828e6917e75 | 1581 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1582 | int32_t lError; |
Clancy_SENDSOR | 2:5828e6917e75 | 1583 | int32_t lPropTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 1584 | int32_t lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 1585 | int32_t lOutputPressure; |
Clancy_SENDSOR | 2:5828e6917e75 | 1586 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1587 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1588 | // Barometric Mode : error computation |
Clancy_SENDSOR | 2:5828e6917e75 | 1589 | lError=(int32_t)uiMLT_PressureSetPoint-(int32_t)uiProximalPressureMes; |
Clancy_SENDSOR | 2:5828e6917e75 | 1590 | lIntegralTerm = (int32_t)uiTechnicalDataSet[KI_CPAP_VENTED_PRESSURE_I] * lError; |
Clancy_SENDSOR | 2:5828e6917e75 | 1591 | if (uiMLT_PressureSetPoint<uiVentilationSet[PI_SET]) uiMLT_PressureSetPoint++; |
Clancy_SENDSOR | 2:5828e6917e75 | 1592 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1593 | // Close loop in pressure |
Clancy_SENDSOR | 2:5828e6917e75 | 1594 | if ((lIntegral_Pressure_I>=0) && (lIntegralTerm>=0) && (bMaxPIOutputPressureI==FALSE)) |
Clancy_SENDSOR | 2:5828e6917e75 | 1595 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1596 | if ((lIntegral_Pressure_I + lIntegralTerm) <0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1597 | lIntegral_Pressure_I = INTEGRAL_MAX; |
Clancy_SENDSOR | 2:5828e6917e75 | 1598 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1599 | lIntegral_Pressure_I += lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 1600 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1601 | else if ((lIntegral_Pressure_I<=0) && (lIntegralTerm<=0) && (bMinPIOutputPressureI==FALSE)) |
Clancy_SENDSOR | 2:5828e6917e75 | 1602 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1603 | if ((lIntegral_Pressure_I + lIntegralTerm)>0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1604 | lIntegral_Pressure_I = INTEGRAL_MIN; |
Clancy_SENDSOR | 2:5828e6917e75 | 1605 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1606 | lIntegral_Pressure_I += lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 1607 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1608 | else if ((lIntegral_Pressure_I<=0) && (lIntegralTerm>=0)) |
Clancy_SENDSOR | 2:5828e6917e75 | 1609 | lIntegral_Pressure_I += lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 1610 | else if ((lIntegral_Pressure_I>=0) && (lIntegralTerm<=0)) |
Clancy_SENDSOR | 2:5828e6917e75 | 1611 | lIntegral_Pressure_I += lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 1612 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1613 | lPropTerm = (int32_t)uiTechnicalDataSet[KP_CPAP_VENTED_PRESSURE_I] * lError; |
Clancy_SENDSOR | 2:5828e6917e75 | 1614 | lOutputPressure = (lIntegral_Pressure_I>>16) + (lPropTerm>>13); |
Clancy_SENDSOR | 2:5828e6917e75 | 1615 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1616 | // Add constante value (PWM at the end of the previous inspiration) |
Clancy_SENDSOR | 2:5828e6917e75 | 1617 | //lOutputPressure+=300; |
Clancy_SENDSOR | 2:5828e6917e75 | 1618 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1619 | if (lOutputPressure>=((int32_t)MAX_VOLTAGE_REF)) |
Clancy_SENDSOR | 2:5828e6917e75 | 1620 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1621 | bMaxPIOutputPressureI = TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 1622 | uiInspirationBlowerPWMTec=MAX_VOLTAGE_REF; |
Clancy_SENDSOR | 2:5828e6917e75 | 1623 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1624 | else if (lOutputPressure<((int32_t)MIN_VOLTAGE_REF)) |
Clancy_SENDSOR | 2:5828e6917e75 | 1625 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1626 | bMinPIOutputPressureI = TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 1627 | uiInspirationBlowerPWMTec=MIN_VOLTAGE_REF; |
Clancy_SENDSOR | 2:5828e6917e75 | 1628 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1629 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1630 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1631 | bMaxPIOutputPressureI = FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 1632 | bMinPIOutputPressureI = FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 1633 | uiInspirationBlowerPWMTec = lOutputPressure; |
Clancy_SENDSOR | 2:5828e6917e75 | 1634 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1635 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1636 | // Update Blower Speed |
Clancy_SENDSOR | 2:5828e6917e75 | 1637 | SS_Xputdw(mdrv, uiInspirationBlowerPWMTec); |
Clancy_SENDSOR | 2:5828e6917e75 | 1638 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1639 | // Monitoring and Alarm (every 1s) |
Clancy_SENDSOR | 2:5828e6917e75 | 1640 | #ifdef MOTOR_LIFE_TESTING |
Clancy_SENDSOR | 2:5828e6917e75 | 1641 | if (uiAverageMonitoringMLT==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1642 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1643 | uiAverageBlowerSpeedMes=ulMLT_SumSpeedMes/MLT_AVERAGE_MONITORING; |
Clancy_SENDSOR | 2:5828e6917e75 | 1644 | uiBreathBlowerCurrentMes=ulMLT_SumCurrentMes/MLT_AVERAGE_MONITORING; |
Clancy_SENDSOR | 2:5828e6917e75 | 1645 | uiAverateMotorTempMes=ulMLT_SumTemperatureMes/MLT_AVERAGE_MONITORING; |
Clancy_SENDSOR | 2:5828e6917e75 | 1646 | uiAverageMotorVoltage=ulMLT_SumBlowerVoltage/MLT_AVERAGE_MONITORING; |
Clancy_SENDSOR | 2:5828e6917e75 | 1647 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1648 | ulMLT_SumSpeedMes=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1649 | ulMLT_SumCurrentMes=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1650 | ulMLT_SumTemperatureMes=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1651 | ulMLT_SumBlowerVoltage=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1652 | uiAverageMonitoringMLT=MLT_AVERAGE_MONITORING; |
Clancy_SENDSOR | 2:5828e6917e75 | 1653 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1654 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1655 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1656 | ulMLT_SumSpeedMes+=uiBlowerSpeedMes; |
Clancy_SENDSOR | 2:5828e6917e75 | 1657 | ulMLT_SumCurrentMes+=uiBlowerCurrentMes; |
Clancy_SENDSOR | 2:5828e6917e75 | 1658 | ulMLT_SumTemperatureMes+=uiTechnicalDataMes[MOTOR_TEMPERATURE_TEC_MES]; |
Clancy_SENDSOR | 2:5828e6917e75 | 1659 | ulMLT_SumBlowerVoltage+=uiTechnicalDataMes[MOTOR_VOLTAGE_TEC_MES]; |
Clancy_SENDSOR | 2:5828e6917e75 | 1660 | uiAverageMonitoringMLT--; |
Clancy_SENDSOR | 2:5828e6917e75 | 1661 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1662 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1663 | // Alarms management |
Clancy_SENDSOR | 2:5828e6917e75 | 1664 | if (uiMLT_EnableAlarm==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1665 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1666 | // High Speed alarm |
Clancy_SENDSOR | 2:5828e6917e75 | 1667 | if (uiAverageBlowerSpeedMes>uiTechnicalDataSet[MLT_HIGH_SPEED_TEC]) |
Clancy_SENDSOR | 2:5828e6917e75 | 1668 | uiFlagsAlarm[ALARM_FLAGS2]|=HIGH_BLOWER_SPEED_ALARM_MASK; |
Clancy_SENDSOR | 2:5828e6917e75 | 1669 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1670 | // Low Speed alarm |
Clancy_SENDSOR | 2:5828e6917e75 | 1671 | if (uiAverageBlowerSpeedMes<uiTechnicalDataSet[MLT_LOW_SPEED_TEC]) |
Clancy_SENDSOR | 2:5828e6917e75 | 1672 | uiFlagsAlarm[ALARM_FLAGS2]|=LOW_BLOWER_SPEED_ALARM_MASK; |
Clancy_SENDSOR | 2:5828e6917e75 | 1673 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1674 | // High blower current alarm |
Clancy_SENDSOR | 2:5828e6917e75 | 1675 | if (uiBreathBlowerCurrentMes>uiTechnicalDataSet[MLT_HIGH_CURRENT_TEC]) |
Clancy_SENDSOR | 2:5828e6917e75 | 1676 | uiFlagsAlarm[ALARM_FLAGS2]|=HIGH_BLOWER_CURRENT_ALARM_MASK; |
Clancy_SENDSOR | 2:5828e6917e75 | 1677 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1678 | // High Blower temperature |
Clancy_SENDSOR | 2:5828e6917e75 | 1679 | if (uiAverateMotorTempMes>uiTechnicalDataSet[MLT_HIGH_TEMPERATURE_TEC]) |
Clancy_SENDSOR | 2:5828e6917e75 | 1680 | uiFlagsAlarm[ALARM_FLAGS2]|=HIGH_BLOWER_TEMP_ALARM_MASK; |
Clancy_SENDSOR | 2:5828e6917e75 | 1681 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1682 | // Low Blower temperature |
Clancy_SENDSOR | 2:5828e6917e75 | 1683 | if (uiAverateMotorTempMes<100) |
Clancy_SENDSOR | 2:5828e6917e75 | 1684 | uiFlagsAlarm[ALARM_FLAGS2]|=LOW_BLOWER_TEMP_ALARM_MASK; |
Clancy_SENDSOR | 2:5828e6917e75 | 1685 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1686 | // High Blower Flow |
Clancy_SENDSOR | 2:5828e6917e75 | 1687 | if (iBlowerFlowSmoothingMesForTrigger>uiTechnicalDataSet[MLT_HIGH_FLOW_TEC] || iBlowerFlowSmoothingMesForTrigger<uiTechnicalDataSet[MLT_LOW_FLOW_TEC]) |
Clancy_SENDSOR | 2:5828e6917e75 | 1688 | uiFlagsAlarm[ALARM_FLAGS2]|=OOR_BLOWER_FLOW_ALARM_MASK; |
Clancy_SENDSOR | 2:5828e6917e75 | 1689 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1690 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1691 | uiMLT_EnableAlarm--; |
Clancy_SENDSOR | 2:5828e6917e75 | 1692 | #endif // MOTOR_LIFE_TESTING |
Clancy_SENDSOR | 2:5828e6917e75 | 1693 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1694 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1695 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1696 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 1697 | * Function Name : ManagePACVVentilation |
Clancy_SENDSOR | 2:5828e6917e75 | 1698 | * Description : Manage Bilevel ventilation |
Clancy_SENDSOR | 2:5828e6917e75 | 1699 | * Input : bPSMode=true in PS mode, false in PI mode |
Clancy_SENDSOR | 2:5828e6917e75 | 1700 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 1701 | * Return : None |
Clancy_SENDSOR | 2:5828e6917e75 | 1702 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 1703 | void ManagePACVVentilation(bool bPSMode) |
Clancy_SENDSOR | 2:5828e6917e75 | 1704 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1705 | int32_t lError; |
Clancy_SENDSOR | 2:5828e6917e75 | 1706 | int32_t lPropTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 1707 | int32_t lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 1708 | int32_t lOutputPressure; |
Clancy_SENDSOR | 2:5828e6917e75 | 1709 | u16 uiPressureSetPoint; |
Clancy_SENDSOR | 2:5828e6917e75 | 1710 | u16 uiTiMax; |
Clancy_SENDSOR | 2:5828e6917e75 | 1711 | u16 uiTiMin; |
Clancy_SENDSOR | 2:5828e6917e75 | 1712 | //u16 uiTeMax; |
Clancy_SENDSOR | 2:5828e6917e75 | 1713 | u16 uiFlowMaxInExpi; |
Clancy_SENDSOR | 2:5828e6917e75 | 1714 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1715 | if (ucVentilationCycle==INSPIRATION_CYCLE) |
Clancy_SENDSOR | 2:5828e6917e75 | 1716 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1717 | // --------------------------------------------------------------------------- |
Clancy_SENDSOR | 2:5828e6917e75 | 1718 | // - INSPIRATION - |
Clancy_SENDSOR | 2:5828e6917e75 | 1719 | // -------------------------------------------------------------------------- |
Clancy_SENDSOR | 2:5828e6917e75 | 1720 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1721 | // Ti et pressure set point management |
Clancy_SENDSOR | 2:5828e6917e75 | 1722 | if (bPSMode==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 1723 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1724 | uiPressureSetPoint=uiVentilationSet[PS_SET]; |
Clancy_SENDSOR | 2:5828e6917e75 | 1725 | uiTiMax=uiVentilationSet[TI_MAX_SET]; |
Clancy_SENDSOR | 2:5828e6917e75 | 1726 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1727 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1728 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1729 | uiPressureSetPoint=uiVentilationSet[PI_SET]; |
Clancy_SENDSOR | 2:5828e6917e75 | 1730 | uiTiMax=uiVentilationSet[TI_BARO_SET]; |
Clancy_SENDSOR | 2:5828e6917e75 | 1731 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1732 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1733 | // Compute Timin |
Clancy_SENDSOR | 2:5828e6917e75 | 1734 | if (uiPatientType==PATIENT_ADULT) |
Clancy_SENDSOR | 2:5828e6917e75 | 1735 | uiTiMin=TiBaroSet_A_MIN; |
Clancy_SENDSOR | 2:5828e6917e75 | 1736 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1737 | uiTiMin=TiBaroSet_P_MIN; |
Clancy_SENDSOR | 2:5828e6917e75 | 1738 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1739 | // Limit the pressure setting |
Clancy_SENDSOR | 2:5828e6917e75 | 1740 | if (uiVentilationSet[HIGH_PRESSURE_ALARM_SET]<uiPressureSetPoint) |
Clancy_SENDSOR | 2:5828e6917e75 | 1741 | uiPressureSetPoint=uiVentilationSet[HIGH_PRESSURE_ALARM_SET]; |
Clancy_SENDSOR | 2:5828e6917e75 | 1742 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1743 | if (uiTiD==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1744 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1745 | // Management Expiratory Trigger |
Clancy_SENDSOR | 2:5828e6917e75 | 1746 | ucTempoTriggerExpiAuto=TEMPO_TRIGGER_EXPI; |
Clancy_SENDSOR | 2:5828e6917e75 | 1747 | ucExpiTriggerTreshold=MIN_THRESHOLD_EXPI_TRIGGER_AUTO; |
Clancy_SENDSOR | 2:5828e6917e75 | 1748 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1749 | // Management Inspiratory slope |
Clancy_SENDSOR | 2:5828e6917e75 | 1750 | switch(uiVentilationSet[SLOPE_BARO_SET]) |
Clancy_SENDSOR | 2:5828e6917e75 | 1751 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1752 | default: |
Clancy_SENDSOR | 2:5828e6917e75 | 1753 | case 1: |
Clancy_SENDSOR | 2:5828e6917e75 | 1754 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1755 | // Slope of 5ms/hPa => 0.2hPa/ms |
Clancy_SENDSOR | 2:5828e6917e75 | 1756 | uiIpapSettingTemp=uiVentilationSet[PEEP_SET]+2; |
Clancy_SENDSOR | 2:5828e6917e75 | 1757 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1758 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1759 | case 2: |
Clancy_SENDSOR | 2:5828e6917e75 | 1760 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1761 | ucIndexTableSlope=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1762 | uiIpapSettingTemp=(uiPressureSetPoint*ucSlope2Table[ucIndexTableSlope++])/100; |
Clancy_SENDSOR | 2:5828e6917e75 | 1763 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1764 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1765 | case 3: |
Clancy_SENDSOR | 2:5828e6917e75 | 1766 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1767 | ucIndexTableSlope=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1768 | uiIpapSettingTemp=(uiPressureSetPoint*ucSlope3Table[ucIndexTableSlope++])/100; |
Clancy_SENDSOR | 2:5828e6917e75 | 1769 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1770 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1771 | case 4: |
Clancy_SENDSOR | 2:5828e6917e75 | 1772 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1773 | ucIndexTableSlope=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1774 | uiIpapSettingTemp=(uiPressureSetPoint*ucSlope4Table[ucIndexTableSlope++])/100; |
Clancy_SENDSOR | 2:5828e6917e75 | 1775 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1776 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1777 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1778 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1779 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1780 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1781 | // Management Inspiratory slope |
Clancy_SENDSOR | 2:5828e6917e75 | 1782 | switch(uiVentilationSet[SLOPE_BARO_SET]) |
Clancy_SENDSOR | 2:5828e6917e75 | 1783 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1784 | default: |
Clancy_SENDSOR | 2:5828e6917e75 | 1785 | case 1: |
Clancy_SENDSOR | 2:5828e6917e75 | 1786 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1787 | // Slope of 5ms/hPa => 0.2hPa/ms |
Clancy_SENDSOR | 2:5828e6917e75 | 1788 | uiIpapSettingTemp+=2; |
Clancy_SENDSOR | 2:5828e6917e75 | 1789 | if (uiIpapSettingTemp>uiPressureSetPoint) |
Clancy_SENDSOR | 2:5828e6917e75 | 1790 | uiIpapSettingTemp=uiPressureSetPoint; |
Clancy_SENDSOR | 2:5828e6917e75 | 1791 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1792 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1793 | case 2: |
Clancy_SENDSOR | 2:5828e6917e75 | 1794 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1795 | if (ucIndexTableSlope<SIZE_SLOPE2_TABLE && (uiTiD%10)==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1796 | uiIpapSettingTemp=(uiPressureSetPoint*ucSlope2Table[ucIndexTableSlope++])/100; |
Clancy_SENDSOR | 2:5828e6917e75 | 1797 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1798 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1799 | case 3: |
Clancy_SENDSOR | 2:5828e6917e75 | 1800 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1801 | if (ucIndexTableSlope<SIZE_SLOPE3_TABLE && (uiTiD%10)==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1802 | uiIpapSettingTemp=(uiPressureSetPoint*ucSlope3Table[ucIndexTableSlope++])/100; |
Clancy_SENDSOR | 2:5828e6917e75 | 1803 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1804 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1805 | case 4: |
Clancy_SENDSOR | 2:5828e6917e75 | 1806 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1807 | if (ucIndexTableSlope<SIZE_SLOPE4_TABLE && (uiTiD%10)==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1808 | uiIpapSettingTemp=(uiPressureSetPoint*ucSlope4Table[ucIndexTableSlope++])/100; |
Clancy_SENDSOR | 2:5828e6917e75 | 1809 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 1810 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1811 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1812 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1813 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1814 | // Barometric Mode : error computation |
Clancy_SENDSOR | 2:5828e6917e75 | 1815 | lError=(int32_t)uiIpapSettingTemp-(int32_t)uiProximalPressureMes; |
Clancy_SENDSOR | 2:5828e6917e75 | 1816 | if (fFirstCycleInspi==FALSE) |
Clancy_SENDSOR | 2:5828e6917e75 | 1817 | lIntegralTerm = (int32_t)uiTechnicalDataSet[KI_VENTED_PRESSURE_I] * lError; |
Clancy_SENDSOR | 2:5828e6917e75 | 1818 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1819 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1820 | lIntegralTerm = (int32_t)(uiTechnicalDataSet[KI_VENTED_PRESSURE_I]>>2) * lError; |
Clancy_SENDSOR | 2:5828e6917e75 | 1821 | uiPWMatTheEndOfInspiration=uiExpirationBlowerPWMTec; |
Clancy_SENDSOR | 2:5828e6917e75 | 1822 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1823 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1824 | // Close loop in pressure |
Clancy_SENDSOR | 2:5828e6917e75 | 1825 | if ((lIntegral_Pressure_I>=0) && (lIntegralTerm>=0) && (bMaxPIOutputPressureI==FALSE)) |
Clancy_SENDSOR | 2:5828e6917e75 | 1826 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1827 | if ((lIntegral_Pressure_I + lIntegralTerm) <0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1828 | lIntegral_Pressure_I = INTEGRAL_MAX; |
Clancy_SENDSOR | 2:5828e6917e75 | 1829 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1830 | lIntegral_Pressure_I += lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 1831 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1832 | else if ((lIntegral_Pressure_I<=0) && (lIntegralTerm<=0) && (bMinPIOutputPressureI==FALSE)) |
Clancy_SENDSOR | 2:5828e6917e75 | 1833 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1834 | if ((lIntegral_Pressure_I + lIntegralTerm)>0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1835 | lIntegral_Pressure_I = INTEGRAL_MIN; |
Clancy_SENDSOR | 2:5828e6917e75 | 1836 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1837 | lIntegral_Pressure_I += lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 1838 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1839 | else if ((lIntegral_Pressure_I<=0) && (lIntegralTerm>=0)) |
Clancy_SENDSOR | 2:5828e6917e75 | 1840 | lIntegral_Pressure_I += lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 1841 | else if ((lIntegral_Pressure_I>=0) && (lIntegralTerm<=0)) |
Clancy_SENDSOR | 2:5828e6917e75 | 1842 | lIntegral_Pressure_I += lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 1843 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1844 | lPropTerm = (int32_t)uiTechnicalDataSet[KP_VENTED_PRESSURE_I] * lError; |
Clancy_SENDSOR | 2:5828e6917e75 | 1845 | lOutputPressure = (lIntegral_Pressure_I>>16) + (lPropTerm>>13); |
Clancy_SENDSOR | 2:5828e6917e75 | 1846 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1847 | // Add constante value (PWM at the end of the previous inspiration) |
Clancy_SENDSOR | 2:5828e6917e75 | 1848 | lOutputPressure+=uiPWMatTheEndOfInspiration; |
Clancy_SENDSOR | 2:5828e6917e75 | 1849 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1850 | if (fAlarmPmax==TRUE || fAlarmVtiMax==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 1851 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1852 | bMaxPIOutputPressureI = TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 1853 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1854 | else if (lOutputPressure>=((int32_t)MAX_VOLTAGE_REF)) |
Clancy_SENDSOR | 2:5828e6917e75 | 1855 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1856 | bMaxPIOutputPressureI = TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 1857 | uiInspirationBlowerPWMTec=MAX_VOLTAGE_REF; |
Clancy_SENDSOR | 2:5828e6917e75 | 1858 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1859 | else if (lOutputPressure<((int32_t)MIN_VOLTAGE_REF)) |
Clancy_SENDSOR | 2:5828e6917e75 | 1860 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1861 | bMinPIOutputPressureI = TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 1862 | uiInspirationBlowerPWMTec=MIN_VOLTAGE_REF; |
Clancy_SENDSOR | 2:5828e6917e75 | 1863 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1864 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1865 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1866 | bMaxPIOutputPressureI = FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 1867 | bMinPIOutputPressureI = FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 1868 | uiInspirationBlowerPWMTec = lOutputPressure; |
Clancy_SENDSOR | 2:5828e6917e75 | 1869 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1870 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1871 | // Update Blower Speed |
Clancy_SENDSOR | 2:5828e6917e75 | 1872 | SS_Xputdw(mdrv, uiInspirationBlowerPWMTec); |
Clancy_SENDSOR | 2:5828e6917e75 | 1873 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1874 | // ************************ CYCLE MANAGEMENT ********************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 1875 | uiTiD++; |
Clancy_SENDSOR | 2:5828e6917e75 | 1876 | if ((uiTiD>=uiTiMax) || |
Clancy_SENDSOR | 2:5828e6917e75 | 1877 | (TestTriggerExpiratoire(uiVentilationSet[TRIG_E_SET], uiVentilationSet[PS_SET])==TRUE && uiTiD>uiVentilationSet[TI_MIN_SET] && bPSMode==TRUE) || |
Clancy_SENDSOR | 2:5828e6917e75 | 1878 | (fAlarmPmax==TRUE && uiTiD>uiTiMin) || |
Clancy_SENDSOR | 2:5828e6917e75 | 1879 | (fAlarmVtiMax==TRUE && uiTiD>uiTiMin)) |
Clancy_SENDSOR | 2:5828e6917e75 | 1880 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1881 | // Beginning of the expiration |
Clancy_SENDSOR | 2:5828e6917e75 | 1882 | if (fAlarmPmax==FALSE && fAlarmVtiMax==FALSE) |
Clancy_SENDSOR | 2:5828e6917e75 | 1883 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1884 | fFirstCycleInspi=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 1885 | uiPWMatTheEndOfInspiration=uiInspirationBlowerPWMTec; |
Clancy_SENDSOR | 2:5828e6917e75 | 1886 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1887 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1888 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1889 | fFirstCycleInspi=TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 1890 | uiPWMatTheEndOfInspiration=MIN_VOLTAGE_REF; |
Clancy_SENDSOR | 2:5828e6917e75 | 1891 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1892 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1893 | ucVentilationCycle=EXPIRATION_CYCLE; |
Clancy_SENDSOR | 2:5828e6917e75 | 1894 | uiTiD=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1895 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1896 | // Reset PI variables for next inspiration |
Clancy_SENDSOR | 2:5828e6917e75 | 1897 | lIntegral_Pressure_E=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1898 | bMaxPIOutputPressureE=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 1899 | bMinPIOutputPressureE=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 1900 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1901 | fFirstCycleExpi=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 1902 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1903 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1904 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1905 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1906 | // --------------------------------------------------------------------------- |
Clancy_SENDSOR | 2:5828e6917e75 | 1907 | // - EXPIRATION - |
Clancy_SENDSOR | 2:5828e6917e75 | 1908 | // --------------------------------------------------------------------------- |
Clancy_SENDSOR | 2:5828e6917e75 | 1909 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1910 | // *************************** UPDATE SETTINGS ******************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 1911 | if (ApplyNewVentilationMode()==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 1912 | return; |
Clancy_SENDSOR | 2:5828e6917e75 | 1913 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1914 | // ******************** MAIN BLOWER MANAGEMENT ******************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 1915 | if (uiVentilationSet[PEEP_SET]==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1916 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1917 | uiExpirationBlowerPWMTec=MIN_VOLTAGE_REF; |
Clancy_SENDSOR | 2:5828e6917e75 | 1918 | SS_Xputdw(mdrv, uiExpirationBlowerPWMTec); |
Clancy_SENDSOR | 2:5828e6917e75 | 1919 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1920 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1921 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1922 | if (uiTeD==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1923 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1924 | // First blower current setting |
Clancy_SENDSOR | 2:5828e6917e75 | 1925 | uiEpapSettingTemp=uiVentilationSet[PI_SET]-2; // Slope of 5ms/hPa => 0.2hPa/ms |
Clancy_SENDSOR | 2:5828e6917e75 | 1926 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1927 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1928 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1929 | // we increase the speed of the blower every 1ms |
Clancy_SENDSOR | 2:5828e6917e75 | 1930 | uiEpapSettingTemp-=2; // Slope of 5ms/hPa => 0.2hPa/ms |
Clancy_SENDSOR | 2:5828e6917e75 | 1931 | if (uiEpapSettingTemp<uiVentilationSet[PEEP_SET]) |
Clancy_SENDSOR | 2:5828e6917e75 | 1932 | uiEpapSettingTemp=uiVentilationSet[PEEP_SET]; |
Clancy_SENDSOR | 2:5828e6917e75 | 1933 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1934 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1935 | // Barometric Mode : error computation |
Clancy_SENDSOR | 2:5828e6917e75 | 1936 | if (fFirstCycleExpi==FALSE) |
Clancy_SENDSOR | 2:5828e6917e75 | 1937 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1938 | lError=(int32_t)uiEpapSettingTemp-(int32_t)uiProximalPressureMes; |
Clancy_SENDSOR | 2:5828e6917e75 | 1939 | lIntegralTerm = (int32_t)uiTechnicalDataSet[KI_VENTED_PRESSURE_E] * lError; |
Clancy_SENDSOR | 2:5828e6917e75 | 1940 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1941 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1942 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1943 | lError=(int32_t)uiVentilationSet[PEEP_SET]-(int32_t)uiProximalPressureMes; |
Clancy_SENDSOR | 2:5828e6917e75 | 1944 | lIntegralTerm = (int32_t)(uiTechnicalDataSet[KI_VENTED_PRESSURE_E]>>2) * lError; |
Clancy_SENDSOR | 2:5828e6917e75 | 1945 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1946 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1947 | // Close loop in pressure |
Clancy_SENDSOR | 2:5828e6917e75 | 1948 | if ((lIntegral_Pressure_E>=0) && (lIntegralTerm>=0) && (bMaxPIOutputPressureE==FALSE)) |
Clancy_SENDSOR | 2:5828e6917e75 | 1949 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1950 | if ((lIntegral_Pressure_E + lIntegralTerm) <0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1951 | lIntegral_Pressure_E = INTEGRAL_MAX; |
Clancy_SENDSOR | 2:5828e6917e75 | 1952 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1953 | lIntegral_Pressure_E += lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 1954 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1955 | else if ((lIntegral_Pressure_E<=0) && (lIntegralTerm<=0) && (bMinPIOutputPressureE==FALSE)) |
Clancy_SENDSOR | 2:5828e6917e75 | 1956 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1957 | if ((lIntegral_Pressure_E + lIntegralTerm)>0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1958 | lIntegral_Pressure_E = INTEGRAL_MIN; |
Clancy_SENDSOR | 2:5828e6917e75 | 1959 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1960 | lIntegral_Pressure_E += lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 1961 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1962 | else if ((lIntegral_Pressure_E<=0) && (lIntegralTerm>=0)) |
Clancy_SENDSOR | 2:5828e6917e75 | 1963 | lIntegral_Pressure_E += lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 1964 | else if ((lIntegral_Pressure_E>=0) && (lIntegralTerm<=0)) |
Clancy_SENDSOR | 2:5828e6917e75 | 1965 | lIntegral_Pressure_E += lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 1966 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1967 | lPropTerm = (int32_t)uiTechnicalDataSet[KP_VENTED_PRESSURE_E] * lError; |
Clancy_SENDSOR | 2:5828e6917e75 | 1968 | lOutputPressure = (lIntegral_Pressure_E>>16) + (lPropTerm>>13); |
Clancy_SENDSOR | 2:5828e6917e75 | 1969 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1970 | // Add constante value (PWM at the end of the previous expiration) |
Clancy_SENDSOR | 2:5828e6917e75 | 1971 | lOutputPressure+=uiPWMatTheEndOfExpiration; |
Clancy_SENDSOR | 2:5828e6917e75 | 1972 | |
Clancy_SENDSOR | 2:5828e6917e75 | 1973 | // Flow limiting |
Clancy_SENDSOR | 2:5828e6917e75 | 1974 | uiFlowMaxInExpi=uiMaximumFlowInExpiration[uiVentilationSet[PS_CPAP_SET]/10]; |
Clancy_SENDSOR | 2:5828e6917e75 | 1975 | if (lError>5 && iBlowerFlowSmoothingMes>(int16_t)uiFlowMaxInExpi) |
Clancy_SENDSOR | 2:5828e6917e75 | 1976 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1977 | // Impossible to maintain the peep (patient disconnection) |
Clancy_SENDSOR | 2:5828e6917e75 | 1978 | if (uiDisconnectionTime==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 1979 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1980 | fBlockCloseLoop=TRUE; // Block the close loop |
Clancy_SENDSOR | 2:5828e6917e75 | 1981 | if (uiMemoPWMDuringDisconnection!=0) // Apply a fixed PWM value |
Clancy_SENDSOR | 2:5828e6917e75 | 1982 | uiExpirationBlowerPWMTec=uiMemoPWMDuringDisconnection; |
Clancy_SENDSOR | 2:5828e6917e75 | 1983 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1984 | uiExpirationBlowerPWMTec=MIN_VOLTAGE_REF; |
Clancy_SENDSOR | 2:5828e6917e75 | 1985 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1986 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 1987 | uiDisconnectionTime--; |
Clancy_SENDSOR | 2:5828e6917e75 | 1988 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 1989 | else if (iBlowerFlowSmoothingMes<(int16_t)uiFlowMaxInExpi && (lError>(-2) && lError<2)) |
Clancy_SENDSOR | 2:5828e6917e75 | 1990 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1991 | // Good pressure : no disconnection |
Clancy_SENDSOR | 2:5828e6917e75 | 1992 | uiDisconnectionTime=EXPIRATORY_DISCONNECTION_TIME_OUT; |
Clancy_SENDSOR | 2:5828e6917e75 | 1993 | if (fBlockCloseLoop==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 1994 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 1995 | // The close loop was block before => unblock it |
Clancy_SENDSOR | 2:5828e6917e75 | 1996 | fBlockCloseLoop=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 1997 | lIntegral_Pressure_E=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 1998 | bMaxPIOutputPressureE = FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 1999 | bMinPIOutputPressureE = FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2000 | lOutputPressure=uiPWMatTheEndOfExpiration=uiExpirationBlowerPWMTec; |
Clancy_SENDSOR | 2:5828e6917e75 | 2001 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2002 | else if (iBlowerFlowSmoothingMes>=0) |
Clancy_SENDSOR | 2:5828e6917e75 | 2003 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2004 | // Record current PWM |
Clancy_SENDSOR | 2:5828e6917e75 | 2005 | uiMemoPWMDuringDisconnection=uiExpirationBlowerPWMTec; |
Clancy_SENDSOR | 2:5828e6917e75 | 2006 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2007 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2008 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2009 | // Unblock the close loop every 4s in case of none recorded PWM value |
Clancy_SENDSOR | 2:5828e6917e75 | 2010 | if (fBlockCloseLoop==TRUE && uiMemoPWMDuringDisconnection==0 && uiTeD==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 2011 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2012 | uiDisconnectionTime=EXPIRATORY_DISCONNECTION_TIME_OUT; |
Clancy_SENDSOR | 2:5828e6917e75 | 2013 | fBlockCloseLoop=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2014 | lIntegral_Pressure_E=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 2015 | bMaxPIOutputPressureE = FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2016 | bMinPIOutputPressureE = FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2017 | lOutputPressure=uiPWMatTheEndOfExpiration=uiExpirationBlowerPWMTec; |
Clancy_SENDSOR | 2:5828e6917e75 | 2018 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2019 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2020 | // Update blower PWM |
Clancy_SENDSOR | 2:5828e6917e75 | 2021 | if (fBlockCloseLoop==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 2022 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2023 | bMaxPIOutputPressureE = TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2024 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2025 | else if (lOutputPressure>=((int32_t)MAX_VOLTAGE_REF)) |
Clancy_SENDSOR | 2:5828e6917e75 | 2026 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2027 | bMaxPIOutputPressureE = TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2028 | uiExpirationBlowerPWMTec=MAX_VOLTAGE_REF; |
Clancy_SENDSOR | 2:5828e6917e75 | 2029 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2030 | else if (lOutputPressure<((int32_t)MIN_VOLTAGE_REF)) |
Clancy_SENDSOR | 2:5828e6917e75 | 2031 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2032 | bMinPIOutputPressureE = TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2033 | uiExpirationBlowerPWMTec=MIN_VOLTAGE_REF; |
Clancy_SENDSOR | 2:5828e6917e75 | 2034 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2035 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 2036 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2037 | bMaxPIOutputPressureE = FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2038 | bMinPIOutputPressureE = FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2039 | uiExpirationBlowerPWMTec = lOutputPressure; |
Clancy_SENDSOR | 2:5828e6917e75 | 2040 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2041 | SS_Xputdw(mdrv, uiExpirationBlowerPWMTec); |
Clancy_SENDSOR | 2:5828e6917e75 | 2042 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2043 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2044 | // Expiratory time |
Clancy_SENDSOR | 2:5828e6917e75 | 2045 | uiTeD++; |
Clancy_SENDSOR | 2:5828e6917e75 | 2046 | if (uiTeD>TE_SET_MAX) uiTeD=TE_SET_MAX; |
Clancy_SENDSOR | 2:5828e6917e75 | 2047 | if ((uiTeD>=uiTeBaroSet && bPSMode==FALSE) || TestInspiratoryTrigger(bPSMode, uiTeD, uiVentilationSet[TRIG_I_FLOW_SET])==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 2048 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2049 | ucVentilationCycle=INSPIRATION_CYCLE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2050 | uiTeD=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 2051 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2052 | // Record PWM value at the end of the expiration |
Clancy_SENDSOR | 2:5828e6917e75 | 2053 | uiPWMatTheEndOfExpiration=uiExpirationBlowerPWMTec; |
Clancy_SENDSOR | 2:5828e6917e75 | 2054 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2055 | // Reset PI variables for next inspiration |
Clancy_SENDSOR | 2:5828e6917e75 | 2056 | lIntegral_Pressure_I=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 2057 | bMaxPIOutputPressureI=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2058 | bMinPIOutputPressureI=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2059 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2060 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2061 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2062 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2063 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2064 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2065 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 2066 | * Function Name : ManageVolumetricVentilation |
Clancy_SENDSOR | 2:5828e6917e75 | 2067 | * Description : Manage Volumetric Ventilation |
Clancy_SENDSOR | 2:5828e6917e75 | 2068 | * Input : None |
Clancy_SENDSOR | 2:5828e6917e75 | 2069 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 2070 | * Return : None |
Clancy_SENDSOR | 2:5828e6917e75 | 2071 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 2072 | void ManageVolumetricVentilation(void) |
Clancy_SENDSOR | 2:5828e6917e75 | 2073 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2074 | int32_t lError; |
Clancy_SENDSOR | 2:5828e6917e75 | 2075 | int32_t lPropTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 2076 | int32_t lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 2077 | int32_t lOutputPressure; |
Clancy_SENDSOR | 2:5828e6917e75 | 2078 | int16_t iMaxVtAdjust; |
Clancy_SENDSOR | 2:5828e6917e75 | 2079 | u16 uiFlowMaxInExpi; |
Clancy_SENDSOR | 2:5828e6917e75 | 2080 | u16 uiTiMin; |
Clancy_SENDSOR | 2:5828e6917e75 | 2081 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2082 | if (ucVentilationCycle==INSPIRATION_CYCLE) |
Clancy_SENDSOR | 2:5828e6917e75 | 2083 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2084 | // --------------------------------------------------------------------------- |
Clancy_SENDSOR | 2:5828e6917e75 | 2085 | // - INSPIRATION - |
Clancy_SENDSOR | 2:5828e6917e75 | 2086 | // --------------------------------------------------------------------------- |
Clancy_SENDSOR | 2:5828e6917e75 | 2087 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2088 | // Compute Timin |
Clancy_SENDSOR | 2:5828e6917e75 | 2089 | if (uiPatientType==PATIENT_ADULT) |
Clancy_SENDSOR | 2:5828e6917e75 | 2090 | uiTiMin=TiVoluSet_A_MIN; |
Clancy_SENDSOR | 2:5828e6917e75 | 2091 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 2092 | uiTiMin=TiVoluSet_P_MIN; |
Clancy_SENDSOR | 2:5828e6917e75 | 2093 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2094 | // ************************** Main Blower MANAGEMENT ************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 2095 | if (uiTiD==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 2096 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2097 | // Compute Volume adjustment |
Clancy_SENDSOR | 2:5828e6917e75 | 2098 | if (fFirstCycleInspi==FALSE) |
Clancy_SENDSOR | 2:5828e6917e75 | 2099 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2100 | if ((uiFlagsAlarm[ALARM_FLAGS1]&HIGH_PRESSURE_ALARM_MASK)==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 2101 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2102 | if (ucCounterHPAlarm==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 2103 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2104 | iVtAdjust+=(((int16_t)uiVentilationSet[VT_SET]-(int16_t)uiRecordVtiMes>>1)); |
Clancy_SENDSOR | 2:5828e6917e75 | 2105 | if (iVtAdjust>0) |
Clancy_SENDSOR | 2:5828e6917e75 | 2106 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2107 | iMaxVtAdjust=(int16_t)(uiVentilationSet[VT_SET]>>1); // >0 |
Clancy_SENDSOR | 2:5828e6917e75 | 2108 | if (iVtAdjust>iMaxVtAdjust) |
Clancy_SENDSOR | 2:5828e6917e75 | 2109 | iVtAdjust=iMaxVtAdjust; |
Clancy_SENDSOR | 2:5828e6917e75 | 2110 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2111 | else if (iVtAdjust<0) |
Clancy_SENDSOR | 2:5828e6917e75 | 2112 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2113 | iMaxVtAdjust=(int16_t)(~(uiVentilationSet[VT_SET]>>1)+1); // <0 |
Clancy_SENDSOR | 2:5828e6917e75 | 2114 | if (iVtAdjust<iMaxVtAdjust) |
Clancy_SENDSOR | 2:5828e6917e75 | 2115 | iVtAdjust=iMaxVtAdjust; |
Clancy_SENDSOR | 2:5828e6917e75 | 2116 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2117 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2118 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 2119 | ucCounterHPAlarm--; |
Clancy_SENDSOR | 2:5828e6917e75 | 2120 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2121 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 2122 | ucCounterHPAlarm=1; |
Clancy_SENDSOR | 2:5828e6917e75 | 2123 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2124 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 2125 | iVtAdjust=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 2126 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2127 | ComputeInspiratoryFlowSetPointInAVC(uiPatientType, (u16)((int16_t)uiVentilationSet[VT_SET]+iVtAdjust), uiVentilationSet[TI_VOLU_SET], uiVentilationSet[SHAPE_SET], &ulMaxIFlowSet, &ulMinIFlowSet, &ulDecFlowStep); |
Clancy_SENDSOR | 2:5828e6917e75 | 2128 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2129 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 2130 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2131 | if (ulMaxIFlowSet>=ulDecFlowStep) |
Clancy_SENDSOR | 2:5828e6917e75 | 2132 | ulMaxIFlowSet-=ulDecFlowStep; |
Clancy_SENDSOR | 2:5828e6917e75 | 2133 | if (ulMaxIFlowSet<ulMinIFlowSet) |
Clancy_SENDSOR | 2:5828e6917e75 | 2134 | ulMaxIFlowSet=ulMinIFlowSet; |
Clancy_SENDSOR | 2:5828e6917e75 | 2135 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2136 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2137 | // Volumetric Mode : error computation |
Clancy_SENDSOR | 2:5828e6917e75 | 2138 | //lError=(int32_t)(ulMaxIFlowSet/100)-iBlowerFlowMes; |
Clancy_SENDSOR | 2:5828e6917e75 | 2139 | lError=(int32_t)(ulMaxIFlowSet/100)-iBlowerFlowSmoothingMes; |
Clancy_SENDSOR | 2:5828e6917e75 | 2140 | if (fFirstCycleInspi==FALSE) |
Clancy_SENDSOR | 2:5828e6917e75 | 2141 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2142 | if (ulMaxIFlowSet<150000 && uiTiD>30000) |
Clancy_SENDSOR | 2:5828e6917e75 | 2143 | lIntegralTerm = (int32_t)(uiTechnicalDataSet[KI_FLOW_I]>>1) * lError; |
Clancy_SENDSOR | 2:5828e6917e75 | 2144 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 2145 | lIntegralTerm = (int32_t)uiTechnicalDataSet[KI_FLOW_I] * lError; |
Clancy_SENDSOR | 2:5828e6917e75 | 2146 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2147 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 2148 | lIntegralTerm = (int32_t)(uiTechnicalDataSet[KI_FLOW_I]>>2) * lError; |
Clancy_SENDSOR | 2:5828e6917e75 | 2149 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2150 | // Close loop in pressure or flow (PI) |
Clancy_SENDSOR | 2:5828e6917e75 | 2151 | if ((lIntegral_Flow_I>=0) && (lIntegralTerm>=0) && (bMaxPIOutputFlowI==FALSE)) |
Clancy_SENDSOR | 2:5828e6917e75 | 2152 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2153 | if ((lIntegral_Flow_I + lIntegralTerm) <0) |
Clancy_SENDSOR | 2:5828e6917e75 | 2154 | lIntegral_Flow_I = INTEGRAL_MAX; |
Clancy_SENDSOR | 2:5828e6917e75 | 2155 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 2156 | lIntegral_Flow_I += lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 2157 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2158 | else if ((lIntegral_Flow_I<=0) && (lIntegralTerm<=0) && (bMinPIOutputFlowI==FALSE)) |
Clancy_SENDSOR | 2:5828e6917e75 | 2159 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2160 | if ((lIntegral_Flow_I + lIntegralTerm)>0) |
Clancy_SENDSOR | 2:5828e6917e75 | 2161 | lIntegral_Flow_I = INTEGRAL_MIN; |
Clancy_SENDSOR | 2:5828e6917e75 | 2162 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 2163 | lIntegral_Flow_I += lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 2164 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2165 | else if ((lIntegral_Flow_I<=0) && (lIntegralTerm>=0)) |
Clancy_SENDSOR | 2:5828e6917e75 | 2166 | lIntegral_Flow_I += lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 2167 | else if ((lIntegral_Flow_I>=0) && (lIntegralTerm<=0)) |
Clancy_SENDSOR | 2:5828e6917e75 | 2168 | lIntegral_Flow_I += lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 2169 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2170 | lPropTerm = (int32_t)uiTechnicalDataSet[KP_FLOW_I] * lError; |
Clancy_SENDSOR | 2:5828e6917e75 | 2171 | lOutputPressure = (lIntegral_Flow_I>>16) + (lPropTerm>>13); |
Clancy_SENDSOR | 2:5828e6917e75 | 2172 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2173 | // Add constante value (PWM at the end of the previous inspiration) |
Clancy_SENDSOR | 2:5828e6917e75 | 2174 | lOutputPressure+=uiPWMatTheEndOfExpiration; |
Clancy_SENDSOR | 2:5828e6917e75 | 2175 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2176 | if (lOutputPressure>=((int32_t)MAX_VOLTAGE_REF)) |
Clancy_SENDSOR | 2:5828e6917e75 | 2177 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2178 | bMaxPIOutputFlowI = TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2179 | uiInspirationBlowerPWMTec=MAX_VOLTAGE_REF; |
Clancy_SENDSOR | 2:5828e6917e75 | 2180 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2181 | else if (lOutputPressure<((int32_t)MIN_VOLTAGE_REF)) |
Clancy_SENDSOR | 2:5828e6917e75 | 2182 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2183 | bMinPIOutputFlowI = TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2184 | uiInspirationBlowerPWMTec=MIN_VOLTAGE_REF; |
Clancy_SENDSOR | 2:5828e6917e75 | 2185 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2186 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 2187 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2188 | bMaxPIOutputFlowI = FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2189 | bMinPIOutputFlowI = FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2190 | uiInspirationBlowerPWMTec = lOutputPressure; |
Clancy_SENDSOR | 2:5828e6917e75 | 2191 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2192 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2193 | // Update Blower Speed |
Clancy_SENDSOR | 2:5828e6917e75 | 2194 | SS_Xputdw(mdrv, uiInspirationBlowerPWMTec); |
Clancy_SENDSOR | 2:5828e6917e75 | 2195 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2196 | // ************************ CYCLE MANAGEMENT ********************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 2197 | uiTiD++; |
Clancy_SENDSOR | 2:5828e6917e75 | 2198 | if ((uiTiD>=uiVentilationSet[TI_VOLU_SET]) || |
Clancy_SENDSOR | 2:5828e6917e75 | 2199 | (fAlarmPmax==TRUE && uiTiD>uiTiMin)) |
Clancy_SENDSOR | 2:5828e6917e75 | 2200 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2201 | // Beginning of the expiration |
Clancy_SENDSOR | 2:5828e6917e75 | 2202 | uiPWMatTheEndOfInspiration=uiInspirationBlowerPWMTec; |
Clancy_SENDSOR | 2:5828e6917e75 | 2203 | uiProximalPressureAtTheEndOfInspiration=uiProximalPressureMes; |
Clancy_SENDSOR | 2:5828e6917e75 | 2204 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2205 | ucVentilationCycle=EXPIRATION_CYCLE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2206 | uiTiD=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 2207 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2208 | // Reset PI variables for next inspiration |
Clancy_SENDSOR | 2:5828e6917e75 | 2209 | lIntegral_Pressure_E=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 2210 | bMaxPIOutputPressureE=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2211 | bMinPIOutputPressureE=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2212 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2213 | fFirstCycleExpi=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2214 | fFirstCycleInspi=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2215 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2216 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2217 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 2218 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2219 | // --------------------------------------------------------------------------- |
Clancy_SENDSOR | 2:5828e6917e75 | 2220 | // - EXPIRATION - |
Clancy_SENDSOR | 2:5828e6917e75 | 2221 | // --------------------------------------------------------------------------- |
Clancy_SENDSOR | 2:5828e6917e75 | 2222 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2223 | // *************************** UPDATE SETTINGS ******************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 2224 | if (ApplyNewVentilationMode()==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 2225 | return; |
Clancy_SENDSOR | 2:5828e6917e75 | 2226 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2227 | // ******************** MAIN BLOWER MANAGEMENT ******************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 2228 | if (uiVentilationSet[PEEP_SET]==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 2229 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2230 | uiExpirationBlowerPWMTec=MIN_VOLTAGE_REF; |
Clancy_SENDSOR | 2:5828e6917e75 | 2231 | SS_Xputdw(mdrv, uiExpirationBlowerPWMTec); |
Clancy_SENDSOR | 2:5828e6917e75 | 2232 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2233 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 2234 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2235 | if (uiTeD==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 2236 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2237 | // First blower pressure setting |
Clancy_SENDSOR | 2:5828e6917e75 | 2238 | if (uiProximalPressureAtTheEndOfInspiration<uiVentilationSet[PEEP_SET]) |
Clancy_SENDSOR | 2:5828e6917e75 | 2239 | uiEpapSettingTemp=uiVentilationSet[PEEP_SET]; |
Clancy_SENDSOR | 2:5828e6917e75 | 2240 | else if (uiProximalPressureAtTheEndOfInspiration>=2) |
Clancy_SENDSOR | 2:5828e6917e75 | 2241 | uiEpapSettingTemp=uiProximalPressureAtTheEndOfInspiration-2; // Slope of 5ms/hPa => 0.2hPa/ms |
Clancy_SENDSOR | 2:5828e6917e75 | 2242 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 2243 | uiEpapSettingTemp=uiVentilationSet[PEEP_SET]; |
Clancy_SENDSOR | 2:5828e6917e75 | 2244 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2245 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 2246 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2247 | // we decrease the speed of the blower every 1ms |
Clancy_SENDSOR | 2:5828e6917e75 | 2248 | if (uiEpapSettingTemp>=2) |
Clancy_SENDSOR | 2:5828e6917e75 | 2249 | uiEpapSettingTemp-=2; // Slope of 5ms/hPa => 0.2hPa/ms |
Clancy_SENDSOR | 2:5828e6917e75 | 2250 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2251 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2252 | // Pressure set point limitation |
Clancy_SENDSOR | 2:5828e6917e75 | 2253 | if (uiEpapSettingTemp<uiVentilationSet[PEEP_SET]) |
Clancy_SENDSOR | 2:5828e6917e75 | 2254 | uiEpapSettingTemp=uiVentilationSet[PEEP_SET]; |
Clancy_SENDSOR | 2:5828e6917e75 | 2255 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2256 | // Barometric Mode : error computation |
Clancy_SENDSOR | 2:5828e6917e75 | 2257 | if (fFirstCycleExpi==FALSE) |
Clancy_SENDSOR | 2:5828e6917e75 | 2258 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2259 | lError=(int32_t)uiEpapSettingTemp-(int32_t)uiProximalPressureMes; |
Clancy_SENDSOR | 2:5828e6917e75 | 2260 | lIntegralTerm = (int32_t)uiTechnicalDataSet[KI_VENTED_PRESSURE_E] * lError; |
Clancy_SENDSOR | 2:5828e6917e75 | 2261 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2262 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 2263 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2264 | lError=(int32_t)uiVentilationSetTemp[PEEP_SET]-(int32_t)uiProximalPressureMes; |
Clancy_SENDSOR | 2:5828e6917e75 | 2265 | lIntegralTerm = (int32_t)(uiTechnicalDataSet[KI_VENTED_PRESSURE_E]>>2) * lError; |
Clancy_SENDSOR | 2:5828e6917e75 | 2266 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2267 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2268 | // Close loop in pressure |
Clancy_SENDSOR | 2:5828e6917e75 | 2269 | if ((lIntegral_Pressure_E>=0) && (lIntegralTerm>=0) && (bMaxPIOutputPressureE==FALSE)) |
Clancy_SENDSOR | 2:5828e6917e75 | 2270 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2271 | if ((lIntegral_Pressure_E + lIntegralTerm) <0) |
Clancy_SENDSOR | 2:5828e6917e75 | 2272 | lIntegral_Pressure_E = INTEGRAL_MAX; |
Clancy_SENDSOR | 2:5828e6917e75 | 2273 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 2274 | lIntegral_Pressure_E += lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 2275 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2276 | else if ((lIntegral_Pressure_E<=0) && (lIntegralTerm<=0) && (bMinPIOutputPressureE==FALSE)) |
Clancy_SENDSOR | 2:5828e6917e75 | 2277 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2278 | if ((lIntegral_Pressure_E + lIntegralTerm)>0) |
Clancy_SENDSOR | 2:5828e6917e75 | 2279 | lIntegral_Pressure_E = INTEGRAL_MIN; |
Clancy_SENDSOR | 2:5828e6917e75 | 2280 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 2281 | lIntegral_Pressure_E += lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 2282 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2283 | else if ((lIntegral_Pressure_E<=0) && (lIntegralTerm>=0)) |
Clancy_SENDSOR | 2:5828e6917e75 | 2284 | lIntegral_Pressure_E += lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 2285 | else if ((lIntegral_Pressure_E>=0) && (lIntegralTerm<=0)) |
Clancy_SENDSOR | 2:5828e6917e75 | 2286 | lIntegral_Pressure_E += lIntegralTerm; |
Clancy_SENDSOR | 2:5828e6917e75 | 2287 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2288 | lPropTerm = (int32_t)uiTechnicalDataSet[KP_VENTED_PRESSURE_E] * lError; |
Clancy_SENDSOR | 2:5828e6917e75 | 2289 | lOutputPressure = (lIntegral_Pressure_E>>16) + (lPropTerm>>13); |
Clancy_SENDSOR | 2:5828e6917e75 | 2290 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2291 | // Add constante value (PWM at the end of the previous expiration) |
Clancy_SENDSOR | 2:5828e6917e75 | 2292 | lOutputPressure+=uiPWMatTheEndOfExpiration; |
Clancy_SENDSOR | 2:5828e6917e75 | 2293 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2294 | // Flow limiting |
Clancy_SENDSOR | 2:5828e6917e75 | 2295 | uiFlowMaxInExpi=uiMaximumFlowInExpiration[uiVentilationSet[PS_CPAP_SET]/10]; |
Clancy_SENDSOR | 2:5828e6917e75 | 2296 | if (lError>5 && iBlowerFlowSmoothingMes>(int16_t)uiFlowMaxInExpi) |
Clancy_SENDSOR | 2:5828e6917e75 | 2297 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2298 | // Impossible to maintain the peep (patient disconnection) |
Clancy_SENDSOR | 2:5828e6917e75 | 2299 | if (uiDisconnectionTime==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 2300 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2301 | fBlockCloseLoop=TRUE; // Block the close loop |
Clancy_SENDSOR | 2:5828e6917e75 | 2302 | if (uiMemoPWMDuringDisconnection!=0) // Apply a fixed PWM value |
Clancy_SENDSOR | 2:5828e6917e75 | 2303 | uiExpirationBlowerPWMTec=uiMemoPWMDuringDisconnection; |
Clancy_SENDSOR | 2:5828e6917e75 | 2304 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 2305 | uiExpirationBlowerPWMTec=MIN_VOLTAGE_REF; |
Clancy_SENDSOR | 2:5828e6917e75 | 2306 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2307 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 2308 | uiDisconnectionTime--; |
Clancy_SENDSOR | 2:5828e6917e75 | 2309 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2310 | else if (iBlowerFlowSmoothingMes<(int16_t)uiFlowMaxInExpi && (lError>(-2) && lError<2)) |
Clancy_SENDSOR | 2:5828e6917e75 | 2311 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2312 | // Good pressure : no disconnection |
Clancy_SENDSOR | 2:5828e6917e75 | 2313 | uiDisconnectionTime=EXPIRATORY_DISCONNECTION_TIME_OUT; |
Clancy_SENDSOR | 2:5828e6917e75 | 2314 | if (fBlockCloseLoop==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 2315 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2316 | // The close loop was block before => unblock it |
Clancy_SENDSOR | 2:5828e6917e75 | 2317 | fBlockCloseLoop=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2318 | lIntegral_Pressure_E=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 2319 | bMaxPIOutputPressureE = FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2320 | bMinPIOutputPressureE = FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2321 | lOutputPressure=uiPWMatTheEndOfExpiration=uiExpirationBlowerPWMTec; |
Clancy_SENDSOR | 2:5828e6917e75 | 2322 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2323 | else if (iBlowerFlowSmoothingMes>=0) |
Clancy_SENDSOR | 2:5828e6917e75 | 2324 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2325 | // Record current PWM |
Clancy_SENDSOR | 2:5828e6917e75 | 2326 | uiMemoPWMDuringDisconnection=uiExpirationBlowerPWMTec; |
Clancy_SENDSOR | 2:5828e6917e75 | 2327 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2328 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2329 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2330 | // Unblock the close loop every 4s in case of none recorded PWM value |
Clancy_SENDSOR | 2:5828e6917e75 | 2331 | if (fBlockCloseLoop==TRUE && uiMemoPWMDuringDisconnection==0 && uiTeD==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 2332 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2333 | uiDisconnectionTime=EXPIRATORY_DISCONNECTION_TIME_OUT; |
Clancy_SENDSOR | 2:5828e6917e75 | 2334 | fBlockCloseLoop=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2335 | lIntegral_Pressure_E=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 2336 | bMaxPIOutputPressureE = FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2337 | bMinPIOutputPressureE = FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2338 | lOutputPressure=uiPWMatTheEndOfExpiration=uiExpirationBlowerPWMTec; |
Clancy_SENDSOR | 2:5828e6917e75 | 2339 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2340 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2341 | // Update blower PWM |
Clancy_SENDSOR | 2:5828e6917e75 | 2342 | if (fBlockCloseLoop==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 2343 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2344 | bMaxPIOutputPressureE = TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2345 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2346 | else if (lOutputPressure>=((int32_t)MAX_VOLTAGE_REF)) |
Clancy_SENDSOR | 2:5828e6917e75 | 2347 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2348 | bMaxPIOutputPressureE = TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2349 | uiExpirationBlowerPWMTec=MAX_VOLTAGE_REF; |
Clancy_SENDSOR | 2:5828e6917e75 | 2350 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2351 | else if (lOutputPressure<((int32_t)MIN_VOLTAGE_REF)) |
Clancy_SENDSOR | 2:5828e6917e75 | 2352 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2353 | bMinPIOutputPressureE = TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2354 | uiExpirationBlowerPWMTec=MIN_VOLTAGE_REF; |
Clancy_SENDSOR | 2:5828e6917e75 | 2355 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2356 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 2357 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2358 | bMaxPIOutputPressureE = FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2359 | bMinPIOutputPressureE = FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2360 | uiExpirationBlowerPWMTec = lOutputPressure; |
Clancy_SENDSOR | 2:5828e6917e75 | 2361 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2362 | // Update Blower Speed |
Clancy_SENDSOR | 2:5828e6917e75 | 2363 | SS_Xputdw(mdrv, uiExpirationBlowerPWMTec); |
Clancy_SENDSOR | 2:5828e6917e75 | 2364 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2365 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2366 | // Expiratory time |
Clancy_SENDSOR | 2:5828e6917e75 | 2367 | uiTeD++; |
Clancy_SENDSOR | 2:5828e6917e75 | 2368 | if (uiTeD>=uiTeVoluSet || TestInspiratoryTrigger(FALSE, uiTeD, uiVentilationSet[TRIG_I_FLOW_SET])==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 2369 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2370 | ucVentilationCycle=INSPIRATION_CYCLE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2371 | uiTeD=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 2372 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2373 | // Record PWM value at the end of the expiration |
Clancy_SENDSOR | 2:5828e6917e75 | 2374 | if (fBlockCloseLoop==FALSE) |
Clancy_SENDSOR | 2:5828e6917e75 | 2375 | uiPWMatTheEndOfExpiration=uiExpirationBlowerPWMTec; |
Clancy_SENDSOR | 2:5828e6917e75 | 2376 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 2377 | uiPWMatTheEndOfExpiration=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 2378 | fBlockCloseLoop=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2379 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2380 | // Reset PI variables for next inspiration |
Clancy_SENDSOR | 2:5828e6917e75 | 2381 | lIntegral_Flow_I=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 2382 | bMaxPIOutputFlowI=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2383 | bMinPIOutputFlowI=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2384 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2385 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2386 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2387 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2388 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2389 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2390 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 2391 | * Function Name : LaunchTherapyEngine |
Clancy_SENDSOR | 2:5828e6917e75 | 2392 | * Description : Select and launch the therapy engine |
Clancy_SENDSOR | 2:5828e6917e75 | 2393 | * Input : None |
Clancy_SENDSOR | 2:5828e6917e75 | 2394 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 2395 | * Return : None |
Clancy_SENDSOR | 2:5828e6917e75 | 2396 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 2397 | void LaunchTherapyEngine(void) |
Clancy_SENDSOR | 2:5828e6917e75 | 2398 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2399 | if (bMemoStartVentilation==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 2400 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2401 | // ---- Check new configuration |
Clancy_SENDSOR | 2:5828e6917e75 | 2402 | if (uiTechnicalDataSet[DEVICE_MODE_TEC]!=uiPreviousDeviceMode) |
Clancy_SENDSOR | 2:5828e6917e75 | 2403 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2404 | UpdateSettings(); |
Clancy_SENDSOR | 2:5828e6917e75 | 2405 | enPreviousMode=NUMBER_OF_MODE; // Force full init of the variables |
Clancy_SENDSOR | 2:5828e6917e75 | 2406 | InitVentilation(); |
Clancy_SENDSOR | 2:5828e6917e75 | 2407 | uiPreviousDeviceMode=uiTechnicalDataSet[DEVICE_MODE_TEC]; |
Clancy_SENDSOR | 2:5828e6917e75 | 2408 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2409 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2410 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2411 | switch(uiTechnicalDataSet[DEVICE_MODE_TEC]) |
Clancy_SENDSOR | 2:5828e6917e75 | 2412 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2413 | default: |
Clancy_SENDSOR | 2:5828e6917e75 | 2414 | case VENTILATION_MODE: |
Clancy_SENDSOR | 2:5828e6917e75 | 2415 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2416 | if (enVentilationMode==PS_MODE) |
Clancy_SENDSOR | 2:5828e6917e75 | 2417 | ManagePACVVentilation(TRUE); |
Clancy_SENDSOR | 2:5828e6917e75 | 2418 | else if (enVentilationMode==APCV_MODE) |
Clancy_SENDSOR | 2:5828e6917e75 | 2419 | ManagePACVVentilation(FALSE); |
Clancy_SENDSOR | 2:5828e6917e75 | 2420 | else if (enVentilationMode==AVC_MODE) |
Clancy_SENDSOR | 2:5828e6917e75 | 2421 | ManageVolumetricVentilation(); |
Clancy_SENDSOR | 2:5828e6917e75 | 2422 | else if (enVentilationMode==CPAP_MODE) |
Clancy_SENDSOR | 2:5828e6917e75 | 2423 | ManageCPAPVentilation(); |
Clancy_SENDSOR | 2:5828e6917e75 | 2424 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 2425 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2426 | case ONE_CST_PWM_MODE: |
Clancy_SENDSOR | 2:5828e6917e75 | 2427 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2428 | ManageOneCstPWM(); |
Clancy_SENDSOR | 2:5828e6917e75 | 2429 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 2430 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2431 | case TWO_CST_PWM_MODE: |
Clancy_SENDSOR | 2:5828e6917e75 | 2432 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2433 | Manage2CstPWM(); |
Clancy_SENDSOR | 2:5828e6917e75 | 2434 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 2435 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2436 | case CST_SPEED_MODE: |
Clancy_SENDSOR | 2:5828e6917e75 | 2437 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2438 | ManageCstSpeed(); |
Clancy_SENDSOR | 2:5828e6917e75 | 2439 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 2440 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2441 | case FLOW_CAL_MODE: |
Clancy_SENDSOR | 2:5828e6917e75 | 2442 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2443 | ManageFlowCalibration(); |
Clancy_SENDSOR | 2:5828e6917e75 | 2444 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 2445 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2446 | case PRESSURE_CAL_MODE: |
Clancy_SENDSOR | 2:5828e6917e75 | 2447 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2448 | ManagePressureCalibration(); |
Clancy_SENDSOR | 2:5828e6917e75 | 2449 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 2450 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2451 | case PRESSURE_CST_MODE: |
Clancy_SENDSOR | 2:5828e6917e75 | 2452 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2453 | ManageCstPressure(); |
Clancy_SENDSOR | 2:5828e6917e75 | 2454 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 2455 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2456 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2457 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2458 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2459 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2460 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2461 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 2462 | * Function Name : StartStopVentilation |
Clancy_SENDSOR | 2:5828e6917e75 | 2463 | * Description : Detect a start/stop ventilation request |
Clancy_SENDSOR | 2:5828e6917e75 | 2464 | * Input : None |
Clancy_SENDSOR | 2:5828e6917e75 | 2465 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 2466 | * Return : None |
Clancy_SENDSOR | 2:5828e6917e75 | 2467 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 2468 | void StartStopVentilation(void) |
Clancy_SENDSOR | 2:5828e6917e75 | 2469 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2470 | #ifndef TEMPERATURE_TRENDS |
Clancy_SENDSOR | 2:5828e6917e75 | 2471 | opstatus_t byOpStatus; |
Clancy_SENDSOR | 2:5828e6917e75 | 2472 | #endif |
Clancy_SENDSOR | 2:5828e6917e75 | 2473 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2474 | // Check if an alarm must stop the ventilation |
Clancy_SENDSOR | 2:5828e6917e75 | 2475 | ucStopVentilationAlarmNumber=ReadStopVentilationAlarmNumber(); |
Clancy_SENDSOR | 2:5828e6917e75 | 2476 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2477 | #ifndef TEMPERATURE_TRENDS |
Clancy_SENDSOR | 2:5828e6917e75 | 2478 | if (uiTechnicalDataSet[START_STOP_VENTILATION]==1 && ucStopVentilationAlarmNumber==SIZE_BLOWER_ALARM) |
Clancy_SENDSOR | 2:5828e6917e75 | 2479 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2480 | // *************** VENTILATION is ON ************** |
Clancy_SENDSOR | 2:5828e6917e75 | 2481 | if (bMemoStartVentilation==FALSE) |
Clancy_SENDSOR | 2:5828e6917e75 | 2482 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2483 | switch(ucStartVentilationScheduler) |
Clancy_SENDSOR | 2:5828e6917e75 | 2484 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2485 | default: |
Clancy_SENDSOR | 2:5828e6917e75 | 2486 | case 0: |
Clancy_SENDSOR | 2:5828e6917e75 | 2487 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2488 | // Active the HW safety system |
Clancy_SENDSOR | 2:5828e6917e75 | 2489 | ControlHW(BLOWER_ON__PAT_CPLD); |
Clancy_SENDSOR | 2:5828e6917e75 | 2490 | ucStartVentilationScheduler++; |
Clancy_SENDSOR | 2:5828e6917e75 | 2491 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 2492 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2493 | case 1: |
Clancy_SENDSOR | 2:5828e6917e75 | 2494 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2495 | // Pat CPLD (WDI_CPLD), STOP_BLOWER=1 |
Clancy_SENDSOR | 2:5828e6917e75 | 2496 | ControlHW(BLOWER_ON__PAT_CPLD); |
Clancy_SENDSOR | 2:5828e6917e75 | 2497 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2498 | // Read Offset of the Blower current |
Clancy_SENDSOR | 2:5828e6917e75 | 2499 | ComputeADCBlowerCurrent(TRUE); |
Clancy_SENDSOR | 2:5828e6917e75 | 2500 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2501 | ucStartVentilationScheduler++; |
Clancy_SENDSOR | 2:5828e6917e75 | 2502 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 2503 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2504 | case 2: |
Clancy_SENDSOR | 2:5828e6917e75 | 2505 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2506 | // Pat CPLD (WDI_CPLD), STOP_BLOWER=1 |
Clancy_SENDSOR | 2:5828e6917e75 | 2507 | ControlHW(BLOWER_ON__PAT_CPLD); |
Clancy_SENDSOR | 2:5828e6917e75 | 2508 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2509 | // Open motor driver |
Clancy_SENDSOR | 2:5828e6917e75 | 2510 | byOpStatus=SS_Xopen(mdrv); |
Clancy_SENDSOR | 2:5828e6917e75 | 2511 | if (byOpStatus==OPSTATUS_FAIL) |
Clancy_SENDSOR | 2:5828e6917e75 | 2512 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2513 | uiFlagsAlarm[ALARM_FLAGS2]|=MOTOR_FAILURE_ALARM_MASK; |
Clancy_SENDSOR | 2:5828e6917e75 | 2514 | ucStartVentilationScheduler=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 2515 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2516 | else if (byOpStatus==OPSTATUS_OK) |
Clancy_SENDSOR | 2:5828e6917e75 | 2517 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2518 | // Force init settings and variables |
Clancy_SENDSOR | 2:5828e6917e75 | 2519 | uiPreviousDeviceMode=0xFF; |
Clancy_SENDSOR | 2:5828e6917e75 | 2520 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2521 | uiTempo1min=TEMPO_1MIN; |
Clancy_SENDSOR | 2:5828e6917e75 | 2522 | #ifdef DATA_LOGGING |
Clancy_SENDSOR | 2:5828e6917e75 | 2523 | uiTrendsSampleTime=RECORD_TRENDS_SAMPLE_TIME; |
Clancy_SENDSOR | 2:5828e6917e75 | 2524 | #endif // DATA_LOGGING |
Clancy_SENDSOR | 2:5828e6917e75 | 2525 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2526 | // Check if ventilation mode is activated |
Clancy_SENDSOR | 2:5828e6917e75 | 2527 | if (uiTechnicalDataSet[DEVICE_MODE_TEC]!=VENTILATION_MODE) |
Clancy_SENDSOR | 2:5828e6917e75 | 2528 | uiFlagsAlarm[ALARM_FLAGS2]|=DEVICE_MODE_ALARM_MASK; |
Clancy_SENDSOR | 2:5828e6917e75 | 2529 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2530 | bMemoStartVentilation=TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2531 | ucStartVentilationScheduler=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 2532 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2533 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 2534 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2535 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2536 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2537 | // --- Check Safety system for Motor transistors ---- |
Clancy_SENDSOR | 2:5828e6917e75 | 2538 | else if (IsMotorOK()==FALSE) |
Clancy_SENDSOR | 2:5828e6917e75 | 2539 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2540 | ControlHW(BLOWER_OFF__STOP_PAT_CPLD); |
Clancy_SENDSOR | 2:5828e6917e75 | 2541 | uiFlagsAlarm[ALARM_FLAGS2]|=MOTOR_FAILURE_ALARM_MASK; |
Clancy_SENDSOR | 2:5828e6917e75 | 2542 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2543 | // --- Test safety system thanks to the "STOP_BLOWER" Input pin |
Clancy_SENDSOR | 2:5828e6917e75 | 2544 | else if (TestStopBlowerInputPin()==OPSTATUS_OK) |
Clancy_SENDSOR | 2:5828e6917e75 | 2545 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2546 | ControlHW(BLOWER_ON__PAT_CPLD); |
Clancy_SENDSOR | 2:5828e6917e75 | 2547 | uiFlagsAlarm[ALARM_FLAGS2]&=(~HW_SAFETY_ALARM_MASK); |
Clancy_SENDSOR | 2:5828e6917e75 | 2548 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2549 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 2550 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2551 | uiFlagsAlarm[ALARM_FLAGS2]|=HW_SAFETY_ALARM_MASK; |
Clancy_SENDSOR | 2:5828e6917e75 | 2552 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2553 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2554 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 2555 | #endif // #ifndef TEMPERATURE_TRENDS |
Clancy_SENDSOR | 2:5828e6917e75 | 2556 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2557 | // *************** VENTILATION is OFF ************** |
Clancy_SENDSOR | 2:5828e6917e75 | 2558 | uiFlagsAlarm[ALARM_FLAGS2]&=(~DEVICE_MODE_ALARM_MASK); |
Clancy_SENDSOR | 2:5828e6917e75 | 2559 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2560 | if (ucStopVentilationAlarmNumber!=SIZE_BLOWER_ALARM) |
Clancy_SENDSOR | 2:5828e6917e75 | 2561 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2562 | // Stop patting CPLD (WDI_CPLD=0), STOP_BLOWER=0 |
Clancy_SENDSOR | 2:5828e6917e75 | 2563 | ControlHW(BLOWER_OFF__STOP_PAT_CPLD); |
Clancy_SENDSOR | 2:5828e6917e75 | 2564 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2565 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 2566 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2567 | // Pat CPLD (WDI_CPLD), STOP_BLOWER=1 |
Clancy_SENDSOR | 2:5828e6917e75 | 2568 | ControlHW(BLOWER_ON__PAT_CPLD); |
Clancy_SENDSOR | 2:5828e6917e75 | 2569 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2570 | // ---- Test STOP_ACTUATOR Input pin Status |
Clancy_SENDSOR | 2:5828e6917e75 | 2571 | if (TestStopBlowerInputPin()==OPSTATUS_FAIL) |
Clancy_SENDSOR | 2:5828e6917e75 | 2572 | uiFlagsAlarm[ALARM_FLAGS2]|=HW_SAFETY_ALARM_MASK; |
Clancy_SENDSOR | 2:5828e6917e75 | 2573 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 2574 | uiFlagsAlarm[ALARM_FLAGS2]&=(~HW_SAFETY_ALARM_MASK); |
Clancy_SENDSOR | 2:5828e6917e75 | 2575 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2576 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2577 | if (bMemoStartVentilation==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 2578 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2579 | StopAllActuators(); |
Clancy_SENDSOR | 2:5828e6917e75 | 2580 | ClearAllVentilationAlarms(); |
Clancy_SENDSOR | 2:5828e6917e75 | 2581 | ClearAllMeasures(); |
Clancy_SENDSOR | 2:5828e6917e75 | 2582 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2583 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2584 | uiTechnicalDataSet[START_STOP_VENTILATION]=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 2585 | bMemoStartVentilation=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2586 | #ifndef TEMPERATURE_TRENDS |
Clancy_SENDSOR | 2:5828e6917e75 | 2587 | ucStartVentilationScheduler=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 2588 | #endif |
Clancy_SENDSOR | 2:5828e6917e75 | 2589 | bDisableMaroubraCommCommunication=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2590 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2591 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2592 | #endif // #ifndef C_M3_DEVICETEST_TARGET |
Clancy_SENDSOR | 2:5828e6917e75 | 2593 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2594 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2595 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 2596 | * Function Name : ComputeTe |
Clancy_SENDSOR | 2:5828e6917e75 | 2597 | * Description : Compute expiratory time |
Clancy_SENDSOR | 2:5828e6917e75 | 2598 | * Input : uiF = Breath frequency (bpm) |
Clancy_SENDSOR | 2:5828e6917e75 | 2599 | uiTi = Inspiratory time (ms) |
Clancy_SENDSOR | 2:5828e6917e75 | 2600 | * Output : Expiratory time (ms) |
Clancy_SENDSOR | 2:5828e6917e75 | 2601 | * Return : None |
Clancy_SENDSOR | 2:5828e6917e75 | 2602 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 2603 | #ifndef C_M3_DEVICETEST_TARGET |
Clancy_SENDSOR | 2:5828e6917e75 | 2604 | u16 ComputeTe(u16 uiF, u16 uiTi) |
Clancy_SENDSOR | 2:5828e6917e75 | 2605 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2606 | u16 uiTtot; |
Clancy_SENDSOR | 2:5828e6917e75 | 2607 | u16 uiTeTemp=TE_SET_MIN; |
Clancy_SENDSOR | 2:5828e6917e75 | 2608 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2609 | if (uiF!=0) |
Clancy_SENDSOR | 2:5828e6917e75 | 2610 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2611 | // Compute Ttotal |
Clancy_SENDSOR | 2:5828e6917e75 | 2612 | uiTtot=60000/uiF; |
Clancy_SENDSOR | 2:5828e6917e75 | 2613 | if (uiTtot>uiTi) |
Clancy_SENDSOR | 2:5828e6917e75 | 2614 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2615 | uiTeTemp=uiTtot-uiTi; |
Clancy_SENDSOR | 2:5828e6917e75 | 2616 | if (uiTeTemp<TE_SET_MIN) |
Clancy_SENDSOR | 2:5828e6917e75 | 2617 | uiTeTemp=TE_SET_MIN; |
Clancy_SENDSOR | 2:5828e6917e75 | 2618 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2619 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2620 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 2621 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2622 | // F=0 => Te=2xTi |
Clancy_SENDSOR | 2:5828e6917e75 | 2623 | uiTeTemp=uiTi<<1; |
Clancy_SENDSOR | 2:5828e6917e75 | 2624 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2625 | return(uiTeTemp); |
Clancy_SENDSOR | 2:5828e6917e75 | 2626 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2627 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2628 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2629 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 2630 | * Function Name : UpdateSettings |
Clancy_SENDSOR | 2:5828e6917e75 | 2631 | * Description : Update the settings zone with the temporary settings zone |
Clancy_SENDSOR | 2:5828e6917e75 | 2632 | * Input : None |
Clancy_SENDSOR | 2:5828e6917e75 | 2633 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 2634 | * Return : TRUE if the ventilation mode has changed |
Clancy_SENDSOR | 2:5828e6917e75 | 2635 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 2636 | bool UpdateSettings(void) |
Clancy_SENDSOR | 2:5828e6917e75 | 2637 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2638 | u8 ucIndex; |
Clancy_SENDSOR | 2:5828e6917e75 | 2639 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2640 | // Take into account a modification of the PEEP |
Clancy_SENDSOR | 2:5828e6917e75 | 2641 | if (uiVentilationSet[PEEP_SET]!=uiVentilationSetTemp[PEEP_SET] || uiVentilationSet[PS_CPAP_SET]!=uiVentilationSetTemp[PS_CPAP_SET]) |
Clancy_SENDSOR | 2:5828e6917e75 | 2642 | uiMemoPWMDuringDisconnection=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 2643 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2644 | // Transfert data from the setting temporary zone to the settings zone |
Clancy_SENDSOR | 2:5828e6917e75 | 2645 | for (ucIndex=0; ucIndex<SIZE_LRS_GROUP; ucIndex++) |
Clancy_SENDSOR | 2:5828e6917e75 | 2646 | uiVentilationSet[ucIndex]=uiVentilationSetTemp[ucIndex]; |
Clancy_SENDSOR | 2:5828e6917e75 | 2647 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2648 | // Update barometric expiratory time |
Clancy_SENDSOR | 2:5828e6917e75 | 2649 | uiTeBaroSet=ComputeTe(uiVentilationSet[BREATH_RATE_BARO_SET], uiVentilationSet[TI_BARO_SET]); |
Clancy_SENDSOR | 2:5828e6917e75 | 2650 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2651 | // Update volumetric expiratory time |
Clancy_SENDSOR | 2:5828e6917e75 | 2652 | uiTeVoluSet=ComputeTe(uiVentilationSet[BREATH_RATE_VOLU_SET], uiVentilationSet[TI_VOLU_SET]); |
Clancy_SENDSOR | 2:5828e6917e75 | 2653 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2654 | // Update Tube configuration type |
Clancy_SENDSOR | 2:5828e6917e75 | 2655 | enTubeConfigType=enTubeConfigTypeTemp; |
Clancy_SENDSOR | 2:5828e6917e75 | 2656 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2657 | // Update Patient type |
Clancy_SENDSOR | 2:5828e6917e75 | 2658 | uiPatientType=uiPatientTypeTemp; |
Clancy_SENDSOR | 2:5828e6917e75 | 2659 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2660 | // Update Ventilation mode |
Clancy_SENDSOR | 2:5828e6917e75 | 2661 | if (enVentilationMode!=enVentilationModeTemp) |
Clancy_SENDSOR | 2:5828e6917e75 | 2662 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2663 | enVentilationMode=enVentilationModeTemp; |
Clancy_SENDSOR | 2:5828e6917e75 | 2664 | InitVentilation(); |
Clancy_SENDSOR | 2:5828e6917e75 | 2665 | return(TRUE); |
Clancy_SENDSOR | 2:5828e6917e75 | 2666 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2667 | return(FALSE); |
Clancy_SENDSOR | 2:5828e6917e75 | 2668 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2669 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2670 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2671 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 2672 | * Function Name : ApplyNewVentilationMode |
Clancy_SENDSOR | 2:5828e6917e75 | 2673 | * Description : Update settings and init variables if the ventilation mode has changed |
Clancy_SENDSOR | 2:5828e6917e75 | 2674 | * Input : None |
Clancy_SENDSOR | 2:5828e6917e75 | 2675 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 2676 | * Return : TRUE if new ventilation mode is applied |
Clancy_SENDSOR | 2:5828e6917e75 | 2677 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 2678 | bool ApplyNewVentilationMode(void) |
Clancy_SENDSOR | 2:5828e6917e75 | 2679 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2680 | if (fUpdateTheSettings==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 2681 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2682 | fUpdateTheSettings=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2683 | if (UpdateSettings()==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 2684 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2685 | InitVentilation(); |
Clancy_SENDSOR | 2:5828e6917e75 | 2686 | return(TRUE); |
Clancy_SENDSOR | 2:5828e6917e75 | 2687 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2688 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2689 | return(FALSE); |
Clancy_SENDSOR | 2:5828e6917e75 | 2690 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2691 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2692 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2693 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 2694 | * Function Name : ComputeInspiratoryFlowSetPointInAVC |
Clancy_SENDSOR | 2:5828e6917e75 | 2695 | * Description : Compute: |
Clancy_SENDSOR | 2:5828e6917e75 | 2696 | - the inspiratory flow max set point |
Clancy_SENDSOR | 2:5828e6917e75 | 2697 | - the inspiratory flow min set point |
Clancy_SENDSOR | 2:5828e6917e75 | 2698 | - the flow step between the flow max and the flow min during Ti |
Clancy_SENDSOR | 2:5828e6917e75 | 2699 | * Input : uiTypeOfPatient = Adult or Pedia |
Clancy_SENDSOR | 2:5828e6917e75 | 2700 | uiVtc = set point in volume (ml) |
Clancy_SENDSOR | 2:5828e6917e75 | 2701 | uiTi = Ti set point (ms) |
Clancy_SENDSOR | 2:5828e6917e75 | 2702 | uiFlowShape = Flow shape (0 to 4) |
Clancy_SENDSOR | 2:5828e6917e75 | 2703 | * Output : uiMaxFlow = the inspiratory flow max set point (cl/min => 100=1l/min) |
Clancy_SENDSOR | 2:5828e6917e75 | 2704 | uiMinFlow = the inspiratory flow min set point (cl/min => 100=1l/min) |
Clancy_SENDSOR | 2:5828e6917e75 | 2705 | uiFlowStep = the flow step between the flow max and the flow min during Ti (cl/min => 100=1l/min) |
Clancy_SENDSOR | 2:5828e6917e75 | 2706 | * Return : None |
Clancy_SENDSOR | 2:5828e6917e75 | 2707 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 2708 | void ComputeInspiratoryFlowSetPointInAVC(u16 uiTypeOfPatient, u16 uiVtc, u16 uiTi, u16 uiFlowShape, u32 *ulMaxFlow, u32 *ulMinFlow, u32 *ulFlowStep) |
Clancy_SENDSOR | 2:5828e6917e75 | 2709 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2710 | u32 ulFlowMax; |
Clancy_SENDSOR | 2:5828e6917e75 | 2711 | u32 ulFlowMin; |
Clancy_SENDSOR | 2:5828e6917e75 | 2712 | u32 ulMaxMaxFlow; |
Clancy_SENDSOR | 2:5828e6917e75 | 2713 | u32 ulMinMinFlow; |
Clancy_SENDSOR | 2:5828e6917e75 | 2714 | u16 uiTiMin; |
Clancy_SENDSOR | 2:5828e6917e75 | 2715 | u32 ulFlowStepTemp; |
Clancy_SENDSOR | 2:5828e6917e75 | 2716 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2717 | // Define min/max flow |
Clancy_SENDSOR | 2:5828e6917e75 | 2718 | if (uiTypeOfPatient==PATIENT_ADULT) |
Clancy_SENDSOR | 2:5828e6917e75 | 2719 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2720 | ulMinMinFlow=InspiratoryFlowSet_A_MIN; |
Clancy_SENDSOR | 2:5828e6917e75 | 2721 | ulMaxMaxFlow=InspiratoryFlowSet_A_MAX; |
Clancy_SENDSOR | 2:5828e6917e75 | 2722 | uiTiMin=TiVoluSet_A_MIN; |
Clancy_SENDSOR | 2:5828e6917e75 | 2723 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2724 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 2725 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2726 | ulMinMinFlow=InspiratoryFlowSet_P_MIN; |
Clancy_SENDSOR | 2:5828e6917e75 | 2727 | ulMaxMaxFlow=InspiratoryFlowSet_P_MAX; |
Clancy_SENDSOR | 2:5828e6917e75 | 2728 | uiTiMin=TiVoluSet_P_MIN; |
Clancy_SENDSOR | 2:5828e6917e75 | 2729 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2730 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2731 | // Check Ti |
Clancy_SENDSOR | 2:5828e6917e75 | 2732 | if (uiTi==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 2733 | uiTi=uiTiMin; |
Clancy_SENDSOR | 2:5828e6917e75 | 2734 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2735 | // Compute flow max |
Clancy_SENDSOR | 2:5828e6917e75 | 2736 | switch(uiFlowShape) |
Clancy_SENDSOR | 2:5828e6917e75 | 2737 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2738 | default: |
Clancy_SENDSOR | 2:5828e6917e75 | 2739 | case 0: |
Clancy_SENDSOR | 2:5828e6917e75 | 2740 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2741 | ulFlowMax=((u32)uiVtc*6000)/uiTi; |
Clancy_SENDSOR | 2:5828e6917e75 | 2742 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 2743 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2744 | case 1: |
Clancy_SENDSOR | 2:5828e6917e75 | 2745 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2746 | ulFlowMax=((u32)uiVtc*7500)/uiTi; |
Clancy_SENDSOR | 2:5828e6917e75 | 2747 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 2748 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2749 | case 2: |
Clancy_SENDSOR | 2:5828e6917e75 | 2750 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2751 | ulFlowMax=((u32)uiVtc*9000)/uiTi; |
Clancy_SENDSOR | 2:5828e6917e75 | 2752 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 2753 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2754 | case 3: |
Clancy_SENDSOR | 2:5828e6917e75 | 2755 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2756 | ulFlowMax=((u32)uiVtc*10500)/uiTi; |
Clancy_SENDSOR | 2:5828e6917e75 | 2757 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 2758 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2759 | case 4: |
Clancy_SENDSOR | 2:5828e6917e75 | 2760 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2761 | ulFlowMax=((u32)uiVtc*12000)/uiTi; |
Clancy_SENDSOR | 2:5828e6917e75 | 2762 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 2763 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2764 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2765 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2766 | // Limitation of the max flow |
Clancy_SENDSOR | 2:5828e6917e75 | 2767 | if (ulFlowMax>ulMaxMaxFlow) |
Clancy_SENDSOR | 2:5828e6917e75 | 2768 | ulFlowMax=ulMaxMaxFlow; |
Clancy_SENDSOR | 2:5828e6917e75 | 2769 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2770 | // Limitation of the min flow |
Clancy_SENDSOR | 2:5828e6917e75 | 2771 | if (ulFlowMax<ulMinMinFlow) |
Clancy_SENDSOR | 2:5828e6917e75 | 2772 | ulFlowMax=ulMinMinFlow; |
Clancy_SENDSOR | 2:5828e6917e75 | 2773 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2774 | // Factor 100 on flow max (and flow min and flow step) |
Clancy_SENDSOR | 2:5828e6917e75 | 2775 | ulFlowMax*=100; |
Clancy_SENDSOR | 2:5828e6917e75 | 2776 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2777 | // Compute flow min and flow step |
Clancy_SENDSOR | 2:5828e6917e75 | 2778 | switch(uiFlowShape) |
Clancy_SENDSOR | 2:5828e6917e75 | 2779 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2780 | default: |
Clancy_SENDSOR | 2:5828e6917e75 | 2781 | case 0: |
Clancy_SENDSOR | 2:5828e6917e75 | 2782 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2783 | ulFlowMin=ulFlowMax; |
Clancy_SENDSOR | 2:5828e6917e75 | 2784 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 2785 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2786 | case 1: |
Clancy_SENDSOR | 2:5828e6917e75 | 2787 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2788 | ulFlowMin=(ulFlowMax*3)>>2; |
Clancy_SENDSOR | 2:5828e6917e75 | 2789 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 2790 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2791 | case 2: |
Clancy_SENDSOR | 2:5828e6917e75 | 2792 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2793 | ulFlowMin=ulFlowMax>>1; |
Clancy_SENDSOR | 2:5828e6917e75 | 2794 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 2795 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2796 | case 3: |
Clancy_SENDSOR | 2:5828e6917e75 | 2797 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2798 | ulFlowMin=ulFlowMax>>2; |
Clancy_SENDSOR | 2:5828e6917e75 | 2799 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 2800 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2801 | case 4: |
Clancy_SENDSOR | 2:5828e6917e75 | 2802 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2803 | ulFlowMin=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 2804 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 2805 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2806 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2807 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2808 | // Max flow |
Clancy_SENDSOR | 2:5828e6917e75 | 2809 | *ulMaxFlow=ulFlowMax; |
Clancy_SENDSOR | 2:5828e6917e75 | 2810 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2811 | // Min flow |
Clancy_SENDSOR | 2:5828e6917e75 | 2812 | *ulMinFlow=ulFlowMin; |
Clancy_SENDSOR | 2:5828e6917e75 | 2813 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2814 | // Flow Step |
Clancy_SENDSOR | 2:5828e6917e75 | 2815 | ulFlowStepTemp=(ulFlowMax-ulFlowMin)/uiTi; |
Clancy_SENDSOR | 2:5828e6917e75 | 2816 | //if (uiFlowStepTemp==0 && uiFlowShape!=0) uiFlowStepTemp=1; |
Clancy_SENDSOR | 2:5828e6917e75 | 2817 | *ulFlowStep=ulFlowStepTemp; |
Clancy_SENDSOR | 2:5828e6917e75 | 2818 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2819 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2820 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2821 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2822 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 2823 | * Function Name : TestTriggerExpiratoire |
Clancy_SENDSOR | 2:5828e6917e75 | 2824 | * Description : Manage the expiratory trigger |
Clancy_SENDSOR | 2:5828e6917e75 | 2825 | * Input : ucValeurSeuil = threshold (% of the flow max) to reach in order to cycle |
Clancy_SENDSOR | 2:5828e6917e75 | 2826 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 2827 | * Return : TRUE if cycling active |
Clancy_SENDSOR | 2:5828e6917e75 | 2828 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 2829 | unsigned char TestTriggerExpiratoire(unsigned char ucValeurSeuil, unsigned int uiPressureSetting) |
Clancy_SENDSOR | 2:5828e6917e75 | 2830 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2831 | unsigned char ucSeuil=ucValeurSeuil; |
Clancy_SENDSOR | 2:5828e6917e75 | 2832 | unsigned int uiCalculTemp; |
Clancy_SENDSOR | 2:5828e6917e75 | 2833 | int16_t iConductanceBaseLine=UpdateInspiratoryConductanceAverage(); |
Clancy_SENDSOR | 2:5828e6917e75 | 2834 | // Management automatic expiratory trigger |
Clancy_SENDSOR | 2:5828e6917e75 | 2835 | ucTempoTriggerExpiAuto--; |
Clancy_SENDSOR | 2:5828e6917e75 | 2836 | if (ucTempoTriggerExpiAuto==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 2837 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2838 | ucTempoTriggerExpiAuto=TEMPO_TRIGGER_EXPI; |
Clancy_SENDSOR | 2:5828e6917e75 | 2839 | ucExpiTriggerTreshold++; |
Clancy_SENDSOR | 2:5828e6917e75 | 2840 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2841 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2842 | // Test si flow<0?? |
Clancy_SENDSOR | 2:5828e6917e75 | 2843 | if (iBlowerFlowSmoothingMes<0) |
Clancy_SENDSOR | 2:5828e6917e75 | 2844 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2845 | return(TRUE); |
Clancy_SENDSOR | 2:5828e6917e75 | 2846 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2847 | // Test if deacring flow?? |
Clancy_SENDSOR | 2:5828e6917e75 | 2848 | else if (iBlowerFlowSmoothingMes<iBlowerFlowSmoothingMaxMes) |
Clancy_SENDSOR | 2:5828e6917e75 | 2849 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2850 | // Test if Trigger Expi=AUTO ?? |
Clancy_SENDSOR | 2:5828e6917e75 | 2851 | if ((ucValeurSeuil==ExpiTriggerSet_A_MAX && uiPatientType==PATIENT_ADULT) || |
Clancy_SENDSOR | 2:5828e6917e75 | 2852 | (ucValeurSeuil==ExpiTriggerSet_P_MAX && uiPatientType==PATIENT_PEDIA)) |
Clancy_SENDSOR | 2:5828e6917e75 | 2853 | ucSeuil=ucExpiTriggerTreshold; |
Clancy_SENDSOR | 2:5828e6917e75 | 2854 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2855 | u16 conducThresh = 2000; |
Clancy_SENDSOR | 2:5828e6917e75 | 2856 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2857 | if(enTubeConfigType == 1 ) |
Clancy_SENDSOR | 2:5828e6917e75 | 2858 | conducThresh = 750; |
Clancy_SENDSOR | 2:5828e6917e75 | 2859 | else if(enTubeConfigType == 2) |
Clancy_SENDSOR | 2:5828e6917e75 | 2860 | conducThresh = 1500; |
Clancy_SENDSOR | 2:5828e6917e75 | 2861 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2862 | // Test if cycling or not |
Clancy_SENDSOR | 2:5828e6917e75 | 2863 | uiCalculTemp=((unsigned long)iBlowerFlowSmoothingMaxMes*ucSeuil)/100; |
Clancy_SENDSOR | 2:5828e6917e75 | 2864 | if (uiCalculTemp>iBlowerFlowSmoothingMes) |
Clancy_SENDSOR | 2:5828e6917e75 | 2865 | return(TRUE); |
Clancy_SENDSOR | 2:5828e6917e75 | 2866 | else if (uiProximalPressureMes>(uiPressureSetting+20)) |
Clancy_SENDSOR | 2:5828e6917e75 | 2867 | return(TRUE); |
Clancy_SENDSOR | 2:5828e6917e75 | 2868 | else if (uiConductanceCalc < (iConductanceBaseLine - conducThresh)) |
Clancy_SENDSOR | 2:5828e6917e75 | 2869 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2870 | ResetInspiratoryConductanceAverage(); |
Clancy_SENDSOR | 2:5828e6917e75 | 2871 | return(TRUE); |
Clancy_SENDSOR | 2:5828e6917e75 | 2872 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2873 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2874 | return(FALSE); |
Clancy_SENDSOR | 2:5828e6917e75 | 2875 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2876 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2877 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2878 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 2879 | * Function Name : TestInspiratoryTrigger |
Clancy_SENDSOR | 2:5828e6917e75 | 2880 | * Description : Manage the inspiratory trigger |
Clancy_SENDSOR | 2:5828e6917e75 | 2881 | * Input : bSpont = TRUE if spontaneous mode |
Clancy_SENDSOR | 2:5828e6917e75 | 2882 | * uiTe = expiration time (ms) |
Clancy_SENDSOR | 2:5828e6917e75 | 2883 | * uiFlowTreshold = flow threshold (dl/min) |
Clancy_SENDSOR | 2:5828e6917e75 | 2884 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 2885 | * Return : TRUE if cycling active |
Clancy_SENDSOR | 2:5828e6917e75 | 2886 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 2887 | bool TestInspiratoryTrigger(bool bSpont, u16 uiTe, u16 uiFlowTreshold) |
Clancy_SENDSOR | 2:5828e6917e75 | 2888 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2889 | //int16_t iInspiratoryFlowDeltaAverage; |
Clancy_SENDSOR | 2:5828e6917e75 | 2890 | //int16_t iDeltaOfTheDelta1, iDeltaOfTheDelta2, iDeltaOfTheDelta3, iDeltaOfTheDelta4; |
Clancy_SENDSOR | 2:5828e6917e75 | 2891 | bool bTrigger=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2892 | //int16_t iVirtualFlow; |
Clancy_SENDSOR | 2:5828e6917e75 | 2893 | int16_t iConductanceBaseLine; |
Clancy_SENDSOR | 2:5828e6917e75 | 2894 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2895 | // Manual breath management |
Clancy_SENDSOR | 2:5828e6917e75 | 2896 | if (uiTe>TE_SET_MIN) |
Clancy_SENDSOR | 2:5828e6917e75 | 2897 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2898 | if (bManualBreath==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 2899 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2900 | bManualBreath=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2901 | bDisplayInspiratoryTrigger=TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2902 | return(TRUE); |
Clancy_SENDSOR | 2:5828e6917e75 | 2903 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2904 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2905 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2906 | // Trigger management |
Clancy_SENDSOR | 2:5828e6917e75 | 2907 | if ((bSpont==TRUE) || |
Clancy_SENDSOR | 2:5828e6917e75 | 2908 | (bSpont==FALSE && uiFlowTreshold<InspiTriggerFlowSet_A_MAX && uiPatientType==PATIENT_ADULT) || |
Clancy_SENDSOR | 2:5828e6917e75 | 2909 | (bSpont==FALSE && uiFlowTreshold<InspiTriggerFlowSet_P_MAX && uiPatientType==PATIENT_PEDIA)) |
Clancy_SENDSOR | 2:5828e6917e75 | 2910 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2911 | // Init scheduler |
Clancy_SENDSOR | 2:5828e6917e75 | 2912 | if (uiTe==1) |
Clancy_SENDSOR | 2:5828e6917e75 | 2913 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2914 | ucInspiTriggerScheduler=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 2915 | iInspiratoryFlowMin=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 2916 | ucMinFlowCounter=NUMBER_MIN_FLOW_VALUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2917 | ucCounterTriggerValid=NUMBER_TRIGGER_VALID; |
Clancy_SENDSOR | 2:5828e6917e75 | 2918 | bDetectionConstantFlow=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2919 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2920 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2921 | iConductanceBaseLine=UpdateInspiratoryConductanceAverage(); |
Clancy_SENDSOR | 2:5828e6917e75 | 2922 | // Manage detection phase |
Clancy_SENDSOR | 2:5828e6917e75 | 2923 | switch(ucInspiTriggerScheduler) |
Clancy_SENDSOR | 2:5828e6917e75 | 2924 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2925 | default: |
Clancy_SENDSOR | 2:5828e6917e75 | 2926 | case 0: |
Clancy_SENDSOR | 2:5828e6917e75 | 2927 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2928 | // Update the buffer on the Inspiratory flow average |
Clancy_SENDSOR | 2:5828e6917e75 | 2929 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2930 | // Detect min flow |
Clancy_SENDSOR | 2:5828e6917e75 | 2931 | if (iBlowerFlowSmoothingMesForTrigger<iInspiratoryFlowMin) |
Clancy_SENDSOR | 2:5828e6917e75 | 2932 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2933 | iInspiratoryFlowMin=iBlowerFlowSmoothingMesForTrigger; |
Clancy_SENDSOR | 2:5828e6917e75 | 2934 | ucMinFlowCounter=NUMBER_MIN_FLOW_VALUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2935 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2936 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 2937 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2938 | ucMinFlowCounter--; |
Clancy_SENDSOR | 2:5828e6917e75 | 2939 | if (ucMinFlowCounter==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 2940 | ucInspiTriggerScheduler=1; |
Clancy_SENDSOR | 2:5828e6917e75 | 2941 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2942 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 2943 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2944 | case 1: |
Clancy_SENDSOR | 2:5828e6917e75 | 2945 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2946 | //ucTriggerNumber=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 2947 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2948 | if (uiTe>TE_SET_MIN) |
Clancy_SENDSOR | 2:5828e6917e75 | 2949 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2950 | // // Fast trigger management |
Clancy_SENDSOR | 2:5828e6917e75 | 2951 | // if (iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER-50]<=iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER-25]) |
Clancy_SENDSOR | 2:5828e6917e75 | 2952 | // { |
Clancy_SENDSOR | 2:5828e6917e75 | 2953 | // iVirtualFlow=(iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER-25]<<1)-iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER-50]; |
Clancy_SENDSOR | 2:5828e6917e75 | 2954 | // if (iBlowerFlowSmoothingMesForTrigger>=(iVirtualFlow+(int16_t)(uiFlowTreshold*7))) |
Clancy_SENDSOR | 2:5828e6917e75 | 2955 | // { |
Clancy_SENDSOR | 2:5828e6917e75 | 2956 | // //ucTriggerNumber=1; |
Clancy_SENDSOR | 2:5828e6917e75 | 2957 | // //if (fBlockCloseLoop==FALSE) |
Clancy_SENDSOR | 2:5828e6917e75 | 2958 | // bTrigger=TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2959 | // } |
Clancy_SENDSOR | 2:5828e6917e75 | 2960 | // } |
Clancy_SENDSOR | 2:5828e6917e75 | 2961 | // if (bTrigger==FALSE && iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER-100]<=iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER-50]) |
Clancy_SENDSOR | 2:5828e6917e75 | 2962 | // { |
Clancy_SENDSOR | 2:5828e6917e75 | 2963 | // iVirtualFlow=(iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER-50]<<1)-iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER-100]; |
Clancy_SENDSOR | 2:5828e6917e75 | 2964 | // if (iBlowerFlowSmoothingMesForTrigger>=(iVirtualFlow+(int16_t)(uiFlowTreshold*15))) |
Clancy_SENDSOR | 2:5828e6917e75 | 2965 | // { |
Clancy_SENDSOR | 2:5828e6917e75 | 2966 | // //ucTriggerNumber=2; |
Clancy_SENDSOR | 2:5828e6917e75 | 2967 | // //if (fBlockCloseLoop==FALSE) |
Clancy_SENDSOR | 2:5828e6917e75 | 2968 | // bTrigger=TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2969 | // } |
Clancy_SENDSOR | 2:5828e6917e75 | 2970 | // } |
Clancy_SENDSOR | 2:5828e6917e75 | 2971 | // |
Clancy_SENDSOR | 2:5828e6917e75 | 2972 | // // Slow trigger management |
Clancy_SENDSOR | 2:5828e6917e75 | 2973 | // if (TestInspiratorySlowTrigger(iFlowBaseLine, uiFlowTreshold*10)==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 2974 | // { |
Clancy_SENDSOR | 2:5828e6917e75 | 2975 | // //ucTriggerNumber=3; |
Clancy_SENDSOR | 2:5828e6917e75 | 2976 | // bTrigger=TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2977 | // } |
Clancy_SENDSOR | 2:5828e6917e75 | 2978 | //Conductance Trigger |
Clancy_SENDSOR | 2:5828e6917e75 | 2979 | if(uiConductanceCalc >= (iConductanceBaseLine + 2000)) |
Clancy_SENDSOR | 2:5828e6917e75 | 2980 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2981 | bTrigger = TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2982 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2983 | |
Clancy_SENDSOR | 2:5828e6917e75 | 2984 | // Trigger occurs?? |
Clancy_SENDSOR | 2:5828e6917e75 | 2985 | if (bTrigger==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 2986 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2987 | ucCounterTriggerValid--; |
Clancy_SENDSOR | 2:5828e6917e75 | 2988 | if (ucCounterTriggerValid==0) |
Clancy_SENDSOR | 2:5828e6917e75 | 2989 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 2990 | bDisplayInspiratoryTrigger=TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 2991 | ResetInspiratoryConductanceAverage(); |
Clancy_SENDSOR | 2:5828e6917e75 | 2992 | return(TRUE); |
Clancy_SENDSOR | 2:5828e6917e75 | 2993 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2994 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2995 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 2996 | ucCounterTriggerValid=NUMBER_TRIGGER_VALID; |
Clancy_SENDSOR | 2:5828e6917e75 | 2997 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 2998 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 2999 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3000 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3001 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3002 | return(FALSE); |
Clancy_SENDSOR | 2:5828e6917e75 | 3003 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3004 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3005 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 3006 | * Function Name : UpdateInspiratoryConductanceAverage |
Clancy_SENDSOR | 2:5828e6917e75 | 3007 | * Description : Fill the buffer with the expiratory conductance and compute the average |
Clancy_SENDSOR | 2:5828e6917e75 | 3008 | * Input : None |
Clancy_SENDSOR | 2:5828e6917e75 | 3009 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 3010 | * Return : Inspiratory flow average |
Clancy_SENDSOR | 2:5828e6917e75 | 3011 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 3012 | u16 conducIndex = 0; |
Clancy_SENDSOR | 2:5828e6917e75 | 3013 | int32_t lSumConductance = 0; |
Clancy_SENDSOR | 2:5828e6917e75 | 3014 | bool bufFilled = FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 3015 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3016 | int16_t UpdateInspiratoryConductanceAverage(void) |
Clancy_SENDSOR | 2:5828e6917e75 | 3017 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3018 | int16_t oldValue = iBufferIFlow[conducIndex]; |
Clancy_SENDSOR | 2:5828e6917e75 | 3019 | iBufferIFlow[conducIndex] = uiConductanceCalc; |
Clancy_SENDSOR | 2:5828e6917e75 | 3020 | lSumConductance += uiConductanceCalc; |
Clancy_SENDSOR | 2:5828e6917e75 | 3021 | conducIndex++; |
Clancy_SENDSOR | 2:5828e6917e75 | 3022 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3023 | if(conducIndex > SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER) |
Clancy_SENDSOR | 2:5828e6917e75 | 3024 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3025 | conducIndex = 0; |
Clancy_SENDSOR | 2:5828e6917e75 | 3026 | bufFilled = TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 3027 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3028 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3029 | if(bufFilled) |
Clancy_SENDSOR | 2:5828e6917e75 | 3030 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3031 | lSumConductance -= oldValue; |
Clancy_SENDSOR | 2:5828e6917e75 | 3032 | return (lSumConductance/SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER); |
Clancy_SENDSOR | 2:5828e6917e75 | 3033 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3034 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 3035 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3036 | return (lSumConductance/conducIndex); |
Clancy_SENDSOR | 2:5828e6917e75 | 3037 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3038 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3039 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3040 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 3041 | * Function Name : ResetInspiratoryConductanceAverage |
Clancy_SENDSOR | 2:5828e6917e75 | 3042 | * Description : Fill the buffer with the expiratory conductance and compute the average |
Clancy_SENDSOR | 2:5828e6917e75 | 3043 | * Input : None |
Clancy_SENDSOR | 2:5828e6917e75 | 3044 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 3045 | * Return : Inspiratory flow average |
Clancy_SENDSOR | 2:5828e6917e75 | 3046 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 3047 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3048 | void ResetInspiratoryConductanceAverage(void) |
Clancy_SENDSOR | 2:5828e6917e75 | 3049 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3050 | conducIndex = 0; |
Clancy_SENDSOR | 2:5828e6917e75 | 3051 | lSumConductance = 0; |
Clancy_SENDSOR | 2:5828e6917e75 | 3052 | bufFilled = FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 3053 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3054 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3055 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 3056 | * Function Name : UpdateInspiratoryFlowAverage |
Clancy_SENDSOR | 2:5828e6917e75 | 3057 | * Description : Fill the buffer with the inspiratory flow and compute the average |
Clancy_SENDSOR | 2:5828e6917e75 | 3058 | * Input : None |
Clancy_SENDSOR | 2:5828e6917e75 | 3059 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 3060 | * Return : Inspiratory flow average |
Clancy_SENDSOR | 2:5828e6917e75 | 3061 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 3062 | int16_t UpdateInspiratoryFlowAverage(void) |
Clancy_SENDSOR | 2:5828e6917e75 | 3063 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3064 | u16 uiIndex; |
Clancy_SENDSOR | 2:5828e6917e75 | 3065 | int32_t lSumIFlow=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 3066 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3067 | // Roll the buffer |
Clancy_SENDSOR | 2:5828e6917e75 | 3068 | for(uiIndex=1; uiIndex<SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER; uiIndex++) |
Clancy_SENDSOR | 2:5828e6917e75 | 3069 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3070 | iBufferIFlow[uiIndex-1]=iBufferIFlow[uiIndex]; // Upate the Inspiratory Flow buffer |
Clancy_SENDSOR | 2:5828e6917e75 | 3071 | lSumIFlow+=iBufferIFlow[uiIndex-1]; // Sum the Inspiratory Flow |
Clancy_SENDSOR | 2:5828e6917e75 | 3072 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3073 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3074 | // Add new flow value |
Clancy_SENDSOR | 2:5828e6917e75 | 3075 | iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER-1]=iBlowerFlowSmoothingMesForTrigger; // Upate the Inspiratory Flow buffer |
Clancy_SENDSOR | 2:5828e6917e75 | 3076 | lSumIFlow+=iBlowerFlowSmoothingMesForTrigger; // Sum the Inspiratory Flow |
Clancy_SENDSOR | 2:5828e6917e75 | 3077 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3078 | return(lSumIFlow/SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER); |
Clancy_SENDSOR | 2:5828e6917e75 | 3079 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3080 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3081 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3082 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 3083 | * Function Name : TestInspiratorySlowTrigger |
Clancy_SENDSOR | 2:5828e6917e75 | 3084 | * Description : Compute flow base line and test trigger |
Clancy_SENDSOR | 2:5828e6917e75 | 3085 | * Input : FlowTreshold = flow threshold (cl/min) |
Clancy_SENDSOR | 2:5828e6917e75 | 3086 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 3087 | * Return : TRUE if trigger occurs |
Clancy_SENDSOR | 2:5828e6917e75 | 3088 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 3089 | bool TestInspiratorySlowTrigger(int16_t iTheFlowBaseLine, u16 uiFlowTreshold) |
Clancy_SENDSOR | 2:5828e6917e75 | 3090 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3091 | int16_t iFlowDelta1, iFlowDelta2, iFlowDelta3; |
Clancy_SENDSOR | 2:5828e6917e75 | 3092 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3093 | if (bDetectionConstantFlow==FALSE) |
Clancy_SENDSOR | 2:5828e6917e75 | 3094 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3095 | // Detection constant flow |
Clancy_SENDSOR | 2:5828e6917e75 | 3096 | if (iBufferIFlow[0]<iTheFlowBaseLine) |
Clancy_SENDSOR | 2:5828e6917e75 | 3097 | iFlowDelta1=iTheFlowBaseLine-iBufferIFlow[0]; |
Clancy_SENDSOR | 2:5828e6917e75 | 3098 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 3099 | iFlowDelta1=iBufferIFlow[0]-iTheFlowBaseLine; |
Clancy_SENDSOR | 2:5828e6917e75 | 3100 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3101 | if (iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER>>1]<iTheFlowBaseLine) |
Clancy_SENDSOR | 2:5828e6917e75 | 3102 | iFlowDelta2=iTheFlowBaseLine-iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER>>1]; |
Clancy_SENDSOR | 2:5828e6917e75 | 3103 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 3104 | iFlowDelta2=iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER>>1]-iTheFlowBaseLine; |
Clancy_SENDSOR | 2:5828e6917e75 | 3105 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3106 | if (iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER-1]<iTheFlowBaseLine) |
Clancy_SENDSOR | 2:5828e6917e75 | 3107 | iFlowDelta3=iTheFlowBaseLine-iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER-1]; |
Clancy_SENDSOR | 2:5828e6917e75 | 3108 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 3109 | iFlowDelta3=iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER-1]-iTheFlowBaseLine; |
Clancy_SENDSOR | 2:5828e6917e75 | 3110 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3111 | if (iFlowDelta1<60 && iFlowDelta2<60 && iFlowDelta3<60) |
Clancy_SENDSOR | 2:5828e6917e75 | 3112 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3113 | iFlowBaseLineReference=iTheFlowBaseLine; |
Clancy_SENDSOR | 2:5828e6917e75 | 3114 | bDetectionConstantFlow=TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 3115 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3116 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3117 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 3118 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3119 | // Detect trigger |
Clancy_SENDSOR | 2:5828e6917e75 | 3120 | if (iBlowerFlowSmoothingMesForTrigger>=(iFlowBaseLineReference+(int16_t)uiFlowTreshold)) |
Clancy_SENDSOR | 2:5828e6917e75 | 3121 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3122 | return(TRUE); |
Clancy_SENDSOR | 2:5828e6917e75 | 3123 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3124 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3125 | return(FALSE); |
Clancy_SENDSOR | 2:5828e6917e75 | 3126 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3127 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3128 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3129 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 3130 | * Function Name : ApplyDefaultValueToTemporaryVentilationSettings |
Clancy_SENDSOR | 2:5828e6917e75 | 3131 | * Description : Init temporary ventilation settings with default values |
Clancy_SENDSOR | 2:5828e6917e75 | 3132 | * Input : None |
Clancy_SENDSOR | 2:5828e6917e75 | 3133 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 3134 | * Return : None |
Clancy_SENDSOR | 2:5828e6917e75 | 3135 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 3136 | void ApplyDefaultValueToTemporaryVentilationSettings(void) |
Clancy_SENDSOR | 2:5828e6917e75 | 3137 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3138 | u8 ucIndex; |
Clancy_SENDSOR | 2:5828e6917e75 | 3139 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3140 | enVentilationModeTemp=VentilationMode_DEF; |
Clancy_SENDSOR | 2:5828e6917e75 | 3141 | uiPatientTypeTemp=PatientType_DEF; |
Clancy_SENDSOR | 2:5828e6917e75 | 3142 | enTubeConfigTypeTemp=(enMaroubraTubeConfigurationList)ReturnDefaultTubeConfiguration(VentilationMode_DEF); |
Clancy_SENDSOR | 2:5828e6917e75 | 3143 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3144 | // Init all temporary settings |
Clancy_SENDSOR | 2:5828e6917e75 | 3145 | if (uiPatientType==PATIENT_ADULT) |
Clancy_SENDSOR | 2:5828e6917e75 | 3146 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3147 | for (ucIndex=0; ucIndex<SIZE_LRS_GROUP; ucIndex++) |
Clancy_SENDSOR | 2:5828e6917e75 | 3148 | uiVentilationSetTemp[ucIndex]=sLRSGroup[ucIndex].uiDefault_Adult; |
Clancy_SENDSOR | 2:5828e6917e75 | 3149 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3150 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 3151 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3152 | for (ucIndex=0; ucIndex<SIZE_LRS_GROUP; ucIndex++) |
Clancy_SENDSOR | 2:5828e6917e75 | 3153 | uiVentilationSetTemp[ucIndex]=sLRSGroup[ucIndex].uiDefault_Pedia; |
Clancy_SENDSOR | 2:5828e6917e75 | 3154 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3155 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3156 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3157 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3158 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 3159 | * Function Name : CheckTemporaryVentilationSettingRange |
Clancy_SENDSOR | 2:5828e6917e75 | 3160 | * Description : Check all the temporary settings range |
Clancy_SENDSOR | 2:5828e6917e75 | 3161 | * Input : None |
Clancy_SENDSOR | 2:5828e6917e75 | 3162 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 3163 | * Return : FALSE if one the settings is out of range |
Clancy_SENDSOR | 2:5828e6917e75 | 3164 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 3165 | opstatus_t CheckTemporaryVentilationSettingRange(void) |
Clancy_SENDSOR | 2:5828e6917e75 | 3166 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3167 | u8 ucIndex; |
Clancy_SENDSOR | 2:5828e6917e75 | 3168 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3169 | if ((uiPatientTypeTemp==PATIENT_PEDIA || uiPatientTypeTemp==PATIENT_ADULT) && enVentilationModeTemp<NUMBER_OF_MODE && enTubeConfigTypeTemp<NUMBER_OF_TUBE_CONFIGURATION) |
Clancy_SENDSOR | 2:5828e6917e75 | 3170 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3171 | for (ucIndex=0; ucIndex<SIZE_LRS_GROUP; ucIndex++) |
Clancy_SENDSOR | 2:5828e6917e75 | 3172 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3173 | // Check data range |
Clancy_SENDSOR | 2:5828e6917e75 | 3174 | if (uiPatientTypeTemp==PATIENT_PEDIA) |
Clancy_SENDSOR | 2:5828e6917e75 | 3175 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3176 | if (uiVentilationSetTemp[ucIndex]<sLRSGroup[ucIndex].uiMin_Pedia) |
Clancy_SENDSOR | 2:5828e6917e75 | 3177 | return(OPSTATUS_FAIL); |
Clancy_SENDSOR | 2:5828e6917e75 | 3178 | else if (uiVentilationSetTemp[ucIndex]>sLRSGroup[ucIndex].uiMax_Pedia) |
Clancy_SENDSOR | 2:5828e6917e75 | 3179 | return(OPSTATUS_FAIL); |
Clancy_SENDSOR | 2:5828e6917e75 | 3180 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3181 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 3182 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3183 | if (uiVentilationSetTemp[ucIndex]<sLRSGroup[ucIndex].uiMin_Adult) |
Clancy_SENDSOR | 2:5828e6917e75 | 3184 | return(OPSTATUS_FAIL); |
Clancy_SENDSOR | 2:5828e6917e75 | 3185 | else if (uiVentilationSetTemp[ucIndex]>sLRSGroup[ucIndex].uiMax_Adult) |
Clancy_SENDSOR | 2:5828e6917e75 | 3186 | return(OPSTATUS_FAIL); |
Clancy_SENDSOR | 2:5828e6917e75 | 3187 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3188 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3189 | return(OPSTATUS_OK); |
Clancy_SENDSOR | 2:5828e6917e75 | 3190 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3191 | return(OPSTATUS_FAIL); |
Clancy_SENDSOR | 2:5828e6917e75 | 3192 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3193 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3194 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3195 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3196 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 3197 | * Function Name : ApplyDefaultValueToTechnicalSettings |
Clancy_SENDSOR | 2:5828e6917e75 | 3198 | * Description : Init technical settings with default values |
Clancy_SENDSOR | 2:5828e6917e75 | 3199 | * Input : None |
Clancy_SENDSOR | 2:5828e6917e75 | 3200 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 3201 | * Return : None |
Clancy_SENDSOR | 2:5828e6917e75 | 3202 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 3203 | void ApplyDefaultValueToTechnicalSettings(void) |
Clancy_SENDSOR | 2:5828e6917e75 | 3204 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3205 | u8 ucIndex; |
Clancy_SENDSOR | 2:5828e6917e75 | 3206 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3207 | // Init all temporary settings |
Clancy_SENDSOR | 2:5828e6917e75 | 3208 | for (ucIndex=0; ucIndex<SIZE_LRTS_GROUP; ucIndex++) |
Clancy_SENDSOR | 2:5828e6917e75 | 3209 | uiTechnicalDataSet[ucIndex]=sLRTSGroup[ucIndex].uiDefault; |
Clancy_SENDSOR | 2:5828e6917e75 | 3210 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3211 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3212 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3213 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 3214 | * Function Name : CheckTechnicalSettingsRange |
Clancy_SENDSOR | 2:5828e6917e75 | 3215 | * Description : Check all the technical settings range |
Clancy_SENDSOR | 2:5828e6917e75 | 3216 | * Input : None |
Clancy_SENDSOR | 2:5828e6917e75 | 3217 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 3218 | * Return : None |
Clancy_SENDSOR | 2:5828e6917e75 | 3219 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 3220 | void CheckTechnicalSettingsRange(void) |
Clancy_SENDSOR | 2:5828e6917e75 | 3221 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3222 | u8 ucIndex; |
Clancy_SENDSOR | 2:5828e6917e75 | 3223 | bool fError=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 3224 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3225 | for (ucIndex=0; ucIndex<SIZE_LRTS_GROUP; ucIndex++) |
Clancy_SENDSOR | 2:5828e6917e75 | 3226 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3227 | if (uiTechnicalDataSet[ucIndex]<sLRTSGroup[ucIndex].uiMin || uiTechnicalDataSet[ucIndex]>sLRTSGroup[ucIndex].uiMax) |
Clancy_SENDSOR | 2:5828e6917e75 | 3228 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3229 | uiTechnicalDataSet[ucIndex]=sLRTSGroup[ucIndex].uiDefault; |
Clancy_SENDSOR | 2:5828e6917e75 | 3230 | fError=TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 3231 | //break; |
Clancy_SENDSOR | 2:5828e6917e75 | 3232 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3233 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3234 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3235 | if (fError==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 3236 | uiFlagsAlarm[ALARM_FLAGS2]|=TECHNICAL_SETTINGS_RANGE_ALARM_MASK; |
Clancy_SENDSOR | 2:5828e6917e75 | 3237 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 3238 | uiFlagsAlarm[ALARM_FLAGS2]&=(~TECHNICAL_SETTINGS_RANGE_ALARM_MASK); |
Clancy_SENDSOR | 2:5828e6917e75 | 3239 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3240 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3241 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3242 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 3243 | * Function Name : CheckFlowLUTRange |
Clancy_SENDSOR | 2:5828e6917e75 | 3244 | * Description : Check the flow LUT |
Clancy_SENDSOR | 2:5828e6917e75 | 3245 | * Input : None |
Clancy_SENDSOR | 2:5828e6917e75 | 3246 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 3247 | * Return : None |
Clancy_SENDSOR | 2:5828e6917e75 | 3248 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 3249 | void CheckFlowLUTRange(void) |
Clancy_SENDSOR | 2:5828e6917e75 | 3250 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3251 | u16 uiIndex; |
Clancy_SENDSOR | 2:5828e6917e75 | 3252 | bool fError=FALSE; |
Clancy_SENDSOR | 2:5828e6917e75 | 3253 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3254 | if (stLUTFlowSensor.uiLUT_TableSize<(FLOW_CALIB_NUMBER_OF_SAMPLES>>1) || stLUTFlowSensor.uiLUT_TableSize>FLOW_CALIB_NUMBER_OF_SAMPLES) |
Clancy_SENDSOR | 2:5828e6917e75 | 3255 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3256 | ApplyDefaultFlowLUT(); |
Clancy_SENDSOR | 2:5828e6917e75 | 3257 | fError=TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 3258 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3259 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 3260 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3261 | for (uiIndex=1; uiIndex<stLUTFlowSensor.uiLUT_TableSize; uiIndex++) |
Clancy_SENDSOR | 2:5828e6917e75 | 3262 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3263 | if (stLUTFlowSensor.uiFlowValue[uiIndex]<=stLUTFlowSensor.uiFlowValue[uiIndex-1] || |
Clancy_SENDSOR | 2:5828e6917e75 | 3264 | stLUTFlowSensor.uiFlowSensorTicks[uiIndex]<=stLUTFlowSensor.uiFlowSensorTicks[uiIndex-1]) |
Clancy_SENDSOR | 2:5828e6917e75 | 3265 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3266 | ApplyDefaultFlowLUT(); |
Clancy_SENDSOR | 2:5828e6917e75 | 3267 | fError=TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 3268 | break; |
Clancy_SENDSOR | 2:5828e6917e75 | 3269 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3270 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3271 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3272 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3273 | if (fError==TRUE) |
Clancy_SENDSOR | 2:5828e6917e75 | 3274 | uiFlagsAlarm[ALARM_FLAGS2]|=NO_FLOW_LUT_ALARM_MASK; |
Clancy_SENDSOR | 2:5828e6917e75 | 3275 | else |
Clancy_SENDSOR | 2:5828e6917e75 | 3276 | uiFlagsAlarm[ALARM_FLAGS2]&=(~NO_FLOW_LUT_ALARM_MASK); |
Clancy_SENDSOR | 2:5828e6917e75 | 3277 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3278 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3279 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3280 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 3281 | * Function Name : ApplyDefaultFlowLUT |
Clancy_SENDSOR | 2:5828e6917e75 | 3282 | * Description : Apply default value for the flow LUT |
Clancy_SENDSOR | 2:5828e6917e75 | 3283 | * Input : None |
Clancy_SENDSOR | 2:5828e6917e75 | 3284 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 3285 | * Return : None |
Clancy_SENDSOR | 2:5828e6917e75 | 3286 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 3287 | void ApplyDefaultFlowLUT(void) |
Clancy_SENDSOR | 2:5828e6917e75 | 3288 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3289 | u16 uiIndex; |
Clancy_SENDSOR | 2:5828e6917e75 | 3290 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3291 | stLUTFlowSensor.uiLUT_TableSize=stDefaultLUTFlowSensor.uiLUT_TableSize; |
Clancy_SENDSOR | 2:5828e6917e75 | 3292 | for (uiIndex=0; uiIndex<FLOW_CALIB_NUMBER_OF_SAMPLES; uiIndex++) |
Clancy_SENDSOR | 2:5828e6917e75 | 3293 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3294 | stLUTFlowSensor.uiFlowValue[uiIndex]=stDefaultLUTFlowSensor.uiFlowValue[uiIndex]; |
Clancy_SENDSOR | 2:5828e6917e75 | 3295 | stLUTFlowSensor.uiFlowSensorTicks[uiIndex]=stDefaultLUTFlowSensor.uiFlowSensorTicks[uiIndex]; |
Clancy_SENDSOR | 2:5828e6917e75 | 3296 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3297 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3298 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3299 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3300 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 3301 | * Function Name : ReturnDefaultTubeConfiguration |
Clancy_SENDSOR | 2:5828e6917e75 | 3302 | * Description : The default tubing configuration according to the current ventilation mode |
Clancy_SENDSOR | 2:5828e6917e75 | 3303 | * Input : a ventilation mode |
Clancy_SENDSOR | 2:5828e6917e75 | 3304 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 3305 | * Return : The tube configuration |
Clancy_SENDSOR | 2:5828e6917e75 | 3306 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 3307 | u16 ReturnDefaultTubeConfiguration(u16 uiMode) |
Clancy_SENDSOR | 2:5828e6917e75 | 3308 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3309 | u8 ucIndex; |
Clancy_SENDSOR | 2:5828e6917e75 | 3310 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3311 | for (ucIndex=0; ucIndex<NUMBER_OF_TUBE_CONFIGURATION; ucIndex++) |
Clancy_SENDSOR | 2:5828e6917e75 | 3312 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3313 | if (ucTubeConfigurationTable[ucIndex][uiMode]==TUBE_DEFAULT) |
Clancy_SENDSOR | 2:5828e6917e75 | 3314 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3315 | return(ucIndex); |
Clancy_SENDSOR | 2:5828e6917e75 | 3316 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3317 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3318 | return(0); |
Clancy_SENDSOR | 2:5828e6917e75 | 3319 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3320 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3321 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3322 | /******************************************************************************* |
Clancy_SENDSOR | 2:5828e6917e75 | 3323 | * Function Name : ApplyAllDefaultValues |
Clancy_SENDSOR | 2:5828e6917e75 | 3324 | * Description : Apply all default values in the technical and settings zones |
Clancy_SENDSOR | 2:5828e6917e75 | 3325 | * : BE CARFUL this function call "ControlHW" function |
Clancy_SENDSOR | 2:5828e6917e75 | 3326 | * Input : None |
Clancy_SENDSOR | 2:5828e6917e75 | 3327 | * Output : None |
Clancy_SENDSOR | 2:5828e6917e75 | 3328 | * Return : None |
Clancy_SENDSOR | 2:5828e6917e75 | 3329 | *******************************************************************************/ |
Clancy_SENDSOR | 2:5828e6917e75 | 3330 | void ApplyAllDefaultValues(void) |
Clancy_SENDSOR | 2:5828e6917e75 | 3331 | { |
Clancy_SENDSOR | 2:5828e6917e75 | 3332 | // Init ventilation settings |
Clancy_SENDSOR | 2:5828e6917e75 | 3333 | ApplyDefaultValueToTemporaryVentilationSettings(); |
Clancy_SENDSOR | 2:5828e6917e75 | 3334 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3335 | // Init technical settings |
Clancy_SENDSOR | 2:5828e6917e75 | 3336 | ApplyDefaultValueToTechnicalSettings(); |
Clancy_SENDSOR | 2:5828e6917e75 | 3337 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3338 | // Init flow LUT |
Clancy_SENDSOR | 2:5828e6917e75 | 3339 | ApplyDefaultFlowLUT(); |
Clancy_SENDSOR | 2:5828e6917e75 | 3340 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3341 | // Default value for the device/patient time counter |
Clancy_SENDSOR | 2:5828e6917e75 | 3342 | ulDeviceTimeCounter=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 3343 | ulPatientTimeCounter=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 3344 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3345 | // Default value for the blower revolution counter |
Clancy_SENDSOR | 2:5828e6917e75 | 3346 | ulBlowerRevolutionCounter=0; |
Clancy_SENDSOR | 2:5828e6917e75 | 3347 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3348 | bComputeOffsetSensors=TRUE; |
Clancy_SENDSOR | 2:5828e6917e75 | 3349 | } |
Clancy_SENDSOR | 2:5828e6917e75 | 3350 | #endif // C_M3_DEVICETEST_TARGET |
Clancy_SENDSOR | 2:5828e6917e75 | 3351 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3352 | /******************* (C) COPYRIGHT 2007 STMicroelectronics *****END OF FILE****/ |
Clancy_SENDSOR | 2:5828e6917e75 | 3353 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3354 | |
Clancy_SENDSOR | 2:5828e6917e75 | 3355 |