Index: firmware/App/Controllers/Valves.c =================================================================== diff -u -r24bf8d1d7a248f907a5c60496a764ae1ef9876f6 -ra570e1827563618b8d26082eb63994f9f65adc17 --- firmware/App/Controllers/Valves.c (.../Valves.c) (revision 24bf8d1d7a248f907a5c60496a764ae1ef9876f6) +++ firmware/App/Controllers/Valves.c (.../Valves.c) (revision a570e1827563618b8d26082eb63994f9f65adc17) @@ -14,13 +14,15 @@ * @date (original) 14-Aug-2024 * ***************************************************************************/ -#include + #include // For memcpy -#include + +#include "FpgaDD.h" #include "MessageSupport.h" #include "Messaging.h" #include "TaskPriority.h" #include "Timers.h" +#include "Valves.h" /** * @addtogroup Valves @@ -41,9 +43,9 @@ // ********** private data ********** static U32 valvesStatesPublicationTimerCounter; ///< Timer counter used to schedule valve state publication to CAN bus. -static U16 commandedValvesStates = ALL_VALVES_DEENERGIZED; ///< Initialize commanded valves states bit field. -static U08 commandedBCValveStates = ALL_VALVES_DEENERGIZED; ///< Initialize balancing chamber commanded valves states bit field. -static U08 commandedUFValveStates = ALL_VALVES_DEENERGIZED; ///< Initialize ultra filtration commanded valves states bit field. +static U16 commandedValvesStates; ///< Initialize commanded valves states bit field. +static U08 commandedBCValveStates; ///< Initialize balancing chamber commanded valves states bit field. +static U08 commandedUFValveStates; ///< Initialize ultra filtration commanded valves states bit field. static U32 valveStateMismatchTimerCounter; ///< Initialize valve state mismatch timer. static U32 pendingValveStateChanges[ NUM_OF_VALVES ]; ///< Delayed (pending) valve state changes. static U32 pendingValveStateChangeCountDowns[ NUM_OF_VALVES ]; ///< Delayed (pending) valve state change count down timers (in task intervals). @@ -55,7 +57,7 @@ // ********** private function prototypes ********** static void publishValvesStates( void ); -static void convertU32ArrayToBytes( void ); +static void readCommandedValveStates( void ); static BOOL checkValveStateName( VALVES_T valveID, VALVE_STATE_NAMES_T valveStateName ); static U32 convertValveStateNameToValveState( VALVE_STATE_NAMES_T valveStateName ); static U32 getValveState( U32 valveID ); @@ -88,11 +90,14 @@ valveSensedStates[ i ].override = OVERRIDE_RESET; } - // initialize specific to DD module - valveStateMismatchTimerCounter = 0; - valvesStatesPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; // reset valves states publication timer + //Initialize the commanded valve states + commandedValvesStates = ALL_VALVES_DEENERGIZED; + commandedBCValveStates = ALL_VALVES_DEENERGIZED; + commandedUFValveStates = ALL_VALVES_DEENERGIZED; + valveStateMismatchTimerCounter = 0; + valvesStatesPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; // reset valves states publication timer - convertU32ArrayToBytes(); + readCommandedValveStates(); // initially set all valves to de-energized state via FPGA setFPGAValveStates( commandedValvesStates ); setFPGABCValveStates( commandedBCValveStates ); @@ -150,7 +155,7 @@ } // Set valves states (via FPGA) to currently commanded states - convertU32ArrayToBytes(); + readCommandedValveStates(); setFPGAValveStates( commandedValvesStates ); setFPGABCValveStates( commandedBCValveStates ); setFPGAUFValveStates( commandedUFValveStates ); @@ -161,36 +166,38 @@ /*********************************************************************//** * @brief - * The convertU32ArrayToBytes function converts an array of U32 valve states - * to U16 and U08 valvesStates that can be passed to FPGA for setting valves. + * The readCommandedValveStates function gets the hydraulics, Balancing chamber + * and Ultrafiltration valvesStates that can be passed to FPGA for setting valves. * @details \b Inputs: valveStates[] - * @details \b Outputs: none + * @details \b Outputs: commandedValvesStates,commandedBCValveStates, + * commandedUFValveStates * @return converted U16 and U08 bit field for currently commanded valve states *************************************************************************/ -static void convertU32ArrayToBytes( void ) +static void readCommandedValveStates( void ) { U32 i; + // Initiliaze before updating commanded states commandedValvesStates = ALL_VALVES_DEENERGIZED; commandedBCValveStates = ALL_VALVES_DEENERGIZED; commandedUFValveStates = ALL_VALVES_DEENERGIZED; - // flag valves that are currently commanded to be energized - for ( i = 0; i < RSRVD_SPACE1; i++ ) + // flag hydraulics valves that are currently commanded to be energized + for ( i = FIRST_HYD_VALVE; i <= LAST_HYD_VALVE; i++ ) { commandedValvesStates |= ( getValveState( i ) == ENERGIZED ? 0x0001 << i : 0 ); } // flag Balancing chamber valves that are currently commanded to be energized - for ( i = BCV1; i <= BCV8; i++ ) + for ( i = FIRST_BC_VALVE; i <= LAST_BC_VALVE; i++ ) { - commandedBCValveStates |= ( getValveState( i ) == ENERGIZED ? 0x01 << ( i - BCV1 ) : 0 ); + commandedBCValveStates |= ( getValveState( i ) == ENERGIZED ? 0x01 << ( i - FIRST_BC_VALVE ) : 0 ); } // flag Ultrafiltration valves that are currently commanded to be energized - for ( i = UFI1; i < NUM_OF_VALVES; i++ ) + for ( i = FIRST_UF_VALVE; i <= LAST_UF_VALVE; i++ ) { - commandedUFValveStates |= ( getValveState( i ) == ENERGIZED ? 0x01 << ( i - UFI1 ) : 0 ); + commandedUFValveStates |= ( getValveState( i ) == ENERGIZED ? 0x01 << ( i - FIRST_UF_VALVE ) : 0 ); } } @@ -359,7 +366,6 @@ } name = ( DEENERGIZED == valveState ? VALVE_STATE_CLOSED : VALVE_STATE_OPEN ); - } else { @@ -424,157 +430,133 @@ valvesStatesPublicationTimerCounter = 0; } } + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ + /*********************************************************************//** * @brief - * The testSetValvesStatesPublishIntervalOverride function overrides the + * The testValvesStatesPublishIntervalOverride function overrides the * valves states publish interval. * @details \b Inputs: none * @details \b Outputs: valvesStatesPublishInterval - * @param value override valves states publish interval with (in ms) + * @param message Override message from Dialin which includes the value + * that override valves states publish interval with (in ms) * @return TRUE if override successful, FALSE if not *************************************************************************/ -BOOL testSetValvesStatesPublishIntervalOverride( U32 value ) +BOOL testValvesStatesPublishIntervalOverride( MESSAGE_T *message ) { - BOOL result = FALSE; + BOOL result = FALSE; + TEST_OVERRIDE_PAYLOAD_T override; + OVERRIDE_TYPE_T ovType = getOverridePayloadFromMessage( message, &override ); - if ( TRUE == isTestingActivated() ) - { - U32 intvl = value / TASK_PRIORITY_INTERVAL; - - result = TRUE; - valvesStatesPublishInterval.ovData = intvl; - valvesStatesPublishInterval.override = OVERRIDE_KEY; - } - - return result; -} - -/*********************************************************************//** - * @brief - * The testResetValvesStatesPublishIntervalOverride function resets the override - * of the valves states publish interval. - * @details \b Inputs: none - * @details \b Outputs: valvesStatesPublishInterval - * @return TRUE if override reset successful, FALSE if not - *************************************************************************/ -BOOL testResetValvesStatesPublishIntervalOverride( void ) -{ - BOOL result = FALSE; - - if ( TRUE == isTestingActivated() ) - { - result = TRUE; - valvesStatesPublishInterval.override = OVERRIDE_RESET; - valvesStatesPublishInterval.ovData = valvesStatesPublishInterval.ovInitData; - } - - return result; -} - -/*********************************************************************//** - * @brief - * The testSetValveStateOverride function overrides the value of the - * specified valve with a given value. - * @details \b Inputs: none - * @details \b Outputs: valves[] - * @param valveID ID of valve to override for - * @param value override value for the given valve ID - * @return TRUE if override successful, FALSE if not - *************************************************************************/ -BOOL testSetValveStateOverride( U32 valveID, U32 value ) -{ - BOOL result = FALSE; - - if ( valveID < NUM_OF_VALVES ) + // Verify tester has logged in with TD and override type is valid + if ( ( TRUE == isTestingActivated() ) && ( ovType != OVERRIDE_INVALID ) && ( ovType < NUM_OF_OVERRIDE_TYPES ) ) { - if ( TRUE == isTestingActivated() ) + if ( OVERRIDE_OVERRIDE == ovType ) { - valveStates[ valveID ].ovData = value; - valveStates[ valveID ].override = OVERRIDE_KEY; - result = TRUE; - } - } + U32 intvl = override.state.u32 / TASK_PRIORITY_INTERVAL; - return result; -} - -/*********************************************************************//** - * @brief - * The testResetValveStateOverride function resets the override of the specified valve. - * @details \b Inputs: none - * @details \b Outputs: valves[] - * @param valveID ID of valve to reset override state for - * @return TRUE if override successful, FALSE if not - *************************************************************************/ -BOOL testResetValveStateOverride( U32 valveID ) -{ - BOOL result = FALSE; - - if ( valveID < NUM_OF_VALVES ) - { - if ( TRUE == isTestingActivated() ) + result = TRUE; + valvesStatesPublishInterval.ovData = intvl; + valvesStatesPublishInterval.override = OVERRIDE_KEY; + } + else { result = TRUE; - valveStates[ valveID ].override = OVERRIDE_RESET; - valveStates[ valveID ].ovData = valveStates[ valveID ].ovInitData; + valvesStatesPublishInterval.override = OVERRIDE_RESET; + valvesStatesPublishInterval.ovData = valvesStatesPublishInterval.ovInitData; } - } - - return result; + } + + return result; } /*********************************************************************//** * @brief - * The testSetValveSensedStateOverride function overrides the value of the - * specified sensed state with a given value. + * The testValveStateOverride function overrides the value of the + * specified valve with a given value. * @details \b Inputs: none - * @details \b Outputs: valveSensedStates - * @param valve ID of valve to override for - * @param value override value for the given valve ID + * @details \b Outputs: valveStates[] + * @param message Override message from Dialin which includes an ID of + * the valve to override and the state to override the valve to. * @return TRUE if override successful, FALSE if not *************************************************************************/ -BOOL testSetValveSensedStateOverride( U32 valve, U32 status ) +BOOL testValveStateOverride( MESSAGE_T *message ) { - BOOL result = FALSE; + BOOL result = FALSE; + TEST_OVERRIDE_ARRAY_PAYLOAD_T override; + OVERRIDE_TYPE_T ovType = getOverrideArrayPayloadFromMessage( message, &override ); - if ( valve < NUM_OF_VALVES ) + // Verify tester has logged in with TD and override type is valid + if ( ( TRUE == isTestingActivated() ) && ( ovType != OVERRIDE_INVALID ) && ( ovType < NUM_OF_OVERRIDE_TYPES ) ) { - if ( TRUE == isTestingActivated() ) + U32 valveID = override.index; + + // Verify bubble detector index of override + if ( valveID < NUM_OF_VALVES ) { - valveSensedStates[ valve ].ovData = status; - valveSensedStates[ valve ].override = OVERRIDE_KEY; - result = TRUE; + if ( OVERRIDE_OVERRIDE == ovType ) + { + U32 value = override.state.u32; + + valveStates[ valveID ].ovData = value; + valveStates[ valveID ].override = OVERRIDE_KEY; + result = TRUE; + } + else + { + valveStates[ valveID ].override = OVERRIDE_RESET; + valveStates[ valveID ].ovData = valveStates[ valveID ].ovInitData; + result = TRUE; + } } } return result; -} +} /*********************************************************************//** * @brief - * The testResetValveSensedStateOverride function resets the override of - * the specified valve's sensed state. + * The testValveSensedStateOverride function overrides the value of the + * specified sensed state with a given value. * @details \b Inputs: none - * @details \b Outputs: valveSensedStates - * @param valve ID of valve to reset override state for + * @details \b Outputs: valveSensedStates[] + * @param message Override message from Dialin which includes an ID of + * the valve to override and the state to override the valve to. * @return TRUE if override successful, FALSE if not *************************************************************************/ -BOOL testResetValveSensedStateOverride( U32 valve ) +BOOL testValveSensedStateOverride( MESSAGE_T *message ) { - BOOL result = FALSE; + BOOL result = FALSE; + TEST_OVERRIDE_ARRAY_PAYLOAD_T override; + OVERRIDE_TYPE_T ovType = getOverrideArrayPayloadFromMessage( message, &override ); - if ( valve < NUM_OF_VALVES ) + // Verify tester has logged in with TD and override type is valid + if ( ( TRUE == isTestingActivated() ) && ( ovType != OVERRIDE_INVALID ) && ( ovType < NUM_OF_OVERRIDE_TYPES ) ) { - if ( TRUE == isTestingActivated() ) + U32 valveID = override.index; + + // Verify bubble detector index of override + if ( valveID < NUM_OF_VALVES ) { - valveSensedStates[ valve ].override = OVERRIDE_RESET; - valveSensedStates[ valve ].ovData = valveSensedStates[ valve ].ovInitData; - result = TRUE; + if ( OVERRIDE_OVERRIDE == ovType ) + { + U32 value = override.state.u32; + + valveSensedStates[ valveID ].ovData = value; + valveSensedStates[ valveID ].override = OVERRIDE_KEY; + result = TRUE; + } + else + { + valveSensedStates[ valveID ].override = OVERRIDE_RESET; + valveSensedStates[ valveID ].ovData = valveStates[ valveID ].ovInitData; + result = TRUE; + } } } Index: firmware/App/Controllers/Valves.h =================================================================== diff -u -r24bf8d1d7a248f907a5c60496a764ae1ef9876f6 -ra570e1827563618b8d26082eb63994f9f65adc17 --- firmware/App/Controllers/Valves.h (.../Valves.h) (revision 24bf8d1d7a248f907a5c60496a764ae1ef9876f6) +++ firmware/App/Controllers/Valves.h (.../Valves.h) (revision a570e1827563618b8d26082eb63994f9f65adc17) @@ -22,42 +22,50 @@ /** * @defgroup Valves Valves - * @brief Valves driver module. Controls valves. + * @brief Valves driver module. Controls all hydraulics valves, balancing chamber and + * ultrafiltration valves through FPGA Interface. * * @addtogroup Valves * @{ - */ + */ + /// Enumeration of valves. typedef enum Valves { - VDR = 0, ///< Valve Drain - VTD, ///< Valve IO direct Inlet + FIRST_HYD_VALVE = 0, ///< Start of Hydraulics valve group + VDR = FIRST_HYD_VALVE, ///< Valve Drain + VTD, ///< Valve Thermal Disinfect VHB, ///< Valve Hydraulics Bypass - VRP, ///< Valve concentrate Shunt + VRP, ///< Valve Rinse Port VHO, ///< Valve Hydraulics Outlet VDB1, ///< Valve DryBcarb Inlet - VP1, ///< Valve BC Gas Chamber Vent - VPT, ///< Valve Dialysate Sample - VDB2, ///< Valve Dialysate Bypass - VDI, ///< Valve Dialysate Inlet - VDO, ///< Valve Dialysate Outlet - VP2, ///< Valve Balance Air Separation Vent + VP1, ///< Valve Purge 1 + VPT, ///< Valve Pressure Test + VDB2, ///< Valve Dialyzer Bypass + VDI, ///< Valve Dialyzer Inlet + VDO, ///< Valve Dialyzer Outlet + VP2, ///< Valve Dialysate Out Purge 2 VHI, ///< Valve Hydraulics Inlet + LAST_HYD_VALVE = VHI, ///< End of Hydraulics valve of group RSRVD_SPACE1, ///< This space has been reserved RSRVD_SPACE2, ///< This space has been reserved RSRVD_SPACE3, ///< This space has been reserved - BCV1, ///< Balancing chamber Valve 1 + FIRST_BC_VALVE, ///< Start of Balancing Chamber valve group + BCV1 = FIRST_BC_VALVE, ///< Balancing chamber Valve 1 BCV2, ///< Balancing chamber Valve 2 BCV3, ///< Balancing chamber Valve 3 BCV4, ///< Balancing chamber Valve 4 BCV5, ///< Balancing chamber Valve 5 BCV6, ///< Balancing chamber Valve 6 BCV7, ///< Balancing chamber Valve 7 BCV8, ///< Balancing chamber Valve 8 - UFI1, ///< Ultrafiltration Valve 1 Inlet + LAST_BC_VALVE = BCV8, ///< End of Balancing Chamber valve group + FIRST_UF_VALVE, ///< Start of Ultrafiltration valve group + UFI1 = FIRST_UF_VALVE, ///< Ultrafiltration Valve 1 Inlet UFI2, ///< Ultrafiltration Valve 2 Inlet UFO1, ///< Ultrafiltration Valve 1 Outlet - UFO2, ///< Ultrafiltration Valve 2 Outlet + UFO2, ///< Ultrafiltration Valve 2 Outlet + LAST_UF_VALVE = UFO2, ///< End of Ultrafiltration valve group NUM_OF_VALVES ///< Number of valves } VALVES_T; @@ -89,12 +97,9 @@ BOOL setValveStateDelayed( VALVES_T valve, VALVE_STATE_NAMES_T valveState, U32 delayMs ); VALVE_STATE_NAMES_T getValveStateName( VALVES_T valveID ); -BOOL testSetValvesStatesPublishIntervalOverride( U32 value ); -BOOL testResetValvesStatesPublishIntervalOverride( void ); -BOOL testSetValveStateOverride( U32 valve, U32 state ); -BOOL testResetValveStateOverride( U32 valveID ); -BOOL testSetValveSensedStateOverride( U32 valve, U32 status ); -BOOL testResetValveSensedStateOverride( U32 valve ); +BOOL testValvesStatesPublishIntervalOverride( MESSAGE_T *message ); +BOOL testValveStateOverride( MESSAGE_T *message ); +BOOL testValveSensedStateOverride( MESSAGE_T *message ); /**@}*/