Index: firmware/App/Controllers/DGInterface.c =================================================================== diff -u -r94c4f859bf5a6844089972b41fb60a8d6ebd0463 -r37733a07bec6a752717a9eadcab000685546eb83 --- firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision 94c4f859bf5a6844089972b41fb60a8d6ebd0463) +++ firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision 37733a07bec6a752717a9eadcab000685546eb83) @@ -99,6 +99,12 @@ static DG_RESERVOIR_ID_T dgActiveReservoir; ///< Latest active reservoir reported by the DG. static DG_RESERVOIR_ID_T dgActiveReservoirSet; ///< Active reservoir commanded. +// Tdi temperature Monitor +static DG_RESERVOIR_ID_T dgPrevActiveReservoir; ///< Previous Active reservoir. +static DG_RESERVOIR_ID_T dgTempActiveReservoir; ///< Temp Active reservoir. +static DG_TDI_TEMP_COUNTER_T dgTdiTempCounter; ///< DG Tdi temperature Counter. + + static DG_DISINFECT_UI_STATES_T disinfectsStatus; ///< DG disinfects status. static DG_MIXING_RATIOS_T dgMixingRatios; ///< DG mixing ratios. static HEATERS_DATA_T dgHeatersData; ///< DG heaters data. @@ -130,7 +136,7 @@ dgTrimmerTempSet = 0.0F; dgTrimmerTempCheckTimerCtr = 0; dgActiveReservoirSet = DG_RESERVOIR_2; - dgActiveReservoir = DG_RESERVOIR_2; + dgActiveReservoir = DG_RESERVOIR_2; dgDialysateTemp = 0.0F; dgCurrentOpMode = DG_MODE_INIT; dgSubMode = 0; @@ -174,17 +180,36 @@ lgLoadCellBackupReadingsTotal[ DG_RESERVOIR_1 ] = 0.0F; lgLoadCellBackupReadingsTotal[ DG_RESERVOIR_2 ] = 0.0F; - initPersistentAlarm( ALARM_ID_HD_DIALYSATE_TEMP_ABOVE_TARGET_TEMP, DIALYSATE_TEMP_CLEAR_TIMEOUT_MS, DIALYSATE_TEMP_OUT_OF_TARGET_TIMEOUT_MS ); initPersistentAlarm( ALARM_ID_HD_DIALYSATE_TEMP_BELOW_TARGET_TEMP, DIALYSATE_TEMP_CLEAR_TIMEOUT_MS, DIALYSATE_TEMP_OUT_OF_TARGET_TIMEOUT_MS ); initPersistentAlarm( ALARM_ID_HD_DIALYSATE_TEMP_ABOVE_SAFETY_TEMP, DIALYSATE_TEMP_CLEAR_TIMEOUT_MS, DIALYSATE_TEMP_UPPER_MAX_SAFETY_TIMEOUT_MS ); - initPersistentAlarm( ALARM_ID_HD_NEW_LOAD_CELL_DATA_MESSAGE_NOT_RECEIVE, DG_DATA_FRESHNESS_TIMEOUT_MS, DG_DATA_FRESHNESS_TIMEOUT_MS ); initPersistentAlarm( ALARM_ID_HD_NEW_DIALYSATE_TEMP_DATA_MESSAGE_NOT_RECEIVE, DG_DATA_FRESHNESS_TIMEOUT_MS, DG_DATA_FRESHNESS_TIMEOUT_MS ); initPersistentAlarm( ALARM_ID_HD_NEW_RESERVOIRS_DATA_MESSAGE_NOT_RECEIVE, DG_DATA_FRESHNESS_TIMEOUT_MS, DG_DATA_FRESHNESS_TIMEOUT_MS ); initPersistentAlarm( ALARM_ID_HD_DG_NEW_OPERATION_MODE_MESSAGE_NOT_RECEIVE, DG_DATA_FRESHNESS_TIMEOUT_MS, DG_DATA_FRESHNESS_TIMEOUT_MS ); + + resetTdiTempCounters(); } +/*********************************************************************//** + * @brief + * The resetTdiTempCounters function initializes the counter variables. + * @details Inputs: none + * @details Outputs: TdiTemperature counter variables initialized. + * @return none + *************************************************************************/ +void resetTdiTempCounters ( void ) +{ + //Initialize tdi temperature counter values + dgTdiTempCounter.tdiTempUpCounter = 0; + dgTdiTempCounter.tdiTempDownCounter = 0; + dgTdiTempCounter.prevTdiTempUpCounter = 0; + dgTdiTempCounter.prevTdiTempDownCounter = 0; + dgTdiTempCounter.clearAlarmStartTime = 0; + dgPrevActiveReservoir = DG_RESERVOIR_2; + dgTempActiveReservoir = DG_RESERVOIR_2; +} + /**********************************************************************//** * @brief * The checkDGDataFreshness function checks the condition @@ -1255,31 +1280,91 @@ void checkDialysateTemperature( void ) { BOOL isTDiTempAboveHighSafety = ( dgDialysateTemp >= DIALYSATE_TEMP_UPPER_MAX_SAFETY_LIMIT_C ? TRUE : FALSE ); - BOOL isTDiTempAboveLowSafety = ( dgDialysateTemp >= DIALYSATE_TEMP_UPPER_SAFETY_LIMIT_C ? TRUE : FALSE ); - BOOL isTDITempBelowLowSafety = ( dgDialysateTemp <= DIALYSATE_TEMP_LOWER_SAFETY_LIMIT_C ? TRUE : FALSE ); + BOOL isTDiTempAboveLowSafety = ( dgDialysateTemp > DIALYSATE_TEMP_UPPER_SAFETY_LIMIT_C ? TRUE : FALSE ); + BOOL isTDITempBelowLowSafety = ( dgDialysateTemp < DIALYSATE_TEMP_LOWER_SAFETY_LIMIT_C ? TRUE : FALSE ); F32 TDiHigh = dgTrimmerTempSet + DIALYSATE_TEMP_OUT_OF_TARGET_TOL_C; BOOL isTDiTempAboveDialysateTarget = ( dgDialysateTemp >= TDiHigh ? TRUE : FALSE ); F32 TDiLow = dgTrimmerTempSet - DIALYSATE_TEMP_OUT_OF_TARGET_TOL_C; BOOL isTDiTempBelowDialysateTarget = ( dgDialysateTemp <= TDiLow ? TRUE : FALSE ); BOOL isTempBelowTrigger = (BOOL)( isTDITempBelowLowSafety || isTDiTempBelowDialysateTarget ); BOOL isTempAboveTrigger = (BOOL)( isTDiTempAboveLowSafety || isTDiTempAboveDialysateTarget ); + DG_RESERVOIR_ID_T CurrentactiveRes = getDGActiveReservoir(); + #ifndef _RELEASE_ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_DIALYSATE_TEMP_CHECK ) != SW_CONFIG_ENABLE_VALUE ) #endif { + BOOL alarmIsActive = isAlarmActive( ALARM_ID_HD_DIALYSATE_TEMP_ABOVE_TARGET_TEMP ); + + if( TRUE == isTempBelowTrigger ) + { + // clear alarm + if (( TRUE == alarmIsActive ) && + ( dgTdiTempCounter.clearAlarmStartTime == 0 )) + { + dgTdiTempCounter.clearAlarmStartTime = getMSTimerCount(); + } + + if( TRUE == alarmIsActive ) + { + if( TRUE == didTimeout(dgTdiTempCounter.clearAlarmStartTime, DIALYSATE_TEMP_CLEAR_TIMEOUT_MS )) + { + clearAlarmCondition( ALARM_ID_HD_DIALYSATE_TEMP_ABOVE_TARGET_TEMP ); + } + } + } + else + { + dgTdiTempCounter.clearAlarmStartTime = 0; + } + + // Tdi high temp alarm handling + if( CurrentactiveRes != dgPrevActiveReservoir ) + { + //Increment up count when temperature is exceeded the defined threshold + if( TRUE == isTempAboveTrigger ) + { + //Increment up counter + dgTdiTempCounter.tdiTempUpCounter++; + } + // Initiate down Counter only when temperature is crossed the threshold. otherwise do not increment down counter + else if ( dgTdiTempCounter.tdiTempUpCounter > 0 ) + { + //Increment down counter when temperature dips below threshold + dgTdiTempCounter.tdiTempDownCounter++; + } + + //hold current reservoir in a temporary variable + dgTempActiveReservoir = CurrentactiveRes; + } + else + { + // last reservoir cycle temperature should have crossed the threshold level, + // to compute next reservoir cycle temperature rise count is greater than the previous one. + if( (dgTdiTempCounter.prevTdiTempUpCounter != 0) && + (dgTdiTempCounter.tdiTempUpCounter >= dgTdiTempCounter.prevTdiTempUpCounter ) && + (dgTdiTempCounter.tdiTempDownCounter <= dgTdiTempCounter.prevTdiTempDownCounter )) + { + //Activate Alarm + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_DIALYSATE_TEMP_ABOVE_TARGET_TEMP, dgDialysateTemp, dgTrimmerTempSet ); + } + // readiness for the next reservoir cycle + dgTdiTempCounter.prevTdiTempUpCounter = dgTdiTempCounter.tdiTempUpCounter; + dgTdiTempCounter.prevTdiTempDownCounter = dgTdiTempCounter.tdiTempDownCounter; + dgTdiTempCounter.tdiTempUpCounter = 0; + dgTdiTempCounter.tdiTempDownCounter = 0; + // assign last temp reservoir to previous Active reservoir value once reservoir switch happened + dgPrevActiveReservoir = dgTempActiveReservoir; + } + // check clear condition first if ( TRUE == isAlarmActive( ALARM_ID_HD_DIALYSATE_TEMP_ABOVE_SAFETY_TEMP ) ) { isTDiTempAboveHighSafety = ( dgDialysateTemp <= ( dgTrimmerTempSet + DIALYSATE_TEMP_OUT_OF_TARGET_CLEAR_TOL_C ) ? FALSE : TRUE ); } checkPersistentAlarm(ALARM_ID_HD_DIALYSATE_TEMP_ABOVE_SAFETY_TEMP, isTDiTempAboveHighSafety, dgDialysateTemp, dgTrimmerTempSet ); - if ( TRUE == isAlarmActive( ALARM_ID_HD_DIALYSATE_TEMP_ABOVE_TARGET_TEMP ) ) - { - isTempAboveTrigger = ( dgDialysateTemp <= ( dgTrimmerTempSet + DIALYSATE_TEMP_OUT_OF_TARGET_CLEAR_TOL_C ) ? FALSE : TRUE ); - } - checkPersistentAlarm(ALARM_ID_HD_DIALYSATE_TEMP_ABOVE_TARGET_TEMP, isTempAboveTrigger, dgDialysateTemp, dgTrimmerTempSet ); if ( TRUE == isAlarmActive( ALARM_ID_HD_DIALYSATE_TEMP_BELOW_TARGET_TEMP ) ) { Index: firmware/App/Controllers/DGInterface.h =================================================================== diff -u -rde22eef34c821f425e864f8dea32f61cd2141fb4 -r37733a07bec6a752717a9eadcab000685546eb83 --- firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision de22eef34c821f425e864f8dea32f61cd2141fb4) +++ firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision 37733a07bec6a752717a9eadcab000685546eb83) @@ -95,6 +95,16 @@ BOOL isDGUsageInfoAvailable; ///< Flag to indicate DG usage info is available. } DG_SERVICE_AND_USAGE_DATA_T; +/// Tdi temperature up/down counters when the temperature varies above/below threshold value. +typedef struct +{ + U32 tdiTempUpCounter; ///< tdi temperature Up counter + U32 tdiTempDownCounter; ///< tdi temperature down counter + U32 prevTdiTempUpCounter; ///< previous tdi temperature Up counter + U32 prevTdiTempDownCounter; ///< previous tdi temperature down counter + BOOL clearAlarmStartTime; ///< to clear temp high alarm, use persistent method +} DG_TDI_TEMP_COUNTER_T; + // ********** public function prototypes ********** void initDGInterface( void ); @@ -120,6 +130,7 @@ DG_DISINFECT_UI_STATES_T getDGDisinfectsStates( void ); DG_MIXING_RATIOS_T getDGMixingRatios( void ); void getHDVersionDGServiceAndUsageData( DG_SERVICE_AND_USAGE_DATA_T* data ); +void resetTdiTempCounters (void); void setDGOpMode( U32 opMode, U32 subMode ); void setDialysateTemperatureReadings( F32 tdi, F32 tro, F32 thd ); Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -rf47dd3b39499eee03d3e93236335c087b4ad71fb -r37733a07bec6a752717a9eadcab000685546eb83 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision f47dd3b39499eee03d3e93236335c087b4ad71fb) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 37733a07bec6a752717a9eadcab000685546eb83) @@ -173,6 +173,7 @@ resetSignalFlags(); resetAlarmSignalFlags(); + resetTdiTempCounters(); pendingParamChangesTimer = 0; pendingUFVolumeChange = 0.0;