Index: firmware/App/Controllers/BloodLeak.c =================================================================== diff -u -r3f0308fe3483ae27620eaa1df8ecfad3d722b84c -r804715137aae49c89ffb871ba561d7498d19108a --- firmware/App/Controllers/BloodLeak.c (.../BloodLeak.c) (revision 3f0308fe3483ae27620eaa1df8ecfad3d722b84c) +++ firmware/App/Controllers/BloodLeak.c (.../BloodLeak.c) (revision 804715137aae49c89ffb871ba561d7498d19108a) @@ -102,7 +102,7 @@ #define BLD_ZERO_MIN_INTERVAL_MS ( 30 * SEC_PER_MIN * MS_PER_SECOND ) ///< Blood leak zeroing minimum interval in milliseconds. #define BLD_ZERO_MVG_AVG_NUM_OF_SAMPLES 16 ///< Blood leak number of moving average samples. #define BLD_ZERO_IN_RANGE_DRIFT_TIMEOUT_MS ( 10 * MS_PER_SECOND ) ///< Blood leak zero value drift in range timeout in milliseconds. -#define BLD_MAX_UPPER_INTENSITY_DRFIT ( BLD_NOMINAL_INTENSITY + 20 ) ///< Blood leak maximum upper range intensity drift. +#define BLD_MAX_UPPER_INTENSITY_DRIFT ( BLD_NOMINAL_INTENSITY + 20 ) ///< Blood leak maximum upper range intensity drift. #define BLD_START_OF_TX_MIN_INTENSITY_DRIFT 915 ///< Blood leak start of treatment minimum intensity. #define BLD_UPPER_INTENSITY_INTERVAL_MS ( 30 * SEC_PER_MIN * MS_PER_SECOND ) ///< Blood leak upper drift interval in milliseconds. #define BLD_ZERO_UPPER_RANGE_DRIFT_TIMEOUT_MS ( 60 * MS_PER_SECOND ) ///< Blood leak zero upper range drift timeout in milliseconds. @@ -163,14 +163,16 @@ typedef struct { U32 lastZeroingStartTimeMS; ///< Blood leak last zero sequence start time in milliseconds. - U32 driftInRangeStartTimeMS; ///< Blood leak drift is in range start time in milliseconds. + U32 driftInRangeDebounceTimeMS; ///< Blood leak drift is in range debounce start time in milliseconds. U32 rawIntensity[ BLD_ZERO_MVG_AVG_NUM_OF_SAMPLES ]; ///< Blood leak raw intensity array. U32 intensityRunningSum; ///< Blood leak intensity running sum for moving average. U32 rawIntensityNextIndex; ///< Blood leak raw intensity next index for moving average. OVERRIDE_F32_T intensityMovingAverage; ///< Blood leak intensity moving average. OVERRIDE_U32_T zeroingDriftIntervalTimeMS; ///< Blood leak zeroing interval time in milliseconds. OVERRIDE_U32_T zeroingUpperRangeIntervalTimeMS; ///< BLood leak zeroing upper range interval time in milliseconds. - U32 driftUpperRangeStartTimeMS; ///< Blood leak drift in upper range start time in milliseconds. + U32 driftUpperRangeDebounceTimeMS; ///< Blood leak drift in upper range debounce time in milliseconds. + U32 driftInRangeStatus; + U32 driftUpperRangeStatus; } BLOOD_LEAK_ZEROING_STATUS_T; // ********** private data ********** @@ -179,7 +181,6 @@ static OVERRIDE_U32_T bloodLeakStatus; ///< Detected blood leak status for blood leak detector. static SELF_TEST_STATUS_T bloodLeakSelfTestStatus; ///< Current status of blood leak self-test. static U32 bloodLeakPersistenceCtr; ///< Blood leak alarm persistence timer counter. - static OVERRIDE_U32_T bloodLeakDataPublishInterval = { BLOOD_LEAK_PUB_INTERVAL, BLOOD_LEAK_PUB_INTERVAL, 0, 0 }; ///< Interval (in ms) at which to publish blood leak data to CAN bus. static U32 bloodLeakDataPublicationCounter; ///< Timer counter used to schedule blood leak data publication to CAN bus. @@ -546,7 +547,7 @@ { U32 intensity = getEmbModeInfoValue( I_EMB_MODE_CMD ); - if ( ( intensity <= BLD_START_OF_TX_MIN_INTENSITY_DRIFT ) || ( intensity >= BLD_MAX_UPPER_INTENSITY_DRFIT ) ) + if ( ( intensity <= BLD_START_OF_TX_MIN_INTENSITY_DRIFT ) || ( intensity >= BLD_MAX_UPPER_INTENSITY_DRIFT ) ) { SEND_EVENT_WITH_2_F32_DATA( HD_EVENT_BLOOD_LEAK_ZEROING_REQUIRED, intensity, opMode ) status = TRUE; @@ -1458,14 +1459,16 @@ { BLOOD_LEAK_DATA_T data; - data.bloodLeakStatus = (U32)getBloodLeakStatus(); - data.bloodLeakState = (U32)bloodLeakState; - data.bloodLeakPersistentCounter = bloodLeakPersistenceCtr; - data.bloodLeakSerialCommState = bloodLeakEmbModeSubstate; - data.bloodLeakIntensity = getEmbModeInfoValue( I_EMB_MODE_CMD ); - data.bloodLeakDetect = getEmbModeInfoValue( V_EMB_MODE_CMD ); - data.bloodLeakIntensityMovingAvg = getF32OverrideValue( &bloodLeakZeroingStatus.intensityMovingAverage ); - data.bloodLeakTimeSinceZeroMS = calcTimeSince( bloodLeakZeroingStatus.lastZeroingStartTimeMS ); + data.bloodLeakStatus = (U32)getBloodLeakStatus(); + data.bloodLeakState = (U32)bloodLeakState; + data.bloodLeakPersistentCounter = bloodLeakPersistenceCtr; + data.bloodLeakSerialCommState = bloodLeakEmbModeSubstate; + data.bloodLeakIntensity = getEmbModeInfoValue( I_EMB_MODE_CMD ); + data.bloodLeakDetect = getEmbModeInfoValue( V_EMB_MODE_CMD ); + data.bloodLeakIntensityMovingAvg = getF32OverrideValue( &bloodLeakZeroingStatus.intensityMovingAverage ); + data.bloodLeakTimeSinceZeroMS = calcTimeSince( bloodLeakZeroingStatus.lastZeroingStartTimeMS ); + data.driftInRangeStatus = bloodLeakZeroingStatus.driftInRangeStatus; + data.driftUpperRangeStatus = bloodLeakZeroingStatus.driftUpperRangeStatus; bloodLeakDataPublicationCounter = 0; @@ -1875,15 +1878,17 @@ if ( FALSE == isZeroingNeeded ) { // Intensity drift is not in range so reset the debounce timer - bloodLeakZeroingStatus.driftInRangeStartTimeMS = getMSTimerCount(); + bloodLeakZeroingStatus.driftInRangeDebounceTimeMS = getMSTimerCount(); } - if ( ( TRUE == isZeroingAllowed ) && ( TRUE == didTimeout( bloodLeakZeroingStatus.driftInRangeStartTimeMS, BLD_ZERO_IN_RANGE_DRIFT_TIMEOUT_MS ) ) ) + if ( ( TRUE == isZeroingAllowed ) && ( TRUE == didTimeout( bloodLeakZeroingStatus.driftInRangeDebounceTimeMS, BLD_ZERO_IN_RANGE_DRIFT_TIMEOUT_MS ) ) ) { // If the moving average intensity is set and then the debounce time has elapsed the signal to zero is set to true. status = TRUE; } + bloodLeakZeroingStatus.driftInRangeStatus = status; + return status; } @@ -1901,18 +1906,20 @@ U32 zeroingUpperIntervalMS = getU32OverrideValue( &bloodLeakZeroingStatus.zeroingUpperRangeIntervalTimeMS ); BOOL isZeroingAllowed = didTimeout( bloodLeakZeroingStatus.lastZeroingStartTimeMS, zeroingUpperIntervalMS ); F32 intensityMvgAvg = getF32OverrideValue( &bloodLeakZeroingStatus.intensityMovingAverage ); - BOOL isUpperZeroingNeeded = ( intensityMvgAvg >= BLD_MAX_UPPER_INTENSITY_DRFIT ? TRUE : FALSE ); + BOOL isUpperZeroingNeeded = ( intensityMvgAvg >= BLD_MAX_UPPER_INTENSITY_DRIFT ? TRUE : FALSE ); if ( FALSE == isUpperZeroingNeeded ) { - bloodLeakZeroingStatus.driftUpperRangeStartTimeMS = getMSTimerCount(); + bloodLeakZeroingStatus.driftUpperRangeDebounceTimeMS = getMSTimerCount(); } - if ( ( TRUE == isZeroingAllowed ) && ( TRUE == didTimeout( bloodLeakZeroingStatus.driftUpperRangeStartTimeMS, BLD_ZERO_UPPER_RANGE_DRIFT_TIMEOUT_MS ) ) ) + if ( ( TRUE == isZeroingAllowed ) && ( TRUE == didTimeout( bloodLeakZeroingStatus.driftUpperRangeDebounceTimeMS, BLD_ZERO_UPPER_RANGE_DRIFT_TIMEOUT_MS ) ) ) { status = TRUE; } + bloodLeakZeroingStatus.driftUpperRangeStatus = status; + return status; } Index: firmware/App/Controllers/BloodLeak.h =================================================================== diff -u -rc27b1788cee92bcb143d6c4f09d4b278ddded36f -r804715137aae49c89ffb871ba561d7498d19108a --- firmware/App/Controllers/BloodLeak.h (.../BloodLeak.h) (revision c27b1788cee92bcb143d6c4f09d4b278ddded36f) +++ firmware/App/Controllers/BloodLeak.h (.../BloodLeak.h) (revision 804715137aae49c89ffb871ba561d7498d19108a) @@ -52,6 +52,8 @@ U32 bloodLeakDetect; ///< Blood leak detector detect. F32 bloodLeakIntensityMovingAvg; ///< Blood leak detector intensity moving average. U32 bloodLeakTimeSinceZeroMS; ///< Blood leak detector time since last zero in milliseconds. + U32 driftInRangeStatus; + U32 driftUpperRangeStatus; } BLOOD_LEAK_DATA_T; // ********** public function prototypes ********** Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -rd2d64fea6a4c1a1e0ceba42396b5e9c2483090e3 -r804715137aae49c89ffb871ba561d7498d19108a --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision d2d64fea6a4c1a1e0ceba42396b5e9c2483090e3) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 804715137aae49c89ffb871ba561d7498d19108a) @@ -712,6 +712,10 @@ } } + // NOTE: do not move this function this function needs to be after the check for blood leak zeroing logic above. + // If the blood leak logic is no longer needed, the reset function below can be removed. + resetReservoirSwitchFlag(); + // Dialysis state machine switch ( currentDialysisState ) { @@ -1337,6 +1341,7 @@ data.bolSalineVolumeMl = bolusSalineVolumeDelivered_mL; data.bloodLeakZeroingDPi2BLDFlushVolumeML = bloodLeakZeroingStatus.DPi2BLDFlushedVolML; data.bloodLeakZeroingRsrvr2DPiFlushVolumeML = bloodLeakZeroingStatus.rsrvr2DPiFlushedVolML; + data.bloodLeakZeroingNeededAfterRsrvrSwitch = bloodLeakZeroingStatus.isZeroingNeededAfterRsrvrSwitch; broadcastData( MSG_ID_SALINE_BOLUS_DATA, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&data, sizeof( SALINE_BOLUS_DATA_PAYLOAD_T ) ); salineBolusBroadcastTimerCtr = 0; Index: firmware/App/Modes/Dialysis.h =================================================================== diff -u -rfae38745527912b9b64e618096556ae7ff263cb8 -r804715137aae49c89ffb871ba561d7498d19108a --- firmware/App/Modes/Dialysis.h (.../Dialysis.h) (revision fae38745527912b9b64e618096556ae7ff263cb8) +++ firmware/App/Modes/Dialysis.h (.../Dialysis.h) (revision 804715137aae49c89ffb871ba561d7498d19108a) @@ -46,6 +46,7 @@ F32 bolSalineVolumeMl; ///< Bolus saline volume in mL. F32 bloodLeakZeroingDPi2BLDFlushVolumeML; ///< Blood leak zeroing DPi to BLD flush volume in mL. F32 bloodLeakZeroingRsrvr2DPiFlushVolumeML; ///< Blood leak zeroing reservoir to DPi flush volume in mL. + U32 bloodLeakZeroingNeededAfterRsrvrSwitch; ///< Blood leak zeroing needed after reservoir switch. } SALINE_BOLUS_DATA_PAYLOAD_T; #pragma pack(pop) Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -rfae38745527912b9b64e618096556ae7ff263cb8 -r804715137aae49c89ffb871ba561d7498d19108a --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision fae38745527912b9b64e618096556ae7ff263cb8) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 804715137aae49c89ffb871ba561d7498d19108a) @@ -282,11 +282,20 @@ *************************************************************************/ BOOL checkHasReservoirBeenSwitched( void ) { - BOOL status = hasReservoirBeenSwitched; + return hasReservoirBeenSwitched; +} +/*********************************************************************//** + * @brief + * The resetReservoirSwitchFlag function resets the reservoir has been + * switched flag. + * @details Inputs: none + * @details Outputs: hasReservoirBeenSwitched + * @return none + *************************************************************************/ +void resetReservoirSwitchFlag( void ) +{ hasReservoirBeenSwitched = FALSE; - - return status; } // ********** private functions ********** Index: firmware/App/Services/Reservoirs.h =================================================================== diff -u -rfae38745527912b9b64e618096556ae7ff263cb8 -r804715137aae49c89ffb871ba561d7498d19108a --- firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision fae38745527912b9b64e618096556ae7ff263cb8) +++ firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision 804715137aae49c89ffb871ba561d7498d19108a) @@ -57,6 +57,7 @@ void updateReservoirUFTime( void ); // Update time spent doing ultrafiltration for currently active reservoir U32 getLastReservoirUFTimeInMs( void ); // Get the time spent doing ultrafiltration on the previously active reservoir BOOL checkHasReservoirBeenSwitched( void ); +void resetReservoirSwitchFlag( void ); BOOL testSetRecirculationLevelPctOverride( F32 value ); // Set override for reciruclation percentage BOOL testResetRecirculationLevelPctOverride( void ); // Reset override for recirulation percentage