Index: firmware/App/Modes/SampleWater.c =================================================================== diff -u -r401c4027b0e59182771f0c620465b34579f203f5 -r40f46e196349e3dd730048a354df8bbb2e40407d --- firmware/App/Modes/SampleWater.c (.../SampleWater.c) (revision 401c4027b0e59182771f0c620465b34579f203f5) +++ firmware/App/Modes/SampleWater.c (.../SampleWater.c) (revision 40f46e196349e3dd730048a354df8bbb2e40407d) @@ -1,24 +1,24 @@ /************************************************************************** * -* Copyright (c) 2019-2021 Diality Inc. - All Rights Reserved. +* Copyright (c) 2019-2022 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 +* @file SampleWater.c * -* @author (last) Quang Nguyen -* @date (last) 19-Feb-2021 +* @author (last) Quang Nguyen +* @date (last) 21-May-2021 * -* @author (original) Quang Nguyen -* @date (original) 19-Feb-2021 +* @author (original) Quang Nguyen +* @date (original) 19-Feb-2021 * ***************************************************************************/ #include "AlarmMgmt.h" #include "DGInterface.h" -#include "HDDefs.h" #include "SampleWater.h" +#include "SystemCommMessages.h" #include "TaskGeneral.h" /** @@ -28,24 +28,24 @@ // ********** private definitions ********** -#define MAX_FLUSH_TIME_COUNT ( 60 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Maximum flush time count relative to task general interval. +/// DG restarted alarm persistent interval +#define DG_RESTARTED_ALARM_PERSISTENT_INTERVAL ( ( 5 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) // ********** private data ********** -static BOOL sampleWaterStartRequested; -static BOOL sampleWaterStopRequested; -static BOOL sampleWaterTakenConfirm; +static BOOL sampleWaterStartRequested; ///< Flag indicates user has requested to start sample water. +static BOOL sampleWaterStopRequested; ///< Flag indicates user has requested to stop sample water. +static BOOL sampleWaterResultEntered; ///< Flag indicates user has entered sample water result. -static SAMPLE_WATER_STATE_T currentSampleWaterState; -static U32 flushTimerCounter; -static BOOL sampleWaterPassed; -static BOOL sampleWaterFailed; +static SAMPLE_WATER_STATE_T currentSampleWaterState; ///< Current state of sample water sub-mode. +static BOOL sampleWaterResult; ///< The result entered by user after testing water sample. +static U32 dgRestartedPersistentCount; ///< Persistent count for DG restarted alarm. // ********** private function prototypes ********** +static void hasDGRestarted( void ); static SAMPLE_WATER_STATE_T handleWaterSampleSetupState( void ); static SAMPLE_WATER_STATE_T handleWaterSampleState( void ); -static SAMPLE_WATER_STATE_T handleWaterSampleResultState( void ); /*********************************************************************//** * @brief @@ -58,12 +58,10 @@ { sampleWaterStartRequested = FALSE; sampleWaterStopRequested = FALSE; - sampleWaterTakenConfirm = FALSE; + sampleWaterResultEntered = FALSE; currentSampleWaterState = SAMPLE_WATER_SETUP_STATE; - flushTimerCounter = 0; - sampleWaterPassed = FALSE; - sampleWaterFailed = FALSE; + sampleWaterResult = FALSE; } /*********************************************************************//** @@ -99,12 +97,11 @@ currentSampleWaterState = handleWaterSampleState(); break; - case SAMPLE_WATER_RESULT_STATE: - currentSampleWaterState = handleWaterSampleResultState(); + case SAMPLE_WATER_COMPLETE_STATE: break; default: - // TODO: alarm + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_SAMPLE_WATER_INVALID_STATE, currentSampleWaterState ); break; } } @@ -123,29 +120,42 @@ /*********************************************************************//** * @brief - * The isSampleWaterPassed function returns the result of sample water. - * @details Inputs: sampleWaterPassed + * The getSampleWaterResult function returns the result from sample water testing. + * @details Inputs: sampleWaterResult * @details Outputs: none - * @return TRUE if sample water result passed, otherwise FALSE + * @return water sample self-test status *************************************************************************/ -BOOL isSampleWaterPassed( void ) +SELF_TEST_STATUS_T getSampleWaterResult( void ) { - return sampleWaterPassed; + SELF_TEST_STATUS_T result = SELF_TEST_STATUS_FAILED; + +#ifdef SKIP_SAMPLE_WATER + if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_SAMPLE_WATER ) != SW_CONFIG_ENABLE_VALUE ) + { + sampleWaterResult = TRUE; + } +#endif + if ( TRUE == sampleWaterResult ) + { + result = SELF_TEST_STATUS_PASSED; + } + + return result; } /*********************************************************************//** * @brief * The signalSampleWaterUserAction function signals a sample water user action * has been requested. The request is handled and responded to. * @details Inputs: none - * @details Outputs: action handled, request reponsed to + * @details Outputs: action handled, request responded to * @param action User action requested * @return none *************************************************************************/ void signalSampleWaterUserAction( REQUESTED_SAMPLE_WATER_USER_ACTIONS_T action ) { BOOL accepted = FALSE; - REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NONE; + REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE; // Reject user action requests if any alarm is currently active. User must clear alarm first. if ( FALSE == isAnyAlarmActive() ) @@ -157,23 +167,17 @@ { sampleWaterStopRequested = TRUE; accepted = TRUE; + rejReason = REQUEST_REJECT_REASON_NONE; } - else - { - rejReason = REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE; - } break; case REQUESTED_USER_ACTION_SAMPLE_WATER_START: if ( SAMPLE_WATER_STATE == currentSampleWaterState ) { sampleWaterStartRequested = TRUE; accepted = TRUE; + rejReason = REQUEST_REJECT_REASON_NONE; } - else - { - rejReason = REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE; - } break; default: @@ -191,6 +195,43 @@ /*********************************************************************//** * @brief + * The setSampleWaterResult function sets the sample water test result + * provided by the user. + * @details Inputs: none + * @details Outputs: action handled, request responded to + * @param result sample water test result + * @return none + *************************************************************************/ +void setSampleWaterResult( BOOL result ) +{ + sampleWaterResultEntered = TRUE; + sampleWaterResult = result; +} + +/*********************************************************************//** + * @brief + * The hasDGRestarted function checks if DG has restarted. + * @details Inputs: DG operation mode and operation sub-mode + * @details Outputs: alarm if DG restarted + * @return none + *************************************************************************/ +static void hasDGRestarted( void ) +{ + if ( ( DG_MODE_STAN == getDGOpMode() ) && ( DG_STANDBY_MODE_STATE_IDLE == getDGSubMode() ) ) + { + if ( dgRestartedPersistentCount++ >= DG_RESTARTED_ALARM_PERSISTENT_INTERVAL ) + { + activateAlarmNoData( ALARM_ID_DG_RESTARTED_FAULT ); + } + } + else + { + dgRestartedPersistentCount = 0; + } +} + +/*********************************************************************//** + * @brief * The handleWaterSampleSetupState function waits for filter flush period elapsed. * @details Inputs: flushTimerCounter * @details Outputs: none @@ -199,32 +240,34 @@ static SAMPLE_WATER_STATE_T handleWaterSampleSetupState( void ) { SAMPLE_WATER_STATE_T state = SAMPLE_WATER_SETUP_STATE; + DG_OP_MODE_T dgOpMode = getDGOpMode(); + U32 dgSubMode = getDGSubMode(); - if ( MAX_FLUSH_TIME_COUNT < flushTimerCounter++ ) + if ( ( DG_MODE_STAN == dgOpMode ) && ( DG_STANDBY_MODE_STATE_FLUSH_FILTER_IDLE == dgSubMode ) ) { state = SAMPLE_WATER_STATE; } + hasDGRestarted(); + return state; } /*********************************************************************//** * @brief - * The handleWaterSampleState function passes sample water commands from user - * down to DG. - * @details Inputs: sampleWaterTakenConfirm, sampleWaterStartRequested, sampleWaterStopRequested + * The handleWaterSampleState function processes sample water commands from user. + * @details Inputs: sampleWaterFailed, 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 ) + if ( TRUE == sampleWaterResultEntered ) { - sampleWaterTakenConfirm = FALSE; - state = SAMPLE_WATER_RESULT_STATE; + state = SAMPLE_WATER_COMPLETE_STATE; + sampleWaterResultEntered = FALSE; } if ( TRUE == sampleWaterStartRequested ) @@ -239,31 +282,9 @@ 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; - } + hasDGRestarted(); 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; -} - /**@}*/