Index: firmware/App/Controllers/BloodLeak.c =================================================================== diff -u -r32309398e7ef59471bd624e34ab6b91cdaaf9d24 -r9ded16038a0d6dd844da697aaf03505ec3ed335a --- firmware/App/Controllers/BloodLeak.c (.../BloodLeak.c) (revision 32309398e7ef59471bd624e34ab6b91cdaaf9d24) +++ firmware/App/Controllers/BloodLeak.c (.../BloodLeak.c) (revision 9ded16038a0d6dd844da697aaf03505ec3ed335a) @@ -110,6 +110,7 @@ BLOOD_LEAK_CHECK_SET_POINT_STATE, ///< Check set point state. BLOOD_LEAK_INIT_STATE, ///< Init state. BLOOD_LEAK_CHECK_ZERO_AND_SELF_TEST_STATE, ///< Blood leak check for zero and self test commands state. + BLOOD_LEAK_VERIFY_INTENSITY_AFTER_ZEROING_STATE, ///< Blood leak verify intensity after zeroing state. BLOOD_LEAK_NORMAL_STATE, ///< Normal state. BLOOD_LEAK_RECOVER_BLOOD_DETECT_STATE, ///< Blood leak recover blood detect state. NUM_OF_BLOOD_LEAK_STATES ///< Number of blood leak detector states. @@ -210,6 +211,7 @@ static BLOOD_LEAK_STATE_T handleBloodLeakCheckSetPointState( void ); static BLOOD_LEAK_STATE_T handleBloodLeakInitState( void ); static BLOOD_LEAK_STATE_T handleBloodLeakCheckZeroAndSelfTestState( void ); +static BLOOD_LEAK_STATE_T handleBloodLeakVerifyIntensityAfterZeroingState( void ); static BLOOD_LEAK_STATE_T handleBloodLeakNormalState( void ); static BLOOD_LEAK_STATE_T handleBloodLeakRecoverBloodDetectState( void ); @@ -319,7 +321,7 @@ getNVRecord2Driver( GET_CAL_BLOOD_LEAK_SENSOR, (U08*)&bloodLeakCalRecord, length, 0, ALARM_ID_HD_BLOOD_LEAK_INVALID_CAL_RECORD ); } - processBloodLeakIntensityData(); // TODO is this the right place? + processBloodLeakIntensityData(); switch( bloodLeakState ) { @@ -339,6 +341,10 @@ bloodLeakState = handleBloodLeakCheckZeroAndSelfTestState(); break; + case BLOOD_LEAK_VERIFY_INTENSITY_AFTER_ZEROING_STATE: + bloodLeakState = handleBloodLeakVerifyIntensityAfterZeroingState(); + break; + case BLOOD_LEAK_NORMAL_STATE: bloodLeakState = handleBloodLeakNormalState(); break; @@ -462,21 +468,6 @@ return status; } -BLOOD_LEAK_INTENSITY_CHECK_T getBloodLeakIntensityStatusAfterZeroing( void ) -{ - BLOOD_LEAK_INTENSITY_CHECK_T status = BLOOD_LEAK_INTENSITY_WAIT_FOR_FRESH_DATA; - - if ( TRUE == bloodLeakEmbModeCmd[ I_EMB_MODE_CMD ].isCmdRespRdy ) - { - U32 intensity = bloodLeakEmbModeCmd[ I_EMB_MODE_CMD ].commandResp; - - status = ( abs( BLD_NOMINAL_INTENSITY - intensity ) <= BLD_MAX_INTENSITY_DRIFT_AFTER_ZEROING ? BLOOD_LEAK_INTENSITY_IN_RANGE : - BLOOD_LEAK_INTENSITY_OUT_OF_RANGE ); - } - - return status; -} - /*********************************************************************//** * @brief * The exitBloodLeakNormalState requests that the blood leak sensor to exit @@ -700,26 +691,59 @@ // Pass self-test if entire sequence was successful if ( FALSE == hasCmdSqncFailed ) { - // Done with zero sequence, transition to other states - zeroBloodLeakReset(); - bloodLeakZeroingStatus.lastZeroingStartTimeMS = getMSTimerCount(); - bloodLeakSelfTestStatus = SELF_TEST_STATUS_PASSED; - state = BLOOD_LEAK_NORMAL_STATE; + state = BLOOD_LEAK_VERIFY_INTENSITY_AFTER_ZEROING_STATE; } // If not successful, retry if we've not run out else { bloodLeakSelfTestStatus = SELF_TEST_STATUS_FAILED; state = BLOOD_LEAK_INIT_STATE; } - SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_BLOOD_LEAK_SELF_TEST_RESULT, bloodLeakSelfTestStatus, state ); + SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_BLOOD_LEAK_SELF_TEST_RESULT, bloodLeakSelfTestStatus, state ) } return state; } /*********************************************************************//** * @brief + * The handleBloodLeakVerifyIntensityAfterZeroingState function checks the + * blood leak sensor's intensity after zeroing the sensor. + * @details Inputs: bloodLeakEmbModeCmd + * @details Outputs: bloodLeakSelfTestStatus + * @return next state + *************************************************************************/ +static BLOOD_LEAK_STATE_T handleBloodLeakVerifyIntensityAfterZeroingState( void ) +{ + BLOOD_LEAK_STATE_T state = BLOOD_LEAK_VERIFY_INTENSITY_AFTER_ZEROING_STATE; + + if ( TRUE == bloodLeakEmbModeCmd[ I_EMB_MODE_CMD ].isCmdRespRdy ) + { + U32 intensity = bloodLeakEmbModeCmd[ I_EMB_MODE_CMD ].commandResp; + + state = BLOOD_LEAK_INIT_STATE; + bloodLeakSelfTestStatus = SELF_TEST_STATUS_FAILED; + + if ( abs( BLD_NOMINAL_INTENSITY - intensity ) <= BLD_MAX_INTENSITY_DRIFT_AFTER_ZEROING ) + { + // Done with zero sequence, transition to other states + zeroBloodLeakReset(); + bloodLeakZeroingStatus.lastZeroingStartTimeMS = getMSTimerCount(); + bloodLeakSelfTestStatus = SELF_TEST_STATUS_PASSED; + state = BLOOD_LEAK_NORMAL_STATE; + + if ( TRUE == isAlarmActive( ALARM_ID_HD_BLOOD_LEAK_RECOVERING_PLEASE_WAIT ) ) + { + state = BLOOD_LEAK_RECOVER_BLOOD_DETECT_STATE; + } + } + } + + return state; +} + +/*********************************************************************//** + * @brief * The handleBloodLeakNormalState function handles the Blood Leak module * in normal state. * @details Inputs: bloodLeakStatus, bloodLeakPersistenceCtr, Index: firmware/App/Controllers/BloodLeak.h =================================================================== diff -u -r32309398e7ef59471bd624e34ab6b91cdaaf9d24 -r9ded16038a0d6dd844da697aaf03505ec3ed335a --- firmware/App/Controllers/BloodLeak.h (.../BloodLeak.h) (revision 32309398e7ef59471bd624e34ab6b91cdaaf9d24) +++ firmware/App/Controllers/BloodLeak.h (.../BloodLeak.h) (revision 9ded16038a0d6dd844da697aaf03505ec3ed335a) @@ -41,15 +41,6 @@ NUM_OF_BLOOD_LEAK_STATUS ///< Number of blood leak detector status. } BLOOD_LEAK_STATUS_T; -/// TODO comments -typedef enum IntesityDataCheckSatus -{ - BLOOD_LEAK_INTENSITY_WAIT_FOR_FRESH_DATA = 0, - BLOOD_LEAK_INTENSITY_IN_RANGE, - BLOOD_LEAK_INTENSITY_OUT_OF_RANGE, - NUM_OF_BLOOD_LEAK_INTENSITY_DATA -} BLOOD_LEAK_INTENSITY_CHECK_T; - /// Blood leak detector data publish typedef struct { @@ -70,7 +61,6 @@ BOOL zeroBloodLeak( void ); void zeroBloodLeakReset( void ); BOOL hasBloodLeakZeroSequenceFailed( void ); -BLOOD_LEAK_INTENSITY_CHECK_T getBloodLeakIntensityStatusAfterZeroing( void ); BOOL isBloodLeakZeroingNeeded( void ); void exitBloodLeakNormalState( void ); Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r32309398e7ef59471bd624e34ab6b91cdaaf9d24 -r9ded16038a0d6dd844da697aaf03505ec3ed335a --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 32309398e7ef59471bd624e34ab6b91cdaaf9d24) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 9ded16038a0d6dd844da697aaf03505ec3ed335a) @@ -74,22 +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. +#define DPI_TO_BLD_VOLUME_ML ( 3.07F + 12.28F ) ///< Dialysate inlet pump to blood detect sensor volume in milliliters. +/// Blood leak zeroing states 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 + BLD_ZEROING_FLUSH = 0, ///< Blood leak zeroing flush. + BLD_ZEROING_ZERO, ///< Blood leak zeroing zero. + BLD_ZEROING_VERIFY_ZEROING, ///< Blood leak zeroing verify zeroing. + BLD_ZEROING_COMPLETE, ///< Blood leak zeroing complete. + NUM_OF_BLD_ZEROING ///< Number of blood leak zeroing state. } BLOOD_LEAK_ZEROING_STATE_T; +/// Blood leak treatment zeroing data structure typedef struct { - F32 DPiToBLDFlushedVolML; - BLOOD_LEAK_ZEROING_STATE_T bloodLeakZeroingState; + F32 DPiToBLDFlushedVolML; ///< Dialysate inlet pump to blood leak flushed volume in milliliters. + BOOL hasBloodLeakZeroingBeenRequested; ///< Flag to indicate blood leak zeroing has been requested. + BLOOD_LEAK_ZEROING_STATE_T bloodLeakZeroingState; ///< Blood leak zeroing state. } BLOOD_LEAK_ZEROING_T ; // ********** private data ********** @@ -1522,11 +1524,19 @@ } } -void handleBloodLeakZeroing( void ) +/*********************************************************************//** + * @brief + * The execBloodLeakZeroing function handles the blood leak zeroing sequence + * @details Inputs: bloodLeakZeroing + * @details Outputs: bloodLeakZeroing + * @return none + *************************************************************************/ +void execBloodLeakZeroing( void ) { - BOOL status = FALSE; + BOOL status = FALSE; + SELF_TEST_STATUS_T zeroStatus = getBloodLeakSelfTestStatus(); - switch( bloodLeakZeroing.bloodLeakZeroingState ) + switch( bloodLeakZeroing.bloodLeakZeroingState ) // TODO we need handlers for this state machine { case BLD_ZEROING_FLUSH: status = hasDPiToBLDVolumeBeenFlushed(); @@ -1535,16 +1545,13 @@ case BLD_ZEROING_ZERO: status = zeroBloodLeak(); - bloodLeakZeroing.bloodLeakZeroingState = ( TRUE == status ? BLD_ZEROING_VERIFY_SEQ : BLD_ZEROING_ZERO ); + bloodLeakZeroing.bloodLeakZeroingState = ( TRUE == status ? BLD_ZEROING_VERIFY_ZEROING : BLD_ZEROING_ZERO ); break; - case BLD_ZEROING_VERIFY_SEQ: - { - SELF_TEST_STATUS_T status = getBloodLeakSelfTestStatus(); - + case BLD_ZEROING_VERIFY_ZEROING: if ( SELF_TEST_STATUS_PASSED == status ) { - bloodLeakZeroing.bloodLeakZeroingState = BLD_ZEROING_VERIFY_INTENSITY; + bloodLeakZeroing.bloodLeakZeroingState = BLD_ZEROING_COMPLETE; } else if ( SELF_TEST_STATUS_FAILED == status ) { @@ -1557,29 +1564,39 @@ 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 - } + case BLD_ZEROING_COMPLETE: + // Do nothing done with zeroing break; default: // TODO software fault break; } + + if ( TRUE == bloodLeakZeroing.hasBloodLeakZeroingBeenRequested ) + { + bloodLeakZeroing.bloodLeakZeroingState = BLD_ZEROING_FLUSH; + bloodLeakZeroing.hasBloodLeakZeroingBeenRequested = FALSE; + } } /*********************************************************************//** * @brief + * The requestBloodLeakZeroing function sets the flag the requests the + * blood leak zeroing. + * @details Inputs: none + * @details Outputs: bloodLeakZeroing + * @return none + *************************************************************************/ +void requestBloodLeakZeroing( void ) +{ + bloodLeakZeroing.hasBloodLeakZeroingBeenRequested = TRUE; +} + +/*********************************************************************//** + * @brief * The broadcastTreatmentSettingsRanges function computes and broadcasts * updated treatment parameter ranges that the user may change during treatment. * It is assumed that prescription settings have already been set prior to calling Index: firmware/App/Modes/ModeTreatment.h =================================================================== diff -u -r32309398e7ef59471bd624e34ab6b91cdaaf9d24 -r9ded16038a0d6dd844da697aaf03505ec3ed335a --- firmware/App/Modes/ModeTreatment.h (.../ModeTreatment.h) (revision 32309398e7ef59471bd624e34ab6b91cdaaf9d24) +++ firmware/App/Modes/ModeTreatment.h (.../ModeTreatment.h) (revision 9ded16038a0d6dd844da697aaf03505ec3ed335a) @@ -130,7 +130,8 @@ void broadcastTreatmentTimeAndState( void ); // Broadcast the times and states of this treatment -void handleBloodLeakZeroing( void ); +void execBloodLeakZeroing( void ); +void requestBloodLeakZeroing( void ); BOOL verifyTreatmentDurationSettingChange( U32 treatmentTime ); BOOL verifyUFSettingsChange( F32 uFVolume ); Index: firmware/App/Modes/TreatmentStop.c =================================================================== diff -u -r32309398e7ef59471bd624e34ab6b91cdaaf9d24 -r9ded16038a0d6dd844da697aaf03505ec3ed335a --- firmware/App/Modes/TreatmentStop.c (.../TreatmentStop.c) (revision 32309398e7ef59471bd624e34ab6b91cdaaf9d24) +++ firmware/App/Modes/TreatmentStop.c (.../TreatmentStop.c) (revision 9ded16038a0d6dd844da697aaf03505ec3ed335a) @@ -201,6 +201,7 @@ doorClosedRequired( TRUE, TRUE ); cmdStartDGTrimmerHeater(); setDialInPumpTargetFlowRate( DIALYSATE_FLOW_RATE_FOR_BLOOD_DETECT_RECOVERY_MLPM, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); + requestBloodLeakZeroing(); } /*********************************************************************//** @@ -427,7 +428,7 @@ { TREATMENT_STOP_STATE_T result = TREATMENT_STOP_RECOVER_BLOOD_DETECT_STATE; - handleBloodLeakZeroing(); + execBloodLeakZeroing(); // Keep reseting the blood sitting timer handleTreatmentStopBloodSittingTimer();