Index: firmware/App/Controllers/DrainPump.c =================================================================== diff -u -r8c8270dec772e34287a3825e6023ebf73b1e1e53 -rd820d5e017e04ee5a7060e367750df1bfe39d2ca --- firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision 8c8270dec772e34287a3825e6023ebf73b1e1e53) +++ firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision d820d5e017e04ee5a7060e367750df1bfe39d2ca) @@ -1,14 +1,14 @@ /************************************************************************** * -* Copyright (c) 2020-2023 Diality Inc. - All Rights Reserved. +* Copyright (c) 2020-2024 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 DrainPump.c * * @author (last) Dara Navaei -* @date (last) 09-Aug-2023 +* @date (last) 18-Mar-2024 * * @author (original) Sean * @date (original) 08-Apr-2020 @@ -87,6 +87,7 @@ #define DRAIN_PUMP_FORWARD_DIR 1 ///< Drain pump forward direction. #define DRAIN_PUMP_DIR_BIT_MASK 0x80 ///< Drain pump direction bit clear mask. #define DRAIN_PUMP_DIR_ERROR_CNT_BIT_MASK 0x3F ///< Drain pump direction error count bit mask. +#define DRAIN_PUMP_MIN_RPM_FOR_DIR_CHECK 100 ///< Drain pump minimum RPM for direction check. #define MAX_FPGA_DRAIN_PUMP_DIRECTION_FAULT_WINDOW_MS ( 1 * SEC_PER_MIN * MS_PER_SECOND ) ///< FPGA drain pump direction fault window #define MAX_FPGA_DRAIN_PUMP_DIRECTION_FAULT_FAILURES 10 ///< FPGA drain pump direction fault failures per MAX_FPGA_DRAIN_PUMP_DIRECTION_FAULT_WINDOW_MS @@ -198,7 +199,6 @@ // initialize FPGA drain pump hall sensor error initTimeWindowedCount( TIME_WINDOWED_COUNT_FPGA_DRAIN_PUMP_HALL_SENSOR_ERROR, MAX_FPGA_DRAIN_PUMP_DIRECTION_FAULT_FAILURES, MAX_FPGA_DRAIN_PUMP_DIRECTION_FAULT_WINDOW_MS); - } /*********************************************************************//** @@ -359,18 +359,13 @@ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_DRAIN_PUMP_MONITOR ) != SW_CONFIG_ENABLE_VALUE ) #endif { -#ifndef _RELEASE_ - if ( getHardwareConfigStatus() != HW_CONFIG_BETA ) -#endif + if ( dirHallSensorErrorCount != lastDirHallSensorErrorCount ) { - if ( dirHallSensorErrorCount != lastDirHallSensorErrorCount ) + if ( TRUE == incTimeWindowedCount( TIME_WINDOWED_COUNT_FPGA_DRAIN_PUMP_HALL_SENSOR_ERROR ) ) { - if ( TRUE == incTimeWindowedCount( TIME_WINDOWED_COUNT_FPGA_DRAIN_PUMP_HALL_SENSOR_ERROR ) ) - { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_DRAIN_PUMP_DIRECTION_FPGA_FAULT, MAX_FPGA_DRAIN_PUMP_DIRECTION_FAULT_FAILURES, dirHallSensorErrorCount ) - } - lastDirHallSensorErrorCount = dirHallSensorErrorCount; + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_DRAIN_PUMP_DIRECTION_FPGA_FAULT, MAX_FPGA_DRAIN_PUMP_DIRECTION_FAULT_FAILURES, dirHallSensorErrorCount ) } + lastDirHallSensorErrorCount = dirHallSensorErrorCount; } switch( drainPumpState ) @@ -385,19 +380,13 @@ checkPersistentAlarm( ALARM_ID_DG_DRAIN_PUMP_RPM_OUT_OF_RANGE, FALSE, getDrainPumpMeasuredRPM( DRAIN_PUMP_MAXON_SNSR_FB ), MAX_ALLOWED_OPEN_LOOP_RPM_OUT_OF_RANGE ); checkPersistentAlarm( ALARM_ID_DG_DRAIN_PUMP_OFF_FAULT, isRPMTooHigh, getDrainPumpMeasuredRPM( DRAIN_PUMP_MAXON_SNSR_FB ), MIN_DRAIN_PUMP_RPM ); + checkPersistentAlarm( ALARM_ID_DG_DRAIN_PUMP_DIRECTION_INVALID, FALSE, getFPGADrainPumpDirection(), DRAIN_PUMP_FORWARD_DIR ); // If the off fault alarm has become active, trigger the safety shutdown if ( TRUE == isAlarmActive( ALARM_ID_DG_DRAIN_PUMP_OFF_FAULT ) ) { activateSafetyShutdown(); } - -#ifndef _RELEASE_ - if ( getHardwareConfigStatus() != HW_CONFIG_BETA ) -#endif - { - checkPersistentAlarm( ALARM_ID_DG_DRAIN_PUMP_DIRECTION_INVALID, FALSE, getFPGADrainPumpDirection(), DRAIN_PUMP_FORWARD_DIR ); - } } break; @@ -408,42 +397,26 @@ U32 rpmMaxon = getDrainPumpMeasuredRPM( DRAIN_PUMP_MAXON_SNSR_FB ); BOOL isRPMOutOfRange = FALSE; U32 direction = getDrainPumpMeasuredDirection(); - BOOL isDirInvalid = ( direction != DRAIN_PUMP_FORWARD_DIR ? TRUE : FALSE ); + BOOL isDirInvalid = ( ( direction != DRAIN_PUMP_FORWARD_DIR ) && ( rpmMaxon > DRAIN_PUMP_MIN_RPM_FOR_DIR_CHECK ) ? TRUE : FALSE ); // Make sure the pump is running prior to checking the direction error U32 rpmHallDiff = abs( getDrainPumpTargetRPM() - rpmHall ); U32 rpmMaxonDiff = abs( getDrainPumpTargetRPM() - rpmMaxon ); isRPMOutOfRange |= ( rpmHallDiff > MAX_ALLOWED_OPEN_LOOP_RPM_OUT_OF_RANGE ? TRUE : FALSE ); + isRPMOutOfRange |= ( rpmMaxonDiff > MAX_ALLOWED_OPEN_LOOP_RPM_OUT_OF_RANGE ? TRUE : FALSE ); -#ifndef _RELEASE_ - if ( getHardwareConfigStatus() != HW_CONFIG_BETA ) -#endif - { - isRPMOutOfRange |= ( rpmMaxonDiff > MAX_ALLOWED_OPEN_LOOP_RPM_OUT_OF_RANGE ? TRUE : FALSE ); - } - checkPersistentAlarm( ALARM_ID_DG_DRAIN_PUMP_RPM_OUT_OF_RANGE, isRPMOutOfRange, rpmHall, MAX_ALLOWED_OPEN_LOOP_RPM_OUT_OF_RANGE ); checkPersistentAlarm( ALARM_ID_DG_DRAIN_PUMP_OFF_FAULT, FALSE, rpmHall, MIN_DRAIN_PUMP_RPM ); - -#ifndef _RELEASE_ - if ( getHardwareConfigStatus() != HW_CONFIG_BETA ) -#endif - { - checkPersistentAlarm( ALARM_ID_DG_DRAIN_PUMP_DIRECTION_INVALID, isDirInvalid, (F32)direction, DRAIN_PUMP_FORWARD_DIR ); - } + checkPersistentAlarm( ALARM_ID_DG_DRAIN_PUMP_DIRECTION_INVALID, isDirInvalid, (F32)direction, DRAIN_PUMP_FORWARD_DIR ); } break; case DRAIN_PUMP_CONTROL_TO_TARGET_STATE: { U32 direction = getDrainPumpMeasuredDirection(); - BOOL isDirInvalid = ( direction != DRAIN_PUMP_FORWARD_DIR ? TRUE : FALSE ); + U32 rpmMaxon = getDrainPumpMeasuredRPM( DRAIN_PUMP_MAXON_SNSR_FB ); + BOOL isDirInvalid = ( ( direction != DRAIN_PUMP_FORWARD_DIR ) && ( rpmMaxon > DRAIN_PUMP_MIN_RPM_FOR_DIR_CHECK ) ? TRUE : FALSE ); -#ifndef _RELEASE_ - if ( getHardwareConfigStatus() != HW_CONFIG_BETA ) -#endif - { - checkPersistentAlarm( ALARM_ID_DG_DRAIN_PUMP_DIRECTION_INVALID, isDirInvalid, (F32)direction, DRAIN_PUMP_FORWARD_DIR ); - } + checkPersistentAlarm( ALARM_ID_DG_DRAIN_PUMP_DIRECTION_INVALID, isDirInvalid, (F32)direction, DRAIN_PUMP_FORWARD_DIR ); } break; @@ -455,15 +428,10 @@ break; } -#ifndef _RELEASE_ - if ( getHardwareConfigStatus() != HW_CONFIG_BETA ) -#endif - { - // Check the persistent alarm for the maximum drain pump current - isCurrentOutOfRange = ( currentA > DRAIN_PUMP_MAX_CURRENT_A ? TRUE : FALSE ) | isOffCurrentOut; + // Check the persistent alarm for the maximum drain pump current + isCurrentOutOfRange = ( currentA > DRAIN_PUMP_MAX_CURRENT_A ? TRUE : FALSE ) | isOffCurrentOut; - checkPersistentAlarm( ALARM_ID_DG_DRAIN_PUMP_CURRENT_OUT_OF_RANGE, isCurrentOutOfRange, currentA, DRAIN_PUMP_MAX_CURRENT_A ); - } + checkPersistentAlarm( ALARM_ID_DG_DRAIN_PUMP_CURRENT_OUT_OF_RANGE, isCurrentOutOfRange, currentA, DRAIN_PUMP_MAX_CURRENT_A ); } // Publish drain pump data on interval