Index: firmware/App/Drivers/BalancingChamber.c =================================================================== diff -u --- firmware/App/Drivers/BalancingChamber.c (revision 0) +++ firmware/App/Drivers/BalancingChamber.c (revision 653ca5c7429112b126ba587f65474396334df1e9) @@ -0,0 +1,790 @@ +/************************************************************************** +* +* Copyright (c) 2024-2024 Diality Inc. - All Rights Reserved. +* +* THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN +* WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. +* +* @file BalancingChamber.c +* +* @author (last) Vinayakam Mani +* @date (last) 24-Oct-2024 +* +* @author (original) Vinayakam Mani +* @date (original) 24-Oct-2024 +* +***************************************************************************/ + +#include "BalancingChamber.h" +#include "Conductivity.h" +#include "ConcentratePumps.h" +#include "FpgaDD.h" +#include "ModeStandby.h" +#include "Messaging.h" +#include "OperationModes.h" +#include "Pressure.h" +#include "TaskGeneral.h" +#include "TDInterface.h" +#include "Temperature.h" +#include "TestSupport.h" +#include "Valves.h" + +/** + * @addtogroup BalancingChamber + * @{ + */ + +// ********** private definitions ********** + +#define BAL_CHAMBER_FILL_VOLUME_ML 30.0F ///< Balancing chamber fill/drain volume per batch operation. +#define BAL_CHAMBER_DATA_PUBLISH_INTERVAL ( 250 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the balancing chamber data published. +#define TEST_ACID_VOLUME_ML 0.67F ///< Acid concentrate volume in ml. +#define TEST_BICARB_VOLUME_ML 1.15F ///< Bicarb concentrate volume in ml. + +/// Payload record structure for balancing chamber switch only request +typedef struct +{ + U32 startStop; ///< balancing chamber switching only start:1 and stop: 0 + F32 flowrate; ///< dialysate flowrate in ml/min +} BC_SWITCHING_ONLY_START_CMD_PAYLOAD_T; + +// ********** private data ********** + +static BAL_CHAMBER_EXEC_STATE_T balChamberExecState; ///< Current balancing chamber executive state. +static OVERRIDE_F32_T balChamberSwitchingFreq; ///< Balancing chamber switching rate ( switches per min) based on the dialysate flow rate ( overrideable) +static U32 balChamberSwitchingPeriod; ///< Periodic balancing chamber switching time in task interval count. +static U32 balChamberValveClosePeriod; ///< Close balancing chamber valves with the defined time prior switching state. +static U32 currentBalChamberSwitchingCounter; ///< Counter (in task interval) to monitor the timing spent during balancing chamber fill/drain operation. +static BOOL isBalChamberFillInProgress; ///< Flag indicating balancing chamber fill/drain is in progress. +static BOOL isPressureStalbilizedDuringFill; ///< Flag indicating that the pressure is stablized due to fill complete. +static BAL_CHAMBER_SW_STATE_T balChamberSWState; ///< Current balancing chamber switching state ( state 1 or state 2). +static U32 balChamberDataPublicationTimerCounter; ///< Used to schedule balancing chamber data publication to CAN bus. +static OVERRIDE_U32_T balChamberDataPublishInterval; ///< Balancing chamber data publish interval. +static BOOL balanceChamberSwitchingOnly; ///< Balancing chamber switching without any pressure check and dosing delivery. + +// ********** private function prototypes ********** + +static BAL_CHAMBER_EXEC_STATE_T handleBalChamberState1FillStart( void ); +static BAL_CHAMBER_EXEC_STATE_T handleBalChamberConcentrateControl(void); +static BAL_CHAMBER_EXEC_STATE_T handleBalChamberState1FillEnd(void); +static BAL_CHAMBER_EXEC_STATE_T handleBalChamberState2FillStart( void ); +static BAL_CHAMBER_EXEC_STATE_T handleBalChamberState2FillEnd(void); +static void publishBalChamberData( void ); +static U32 getBalChamberDataPublishInterval( void ); + +/*********************************************************************//** + * @brief + * The initBalanceChamber function initializes the balancing chamber unit. + * @details \b Inputs: none + * @details \b Outputs: unit variables initialized + * @return none + *************************************************************************/ +void initBalanceChamber( void ) +{ + balChamberExecState = BAL_CHAMBER_STATE_START; + balChamberSWState = BAL_CHAMBER_SW_STATE1; + balChamberSwitchingFreq.data = 0.0F; + balChamberSwitchingFreq.ovData = 0.0F; + balChamberSwitchingFreq.ovInitData = 0.0F; + balChamberSwitchingFreq.override = OVERRIDE_RESET; + balChamberDataPublishInterval.data = BAL_CHAMBER_DATA_PUBLISH_INTERVAL; + balChamberDataPublishInterval.ovData = BAL_CHAMBER_DATA_PUBLISH_INTERVAL; + balChamberDataPublishInterval.ovInitData = 0; + balChamberDataPublishInterval.override = OVERRIDE_RESET; + balanceChamberSwitchingOnly = FALSE; + balChamberSwitchingPeriod = 0; + balChamberValveClosePeriod = 0; + isBalChamberFillInProgress = FALSE; + currentBalChamberSwitchingCounter = 0; + isPressureStalbilizedDuringFill = FALSE; + balChamberDataPublicationTimerCounter = 0; +} + +/*********************************************************************//** + * @brief + * The transitionToBalChamberFill function prepares for transition to + * balancing chamber fill/switching operations. + * @details \b Inputs: none + * @details \b Outputs: balChamberSwitchingFreq ,balChamberSwitchingPeriod + * @return none + *************************************************************************/ +void transitionToBalChamberFill( void ) +{ + initBalanceChamber(); + updateBalChamberSwitchingPeriod(); +} + +/*********************************************************************//** + * @brief + * The updateBalChamberSwitchingPeriod function updates the periodic + * balancing chamber switching time based on the dialysis flow rate. + * @details \b Inputs: Dialysis flow rate. + * @details \b Outputs: balChamberSwitchingFreq,balChamberSwitchingPeriod + * @return none + *************************************************************************/ +void updateBalChamberSwitchingPeriod( void ) +{ + // update the balancing chamber switching frequency + balChamberSwitchingFreq.data = getTDDialysateFlowrate() / BAL_CHAMBER_FILL_VOLUME_ML; + + //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; + + //Testing + balChamberValveClosePeriod = balChamberSwitchingPeriod; + balChamberValveClosePeriod -= 1; // Close valves prior 50 msecond for testing +} + +/*********************************************************************//** + * @brief + * The execBalancingChamberControl function executes the balancing chamber state machine. + * @details \b Inputs: balChamberExecState + * @details \b Outputs: balChamberExecState + * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT when wrong balancing chamber state invoked. + * @return current state. + *************************************************************************/ +U32 execBalancingChamberControl( void ) +{ + // Increment counter indicating fill is in progress. + currentBalChamberSwitchingCounter += 1; + + // execute current balancing chamber exec state + switch ( balChamberExecState ) + { + case BAL_CHAMBER_STATE_START: + balChamberExecState = BAL_CHAMBER_STATE1_FILL_START; + break; + + case BAL_CHAMBER_STATE1_FILL_START: + balChamberExecState = handleBalChamberState1FillStart(); + break; + + case BAL_CHAMBER_STATE1_BICARB_ACID_DOSING_CNTRL: + balChamberExecState = handleBalChamberConcentrateControl(); + break; + + case BAL_CHAMBER_STATE1_FILL_END: + balChamberExecState = handleBalChamberState1FillEnd(); + break; + + case BAL_CHAMBER_STATE2_FILL_START: + balChamberExecState = handleBalChamberState2FillStart(); + break; + + case BAL_CHAMBER_STATE2_BICARB_ACID_DOSING_CNTRL: + balChamberExecState = handleBalChamberConcentrateControl(); + break; + + case BAL_CHAMBER_STATE2_FILL_END: + balChamberExecState = handleBalChamberState2FillEnd(); + 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; + break; + } + + //Publish balancing chamber data + publishBalChamberData(); + + return balChamberExecState; +} + +/*********************************************************************//** + * @brief + * The valveControlForBCState1FillStart function actuates the valve combination + * for state 1 fill/drain process. + * @details \b Inputs: none + * @details \b Outputs: valve states + * @return none. + *************************************************************************/ +static void valveControlForBCState1FillStart( void ) +{ + // Close balancing chamber valve combinations D23,D20 and D21,D26 + setValveState( D23_VALV, VALVE_STATE_CLOSED ); + setValveState( D20_VALV, VALVE_STATE_CLOSED ); + setValveState( D21_VALV, VALVE_STATE_CLOSED ); + setValveState( D26_VALV, VALVE_STATE_CLOSED ); + + //Open balancing chamber valve combinations D19,D24 and D25,D22 + setValveState( D19_VALV, VALVE_STATE_OPEN ); + setValveState( D24_VALV, VALVE_STATE_OPEN ); + setValveState( D25_VALV, VALVE_STATE_OPEN ); + setValveState( D22_VALV, VALVE_STATE_OPEN ); +} + +/*********************************************************************//** + * @brief + * The valveControlForBCState1FillEnd function closes the valve opened + * for state 1 fill/drain process. + * @details \b Inputs: none + * @details \b Outputs: valve states + * @return none. + *************************************************************************/ +static void valveControlForBCState1FillEnd( void ) +{ + //Close balancing chamber valve combinations D19,D24 and D25,D22 + setValveState( D19_VALV, VALVE_STATE_CLOSED ); + setValveState( D24_VALV, VALVE_STATE_CLOSED ); + setValveState( D25_VALV, VALVE_STATE_CLOSED ); + setValveState( D22_VALV, VALVE_STATE_CLOSED ); +} + +/*********************************************************************//** + * @brief + * The valveControlForBCState2FillStart function actuates the valve combination + * for state 2 fill/drain process. + * @details \b Inputs: none + * @details \b Outputs: valve states + * @return none. + *************************************************************************/ +static void valveControlForBCState2FillStart( void ) +{ + //Close balancing chamber valve combinations D19,D24 and D25,D22 + setValveState( D19_VALV, VALVE_STATE_CLOSED ); + setValveState( D24_VALV, VALVE_STATE_CLOSED ); + setValveState( D25_VALV, VALVE_STATE_CLOSED ); + setValveState( D22_VALV, VALVE_STATE_CLOSED ); + + // Open balancing chamber valve combinations D23,D20 and D21,D26 + setValveState( D23_VALV, VALVE_STATE_OPEN ); + setValveState( D20_VALV, VALVE_STATE_OPEN ); + setValveState( D21_VALV, VALVE_STATE_OPEN ); + setValveState( D26_VALV, VALVE_STATE_OPEN ); +} + +/*********************************************************************//** + * @brief + * The valveControlForBCState2FillEnd function closes the valve opened + * for state 2 fill/drain process. + * @details \b Inputs: none + * @details \b Outputs: valve states + * @return none. + *************************************************************************/ +static void valveControlForBCState2FillEnd( void ) +{ + // Close balancing chamber valve combinations D23,D20 and D21,D26 + setValveState( D23_VALV, VALVE_STATE_CLOSED ); + setValveState( D20_VALV, VALVE_STATE_CLOSED ); + setValveState( D21_VALV, VALVE_STATE_CLOSED ); + setValveState( D26_VALV, VALVE_STATE_CLOSED ); +} + +/*********************************************************************//** + * @brief + * The valveControlForBCClosedState function closes the all balancing + * chamber valves. + * @details \b Inputs: none + * @details \b Outputs: valve states + * @return none. + *************************************************************************/ +void valveControlForBCClosedState( void ) +{ + // Close balancing chamber valve combinations D23,D20 and D21,D26 + setValveState( D23_VALV, VALVE_STATE_CLOSED ); + setValveState( D20_VALV, VALVE_STATE_CLOSED ); + setValveState( D21_VALV, VALVE_STATE_CLOSED ); + setValveState( D26_VALV, VALVE_STATE_CLOSED ); + + //Close balancing chamber valve combinations D19,D24 and D25,D22 + setValveState( D19_VALV, VALVE_STATE_CLOSED ); + setValveState( D24_VALV, VALVE_STATE_CLOSED ); + setValveState( D25_VALV, VALVE_STATE_CLOSED ); + setValveState( D22_VALV, VALVE_STATE_CLOSED ); +} + +/*********************************************************************//** + * @brief + * The valveControlForBCOpenState function open the all balancing + * chamber valves. + * @details \b Inputs: none + * @details \b Outputs: valve states + * @return none. + *************************************************************************/ +void valveControlForBCOpenState( void ) +{ + // Open balancing chamber valve combinations D23,D20 and D21,D26 + setValveState( D23_VALV, VALVE_STATE_OPEN ); + setValveState( D20_VALV, VALVE_STATE_OPEN ); + setValveState( D21_VALV, VALVE_STATE_OPEN ); + setValveState( D26_VALV, VALVE_STATE_OPEN ); + + //Open balancing chamber valve combinations D19,D24 and D25,D22 + setValveState( D19_VALV, VALVE_STATE_OPEN ); + setValveState( D24_VALV, VALVE_STATE_OPEN ); + setValveState( D25_VALV, VALVE_STATE_OPEN ); + setValveState( D22_VALV, VALVE_STATE_OPEN ); +} + +/*********************************************************************//** + * @brief + * The handleBalChamberState1FillStart function handles the balancing chamber + * state 1 fill and time to fill chamber counter being updated. + * @details \b Inputs: Pressure + * @details \b Outputs: valve states + * @return next balancing chamber state. + *************************************************************************/ +static BAL_CHAMBER_EXEC_STATE_T handleBalChamberState1FillStart( void ) +{ + BAL_CHAMBER_EXEC_STATE_T state = BAL_CHAMBER_STATE1_FILL_START; + currentBalChamberSwitchingCounter = 0; + isBalChamberFillInProgress = FALSE; + isPressureStalbilizedDuringFill = FALSE; + balChamberSWState = BAL_CHAMBER_SW_STATE1; + + F32 freshDialPressure = getFilteredPressure( D18_PRES ); + F32 spentDialPressure = getFilteredPressure( D51_PRES ); + + // Check fresh and spent dialysate pressure in range or BC switch only flag set + //TODO : comment the pressure check + if ( 1 ) + //if ( ( ( freshDialPressure >= FRESH_DIAL_PRESSURE_MIN_PSIG ) && ( freshDialPressure <= FRESH_DIAL_PRESSURE_MAX_PSIG ) ) && + // ( ( spentDialPressure >= SPENT_DIAL_PRESSURE_MIN_PSIG ) && ( spentDialPressure <= SPENT_DIAL_PRESSURE_MAX_PSIG ) ) || + // ( TRUE == getBalChamberSwitchingOnlyStatus() ) ) + { + //Valve control for state 1 fill + valveControlForBCState1FillStart(); + + // Update fill status flag to true + isBalChamberFillInProgress = TRUE; + + // Deliver dosing during generate dialysate mode + if ( FALSE == getBalChamberSwitchingOnlyStatus() ) + { + // start acid and bicarb pump with the expected quantity + setConcentratePumpTargetSpeed( D11_PUMP, CONCENTRATE_PUMP_MAX_SPEED, TEST_ACID_VOLUME_ML ); + setConcentratePumpTargetSpeed( D10_PUMP, CONCENTRATE_PUMP_MAX_SPEED, TEST_BICARB_VOLUME_ML ); + requestConcentratePumpOn( D11_PUMP ); + requestConcentratePumpOn( D10_PUMP ); + } + + state = BAL_CHAMBER_STATE1_BICARB_ACID_DOSING_CNTRL; + } + else + { + //Alarm when pressure is not in range + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DD_BC_STATE1_FILL_START_PRESSURE_OUT_OF_RANGE, freshDialPressure, spentDialPressure ); + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleBalChamberConcentrateControl function handles the Acid and Bicarb + * concentrate doisng and checks the conductivity of the dialysate for the treatment. + * @details \b Inputs: balChamberSWState , Concentrate volume + * @details \b Outputs: state + * @return next balancing chamber state. + *************************************************************************/ +static BAL_CHAMBER_EXEC_STATE_T handleBalChamberConcentrateControl( void ) +{ + BAL_CHAMBER_EXEC_STATE_T state; + + // On dosing completion, transition to next state based on the current switching state + if ( TRUE == IsConcentratePumpDosingCompleted() ) + { + if ( BAL_CHAMBER_SW_STATE1 == balChamberSWState ) + { + state = BAL_CHAMBER_STATE1_FILL_END; + } + else + { + state = BAL_CHAMBER_STATE2_FILL_END; + } + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleBalChamberState1FillEnd function check for the balancing chamber + * fill complete and close the currently opened valves. + * @details \b Inputs: balChamberSWState, spent and fresh dialysate pressure + * @details \b Outputs: isPressureStalbilizedDuringFill,isBalChamberFillInProgress + * @return next balancing chamber state. + *************************************************************************/ +static BAL_CHAMBER_EXEC_STATE_T handleBalChamberState1FillEnd( void ) +{ + BAL_CHAMBER_EXEC_STATE_T state = BAL_CHAMBER_STATE1_FILL_END; + + F32 freshDialPressure = getFilteredPressure( D18_PRES ); + F32 spentDialPressure = getFilteredPressure( D51_PRES ); + + // Check fresh and spent dialysate pressure back in range to indicate fill complete. + //TODO : comment the pressure check + //if ( 1 ) + if ( currentBalChamberSwitchingCounter >= balChamberValveClosePeriod ) + //if ( ( ( freshDialPressure >= FRESH_DIAL_PRESSURE_MIN_PSIG ) && ( freshDialPressure <= FRESH_DIAL_PRESSURE_MAX_PSIG ) ) && + // ( ( spentDialPressure >= SPENT_DIAL_PRESSURE_MIN_PSIG ) && ( spentDialPressure <= SPENT_DIAL_PRESSURE_MAX_PSIG ) ) ) + { + // stabilized pressure indicating fill is complete + isPressureStalbilizedDuringFill = TRUE; + // isPressureStalbilizedDuringFill = FALSE; + } + + // Switching time met or pressure in range, close valves + if ( ( currentBalChamberSwitchingCounter >= balChamberSwitchingPeriod ) || + ( TRUE == isPressureStalbilizedDuringFill ) ) + { + // close the state 1 opened valves + valveControlForBCState1FillEnd(); + } + + // On completion of cycle time, transition to next state + if ( currentBalChamberSwitchingCounter >= balChamberSwitchingPeriod ) + { + if ( ( TRUE != isPressureStalbilizedDuringFill ) && + ( FALSE == getBalChamberSwitchingOnlyStatus() ) ) + { + // Alarm when switching time expired, but still pressure not in range, + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DD_BC_STATE1_FILL_END_PRESSURE_OUT_OF_RANGE, freshDialPressure, spentDialPressure ); + + //TODO : Temporarily allow to proceed next state even though pressure is not stabilized. + isBalChamberFillInProgress = FALSE; + state = BAL_CHAMBER_STATE2_FILL_START; + } + else + { + isBalChamberFillInProgress = FALSE; + state = BAL_CHAMBER_STATE2_FILL_START; + } + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleBalChamberState2FillStart function handles the balancing chamber + * state 2 fill and time to fill chamber counter being updated. + * @details \b Inputs: fresh and spent dialysate pressure + * @details \b Outputs: valve states + * @return next balancing chamber state. + *************************************************************************/ +static BAL_CHAMBER_EXEC_STATE_T handleBalChamberState2FillStart( void ) +{ + BAL_CHAMBER_EXEC_STATE_T state = BAL_CHAMBER_STATE2_FILL_START; + currentBalChamberSwitchingCounter = 0; + isBalChamberFillInProgress = FALSE; + isPressureStalbilizedDuringFill = FALSE; + balChamberSWState = BAL_CHAMBER_SW_STATE2; + + F32 freshDialPressure = getFilteredPressure( D18_PRES ); + F32 spentDialPressure = getFilteredPressure( D51_PRES ); + + // Check fresh and spent dialysate pressure in range + //TODO : comment the pressure check + if ( 1 ) + //if ( ( ( freshDialPressure >= FRESH_DIAL_PRESSURE_MIN_PSIG ) && ( freshDialPressure <= FRESH_DIAL_PRESSURE_MAX_PSIG ) ) && + // ( ( spentDialPressure >= SPENT_DIAL_PRESSURE_MIN_PSIG ) && ( spentDialPressure <= SPENT_DIAL_PRESSURE_MAX_PSIG ) ) || + // ( TRUE == getBalChamberSwitchingOnlyStatus() ) ) + { + // Valve control for state 2 fill + valveControlForBCState2FillStart(); + + // Update fill status flag to true + isBalChamberFillInProgress = TRUE; + + // Deliver dosing during generate dialysate mode + if ( FALSE == getBalChamberSwitchingOnlyStatus() ) + { + // start acid and bicarb pump with the expected quantity + setConcentratePumpTargetSpeed( D11_PUMP, CONCENTRATE_PUMP_MAX_SPEED, TEST_ACID_VOLUME_ML ); + setConcentratePumpTargetSpeed( D10_PUMP, CONCENTRATE_PUMP_MAX_SPEED, TEST_BICARB_VOLUME_ML ); + requestConcentratePumpOn( D11_PUMP ); + requestConcentratePumpOn( D10_PUMP ); + } + + state = BAL_CHAMBER_STATE2_BICARB_ACID_DOSING_CNTRL; + } + else + { + //Alarm when pressure is not in range + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DD_BC_STATE2_FILL_START_PRESSURE_OUT_OF_RANGE, freshDialPressure, spentDialPressure ); + } + return state; +} + +/*********************************************************************//** + * @brief + * The handleBalChamberState2FillEnd function check for the balancing chamber + * fill complete and close the currently opened valves. + * @details \b Inputs: balChamberSWState, spent and fresh dialysate pressure + * @details \b Outputs: isPressureStalbilizedDuringFill,isBalChamberFillInProgress + * @return next balancing chamber state. + *************************************************************************/ +static BAL_CHAMBER_EXEC_STATE_T handleBalChamberState2FillEnd( void ) +{ + BAL_CHAMBER_EXEC_STATE_T state = BAL_CHAMBER_STATE2_FILL_END; + + F32 freshDialPressure = getFilteredPressure( D18_PRES ); + F32 spentDialPressure = getFilteredPressure( D51_PRES ); + + // Check fresh and spent dialysate pressure back in range to indicate fill complete. + //TODO : comment the pressure check + //if ( 1 ) + if ( currentBalChamberSwitchingCounter >= balChamberValveClosePeriod ) + //if ( ( ( freshDialPressure >= FRESH_DIAL_PRESSURE_MIN_PSIG ) && ( freshDialPressure <= FRESH_DIAL_PRESSURE_MAX_PSIG ) ) && + // ( ( spentDialPressure >= SPENT_DIAL_PRESSURE_MIN_PSIG ) && ( spentDialPressure <= SPENT_DIAL_PRESSURE_MAX_PSIG ) ) ) + { + // stabilized pressure indicating fill is complete + isPressureStalbilizedDuringFill = TRUE; + //isPressureStalbilizedDuringFill = FALSE; + } + + // Check switching cycle time or pressure check for valve closure + if ( ( currentBalChamberSwitchingCounter >= balChamberSwitchingPeriod ) || + ( TRUE == isPressureStalbilizedDuringFill ) ) + { + // close the valves + valveControlForBCState2FillEnd(); + } + + // On completion of cycle time, transition to next state + if ( currentBalChamberSwitchingCounter >= balChamberSwitchingPeriod ) + { + if ( ( TRUE != isPressureStalbilizedDuringFill ) && + ( FALSE == getBalChamberSwitchingOnlyStatus() ) ) + { + // Alarm when switching time expired, but still pressure not in range, + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DD_BC_STATE2_FILL_END_PRESSURE_OUT_OF_RANGE, freshDialPressure, spentDialPressure ); + + //TODO : Temporarily allow to proceed next state even though pressure is not stabilized. + isBalChamberFillInProgress = FALSE; + state = BAL_CHAMBER_STATE1_FILL_START; + } + else + { + isBalChamberFillInProgress = FALSE; + state = BAL_CHAMBER_STATE1_FILL_START; + } + } + + return state; +} + +/*********************************************************************//** + * @brief + * The getCurrentBalancingChamberExecState function returns the current state + * of the balancing chamber. + * @details \b Inputs: balChamberExecState + * @details \b Outputs: none + * @return the current state of balancing chamber states. + *************************************************************************/ +BAL_CHAMBER_EXEC_STATE_T getCurrentBalancingChamberExecState( void ) +{ + return balChamberExecState; +} + +/*********************************************************************//** + * @brief + * The getBalancingChamberFillinProgressStatus function returns the current + * balancing chamber fill in progress status. + * @details \b Inputs: isBalChamberFillInProgress + * @details \b Outputs: none + * @return the current balancing chamber fill in progress. + *************************************************************************/ +BOOL getBalancingChamberFillinProgressStatus( void ) +{ + return isBalChamberFillInProgress; +} + +/*********************************************************************//** + * @brief + * The getBalChamberSwitchingFreq function gets the balancing chamber switching + * frequency value. + * @details \b Inputs: balChamberSwitchingFreq + * @details \b Outputs: none + * @return balancing chamber switching frequency + *************************************************************************/ +F32 getBalChamberSwitchingFreq( void ) +{ + F32 result = balChamberSwitchingFreq.data; + + if ( OVERRIDE_KEY == balChamberSwitchingFreq.override ) + { + result = balChamberSwitchingFreq.ovData; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The setBalChamberSwitchingOnlyStatus function sets the balancing chamber + * switching only On/Off status. + * @details \b Inputs: balanceChamberSwitchingOnly + * @details \b Outputs: none + * @return none + *************************************************************************/ +void setBalChamberSwitchingOnlyStatus( BOOL OnOff ) +{ + balanceChamberSwitchingOnly = OnOff; +} + +/*********************************************************************//** + * @brief + * The getBalChamberSwitchingOnlyStatus function gets the balancing chamber + * switching only status. + * @details \b Inputs: balanceChamberSwitchingOnly + * @details \b Outputs: none + * @return balancing chamber switching only without any pressure validation + * and dosing delivery + *************************************************************************/ +BOOL getBalChamberSwitchingOnlyStatus( void ) +{ + return balanceChamberSwitchingOnly; +} + +/*********************************************************************//** + * @brief + * The getBalChamberDataPublishInterval function gets the balancing chamber + * data publish interval. + * @details \b Inputs: balChamberDataPublishInterval + * @details \b Outputs: none + * @return the interval at balancing chamber data being published. + *************************************************************************/ +static U32 getBalChamberDataPublishInterval( void ) +{ + U32 result = balChamberDataPublishInterval.data; + + if ( OVERRIDE_KEY == balChamberDataPublishInterval.override ) + { + result = balChamberDataPublishInterval.ovData; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The publishBalChamberData function broadcasts the balancing chamber + * execution data at defined interval. + * @details \b Inputs: balChamberDataPublicationTimerCounter + * @details \b Outputs: DD balancing chamber data broadcast message sent + * @details \b Message \Sent: MSG_ID_DD_BAL_CHAMBER_DATA to publish the balancing + * chamber data. + * @return none + *************************************************************************/ +static void publishBalChamberData( void ) +{ + if ( ++balChamberDataPublicationTimerCounter >= getBalChamberDataPublishInterval() ) + { + BAL_CHAMBER_DATA_T data; + + data.balChamberExecState = (U32)balChamberExecState; + data.balChamberSWState = (U32)balChamberSWState; + data.balChamberSWFreq = getBalChamberSwitchingFreq(); + data.balChamberSwPeriod = balChamberSwitchingPeriod; + data.isBalChamberFillInProgress = isBalChamberFillInProgress; + data.currentBalChamberSwitchingCounter = currentBalChamberSwitchingCounter; + data.isPressureStalbilizedDuringFill = isPressureStalbilizedDuringFill; + data.balChamberSWOnlyState = balanceChamberSwitchingOnly; + + broadcastData( MSG_ID_DD_BAL_CHAMBER_DATA, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&data, sizeof( BAL_CHAMBER_DATA_T ) ); + + balChamberDataPublicationTimerCounter = 0; + } +} + + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + +/*********************************************************************//** + * @brief + * The testDDBalChamberDataPublishIntervalOverride function overrides the + * DD balancing chamber data publish interval. + * @details \b Inputs: balChamberDataPublishInterval + * @details \b Outputs: balChamberDataPublishInterval + * @param Override message from Dialin which includes the interval + * (in ms) to override the DD balancing chamber data publish interval to. + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testDDBalChamberDataPublishIntervalOverride( MESSAGE_T *message ) +{ + BOOL result = u32BroadcastIntervalOverride( message, &balChamberDataPublishInterval, TASK_GENERAL_INTERVAL ); + + return result; +} + +/*********************************************************************//** + * @brief + * The testBalChamberSwFreqOverride function sets the override value + * of the balancing chamber switching frequency. + * @details Inputs: balChamberSwitchingFreq + * @details Outputs: balChamberSwitchingFreq + * @param message Override message from Dialin which includes the override + * value to override the balancing chamber switching frequency. + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testBalChamberSwFreqOverride( MESSAGE_T *message ) +{ + BOOL result = f32Override( message, &balChamberSwitchingFreq ); + + return result; +} + +/*********************************************************************//** + * @brief + * The testBCSwitchOnlyStartStopOverride function starts/stops balancing + * chamber switching only without dosing delivery and pressure check condition. + * @details \b Inputs: tester logged in + * @details \b Outputs: tdDialysateFlowrate,balanceChamberSwitchingOnly + * pendingBalanceChamberSwOnlyRequest + * @param message set message from Dialin which includes the balancing chamber + * to start/stop switching and update switching rate based on the flow rate. + * @return TRUE if set request is successful, FALSE if not + *************************************************************************/ +BOOL testBCSwitchOnlyStartStopOverride( MESSAGE_T *message ) +{ + BOOL result = FALSE; + + // Verify tester has logged in with TD + if ( TRUE == isTestingActivated() ) + { + // Verify payload length is valid + if ( sizeof( BC_SWITCHING_ONLY_START_CMD_PAYLOAD_T ) == message->hdr.payloadLen ) + { + BC_SWITCHING_ONLY_START_CMD_PAYLOAD_T payload; + + memcpy( &payload, message->payload, sizeof(BC_SWITCHING_ONLY_START_CMD_PAYLOAD_T) ); + + // Handle start command + if ( ( TRUE == payload.startStop ) && + ( ( payload.flowrate >= MIN_DIALYSIS_FLOW_RATE ) && ( payload.flowrate <= MAX_DIALYSIS_FLOW_RATE ) ) ) + { + // First set BC switching frequency based on the dialysate flow rate + setTDDialysateFlowrate( payload.flowrate ); + // update switching rate + transitionToBalChamberFill(); + // then set BC switching only flag to ignore pressure check and dosing. + setBalChamberSwitchingOnlyStatus( TRUE ); + // Now, if the current operating mode is standby mode idle state, execute the balancing chamber switching only control + result = requestBCSwitchingOnlyStart(); + } + + //Handle stop command + if ( FALSE == payload.startStop ) + { + //Reset the flag + setBalChamberSwitchingOnlyStatus( FALSE ); + //Stop the BC switching execution only control + requestBCSwitchingOnlyStop(); + result = TRUE; + } + } + } + + return result; +} + +/**@}*/ Index: firmware/App/Drivers/BalancingChamber.h =================================================================== diff -u --- firmware/App/Drivers/BalancingChamber.h (revision 0) +++ firmware/App/Drivers/BalancingChamber.h (revision 653ca5c7429112b126ba587f65474396334df1e9) @@ -0,0 +1,74 @@ +/************************************************************************** +* +* Copyright (c) 2024-2024 Diality Inc. - All Rights Reserved. +* +* THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN +* WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. +* +* @file BalancingChamber.h +* +* @author (last) Vinayakam Mani +* @date (last) 06-Aug-2024 +* +* @author (original) Vinayakam Mani +* @date (original) 06-Aug-2024 +* +***************************************************************************/ + +#ifndef __BAL_CHAMBER_H__ +#define __BAL_CHAMBER_H__ + +#include "DDCommon.h" +#include "DDDefs.h" + +/** + * @defgroup BalancingChamber BalancingChamber + * @brief Balancing Chamber unit. Performs balancing chamber functions via a state machine. + * + * @addtogroup BalancingChamber + * @{ + */ + +// ********** public definitions ********** + +#define FRESH_DIAL_PRESSURE_MIN_PSIG 21.0F ///< Minimum fresh dialysate pressure (PDf) limit for balancing chamber fill operations. +#define FRESH_DIAL_PRESSURE_MAX_PSIG 27.0F ///< Maximum fresh dialysate pressure (PDf) limit for balancing chamber fill operations. +#define SPENT_DIAL_PRESSURE_MIN_PSIG 27.0F ///< Minimum spent dialysate pressure (PDs) limit for balancing chamber fill operations. +#define SPENT_DIAL_PRESSURE_MAX_PSIG 31.0F ///< Maximum spent dialysate pressure (PDs) limit for balancing chamber fill operations. + +/// 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 + U32 balChamberSwPeriod; ///< Balancing chamber switching period + BOOL isBalChamberFillInProgress; ///< Whether balancing chamber fill in progress or not + U32 currentBalChamberSwitchingCounter; ///< Current balancing chamber switching counter + BOOL isPressureStalbilizedDuringFill; ///< Whether pressure stabilized during fill or not + BOOL balChamberSWOnlyState; ///< Balancing chamber switching only status ( On/Off) +} BAL_CHAMBER_DATA_T; + +// ********** public function prototypes ********** + +void initBalanceChamber( void ); // Initialize balancing chamber unit +void transitionToBalChamberFill( void ); // Prepares for transition to balancing chamber execution +U32 execBalancingChamberControl( void ); // Execute the balancing chamber state machine + +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 +U32 getDialDeliveryProgressStatus( void ); // Get the dialysate delivery in progress status +BOOL getBalancingChamberFillinProgressStatus( void ); // Get the balancing chamber fill in progress status +void valveControlForBCClosedState( void ); // Closes all balancing chamber valves +void valveControlForBCOpenState( void ); // Open all balancing chamber valves +BOOL getBalChamberSwitchingOnlyStatus( void ); // Get balancing chamber switching only status +void setBalChamberSwitchingOnlyStatus( BOOL OnOff ); // Set balancing chamber switching only 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 +BOOL testBCSwitchOnlyStartStopOverride( MESSAGE_T *message ); // To override the balancning chamber switching only start/stop control + +/**@}*/ + +#endif Fisheye: Tag 653ca5c7429112b126ba587f65474396334df1e9 refers to a dead (removed) revision in file `firmware/App/Modes/BalancingChamber.c'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 653ca5c7429112b126ba587f65474396334df1e9 refers to a dead (removed) revision in file `firmware/App/Modes/BalancingChamber.h'. Fisheye: No comparison available. Pass `N' to diff?