Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -rdd7fad816b77aee7febdc79785eb74102b844370 -rf401094683b7f3b082c41493f1a217c28a331e5c --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision dd7fad816b77aee7febdc79785eb74102b844370) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision f401094683b7f3b082c41493f1a217c28a331e5c) @@ -41,7 +41,7 @@ #define MAX_FILL_VOLUME_ML MAX_RESERVOIR_VOLUME_ML ///> Maximum fill volume in mL. #define DEFAULT_DRAIN_VOLUME_ML 100 ///> Default drain volume in mL. #define MAX_DRAIN_VOLUME_ML MAX_RESERVOIR_VOLUME_ML ///> Maximum drain volume in mL. -#define MIN_DRAIN_VOLUME_ML 100 ///> Minimum drain volume in mL. +#define MIN_DRAIN_VOLUME_ML 0 ///> Minimum drain volume in mL. #define MAX_RESERVOIR_WEIGHT 10000 ///> Maximum reservoir weight in grams. @@ -111,60 +111,67 @@ /*********************************************************************//** * @brief - * The setActiveReservoir function sets the given reservoir as active + * The setActiveReservoirCmd function sets the given reservoir as active * (meaning HD will be drawing from this reservoir). * @details Inputs: none * @details Outputs: Specified reservoir is set as active. * @param resID ID of reservoir to set as active - * @return TRUE if set active reservoir command successful, FALSE if not. + * @return none *************************************************************************/ -BOOL setActiveReservoirCmd( RESERVOIR_ID_T resID ) -{ - BOOL result = FALSE; +void setActiveReservoirCmd( RESERVOIR_ID_T resID ) +{ + BOOL rejected = TRUE; + CMD_REQUEST_REJECT_REASON_CODE_T rejectCode = CMD_REQUEST_REJECT_REASON_NONE; // switch reservoir command only valid in re-circulate mode if ( DG_MODE_CIRC == getCurrentOperationMode() ) { switch ( resID ) { case RESERVOIR_1: - activeReservoir.data = (U32)resID; - result = TRUE; + activeReservoir.data = (U32)resID; + rejected = FALSE; setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); setValveState( VRD, VALVE_STATE_R2_C_TO_NO ); setValveState( VRO, VALVE_STATE_R1_C_TO_NO ); setValveState( VRI, VALVE_STATE_R1_C_TO_NO ); break; case RESERVOIR_2: - activeReservoir.data = (U32)resID; - result = TRUE; + activeReservoir.data = (U32)resID; + rejected = FALSE; setValveState( VRF, VALVE_STATE_R1_C_TO_NC ); // TODO - valve states are reversed for the two reservoirs for now - revert back when load cells are fixed. setValveState( VRD, VALVE_STATE_R1_C_TO_NC ); setValveState( VRO, VALVE_STATE_R2_C_TO_NC ); setValveState( VRI, VALVE_STATE_R2_C_TO_NC ); break; default: - // invalid reservoir given - cmd will be NAK'd w/ false result. + // invalid reservoir given - cmd will be NAK'd w/ false result. + rejectCode = CMD_REQUEST_REJECT_REASON_INVALID_PARAMETER; break; } + } + else + { + rejectCode = CMD_REQUEST_REJECT_REASON_INVALID_MODE; } - - return result; + + sendCommandResponseMsg( rejected, rejectCode ); } /*********************************************************************//** * @brief - * The startFill function handles a fill command from the HD. + * The startFillCmd function handles a fill command from the HD. * @details Inputs: none * @details Outputs: move to fill mode * @param fillToVolMl Target volume (in mL) to fill reservoir to - * @return TRUE if fill command successful, FALSE if not. + * @return none *************************************************************************/ -BOOL startFillCmd( U32 fillToVolMl ) +void startFillCmd( U32 fillToVolMl ) { - BOOL result = FALSE; + BOOL rejected = TRUE; + CMD_REQUEST_REJECT_REASON_CODE_T rejectCode = CMD_REQUEST_REJECT_REASON_NONE; // fill command only valid in re-circulate mode if ( ( DG_MODE_CIRC == getCurrentOperationMode() ) && @@ -175,46 +182,60 @@ { fillVolumeTargetMl.data = fillToVolMl; requestNewOperationMode( DG_MODE_FILL ); - result = TRUE; + rejected = FALSE; + } + else + { + rejectCode = CMD_REQUEST_REJECT_REASON_INVALID_PARAMETER; } + } + else + { + rejectCode = CMD_REQUEST_REJECT_REASON_INVALID_MODE; } - - return result; + + sendCommandResponseMsg( rejected, rejectCode ); } /*********************************************************************//** * @brief - * The stopFill function handles a stop fill command from the HD. + * The stopFillCmd function handles a stop fill command from the HD. * @details Inputs: none - * @details Outputs: move to standby mode - * @return TRUE if stop fill command successful, FALSE if not. + * @details Outputs: move to re-circulate mode + * @return none *************************************************************************/ -BOOL stopFillCmd( void ) +void stopFillCmd( void ) { - BOOL result = FALSE; + BOOL rejected = TRUE; + CMD_REQUEST_REJECT_REASON_CODE_T rejectCode = CMD_REQUEST_REJECT_REASON_NONE; // stop fill command only valid in fill mode if ( DG_MODE_FILL == getCurrentOperationMode() ) { fillVolumeTargetMl.data = 0; requestNewOperationMode( DG_MODE_CIRC ); - result = TRUE; + rejected = FALSE; + } + else + { + rejectCode = CMD_REQUEST_REJECT_REASON_INVALID_MODE; } - return result; + sendCommandResponseMsg( rejected, rejectCode ); } /*********************************************************************//** * @brief - * The startDrain function handles a drain command from the HD. + * The startDrainCmd function handles a drain command from the HD. * @details Inputs: none * @details Outputs: Start draining in re-circulate mode - * @param drainToVolMl Target volume (in mL) to drain reservoir to - * @return TRUE if drain command successful, FALSE if not. + * @param drainCmd drain command data record + * @return none *************************************************************************/ -BOOL startDrainCmd( DRAIN_CMD_T drainCmd ) +void startDrainCmd( DRAIN_CMD_T drainCmd ) { - BOOL result = FALSE; + BOOL rejected = TRUE; + CMD_REQUEST_REJECT_REASON_CODE_T rejectCode = CMD_REQUEST_REJECT_REASON_NONE; // drain command only valid in re-circulate mode if ( DG_MODE_CIRC == getCurrentOperationMode() ) @@ -225,67 +246,89 @@ drainVolumeTargetMl.data = drainCmd.targetVolume; tareLoadCellRequest = drainCmd.tareLoadCell; requestNewOperationMode( DG_MODE_DRAI ); - result = TRUE; + rejected = FALSE; + } + else + { + rejectCode = CMD_REQUEST_REJECT_REASON_INVALID_PARAMETER; } + } + else + { + rejectCode = CMD_REQUEST_REJECT_REASON_INVALID_MODE; } - return result; + sendCommandResponseMsg( rejected, rejectCode ); } /*********************************************************************//** * @brief - * The stopDrain function handles a stop drain command from the HD. + * The stopDrainCmd function handles a stop drain command from the HD. * @details Inputs: none - * @details Outputs: move to standby mode - * @return TRUE if stop drain command successful, FALSE if not. + * @details Outputs: move to re-circulate mode + * @return none *************************************************************************/ -BOOL stopDrainCmd( void ) +void stopDrainCmd( void ) { - BOOL result = FALSE; + BOOL rejected = TRUE; + CMD_REQUEST_REJECT_REASON_CODE_T rejectCode = CMD_REQUEST_REJECT_REASON_NONE; // stop drain command only valid in drain mode if ( DG_MODE_DRAI == getCurrentOperationMode() ) { drainVolumeTargetMl.data = 0; requestNewOperationMode( DG_MODE_CIRC ); - result = TRUE; + rejected = FALSE; } + else + { + rejectCode = CMD_REQUEST_REJECT_REASON_INVALID_MODE; + } - return result; + sendCommandResponseMsg( rejected, rejectCode ); } /*********************************************************************//** * @brief - * The startTrimmerHeater function handles a start trimmer heater command + * The startTrimmerHeaterCmd function handles a start trimmer heater command * from the HD. * @details Inputs: none * @details Outputs: start trimmer heater - * @return TRUE if stop drain command successful, FALSE if not. + * @return none *************************************************************************/ -BOOL startTrimmerHeaterCmd( void ) +void startTrimmerHeaterCmd( void ) { - BOOL result = FALSE; + BOOL rejected = TRUE; + CMD_REQUEST_REJECT_REASON_CODE_T rejectCode = CMD_REQUEST_REJECT_REASON_NONE; + + if ( TRUE == startTrimmerHeater() ) + { + rejected == FALSE; + } + else + { + rejectCode = CMD_REQUEST_REJECT_REASON_INVALID_PARAMETER; + } - result = startTrimmerHeater(); - - return result; + sendCommandResponseMsg( rejected, rejectCode ); } /*********************************************************************//** * @brief - * The stopTrimmerHeater function handles a stop trimmer heater command + * The stopTrimmerHeaterCmd function handles a stop trimmer heater command * from the HD. * @details Inputs: none * @details Outputs: stop trimmer heater - * @return TRUE if stop drain command successful, FALSE if not. + * @return none *************************************************************************/ -BOOL stopTrimmerHeaterCmd( void ) +void stopTrimmerHeaterCmd( void ) { - BOOL result = TRUE; + BOOL rejected = FALSE; + CMD_REQUEST_REJECT_REASON_CODE_T rejectCode = CMD_REQUEST_REJECT_REASON_NONE; stopTrimmerHeater(); - return result; + sendCommandResponseMsg( rejected, rejectCode ); } /*********************************************************************//** Index: firmware/App/Services/Reservoirs.h =================================================================== diff -u -r62ee40b55ed96eb0de1c0f05455eb986f76c1842 -rf401094683b7f3b082c41493f1a217c28a331e5c --- firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision 62ee40b55ed96eb0de1c0f05455eb986f76c1842) +++ firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision f401094683b7f3b082c41493f1a217c28a331e5c) @@ -52,13 +52,13 @@ void initReservoirs( void ); void execReservoirs( void ); -BOOL setActiveReservoirCmd( RESERVOIR_ID_T resID ); // handle switch reservoirs command from HD -BOOL startFillCmd( U32 fillToVolMl ); // handle fill command from HD -BOOL stopFillCmd( void ); // handle stop fill command from HD -BOOL startDrainCmd( DRAIN_CMD_T drainCmd ); // handle drain command from HD -BOOL stopDrainCmd( void ); // handle stop drain command from HD -BOOL startTrimmerHeaterCmd( void ); // handle start trimmer heater control command from HD -BOOL stopTrimmerHeaterCmd( void ); // handle stop trimmer heater control command from HD +void setActiveReservoirCmd( RESERVOIR_ID_T resID ); // handle switch reservoirs command from HD +void startFillCmd( U32 fillToVolMl ); // handle fill command from HD +void stopFillCmd( void ); // handle stop fill command from HD +void startDrainCmd( DRAIN_CMD_T drainCmd ); // handle drain command from HD +void stopDrainCmd( void ); // handle stop drain command from HD +void startTrimmerHeaterCmd( void ); // handle start trimmer heater control command from HD +void stopTrimmerHeaterCmd( void ); // handle stop trimmer heater control command from HD RESERVOIR_ID_T getInactiveReservoir( void ); BOOL hasTargetFillVolumeBeenReached( RESERVOIR_ID_T reservoirId ); Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -rac55f23681cd3a29ec235265f73c67895e36ada9 -rf401094683b7f3b082c41493f1a217c28a331e5c --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision ac55f23681cd3a29ec235265f73c67895e36ada9) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision f401094683b7f3b082c41493f1a217c28a331e5c) @@ -882,6 +882,34 @@ return result; } +/*********************************************************************//** + * @brief + * The sendCommandResponseMsg function constructs a command response to HD + * and queues the msg for transmit on the appropriate CAN channel. + * @details Inputs: none + * @details Outputs: Command response msg constructed and queued. + * @param rejected T/F - is command rejected? + * @param rejectReason reason command was rejected (if not accepted) + * @return none + *************************************************************************/ +void sendCommandResponseMsg( BOOL rejected, U32 rejectReason ) +{ + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + + // Create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_DG_COMMAND_RESPONSE; + msg.hdr.payloadLen = sizeof( BOOL ) + sizeof( U32 ); + + memcpy( payloadPtr, &rejected, sizeof( BOOL ) ); + payloadPtr += sizeof( BOOL ); + memcpy( payloadPtr, &rejectReason, sizeof( U32 ) ); + + // Serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer + serializeMessage( msg, COMM_BUFFER_OUT_CAN_DG_2_HD, ACK_REQUIRED ); +} + // *********************************************************************** // **************** Message Handling Helper Functions ******************** // *********************************************************************** @@ -1011,15 +1039,16 @@ { BOOL startingHeater; + result = TRUE; memcpy( &startingHeater, message->payload, sizeof( U32 ) ); if ( TRUE == startingHeater ) { - result = startTrimmerHeaterCmd(); + startTrimmerHeaterCmd(); } else { - result = stopTrimmerHeaterCmd(); + stopTrimmerHeaterCmd(); } } Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -rac55f23681cd3a29ec235265f73c67895e36ada9 -rf401094683b7f3b082c41493f1a217c28a331e5c --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision ac55f23681cd3a29ec235265f73c67895e36ada9) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision f401094683b7f3b082c41493f1a217c28a331e5c) @@ -95,6 +95,12 @@ // MSG_ID_DG_FANS_DATA BOOL broadcastFansData( FANS_DATA_T * fansData ); +// MSG_ID_DG_UV_REACTORS_DATA +BOOL broadcastUVReactorsData( UV_REACTORS_DATA_T *uvReactorsData ); + +// MSG_ID_DG_COMMAND_RESPONSE +void sendCommandResponseMsg( BOOL rejected, U32 rejectReason ); + // MSG_ID_POWER_OFF_WARNING void handlePowerOffWarning( MESSAGE_T *message ); @@ -125,9 +131,6 @@ // MSG_ID_DG_START_STOP_TRIMMER_HEATER_CMD void handleStartStopTrimmerHeaterCmd( MESSAGE_T *message ); -// MSG_ID_DG_UV_REACTORS_DATA -BOOL broadcastUVReactorsData( UV_REACTORS_DATA_T *uvReactorsData ); - // *********** public test support message functions ********** #ifdef DEBUG_ENABLED