Index: firmware/App/Controllers/BalancingChamber.c =================================================================== diff -u -rb7aca6a5c7073dbae6a31d0f87d81bc241eece33 -r5b964c8b60808451ece4379fb74aee9e7532b034 --- firmware/App/Controllers/BalancingChamber.c (.../BalancingChamber.c) (revision b7aca6a5c7073dbae6a31d0f87d81bc241eece33) +++ firmware/App/Controllers/BalancingChamber.c (.../BalancingChamber.c) (revision 5b964c8b60808451ece4379fb74aee9e7532b034) @@ -25,6 +25,7 @@ #include "FpgaDD.h" #include "Heaters.h" #include "Level.h" +#include "MessagePayloads.h" #include "MessageSupport.h" #include "Messaging.h" #include "MixingControl.h" @@ -49,7 +50,7 @@ #define BAL_CHAMBER_FILL_COMPLETE_MS ( 100 / TASK_GENERAL_INTERVAL ) ///< Time (ms/tasktime) to confirm the balancing chamber fill completed and pressure is within range #define SPENT_FILL_COMPLETE_QD_LOW_RISE_MAX_MLPM 300.0F ///< For Qd <= 300 mL/min (Diener 1000). #define SPENT_FILL_COMPLETE_DP_RISE_PSIG 0.5F ///< Minimum 100 ms spent pressure rise (current minus n-2) to count as a rise hit at low Qd. -#define SPENT_FILL_COMPLETE_DP_RISE_HIGH_QD_PSIG 3.0F ///< Minimum spent pressure rise for Diener 2000 or Qd > 300 mL/min. +#define SPENT_FILL_COMPLETE_DP_RISE_HIGH_QD_PSIG 2.0F ///< Minimum spent pressure rise for Diener 2000 #define SPENT_FILL_SLOPE_SPENT_PRESSURE_HIGH_PSIG 2.0F ///< Above this spent pressure rise, only one rise hit is required. #define SPENT_FILL_SLOPE_MAX_RISE_HITS 2 ///< Rise hits required when Qd <= 150 in the low spent-pressure band. #define SPENT_FILL_DETECT_COUNT_TOL_PCT 1.0F ///< Allowed detection timing tolerance as a fraction of expected BC switching count. @@ -62,13 +63,14 @@ #define BAL_CHAMBER_FILL_TIMEOUT_FACTOR 3.0F ///< Balancing Chamber fill timeout factor (300% of observed fill count) #define COMP_SLOPE -0.000376F ///< Balancing chamber temperature compensation slope factor #define COMP_INTERCEPT 1.007269F ///< Balancing chamber temperature compensation intercept factor -/// Bicarb (D10) pump speed from instantaneous mix volume: speed = 240 - sqrt(230400 - 96000*v)/2 #define BC_BICARB_SPEED_OFFSET_MLPM 240.0F ///< Bicarb speed formula offset (mL/min). #define BC_BICARB_SPEED_DISC_CONST 230400.0F ///< Bicarb speed formula discriminant constant. #define BC_BICARB_SPEED_DISC_VOL_COEF 96000.0F ///< Bicarb speed formula volume coefficient. #define BC_ACID_SPEED_OFFSET_MLPM 160.0F ///< Acid speed formula offset (mL/min). #define BC_ACID_SPEED_DISC_CONSTANT 102400.0F ///< Acid speed formula discriminant constant. #define BC_ACID_SPEED_DISC_VOL_COEF 96000.0F ///< Acid speed formula volume coefficient. +#define BAL_CHAMBER_MAX_SWITCH_TIME_TOL 1.0F ///< Maximum tolerance defined for switching states +#define BAL_CHAMBER_ABSOLUTE_SPENT_PRESSURE 33.0F ///< Maximum spent(D51) pressure before we declare the fill is complete /// Payload record structure for balancing chamber switch only request typedef struct @@ -117,6 +119,7 @@ static BOOL isBalChamberSwitchingPeriodUpdatePending; ///< BC switching period update pending apply at fill end. static U32 bcSwitchingBasedOnClosedPeriodCounter; ///< Valve-close segments remaining before first-cycle relaxations clear after Qd timing apply. static F32 balancingError; ///< Balancing error that has been calculated during balancing chamber switching. +static F32 balChamberTolSwitchTime; ///< Balancing chamber allowed tolerance time before we switch to next state. //TODO: remove later once level sensor working static U32 bicarbChamberPeriodicFillCounter; @@ -210,6 +213,7 @@ prevBalChamberState = BAL_CHAMBER_STATE_IDLE; //TODO:remove once level sensor working bicarbChamberPeriodicFillCounter = 0; + balChamberTolSwitchTime = 0.0F; } /*********************************************************************//** @@ -401,8 +405,7 @@ //update the switching period in task interval for balancing chamber fill timeout check balChamberSwitchingPeriod = (U32)( (F32)SEC_PER_MIN / getBalChamberSwitchingFreq() * ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ); - // finish the balancing chamber fill 50 ms prior completing the regular cycle time. - balChamberSwitchingPeriod -= 1; + balChamberTolSwitchTime = (F32)balChamberSwitchingPeriod + ( (F32)balChamberSwitchingPeriod * BAL_CHAMBER_MAX_SWITCH_TIME_TOL ); //Update last td dialysate flow rate lastTdDialysateFlowrate = tdDialysateFlowrate; @@ -418,7 +421,7 @@ //Testing balChamberValveClosePeriod = balChamberSwitchingPeriod; - balChamberValveClosePeriod -= 1; // Close valves prior 50 msecond for testing + balChamberValveClosePeriod -= 2; // Close valves 100 msecond prior to switching to next state currentBalChamberFillCounter = 0; currentBalChamberSwitchingCounter = 0; @@ -1481,34 +1484,34 @@ { requiredRiseCount = 1U; } - else - { - requiredRiseCount = 2U; - } +// else +// { +// requiredRiseCount = 2U; +// } if ( ( TRUE == riseHit ) && ( TRUE == isDetectionInCountWindow ) ) { spentFillRiseHitCount += 1; spentFillRiseMissCounter = 0; } - else if ( spentFillRiseHitCount > 0 ) - { - if ( ( FALSE == riseHit ) && ( TRUE == isDetectionInCountWindow ) ) - { - spentFillRiseMissCounter += 1; +// else if ( spentFillRiseHitCount > 0 ) +// { +// if ( ( FALSE == riseHit ) && ( TRUE == isDetectionInCountWindow ) ) +// { +// spentFillRiseMissCounter += 1; +// +// if ( spentFillRiseMissCounter >= 2 ) +// { +// spentFillRiseHitCount = 0; +// spentFillRiseMissCounter = 0; +// } +// } +// } - if ( spentFillRiseMissCounter >= 2 ) - { - spentFillRiseHitCount = 0; - spentFillRiseMissCounter = 0; - } - } - } - lastPrevSpentDialPressure = prevSpentDialPressure; prevSpentDialPressure = spentDialPressure; - state = ( spentFillRiseHitCount >= requiredRiseCount ) ? TRUE : FALSE; + state = ( ( spentDialPressure >= BAL_CHAMBER_ABSOLUTE_SPENT_PRESSURE ) || ( spentFillRiseHitCount >= requiredRiseCount ) || ( currentBalChamberFillCounter >= balChamberTolSwitchTime ) ) ? TRUE : FALSE; return state; } Index: firmware/App/Controllers/BalancingChamber.h =================================================================== diff -u -rd8914df8f4eb91158741ae38302255709f0a2be4 -r5b964c8b60808451ece4379fb74aee9e7532b034 --- firmware/App/Controllers/BalancingChamber.h (.../BalancingChamber.h) (revision d8914df8f4eb91158741ae38302255709f0a2be4) +++ firmware/App/Controllers/BalancingChamber.h (.../BalancingChamber.h) (revision 5b964c8b60808451ece4379fb74aee9e7532b034) @@ -47,19 +47,6 @@ #define BAL_CHAMBER_TIME_BASED_BAND_2 290 ///< Speed at D48 pump runs when the flowrate is between 60 mL/min and 70 mL/min. #define BAL_CHAMBER_TIME_BASED_BAND_3 330 ///< Speed at D48 pump runs when the flowrate is between 70 mL/min and 80 mL/min. -/// balancing chamber data structure -typedef struct -{ - U32 balChamberExecState; ///< Balancing chamber execution state - U32 balChamberSWState; ///< Balancing chamber switching state (state 1 or state 2) - F32 balChamberSWFreq; ///< Balancing chamber switching frequency - BOOL isSpentFillComplete; ///< Whether balancing chamber spent fill completed or not - U32 currentBalChamberSwitchingCounter; ///< Current balancing chamber switching counter - BOOL isPressureStabilizedDuringFill; ///< Whether pressure stabilized during fill or not - BOOL balChamberSWOnlyState; ///< Balancing chamber switching only status ( On/Off) - BOOL isBalChamberSwitchingActive; ///< Balancing chamber switching status -} BAL_CHAMBER_DATA_T; - // ********** public function prototypes ********** void initBalanceChamber( void ); // Initialize balancing chamber unit @@ -87,6 +74,7 @@ BOOL getBalancingChamberStatus(void); // Get Balancing Chamber Switching Status BOOL isBalChamberSwitchImminent( void ); // Get the balancing chamber is within the valve-close window (50 ms) before switching. BOOL getBalChamberFreshSideValvesClosedStatus( void ); // Get the balancing chamber fresh side valve close status +BOOL getBalancingChamberStatus( void ); // Get Balancing Chamber Switching Status BOOL testDDBalChamberDataPublishIntervalOverride( MESSAGE_T *message ); // To override the balancing chamber data publish interval BOOL testBalChamberSwFreqOverride( MESSAGE_T *message ); // To override the balancing chamber switching frequency Index: firmware/App/Controllers/MixingControl.c =================================================================== diff -u -r847659965e5823e2e25db62c14f4611db9527f8a -r5b964c8b60808451ece4379fb74aee9e7532b034 --- firmware/App/Controllers/MixingControl.c (.../MixingControl.c) (revision 847659965e5823e2e25db62c14f4611db9527f8a) +++ firmware/App/Controllers/MixingControl.c (.../MixingControl.c) (revision 5b964c8b60808451ece4379fb74aee9e7532b034) @@ -69,11 +69,11 @@ #define MIX_NO_FEED_FORWARD 0.0F ///< Feed forward term for dialysate closed loop control -#define BICARB_MIX_CONTROL_INTERVAL ( 9 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the bicarb mix is controlled. -#define ACID_MIX_CONTROL_INTERVAL ( 15 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the dialysate mix is controlled. +#define BICARB_MIX_CONTROL_INTERVAL_MULTIPLIER ( 3 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the bicarb mix is controlled. +#define ACID_MIX_CONTROL_INTERVAL_MULTIPLIER ( 5 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the dialysate mix is controlled. -#define BICARB_DEADBAND_CONTROL 15.0F ///< Bicarb dead band control -#define ACID_DEADBAND_CONTROL 50.0F ///< Acid dead band control +#define BICARB_DEADBAND_CONTROL 30.0F ///< Bicarb dead band control +#define ACID_DEADBAND_CONTROL 70.0F ///< Acid dead band control // Proportioning Ratios: 1 Part Acid : 1.72 Parts Bicarb : 42.28 Parts Water // Total parts = 1 + 1.72 + 42.28 = 45.0 @@ -130,7 +130,8 @@ #define TOTAL_CONDUCTIVITY ( ACID_CONDUCTIVITY_POST + BICARB_CONDUCTIVITY_POST ) ///< Theoretical Dialysate conductivity - +#define FLOW_SETTING_FOR_STATIC_CONTROL_INTERVAL_UPDATE 100.0F ///< Flowrate at which static update is applied for bicarb and dialysate +#define STATIC_CONTROL_INTERVAL ( 2 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which dialysate and bicarb mix is controlled (for qd <= 100 mL/min) /// Enumeration of dialysate Mixing id. typedef enum DialysateMixingID { @@ -313,13 +314,13 @@ mixingControlTargetAdjBicarbSettings.ovInitData = 0.0F; mixingControlTargetAdjBicarbSettings.override = OVERRIDE_RESET; - mixingControlBicarbControlInterval.data = BICARB_MIX_CONTROL_INTERVAL; - mixingControlBicarbControlInterval.ovData = BICARB_MIX_CONTROL_INTERVAL; + mixingControlBicarbControlInterval.data = BICARB_MIX_CONTROL_INTERVAL_MULTIPLIER; + mixingControlBicarbControlInterval.ovData = BICARB_MIX_CONTROL_INTERVAL_MULTIPLIER; mixingControlBicarbControlInterval.ovInitData = 0; mixingControlBicarbControlInterval.override = OVERRIDE_RESET; - mixingControlAcidControlInterval.data = ACID_MIX_CONTROL_INTERVAL; - mixingControlAcidControlInterval.ovData = ACID_MIX_CONTROL_INTERVAL; + mixingControlAcidControlInterval.data = ACID_MIX_CONTROL_INTERVAL_MULTIPLIER; + mixingControlAcidControlInterval.ovData = ACID_MIX_CONTROL_INTERVAL_MULTIPLIER; mixingControlAcidControlInterval.ovInitData = 0; mixingControlAcidControlInterval.override = OVERRIDE_RESET; @@ -428,6 +429,41 @@ /*********************************************************************//** * @brief + * The updatedCMixingControlInterval function sets both acid and bicarb + * Mix volume provided by the controller + * @details \b Inputs: none + * @details \b Outputs: mixingControlBicarbMixVolume + * @param targetValue bicarb Mix volume + * @return TRUE if successful, FALSE if not. + *************************************************************************/ +static void updatedCMixingControlInterval( void ) +{ + F32 tdDialysateFlowRate = 0.0F; + F32 balChamberSwitchingFreq = 0.0F; + F32 balChamberSwitchingPeriod = 0; + + tdDialysateFlowRate = getTDDialysateFlowrate(); + + balChamberSwitchingFreq = tdDialysateFlowRate / 30.0; + balChamberSwitchingPeriod = (F32)( SEC_PER_MIN ) / balChamberSwitchingFreq; + + // For bicarb control period, we are using 3 cycles of balancing chamber switching period (for ex: At Qd = 600, switching period = 3sec, so acid control interval = 3*3 = 9sec + // For acid control period, we are using 5 cycles of balancing chamber switching period (for ex: At Qd = 600, switching period = 3sec, so bicarb control interval = 3*5 = 15sec + + if ( ( balChamberSwitchingPeriod > 0 ) && ( tdDialysateFlowRate <= FLOW_SETTING_FOR_STATIC_CONTROL_INTERVAL_UPDATE ) ) + { + mixingControlAcidControlInterval.data = STATIC_CONTROL_INTERVAL * balChamberSwitchingPeriod; + mixingControlBicarbControlInterval.data = STATIC_CONTROL_INTERVAL * balChamberSwitchingPeriod; + } + else if ( tdDialysateFlowRate > FLOW_SETTING_FOR_STATIC_CONTROL_INTERVAL_UPDATE ) + { + mixingControlAcidControlInterval.data = ACID_MIX_CONTROL_INTERVAL_MULTIPLIER * balChamberSwitchingPeriod; + mixingControlBicarbControlInterval.data = BICARB_MIX_CONTROL_INTERVAL_MULTIPLIER * balChamberSwitchingPeriod; + } +} + +/*********************************************************************//** + * @brief * The getBicarbDeltaConductivity function gets the delta target conductivity * @details \b Inputs: mixingControlBicarbDeltaConductivity * @details \b Outputs: none @@ -1115,7 +1151,7 @@ *************************************************************************/ BOOL testMixingControlBicarbControlIntervalOverride( MESSAGE_T *message ) { - BOOL result = u32Override( message, &mixingControlBicarbControlInterval, 0, BICARB_MIX_CONTROL_INTERVAL ); + BOOL result = u32Override( message, &mixingControlBicarbControlInterval, 0, BICARB_MIX_CONTROL_INTERVAL_MULTIPLIER ); return result; } @@ -1132,7 +1168,7 @@ *************************************************************************/ BOOL testMixingControlAcidControlIntervalOverride( MESSAGE_T *message ) { - BOOL result = u32Override( message, &mixingControlAcidControlInterval, 0, BICARB_MIX_CONTROL_INTERVAL ); + BOOL result = u32Override( message, &mixingControlAcidControlInterval, 0, BICARB_MIX_CONTROL_INTERVAL_MULTIPLIER ); return result; } Index: firmware/App/Modes/ModeGenDialysate.c =================================================================== diff -u -r56410a2475a4a6d1aa93642c630cdf37683d3231 -r5b964c8b60808451ece4379fb74aee9e7532b034 --- firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision 56410a2475a4a6d1aa93642c630cdf37683d3231) +++ firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision 5b964c8b60808451ece4379fb74aee9e7532b034) @@ -72,6 +72,8 @@ //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., +#define MAX_UF_RATE 150 ///< Rate at which D76 pump runs in Prime fluid discard state + /// Payload record structure for Gen dialysate execution state set request typedef struct { @@ -114,6 +116,7 @@ static void monitorChamberLevelStatus( void ); static void publishGenDialysateModeData( void ); static U32 getFreshDialPumpInitialRpm( void ); +static DD_GEND_MODE_STATE_T handleGenDPrimeFluidDiscardState( void ); /*********************************************************************//** * @brief @@ -488,6 +491,32 @@ //TODO : define actuators states break; + case DD_GEND_PRIME_FLUID_DISCARD_STATE: + + // Turn off fresh & spent pumps + signalDialysatePumpHardStop( D12_PUMP ); + signalDialysatePumpHardStop( D48_PUMP ); + + setValveState( D40_VALV, VALVE_STATE_CLOSED ); + setValveState( D35_VALV, VALVE_STATE_CLOSED ); + setValveState( D100_VALV, VALVE_STATE_OPEN ); + setValveState( D34_VALV, VALVE_STATE_CLOSED ); + setValveState( D91_VALV, VALVE_STATE_CLOSED ); + setValveState( D47_VALV, VALVE_STATE_CLOSED ); + setValveState( D52_VALV, VALVE_STATE_CLOSED ); + setValveState( D14_VALV, VALVE_STATE_CLOSED ); + setValveState( D65_VALV, VALVE_STATE_CLOSED ); + //Close all balancing chamber valves + valveControlForBCClosedState(); + + //UF pump on + setConcentratePumpTargetSpeed( D76_PUMP, MAX_UF_RATE, DOSING_CONT_VOLUME ); + requestConcentratePumpOn( D76_PUMP ); + + //Rinse pump On + setRinsePumpState( RINSE_PUMP_STATE_ON ); + break; + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_GEND_MODE_INVALID_EXEC_STATE1, state ) break; @@ -564,6 +593,10 @@ genDialysateState = handleGenDIsolatedUFState(); break; + case DD_GEND_PRIME_FLUID_DISCARD_STATE: + genDialysateState = handleGenDPrimeFluidDiscardState(); + break; + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_GEND_MODE_INVALID_EXEC_STATE, genDialysateState ) genDialysateState = DD_GEND_STATE_START; @@ -812,6 +845,20 @@ state = DD_GEND_DIALYSATE_DELIVERY_STATE; } + if ( TRUE == getprimeFluidDiscardStatus() ) + { + // Deactivate Balancing Chamber Switching + requestBalChamberSwitching( FALSE ); + + // Wait for the Balancing Chamber to complete the current cycle before transition into spent chamber fill state + if ( getBalancingChamberStatus() == FALSE ) + { + setModeGenDStateTransition( DD_GEND_PRIME_FLUID_DISCARD_STATE ); + isDialDeliveryInProgress.data = FALSE; + state = DD_GEND_PRIME_FLUID_DISCARD_STATE; + } + } + return state; } @@ -957,6 +1004,30 @@ /*********************************************************************//** * @brief + * The handleGenDPrimeFluidDiscardState function performs discarding the + * priming fluid from disposable tube set. Runs the ultrafiltration pump (D76) + * to discard the priming fluid. + * @details \b Inputs: getprimeFluidDiscardStatus + * @details \b Outputs: none + * @return next gen dialysate mode state + *************************************************************************/ +static DD_GEND_MODE_STATE_T handleGenDPrimeFluidDiscardState( void ) +{ + DD_GEND_MODE_STATE_T state = DD_GEND_PRIME_FLUID_DISCARD_STATE; + + if ( FALSE == getprimeFluidDiscardStatus() ) + { + requestConcentratePumpOff( D76_PUMP, FALSE ); + setValveState( D100_VALV, VALVE_STATE_CLOSED ); + setModeGenDStateTransition( DD_GEND_DIALYSATE_BYPASS_STATE ); + state = DD_GEND_DIALYSATE_BYPASS_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief * The requestDDGenDialyasteStop function handles an TD request to stop * generation dialysis mode. * @details \b Inputs: Generation dialysate mode / state Index: firmware/App/Monitors/Conductivity.c =================================================================== diff -u -r08ef85235ca795bb01a16b0352a4f3f4405333fa -r5b964c8b60808451ece4379fb74aee9e7532b034 --- firmware/App/Monitors/Conductivity.c (.../Conductivity.c) (revision 08ef85235ca795bb01a16b0352a4f3f4405333fa) +++ firmware/App/Monitors/Conductivity.c (.../Conductivity.c) (revision 5b964c8b60808451ece4379fb74aee9e7532b034) @@ -101,7 +101,6 @@ static void filterConductivitySensorTemperatureReadings( void ); static void calcRORejectionRatio( void ); static void filterRORejectionRatioReadings( void ); -static void broadcastResistanceData( void ); static U32 getConductivityFilterSize( void ); static void resetConductivityFilterReadings( void );