Index: firmware/App/Controllers/BalancingChamber.c =================================================================== diff -u -rd748813399d38ef5b71d760e327e368cc82d7a38 -re79eb4fbdacbc729b0f611f7d27b03ef004dc3da --- firmware/App/Controllers/BalancingChamber.c (.../BalancingChamber.c) (revision d748813399d38ef5b71d760e327e368cc82d7a38) +++ firmware/App/Controllers/BalancingChamber.c (.../BalancingChamber.c) (revision e79eb4fbdacbc729b0f611f7d27b03ef004dc3da) @@ -73,6 +73,9 @@ static F32 lastTdDialysateFlowrate; ///< Previous TD dialysate flow rate static F32 freshDialPressure; ///< Fresh side dialysate pressure static F32 spentDialPressure; ///< Spent side dialysate pressure +static BOOL isBalChamberSwitchingActive; ///< Flag indicating balancing chamber switching is active or not. +static BOOL isBalChamberSwitchingRequest; ///< Flag indicating if there is a request to either activate or deactivate the balancing chamber switching +static BOOL balChamberSwitchingRequestAction; ///< Flag indicating balancing chamber request action. If TRUE then activate the switching, else stay in IDLE state. //TODO: remove later once level sensor working static U32 bicarbChamberPeriodicFillCounter; ///< Counter for checking the timeout for drybicart chamber fill request. @@ -86,6 +89,8 @@ static BAL_CHAMBER_EXEC_STATE_T handleBalChamberState2FillStart( void ); static BAL_CHAMBER_EXEC_STATE_T handleBalChamberState2ValvesClose( void ); static BAL_CHAMBER_EXEC_STATE_T handleBalChamberState2FillEnd(void); +static BAL_CHAMBER_EXEC_STATE_T handleBalChamberStateIdle( void ); +static BAL_CHAMBER_EXEC_STATE_T processBalChamberSwitchingRequest( void ); static void publishBalChamberData( void ); static U32 getBalChamberDataPublishInterval( void ); @@ -255,6 +260,10 @@ balChamberExecState = handleBalChamberState2FillEnd(); break; + case BAL_CHAMBER_STATE_IDLE: + balChamberExecState = handleBalChamberStateIdle(); + break; + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_BAL_CHAMBER_INVALID_EXEC_STATE, balChamberExecState ) balChamberExecState = BAL_CHAMBER_STATE_START; @@ -269,6 +278,42 @@ /*********************************************************************//** * @brief + * The activateBalChamberSwitching function activates the balancing chamber switching. + * The balancing chamber state moves from start to end and keeps switching between + * state1 and state2 until deactivated. + * @details \b Inputs: none + * @details \b Outputs: isBalChamberSwitchingRequest, balChamberSwitchingRequestAction + * @return none. + *************************************************************************/ +void activateBalChamberSwitching( void ) +{ + // Set flag to indicate that a request was made for balancing chamber + isBalChamberSwitchingRequest = TRUE; + + // Set flag to indicate that the request made was to activate the balancing chamber switching + balChamberSwitchingRequestAction = TRUE; +} + +/*********************************************************************//** + * @brief + * The deactivateBalChamberSwitching function deactivates the balancing chamber switching. + * The balancing chamber state remains in the idle state until activated again. + * @details \b Inputs: + * @details \b Outputs: isBalChamberSwitchingRequest, balChamberSwitchingRequestAction + * @return none. + *************************************************************************/ +void deactivateBalChamberSwitching( void ) +{ + // Set flag to indicate that a request was made for balancing chamber + isBalChamberSwitchingRequest = TRUE; + + // Set flag to indicate that the request made was to deactivate the balancing chamber switching + // and stay in the idle state + balChamberSwitchingRequestAction = FALSE; +} + +/*********************************************************************//** + * @brief * The valveControlForBCClosedState function closes the all balancing * chamber valves. * @details \b Inputs: none @@ -713,6 +758,9 @@ } } + // Process Balancing Chamber Switching Request + state = processBalChamberSwitchingRequest(); + return state; } @@ -883,11 +931,73 @@ } } + // Process Balancing Chamber Switching Request + state = processBalChamberSwitchingRequest(); + return state; } /*********************************************************************//** * @brief + * The handleBalChamberStateIdle function check for balancing chamber switching + * activation or deactivation request and then change state + * @details \b Inputs: isBalChamberSwitchingRequest, balChamberSwitchingRequestAction + * @details \b Outputs: isBalChamberSwitchingActive + * @return next balancing chamber state. + *************************************************************************/ +static BAL_CHAMBER_EXEC_STATE_T handleBalChamberStateIdle( void ) +{ + BAL_CHAMBER_EXEC_STATE_T state = processBalChamberSwitchingRequest(); + return state; +} + +/*********************************************************************//** + * @brief + * The processBalChamberSwitchingRequest function processes requests for + * activating or deactivating balancing chamber switching and then change state + * @details \b Inputs: isBalChamberSwitchingRequest, balChamberSwitchingRequestAction + * @details \b Outputs: isBalChamberSwitchingActive + * @return next balancing chamber state. + *************************************************************************/ +static BAL_CHAMBER_EXEC_STATE_T processBalChamberSwitchingRequest( void ) +{ + BAL_CHAMBER_EXEC_STATE_T state = balChamberExecState; + + // Check if there was a request made to the balancing chamber + if ( TRUE == isBalChamberSwitchingRequest ) + { + // Clear the request flag + isBalChamberSwitchingRequest = FALSE; + + // Check if the request made was to activate the switching and it is currently inactive + if ( ( TRUE == balChamberSwitchingRequestAction ) && ( FALSE == isBalChamberSwitchingActive ) ) + { + // Set flag to indicate that balancing chamber switching is active + isBalChamberSwitchingActive = TRUE; + + // Move to the start state + state = BAL_CHAMBER_STATE_START; + } + // Check if the request made was to deactivate the switching and it is currently active + else if ( ( FALSE == balChamberSwitchingRequestAction ) && ( TRUE == isBalChamberSwitchingActive ) ) + { + // Set flag to indicate that balancing chamber switching is inactive + isBalChamberSwitchingActive = FALSE; + + // Move to the idle state + state = BAL_CHAMBER_STATE_IDLE; + } + else + { + // Do nothing and continue to execute the current state as the request made was invalid. + } + } + + return state; +} + +/*********************************************************************//** + * @brief * The getBalChamberDataPublishInterval function gets the balancing chamber * data publish interval. * @details \b Inputs: balChamberDataPublishInterval @@ -930,6 +1040,7 @@ data.currentBalChamberSwitchingCounter = currentBalChamberSwitchingCounter; data.isPressureStabilizedDuringFill = isPressureStabilizedDuringFill; data.balChamberSWOnlyState = balanceChamberSwitchingOnly; + data.isBalChamberSwitchingActive = isBalChamberSwitchingActive; broadcastData( MSG_ID_DD_BAL_CHAMBER_DATA, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&data, sizeof( BAL_CHAMBER_DATA_T ) ); Index: firmware/App/Controllers/BalancingChamber.h =================================================================== diff -u -rd748813399d38ef5b71d760e327e368cc82d7a38 -re79eb4fbdacbc729b0f611f7d27b03ef004dc3da --- firmware/App/Controllers/BalancingChamber.h (.../BalancingChamber.h) (revision d748813399d38ef5b71d760e327e368cc82d7a38) +++ firmware/App/Controllers/BalancingChamber.h (.../BalancingChamber.h) (revision e79eb4fbdacbc729b0f611f7d27b03ef004dc3da) @@ -50,6 +50,7 @@ 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 ********** @@ -58,6 +59,9 @@ void transitionToBalChamberFill( void ); // Prepares for transition to balancing chamber execution U32 execBalancingChamberControl( void ); // Execute the balancing chamber state machine +void activateBalChamberSwitching( void ); // Activates Balancing Chamber Switching. +void deactivateBalChamberSwitching( void ); // Deactivates Balancing Chamber Switching. + void updateBalChamberSwitchingPeriod( void ); // Update the balancing chamber switching period BAL_CHAMBER_EXEC_STATE_T getCurrentBalancingChamberExecState( void ); // Get the current state of the balancing chamber execution F32 getBalChamberSwitchingFreq( void ); // Get the balancing chamber switching frequency Index: firmware/App/Modes/ModeGenDialysate.c =================================================================== diff -u -rd748813399d38ef5b71d760e327e368cc82d7a38 -re79eb4fbdacbc729b0f611f7d27b03ef004dc3da --- firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision d748813399d38ef5b71d760e327e368cc82d7a38) +++ firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision e79eb4fbdacbc729b0f611f7d27b03ef004dc3da) @@ -162,6 +162,7 @@ { initGenDialysateMode(); setCurrentSubState( NO_SUB_STATE ); + deactivateBalChamberSwitching(); transitionToUltrafiltration(); return genDialysateState; @@ -609,6 +610,8 @@ { DD_GEND_MODE_STATE_T state = DD_GEND_ISOLATED_UF_STATE; + deactivateBalChamberSwitching(); + //TODO: define isoalted ultrafiltration. return state; @@ -642,7 +645,7 @@ else { //Execute balancing chamber - execBalancingChamberControl(); + activateBalChamberSwitching(); } if ( getTestConfigStatus( TEST_CONFIG_DD_ENABLE_SPENT_CHAMBER_H_FILL ) == TRUE ) @@ -721,7 +724,7 @@ else { //Execute balancing chamber - execBalancingChamberControl(); + activateBalChamberSwitching(); //Execute ultrafiltration execUFControl(); @@ -745,6 +748,8 @@ LEVEL_STATE_T spentChamberLevel = getLevelStatus( D46_LEVL ); U32 totalSpentChamberFill = getTotalSpentChamberFillCounts(); + deactivateBalChamberSwitching(); + // High level is met or total fill count exceeded if ( ( LEVEL_STATE_HIGH == spentChamberLevel ) || ( totalSpentChamberFill >= SPENT_CHAMBER_FILL_MAX_COUNT ) ) @@ -784,6 +789,8 @@ LEVEL_STATE_T bicarbChamberLevel = getLevelStatus( D63_LEVL ); BOOL isBicarbFillTimeout = FALSE; + deactivateBalChamberSwitching(); + if ( TRUE == didTimeout( bicarbFillStartTimeMS, BICARB_CHAMBER_FILL_TIMEOUT ) ) { isBicarbFillTimeout = TRUE; @@ -840,6 +847,8 @@ DD_GEND_MODE_STATE_T state = DD_GEND_DIALYSATE_DELIVERY_PAUSE; F32 dialFlowrate = getTDDialysateFlowrate(); + deactivateBalChamberSwitching(); + // Resume pause when Qd is not zero if ( dialFlowrate > ZERO_DIAL_FLOW_RATE ) { Index: firmware/App/Modes/ModePostGenDialysate.c =================================================================== diff -u -r830213bc6dcc1a684610caf78c79d55f2cb41e93 -re79eb4fbdacbc729b0f611f7d27b03ef004dc3da --- firmware/App/Modes/ModePostGenDialysate.c (.../ModePostGenDialysate.c) (revision 830213bc6dcc1a684610caf78c79d55f2cb41e93) +++ firmware/App/Modes/ModePostGenDialysate.c (.../ModePostGenDialysate.c) (revision e79eb4fbdacbc729b0f611f7d27b03ef004dc3da) @@ -74,6 +74,7 @@ U32 transitionToPostGenDialysateMode( void ) { initPostGenDialysateMode(); + deactivateBalChamberSwitching(); setCurrentSubState( NO_SUB_STATE ); return postGenDialysateState; Index: firmware/App/Modes/ModePreGenDialysate.c =================================================================== diff -u -rd210786d6c7d75bb0b4d9e18efc40a01d85123fe -re79eb4fbdacbc729b0f611f7d27b03ef004dc3da --- firmware/App/Modes/ModePreGenDialysate.c (.../ModePreGenDialysate.c) (revision d210786d6c7d75bb0b4d9e18efc40a01d85123fe) +++ firmware/App/Modes/ModePreGenDialysate.c (.../ModePreGenDialysate.c) (revision e79eb4fbdacbc729b0f611f7d27b03ef004dc3da) @@ -100,6 +100,7 @@ { initPreGenDialysateMode(); deenergizeActuators( PARK_CONC_PUMPS ); + deactivateBalChamberSwitching(); setCurrentSubState( NO_SUB_STATE ); Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -rd210786d6c7d75bb0b4d9e18efc40a01d85123fe -re79eb4fbdacbc729b0f611f7d27b03ef004dc3da --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision d210786d6c7d75bb0b4d9e18efc40a01d85123fe) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision e79eb4fbdacbc729b0f611f7d27b03ef004dc3da) @@ -185,7 +185,7 @@ //Test request to handle only balancing chamber switching else if ( TRUE == pendingBalanceChamberSwOnlyRequest ) { - execBalancingChamberControl(); + activateBalChamberSwitching(); } // else if ( TRUE == pendingStartDDFlushRequest ) // { Index: firmware/App/Tasks/TaskGeneral.c =================================================================== diff -u -rd210786d6c7d75bb0b4d9e18efc40a01d85123fe -re79eb4fbdacbc729b0f611f7d27b03ef004dc3da --- firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision d210786d6c7d75bb0b4d9e18efc40a01d85123fe) +++ firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision e79eb4fbdacbc729b0f611f7d27b03ef004dc3da) @@ -118,6 +118,9 @@ // manage rinse pump execRinsePumpController(); + // balancing chamber + execBalancingChamberControl(); + // Monitor RAM error status //execRAMMonitor();