Index: firmware/App/Modes/ModeGenDialysate.c =================================================================== diff -u -r830213bc6dcc1a684610caf78c79d55f2cb41e93 -r8471d9c87bc554586ecc1e7e12d6ee35b7876230 --- firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision 830213bc6dcc1a684610caf78c79d55f2cb41e93) +++ firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision 8471d9c87bc554586ecc1e7e12d6ee35b7876230) @@ -63,6 +63,8 @@ #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. +#define PUMP_SPEED_SLOPE_FACTOR 1.24F ///< D48 pump speed (calculation based on Qd) slope factor. +#define PUMP_SPEED_INTERCEPT_FACTOR 30.0F ///< D48 pump speed (calculation based on Qd) intercept factor. //Testing #define DELAY_BC_SWITCHING_AT_START_UP ( 10 * MS_PER_SECOND ) ///< Provide a balancing chamber switching start up delay to stabilize pump speed etc., /// Payload record structure for Gen dialysate execution state set request @@ -88,6 +90,7 @@ static U32 bypassStateDelayStartTimeMS; ///< Delay balancing chamber switching for a second to preapre pump steady state. static BOOL delayBypassStateFlag; ///< To indicate change in treatment parameters static F32 dialysateToDialyzerFlowRate; ///< Current dialysate to dialyzer flow rate (ml/min) +static U32 d48PumpSpeed; ///< Initial D48 pump speed based on the Qd. // ********** private function prototypes ********** @@ -137,6 +140,7 @@ bicarbFillStartTimeMS = 0; pendingSpentChamberFill = FALSE; pendingBicarbChamberFill = FALSE; + d48PumpSpeed = MIN_DIALYSATE_PUMP_RPM; //Testing bypassStateDelayStartTimeMS = 0; delayBypassStateFlag = TRUE; @@ -162,6 +166,7 @@ { initGenDialysateMode(); setCurrentSubState( NO_SUB_STATE ); + calculateD48PumpSpeed(); transitionToUltrafiltration(); return genDialysateState; @@ -230,7 +235,7 @@ //setDialysatePumpTargetRPM( D12_PUMP, FRESH_DIAL_PUMP_INITIAL_RPM, FALSE ); setDialysatePumpTargetRPM( D12_PUMP, FRESH_DIAL_PUMP_INITIAL_RPM, TRUE ); //setDialysatePumpTargetRPM( D48_PUMP, SPENT_DIAL_PUMP_INITIAL_RPM, FALSE ); - setDialysatePumpTargetRPM( D48_PUMP, SPENT_DIAL_PUMP_INITIAL_RPM, TRUE ); + setDialysatePumpTargetRPM( D48_PUMP, d48PumpSpeed, TRUE ); //Rinse pump On setRinsePumpState( RINSE_PUMP_STATE_ON ); @@ -258,7 +263,7 @@ //setDialysatePumpTargetRPM( D12_PUMP, FRESH_DIAL_PUMP_INITIAL_RPM, FALSE ); setDialysatePumpTargetRPM( D12_PUMP, FRESH_DIAL_PUMP_INITIAL_RPM, TRUE ); //setDialysatePumpTargetRPM( D48_PUMP, SPENT_DIAL_PUMP_INITIAL_RPM, FALSE ); - setDialysatePumpTargetRPM( D48_PUMP, SPENT_DIAL_PUMP_INITIAL_RPM, TRUE ); + setDialysatePumpTargetRPM( D48_PUMP, d48PumpSpeed, TRUE ); //Rinse pump On setRinsePumpState( RINSE_PUMP_STATE_ON ); @@ -328,7 +333,7 @@ setRinsePumpState( RINSE_PUMP_STATE_ON ); setDialysatePumpTargetRPM( D12_PUMP, FRESH_DIAL_PUMP_INITIAL_RPM, TRUE ); - setDialysatePumpTargetRPM( D48_PUMP, SPENT_DIAL_PUMP_INITIAL_RPM, TRUE ); + setDialysatePumpTargetRPM( D48_PUMP, d48PumpSpeed, TRUE ); break; case DD_GEND_DIALYSATE_DELIVERY_PAUSE: @@ -496,6 +501,31 @@ /*********************************************************************//** * @brief + * The getD48PumpSpeed function returns the calculated D48 pump speed + * @details \b Inputs: none + * @details \b Outputs: none + * @return D48 pump speed. + *************************************************************************/ +U32 getD48PumpSpeed( void ) +{ + return d48PumpSpeed; +} + +/*********************************************************************//** + * @brief + * The setD48PumpSpeed function sets the updated D48 pump speed. + * @details \b Inputs: none + * @details \b Outputs: d48PumpSpeed + * @param pumpSpeed Dialysate pump speed + * @return none. + *************************************************************************/ +void setD48PumpSpeed( U32 pumpSpeed ) +{ + d48PumpSpeed = pumpSpeed; +} + +/*********************************************************************//** + * @brief * The monitorChamberLevelStatus function checks the spent chamber and bicarb * chamber level status and updates the corrosponding flags. * @details \b Inputs: Spent and bicarb chamber levels. @@ -551,6 +581,23 @@ /*********************************************************************//** * @brief + * The calculateD48PumpSpeed function calculates the pump speed based on the + * dialysate flow rate for continuous delivery of dialysate. + * @details \b Inputs: Qd. + * @details \b Outputs: D48 pump speed + * @return none. + *************************************************************************/ +static void calculateD48PumpSpeed( void ) +{ + // Get the dialysate flow rate from TD + F32 dialFlowrate = getTDDialysateFlowrate(); + + // D48 Pump Speed = (1.24 * Qd ) + 30.0 + d48PumpSpeed = (U32)( ( PUMP_SPEED_SLOPE_FACTOR * dialFlowrate ) + PUMP_SPEED_INTERCEPT_FACTOR ); +} + +/*********************************************************************//** + * @brief * The handleGenDDialysateIsolatedUFState function performs the * Isolated ultrafiltration operations. * @details \b Inputs: none. @@ -854,6 +901,9 @@ //TODO: update others parameters setting as needed. signalUFRateUpdate(); + //Update D48 pump speed + calculateD48PumpSpeed(); + //reset the flag isTreatmentParamUpdated = FALSE; }