Index: firmware/App/Controllers/Valves.c =================================================================== diff -u -r557164394770b436f89735d3ffc91feda2ec7aac -r51f2f8f4adf8963e19e5f746b16c54ae814d73c0 --- firmware/App/Controllers/Valves.c (.../Valves.c) (revision 557164394770b436f89735d3ffc91feda2ec7aac) +++ firmware/App/Controllers/Valves.c (.../Valves.c) (revision 51f2f8f4adf8963e19e5f746b16c54ae814d73c0) @@ -16,7 +16,7 @@ #include "AlarmMgmt.h" #include "FPGA.h" -#include +//#include #include "OperationModes.h" #include "stdbool.h" #include "SystemCommMessages.h" @@ -31,21 +31,22 @@ // ********** private definitions ********** -#define DEENERGIZED 0 /// 0 for de-energized valve -#define ENERGIZED 1 /// 1 for energized valve -#define INIT_VALVES_STATES 0 /// 0 in U16 initial state of all valves +#define DEENERGIZED 0 ///< 0 for de-energized valve +#define ENERGIZED 1 ///< 1 for energized valve +#define ALL_VALVES_DEENERGIZED 0x0000 ///< 0 in U16 bit field for all valves +#define MAX_VALVE_STATE_MISMATCH_COUNT 3 ///< maximum number of times commanded valves state can fail to match read back valve states in a row. + /// Default publication interval for valves states #define VALVES_STATE_PUB_INTERVAL ( 500 / TASK_PRIORITY_INTERVAL ) ///< interval ( ms / task time) at which valves states are published on CAN bus // ********** private data ********** -static U16 valvesStates = INIT_VALVES_STATES; ///< initialize valves states for FPGA to set static U32 valvesStatesPublicationTimerCounter = 0; ///< used to schedule valve state publication to CAN bus -static U16 currentValvesStates = INIT_VALVES_STATES; ///< initialize current valves states +static U16 commandedValvesStates = ALL_VALVES_DEENERGIZED; ///< initialize commanded valves states bit field. static U32 valveStateMismatchCounter = 0; ///< initialize valve state mismatch counter -static OVERRIDE_U32_T valves[ NUM_OF_VALVES ]; ///< Current valves states +static OVERRIDE_U32_T valveStates[ NUM_OF_VALVES ]; ///< Currently commanded valves states static OVERRIDE_U32_T valvesStatesPublishInterval = { VALVES_STATE_PUB_INTERVAL, VALVES_STATE_PUB_INTERVAL, 0, 0 }; ///< interval (in ms/task interval) at which to publish valves state to CAN bus // ********** private function prototypes ********** @@ -66,157 +67,159 @@ *************************************************************************/ void initValves( void ) { - // initialize current valves states (for both override and actual) U32 i; + // initialize commanded valve states for (i = 0; i < NUM_OF_VALVES; i++) { - valves[ i ].data = DEENERGIZED; - valves[ i ].ovInitData = DEENERGIZED; - valves[ i ].ovData = DEENERGIZED; - valves[ i ].override = OVERRIDE_RESET; + valveStates[ i ].data = DEENERGIZED; + valveStates[ i ].ovInitData = DEENERGIZED; + valveStates[ i ].ovData = DEENERGIZED; + valveStates[ i ].override = OVERRIDE_RESET; } + commandedValvesStates = fromU32ArrayToU16( valveStates ); + setFPGAValveStates( commandedValvesStates ); // initially set all valves to de-energized state via FPGA - setFPGAValveStates( INIT_VALVES_STATES ); // initially set all valves to de-energized state via FPGA valvesStatesPublicationTimerCounter = 0; // reset valves states publication timer } /*********************************************************************//** * @brief * The execValves function executes the valves driver. * @details - * Inputs : valvesStates - * Outputs : valvesStates + * Inputs : valvesStates, valveStateMismatchCounter + * Outputs : valvesStates, valveStateMismatchCounter * @return none *************************************************************************/ void execValves( void ) { - if ( valveStateMismatchCounter < 2 ) - { - valvesStates = getFPGAValveStates(); // get valves states from FPGA + U16 readValvesStates = getFPGAValveStates(); // get valves states from FPGA - // Check if valves states from FPGA (valvesStates) equals current valves states (valves) - if ( valvesStates != currentValvesStates ) + // verify read back FPGA valve states match last commanded valve states + if ( readValvesStates != commandedValvesStates ) + { + valveStateMismatchCounter++; // increment valve state mismatch counter by 1 + if ( valveStateMismatchCounter > MAX_VALVE_STATE_MISMATCH_COUNT ) { - valvesStates = currentValvesStates; - valveStateMismatchCounter++; // increment valve state mismatch counter by 1 + activateAlarmNoData( ALARM_ID_VALVE_CONTROL_FAILURE ); } - else // valvesStates from FPGA match valves' current states - { - valveStateMismatchCounter = 0; // reset valve state mismatch counter because valves and valvesStates match - } } - else // if requested valve state does not match FPGA-provided valve state three (3) times in row + else { - activateAlarmNoData( ALARM_ID_VALVE_EXEC_COUNTER_ERROR ); + valveStateMismatchCounter = 0; } - currentValvesStates = fromU32ArrayToU16( valves ); - setFPGAValveStates( valvesStates ); // set valves states via FPGA to current valves states - publishValvesStates(); // publish valves states on interval + // set valves states (via FPGA) to currently commanded states + commandedValvesStates = fromU32ArrayToU16( valveStates ); + setFPGAValveStates( commandedValvesStates ); + + // publish valve states on interval + publishValvesStates(); } /*********************************************************************//** * @brief * The checkValveStateName function checks the validity of requested valve \n * state name for given valve. * @details - * Inputs : valve, valveStateName + * Inputs : none * Outputs : none - * @return none + * @param valveID : ID of valve to check a valve state name for. + * @param valveStateName : valve state name to check for given valve ID. + * @return TRUE if given valveStateName is appropriate for given valve ID, FALSE if not. *************************************************************************/ -static BOOL checkValveStateName( VALVES_T valve, VALVE_STATE_NAMES_T valveStateName ) +static BOOL checkValveStateName( VALVES_T valveID, VALVE_STATE_NAMES_T valveStateName ) { BOOL result = FALSE; // initialize result flag to FALSE switch ( valveStateName ) { case VALVE_STATE_OPEN: - if ( ( valve == VPI ) || ( valve == VBF ) || ( valve == VSP ) ) + if ( ( valveID == VPI ) || ( valveID == VBF ) || ( valveID == VSP ) ) { result = TRUE; } break; case VALVE_STATE_CLOSED: - if ( ( valve == VPI ) || ( valve == VBF ) || ( valve == VSP ) ) + if ( ( valveID == VPI ) || ( valveID == VBF ) || ( valveID == VSP ) ) { result = TRUE; } break; case VALVE_STATE_OPEN_C_TO_NO: - if ( valve == VPD ) + if ( valveID == VPD ) { result = TRUE; } break; case VALVE_STATE_DRAIN_C_TO_NC: - if ( valve == VPD ) + if ( valveID == VPD ) { result = TRUE; } break; case VALVE_STATE_NOFILL_C_TO_NO: - if ( valve == VPO ) + if ( valveID == VPO ) { result = TRUE; } break; case VALVE_STATE_FILL_C_TO_NC: - if ( valve == VPO ) + if ( valveID == VPO ) { result = TRUE; } break; case VALVE_STATE_DRAIN_C_TO_NO: - if ( ( valve == VDR ) || ( valve == VRC ) ) + if ( ( valveID == VDR ) || ( valveID == VRC ) ) { result = TRUE; } break; case VALVE_STATE_RECIRC_C_TO_NC: - if ( ( valve == VDR ) || ( valve == VRC ) ) + if ( ( valveID == VDR ) || ( valveID == VRC ) ) { result = TRUE; } break; case VALVE_STATE_R1_C_TO_NO: - if ( ( valve == VRO ) || ( valve == VRI ) ) + if ( ( valveID == VRO ) || ( valveID == VRI ) ) { result = TRUE; } break; case VALVE_STATE_R1_C_TO_NC: - if ( ( valve == VRD ) || ( valve == VRF ) ) + if ( ( valveID == VRD ) || ( valveID == VRF ) ) { result = TRUE; } break; case VALVE_STATE_R2_C_TO_NO: - if ( ( valve == VRD ) || ( valve == VRF ) ) + if ( ( valveID == VRD ) || ( valveID == VRF ) ) { result = TRUE; } break; case VALVE_STATE_R2_C_TO_NC: - if ( ( valve == VRO ) || ( valve == VRI ) ) + if ( ( valveID == VRO ) || ( valveID == VRI ) ) { result = TRUE; } break; default: - activateAlarmNoData( ALARM_ID_VALVE_STATE_CHECK_ERROR ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_VALVES_INVALID_VALVE_STATE_NAME, valveStateName ) break; } @@ -249,18 +252,19 @@ * The fromU32ArrayToU16 function converts an array of U32 valve states \n * to U16 valvesStates that can be passed to FPGA for setting valves. * @details - * Inputs : none + * Inputs : valveStates[] * Outputs : none - * @return converted U16 valvesStates + * @return converted U16 bit field for currently commanded valve states *************************************************************************/ U16 fromU32ArrayToU16( OVERRIDE_U32_T array[ NUM_OF_VALVES ] ) { - U16 result = 0; // initialize result flag to 0 + U16 result = ALL_VALVES_DEENERGIZED; // start result flag as all valves de-energized U32 i; + // flag valves that are currently commanded to be energized for ( i = 0; i < NUM_OF_VALVES; i++) { - result |= ( getValveState( i ) == 1 ? 0x0001 << i : 0 ); + result |= ( getValveState( i ) == ENERGIZED ? 0x0001 << i : 0 ); } return result; @@ -273,13 +277,14 @@ * @details * Inputs : none * Outputs : none - * @return converted U32 vState + * @param valveStateName : valve state name enumeration to convert to energized/de-energized. + * @return converted valve state for given valve state name *************************************************************************/ -U32 convertValveStateNameToValveState(VALVE_STATE_NAMES_T valveStateName) +U32 convertValveStateNameToValveState( VALVE_STATE_NAMES_T valveStateName ) { U32 vState = DEENERGIZED; // initialize valve state to de-energized - switch (valveStateName) + switch ( valveStateName ) { case VALVE_STATE_OPEN: vState = ENERGIZED; @@ -330,7 +335,7 @@ break; default: - activateAlarmNoData( ALARM_ID_VALVE_ERROR ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_VALVES_INVALID_VALVE_STATE_NAME, valveStateName ) break; } @@ -343,15 +348,17 @@ * @details * Inputs : none * Outputs : none - * @return TRUE if new valve state is set for given valve + * @param valveID : ID of valve to set state for. + * @param valveStateName : Name of valve state to set given valve to. + * @return TRUE if new valve state is set for given valve ID, FALSE if not. *************************************************************************/ -BOOL setValveState( VALVES_T valve, VALVE_STATE_NAMES_T valveStateName ) +BOOL setValveState( VALVES_T valveID, VALVE_STATE_NAMES_T valveStateName ) { BOOL result = FALSE; // initialize result flag to FALSE - if ( checkValveStateName ( valve, valveStateName ) ) + if ( checkValveStateName ( valveID, valveStateName ) ) { - valves[ valve ].data = convertValveStateNameToValveState( valveStateName ); // not done on override to allow DG state machine to set valves states back to real values + valveStates[ valveID ].data = convertValveStateNameToValveState( valveStateName ); result = TRUE; } @@ -362,41 +369,41 @@ * @brief * The getValveState function gets the current valve state for given valve. * @details - * Inputs : valveState + * Inputs : valveStates[] * Outputs : none + * @param valveID : ID of valve to get state for. * @return the current valve state for given valve *************************************************************************/ -U32 getValveState( U32 valve ) +U32 getValveState( U32 valveID ) { U32 valveState = DEENERGIZED; - if ( valve < NUM_OF_VALVES ) + if ( valveID < NUM_OF_VALVES ) { - if ( OVERRIDE_KEY == valves[ valve ].override ) + if ( OVERRIDE_KEY == valveStates[ valveID ].override ) { - valveState = valves[ valve ].ovData; + valveState = valveStates[ valveID ].ovData; } else { - valveState = valves[ valve ].data; + valveState = valveStates[ valveID ].data; } } else { - activateAlarmNoData( ALARM_ID_VALVE_ERROR ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_VALVES_INVALID_VALVE_ID, valveID ) } return valveState; } /*********************************************************************//** - * * @brief * The publishValvesStates function publishes DG valves states at the \n * set interval. * @details * Inputs : valvesStatesPublicationTimerCounter - * Outputs : DG valves states are published to CAN bus + * Outputs : DG valves states are published to CAN bus on interval. * @return none *************************************************************************/ static void publishValvesStates( void ) @@ -469,21 +476,21 @@ * specified valve with a given value. * Inputs : none * Outputs : valves[] - * @param valve : ID of valve to override for + * @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 valve, U32 value ) +BOOL testSetValveStateOverride( U32 valveID, U32 value ) { BOOL result = FALSE; - if ( valve < NUM_OF_VALVES ) + if ( valveID < NUM_OF_VALVES ) { if ( TRUE == isTestingActivated() ) { result = TRUE; - valves[ valve ].ovData = value; - valves[ valve ].override = OVERRIDE_KEY; + valveStates[ valveID ].ovData = value; + valveStates[ valveID ].override = OVERRIDE_KEY; } } @@ -497,20 +504,20 @@ * @details * Inputs : none * Outputs : valves[] - * @param value : ID of valve to reset override state for + * @param valveID : ID of valve to reset override state for * @return TRUE if override successful, FALSE if not *************************************************************************/ -BOOL testResetValveStateOverride( U32 valve ) +BOOL testResetValveStateOverride( U32 valveID ) { BOOL result = FALSE; - if ( valve < NUM_OF_VALVES ) + if ( valveID < NUM_OF_VALVES ) { if ( TRUE == isTestingActivated() ) { result = TRUE; - valves[ valve ].override = OVERRIDE_RESET; - valves[ valve ].ovData = valves[ valve ].ovInitData; + valveStates[ valveID ].override = OVERRIDE_RESET; + valveStates[ valveID ].ovData = valveStates[ valveID ].ovInitData; } } Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -r6d2d8f0267c57135554e5a1acaca9aef37f27949 -r51f2f8f4adf8963e19e5f746b16c54ae814d73c0 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 6d2d8f0267c57135554e5a1acaca9aef37f27949) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 51f2f8f4adf8963e19e5f746b16c54ae814d73c0) @@ -307,6 +307,3 @@ return result; } - - - Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -r8638b207699a3a48e3657e838e24ae838369c867 -r51f2f8f4adf8963e19e5f746b16c54ae814d73c0 --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 8638b207699a3a48e3657e838e24ae838369c867) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 51f2f8f4adf8963e19e5f746b16c54ae814d73c0) @@ -124,6 +124,13 @@ SW_FAULT_ID_PI_CTRL_INVALID_SIGNAL, SW_FAULT_ID_NVDATAMGMT_EXEC_INVALID_STATE, SW_FAULT_ID_NVDATAMGMT_INVALID_SELF_TEST_STATE, + SW_FAULT_ID_TEMPERATURE_SENSORS_INVALID_SELF_TEST_STATE, + SW_FAULT_ID_TEMPERATURE_SENSORS_EXEC_INVALID_STATE, + SW_FAULT_ID_HEATERS_SELF_TEST_INVALID_STATE, + SW_FAULT_ID_HEATERS_PRIMARY_HEATER_EXEC_INVALID_STATE, + SW_FAULT_ID_HEATERS_TRIMMER_HEATER_EXEC_INVALID_STATE, + SW_FAULT_ID_VALVES_INVALID_VALVE_STATE_NAME, + SW_FAULT_ID_VALVES_INVALID_VALVE_ID, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T;