Index: firmware/App/Modes/ModeROPermeateSample.c =================================================================== diff -u -r43f57e52a9a31e5154579178e847db3a6917b93c -rad272a524906daa67d4de0aa41ac401dd33afc8f --- firmware/App/Modes/ModeROPermeateSample.c (.../ModeROPermeateSample.c) (revision 43f57e52a9a31e5154579178e847db3a6917b93c) +++ firmware/App/Modes/ModeROPermeateSample.c (.../ModeROPermeateSample.c) (revision ad272a524906daa67d4de0aa41ac401dd33afc8f) @@ -14,6 +14,7 @@ #include "Pressures.h" #include "Reservoirs.h" #include "ROPump.h" +#include "SystemCommMessages.h" #include "RTC.h" #include "Switches.h" #include "TaskGeneral.h" @@ -48,23 +49,15 @@ #define RSRVR_FILL_TARGET_FILL_ML 1850.0F ///< Reservoir fill target in mL. #define RSRVR_DRAIN_BEFORE_SAMPLE_COLLECTION_MS ( 4.25F * SEC_PER_MIN * MS_PER_SECOND ) ///< Reservoir drain before collection samples in milliseconds. #define RO_PUMP_TARGET_DISPENSE_FLOW_RATE_LPM 0.6F ///< RO pump target flow rate during dispensing in L/min. -#define TARGET_DISPENSE_VOLUME_ML 100.0F ///< Target dispense volume in milliliters. +#define TARGET_DISPENSE_VOLUME_ML 70.0F ///< Target dispense volume in milliliters. -/// Collection sample substates enum -typedef enum Sample_Collection_Substates -{ - COLLECT_SAMPLE_INITIALIZE = 0, ///< Collect sample initialize. - COLLECT_SAMPLE_DISPENSE, ///< Collect sample dispense. - COLLECT_SAMPLE_STOP, ///< Collect sample stop. - NUM_OF_COLLECT_SAMPLE_STATES ///< Number of collect sample states. -} COLLECT_SAMPLE_STATES_T; - /// Dispense message status enum typedef enum Dispense_Message_Status { - DISPENSE_MSG_NOT_RECEIVED = 0, ///< Dispense message not received. + DISPENSE_MSG_READY = 0, ///< Dispense message ready to receive message. + DISPENSE_MSG_DISPENSING, ///< Dispense message dispensing. + DISPENSE_MSG_CANCEL, ///< Dispense message cancel. DISPENSE_MSG_DISPENSE, ///< Dispense message dispense. - DISPENSE_MSG_STOP, ///< Dispense message stop. NUM_OF_DISPENSE_MSG ///< Number of dispense messages. } DISPENSE_MSG_STATUS_T; @@ -77,9 +70,11 @@ static DIS_RSRVR_STATUS_T rsrvrsStatus; ///< Mode RO permeate sample reservoirs status. static F32 roPermeateSampledispensedVolumeML; ///< Mode RO permeate sample dispensed volume in milliliters. static BOOL isReservoirFull; ///< Mode RO permeate sample flag to indicate reservoir 2 is filled. -static COLLECT_SAMPLE_STATES_T collectSampleSubState; ///< Mode RO permeate sample collect sample substate. static DISPENSE_MSG_STATUS_T dispenseMessageStatus; ///< Mode RO permeate sample dispense message status. +/// Conversion coefficient from flow in L/min to volume in milliliters. +static const F32 FLOW_LPM_TO_VOL_ML_CONVERSION = ( ML_PER_LITER * TASK_GENERAL_INTERVAL ) / ( SEC_PER_MIN * MS_PER_SECOND ); + // ********** private function prototypes ********** static DG_RO_PERM_STATE_T handleROPermeateSampleStartState( void ); @@ -109,7 +104,7 @@ * @details Outputs: roPermeateSampleState, roPermeateSamplePrevState, * stateStartTimeMS, dataPublishCounter, overallROPermeateSampleTimer, * alarmDetectedPendingTrigger, rsrvrsStatus, roPermeateSampledispensedVolumeML, - * isReservoirFull, collectSampleSubState, dispenseMessageStatus + * isReservoirFull, dispenseMessageStatus * @return none *************************************************************************/ void initROPermeateSampleMode( void ) @@ -122,8 +117,7 @@ alarmDetectedPendingTrigger = ALARM_ID_NO_ALARM; roPermeateSampledispensedVolumeML = 0.0F; isReservoirFull = FALSE; - collectSampleSubState = COLLECT_SAMPLE_INITIALIZE; - dispenseMessageStatus = DISPENSE_MSG_NOT_RECEIVED; + dispenseMessageStatus = DISPENSE_MSG_READY; // Initialize the reservoirs rsrvrsStatus.rsrvrFillStableTime = 0; @@ -285,7 +279,7 @@ *************************************************************************/ void setROPermeateSampleDispenseRequest( U32 request ) { - dispenseMessageStatus = (DISPENSE_MSG_STATUS_T)request; + dispenseMessageStatus = ( request == 1 ? DISPENSE_MSG_DISPENSE : DISPENSE_MSG_CANCEL ); } // ********** private functions ********** @@ -445,10 +439,8 @@ * @brief * The handleROPermeateSampleCollectSampleState function handles * the RO permeate sample collect sample state. - * @details Inputs: dispenseMessageStatus, collectSampleSubState, - * roPermeateSampledispensedVolumeML - * @details Outputs: dispenseMessageStatus, collectSampleSubState, - * roPermeateSampledispensedVolumeML + * @details Inputs: dispenseMessageStatus, roPermeateSampledispensedVolumeML + * @details Outputs: dispenseMessageStatus, roPermeateSampledispensedVolumeML * @return next state of the RO permeate sample state machine *************************************************************************/ static DG_RO_PERM_STATE_T handleROPermeateSampleCollectSampleState( void ) @@ -461,50 +453,56 @@ switch ( dispenseMessageStatus ) { - case DISPENSE_MSG_NOT_RECEIVED: - // Check alarm active is not needed - if ( ( FALSE == isAlarmActive( ALARM_ID_DG_RO_PERMEATE_SAMPLE_REMOVE_DIA_CAP ) ) && ( COLLECT_SAMPLE_INITIALIZE == collectSampleSubState ) ) - { - collectSampleSubState = COLLECT_SAMPLE_DISPENSE; - setROPermeateSampleStateTransition( state ); - } + case DISPENSE_MSG_READY: + setROPermeateSampleStateTransition( state ); break; + case DISPENSE_MSG_DISPENSING: + // It is dispensing so do nothing + break; + + case DISPENSE_MSG_CANCEL: + state = DG_RO_PERM_SAMPLE_STATE_COMPLETE; // TODO go to drain once testing is done + setROPermeateSampleStateTransition( state ); + break; + case DISPENSE_MSG_DISPENSE: if ( FALSE == isROPumpRunning() ) { - collectSampleSubState = COLLECT_SAMPLE_DISPENSE; - dispenseMessageStatus = DISPENSE_MSG_NOT_RECEIVED; + dispenseMessageStatus = DISPENSE_MSG_DISPENSING; setROPermeateSampleStateTransition( state ); } break; - case DISPENSE_MSG_STOP: - collectSampleSubState = COLLECT_SAMPLE_STOP; - dispenseMessageStatus = DISPENSE_MSG_NOT_RECEIVED; - setROPermeateSampleStateTransition( state ); - break; - default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_DG_RO_PERMEATE_SAMPLE_INVALID_MESSAGE, dispenseMessageStatus ) - dispenseMessageStatus = DISPENSE_MSG_NOT_RECEIVED; + dispenseMessageStatus = DISPENSE_MSG_READY; break; } if ( TRUE == isROPumpRunning() ) { if ( roPermeateSampledispensedVolumeML < TARGET_DISPENSE_VOLUME_ML ) { - roPermeateSampledispensedVolumeML += ( getMeasuredFlowRateLPM( RO_FLOW_SENSOR ) * ML_PER_LITER * TASK_GENERAL_INTERVAL ) / - ( SEC_PER_MIN * MS_PER_SECOND ); + roPermeateSampledispensedVolumeML += getMeasuredFlowRateLPM( RO_FLOW_SENSOR ) * FLOW_LPM_TO_VOL_ML_CONVERSION; } else { - collectSampleSubState = COLLECT_SAMPLE_STOP; + // Done with dispensing fluid + // Message HD that DG is ready for the next command (either dispense more or cancel the run) + dispenseMessageStatus = DISPENSE_MSG_READY; setROPermeateSampleStateTransition( state ); + handleSendROPermeateSampleDispenseReadyToHD(); // TODO should we send this multiple times until confirmation? } } } + else + { + deenergizeActuators( NO_PARK_CONC_PUMPS ); + activateAlarmNoData( ALARM_ID_DG_RO_PERMEATE_SAMPLE_REMOVE_DIA_CAP ); + roPermeateSampledispensedVolumeML = 0.0F; + dispenseMessageStatus = DISPENSE_MSG_READY; + } return state; } @@ -869,17 +867,14 @@ break; case DG_RO_PERM_SAMPLE_STATE_COLLECT_SAMPLE: - switch( collectSampleSubState ) + switch( dispenseMessageStatus ) { - case COLLECT_SAMPLE_INITIALIZE: + case DISPENSE_MSG_CANCEL: + case DISPENSE_MSG_READY: deenergizeActuators( NO_PARK_CONC_PUMPS ); - activateAlarmNoData( ALARM_ID_DG_RO_PERMEATE_SAMPLE_REMOVE_DIA_CAP ); - stateStartTimeMS = getMSTimerCount(); - roPermeateSampledispensedVolumeML = 0.0F; - dispenseMessageStatus = DISPENSE_MSG_NOT_RECEIVED; break; - case COLLECT_SAMPLE_DISPENSE: + case DISPENSE_MSG_DISPENSE: // Valves setValveState( VPI, VALVE_STATE_OPEN ); setValveState( VBF, VALVE_STATE_CLOSED ); @@ -906,14 +901,9 @@ roPermeateSampledispensedVolumeML = 0.0F; break; - case COLLECT_SAMPLE_STOP: - deenergizeActuators( NO_PARK_CONC_PUMPS ); - break; - + case DISPENSE_MSG_DISPENSING: default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_DG_RO_PERMEATE_SAMPLE_INVALID_COLLECTION_STATE_SELECTED, - collectSampleSubState ) - collectSampleSubState = COLLECT_SAMPLE_INITIALIZE; + // Do nothing. In these states, we do not need to do anything with actuators break; } break;