Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r8cf0fafa78ce14b5dbdf95510e957846660ac2b9 -r32309398e7ef59471bd624e34ab6b91cdaaf9d24 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 8cf0fafa78ce14b5dbdf95510e957846660ac2b9) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 32309398e7ef59471bd624e34ab6b91cdaaf9d24) @@ -74,6 +74,24 @@ /// Macro to calculate the remaining treatment time in seconds. #define CALC_TREAT_TIME_REMAINING_IN_SECS() ( (S32)presTreatmentTimeSecs - (S32)( treatmentTimeMS / MS_PER_SECOND ) ) +#define DPI_TO_BLD_VOLUME_ML ( 3.07F + 12.28F ) ///< Dialysate inlet pump to blood detect sensor volume in milliliters. + +typedef enum BloodLeakZeroingState +{ + BLD_ZEROING_FLUSH = 0, + BLD_ZEROING_ZERO, + BLD_ZEROING_VERIFY_SEQ, + BLD_ZEROING_VERIFY_INTENSITY, + BLD_ZEROING_COMPLETE, + NUM_OF_BLD_ZEROING +} BLOOD_LEAK_ZEROING_STATE_T; + +typedef struct +{ + F32 DPiToBLDFlushedVolML; + BLOOD_LEAK_ZEROING_STATE_T bloodLeakZeroingState; +} BLOOD_LEAK_ZEROING_T ; + // ********** private data ********** static TREATMENT_STATE_T currentTreatmentState; ///< Current state (sub-mode) of treatment mode. @@ -132,6 +150,8 @@ static U32 treatmentStartTimeStamp; ///< Treatment start timestampt for logging purpose. static U32 treatmentEndTimeStamp; ///< Treatment end timestampt for logging purpose. +static BLOOD_LEAK_ZEROING_T bloodLeakZeroing; + // ********** private function prototypes ********** static void broadcastTreatmentSettingsRanges( void ); @@ -146,6 +166,7 @@ static TREATMENT_STATE_T handleTreatmentEndState( void ); static void resetSignalFlags( void ); static void resetAlarmSignalFlags( void ); +static BOOL hasDPiToBLDVolumeBeenFlushed( void ); /*********************************************************************//** * @brief @@ -1501,6 +1522,62 @@ } } +void handleBloodLeakZeroing( void ) +{ + BOOL status = FALSE; + + switch( bloodLeakZeroing.bloodLeakZeroingState ) + { + case BLD_ZEROING_FLUSH: + status = hasDPiToBLDVolumeBeenFlushed(); + bloodLeakZeroing.bloodLeakZeroingState = ( TRUE == status ? BLD_ZEROING_ZERO : BLD_ZEROING_FLUSH ); + break; + + case BLD_ZEROING_ZERO: + status = zeroBloodLeak(); + bloodLeakZeroing.bloodLeakZeroingState = ( TRUE == status ? BLD_ZEROING_VERIFY_SEQ : BLD_ZEROING_ZERO ); + break; + + case BLD_ZEROING_VERIFY_SEQ: + { + SELF_TEST_STATUS_T status = getBloodLeakSelfTestStatus(); + + if ( SELF_TEST_STATUS_PASSED == status ) + { + bloodLeakZeroing.bloodLeakZeroingState = BLD_ZEROING_VERIFY_INTENSITY; + } + else if ( SELF_TEST_STATUS_FAILED == status ) + { + if ( TRUE == hasBloodLeakZeroSequenceFailed() ) + { + activateAlarmNoData( ALARM_ID_HD_BLOOD_LEAK_SENSOR_ZERO_SEQUENCE_FAILED ); + } + else + { + bloodLeakZeroing.bloodLeakZeroingState = BLD_ZEROING_ZERO; + } + } + } + break; + + case BLD_ZEROING_VERIFY_INTENSITY: + if ( BLOOD_LEAK_INTENSITY_IN_RANGE == getBloodLeakIntensityStatusAfterZeroing() ) + { + bloodLeakZeroing.bloodLeakZeroingState = BLD_ZEROING_COMPLETE; + } + else + { + // TODO can we try intensity for 3 times too? + // TODO alarm for intensity failure + } + break; + + default: + // TODO software fault + break; + } +} + /*********************************************************************//** * @brief * The broadcastTreatmentSettingsRanges function computes and broadcasts @@ -1658,7 +1735,23 @@ endTreatmentAlarmResponseRequest = FALSE; } +static BOOL hasDPiToBLDVolumeBeenFlushed( void ) +{ + BOOL status = FALSE; + F32 targetDPiMLPM = (F32)abs( getTargetDialInFlowRate() ); + F32 measuredDPiMLPM = getMeasuredDialInFlowRate(); + BOOL hasTargetFlowBeenReached = ( fabs( targetDPiMLPM - measuredDPiMLPM ) < NEARLY_ZERO ); + if ( TRUE == hasTargetFlowBeenReached ) + { + bloodLeakZeroing.DPiToBLDFlushedVolML += ( measuredDPiMLPM * TASK_GENERAL_INTERVAL ) / ( SEC_PER_MIN * MS_PER_SECOND ); + status = ( ( bloodLeakZeroing.DPiToBLDFlushedVolML - DPI_TO_BLD_VOLUME_ML ) < NEARLY_ZERO ? TRUE : FALSE ); + bloodLeakZeroing.DPiToBLDFlushedVolML = 0.0F; + } + + return status; +} + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/