Index: firmware/App/Drivers/PinchValve.c =================================================================== diff -u -r9b13d5537168d760df3d8ddba7371f5764b30348 -r5a62968e832ffab29c33924c9aeecfedcbafb362 --- firmware/App/Drivers/PinchValve.c (.../PinchValve.c) (revision 9b13d5537168d760df3d8ddba7371f5764b30348) +++ firmware/App/Drivers/PinchValve.c (.../PinchValve.c) (revision 5a62968e832ffab29c33924c9aeecfedcbafb362) @@ -182,7 +182,7 @@ static PINCH_VALVE_CMD_STATE_T commandState[ NUM_OF_VALVES ]; static PINCH_VALVE_COMMAND_T activeCommand[ NUM_OF_VALVES ]; -static const PINCH_VALVE_COMMAND_T *activeCommandArray[ NUM_OF_VALVES ]; +static PINCH_VALVE_COMMAND_T *activeCommandArray[ NUM_OF_VALVES ]; static U08 activeCommandCount[ NUM_OF_VALVES ]; static U08 activeCommandIndex[ NUM_OF_VALVES ]; @@ -203,14 +203,14 @@ static U08 enableResetValue[ NUM_OF_VALVES ]; static U32 executeStartTime[ NUM_OF_VALVES ]; -static U32 statusPollStartMSCount[ NUM_OF_VALVES ]; +//static U32 statusPollStartMSCount[ NUM_OF_VALVES ]; // ********** private function prototypes ********** -static BOOL setPinchValveCommand( VALVE_T valve, const PINCH_VALVE_COMMAND_T *command ); +static BOOL setPinchValveCommand( VALVE_T valve, PINCH_VALVE_COMMAND_T command ); -static void writePinchValveCommandRegisters( VALVE_T valve ); +static BOOL writePinchValveCommandRegisters( VALVE_T valve ); static BOOL transmitPinchValveCommand( VALVE_T valve ); static void readPinchValveCommandResponse( VALVE_T valve ); static void clearPinchValveFpgaCommand( VALVE_T valve ); @@ -223,7 +223,7 @@ static U08 readPinchValveErrorCount( VALVE_T valve ); static BOOL isValidPinchValve( VALVE_T valve ); -static BOOL isValidPinchValveCommand( const PINCH_VALVE_COMMAND_T *command ); +static BOOL isValidPinchValveCommand( PINCH_VALVE_COMMAND_T *command ); static void setSigned32CommandWords( PINCH_VALVE_COMMAND_T *command, S32 value ); static S32 getSigned32OutputValue( VALVE_T valve ); @@ -295,24 +295,30 @@ switch ( commandState[ valve ] ) { case PINCH_VALVE_CMD_IDLE_STATE: + if ( activeCommand[ valve ].cmdHeader != 0 ) + { + commandState[ valve ] = PINCH_VALVE_CMD_SET_CMD_STATE; + } break; case PINCH_VALVE_CMD_SET_CMD_STATE: - writePinchValveCommandRegisters( valve ); - - if ( PINCH_VALVE_CMD_ERROR_STATE != commandState[ valve ] ) + if ( TRUE == writePinchValveCommandRegisters( valve ) ) { errorCountAtCommandStart[ valve ] = readPinchValveErrorCount( valve ); commandState[ valve ] = PINCH_VALVE_CMD_XMIT_CMD_STATE; } + else + { + commandState[ valve ] = PINCH_VALVE_CMD_ERROR_STATE; + } break; case PINCH_VALVE_CMD_XMIT_CMD_STATE: if ( TRUE == transmitPinchValveCommand( valve ) ) { executeStartTime[ valve ] = getMSTimerCount(); - statusPollStartMSCount[ valve ] = executeStartTime[ valve ]; +// statusPollStartMSCount[ valve ] = executeStartTime[ valve ]; commandState[ valve ] = PINCH_VALVE_CMD_WAIT_DONE_STATE; } else @@ -325,13 +331,13 @@ case PINCH_VALVE_CMD_WAIT_DONE_STATE: if ( TRUE == didTimeout( executeStartTime[ valve ], PINCH_VALVE_COMMAND_TIMEOUT_MS ) ) { - readPinchValveCommandResponse( valve ); + //readPinchValveCommandResponse( valve ); // Varshini, I don't think we should read response if it times out. commandState[ valve ] = PINCH_VALVE_CMD_ERROR_STATE; } - else if ( TRUE == didTimeout( statusPollStartMSCount[ valve ], PINCH_VALVE_STATUS_POLL_INTERVAL_MS ) ) + else // if ( TRUE == didTimeout( statusPollStartMSCount[ valve ], PINCH_VALVE_STATUS_POLL_INTERVAL_MS ) ) { readPinchValveCommandResponse( valve ); - statusPollStartMSCount[ valve ] = getMSTimerCount(); +// statusPollStartMSCount[ valve ] = getMSTimerCount(); if ( ( TRUE == didPinchValveErrorCountChange( valve ) ) || ( TRUE == isPinchValveControllerFaultActive( valve ) ) ) { @@ -345,7 +351,7 @@ break; case PINCH_VALVE_CMD_READ_WORDS_STATE: - readPinchValveCommandResponse( valve ); + readPinchValveCommandResponse( valve ); // Varshini - do we have to read again? Looks like you already read response in prior state. if ( ( TRUE == didPinchValveErrorCountChange( valve ) ) || ( TRUE == isPinchValveControllerFaultActive( valve ) ) || @@ -355,22 +361,26 @@ } else { + // TODO - Varshini, I think we need to interpret/save output words (for Get commands) to static variables (e.g. currentValvePosition for a GetPosition command) clearPinchValveFpgaCommand( valve ); + activeCommand[ valve ].cmdHeader = 0; commandFailed[ valve ] = FALSE; commandState[ valve ] = PINCH_VALVE_CMD_IDLE_STATE; } break; case PINCH_VALVE_CMD_ERROR_STATE: - readPinchValveCommandResponse( valve ); +// readPinchValveCommandResponse( valve ); clearPinchValveFpgaCommand( valve ); + activeCommand[ valve ].cmdHeader = 0; commandFailed[ valve ] = TRUE; commandState[ valve ] = PINCH_VALVE_CMD_IDLE_STATE; break; default: clearPinchValveFpgaCommand( valve ); + activeCommand[ valve ].cmdHeader = 0; commandFailed[ valve ] = TRUE; commandState[ valve ] = PINCH_VALVE_CMD_IDLE_STATE; break; @@ -564,7 +574,10 @@ case PINCH_VALVE_FUNCTION_SEND_STATE: if ( ( activeCommandArray[ valve ] != 0 ) && ( activeCommandIndex[ valve ] < activeCommandCount[ valve ] ) ) { - if ( TRUE == setPinchValveCommand( valve, &activeCommandArray[ valve ] [ activeCommandIndex[ valve ] ] ) ) + PINCH_VALVE_COMMAND_T *cmdArray = activeCommandArray[ valve ]; + PINCH_VALVE_COMMAND_T cmd = cmdArray[ activeCommandIndex[ valve ] ]; + + if ( TRUE == setPinchValveCommand( valve, cmd ) ) { functionState[ valve ] = PINCH_VALVE_FUNCTION_WAIT_STATE; } @@ -613,31 +626,33 @@ * The setPinchValveCommand function requests execution * @details \b Inputs: valve, command * @details \b Outputs: pendingCommand, functionState, commandResult -* @param valve H1_VALV or H19_VALV. +* @param valve ID of valve to send a command to. +* @param command command record describing command to send to the given valve * @return TRUE if the request was accepted, FALSE otherwise. *************************************************************************/ -static BOOL setPinchValveCommand( VALVE_T valve, const PINCH_VALVE_COMMAND_T *command ) +static BOOL setPinchValveCommand( VALVE_T valve, PINCH_VALVE_COMMAND_T command ) { BOOL result = FALSE; - if ( ( TRUE == isValidPinchValve( valve ) ) && ( TRUE == isValidPinchValveCommand( command ) ) && - ( PINCH_VALVE_CMD_IDLE_STATE == commandState[ valve ] ) ) + if ( ( TRUE == isValidPinchValve( valve ) ) && ( TRUE == isValidPinchValveCommand( &command ) ) && + ( PINCH_VALVE_CMD_IDLE_STATE == commandState[ valve ] ) ) { - activeCommand[ valve ] = *command; + activeCommand[ valve ] = command; - if ( ( activeCommandArray[ valve ] == &positionCommands[ 0 ] ) && - ( PINCH_VALVE_POSITION_CMD_SET_POSITION == activeCommandIndex[ valve ] ) ) + // if set position command, replace position value (words 1 and 2) with position given with command + if ( PINCH_VALVE_PMD_CMD_SET_POSITION == activeCommandArray[ valve ]->cmdHeader ) { setSigned32CommandWords( &activeCommand[ valve ], pendingValvePosition[ valve ] ); } - + // reset command feedback before command is sent commandOutputWord1[ valve ] = 0; commandOutputWord2[ valve ] = 0; commandOutputWord3[ valve ] = 0; commandSpiStatus[ valve ] = 0; commandErrorCount[ valve ] = 0; commandFailed[ valve ] = FALSE; commandState[ valve ] = PINCH_VALVE_CMD_SET_CMD_STATE; + result = TRUE; } @@ -651,28 +666,30 @@ * input words through the FpgaTD interface. * @details \b Inputs: activeValve, activeCommand * @details \b Outputs: FPGA command header and input registers -* @return none +* @return TRUE if successful, FALSE if not *************************************************************************/ -static void writePinchValveCommandRegisters( VALVE_T valve ) +static BOOL writePinchValveCommandRegisters( VALVE_T valve ) { + BOOL result = FALSE; + if ( H1_VALV == valve ) { setH1CmdHeader( activeCommand[ valve ].cmdHeader ); setH1InputWord1( activeCommand[ valve ].inputWord1 ); setH1InputWord2( activeCommand[ valve ].inputWord2 ); setH1InputWord3( activeCommand[ valve ].inputWord3 ); + result = TRUE; } else if ( H19_VALV == valve ) { setH19CmdHeader( activeCommand[ valve ].cmdHeader ); setH19InputWord1( activeCommand[ valve ].inputWord1 ); setH19InputWord2( activeCommand[ valve ].inputWord2 ); setH19InputWord3( activeCommand[ valve ].inputWord3 ); + result = TRUE; } - else - { - commandState[ valve ] = PINCH_VALVE_CMD_ERROR_STATE; - } + + return result; } /*********************************************************************//** @@ -892,10 +909,10 @@ * The isValidPinchValveCommand function validates a generic command request. * @details \b Inputs: command * @details \b Outputs: none -* @param command Command to validate. +* @param command Pointer to command record to validate. * @return TRUE if the request is valid. *************************************************************************/ -static BOOL isValidPinchValveCommand( const PINCH_VALVE_COMMAND_T *command ) +static BOOL isValidPinchValveCommand( PINCH_VALVE_COMMAND_T *command ) { BOOL result = FALSE;