![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Started a gui menuflow
Dependencies: LCD_DISCO_F429ZI mbed TS_DISCO_F429ZI BSP_DISCO_F429ZI
Diff: Ventilation.c
- Revision:
- 3:b029a3f73a9e
- Parent:
- 2:5828e6917e75
--- a/Ventilation.c Tue Jun 09 22:57:20 2020 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3355 +0,0 @@ - -/* Includes ------------------------------------------------------------------*/ -#define EXTERN extern -#include <stdlib.h> -#include <string.h> -#include "SS.h" -#include "main.h" -#include "_SS_OnOffActioner.h" -#include "_SS_Pwm.h" -#include "Monitoring.h" -#include "Safety.h" -#include "_SS_Data_Logging.h" -#include "_SS_Record_Settings.h" -#include "_SS_I2CX_SDP600.h" -#include "_SS_I2CX_X201641.h" -#include "_SS_OptimaComm.h" -#undef EXTERN - -#define INIT_VARIABLES -#define EXTERN -#include "Ventilation.h" -#undef EXTERN -#undef INIT_VARIABLES - - -/* Internal constants --------------------------------------------------------*/ -// ******************* Min-max PI or PDF *************************************** -#define MAX_VOLTAGE_REF MAX_PI_OUTPUT // MAX_PI_OUTPUT = 1343 = 18.5micros = 93.3%, want 80% -#define MIN_VOLTAGE_REF MIN_PI_OUTPUT -#define INTEGRAL_MAX (2147483647) -#define INTEGRAL_MIN (-2147483648) - - -#ifndef C_M3_DEVICETEST_TARGET - /* Internal variables --------------------------------------------------------*/ - // ******************* MANAGED CONSTANT SPEED **************************** - static u16 uiBlowerSpeedSetting; - static int32_t lIntegral_Speed_I; - static bool bMaxPIOutputSpeedI; - static bool bMinPIOutputSpeedI; - - - // ************* MANAGED BAROMETRIC VENTILATION ************************* - static u16 uiIpapSettingTemp; - static u16 uiTeBaroSet; - static int32_t lIntegral_Pressure_I; - static bool bMaxPIOutputPressureI; - static bool bMinPIOutputPressureI; - static u16 uiTiD; - static u8 ucIndexTableSlope; - #define TEMPO_TRIGGER_EXPI 30 - static u8 ucTempoTriggerExpiAuto; - #define MIN_THRESHOLD_EXPI_TRIGGER_AUTO 25 - static u8 ucExpiTriggerTreshold; - static u8 fFirstCycleInspi; - - // ----------- Main blower management during expiration ------------------- - static u16 uiPWMatTheEndOfInspiration; - static bool fFirstCycleExpi; - static u16 uiEpapSettingTemp; - static int32_t lIntegral_Pressure_E; - static bool bMaxPIOutputPressureE; - static bool bMinPIOutputPressureE; - static u16 uiPWMatTheEndOfExpiration; - static u16 uiTeD; - static bool fBlockCloseLoop; - - static u16 uiTiTyp; - - // ************* MANAGED VOLUMETRIC VENTILATION ************************* - static u32 ulMaxIFlowSet; - static u32 ulMinIFlowSet; - static u32 ulDecFlowStep; - static u16 uiTeVoluSet; - static u16 uiProximalPressureAtTheEndOfInspiration; - static int32_t lIntegral_Flow_I; - static bool bMaxPIOutputFlowI; - static bool bMinPIOutputFlowI; - static int16_t iVtAdjust=0; - static u8 ucCounterHPAlarm=0; - - - // ******************* MANAGED_CPAP_VENTILATION ****************************** - #define EXPIRATORY_DISCONNECTION_TIME_OUT 500 // 500ms - #define CPAP_DISCONNECTION_TEST_PERIODICITY 4000 // 4s - static u16 uiDisconnectionTime; - static u16 uiDisconnectionTimeInCPAP; - static u16 uiMemoPWMDuringDisconnection; - //static u8 ucStandByMode; - - // ***************** MANAGED INSPIRATORY TRIGGER ***************************** - #define MAX_DELTA_FLOW 100 // 1 l/min - #define SIZE_DELTA_INSPIRATORY_FLOW_BUFFER 40 - #define NUMBER_TRIGGER_VALID 20 - #define NUMBER_MIN_FLOW_VALUE 30 - //static int16_t iBufferIFlowDelta[SIZE_DELTA_INSPIRATORY_FLOW_BUFFER]; - static u8 ucInspiTriggerScheduler; - static u8 ucMinFlowCounter; - static int16_t iInspiratoryFlowMin; - //static int16_t iOldInspiratoryFlowSmoothingMesForTrigger; - #define SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER 250 - static int16_t iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER]; - // static int16_t iBufferConductance[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER]; - static u8 ucCounterTriggerValid; - static int16_t iFlowBaseLineReference; - static bool bDetectionConstantFlow; - - - // *********************** MANAGED MONITORING FOR MLT ************************ - static u16 uiMLT_PressureSetPoint; - #ifdef MOTOR_LIFE_TESTING - #define MLT_AVERAGE_MONITORING 1000 - static u16 uiAverageMonitoringMLT; - static u32 ulMLT_SumSpeedMes; - static u32 ulMLT_SumCurrentMes; - static u32 ulMLT_SumTemperatureMes; - static u32 ulMLT_SumBlowerVoltage; - static u16 uiMLT_EnableAlarm; - #endif // #ifdef MOTOR_LIFE_TESTING - - - // ************************ MANAGED CALIBRATION ****************************** - typedef enum - { - INIT_FLOW_CALIB_TEST=0, - SET_GAS_TYPE, - SET_GAS_STANDARD, - START_FLOW_READING, - SEND_FLOW_COMMAND, - READ_FLOW_VALUE, - SEND_HIGH_FLOW_CALIB_REQUEST, - WAIT_FOR_HIGH_FLOW_CALIB_ACK, - PREPARE_FAILURE_COMMAND, - PREPARE_SUCCESS_COMMAND, - SEND_COMMAND_TO_PF300, - CHECK_COMMAND_FROM_PF300, - END_OF_CALIBRATION, - } type_enLowFlowCalibrationStep; - - typedef enum - { - INIT_PRESSURE_CALIB_TEST=0, - START_PRESSURE_READING, - SEND_PRESSURE_COMMAND, - READ_PRESSURE_VALUE, - PRESSURE_CALIB_FAILURE_COMMAND, - PRESSURE_CALIB_SUCCESS_COMMAND, - PRESSURE_CALIB_SEND_COMMAND_TO_PF300, - PRESSURE_CALIB_CHECK_COMMAND_FROM_PF300, - PRESSURE_CALIB_END_OF_CALIBRATION, - } type_enPressureCalibrationStep; - - #define SIZE_BUFFER_FLOW_VALUE 15 - typedef struct - { - unsigned char ucIndex; - bool bFirstPartOfTheCRReceived; - char szValue[SIZE_BUFFER_FLOW_VALUE]; - } type_stFlow; - - // Flow and pressure calibration - #define TIME_OUT_RECEPTION_PACKET_FROM_PF300 2000 // 2s - #define SAMPLE_RATE_BETWEEN_TWO_FLOW 5000 // 5s - #define SIZE_RX_BUFFER_PF300 20 - static u16 uiCalibrationTimeOut; - static unsigned char ucIndexAnswerFromPF300; - static char szAnswerFromPF300[SIZE_RX_BUFFER_PF300]; - static char szExpectedAnswerFromPF300[SIZE_RX_BUFFER_PF300]; - static u8 ucNumberOfBytesToCheckFromPF300Answer; - - // Flow calibration - static type_enLowFlowCalibrationStep enLowFlowCalibrationStep; - static type_enLowFlowCalibrationStep enGoBackToStep; - static unsigned long ulSumFlowTicks; - static unsigned int uiFlowTicksSamplesCounter; - //static type_stLUTFlowSensor stTemporayLUTFlowSensor; - static bool bHighFlowCalibrationInProgress; - static unsigned int uiMotorDutyCyleForFlowCalib; - static unsigned int uiImHereMsgTimer; - - // Pressure calibration - #define SAMPLE_RATE_BETWEEN_TWO_PRESSURE 10000 // 30s - static type_enPressureCalibrationStep enPressureCalibrationStep; - static type_enPressureCalibrationStep enPressureCalibGoBackToStep; - static u32 ulSumPressureTicks; - static u16 uiPressureTicksSamplesCounter; - - // List of command to PF300 - static const char szPF300_CmdSwitchOffEcho[]={"%CM#5$0\r"}; // Command Echo from PF300 off - static const char szPF300_AnswerSwitchOffEcho[]={"%CM#5"}; // Answer echo off from PF300 (WO \r) - static const char szPF300_SetAirGasType[]={"%WS#1$0\r"}; // command Air - static const char szPF300_AnswerAirGasType[]={"%WS#1$0"}; // Answer Air - static const char szPF300_SetGasStandard[]={"%WS#3$1\r"}; // Command STPD - static const char szPF300_AnswerGasStandard[]={"%WS#3$1"}; // Answer STPD - static const char szPF300_ReadLowFlowCmd[]={"%RM#1\r"}; // Command read low flow - static const char szPF300_ReadLowFlowAnswer[]={"%RM#1$"}; // Answer read low flow - static const char szPF300_ReadHighFlowCmd[]={"%RM#0\r"}; // Command read high flow - static const char szPF300_ReadHighFlowAnswer[]={"%RM#0$"}; // Answer read high flow - static const char szPF300_ReadPdiffCmd[]={"%RM#3\r"}; // Command read pressure diff. - static const char szPF300_ReadPdiffAnswer[]={"%RM#3$"}; // Answewr read pressure diff. - - // List of Command to Handset - static const char szRequestHighFlowCalib[]={"@N"}; - static const char szEndOfCalibOK[]={"@S"}; - static const char szImHere[]={"@*"}; - - - // ---------------- Management FRAM for settings ----------------------------- - #ifdef RECORD_SETTINGS - #endif // RECORD_SETTINGS - - // -------------------- Manage Motor starting -------------------------------- - #ifndef TEMPERATURE_TRENDS - static u8 ucStartVentilationScheduler=0; - #endif - static enMaroubraModes enPreviousMode; - static u16 uiPreviousDeviceMode; -#endif // C_M3_DEVICETEST_TARGET - - -#ifndef C_M3_DEVICETEST_TARGET - #define SIZE_SLOPE2_TABLE 21 - const unsigned char ucSlope2Table[SIZE_SLOPE2_TABLE]= { - 0, 35, 50, 59, 65, 70, 74, 77, 80, 83, - 85, 87, 89, 91, 92, 94, 95, 96, 98, 99, - 100 }; - - // Table pente inspiratoire 2 - #define SIZE_SLOPE3_TABLE 41 - const unsigned char ucSlope3Table[SIZE_SLOPE3_TABLE]= { - 0, 20, 35, 44, 50, 55, 59, 62, 65, 68, 70, - 72, 74, 76, 77, 79, 80, 81, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 91, 92, 93, 94, 94, 95, - 96, 96, 97, 98, 98, 99, 99, 100 }; - - // Table pente inspiratoire 3 - #define SIZE_SLOPE4_TABLE 61 - const unsigned char ucSlope4Table[SIZE_SLOPE4_TABLE]= { - 0, 11, 26, 35, 41, 46, 50, 53, 56, 59, 61, - 63, 65, 67, 68, 70, 71, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 83, 84, 85, 86, 86, - 87, 88, 88, 89 ,90, 90, 91, 91, 92, 92, 93, - 93, 94, 94, 95, 95, 96, 96, 96, 97, 97, 98, - 98, 99, 99, 99, 100, 100 }; - - - // Maximum allowed flow in expiration Flow=f(PEEP set) (example: flow-by max=29L/min @ 5hPa) - const u16 uiMaximumFlowInExpiration[41]={ - 0, 1300, 1830, 2250, 2600, 2900, 3180, 3430, 3670, 3900, - 4110, 4310, 4500, 4680, 4860, 5030, 5200, 5360, 5510, 5660, - 5810, 5950, 6090, 6230, 6360, 6500, 6620, 6750, 6870, 7000, - 7120, 7230, 7350, 7460, 7580, 7690, 7800, 7900, 8010, 8110, 8220 - }; -#endif // C_M3_DEVICETEST_TARGET - - -/* Internal functions --------------------------------------------------------*/ -#ifndef C_M3_DEVICETEST_TARGET - u16 ComputeTe(u16 uiF, u16 uiTi); - void ComputeInspiratoryFlowSetPointInAVC(u16 uiTypeOfPatient, u16 uiVtc, u16 uiTi, u16 uiFlowShape, u32 *ulMaxFlow, u32 *ulMinFlow, u32 *ulFlowStep); - unsigned char TestTriggerExpiratoire(unsigned char ucValeurSeuil, unsigned int uiPressureSetting); - bool TestInspiratoryTrigger(bool bSpont, u16 uiTe, u16 uiFlowThreshold); - int16_t UpdateInspiratoryFlowAverage(void); - int16_t UpdateInspiratoryConductanceAverage(void); - void ResetInspiratoryConductanceAverage(void); - bool TestInspiratorySlowTrigger(int16_t iTheFlowBaseLine, u16 uiFlowTreshold); - void ApplyDefaultValueToTemporaryVentilationSettings(void); - void ApplyDefaultValueToTechnicalSettings(void); - void ApplyAllDefaultValues(void); - bool ApplyNewVentilationMode(void); - void ApplyDefaultFlowLUT(void); - void CheckFlowLUTRange(void); - void ManageFlowCalibration(void); - void ManagePressureCalibration(void); - void ManageCstPressure(void); -#endif // C_M3_DEVICETEST_TARGET - - - -#ifndef C_M3_DEVICETEST_TARGET -/******************************************************************************* -* Function Name : InitSettings -* Description : Initialize parameters for ventilation -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void InitSettings(void) -{ - uiPreviousDeviceMode=0xFF; - enPreviousMode=NUMBER_OF_MODE; - - // --- Init Settings - uiTechnicalDataMes[SW_VERSION_TEC_MES]=MAROUBRA_BLOWER_SW_VERSION; - bComputeOffsetSensors=FALSE; - - #ifdef RECORD_SETTINGS - // Read and init FRAM - if (InitSettingsZoneAndTechnicalZoneInFRAM()==OPSTATUS_OK) - { - if (ReadSettingsZoneAndTechnicalZoneInFRAM()==OPSTATUS_FAIL) - { - uiFlagsAlarm[ALARM_FLAGS2]|=FRAM_FAILURE_ALARM_MASK; - ApplyAllDefaultValues(); - } - } - else - { - uiFlagsAlarm[ALARM_FLAGS2]|=FRAM_FAILURE_ALARM_MASK; - ApplyAllDefaultValues(); - } - #else - ApplyAllDefaultValues(); - #endif - - // Compute offsets sensors if necessary - if (bComputeOffsetSensors==TRUE) - { - // ------ Update Blower Flow sensor offset before ventilation ------- - #ifdef SDP600_USED_I2C1_BUS - SDP600_ComputeOffsetFlowSensorOnI2C1(SDP600_BLOWER_FLOW_SENSOR); - #endif // SDP600_USED_I2C1_BUS - - #ifdef X201641_USED_I2C1_BUS - X201641_ComputeOffsetFlowSensorOnI2C1(X201641_BLOWER_FLOW_SENSOR); - #endif // X201641_USED_I2C1_BUS - - // ----- Update Proximal Pressure sensor offset before ventilation ------- - ComputeOffsetProximalPressureSensor(); - } - - // Check Technical settings range - CheckTechnicalSettingsRange(); - - // Check Flow LUT - CheckFlowLUTRange(); - - // Check temporary ventilation setting range - if (CheckTemporaryVentilationSettingRange()==OPSTATUS_FAIL) - { - ApplyDefaultValueToTemporaryVentilationSettings(); - uiFlagsAlarm[ALARM_FLAGS2]|=VENTILATION_SETTINGS_RANGE_ALARM_MASK; - } - - // --- Update computed settings (Te,...) - UpdateSettings(); - - #ifdef MOTOR_LIFE_TESTING - uiTechnicalDataSet[DEVICE_MODE_TEC]=PRESSURE_CST_MODE; - uiTechnicalDataSet[START_STOP_VENTILATION]=1; - #endif -} - - -/******************************************************************************* -* Function Name : InitVentilation -* Description : Initialize variables for ventilation -* Function called : -* - when we start ventilation -* - when we change of ventilation mode -* - when we change of device mode -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void InitVentilation(void) -{ - ucVentilationCycle=EXPIRATION_CYCLE; - uiTiD=0; - uiTeD=0; - uiTiTyp = 1000; - bManualBreath=FALSE; - - if (enPreviousMode==NUMBER_OF_MODE) - { - // Start ventilation - uiDisconnectionTime=EXPIRATORY_DISCONNECTION_TIME_OUT; - uiDisconnectionTimeInCPAP=CPAP_DISCONNECTION_TEST_PERIODICITY; - uiMemoPWMDuringDisconnection=0; - fBlockCloseLoop=FALSE; - } - - ClearAllVentilationAlarms(); - ClearAllMeasures(); - - switch(uiTechnicalDataSet[DEVICE_MODE_TEC]) - { - default: - case VENTILATION_MODE: - { - if (enVentilationMode==APCV_MODE || enVentilationMode==PS_MODE) - { - if (enPreviousMode==APCV_MODE || enPreviousMode==PS_MODE) - { - // --- We are already in pressure mode - } - else - { - // --- Start a pressure mode - fFirstCycleInspi=TRUE; - uiPWMatTheEndOfInspiration=MIN_VOLTAGE_REF; - - if (enPreviousMode!=AVC_MODE) - { - uiPWMatTheEndOfExpiration=MIN_VOLTAGE_REF; - lIntegral_Pressure_E=0; - bMaxPIOutputPressureE=FALSE; - bMinPIOutputPressureE=FALSE; - fFirstCycleExpi=TRUE; - } - } - } - else if (enVentilationMode==AVC_MODE) - { - iVtAdjust=0; - fFirstCycleInspi=TRUE; - uiPWMatTheEndOfInspiration=MIN_VOLTAGE_REF; - - if (enPreviousMode!=APCV_MODE && enPreviousMode!=PS_MODE) - { - uiPWMatTheEndOfExpiration=MIN_VOLTAGE_REF; - lIntegral_Pressure_E=0; - bMaxPIOutputPressureE=FALSE; - bMinPIOutputPressureE=FALSE; - fFirstCycleExpi=TRUE; - } - } - else if (enVentilationMode==CPAP_MODE) - { - Ki_Pressure_I=1000; - uiPWMatTheEndOfInspiration=MIN_VOLTAGE_REF; - lIntegral_Pressure_I=0; - bMaxPIOutputPressureI=FALSE; - bMinPIOutputPressureI=FALSE; - } - break; - } - case ONE_CST_PWM_MODE: - { - uiInspirationBlowerPWMTec=250; - break; - } - case TWO_CST_PWM_MODE: - { - uiInspirationBlowerPWMTec=350; - uiExpirationBlowerPWMTec=150; - break; - } - case CST_SPEED_MODE: - { - uiBlowerSpeedSet=15000; - uiBlowerSpeedSetting=5000; - break; - } - case FLOW_CAL_MODE: - { - enLowFlowCalibrationStep=INIT_FLOW_CALIB_TEST; - bHighFlowCalibrationInProgress=FALSE; - stTemporayLUTFlowSensor.uiLUT_TableSize=0; - uiCalibrationTimeOut=(TIME_OUT_BLOWER_HANDSET_COMM*20); // 2s - break; - } - case PRESSURE_CAL_MODE: - { - enPressureCalibrationStep=INIT_PRESSURE_CALIB_TEST; - uiCalibrationTimeOut=(TIME_OUT_BLOWER_HANDSET_COMM*20); // 2s - break; - } - case PRESSURE_CST_MODE: - { - uiMLT_PressureSetPoint=10; - lIntegral_Pressure_I=0; - bMaxPIOutputPressureI=FALSE; - bMinPIOutputPressureI=FALSE; - - #ifdef MOTOR_LIFE_TESTING - uiMLT_EnableAlarm=5000; // 5s before enabling alarm - uiAverageMonitoringMLT=MLT_AVERAGE_MONITORING; - ulMLT_SumSpeedMes=0; - ulMLT_SumCurrentMes=0; - ulMLT_SumTemperatureMes=0; - ulMLT_SumBlowerVoltage=0; - #endif // #ifdef MOTOR_LIFE_TESTING - break; - } - } - enPreviousMode=enVentilationMode; -} - - -/******************************************************************************* -* Function Name : StopAllActuators -* Description : Stop all actuators -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void StopAllActuators(void) -{ - // Stop main blower - SS_Xclose(mdrv); - - // Valve OFF - SS_Xputdw(act, EV_CTL|FLAG_ACTIONER_OFF); -} - -/******************************************************************************* -* Function Name : CalculateHoseDrop -* Description : Manage Ti, Te, DAC, Blower, PID -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -u16 CalculateHoseDrop(void) -{ - u16 hoseDrop = (u16)(10*(iBlowerFlowSmoothingMes/100.0f/60.0f * 0.5f)); - return hoseDrop; -} - -/******************************************************************************* -* Function Name : ManageCPAPVentilation -* Description : Manage Ti, Te, DAC, Blower, PID -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void ManageCPAPVentilation(void) -{ - - - - // *************************** UPDATE SETTINGS ******************************* - if (ApplyNewVentilationMode()==TRUE) - return; - - // **************************** Cycle detection ****************************** - // Test Synchronisation - /*if (iBlowerFlowSmoothingMesForTrigger<(-500) && ucVentilationCycle==INSPIRATION_CYCLE) - ucVentilationCycle=EXPIRATION_CYCLE; */ - int32_t peakP = 2;//(int32_t)uiVentilationSet[PS_CPAP_SET]; - // Cycle detection - if (ucVentilationCycle==INSPIRATION_CYCLE) - { - uiTiD++; - if(uiTiD < (0.1f * uiTiTyp)) - { - peakP =(int32_t)( uiVentilationSet[PS_CPAP_SET] * ((uiTiD* 1.0f)/(0.1f * uiTiTyp))); - } - else if(uiTiD < (1.0f * uiTiTyp)) - { - peakP = ((int32_t)uiVentilationSet[PS_CPAP_SET] - ((int32_t)(uiVentilationSet[PS_CPAP_SET] * (uiTiD * 1.0f)/(1.1f * uiTiTyp)))) + 20; - } - else - { - peakP = 2; - } - - if (uiTiD>5000 || (uiTiD>TiBaroSet_P_MIN && TestTriggerExpiratoire(20, uiVentilationSet[PS_CPAP_SET])==TRUE)) - { - ucVentilationCycle=EXPIRATION_CYCLE; - uiPWMatTheEndOfInspiration = uiInspirationBlowerPWMTec; - if(uiTiD < 2000) - { - uiTiTyp = uiTiD; - } - else - { - uiTiTyp = 2000; - } - - uiTeD=0; - } - } - else - { - uiTeD++; - if (uiTeD>TE_SET_MAX) uiTeD=TE_SET_MAX; - - if (TestInspiratoryTrigger(TRUE, uiTeD, 15)==TRUE) - { - ucVentilationCycle=INSPIRATION_CYCLE; - uiTiD=0; - } - } - - // Barometric Mode : error computation - ControlPressure((int32_t)(peakP + CalculateHoseDrop())); -} - -/******************************************************************************* -* Function Name : ControlPressure -* Description : Manage Ti, Te, DAC, Blower, PID -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -int32_t previousError = 0; -int32_t lIntegralSum = 0; -void ControlPressure(int32_t setPressure)//pressure in cmH2O*10 -{ - int32_t lPropTerm; - int32_t lIntegralTerm; - int32_t lDerivativeTerm; - int32_t lOutputPressure; - - - int32_t lError = setPressure - uiProximalPressureMes; - - lPropTerm = (int32_t)uiTechnicalDataSet[KP_CPAP_VENTED_PRESSURE_I] * lError; - lIntegralTerm += (int32_t)(uiTechnicalDataSet[KI_CPAP_VENTED_PRESSURE_I] * lError); - lDerivativeTerm = (int32_t)(uiTechnicalDataSet[KP_FLOW_I]*(lError - previousError/1000)); - previousError = lError; - - // Close loop in pressure - if ((lIntegralTerm + lIntegralSum) > INTEGRAL_MAX) - { - lIntegralSum = INTEGRAL_MAX; - } - else if ((lIntegralTerm - lIntegralSum)< INTEGRAL_MIN) - { - lIntegralSum = INTEGRAL_MIN; - } - else - { - lIntegralSum += lIntegralTerm; - } - - lOutputPressure = (lDerivativeTerm>>19) + (lIntegralSum>>16) + (lPropTerm>>13) ; - - lOutputPressure+=uiPWMatTheEndOfInspiration; - - - // Limit and Update blower PWM - if (lOutputPressure>=((int32_t)MAX_VOLTAGE_REF)) - { - bMaxPIOutputPressureI = TRUE; - uiInspirationBlowerPWMTec=MAX_VOLTAGE_REF; - } - else if (lOutputPressure<((int32_t)MIN_VOLTAGE_REF)) - { - bMinPIOutputPressureI = TRUE; - uiInspirationBlowerPWMTec=MIN_VOLTAGE_REF; - } - else - { - bMaxPIOutputPressureI = FALSE; - bMinPIOutputPressureI = FALSE; - uiInspirationBlowerPWMTec = lOutputPressure; - } - - SS_Xputdw(mdrv, uiInspirationBlowerPWMTec); - -} - - -/******************************************************************************* -* Function Name : DavidCControlPressure -* Description : Manage Ti, Te, DAC, Blower, PID -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void DavidCControlPressure(int32_t setPressure)//pressure in cmH2O*10 -{ - int32_t lPropTerm; - int32_t lIntegralTerm; - int32_t lOutputPressure; - u16 uiFlowMaxInExpi; - int32_t lError = setPressure - uiProximalPressureMes; - - lIntegralTerm = (int32_t)Ki_Pressure_I * lError; - if (Ki_Pressure_I<uiTechnicalDataSet[KI_CPAP_VENTED_PRESSURE_I]) - { - Ki_Pressure_I++; - } - - // Close loop in pressure - if ((lIntegral_Pressure_I>=0) && (lIntegralTerm>=0) && (bMaxPIOutputPressureI==FALSE)) - { - if ((lIntegral_Pressure_I + lIntegralTerm) <0) - lIntegral_Pressure_I = INTEGRAL_MAX; - else - lIntegral_Pressure_I += lIntegralTerm; - } - else if ((lIntegral_Pressure_I<=0) && (lIntegralTerm<=0) && (bMinPIOutputPressureI==FALSE)) - { - if ((lIntegral_Pressure_I + lIntegralTerm)>0) - lIntegral_Pressure_I = INTEGRAL_MIN; - else - lIntegral_Pressure_I += lIntegralTerm; - } - else if ((lIntegral_Pressure_I<=0) && (lIntegralTerm>=0)) - lIntegral_Pressure_I += lIntegralTerm; - else if ((lIntegral_Pressure_I>=0) && (lIntegralTerm<=0)) - lIntegral_Pressure_I += lIntegralTerm; - - lPropTerm = (int32_t)uiTechnicalDataSet[KP_CPAP_VENTED_PRESSURE_I] * lError; - - lOutputPressure = (lIntegral_Pressure_I>>16) + (lPropTerm>>13); - - lOutputPressure+=uiPWMatTheEndOfInspiration; - - // Flow limiting - uiFlowMaxInExpi=uiMaximumFlowInExpiration[uiVentilationSet[PS_CPAP_SET]/10]; - if (lError>5 && iBlowerFlowSmoothingMes>(int16_t)uiFlowMaxInExpi) - { - // Impossible to maintain the peep (patient disconnection) - if (uiDisconnectionTime==0) - { - if (fBlockCloseLoop==FALSE) - uiDisconnectionTimeInCPAP=CPAP_DISCONNECTION_TEST_PERIODICITY; - fBlockCloseLoop=TRUE; // Block the close loop - if (uiMemoPWMDuringDisconnection!=0) // Apply a fixed PWM value - uiInspirationBlowerPWMTec=uiMemoPWMDuringDisconnection; - else - uiInspirationBlowerPWMTec=MIN_VOLTAGE_REF; - } - else - uiDisconnectionTime--; - } - else if (iBlowerFlowSmoothingMes<(int16_t)uiFlowMaxInExpi && (lError>(-2) && lError<2)) - { - // Good pressure : no disconnection - uiDisconnectionTime=EXPIRATORY_DISCONNECTION_TIME_OUT; - - if (fBlockCloseLoop==TRUE) - { - // The close loop was block before => unblock it - fBlockCloseLoop=FALSE; - lIntegral_Pressure_I=0; - bMaxPIOutputPressureI = FALSE; - bMinPIOutputPressureI = FALSE; - uiPWMatTheEndOfInspiration=uiInspirationBlowerPWMTec; - return; - } - else if (iBlowerFlowSmoothingMes>=0) - { - // Record current PWM - uiMemoPWMDuringDisconnection=uiInspirationBlowerPWMTec; - } - } - - // Unblock the close loop every 4s in case of none recorded PWM value - if (fBlockCloseLoop==TRUE && uiMemoPWMDuringDisconnection==0 && uiDisconnectionTimeInCPAP==0) - { - uiDisconnectionTime=EXPIRATORY_DISCONNECTION_TIME_OUT; - fBlockCloseLoop=FALSE; - lIntegral_Pressure_I=0; - bMaxPIOutputPressureI = FALSE; - bMinPIOutputPressureI = FALSE; - uiPWMatTheEndOfInspiration=uiInspirationBlowerPWMTec; - return; - } - - // Update Time counters - if (uiDisconnectionTimeInCPAP!=0) - uiDisconnectionTimeInCPAP--; - - // Update blower PWM - if (fBlockCloseLoop==TRUE) - { - bMaxPIOutputPressureI = TRUE; - } - else if (lOutputPressure>=((int32_t)MAX_VOLTAGE_REF)) - { - bMaxPIOutputPressureI = TRUE; - uiInspirationBlowerPWMTec=MAX_VOLTAGE_REF; - } - else if (lOutputPressure<((int32_t)MIN_VOLTAGE_REF)) - { - bMinPIOutputPressureI = TRUE; - uiInspirationBlowerPWMTec=MIN_VOLTAGE_REF; - } - else - { - bMaxPIOutputPressureI = FALSE; - bMinPIOutputPressureI = FALSE; - uiInspirationBlowerPWMTec = lOutputPressure; - } - - SS_Xputdw(mdrv, uiInspirationBlowerPWMTec); - -} - -/******************************************************************************* -* Function Name : ManageOneCstPWM -* Description : Manage Ti, Te, DAC, Blower, PID -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void ManageOneCstPWM(void) -{ - // *************************** UPDATE SETTINGS ******************************* - if (ApplyNewVentilationMode()==TRUE) - return; - - // Update Blower Speed - SS_Xputdw(mdrv, uiInspirationBlowerPWMTec); -} - - -/******************************************************************************* -* Function Name : Manage2CstPWM -* Description : Manage Ti, Te, DAC, Blower, PID -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void Manage2CstPWM(void) -{ - if (ucVentilationCycle==INSPIRATION_CYCLE) - { - // ------------- INSPIRATION ------------ - SS_Xputdw(mdrv, uiInspirationBlowerPWMTec); - - // Inspiratoy time - uiTiD++; - if (uiTiD>=uiVentilationSet[TI_BARO_SET]) - { - ucVentilationCycle=EXPIRATION_CYCLE; - uiTiD=0; - } - } - else - { - // ------------- EXPIRATION ------------ - // *************************** UPDATE SETTINGS ******************************* - if (ApplyNewVentilationMode()==TRUE) - return; - - SS_Xputdw(mdrv, uiExpirationBlowerPWMTec); - - // Expiratoy time - uiTeD++; - if (uiTeD>=uiTeBaroSet) - { - ucVentilationCycle=INSPIRATION_CYCLE; - uiTeD=0; - } - } -} - - -/******************************************************************************* -* Function Name : ManageCstSpeed -* Description : Manage constant speed ventilation -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void ManageCstSpeed(void) -{ - int32_t lError; - int32_t lPropTerm; - int32_t lIntegralTerm; - int32_t lOutputSpeed; - - // *************************** UPDATE SETTINGS ******************************* - if (ApplyNewVentilationMode()==TRUE) - return; - - // Update settings - if (uiBlowerSpeedSetting<uiBlowerSpeedSet) - uiBlowerSpeedSetting+=10; - else if (uiBlowerSpeedSetting>uiBlowerSpeedSet) - uiBlowerSpeedSetting-=10; - - uiTiD++; - if ((uiTiD%10)==0) - { - // Barometric Mode : error computation - lError=(int32_t)uiBlowerSpeedSetting-(int32_t)uiBlowerSpeedMes; - lIntegralTerm = (int32_t)uiTechnicalDataSet[KI_SPEED_I_TEC] * lError; - - // Close loop in pressure - if ((lIntegral_Speed_I>=0) && (lIntegralTerm>=0) && (bMaxPIOutputSpeedI==FALSE)) - { - if ((lIntegral_Speed_I + lIntegralTerm) <0) - lIntegral_Speed_I = INTEGRAL_MAX; - else - lIntegral_Speed_I += lIntegralTerm; - } - else if ((lIntegral_Speed_I<=0) && (lIntegralTerm<=0) && (bMinPIOutputSpeedI==FALSE)) - { - if ((lIntegral_Speed_I + lIntegralTerm)>0) - lIntegral_Speed_I = INTEGRAL_MIN; - else - lIntegral_Speed_I += lIntegralTerm; - } - else if ((lIntegral_Speed_I<=0) && (lIntegralTerm>=0)) - lIntegral_Speed_I += lIntegralTerm; - else if ((lIntegral_Speed_I>=0) && (lIntegralTerm<=0)) - lIntegral_Speed_I += lIntegralTerm; - - lPropTerm = (int32_t)uiTechnicalDataSet[KP_SPEED_I_TEC] * lError; - lOutputSpeed = (lIntegral_Speed_I>>16) + (lPropTerm>>13); - - if (lOutputSpeed>=((int32_t)MAX_VOLTAGE_REF)) - { - bMaxPIOutputSpeedI = TRUE; - uiInspirationBlowerPWMTec=MAX_VOLTAGE_REF; - } - else if (lOutputSpeed<((int32_t)MIN_VOLTAGE_REF)) - { - bMinPIOutputSpeedI = TRUE; - uiInspirationBlowerPWMTec=MIN_VOLTAGE_REF; - } - else - { - bMaxPIOutputSpeedI = FALSE; - bMinPIOutputSpeedI = FALSE; - uiInspirationBlowerPWMTec = lOutputSpeed; - } - SS_Xputdw(mdrv, uiInspirationBlowerPWMTec); - } -} - -/******************************************************************************* -* Function Name : ManageFlowCalibration -* Description : Manage Low flow calibration -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void ManageFlowCalibration(void) -{ - char cCharValue; - char szTempBuf[SIZE_RX_BUFFER_PF300]; - - /* - #ifdef USE_TSI_4040 - switch(enTSICommScheduler) - { - default: - case TSI_SET_TYPE_OF_GAS: - { - // Send Type of Gas command - ucTSICommand=TSI_SEND_GAS_TYPE_AIR_CMD; - if (SS_Xputdw(tsi, &ucTSICommand)==TRUE) - { - enTSICommScheduler=TSI_CHECK_ANSWER; - enTSIGoBackToStep=TSI_SET_FLOW_UNIT; - } - break; - } - case TSI_SET_FLOW_UNIT: - { - // Send Type of Gas command - ucTSICommand=TSI_SEND_FLOW_UNIT_STANDARD_CMD; - if (SS_Xputdw(tsi, &ucTSICommand)==TRUE) - { - enTSICommScheduler=TSI_CHECK_ANSWER; - enTSIGoBackToStep=TSI_SET_SAMPLE_TIME; - } - break; - } - case TSI_SET_SAMPLE_TIME: - { - // Send sample time - ucTSICommand=TSI_SEND_SAMPLE_TIME_10MS_CMD; - if (SS_Xputdw(tsi, &ucTSICommand)==TRUE) - { - enTSICommScheduler=TSI_CHECK_ANSWER; - enTSIGoBackToStep=TSI_READ_FLOW; - } - break; - } - case TSI_READ_FLOW: - { - // Send sample time - ucTSICommand=TSI_SEND_READ_FLOW_CMD; - if (SS_Xputdw(tsi, &ucTSICommand)==TRUE) - { - enTSICommScheduler=TSI_CHECK_ANSWER; - enTSIGoBackToStep=TSI_CYCLE_DETECTION; - } - break; - } - case TSI_CYCLE_DETECTION: - { - uiBlowerFlow=iFlowFromTSI; - break; - } - case TSI_CHECK_ANSWER: - { - opstatus=SS_Xgetw(tsi, &uiDummy); - if (opstatus==OPSTATUS_OK) - { - enTSICommScheduler=enTSIGoBackToStep; - } - else if (opstatus==OPSTATUS_FAIL) - { - enTSICommScheduler=TSI_SET_TYPE_OF_GAS; - } - break; - } - } - #endif // #ifdef USE_TSI_4040 - */ - - switch(enLowFlowCalibrationStep) - { - case INIT_FLOW_CALIB_TEST: - { - // Init comm with PF300 => wait 2s before sending first command to PF300 - // We need to wait for this delay in order to the handset to activate its transparent mode - if (uiCalibrationTimeOut==0) - { - bDisableMaroubraCommCommunication=TRUE; - - // Prepare command to PF300 - UpdateBufferToSend((char*)szPF300_CmdSwitchOffEcho); - enLowFlowCalibrationStep=SEND_COMMAND_TO_PF300; - strcpy(szExpectedAnswerFromPF300, szPF300_AnswerSwitchOffEcho); - ucNumberOfBytesToCheckFromPF300Answer=strlen(szPF300_AnswerSwitchOffEcho); - enGoBackToStep=SET_GAS_TYPE; - } - else - { - uiCalibrationTimeOut--; - } - break; - } - case SET_GAS_TYPE: - { - // Prepare command to PF300 - UpdateBufferToSend((char*)szPF300_SetAirGasType); - enLowFlowCalibrationStep=SEND_COMMAND_TO_PF300; - strcpy(szExpectedAnswerFromPF300, szPF300_AnswerAirGasType); - ucNumberOfBytesToCheckFromPF300Answer=strlen(szPF300_AnswerAirGasType); - enGoBackToStep=SET_GAS_STANDARD; - break; - } - case SET_GAS_STANDARD: - { - // Prepare command to PF300 - UpdateBufferToSend((char*)szPF300_SetGasStandard); - enLowFlowCalibrationStep=SEND_COMMAND_TO_PF300; - strcpy(szExpectedAnswerFromPF300, szPF300_AnswerGasStandard); - ucNumberOfBytesToCheckFromPF300Answer=strlen(szPF300_AnswerGasStandard); - enGoBackToStep=START_FLOW_READING; - break; - } - case START_FLOW_READING: - { - // Set Min blower speed - uiMotorDutyCyleForFlowCalib=MIN_PI_OUTPUT; - SS_Xputdw(mdrv, uiMotorDutyCyleForFlowCalib); - - // Init variable for flow sensor - uiCalibrationTimeOut=SAMPLE_RATE_BETWEEN_TWO_FLOW; - ulSumFlowTicks=0; - uiFlowTicksSamplesCounter=0; - - // Next step - enLowFlowCalibrationStep=SEND_FLOW_COMMAND; - break; - } - case SEND_FLOW_COMMAND: - { - if (uiCalibrationTimeOut!=0) - { - uiCalibrationTimeOut--; - - if (uiCalibrationTimeOut<(SAMPLE_RATE_BETWEEN_TWO_FLOW>>1)) - { - ulSumFlowTicks+=uiBlowerFlowRAWMes; - uiFlowTicksSamplesCounter++; - } - } - else - { - // Prepare next command (Read Low Flow) - enLowFlowCalibrationStep=SEND_COMMAND_TO_PF300; - if (bHighFlowCalibrationInProgress==FALSE) - { - UpdateBufferToSend((char*)szPF300_ReadLowFlowCmd); // %RM#1\r - strcpy(szExpectedAnswerFromPF300, szPF300_ReadLowFlowAnswer); // %RM#1$ - ucNumberOfBytesToCheckFromPF300Answer=strlen(szPF300_ReadLowFlowAnswer); - } - else - { - UpdateBufferToSend((char*)szPF300_ReadHighFlowCmd); // %RM#0\r - strcpy(szExpectedAnswerFromPF300, szPF300_ReadHighFlowAnswer); // %RM#0$ - ucNumberOfBytesToCheckFromPF300Answer=strlen(szPF300_ReadHighFlowAnswer); - } - enGoBackToStep=READ_FLOW_VALUE; - } - break; - } - case READ_FLOW_VALUE: - { - if (uiFlowTicksSamplesCounter!=0) - { - // Read PF300 flow (l/min) - strcpy(szTempBuf, &szAnswerFromPF300[ucNumberOfBytesToCheckFromPF300Answer]); - - // Store value of flow - if (stTemporayLUTFlowSensor.uiLUT_TableSize<LOW_FLOW_CALIB_NUMBER_OF_SAMPLES) - stTemporayLUTFlowSensor.uiFlowValue[stTemporayLUTFlowSensor.uiLUT_TableSize]=(unsigned int)atoi(szTempBuf); - else - stTemporayLUTFlowSensor.uiFlowValue[stTemporayLUTFlowSensor.uiLUT_TableSize]=(unsigned int)atoi(szTempBuf)*10; - - // Store ticks value - stTemporayLUTFlowSensor.uiFlowSensorTicks[stTemporayLUTFlowSensor.uiLUT_TableSize]=ulSumFlowTicks/uiFlowTicksSamplesCounter; - uiCalibrationTimeOut=SAMPLE_RATE_BETWEEN_TWO_FLOW; - ulSumFlowTicks=0; - uiFlowTicksSamplesCounter=0; - - // Check if current flow <0.1l/min - if (stTemporayLUTFlowSensor.uiFlowValue[stTemporayLUTFlowSensor.uiLUT_TableSize]<10) - { - enLowFlowCalibrationStep=PREPARE_FAILURE_COMMAND; - break; - } - - // Check if the last low flow is higher than 20l/min or lower than 2l/min - if (stTemporayLUTFlowSensor.uiLUT_TableSize==(LOW_FLOW_CALIB_NUMBER_OF_SAMPLES-1)) - { - // Check if the last low flow is higher than 20l/min or lower than 2l/min - if (stTemporayLUTFlowSensor.uiFlowValue[stTemporayLUTFlowSensor.uiLUT_TableSize]>2000 || stTemporayLUTFlowSensor.uiFlowValue[stTemporayLUTFlowSensor.uiLUT_TableSize]<200) - { - enLowFlowCalibrationStep=PREPARE_FAILURE_COMMAND; - break; - } - } - - // Next flow sample - 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)) - { - // No enough flow margin between the last value of the low flow and the first value of the high flow - } - else if (stTemporayLUTFlowSensor.uiLUT_TableSize!=0 && stTemporayLUTFlowSensor.uiFlowValue[stTemporayLUTFlowSensor.uiLUT_TableSize]<(stTemporayLUTFlowSensor.uiFlowValue[stTemporayLUTFlowSensor.uiLUT_TableSize-1]+50)) - { - // No enough margin between two consecutives flow - } - else if (stTemporayLUTFlowSensor.uiLUT_TableSize!=0 && stTemporayLUTFlowSensor.uiFlowSensorTicks[stTemporayLUTFlowSensor.uiLUT_TableSize]<=stTemporayLUTFlowSensor.uiFlowSensorTicks[stTemporayLUTFlowSensor.uiLUT_TableSize-1]) - { - // Same or less ticks between two consecutives flow - enLowFlowCalibrationStep=PREPARE_FAILURE_COMMAND; - break; - } - else - { - stTemporayLUTFlowSensor.uiLUT_TableSize++; - if (stTemporayLUTFlowSensor.uiFlowValue[stTemporayLUTFlowSensor.uiLUT_TableSize-1]>=14000) - { - // End of calib => check the number of samples - if (stTemporayLUTFlowSensor.uiLUT_TableSize>(FLOW_CALIB_NUMBER_OF_SAMPLES>>1)) - { - enLowFlowCalibrationStep=PREPARE_SUCCESS_COMMAND; - - // Transfer the temporary LUT in the definitive LUT - stLUTFlowSensor=stTemporayLUTFlowSensor; - } - else - { - enLowFlowCalibrationStep=PREPARE_FAILURE_COMMAND; - } - break; - } - else if (stTemporayLUTFlowSensor.uiLUT_TableSize>FLOW_CALIB_NUMBER_OF_SAMPLES) - { - enLowFlowCalibrationStep=PREPARE_FAILURE_COMMAND; - break; - } - } - - // Prepare next flow reading - if (stTemporayLUTFlowSensor.uiLUT_TableSize<LOW_FLOW_CALIB_NUMBER_OF_SAMPLES) - { - // New motor speed - uiMotorDutyCyleForFlowCalib+=20; - enLowFlowCalibrationStep=SEND_FLOW_COMMAND; - } - else if (stTemporayLUTFlowSensor.uiLUT_TableSize==LOW_FLOW_CALIB_NUMBER_OF_SAMPLES && bHighFlowCalibrationInProgress==FALSE) - { - // Min speed for motor - uiMotorDutyCyleForFlowCalib=MIN_PI_OUTPUT; - SS_Xputdw(mdrv, uiMotorDutyCyleForFlowCalib); - enLowFlowCalibrationStep=SEND_HIGH_FLOW_CALIB_REQUEST; - break; - } - else - { - // New motor speed - uiMotorDutyCyleForFlowCalib+=10; - enLowFlowCalibrationStep=SEND_FLOW_COMMAND; - } - - // Update motor speed - if (uiMotorDutyCyleForFlowCalib<MAX_PI_OUTPUT) - { - SS_Xputdw(mdrv, uiMotorDutyCyleForFlowCalib); - } - else - { - enLowFlowCalibrationStep=PREPARE_FAILURE_COMMAND; - break; - } - } - else // if (uiFlowTicksSamplesCounter!=0) - { - enLowFlowCalibrationStep=PREPARE_FAILURE_COMMAND; - } - break; - } - case SEND_HIGH_FLOW_CALIB_REQUEST: - { - if (TransferCommandToHandset((char*)szRequestHighFlowCalib)==TRUE) - enLowFlowCalibrationStep=WAIT_FOR_HIGH_FLOW_CALIB_ACK; - break; - } - case WAIT_FOR_HIGH_FLOW_CALIB_ACK: - { - // Wait for acknownledge from handset - if (ReadByteReceive(&cCharValue)==TRUE) - { - if (cCharValue=='@') - { - // Continue flow calibration - bHighFlowCalibrationInProgress=TRUE; - enLowFlowCalibrationStep=SEND_FLOW_COMMAND; - } - else - enLowFlowCalibrationStep=PREPARE_FAILURE_COMMAND; - } - break; - } - case PREPARE_FAILURE_COMMAND: - { - if (TransferCommandToHandset((char*)szEndOfCalibFailed)==TRUE) - enLowFlowCalibrationStep=END_OF_CALIBRATION; - break; - } - case PREPARE_SUCCESS_COMMAND: - { - if (TransferCommandToHandset((char*)szEndOfCalibOK)==TRUE) - enLowFlowCalibrationStep=END_OF_CALIBRATION; - break; - } - case SEND_COMMAND_TO_PF300: - { - // Send a byte every 1ms - if (TransferBufferToPF300()==TRUE) - { - // Buffer sent !! - if (ucNumberOfBytesToCheckFromPF300Answer!=0) - { - // Check answer from PF300 - ucIndexAnswerFromPF300=0; - uiCalibrationTimeOut=TIME_OUT_RECEPTION_PACKET_FROM_PF300; - enLowFlowCalibrationStep=CHECK_COMMAND_FROM_PF300; - } - else - enLowFlowCalibrationStep=enGoBackToStep; - } - break; - } - case CHECK_COMMAND_FROM_PF300: - { - if (uiCalibrationTimeOut==0) - { - // Time-out in reception !! - ucIndexAnswerFromPF300=0; - enLowFlowCalibrationStep=PREPARE_FAILURE_COMMAND; - } - else if (ReadByteReceive(&cCharValue)==TRUE) - { - // Check last byte received - if (cCharValue=='\r') - { - // End of answer => check buffer content - ucIndexAnswerFromPF300=0; - strcpy(szTempBuf, szAnswerFromPF300); - szTempBuf[ucNumberOfBytesToCheckFromPF300Answer]=0; - if (strcmp(szTempBuf, szExpectedAnswerFromPF300)==0) - { - // Buffer OK !! - enLowFlowCalibrationStep=enGoBackToStep; - } - else - { - // Buffer wrong !! - enLowFlowCalibrationStep=PREPARE_FAILURE_COMMAND; - } - } - else if (cCharValue=='?') - { - // PF300 is lost => end of calibration - ucIndexAnswerFromPF300=0; - enLowFlowCalibrationStep=PREPARE_FAILURE_COMMAND; - } - else - { - // Store byte from PF300 into buffer - szAnswerFromPF300[ucIndexAnswerFromPF300++]=cCharValue; - if (ucIndexAnswerFromPF300>=SIZE_RX_BUFFER_PF300) - { - // Answer too long !! - ucIndexAnswerFromPF300=0; - enLowFlowCalibrationStep=PREPARE_FAILURE_COMMAND; - } - else - { - // Add 0 at the end of the string - szAnswerFromPF300[ucIndexAnswerFromPF300]=0; - } - } - } - else - { - // No byte received !! - uiCalibrationTimeOut--; - } - break; - } - default: - case END_OF_CALIBRATION: - { - uiTechnicalDataSet[START_STOP_VENTILATION]=0; - bDisableMaroubraCommCommunication=FALSE; - break; - } - } // switch - - // Every 300ms, send '@*' to inform the handset that the blower works properly - if (uiImHereMsgTimer==0) - { - if (enLowFlowCalibrationStep!=SEND_COMMAND_TO_PF300) - { - uiImHereMsgTimer=300; - TransferCommandToHandset((char*)szImHere); - } - } - else - uiImHereMsgTimer--; -} - -/******************************************************************************* -* Function Name : ManagePressureCalibration -* Description : Manage pressure calibration -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void ManagePressureCalibration(void) -{ - char cCharValue; - char szTempBuf[SIZE_RX_BUFFER_PF300]; - u16 uiCalibPressureADCValue; - u16 uiCalibPressureValue; - u16 uiCalibPressureGain; - - switch(enPressureCalibrationStep) - { - case INIT_PRESSURE_CALIB_TEST: - { - // Init comm with PF300 => wait 2s before sending first command to PF300 - // We need to wait for this delay in order to the handset to activate its transparent mode - if (uiCalibrationTimeOut==0) - { - bDisableMaroubraCommCommunication=TRUE; - - // Prepare command to PF300 - UpdateBufferToSend((char*)szPF300_CmdSwitchOffEcho); - strcpy(szExpectedAnswerFromPF300, szPF300_AnswerSwitchOffEcho); - ucNumberOfBytesToCheckFromPF300Answer=strlen(szPF300_AnswerSwitchOffEcho); - enPressureCalibrationStep=PRESSURE_CALIB_SEND_COMMAND_TO_PF300; - enPressureCalibGoBackToStep=START_PRESSURE_READING; - } - else - { - uiCalibrationTimeOut--; - } - break; - } - case START_PRESSURE_READING: - { - // Set blower speed - SS_Xputdw(mdrv, 600); - - // Init variable for flow sensor - uiCalibrationTimeOut=SAMPLE_RATE_BETWEEN_TWO_PRESSURE; - ulSumPressureTicks=0; - uiPressureTicksSamplesCounter=0; - - enPressureCalibrationStep=SEND_PRESSURE_COMMAND; - break; - } - case SEND_PRESSURE_COMMAND: - { - if (uiCalibrationTimeOut!=0) - { - uiCalibrationTimeOut--; - - if (uiCalibrationTimeOut<2000) - { - ulSumPressureTicks+=uiProximalPressureADCMes; - uiPressureTicksSamplesCounter++; - } - } - else - { - // Prepare next command - UpdateBufferToSend((char*)szPF300_ReadPdiffCmd); - strcpy(szExpectedAnswerFromPF300, szPF300_ReadPdiffAnswer); - ucNumberOfBytesToCheckFromPF300Answer=strlen(szPF300_ReadPdiffAnswer); - enPressureCalibrationStep=PRESSURE_CALIB_SEND_COMMAND_TO_PF300; - enPressureCalibGoBackToStep=READ_PRESSURE_VALUE; - } - break; - } - case READ_PRESSURE_VALUE: - { - if (uiPressureTicksSamplesCounter!=0) - { - // Read PF300 pressure - strcpy(szTempBuf, &szAnswerFromPF300[ucNumberOfBytesToCheckFromPF300Answer]); - - // Store value of Pressure - uiCalibPressureValue=(unsigned int)atoi(szTempBuf); - - // Store ticks value - uiCalibPressureADCValue=ulSumPressureTicks/uiPressureTicksSamplesCounter; - uiCalibrationTimeOut=SAMPLE_RATE_BETWEEN_TWO_PRESSURE; - ulSumPressureTicks=0; - uiPressureTicksSamplesCounter=0; - - // Check if current pressure<10cmH20 - if (uiCalibPressureValue<1000) - { - enPressureCalibrationStep=PRESSURE_CALIB_FAILURE_COMMAND; - break; - } - - // Compute pressure gain - uiCalibPressureGain=(10000UL*(uiCalibPressureADCValue-uiTechnicalDataSet[PPROX_OFFSET_TEC]))/uiCalibPressureValue; - uiCalibPressureGain+=5; - uiCalibPressureGain/=10; - - // Check pressure gain range - if (uiCalibPressureGain<Tec_GainPprox_MIN || uiCalibPressureGain>Tec_GainPprox_MAX) - { - enPressureCalibrationStep=PRESSURE_CALIB_FAILURE_COMMAND; - } - else - { - enPressureCalibrationStep=PRESSURE_CALIB_SUCCESS_COMMAND; - - // Transfer the temporary LUT in the definitive LUT - uiTechnicalDataSet[PPROX_GAIN_TEC]=uiCalibPressureGain; - } - } - else // if (uiPressureTicksSamplesCounter!=0) - { - enPressureCalibrationStep=PRESSURE_CALIB_FAILURE_COMMAND; - } - break; - } - case PRESSURE_CALIB_FAILURE_COMMAND: - { - if (TransferCommandToHandset((char*)szEndOfCalibFailed)==TRUE) - enPressureCalibrationStep=PRESSURE_CALIB_END_OF_CALIBRATION; - break; - } - case PRESSURE_CALIB_SUCCESS_COMMAND: - { - if (TransferCommandToHandset((char*)szEndOfCalibOK)==TRUE) - enPressureCalibrationStep=PRESSURE_CALIB_END_OF_CALIBRATION; - break; - } - case PRESSURE_CALIB_SEND_COMMAND_TO_PF300: - { - // Send a byte every 1ms - if (TransferBufferToPF300()==TRUE) - { - // Buffer sent !! - if (ucNumberOfBytesToCheckFromPF300Answer!=0) - { - // Check answer from PF300 - ucIndexAnswerFromPF300=0; - uiCalibrationTimeOut=TIME_OUT_RECEPTION_PACKET_FROM_PF300; - enPressureCalibrationStep=PRESSURE_CALIB_CHECK_COMMAND_FROM_PF300; - } - else - enPressureCalibrationStep=enPressureCalibGoBackToStep; - } - break; - } - case PRESSURE_CALIB_CHECK_COMMAND_FROM_PF300: - { - if (uiCalibrationTimeOut==0) - { - // Time-out in reception !! - ucIndexAnswerFromPF300=0; - enPressureCalibrationStep=PRESSURE_CALIB_FAILURE_COMMAND; - } - else if (ReadByteReceive(&cCharValue)==TRUE) - { - // Check last byte received - if (cCharValue=='\r') - { - // End of answer => check buffer content - ucIndexAnswerFromPF300=0; - strcpy(szTempBuf, szAnswerFromPF300); - szTempBuf[ucNumberOfBytesToCheckFromPF300Answer]=0; - if (strcmp(szTempBuf, szExpectedAnswerFromPF300)==0) - { - // Buffer OK !! - enPressureCalibrationStep=enPressureCalibGoBackToStep; - } - else - { - // Buffer wrong !! - enPressureCalibrationStep=PRESSURE_CALIB_FAILURE_COMMAND; - } - } - else if (cCharValue=='?') - { - // PF300 is lost => end of calibration - ucIndexAnswerFromPF300=0; - enPressureCalibrationStep=PRESSURE_CALIB_FAILURE_COMMAND; - } - else - { - // Store byte from PF300 into buffer - szAnswerFromPF300[ucIndexAnswerFromPF300++]=cCharValue; - if (ucIndexAnswerFromPF300>=SIZE_RX_BUFFER_PF300) - { - // Answer too long !! - ucIndexAnswerFromPF300=0; - enPressureCalibrationStep=PRESSURE_CALIB_FAILURE_COMMAND; - } - else - { - // Add 0 at the end of the string - szAnswerFromPF300[ucIndexAnswerFromPF300]=0; - } - } - } - else - { - // No byte received !! - uiCalibrationTimeOut--; - } - break; - } - default: - case PRESSURE_CALIB_END_OF_CALIBRATION: - { - uiTechnicalDataSet[START_STOP_VENTILATION]=0; - bDisableMaroubraCommCommunication=FALSE; - break; - } - } // switch - - // Every 300ms, send '@*' to inform the handset that the blower works properly - if (uiImHereMsgTimer==0) - { - if (enPressureCalibrationStep!=PRESSURE_CALIB_SEND_COMMAND_TO_PF300) - { - uiImHereMsgTimer=300; - TransferCommandToHandset((char*)szImHere); - } - } - else - uiImHereMsgTimer--; -} - - -/******************************************************************************* -* Function Name : ManageCstPressure -* Description : Manage constant pressure -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void ManageCstPressure(void) -{ - int32_t lError; - int32_t lPropTerm; - int32_t lIntegralTerm; - int32_t lOutputPressure; - - - // Barometric Mode : error computation - lError=(int32_t)uiMLT_PressureSetPoint-(int32_t)uiProximalPressureMes; - lIntegralTerm = (int32_t)uiTechnicalDataSet[KI_CPAP_VENTED_PRESSURE_I] * lError; - if (uiMLT_PressureSetPoint<uiVentilationSet[PI_SET]) uiMLT_PressureSetPoint++; - - // Close loop in pressure - if ((lIntegral_Pressure_I>=0) && (lIntegralTerm>=0) && (bMaxPIOutputPressureI==FALSE)) - { - if ((lIntegral_Pressure_I + lIntegralTerm) <0) - lIntegral_Pressure_I = INTEGRAL_MAX; - else - lIntegral_Pressure_I += lIntegralTerm; - } - else if ((lIntegral_Pressure_I<=0) && (lIntegralTerm<=0) && (bMinPIOutputPressureI==FALSE)) - { - if ((lIntegral_Pressure_I + lIntegralTerm)>0) - lIntegral_Pressure_I = INTEGRAL_MIN; - else - lIntegral_Pressure_I += lIntegralTerm; - } - else if ((lIntegral_Pressure_I<=0) && (lIntegralTerm>=0)) - lIntegral_Pressure_I += lIntegralTerm; - else if ((lIntegral_Pressure_I>=0) && (lIntegralTerm<=0)) - lIntegral_Pressure_I += lIntegralTerm; - - lPropTerm = (int32_t)uiTechnicalDataSet[KP_CPAP_VENTED_PRESSURE_I] * lError; - lOutputPressure = (lIntegral_Pressure_I>>16) + (lPropTerm>>13); - - // Add constante value (PWM at the end of the previous inspiration) - //lOutputPressure+=300; - - if (lOutputPressure>=((int32_t)MAX_VOLTAGE_REF)) - { - bMaxPIOutputPressureI = TRUE; - uiInspirationBlowerPWMTec=MAX_VOLTAGE_REF; - } - else if (lOutputPressure<((int32_t)MIN_VOLTAGE_REF)) - { - bMinPIOutputPressureI = TRUE; - uiInspirationBlowerPWMTec=MIN_VOLTAGE_REF; - } - else - { - bMaxPIOutputPressureI = FALSE; - bMinPIOutputPressureI = FALSE; - uiInspirationBlowerPWMTec = lOutputPressure; - } - - // Update Blower Speed - SS_Xputdw(mdrv, uiInspirationBlowerPWMTec); - - // Monitoring and Alarm (every 1s) - #ifdef MOTOR_LIFE_TESTING - if (uiAverageMonitoringMLT==0) - { - uiAverageBlowerSpeedMes=ulMLT_SumSpeedMes/MLT_AVERAGE_MONITORING; - uiBreathBlowerCurrentMes=ulMLT_SumCurrentMes/MLT_AVERAGE_MONITORING; - uiAverateMotorTempMes=ulMLT_SumTemperatureMes/MLT_AVERAGE_MONITORING; - uiAverageMotorVoltage=ulMLT_SumBlowerVoltage/MLT_AVERAGE_MONITORING; - - ulMLT_SumSpeedMes=0; - ulMLT_SumCurrentMes=0; - ulMLT_SumTemperatureMes=0; - ulMLT_SumBlowerVoltage=0; - uiAverageMonitoringMLT=MLT_AVERAGE_MONITORING; - } - else - { - ulMLT_SumSpeedMes+=uiBlowerSpeedMes; - ulMLT_SumCurrentMes+=uiBlowerCurrentMes; - ulMLT_SumTemperatureMes+=uiTechnicalDataMes[MOTOR_TEMPERATURE_TEC_MES]; - ulMLT_SumBlowerVoltage+=uiTechnicalDataMes[MOTOR_VOLTAGE_TEC_MES]; - uiAverageMonitoringMLT--; - } - - // Alarms management - if (uiMLT_EnableAlarm==0) - { - // High Speed alarm - if (uiAverageBlowerSpeedMes>uiTechnicalDataSet[MLT_HIGH_SPEED_TEC]) - uiFlagsAlarm[ALARM_FLAGS2]|=HIGH_BLOWER_SPEED_ALARM_MASK; - - // Low Speed alarm - if (uiAverageBlowerSpeedMes<uiTechnicalDataSet[MLT_LOW_SPEED_TEC]) - uiFlagsAlarm[ALARM_FLAGS2]|=LOW_BLOWER_SPEED_ALARM_MASK; - - // High blower current alarm - if (uiBreathBlowerCurrentMes>uiTechnicalDataSet[MLT_HIGH_CURRENT_TEC]) - uiFlagsAlarm[ALARM_FLAGS2]|=HIGH_BLOWER_CURRENT_ALARM_MASK; - - // High Blower temperature - if (uiAverateMotorTempMes>uiTechnicalDataSet[MLT_HIGH_TEMPERATURE_TEC]) - uiFlagsAlarm[ALARM_FLAGS2]|=HIGH_BLOWER_TEMP_ALARM_MASK; - - // Low Blower temperature - if (uiAverateMotorTempMes<100) - uiFlagsAlarm[ALARM_FLAGS2]|=LOW_BLOWER_TEMP_ALARM_MASK; - - // High Blower Flow - if (iBlowerFlowSmoothingMesForTrigger>uiTechnicalDataSet[MLT_HIGH_FLOW_TEC] || iBlowerFlowSmoothingMesForTrigger<uiTechnicalDataSet[MLT_LOW_FLOW_TEC]) - uiFlagsAlarm[ALARM_FLAGS2]|=OOR_BLOWER_FLOW_ALARM_MASK; - } - else - uiMLT_EnableAlarm--; - #endif // MOTOR_LIFE_TESTING -} - - -/******************************************************************************* -* Function Name : ManagePACVVentilation -* Description : Manage Bilevel ventilation -* Input : bPSMode=true in PS mode, false in PI mode -* Output : None -* Return : None -*******************************************************************************/ -void ManagePACVVentilation(bool bPSMode) -{ -int32_t lError; -int32_t lPropTerm; -int32_t lIntegralTerm; -int32_t lOutputPressure; -u16 uiPressureSetPoint; -u16 uiTiMax; -u16 uiTiMin; -//u16 uiTeMax; -u16 uiFlowMaxInExpi; - -if (ucVentilationCycle==INSPIRATION_CYCLE) - { - // --------------------------------------------------------------------------- - // - INSPIRATION - - // -------------------------------------------------------------------------- - - // Ti et pressure set point management - if (bPSMode==TRUE) - { - uiPressureSetPoint=uiVentilationSet[PS_SET]; - uiTiMax=uiVentilationSet[TI_MAX_SET]; - } - else - { - uiPressureSetPoint=uiVentilationSet[PI_SET]; - uiTiMax=uiVentilationSet[TI_BARO_SET]; - } - - // Compute Timin - if (uiPatientType==PATIENT_ADULT) - uiTiMin=TiBaroSet_A_MIN; - else - uiTiMin=TiBaroSet_P_MIN; - - // Limit the pressure setting - if (uiVentilationSet[HIGH_PRESSURE_ALARM_SET]<uiPressureSetPoint) - uiPressureSetPoint=uiVentilationSet[HIGH_PRESSURE_ALARM_SET]; - - if (uiTiD==0) - { - // Management Expiratory Trigger - ucTempoTriggerExpiAuto=TEMPO_TRIGGER_EXPI; - ucExpiTriggerTreshold=MIN_THRESHOLD_EXPI_TRIGGER_AUTO; - - // Management Inspiratory slope - switch(uiVentilationSet[SLOPE_BARO_SET]) - { - default: - case 1: - { - // Slope of 5ms/hPa => 0.2hPa/ms - uiIpapSettingTemp=uiVentilationSet[PEEP_SET]+2; - break; - } - case 2: - { - ucIndexTableSlope=0; - uiIpapSettingTemp=(uiPressureSetPoint*ucSlope2Table[ucIndexTableSlope++])/100; - break; - } - case 3: - { - ucIndexTableSlope=0; - uiIpapSettingTemp=(uiPressureSetPoint*ucSlope3Table[ucIndexTableSlope++])/100; - break; - } - case 4: - { - ucIndexTableSlope=0; - uiIpapSettingTemp=(uiPressureSetPoint*ucSlope4Table[ucIndexTableSlope++])/100; - break; - } - } - } - else - { - // Management Inspiratory slope - switch(uiVentilationSet[SLOPE_BARO_SET]) - { - default: - case 1: - { - // Slope of 5ms/hPa => 0.2hPa/ms - uiIpapSettingTemp+=2; - if (uiIpapSettingTemp>uiPressureSetPoint) - uiIpapSettingTemp=uiPressureSetPoint; - break; - } - case 2: - { - if (ucIndexTableSlope<SIZE_SLOPE2_TABLE && (uiTiD%10)==0) - uiIpapSettingTemp=(uiPressureSetPoint*ucSlope2Table[ucIndexTableSlope++])/100; - break; - } - case 3: - { - if (ucIndexTableSlope<SIZE_SLOPE3_TABLE && (uiTiD%10)==0) - uiIpapSettingTemp=(uiPressureSetPoint*ucSlope3Table[ucIndexTableSlope++])/100; - break; - } - case 4: - { - if (ucIndexTableSlope<SIZE_SLOPE4_TABLE && (uiTiD%10)==0) - uiIpapSettingTemp=(uiPressureSetPoint*ucSlope4Table[ucIndexTableSlope++])/100; - break; - } - } - } - - // Barometric Mode : error computation - lError=(int32_t)uiIpapSettingTemp-(int32_t)uiProximalPressureMes; - if (fFirstCycleInspi==FALSE) - lIntegralTerm = (int32_t)uiTechnicalDataSet[KI_VENTED_PRESSURE_I] * lError; - else - { - lIntegralTerm = (int32_t)(uiTechnicalDataSet[KI_VENTED_PRESSURE_I]>>2) * lError; - uiPWMatTheEndOfInspiration=uiExpirationBlowerPWMTec; - } - - // Close loop in pressure - if ((lIntegral_Pressure_I>=0) && (lIntegralTerm>=0) && (bMaxPIOutputPressureI==FALSE)) - { - if ((lIntegral_Pressure_I + lIntegralTerm) <0) - lIntegral_Pressure_I = INTEGRAL_MAX; - else - lIntegral_Pressure_I += lIntegralTerm; - } - else if ((lIntegral_Pressure_I<=0) && (lIntegralTerm<=0) && (bMinPIOutputPressureI==FALSE)) - { - if ((lIntegral_Pressure_I + lIntegralTerm)>0) - lIntegral_Pressure_I = INTEGRAL_MIN; - else - lIntegral_Pressure_I += lIntegralTerm; - } - else if ((lIntegral_Pressure_I<=0) && (lIntegralTerm>=0)) - lIntegral_Pressure_I += lIntegralTerm; - else if ((lIntegral_Pressure_I>=0) && (lIntegralTerm<=0)) - lIntegral_Pressure_I += lIntegralTerm; - - lPropTerm = (int32_t)uiTechnicalDataSet[KP_VENTED_PRESSURE_I] * lError; - lOutputPressure = (lIntegral_Pressure_I>>16) + (lPropTerm>>13); - - // Add constante value (PWM at the end of the previous inspiration) - lOutputPressure+=uiPWMatTheEndOfInspiration; - - if (fAlarmPmax==TRUE || fAlarmVtiMax==TRUE) - { - bMaxPIOutputPressureI = TRUE; - } - else if (lOutputPressure>=((int32_t)MAX_VOLTAGE_REF)) - { - bMaxPIOutputPressureI = TRUE; - uiInspirationBlowerPWMTec=MAX_VOLTAGE_REF; - } - else if (lOutputPressure<((int32_t)MIN_VOLTAGE_REF)) - { - bMinPIOutputPressureI = TRUE; - uiInspirationBlowerPWMTec=MIN_VOLTAGE_REF; - } - else - { - bMaxPIOutputPressureI = FALSE; - bMinPIOutputPressureI = FALSE; - uiInspirationBlowerPWMTec = lOutputPressure; - } - - // Update Blower Speed - SS_Xputdw(mdrv, uiInspirationBlowerPWMTec); - - // ************************ CYCLE MANAGEMENT ********************************* - uiTiD++; - if ((uiTiD>=uiTiMax) || - (TestTriggerExpiratoire(uiVentilationSet[TRIG_E_SET], uiVentilationSet[PS_SET])==TRUE && uiTiD>uiVentilationSet[TI_MIN_SET] && bPSMode==TRUE) || - (fAlarmPmax==TRUE && uiTiD>uiTiMin) || - (fAlarmVtiMax==TRUE && uiTiD>uiTiMin)) - { - // Beginning of the expiration - if (fAlarmPmax==FALSE && fAlarmVtiMax==FALSE) - { - fFirstCycleInspi=FALSE; - uiPWMatTheEndOfInspiration=uiInspirationBlowerPWMTec; - } - else - { - fFirstCycleInspi=TRUE; - uiPWMatTheEndOfInspiration=MIN_VOLTAGE_REF; - } - - ucVentilationCycle=EXPIRATION_CYCLE; - uiTiD=0; - - // Reset PI variables for next inspiration - lIntegral_Pressure_E=0; - bMaxPIOutputPressureE=FALSE; - bMinPIOutputPressureE=FALSE; - - fFirstCycleExpi=FALSE; - } - } -else - { - // --------------------------------------------------------------------------- - // - EXPIRATION - - // --------------------------------------------------------------------------- - - // *************************** UPDATE SETTINGS ******************************* - if (ApplyNewVentilationMode()==TRUE) - return; - - // ******************** MAIN BLOWER MANAGEMENT ******************************* - if (uiVentilationSet[PEEP_SET]==0) - { - uiExpirationBlowerPWMTec=MIN_VOLTAGE_REF; - SS_Xputdw(mdrv, uiExpirationBlowerPWMTec); - } - else - { - if (uiTeD==0) - { - // First blower current setting - uiEpapSettingTemp=uiVentilationSet[PI_SET]-2; // Slope of 5ms/hPa => 0.2hPa/ms - } - else - { - // we increase the speed of the blower every 1ms - uiEpapSettingTemp-=2; // Slope of 5ms/hPa => 0.2hPa/ms - if (uiEpapSettingTemp<uiVentilationSet[PEEP_SET]) - uiEpapSettingTemp=uiVentilationSet[PEEP_SET]; - } - - // Barometric Mode : error computation - if (fFirstCycleExpi==FALSE) - { - lError=(int32_t)uiEpapSettingTemp-(int32_t)uiProximalPressureMes; - lIntegralTerm = (int32_t)uiTechnicalDataSet[KI_VENTED_PRESSURE_E] * lError; - } - else - { - lError=(int32_t)uiVentilationSet[PEEP_SET]-(int32_t)uiProximalPressureMes; - lIntegralTerm = (int32_t)(uiTechnicalDataSet[KI_VENTED_PRESSURE_E]>>2) * lError; - } - - // Close loop in pressure - if ((lIntegral_Pressure_E>=0) && (lIntegralTerm>=0) && (bMaxPIOutputPressureE==FALSE)) - { - if ((lIntegral_Pressure_E + lIntegralTerm) <0) - lIntegral_Pressure_E = INTEGRAL_MAX; - else - lIntegral_Pressure_E += lIntegralTerm; - } - else if ((lIntegral_Pressure_E<=0) && (lIntegralTerm<=0) && (bMinPIOutputPressureE==FALSE)) - { - if ((lIntegral_Pressure_E + lIntegralTerm)>0) - lIntegral_Pressure_E = INTEGRAL_MIN; - else - lIntegral_Pressure_E += lIntegralTerm; - } - else if ((lIntegral_Pressure_E<=0) && (lIntegralTerm>=0)) - lIntegral_Pressure_E += lIntegralTerm; - else if ((lIntegral_Pressure_E>=0) && (lIntegralTerm<=0)) - lIntegral_Pressure_E += lIntegralTerm; - - lPropTerm = (int32_t)uiTechnicalDataSet[KP_VENTED_PRESSURE_E] * lError; - lOutputPressure = (lIntegral_Pressure_E>>16) + (lPropTerm>>13); - - // Add constante value (PWM at the end of the previous expiration) - lOutputPressure+=uiPWMatTheEndOfExpiration; - - // Flow limiting - uiFlowMaxInExpi=uiMaximumFlowInExpiration[uiVentilationSet[PS_CPAP_SET]/10]; - if (lError>5 && iBlowerFlowSmoothingMes>(int16_t)uiFlowMaxInExpi) - { - // Impossible to maintain the peep (patient disconnection) - if (uiDisconnectionTime==0) - { - fBlockCloseLoop=TRUE; // Block the close loop - if (uiMemoPWMDuringDisconnection!=0) // Apply a fixed PWM value - uiExpirationBlowerPWMTec=uiMemoPWMDuringDisconnection; - else - uiExpirationBlowerPWMTec=MIN_VOLTAGE_REF; - } - else - uiDisconnectionTime--; - } - else if (iBlowerFlowSmoothingMes<(int16_t)uiFlowMaxInExpi && (lError>(-2) && lError<2)) - { - // Good pressure : no disconnection - uiDisconnectionTime=EXPIRATORY_DISCONNECTION_TIME_OUT; - if (fBlockCloseLoop==TRUE) - { - // The close loop was block before => unblock it - fBlockCloseLoop=FALSE; - lIntegral_Pressure_E=0; - bMaxPIOutputPressureE = FALSE; - bMinPIOutputPressureE = FALSE; - lOutputPressure=uiPWMatTheEndOfExpiration=uiExpirationBlowerPWMTec; - } - else if (iBlowerFlowSmoothingMes>=0) - { - // Record current PWM - uiMemoPWMDuringDisconnection=uiExpirationBlowerPWMTec; - } - } - - // Unblock the close loop every 4s in case of none recorded PWM value - if (fBlockCloseLoop==TRUE && uiMemoPWMDuringDisconnection==0 && uiTeD==0) - { - uiDisconnectionTime=EXPIRATORY_DISCONNECTION_TIME_OUT; - fBlockCloseLoop=FALSE; - lIntegral_Pressure_E=0; - bMaxPIOutputPressureE = FALSE; - bMinPIOutputPressureE = FALSE; - lOutputPressure=uiPWMatTheEndOfExpiration=uiExpirationBlowerPWMTec; - } - - // Update blower PWM - if (fBlockCloseLoop==TRUE) - { - bMaxPIOutputPressureE = TRUE; - } - else if (lOutputPressure>=((int32_t)MAX_VOLTAGE_REF)) - { - bMaxPIOutputPressureE = TRUE; - uiExpirationBlowerPWMTec=MAX_VOLTAGE_REF; - } - else if (lOutputPressure<((int32_t)MIN_VOLTAGE_REF)) - { - bMinPIOutputPressureE = TRUE; - uiExpirationBlowerPWMTec=MIN_VOLTAGE_REF; - } - else - { - bMaxPIOutputPressureE = FALSE; - bMinPIOutputPressureE = FALSE; - uiExpirationBlowerPWMTec = lOutputPressure; - } - SS_Xputdw(mdrv, uiExpirationBlowerPWMTec); - } - - // Expiratory time - uiTeD++; - if (uiTeD>TE_SET_MAX) uiTeD=TE_SET_MAX; - if ((uiTeD>=uiTeBaroSet && bPSMode==FALSE) || TestInspiratoryTrigger(bPSMode, uiTeD, uiVentilationSet[TRIG_I_FLOW_SET])==TRUE) - { - ucVentilationCycle=INSPIRATION_CYCLE; - uiTeD=0; - - // Record PWM value at the end of the expiration - uiPWMatTheEndOfExpiration=uiExpirationBlowerPWMTec; - - // Reset PI variables for next inspiration - lIntegral_Pressure_I=0; - bMaxPIOutputPressureI=FALSE; - bMinPIOutputPressureI=FALSE; - } - } -} - - - -/******************************************************************************* -* Function Name : ManageVolumetricVentilation -* Description : Manage Volumetric Ventilation -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void ManageVolumetricVentilation(void) -{ -int32_t lError; -int32_t lPropTerm; -int32_t lIntegralTerm; -int32_t lOutputPressure; -int16_t iMaxVtAdjust; -u16 uiFlowMaxInExpi; -u16 uiTiMin; - -if (ucVentilationCycle==INSPIRATION_CYCLE) - { - // --------------------------------------------------------------------------- - // - INSPIRATION - - // --------------------------------------------------------------------------- - - // Compute Timin - if (uiPatientType==PATIENT_ADULT) - uiTiMin=TiVoluSet_A_MIN; - else - uiTiMin=TiVoluSet_P_MIN; - - // ************************** Main Blower MANAGEMENT ************************* - if (uiTiD==0) - { - // Compute Volume adjustment - if (fFirstCycleInspi==FALSE) - { - if ((uiFlagsAlarm[ALARM_FLAGS1]&HIGH_PRESSURE_ALARM_MASK)==0) - { - if (ucCounterHPAlarm==0) - { - iVtAdjust+=(((int16_t)uiVentilationSet[VT_SET]-(int16_t)uiRecordVtiMes>>1)); - if (iVtAdjust>0) - { - iMaxVtAdjust=(int16_t)(uiVentilationSet[VT_SET]>>1); // >0 - if (iVtAdjust>iMaxVtAdjust) - iVtAdjust=iMaxVtAdjust; - } - else if (iVtAdjust<0) - { - iMaxVtAdjust=(int16_t)(~(uiVentilationSet[VT_SET]>>1)+1); // <0 - if (iVtAdjust<iMaxVtAdjust) - iVtAdjust=iMaxVtAdjust; - } - } - else - ucCounterHPAlarm--; - } - else - ucCounterHPAlarm=1; - } - else - iVtAdjust=0; - - ComputeInspiratoryFlowSetPointInAVC(uiPatientType, (u16)((int16_t)uiVentilationSet[VT_SET]+iVtAdjust), uiVentilationSet[TI_VOLU_SET], uiVentilationSet[SHAPE_SET], &ulMaxIFlowSet, &ulMinIFlowSet, &ulDecFlowStep); - } - else - { - if (ulMaxIFlowSet>=ulDecFlowStep) - ulMaxIFlowSet-=ulDecFlowStep; - if (ulMaxIFlowSet<ulMinIFlowSet) - ulMaxIFlowSet=ulMinIFlowSet; - } - - // Volumetric Mode : error computation - //lError=(int32_t)(ulMaxIFlowSet/100)-iBlowerFlowMes; - lError=(int32_t)(ulMaxIFlowSet/100)-iBlowerFlowSmoothingMes; - if (fFirstCycleInspi==FALSE) - { - if (ulMaxIFlowSet<150000 && uiTiD>30000) - lIntegralTerm = (int32_t)(uiTechnicalDataSet[KI_FLOW_I]>>1) * lError; - else - lIntegralTerm = (int32_t)uiTechnicalDataSet[KI_FLOW_I] * lError; - } - else - lIntegralTerm = (int32_t)(uiTechnicalDataSet[KI_FLOW_I]>>2) * lError; - - // Close loop in pressure or flow (PI) - if ((lIntegral_Flow_I>=0) && (lIntegralTerm>=0) && (bMaxPIOutputFlowI==FALSE)) - { - if ((lIntegral_Flow_I + lIntegralTerm) <0) - lIntegral_Flow_I = INTEGRAL_MAX; - else - lIntegral_Flow_I += lIntegralTerm; - } - else if ((lIntegral_Flow_I<=0) && (lIntegralTerm<=0) && (bMinPIOutputFlowI==FALSE)) - { - if ((lIntegral_Flow_I + lIntegralTerm)>0) - lIntegral_Flow_I = INTEGRAL_MIN; - else - lIntegral_Flow_I += lIntegralTerm; - } - else if ((lIntegral_Flow_I<=0) && (lIntegralTerm>=0)) - lIntegral_Flow_I += lIntegralTerm; - else if ((lIntegral_Flow_I>=0) && (lIntegralTerm<=0)) - lIntegral_Flow_I += lIntegralTerm; - - lPropTerm = (int32_t)uiTechnicalDataSet[KP_FLOW_I] * lError; - lOutputPressure = (lIntegral_Flow_I>>16) + (lPropTerm>>13); - - // Add constante value (PWM at the end of the previous inspiration) - lOutputPressure+=uiPWMatTheEndOfExpiration; - - if (lOutputPressure>=((int32_t)MAX_VOLTAGE_REF)) - { - bMaxPIOutputFlowI = TRUE; - uiInspirationBlowerPWMTec=MAX_VOLTAGE_REF; - } - else if (lOutputPressure<((int32_t)MIN_VOLTAGE_REF)) - { - bMinPIOutputFlowI = TRUE; - uiInspirationBlowerPWMTec=MIN_VOLTAGE_REF; - } - else - { - bMaxPIOutputFlowI = FALSE; - bMinPIOutputFlowI = FALSE; - uiInspirationBlowerPWMTec = lOutputPressure; - } - - // Update Blower Speed - SS_Xputdw(mdrv, uiInspirationBlowerPWMTec); - - // ************************ CYCLE MANAGEMENT ********************************* - uiTiD++; - if ((uiTiD>=uiVentilationSet[TI_VOLU_SET]) || - (fAlarmPmax==TRUE && uiTiD>uiTiMin)) - { - // Beginning of the expiration - uiPWMatTheEndOfInspiration=uiInspirationBlowerPWMTec; - uiProximalPressureAtTheEndOfInspiration=uiProximalPressureMes; - - ucVentilationCycle=EXPIRATION_CYCLE; - uiTiD=0; - - // Reset PI variables for next inspiration - lIntegral_Pressure_E=0; - bMaxPIOutputPressureE=FALSE; - bMinPIOutputPressureE=FALSE; - - fFirstCycleExpi=FALSE; - fFirstCycleInspi=FALSE; - } - } -else - { - // --------------------------------------------------------------------------- - // - EXPIRATION - - // --------------------------------------------------------------------------- - - // *************************** UPDATE SETTINGS ******************************* - if (ApplyNewVentilationMode()==TRUE) - return; - - // ******************** MAIN BLOWER MANAGEMENT ******************************* - if (uiVentilationSet[PEEP_SET]==0) - { - uiExpirationBlowerPWMTec=MIN_VOLTAGE_REF; - SS_Xputdw(mdrv, uiExpirationBlowerPWMTec); - } - else - { - if (uiTeD==0) - { - // First blower pressure setting - if (uiProximalPressureAtTheEndOfInspiration<uiVentilationSet[PEEP_SET]) - uiEpapSettingTemp=uiVentilationSet[PEEP_SET]; - else if (uiProximalPressureAtTheEndOfInspiration>=2) - uiEpapSettingTemp=uiProximalPressureAtTheEndOfInspiration-2; // Slope of 5ms/hPa => 0.2hPa/ms - else - uiEpapSettingTemp=uiVentilationSet[PEEP_SET]; - } - else - { - // we decrease the speed of the blower every 1ms - if (uiEpapSettingTemp>=2) - uiEpapSettingTemp-=2; // Slope of 5ms/hPa => 0.2hPa/ms - } - - // Pressure set point limitation - if (uiEpapSettingTemp<uiVentilationSet[PEEP_SET]) - uiEpapSettingTemp=uiVentilationSet[PEEP_SET]; - - // Barometric Mode : error computation - if (fFirstCycleExpi==FALSE) - { - lError=(int32_t)uiEpapSettingTemp-(int32_t)uiProximalPressureMes; - lIntegralTerm = (int32_t)uiTechnicalDataSet[KI_VENTED_PRESSURE_E] * lError; - } - else - { - lError=(int32_t)uiVentilationSetTemp[PEEP_SET]-(int32_t)uiProximalPressureMes; - lIntegralTerm = (int32_t)(uiTechnicalDataSet[KI_VENTED_PRESSURE_E]>>2) * lError; - } - - // Close loop in pressure - if ((lIntegral_Pressure_E>=0) && (lIntegralTerm>=0) && (bMaxPIOutputPressureE==FALSE)) - { - if ((lIntegral_Pressure_E + lIntegralTerm) <0) - lIntegral_Pressure_E = INTEGRAL_MAX; - else - lIntegral_Pressure_E += lIntegralTerm; - } - else if ((lIntegral_Pressure_E<=0) && (lIntegralTerm<=0) && (bMinPIOutputPressureE==FALSE)) - { - if ((lIntegral_Pressure_E + lIntegralTerm)>0) - lIntegral_Pressure_E = INTEGRAL_MIN; - else - lIntegral_Pressure_E += lIntegralTerm; - } - else if ((lIntegral_Pressure_E<=0) && (lIntegralTerm>=0)) - lIntegral_Pressure_E += lIntegralTerm; - else if ((lIntegral_Pressure_E>=0) && (lIntegralTerm<=0)) - lIntegral_Pressure_E += lIntegralTerm; - - lPropTerm = (int32_t)uiTechnicalDataSet[KP_VENTED_PRESSURE_E] * lError; - lOutputPressure = (lIntegral_Pressure_E>>16) + (lPropTerm>>13); - - // Add constante value (PWM at the end of the previous expiration) - lOutputPressure+=uiPWMatTheEndOfExpiration; - - // Flow limiting - uiFlowMaxInExpi=uiMaximumFlowInExpiration[uiVentilationSet[PS_CPAP_SET]/10]; - if (lError>5 && iBlowerFlowSmoothingMes>(int16_t)uiFlowMaxInExpi) - { - // Impossible to maintain the peep (patient disconnection) - if (uiDisconnectionTime==0) - { - fBlockCloseLoop=TRUE; // Block the close loop - if (uiMemoPWMDuringDisconnection!=0) // Apply a fixed PWM value - uiExpirationBlowerPWMTec=uiMemoPWMDuringDisconnection; - else - uiExpirationBlowerPWMTec=MIN_VOLTAGE_REF; - } - else - uiDisconnectionTime--; - } - else if (iBlowerFlowSmoothingMes<(int16_t)uiFlowMaxInExpi && (lError>(-2) && lError<2)) - { - // Good pressure : no disconnection - uiDisconnectionTime=EXPIRATORY_DISCONNECTION_TIME_OUT; - if (fBlockCloseLoop==TRUE) - { - // The close loop was block before => unblock it - fBlockCloseLoop=FALSE; - lIntegral_Pressure_E=0; - bMaxPIOutputPressureE = FALSE; - bMinPIOutputPressureE = FALSE; - lOutputPressure=uiPWMatTheEndOfExpiration=uiExpirationBlowerPWMTec; - } - else if (iBlowerFlowSmoothingMes>=0) - { - // Record current PWM - uiMemoPWMDuringDisconnection=uiExpirationBlowerPWMTec; - } - } - - // Unblock the close loop every 4s in case of none recorded PWM value - if (fBlockCloseLoop==TRUE && uiMemoPWMDuringDisconnection==0 && uiTeD==0) - { - uiDisconnectionTime=EXPIRATORY_DISCONNECTION_TIME_OUT; - fBlockCloseLoop=FALSE; - lIntegral_Pressure_E=0; - bMaxPIOutputPressureE = FALSE; - bMinPIOutputPressureE = FALSE; - lOutputPressure=uiPWMatTheEndOfExpiration=uiExpirationBlowerPWMTec; - } - - // Update blower PWM - if (fBlockCloseLoop==TRUE) - { - bMaxPIOutputPressureE = TRUE; - } - else if (lOutputPressure>=((int32_t)MAX_VOLTAGE_REF)) - { - bMaxPIOutputPressureE = TRUE; - uiExpirationBlowerPWMTec=MAX_VOLTAGE_REF; - } - else if (lOutputPressure<((int32_t)MIN_VOLTAGE_REF)) - { - bMinPIOutputPressureE = TRUE; - uiExpirationBlowerPWMTec=MIN_VOLTAGE_REF; - } - else - { - bMaxPIOutputPressureE = FALSE; - bMinPIOutputPressureE = FALSE; - uiExpirationBlowerPWMTec = lOutputPressure; - } - // Update Blower Speed - SS_Xputdw(mdrv, uiExpirationBlowerPWMTec); - } - - // Expiratory time - uiTeD++; - if (uiTeD>=uiTeVoluSet || TestInspiratoryTrigger(FALSE, uiTeD, uiVentilationSet[TRIG_I_FLOW_SET])==TRUE) - { - ucVentilationCycle=INSPIRATION_CYCLE; - uiTeD=0; - - // Record PWM value at the end of the expiration - if (fBlockCloseLoop==FALSE) - uiPWMatTheEndOfExpiration=uiExpirationBlowerPWMTec; - else - uiPWMatTheEndOfExpiration=0; - fBlockCloseLoop=FALSE; - - // Reset PI variables for next inspiration - lIntegral_Flow_I=0; - bMaxPIOutputFlowI=FALSE; - bMinPIOutputFlowI=FALSE; - } - } -} - - - -/******************************************************************************* -* Function Name : LaunchTherapyEngine -* Description : Select and launch the therapy engine -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void LaunchTherapyEngine(void) -{ - if (bMemoStartVentilation==TRUE) - { - // ---- Check new configuration - if (uiTechnicalDataSet[DEVICE_MODE_TEC]!=uiPreviousDeviceMode) - { - UpdateSettings(); - enPreviousMode=NUMBER_OF_MODE; // Force full init of the variables - InitVentilation(); - uiPreviousDeviceMode=uiTechnicalDataSet[DEVICE_MODE_TEC]; - } - - - switch(uiTechnicalDataSet[DEVICE_MODE_TEC]) - { - default: - case VENTILATION_MODE: - { - if (enVentilationMode==PS_MODE) - ManagePACVVentilation(TRUE); - else if (enVentilationMode==APCV_MODE) - ManagePACVVentilation(FALSE); - else if (enVentilationMode==AVC_MODE) - ManageVolumetricVentilation(); - else if (enVentilationMode==CPAP_MODE) - ManageCPAPVentilation(); - break; - } - case ONE_CST_PWM_MODE: - { - ManageOneCstPWM(); - break; - } - case TWO_CST_PWM_MODE: - { - Manage2CstPWM(); - break; - } - case CST_SPEED_MODE: - { - ManageCstSpeed(); - break; - } - case FLOW_CAL_MODE: - { - ManageFlowCalibration(); - break; - } - case PRESSURE_CAL_MODE: - { - ManagePressureCalibration(); - break; - } - case PRESSURE_CST_MODE: - { - ManageCstPressure(); - break; - } - } - } -} - - -/******************************************************************************* -* Function Name : StartStopVentilation -* Description : Detect a start/stop ventilation request -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void StartStopVentilation(void) -{ - #ifndef TEMPERATURE_TRENDS - opstatus_t byOpStatus; - #endif - - // Check if an alarm must stop the ventilation - ucStopVentilationAlarmNumber=ReadStopVentilationAlarmNumber(); - - #ifndef TEMPERATURE_TRENDS - if (uiTechnicalDataSet[START_STOP_VENTILATION]==1 && ucStopVentilationAlarmNumber==SIZE_BLOWER_ALARM) - { - // *************** VENTILATION is ON ************** - if (bMemoStartVentilation==FALSE) - { - switch(ucStartVentilationScheduler) - { - default: - case 0: - { - // Active the HW safety system - ControlHW(BLOWER_ON__PAT_CPLD); - ucStartVentilationScheduler++; - break; - } - case 1: - { - // Pat CPLD (WDI_CPLD), STOP_BLOWER=1 - ControlHW(BLOWER_ON__PAT_CPLD); - - // Read Offset of the Blower current - ComputeADCBlowerCurrent(TRUE); - - ucStartVentilationScheduler++; - break; - } - case 2: - { - // Pat CPLD (WDI_CPLD), STOP_BLOWER=1 - ControlHW(BLOWER_ON__PAT_CPLD); - - // Open motor driver - byOpStatus=SS_Xopen(mdrv); - if (byOpStatus==OPSTATUS_FAIL) - { - uiFlagsAlarm[ALARM_FLAGS2]|=MOTOR_FAILURE_ALARM_MASK; - ucStartVentilationScheduler=0; - } - else if (byOpStatus==OPSTATUS_OK) - { - // Force init settings and variables - uiPreviousDeviceMode=0xFF; - - uiTempo1min=TEMPO_1MIN; - #ifdef DATA_LOGGING - uiTrendsSampleTime=RECORD_TRENDS_SAMPLE_TIME; - #endif // DATA_LOGGING - - // Check if ventilation mode is activated - if (uiTechnicalDataSet[DEVICE_MODE_TEC]!=VENTILATION_MODE) - uiFlagsAlarm[ALARM_FLAGS2]|=DEVICE_MODE_ALARM_MASK; - - bMemoStartVentilation=TRUE; - ucStartVentilationScheduler=0; - } - break; - } - } - } - // --- Check Safety system for Motor transistors ---- - else if (IsMotorOK()==FALSE) - { - ControlHW(BLOWER_OFF__STOP_PAT_CPLD); - uiFlagsAlarm[ALARM_FLAGS2]|=MOTOR_FAILURE_ALARM_MASK; - } - // --- Test safety system thanks to the "STOP_BLOWER" Input pin - else if (TestStopBlowerInputPin()==OPSTATUS_OK) - { - ControlHW(BLOWER_ON__PAT_CPLD); - uiFlagsAlarm[ALARM_FLAGS2]&=(~HW_SAFETY_ALARM_MASK); - } - else - { - uiFlagsAlarm[ALARM_FLAGS2]|=HW_SAFETY_ALARM_MASK; - } - } - else - #endif // #ifndef TEMPERATURE_TRENDS - { - // *************** VENTILATION is OFF ************** - uiFlagsAlarm[ALARM_FLAGS2]&=(~DEVICE_MODE_ALARM_MASK); - - if (ucStopVentilationAlarmNumber!=SIZE_BLOWER_ALARM) - { - // Stop patting CPLD (WDI_CPLD=0), STOP_BLOWER=0 - ControlHW(BLOWER_OFF__STOP_PAT_CPLD); - } - else - { - // Pat CPLD (WDI_CPLD), STOP_BLOWER=1 - ControlHW(BLOWER_ON__PAT_CPLD); - - // ---- Test STOP_ACTUATOR Input pin Status - if (TestStopBlowerInputPin()==OPSTATUS_FAIL) - uiFlagsAlarm[ALARM_FLAGS2]|=HW_SAFETY_ALARM_MASK; - else - uiFlagsAlarm[ALARM_FLAGS2]&=(~HW_SAFETY_ALARM_MASK); - } - - if (bMemoStartVentilation==TRUE) - { - StopAllActuators(); - ClearAllVentilationAlarms(); - ClearAllMeasures(); - } - - uiTechnicalDataSet[START_STOP_VENTILATION]=0; - bMemoStartVentilation=FALSE; - #ifndef TEMPERATURE_TRENDS - ucStartVentilationScheduler=0; - #endif - bDisableMaroubraCommCommunication=FALSE; - } -} -#endif // #ifndef C_M3_DEVICETEST_TARGET - - -/******************************************************************************* -* Function Name : ComputeTe -* Description : Compute expiratory time -* Input : uiF = Breath frequency (bpm) - uiTi = Inspiratory time (ms) -* Output : Expiratory time (ms) -* Return : None -*******************************************************************************/ -#ifndef C_M3_DEVICETEST_TARGET -u16 ComputeTe(u16 uiF, u16 uiTi) -{ - u16 uiTtot; - u16 uiTeTemp=TE_SET_MIN; - - if (uiF!=0) - { - // Compute Ttotal - uiTtot=60000/uiF; - if (uiTtot>uiTi) - { - uiTeTemp=uiTtot-uiTi; - if (uiTeTemp<TE_SET_MIN) - uiTeTemp=TE_SET_MIN; - } - } - else - { - // F=0 => Te=2xTi - uiTeTemp=uiTi<<1; - } - return(uiTeTemp); -} - - -/******************************************************************************* -* Function Name : UpdateSettings -* Description : Update the settings zone with the temporary settings zone -* Input : None -* Output : None -* Return : TRUE if the ventilation mode has changed -*******************************************************************************/ -bool UpdateSettings(void) -{ - u8 ucIndex; - - // Take into account a modification of the PEEP - if (uiVentilationSet[PEEP_SET]!=uiVentilationSetTemp[PEEP_SET] || uiVentilationSet[PS_CPAP_SET]!=uiVentilationSetTemp[PS_CPAP_SET]) - uiMemoPWMDuringDisconnection=0; - - // Transfert data from the setting temporary zone to the settings zone - for (ucIndex=0; ucIndex<SIZE_LRS_GROUP; ucIndex++) - uiVentilationSet[ucIndex]=uiVentilationSetTemp[ucIndex]; - - // Update barometric expiratory time - uiTeBaroSet=ComputeTe(uiVentilationSet[BREATH_RATE_BARO_SET], uiVentilationSet[TI_BARO_SET]); - - // Update volumetric expiratory time - uiTeVoluSet=ComputeTe(uiVentilationSet[BREATH_RATE_VOLU_SET], uiVentilationSet[TI_VOLU_SET]); - - // Update Tube configuration type - enTubeConfigType=enTubeConfigTypeTemp; - - // Update Patient type - uiPatientType=uiPatientTypeTemp; - - // Update Ventilation mode - if (enVentilationMode!=enVentilationModeTemp) - { - enVentilationMode=enVentilationModeTemp; - InitVentilation(); - return(TRUE); - } - return(FALSE); -} - - -/******************************************************************************* -* Function Name : ApplyNewVentilationMode -* Description : Update settings and init variables if the ventilation mode has changed -* Input : None -* Output : None -* Return : TRUE if new ventilation mode is applied -*******************************************************************************/ -bool ApplyNewVentilationMode(void) -{ - if (fUpdateTheSettings==TRUE) - { - fUpdateTheSettings=FALSE; - if (UpdateSettings()==TRUE) - { - InitVentilation(); - return(TRUE); - } - } - return(FALSE); -} - - -/******************************************************************************* -* Function Name : ComputeInspiratoryFlowSetPointInAVC -* Description : Compute: - - the inspiratory flow max set point - - the inspiratory flow min set point - - the flow step between the flow max and the flow min during Ti -* Input : uiTypeOfPatient = Adult or Pedia - uiVtc = set point in volume (ml) - uiTi = Ti set point (ms) - uiFlowShape = Flow shape (0 to 4) -* Output : uiMaxFlow = the inspiratory flow max set point (cl/min => 100=1l/min) - uiMinFlow = the inspiratory flow min set point (cl/min => 100=1l/min) - uiFlowStep = the flow step between the flow max and the flow min during Ti (cl/min => 100=1l/min) -* Return : None -*******************************************************************************/ -void ComputeInspiratoryFlowSetPointInAVC(u16 uiTypeOfPatient, u16 uiVtc, u16 uiTi, u16 uiFlowShape, u32 *ulMaxFlow, u32 *ulMinFlow, u32 *ulFlowStep) -{ - u32 ulFlowMax; - u32 ulFlowMin; - u32 ulMaxMaxFlow; - u32 ulMinMinFlow; - u16 uiTiMin; - u32 ulFlowStepTemp; - - // Define min/max flow - if (uiTypeOfPatient==PATIENT_ADULT) - { - ulMinMinFlow=InspiratoryFlowSet_A_MIN; - ulMaxMaxFlow=InspiratoryFlowSet_A_MAX; - uiTiMin=TiVoluSet_A_MIN; - } - else - { - ulMinMinFlow=InspiratoryFlowSet_P_MIN; - ulMaxMaxFlow=InspiratoryFlowSet_P_MAX; - uiTiMin=TiVoluSet_P_MIN; - } - - // Check Ti - if (uiTi==0) - uiTi=uiTiMin; - - // Compute flow max - switch(uiFlowShape) - { - default: - case 0: - { - ulFlowMax=((u32)uiVtc*6000)/uiTi; - break; - } - case 1: - { - ulFlowMax=((u32)uiVtc*7500)/uiTi; - break; - } - case 2: - { - ulFlowMax=((u32)uiVtc*9000)/uiTi; - break; - } - case 3: - { - ulFlowMax=((u32)uiVtc*10500)/uiTi; - break; - } - case 4: - { - ulFlowMax=((u32)uiVtc*12000)/uiTi; - break; - } - } - - // Limitation of the max flow - if (ulFlowMax>ulMaxMaxFlow) - ulFlowMax=ulMaxMaxFlow; - - // Limitation of the min flow - if (ulFlowMax<ulMinMinFlow) - ulFlowMax=ulMinMinFlow; - - // Factor 100 on flow max (and flow min and flow step) - ulFlowMax*=100; - - // Compute flow min and flow step - switch(uiFlowShape) - { - default: - case 0: - { - ulFlowMin=ulFlowMax; - break; - } - case 1: - { - ulFlowMin=(ulFlowMax*3)>>2; - break; - } - case 2: - { - ulFlowMin=ulFlowMax>>1; - break; - } - case 3: - { - ulFlowMin=ulFlowMax>>2; - break; - } - case 4: - { - ulFlowMin=0; - break; - } - } - - // Max flow - *ulMaxFlow=ulFlowMax; - - // Min flow - *ulMinFlow=ulFlowMin; - - // Flow Step - ulFlowStepTemp=(ulFlowMax-ulFlowMin)/uiTi; - //if (uiFlowStepTemp==0 && uiFlowShape!=0) uiFlowStepTemp=1; - *ulFlowStep=ulFlowStepTemp; -} - - - -/******************************************************************************* -* Function Name : TestTriggerExpiratoire -* Description : Manage the expiratory trigger -* Input : ucValeurSeuil = threshold (% of the flow max) to reach in order to cycle -* Output : None -* Return : TRUE if cycling active -*******************************************************************************/ -unsigned char TestTriggerExpiratoire(unsigned char ucValeurSeuil, unsigned int uiPressureSetting) -{ - unsigned char ucSeuil=ucValeurSeuil; - unsigned int uiCalculTemp; - int16_t iConductanceBaseLine=UpdateInspiratoryConductanceAverage(); - // Management automatic expiratory trigger - ucTempoTriggerExpiAuto--; - if (ucTempoTriggerExpiAuto==0) - { - ucTempoTriggerExpiAuto=TEMPO_TRIGGER_EXPI; - ucExpiTriggerTreshold++; - } - - // Test si flow<0?? - if (iBlowerFlowSmoothingMes<0) - { - return(TRUE); - } - // Test if deacring flow?? - else if (iBlowerFlowSmoothingMes<iBlowerFlowSmoothingMaxMes) - { - // Test if Trigger Expi=AUTO ?? - if ((ucValeurSeuil==ExpiTriggerSet_A_MAX && uiPatientType==PATIENT_ADULT) || - (ucValeurSeuil==ExpiTriggerSet_P_MAX && uiPatientType==PATIENT_PEDIA)) - ucSeuil=ucExpiTriggerTreshold; - - u16 conducThresh = 2000; - - if(enTubeConfigType == 1 ) - conducThresh = 750; - else if(enTubeConfigType == 2) - conducThresh = 1500; - - // Test if cycling or not - uiCalculTemp=((unsigned long)iBlowerFlowSmoothingMaxMes*ucSeuil)/100; - if (uiCalculTemp>iBlowerFlowSmoothingMes) - return(TRUE); - else if (uiProximalPressureMes>(uiPressureSetting+20)) - return(TRUE); - else if (uiConductanceCalc < (iConductanceBaseLine - conducThresh)) - { - ResetInspiratoryConductanceAverage(); - return(TRUE); - } - } - return(FALSE); -} - - -/******************************************************************************* -* Function Name : TestInspiratoryTrigger -* Description : Manage the inspiratory trigger -* Input : bSpont = TRUE if spontaneous mode -* uiTe = expiration time (ms) -* uiFlowTreshold = flow threshold (dl/min) -* Output : None -* Return : TRUE if cycling active -*******************************************************************************/ -bool TestInspiratoryTrigger(bool bSpont, u16 uiTe, u16 uiFlowTreshold) -{ - //int16_t iInspiratoryFlowDeltaAverage; - //int16_t iDeltaOfTheDelta1, iDeltaOfTheDelta2, iDeltaOfTheDelta3, iDeltaOfTheDelta4; - bool bTrigger=FALSE; - //int16_t iVirtualFlow; - int16_t iConductanceBaseLine; - - // Manual breath management - if (uiTe>TE_SET_MIN) - { - if (bManualBreath==TRUE) - { - bManualBreath=FALSE; - bDisplayInspiratoryTrigger=TRUE; - return(TRUE); - } - } - - // Trigger management - if ((bSpont==TRUE) || - (bSpont==FALSE && uiFlowTreshold<InspiTriggerFlowSet_A_MAX && uiPatientType==PATIENT_ADULT) || - (bSpont==FALSE && uiFlowTreshold<InspiTriggerFlowSet_P_MAX && uiPatientType==PATIENT_PEDIA)) - { - // Init scheduler - if (uiTe==1) - { - ucInspiTriggerScheduler=0; - iInspiratoryFlowMin=0; - ucMinFlowCounter=NUMBER_MIN_FLOW_VALUE; - ucCounterTriggerValid=NUMBER_TRIGGER_VALID; - bDetectionConstantFlow=FALSE; - } - - iConductanceBaseLine=UpdateInspiratoryConductanceAverage(); - // Manage detection phase - switch(ucInspiTriggerScheduler) - { - default: - case 0: - { - // Update the buffer on the Inspiratory flow average - - // Detect min flow - if (iBlowerFlowSmoothingMesForTrigger<iInspiratoryFlowMin) - { - iInspiratoryFlowMin=iBlowerFlowSmoothingMesForTrigger; - ucMinFlowCounter=NUMBER_MIN_FLOW_VALUE; - } - else - { - ucMinFlowCounter--; - if (ucMinFlowCounter==0) - ucInspiTriggerScheduler=1; - } - break; - } - case 1: - { - //ucTriggerNumber=0; - - if (uiTe>TE_SET_MIN) - { -// // Fast trigger management -// if (iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER-50]<=iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER-25]) -// { -// iVirtualFlow=(iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER-25]<<1)-iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER-50]; -// if (iBlowerFlowSmoothingMesForTrigger>=(iVirtualFlow+(int16_t)(uiFlowTreshold*7))) -// { -// //ucTriggerNumber=1; -// //if (fBlockCloseLoop==FALSE) -// bTrigger=TRUE; -// } -// } -// if (bTrigger==FALSE && iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER-100]<=iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER-50]) -// { -// iVirtualFlow=(iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER-50]<<1)-iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER-100]; -// if (iBlowerFlowSmoothingMesForTrigger>=(iVirtualFlow+(int16_t)(uiFlowTreshold*15))) -// { -// //ucTriggerNumber=2; -// //if (fBlockCloseLoop==FALSE) -// bTrigger=TRUE; -// } -// } -// -// // Slow trigger management -// if (TestInspiratorySlowTrigger(iFlowBaseLine, uiFlowTreshold*10)==TRUE) -// { -// //ucTriggerNumber=3; -// bTrigger=TRUE; -// } - //Conductance Trigger - if(uiConductanceCalc >= (iConductanceBaseLine + 2000)) - { - bTrigger = TRUE; - } - - // Trigger occurs?? - if (bTrigger==TRUE) - { - ucCounterTriggerValid--; - if (ucCounterTriggerValid==0) - { - bDisplayInspiratoryTrigger=TRUE; - ResetInspiratoryConductanceAverage(); - return(TRUE); - } - } - else - ucCounterTriggerValid=NUMBER_TRIGGER_VALID; - } - break; - } - } - } - return(FALSE); -} - -/******************************************************************************* -* Function Name : UpdateInspiratoryConductanceAverage -* Description : Fill the buffer with the expiratory conductance and compute the average -* Input : None -* Output : None -* Return : Inspiratory flow average -*******************************************************************************/ -u16 conducIndex = 0; -int32_t lSumConductance = 0; -bool bufFilled = FALSE; - -int16_t UpdateInspiratoryConductanceAverage(void) -{ - int16_t oldValue = iBufferIFlow[conducIndex]; - iBufferIFlow[conducIndex] = uiConductanceCalc; - lSumConductance += uiConductanceCalc; - conducIndex++; - - if(conducIndex > SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER) - { - conducIndex = 0; - bufFilled = TRUE; - } - - if(bufFilled) - { - lSumConductance -= oldValue; - return (lSumConductance/SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER); - } - else - { - return (lSumConductance/conducIndex); - } -} - -/******************************************************************************* -* Function Name : ResetInspiratoryConductanceAverage -* Description : Fill the buffer with the expiratory conductance and compute the average -* Input : None -* Output : None -* Return : Inspiratory flow average -*******************************************************************************/ - -void ResetInspiratoryConductanceAverage(void) -{ - conducIndex = 0; - lSumConductance = 0; - bufFilled = FALSE; -} - -/******************************************************************************* -* Function Name : UpdateInspiratoryFlowAverage -* Description : Fill the buffer with the inspiratory flow and compute the average -* Input : None -* Output : None -* Return : Inspiratory flow average -*******************************************************************************/ -int16_t UpdateInspiratoryFlowAverage(void) -{ - u16 uiIndex; - int32_t lSumIFlow=0; - - // Roll the buffer - for(uiIndex=1; uiIndex<SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER; uiIndex++) - { - iBufferIFlow[uiIndex-1]=iBufferIFlow[uiIndex]; // Upate the Inspiratory Flow buffer - lSumIFlow+=iBufferIFlow[uiIndex-1]; // Sum the Inspiratory Flow - } - - // Add new flow value - iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER-1]=iBlowerFlowSmoothingMesForTrigger; // Upate the Inspiratory Flow buffer - lSumIFlow+=iBlowerFlowSmoothingMesForTrigger; // Sum the Inspiratory Flow - - return(lSumIFlow/SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER); -} - - -/******************************************************************************* -* Function Name : TestInspiratorySlowTrigger -* Description : Compute flow base line and test trigger -* Input : FlowTreshold = flow threshold (cl/min) -* Output : None -* Return : TRUE if trigger occurs -*******************************************************************************/ -bool TestInspiratorySlowTrigger(int16_t iTheFlowBaseLine, u16 uiFlowTreshold) -{ - int16_t iFlowDelta1, iFlowDelta2, iFlowDelta3; - - if (bDetectionConstantFlow==FALSE) - { - // Detection constant flow - if (iBufferIFlow[0]<iTheFlowBaseLine) - iFlowDelta1=iTheFlowBaseLine-iBufferIFlow[0]; - else - iFlowDelta1=iBufferIFlow[0]-iTheFlowBaseLine; - - if (iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER>>1]<iTheFlowBaseLine) - iFlowDelta2=iTheFlowBaseLine-iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER>>1]; - else - iFlowDelta2=iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER>>1]-iTheFlowBaseLine; - - if (iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER-1]<iTheFlowBaseLine) - iFlowDelta3=iTheFlowBaseLine-iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER-1]; - else - iFlowDelta3=iBufferIFlow[SIZE_INSPIRATORY_FLOW_AVERAGE_BUFFER-1]-iTheFlowBaseLine; - - if (iFlowDelta1<60 && iFlowDelta2<60 && iFlowDelta3<60) - { - iFlowBaseLineReference=iTheFlowBaseLine; - bDetectionConstantFlow=TRUE; - } - } - else - { - // Detect trigger - if (iBlowerFlowSmoothingMesForTrigger>=(iFlowBaseLineReference+(int16_t)uiFlowTreshold)) - { - return(TRUE); - } - } - return(FALSE); -} - - -/******************************************************************************* -* Function Name : ApplyDefaultValueToTemporaryVentilationSettings -* Description : Init temporary ventilation settings with default values -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void ApplyDefaultValueToTemporaryVentilationSettings(void) -{ - u8 ucIndex; - - enVentilationModeTemp=VentilationMode_DEF; - uiPatientTypeTemp=PatientType_DEF; - enTubeConfigTypeTemp=(enMaroubraTubeConfigurationList)ReturnDefaultTubeConfiguration(VentilationMode_DEF); - - // Init all temporary settings - if (uiPatientType==PATIENT_ADULT) - { - for (ucIndex=0; ucIndex<SIZE_LRS_GROUP; ucIndex++) - uiVentilationSetTemp[ucIndex]=sLRSGroup[ucIndex].uiDefault_Adult; - } - else - { - for (ucIndex=0; ucIndex<SIZE_LRS_GROUP; ucIndex++) - uiVentilationSetTemp[ucIndex]=sLRSGroup[ucIndex].uiDefault_Pedia; - } -} - - -/******************************************************************************* -* Function Name : CheckTemporaryVentilationSettingRange -* Description : Check all the temporary settings range -* Input : None -* Output : None -* Return : FALSE if one the settings is out of range -*******************************************************************************/ -opstatus_t CheckTemporaryVentilationSettingRange(void) -{ - u8 ucIndex; - - if ((uiPatientTypeTemp==PATIENT_PEDIA || uiPatientTypeTemp==PATIENT_ADULT) && enVentilationModeTemp<NUMBER_OF_MODE && enTubeConfigTypeTemp<NUMBER_OF_TUBE_CONFIGURATION) - { - for (ucIndex=0; ucIndex<SIZE_LRS_GROUP; ucIndex++) - { - // Check data range - if (uiPatientTypeTemp==PATIENT_PEDIA) - { - if (uiVentilationSetTemp[ucIndex]<sLRSGroup[ucIndex].uiMin_Pedia) - return(OPSTATUS_FAIL); - else if (uiVentilationSetTemp[ucIndex]>sLRSGroup[ucIndex].uiMax_Pedia) - return(OPSTATUS_FAIL); - } - else - { - if (uiVentilationSetTemp[ucIndex]<sLRSGroup[ucIndex].uiMin_Adult) - return(OPSTATUS_FAIL); - else if (uiVentilationSetTemp[ucIndex]>sLRSGroup[ucIndex].uiMax_Adult) - return(OPSTATUS_FAIL); - } - } - return(OPSTATUS_OK); - } - return(OPSTATUS_FAIL); -} - - - -/******************************************************************************* -* Function Name : ApplyDefaultValueToTechnicalSettings -* Description : Init technical settings with default values -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void ApplyDefaultValueToTechnicalSettings(void) -{ - u8 ucIndex; - - // Init all temporary settings - for (ucIndex=0; ucIndex<SIZE_LRTS_GROUP; ucIndex++) - uiTechnicalDataSet[ucIndex]=sLRTSGroup[ucIndex].uiDefault; -} - - -/******************************************************************************* -* Function Name : CheckTechnicalSettingsRange -* Description : Check all the technical settings range -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void CheckTechnicalSettingsRange(void) -{ - u8 ucIndex; - bool fError=FALSE; - - for (ucIndex=0; ucIndex<SIZE_LRTS_GROUP; ucIndex++) - { - if (uiTechnicalDataSet[ucIndex]<sLRTSGroup[ucIndex].uiMin || uiTechnicalDataSet[ucIndex]>sLRTSGroup[ucIndex].uiMax) - { - uiTechnicalDataSet[ucIndex]=sLRTSGroup[ucIndex].uiDefault; - fError=TRUE; - //break; - } - } - - if (fError==TRUE) - uiFlagsAlarm[ALARM_FLAGS2]|=TECHNICAL_SETTINGS_RANGE_ALARM_MASK; - else - uiFlagsAlarm[ALARM_FLAGS2]&=(~TECHNICAL_SETTINGS_RANGE_ALARM_MASK); -} - - -/******************************************************************************* -* Function Name : CheckFlowLUTRange -* Description : Check the flow LUT -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void CheckFlowLUTRange(void) -{ - u16 uiIndex; - bool fError=FALSE; - - if (stLUTFlowSensor.uiLUT_TableSize<(FLOW_CALIB_NUMBER_OF_SAMPLES>>1) || stLUTFlowSensor.uiLUT_TableSize>FLOW_CALIB_NUMBER_OF_SAMPLES) - { - ApplyDefaultFlowLUT(); - fError=TRUE; - } - else - { - for (uiIndex=1; uiIndex<stLUTFlowSensor.uiLUT_TableSize; uiIndex++) - { - if (stLUTFlowSensor.uiFlowValue[uiIndex]<=stLUTFlowSensor.uiFlowValue[uiIndex-1] || - stLUTFlowSensor.uiFlowSensorTicks[uiIndex]<=stLUTFlowSensor.uiFlowSensorTicks[uiIndex-1]) - { - ApplyDefaultFlowLUT(); - fError=TRUE; - break; - } - } - } - - if (fError==TRUE) - uiFlagsAlarm[ALARM_FLAGS2]|=NO_FLOW_LUT_ALARM_MASK; - else - uiFlagsAlarm[ALARM_FLAGS2]&=(~NO_FLOW_LUT_ALARM_MASK); -} - - -/******************************************************************************* -* Function Name : ApplyDefaultFlowLUT -* Description : Apply default value for the flow LUT -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void ApplyDefaultFlowLUT(void) -{ - u16 uiIndex; - - stLUTFlowSensor.uiLUT_TableSize=stDefaultLUTFlowSensor.uiLUT_TableSize; - for (uiIndex=0; uiIndex<FLOW_CALIB_NUMBER_OF_SAMPLES; uiIndex++) - { - stLUTFlowSensor.uiFlowValue[uiIndex]=stDefaultLUTFlowSensor.uiFlowValue[uiIndex]; - stLUTFlowSensor.uiFlowSensorTicks[uiIndex]=stDefaultLUTFlowSensor.uiFlowSensorTicks[uiIndex]; - } -} - - -/******************************************************************************* -* Function Name : ReturnDefaultTubeConfiguration -* Description : The default tubing configuration according to the current ventilation mode -* Input : a ventilation mode -* Output : None -* Return : The tube configuration -*******************************************************************************/ -u16 ReturnDefaultTubeConfiguration(u16 uiMode) -{ - u8 ucIndex; - - for (ucIndex=0; ucIndex<NUMBER_OF_TUBE_CONFIGURATION; ucIndex++) - { - if (ucTubeConfigurationTable[ucIndex][uiMode]==TUBE_DEFAULT) - { - return(ucIndex); - } - } - return(0); -} - - -/******************************************************************************* -* Function Name : ApplyAllDefaultValues -* Description : Apply all default values in the technical and settings zones -* : BE CARFUL this function call "ControlHW" function -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void ApplyAllDefaultValues(void) -{ - // Init ventilation settings - ApplyDefaultValueToTemporaryVentilationSettings(); - - // Init technical settings - ApplyDefaultValueToTechnicalSettings(); - - // Init flow LUT - ApplyDefaultFlowLUT(); - - // Default value for the device/patient time counter - ulDeviceTimeCounter=0; - ulPatientTimeCounter=0; - - // Default value for the blower revolution counter - ulBlowerRevolutionCounter=0; - - bComputeOffsetSensors=TRUE; -} -#endif // C_M3_DEVICETEST_TARGET - -/******************* (C) COPYRIGHT 2007 STMicroelectronics *****END OF FILE****/ - - -