Index: firmware/App/Modes/ModeGenDialysate.c =================================================================== diff -u -r590c4b129a1b8fced97b8f653fb58e97fdf64a28 -re5c384741feb64828c1f4c32ff6daca07b20f46e --- firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision 590c4b129a1b8fced97b8f653fb58e97fdf64a28) +++ firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision e5c384741feb64828c1f4c32ff6daca07b20f46e) @@ -60,8 +60,9 @@ #define DIALYSATE_TEMP_LOWER_SAFETY_LIMIT_C 33.0F ///< Dialysate lower bound safety temperature limit in C. #define DIALYSATE_TEMP_CLEAR_TIMEOUT_MS ( 10 * MS_PER_SECOND ) ///< Dialysate temperature clear persistence timeout. #define DIALYSATE_CONDUCTIVITY_OUT_OF_TARGET_PERCENT 5.0F ///< Dialysate conductivity out of target tolerance percent. -#define DIALYSATE_CONDUCTIVITY_OUT_OF_TARGET_TIMEOUT_MS ( 30 * MS_PER_SECOND ) ///< Dialysate conductivity out of target timeout in milliseconds. +#define DIALYSATE_CONDUCTIVITY_OUT_OF_TARGET_TIMEOUT_MS ( 10 * MS_PER_SECOND ) ///< Dialysate conductivity out of target timeout in milliseconds. #define DIALYSATE_CONDUCTIVITY_CLEAR_TIMEOUT_MS ( 10 * MS_PER_SECOND ) ///< Dialysate conductivity clear persistence timeout. +#define BICARBONATE_CARTRIDGE_LOW_LEVEL_FACTOR 1.25F ///< Bicarb mix volume vs steady-state factor for cartridge low. #define ZERO_DIAL_FLOW_RATE 0.0F ///< Zero dialysate flow rate #define SPENT_CHAMBER_FILL_MAX_COUNT 10 ///< Total number of spent chamber fill allowed. #define BICARB_CHAMBER_FILL_TIMEOUT ( 1 * MS_PER_SECOND ) ///< Bicarb chamber fill timeout. @@ -112,6 +113,7 @@ static void updateDialysateToDialyzerFlowRate( void ); static void checkDialysateTemperature( void ); static void checkDialysateConductivity( void ); +static void checkBicarbonateCartridgeLevelLow( void ); static void monitorChamberLevelStatus( void ); static void publishGenDialysateModeData( void ); static U32 getFreshDialPumpInitialRpm( void ); @@ -167,6 +169,7 @@ initPersistentAlarm( ALARM_ID_DD_ACID_CONCENTRATE_CONDUCTIVITY_HIGH, DIALYSATE_CONDUCTIVITY_CLEAR_TIMEOUT_MS, DIALYSATE_CONDUCTIVITY_OUT_OF_TARGET_TIMEOUT_MS ); initPersistentAlarm( ALARM_ID_DD_BICARBONATE_CONDUCTIVITY_LOW, DIALYSATE_CONDUCTIVITY_CLEAR_TIMEOUT_MS, DIALYSATE_CONDUCTIVITY_OUT_OF_TARGET_TIMEOUT_MS ); initPersistentAlarm( ALARM_ID_DD_BICARBONATE_CONDUCTIVITY_HIGH, DIALYSATE_CONDUCTIVITY_CLEAR_TIMEOUT_MS, DIALYSATE_CONDUCTIVITY_OUT_OF_TARGET_TIMEOUT_MS ); + initPersistentAlarm( ALARM_ID_DD_BICARBONATE_CARTRIDGE_LOW_LEVEL, DIALYSATE_CONDUCTIVITY_CLEAR_TIMEOUT_MS, DIALYSATE_CONDUCTIVITY_OUT_OF_TARGET_TIMEOUT_MS ); } /*********************************************************************//** @@ -517,6 +520,11 @@ // Update any dynamic treatment parameter changes updateTreatmentSettings(); + // Advance steady-state bicarb volume calibration (continues from PreGen) + serviceSteadyStateBicarbVolCal(); + + checkBicarbonateCartridgeLevelLow(); + #ifdef ENABLE_ALARM_2 //Check dialysate temperature high/low alarms checkDialysateTemperature(); @@ -1300,6 +1308,46 @@ /*********************************************************************//** * @brief + * The checkBicarbonateCartridgeLevelLow function checks bicarbonate mix + * volume against confirmed steady-state volume for cartridge low (alarm 243). + * Triggered when Bicarbonate Volume > Steady State Bicarbonate Volume + 25% + * for continuous 10 sec (±150 ms) while in Bypass or Delivery. + * @details \b Inputs: getBicarbMixVol, getSteadyStateBicarbVolume, genDialysateState + * @details \b Outputs: none + * @details \b Alarms: ALARM_ID_DD_BICARBONATE_CARTRIDGE_LOW_LEVEL when + * getBicarbMixVol() > getSteadyStateBicarbVolume() * 1.25F + * @return none + *************************************************************************/ +static void checkBicarbonateCartridgeLevelLow( void ) +{ + F32 currentBicarbVol = getBicarbMixVol(); + F32 steadyStateVol = getSteadyStateBicarbVolume(); + F32 threshold = steadyStateVol * BICARBONATE_CARTRIDGE_LOW_LEVEL_FACTOR; + BOOL outOfRange = FALSE; + + if ( ( FALSE == isSteadyStateBicarbVolumeValid() ) || + ( steadyStateVol <= 0.0F ) || + ( ( DD_GEND_DIALYSATE_BYPASS_STATE != genDialysateState ) && + ( DD_GEND_DIALYSATE_DELIVERY_STATE != genDialysateState ) ) ) + { + checkPersistentAlarm( ALARM_ID_DD_BICARBONATE_CARTRIDGE_LOW_LEVEL, FALSE, currentBicarbVol, steadyStateVol ); + } + else + { + outOfRange = ( currentBicarbVol > threshold ? TRUE : FALSE ); + + if ( TRUE == isAlarmActive( ALARM_ID_DD_BICARBONATE_CARTRIDGE_LOW_LEVEL ) ) + { + // Clear when volume returns to at or below threshold + outOfRange = ( currentBicarbVol <= threshold ? FALSE : TRUE ); + } + + checkPersistentAlarm( ALARM_ID_DD_BICARBONATE_CARTRIDGE_LOW_LEVEL, outOfRange, currentBicarbVol, steadyStateVol ); + } +} + +/*********************************************************************//** + * @brief * The publishGenDialysateModeData function broadcasts the generate dialysate * mode data at defined interval. * @details \b Inputs: genDialysateDataPublicationTimerCounter