Started a gui menuflow

Dependencies:   LCD_DISCO_F429ZI mbed TS_DISCO_F429ZI BSP_DISCO_F429ZI

Committer:
Clancy_SENDSOR
Date:
Tue Jun 09 22:57:20 2020 +0000
Revision:
2:5828e6917e75
added ventilation files

Who changed what in which revision?

UserRevisionLine numberNew 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