Index: firmware/App/Drivers/PinchValve.c =================================================================== diff -u -r11da41dd26e721d103fe71e2d42a407a4afde13a -re0060cd79d971c0ed94b8aed6949d2754480fe92 --- firmware/App/Drivers/PinchValve.c (.../PinchValve.c) (revision 11da41dd26e721d103fe71e2d42a407a4afde13a) +++ firmware/App/Drivers/PinchValve.c (.../PinchValve.c) (revision e0060cd79d971c0ed94b8aed6949d2754480fe92) @@ -18,7 +18,6 @@ #include "Common.h" #include "FpgaTD.h" #include "PinchValve.h" -#include "RotaryValve.h" #include "Timers.h" #include "Utilities.h" @@ -30,7 +29,8 @@ // ********** private definitions ********** -#define PINCH_VALVE_COMMAND_TIMEOUT_MS 1000 ///< Maximum FPGA command execution time. +#define PINCH_VALVE_COMMAND_TIMEOUT_MS 5000 ///< Maximum FPGA command execution time. +#define PINCH_VALVE_COMMAND_RESPONSE_DELAY_MS 100 ///< Temporary delay before reading the FPGA command response. #define PINCH_VALVE_FPGA_CMD_START_BIT_MASK 0x01 ///< Bit 0 starts a command transaction. (TODO: To change the comments later) #define PINCH_VALVE_FPGA_CMD_WRITE_ONLY_BIT_MASK 0x02 ///< Bit 1 selects a write-only command. @@ -45,8 +45,8 @@ #define PINCH_VALVE_SPI_RX_COUNT_SHIFT 4 #define PINCH_VALVE_SPI_CONTROLLER_FAULT_BIT_MASK 0x40 ///< SPI status bit 6: controller fault. -#define PINCH_VALVE_ENABLE_BIT_MASK 0x01 ///< Enable controller. -#define PINCH_VALVE_RESET_BIT_MASK 0x02 ///< Reset controller. +#define PINCH_VALVE_ENABLE_BIT_MASK 0x00 ///< Enable controller. +#define PINCH_VALVE_RESET_BIT_MASK 0x01 ///< Reset controller. #define PINCH_VALVE_MAX_INPUT_WORDS 3 ///< Maximum number of command input words. @@ -67,9 +67,11 @@ #define PINCH_VALVE_PROFILE_MODE_S_CURVE 2 #define PINCH_VALVE_RESET_EVENT_STATUS_VALUE 0xFFEE -static const S32 HOMING_VELOCITY_FIRST = -3342; ///< First homing movement velocity. -static const S32 HOMING_VELOCITY_SECOND = 3342; ///< Second homing movement velocity. -static const S32 POSITION_VELOCITY = 7000; ///< Velocity used for position movements; +static const S32 H1_HOMING_VELOCITY_FIRST = -3342; +static const S32 H1_HOMING_VELOCITY_SECOND = 3342; +static const S32 H19_HOMING_VELOCITY_FIRST = 3342; +static const S32 H19_HOMING_VELOCITY_SECOND = -3342; +static const S32 POSITION_VELOCITY = 7000; /// Pinch valve function state machine. typedef enum pinchValveFunctionStates @@ -109,16 +111,16 @@ PINCH_VALVE_HOME_CMD_RESET_EVENTS_FIRST, PINCH_VALVE_HOME_CMD_SET_VELOCITY_FIRST, PINCH_VALVE_HOME_CMD_UPDATE_FIRST, - PINCH_VALVE_HOME_CMD_GET_ACTIVITY_FIRST, - PINCH_VALVE_HOME_CMD_GET_EVENT_STATUS_FIRST, +// PINCH_VALVE_HOME_CMD_GET_ACTIVITY_FIRST, +// PINCH_VALVE_HOME_CMD_GET_EVENT_STATUS_FIRST, PINCH_VALVE_HOME_CMD_RESET_EVENTS_SECOND, PINCH_VALVE_HOME_CMD_SET_VELOCITY_SECOND, PINCH_VALVE_HOME_CMD_UPDATE_SECOND, - PINCH_VALVE_HOME_CMD_GET_ACTIVITY_SECOND, - PINCH_VALVE_HOME_CMD_GET_EVENT_STATUS_SECOND, - PINCH_VALVE_HOME_CMD_SET_ACTUAL_POSITION_ZERO, - PINCH_VALVE_HOME_CMD_GET_ACTUAL_POSITION, - PINCH_VALVE_HOME_CMD_RESET_EVENTS_COMPLETE, +// PINCH_VALVE_HOME_CMD_GET_ACTIVITY_SECOND, +// PINCH_VALVE_HOME_CMD_GET_EVENT_STATUS_SECOND, +// PINCH_VALVE_HOME_CMD_SET_ACTUAL_POSITION_ZERO, +// PINCH_VALVE_HOME_CMD_GET_ACTUAL_POSITION, +// PINCH_VALVE_HOME_CMD_RESET_EVENTS_COMPLETE, NUM_OF_PINCH_VALVE_HOMING_COMMANDS } PINCH_VALVE_HOMING_COMMAND_INDEX_T; @@ -140,22 +142,57 @@ // ********** private data ********** // This array is used for both H1_VALV and H19_VALV. The active valve only determines which FPGA register access functions run. -static PINCH_VALVE_COMMAND_T homingCommands[ NUM_OF_PINCH_VALVE_HOMING_COMMANDS ] = +//static PINCH_VALVE_COMMAND_T homingCommands[ NUM_OF_PINCH_VALVE_HOMING_COMMANDS ] = +//{ +// { PINCH_VALVE_PMD_CMD_SET_PROFILE_MODE, PINCH_VALVE_PROFILE_MODE_VELOCITY, 0, 0, 1, 0, TRUE }, +// { PINCH_VALVE_PMD_CMD_RESET_EVENT_STATUS, PINCH_VALVE_RESET_EVENT_STATUS_VALUE, 0, 0, 1, 0, TRUE }, +// { PINCH_VALVE_PMD_CMD_SET_VELOCITY, 0, 0, 0, 2, 0, TRUE }, +// { PINCH_VALVE_PMD_CMD_UPDATE, 0, 0, 0, 0, 0, TRUE }, +// { PINCH_VALVE_PMD_CMD_GET_ACTIVITY_STATUS, 0, 0, 0, 0, 1, FALSE }, +// { PINCH_VALVE_PMD_CMD_GET_EVENT_STATUS, 0, 0, 0, 0, 1, FALSE }, +// { PINCH_VALVE_PMD_CMD_RESET_EVENT_STATUS, PINCH_VALVE_RESET_EVENT_STATUS_VALUE, 0, 0, 1, 0, TRUE }, +// { PINCH_VALVE_PMD_CMD_SET_VELOCITY, 0, 0, 0, 2, 0, TRUE }, +// { PINCH_VALVE_PMD_CMD_UPDATE, 0, 0, 0, 0, 0, TRUE }, +// { PINCH_VALVE_PMD_CMD_GET_ACTIVITY_STATUS, 0, 0, 0, 0, 1, FALSE }, +// { PINCH_VALVE_PMD_CMD_GET_EVENT_STATUS, 0, 0, 0, 0, 1, FALSE }, +// { PINCH_VALVE_PMD_CMD_SET_ACTUAL_POSITION, 0, 0, 0, 2, 0, TRUE }, +// { PINCH_VALVE_PMD_CMD_GET_ACTUAL_POSITION, 0, 0, 0, 0, 2, FALSE }, +// { PINCH_VALVE_PMD_CMD_RESET_EVENT_STATUS, PINCH_VALVE_RESET_EVENT_STATUS_VALUE, 0, 0, 1, 0, TRUE } +//}; + +//static PINCH_VALVE_COMMAND_T homingCommands[ 7 ] = +//{ +// { PINCH_VALVE_PMD_CMD_SET_PROFILE_MODE, PINCH_VALVE_PROFILE_MODE_VELOCITY, 0, 0, 1, 0, TRUE }, +// { PINCH_VALVE_PMD_CMD_RESET_EVENT_STATUS, PINCH_VALVE_RESET_EVENT_STATUS_VALUE, 0, 0, 1, 0, TRUE }, +// { PINCH_VALVE_PMD_CMD_SET_VELOCITY, 0, 0, 0, 2, 0, TRUE }, +// { PINCH_VALVE_PMD_CMD_UPDATE, 0, 0, 0, 0, 0, TRUE }, +// { PINCH_VALVE_PMD_CMD_RESET_EVENT_STATUS, PINCH_VALVE_RESET_EVENT_STATUS_VALUE, 0, 0, 1, 0, TRUE }, +// { PINCH_VALVE_PMD_CMD_SET_VELOCITY, 0, 0, 0, 2, 0, TRUE }, +// { PINCH_VALVE_PMD_CMD_UPDATE, 0, 0, 0, 0, 0, TRUE }, +//}; + +// This array is used for both H1_VALV +static PINCH_VALVE_COMMAND_T h1HomingCommands[ NUM_OF_PINCH_VALVE_HOMING_COMMANDS ] = { { PINCH_VALVE_PMD_CMD_SET_PROFILE_MODE, PINCH_VALVE_PROFILE_MODE_VELOCITY, 0, 0, 1, 0, TRUE }, { PINCH_VALVE_PMD_CMD_RESET_EVENT_STATUS, PINCH_VALVE_RESET_EVENT_STATUS_VALUE, 0, 0, 1, 0, TRUE }, { PINCH_VALVE_PMD_CMD_SET_VELOCITY, 0, 0, 0, 2, 0, TRUE }, - { PINCH_VALVE_PMD_CMD_UPDATE, 0, 0, 0, 0, 0, TRUE }, - { PINCH_VALVE_PMD_CMD_GET_ACTIVITY_STATUS, 0, 0, 0, 0, 1, FALSE }, - { PINCH_VALVE_PMD_CMD_GET_EVENT_STATUS, 0, 0, 0, 0, 1, FALSE }, + { PINCH_VALVE_PMD_CMD_UPDATE, 0, 0, 0, 0, 0, TRUE }, { PINCH_VALVE_PMD_CMD_RESET_EVENT_STATUS, PINCH_VALVE_RESET_EVENT_STATUS_VALUE, 0, 0, 1, 0, TRUE }, { PINCH_VALVE_PMD_CMD_SET_VELOCITY, 0, 0, 0, 2, 0, TRUE }, + { PINCH_VALVE_PMD_CMD_UPDATE, 0, 0, 0, 0, 0, TRUE } +}; + +// This array is used for both H19_VALV +static PINCH_VALVE_COMMAND_T h19HomingCommands[ NUM_OF_PINCH_VALVE_HOMING_COMMANDS ] = +{ + { PINCH_VALVE_PMD_CMD_SET_PROFILE_MODE, PINCH_VALVE_PROFILE_MODE_VELOCITY, 0, 0, 1, 0, TRUE }, + { PINCH_VALVE_PMD_CMD_RESET_EVENT_STATUS, PINCH_VALVE_RESET_EVENT_STATUS_VALUE, 0, 0, 1, 0, TRUE }, + { PINCH_VALVE_PMD_CMD_SET_VELOCITY, 0, 0, 0, 2, 0, TRUE }, { PINCH_VALVE_PMD_CMD_UPDATE, 0, 0, 0, 0, 0, TRUE }, - { PINCH_VALVE_PMD_CMD_GET_ACTIVITY_STATUS, 0, 0, 0, 0, 1, FALSE }, - { PINCH_VALVE_PMD_CMD_GET_EVENT_STATUS, 0, 0, 0, 0, 1, FALSE }, - { PINCH_VALVE_PMD_CMD_SET_ACTUAL_POSITION, 0, 0, 0, 2, 0, TRUE }, - { PINCH_VALVE_PMD_CMD_GET_ACTUAL_POSITION, 0, 0, 0, 0, 2, FALSE }, - { PINCH_VALVE_PMD_CMD_RESET_EVENT_STATUS, PINCH_VALVE_RESET_EVENT_STATUS_VALUE, 0, 0, 1, 0, TRUE } + { PINCH_VALVE_PMD_CMD_RESET_EVENT_STATUS, PINCH_VALVE_RESET_EVENT_STATUS_VALUE, 0, 0, 1, 0, TRUE }, + { PINCH_VALVE_PMD_CMD_SET_VELOCITY, 0, 0, 0, 2, 0, TRUE }, + { PINCH_VALVE_PMD_CMD_UPDATE, 0, 0, 0, 0, 0, TRUE } }; static PINCH_VALVE_COMMAND_T positionCommands[ NUM_OF_PINCH_VALVE_POSITION_COMMANDS ] = @@ -201,6 +238,8 @@ static U32 executeStartTime[ NUM_OF_VALVES ]; +static U32 tempStart[ NUM_OF_VALVES ]; + // ********** private function prototypes ********** static BOOL setPinchValveCommand( VALVE_T valve, PINCH_VALVE_COMMAND_T command ); @@ -240,8 +279,10 @@ { VALVE_T valve; - setSigned32CommandWords( &homingCommands[ PINCH_VALVE_HOME_CMD_SET_VELOCITY_FIRST ], HOMING_VELOCITY_FIRST ); - setSigned32CommandWords( &homingCommands[ PINCH_VALVE_HOME_CMD_SET_VELOCITY_SECOND ], HOMING_VELOCITY_SECOND ); + setSigned32CommandWords( &h1HomingCommands[ PINCH_VALVE_HOME_CMD_SET_VELOCITY_FIRST ], H1_HOMING_VELOCITY_FIRST ); + setSigned32CommandWords( &h1HomingCommands[ PINCH_VALVE_HOME_CMD_SET_VELOCITY_SECOND ], H1_HOMING_VELOCITY_SECOND ); + setSigned32CommandWords( &h19HomingCommands[ PINCH_VALVE_HOME_CMD_SET_VELOCITY_FIRST ], H19_HOMING_VELOCITY_FIRST ); + setSigned32CommandWords( &h19HomingCommands[ PINCH_VALVE_HOME_CMD_SET_VELOCITY_SECOND ], H19_HOMING_VELOCITY_SECOND ); setSigned32CommandWords( &positionCommands[ PINCH_VALVE_POSITION_CMD_SET_VELOCITY ], POSITION_VELOCITY ); for ( valve = FIRST_VALVE; valve < NUM_OF_VALVES; valve++ ) @@ -314,6 +355,7 @@ { errorCountAtCommandStart[ valve ] = readPinchValveErrorCount( valve ); commandState[ valve ] = PINCH_VALVE_CMD_XMIT_CMD_STATE; + tempStart[ valve ] = getMSTimerCount(); } else { @@ -323,33 +365,38 @@ case PINCH_VALVE_CMD_XMIT_CMD_STATE: - if ( TRUE == transmitPinchValveCommand( valve ) ) + if ( TRUE == didTimeout(tempStart[ valve ],PINCH_VALVE_COMMAND_RESPONSE_DELAY_MS ) ) { - executeStartTime[ valve ] = getMSTimerCount(); - commandState[ valve ] = PINCH_VALVE_CMD_WAIT_DONE_STATE; + if ( TRUE == transmitPinchValveCommand( valve ) ) + { + executeStartTime[ valve ] = getMSTimerCount(); + commandState[ valve ] = PINCH_VALVE_CMD_WAIT_DONE_STATE; + } + else + { + commandState[ valve ] = PINCH_VALVE_CMD_ERROR_STATE; + } } - else - { - commandState[ valve ] = PINCH_VALVE_CMD_ERROR_STATE; - } break; case PINCH_VALVE_CMD_WAIT_DONE_STATE: - if ( TRUE == didTimeout( executeStartTime[ valve ], PINCH_VALVE_COMMAND_TIMEOUT_MS ) ) + //if ( TRUE == didTimeout( executeStartTime[ valve ], PINCH_VALVE_COMMAND_TIMEOUT_MS ) ) +// { +// commandState[ valve ] = PINCH_VALVE_CMD_ERROR_STATE; +// } +// else { - commandState[ valve ] = PINCH_VALVE_CMD_ERROR_STATE; - } - else - { readPinchValveCommandResponse( valve ); if ( ( TRUE == didPinchValveErrorCountChange( valve ) ) || ( TRUE == isPinchValveControllerFaultActive( valve ) ) ) { commandState[ valve ] = PINCH_VALVE_CMD_ERROR_STATE; } - else if ( TRUE == isPinchValveCommandDone( valve ) ) + else if ( TRUE == didTimeout( executeStartTime[ valve ], PINCH_VALVE_COMMAND_TIMEOUT_MS ) ) + //else if ( TRUE == isPinchValveCommandDone( valve ) ) { + // Temporary code for hardware debug workaround wait 100 ms instead of checking the FPGA DONE bit. commandState[ valve ] = PINCH_VALVE_CMD_READ_WORDS_STATE; } } @@ -473,14 +520,15 @@ * @param enable TRUE to enable the controller. * @param reset TRUE to assert the reset bit. * @return none +* *************************************************************************/ void setPinchValveEnableReset( VALVE_T valve, BOOL enable, BOOL reset ) { U08 value = 0; if ( TRUE == enable ) { - value |= PINCH_VALVE_ENABLE_BIT_MASK; + value &= ~PINCH_VALVE_RESET_BIT_MASK; } if ( TRUE == reset ) @@ -562,11 +610,32 @@ if ( TRUE == pendingValveHomeRequest[ valve ] ) { pendingValveHomeRequest[ valve ] = FALSE; - activeCommandArray[ valve ] = homingCommands; - activeCommandCount[ valve ] = NUM_OF_PINCH_VALVE_HOMING_COMMANDS; - activeCommandIndex[ valve ] = 0; - commandFailed[ valve ] = FALSE; - functionState[ valve ] = PINCH_VALVE_FUNCTION_SEND_STATE; + if ( H1_VALV == valve ) + { + activeCommandArray[ valve ] = h1HomingCommands; + } + else if ( H19_VALV == valve ) + { + activeCommandArray[ valve ] = h19HomingCommands; + } + else + { + activeCommandArray[ valve ] = 0; + + } + // Then only continue when the array is valid: + if ( 0 != activeCommandArray[ valve ] ) + { + activeCommandCount[ valve ] = NUM_OF_PINCH_VALVE_HOMING_COMMANDS; + activeCommandIndex[ valve ] = 0; + commandFailed[ valve ] = FALSE; + functionState[ valve ] = PINCH_VALVE_FUNCTION_SEND_STATE; + } + else + { + commandFailed[ valve ] = TRUE; + resetPinchValveFunctionSequence( valve ); + } } else if ( TRUE == pendingValvePositionRequest[ valve ] ) { @@ -609,7 +678,7 @@ if ( TRUE == commandFailed[ valve ] ) { resetPinchValveFunctionSequence( valve ); - // TODO: Connect this failure to the required valve fault or software-fault handling after the alarm behavior is defined. + // TODO: Connect this failure to the required valve fault or software fault handling after the alarm behavior is defined. } else { @@ -974,7 +1043,8 @@ U08 transmittedCount = (U08)( ( commandSpiStatus[ valve ] & PINCH_VALVE_SPI_TX_COUNT_MASK ) >> PINCH_VALVE_SPI_TX_COUNT_SHIFT ); U08 receivedCount = (U08)( ( commandSpiStatus[ valve ] & PINCH_VALVE_SPI_RX_COUNT_MASK ) >> PINCH_VALVE_SPI_RX_COUNT_SHIFT ); - return ( ( transmittedCount == expectedTransmitCount ) && ( receivedCount == activeCommand[ valve ].outputWordCount ) ); + //return ( ( transmittedCount == expectedTransmitCount ) && ( receivedCount == activeCommand[ valve ].outputWordCount ) ); + return TRUE; } /*********************************************************************//**