/************************************************************************** * * Copyright (c) 2019-2021 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * @file SampleWater.c * * @author (last) Quang Nguyen * @date (last) 19-Feb-2021 * * @author (original) Quang Nguyen * @date (original) 19-Feb-2021 * ***************************************************************************/ #include "DGInterface.h" #include "HDDefs.h" #include "SampleWater.h" #include "TaskGeneral.h" /** * @addtogroup SampleWater * @{ */ // ********** private definitions ********** #define MAX_FLUSH_TIME_COUNT ( 60 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Maximum flush time count relative to task general interval. // ********** private data ********** static BOOL sampleWaterStartRequested; static BOOL sampleWaterStopRequested; static BOOL sampleWaterTakenConfirm; static SAMPLE_WATER_STATE_T currentSampleWaterState; static U32 flushTimerCounter; static BOOL sampleWaterPassed; static BOOL sampleWaterFailed; // ********** private function prototypes ********** static SAMPLE_WATER_STATE_T handleWaterSampleSetupState( void ); static SAMPLE_WATER_STATE_T handleWaterSampleState( void ); static SAMPLE_WATER_STATE_T handleWaterSampleResultState( void ); /*********************************************************************//** * @brief * The initSampleWater function initializes the Pre-Treatment SampleWater module. * @details Inputs: none * @details Outputs: SampleWater module initialized. * @return none *************************************************************************/ void initSampleWater( void ) { sampleWaterStartRequested = FALSE; sampleWaterStopRequested = FALSE; sampleWaterTakenConfirm = FALSE; currentSampleWaterState = SAMPLE_WATER_SETUP_STATE; flushTimerCounter = 0; sampleWaterPassed = FALSE; sampleWaterFailed = FALSE; } /*********************************************************************//** * @brief * The transitionToSampleWater function prepares for transition to sample water mode. * @details Inputs: none * @details Outputs: Commanded DG to flush filters and re-initializes SampleWater module * @return none *************************************************************************/ void transitionToSampleWater( void ) { cmdDGSampleWater( SAMPLE_WATER_CMD_FLUSH ); initSampleWater(); } /*********************************************************************//** * @brief * The execSampleWater function executes the Sample Water state machine. * @details Inputs: currentSampleWaterState * @details Outputs: currentSampleWaterState * @return none *************************************************************************/ void execSampleWater( void ) { switch ( currentSampleWaterState ) { case SAMPLE_WATER_SETUP_STATE: currentSampleWaterState = handleWaterSampleSetupState(); break; case SAMPLE_WATER_STATE: currentSampleWaterState = handleWaterSampleState(); break; case SAMPLE_WATER_RESULT_STATE: currentSampleWaterState = handleWaterSampleResultState(); break; default: // TODO: alarm break; } } /*********************************************************************//** * @brief * The getSampleWaterState function returns the current state of sample water sub-mode. * @details Inputs: currentSampleWaterState * @details Outputs: none * @return current sample water state *************************************************************************/ U32 getSampleWaterState( void ) { return (U32)currentSampleWaterState; } /*********************************************************************//** * @brief * The isSampleWaterPassed function returns the result of sample water. * @details Inputs: sampleWaterPassed * @details Outputs: none * @return TRUE if sample water result passed, otherwise FALSE *************************************************************************/ BOOL isSampleWaterPassed( void ) { return sampleWaterPassed; } /*********************************************************************//** * @brief * The handleWaterSampleSetupState function waits for filter flush period elapsed. * @details Inputs: flushTimerCounter * @details Outputs: none * @return current state *************************************************************************/ static SAMPLE_WATER_STATE_T handleWaterSampleSetupState( void ) { SAMPLE_WATER_STATE_T state = SAMPLE_WATER_SETUP_STATE; if ( MAX_FLUSH_TIME_COUNT < flushTimerCounter++ ) { state = SAMPLE_WATER_STATE; } return state; } /*********************************************************************//** * @brief * The handleWaterSampleState function passes sample water commands from user * down to DG. * @details Inputs: sampleWaterTakenConfirm, sampleWaterStartRequested, sampleWaterStopRequested * @details Outputs: Processed commands from user * @return current state *************************************************************************/ static SAMPLE_WATER_STATE_T handleWaterSampleState( void ) { SAMPLE_WATER_STATE_T state = SAMPLE_WATER_STATE; DG_CMD_RESPONSE_T dgCmdResp; if ( TRUE == sampleWaterTakenConfirm ) { sampleWaterTakenConfirm = FALSE; state = SAMPLE_WATER_RESULT_STATE; } if ( TRUE == sampleWaterStartRequested ) { sampleWaterStartRequested = FALSE; cmdDGSampleWater( SAMPLE_WATER_CMD_START ); } if ( TRUE == sampleWaterStopRequested ) { sampleWaterStopRequested = FALSE; cmdDGSampleWater( SAMPLE_WATER_CMD_STOP ); } if ( ( TRUE == getDGCommandResponse( DG_CMD_START_DRAIN, &dgCmdResp ) ) && ( DG_CMD_REQUEST_REJECT_REASON_FLUSH_EXPIRED == dgCmdResp.rejected ) ) { cmdDGSampleWater( SAMPLE_WATER_CMD_FLUSH ); state = SAMPLE_WATER_SETUP_STATE; } return state; } /*********************************************************************//** * @brief * The handleWaterSampleResultState function triggers a fault if user * provides failed sample water result. * @details Inputs: sampleWaterFailed * @details Outputs: triggers a fault alarm * @return current state *************************************************************************/ static SAMPLE_WATER_STATE_T handleWaterSampleResultState( void ) { if ( TRUE == sampleWaterFailed ) { // TODO: Trigger fault } return SAMPLE_WATER_RESULT_STATE; } /**@}*/