Index: firmware/App/Controllers/Fans.c =================================================================== diff -u -r867eed1d3a71f8fac87ac6dece093a391663188a -r5addd92e279ebc0871364fee70e3ac74db21001a --- firmware/App/Controllers/Fans.c (.../Fans.c) (revision 867eed1d3a71f8fac87ac6dece093a391663188a) +++ firmware/App/Controllers/Fans.c (.../Fans.c) (revision 5addd92e279ebc0871364fee70e3ac74db21001a) @@ -186,6 +186,7 @@ // Monitor the RPM of the fans monitorFans(); + // Check for the publication time publishFansData(); } @@ -407,26 +408,27 @@ { if ( ++fansMonitorCounter >= FANS_MONITOR_INTERVAL_COUNT ) { - if ( FALSE == hasAlarmBeenRaised ) - { - FAN_NAMES_T fan; - BOOL isFanRPMOutOfRange = FALSE; - BOOL isAlarmTriggered = FALSE; - F32 rpm = 0.0; + FAN_NAMES_T fan; + BOOL isFanRPMOutOfRange = FALSE; + BOOL isAlarmTriggered = FALSE; + F32 rpm = 0.0; - // The RPM is expected to be 5500 @ 100% duty cycle - // The nominal RPM = duty cycle * 5500 / 1.0 - // The RPM tolerance is -25% to +50% of the nominal RPM - F32 fansNominalRPM = fansStatus.targetDutyCycle * FANS_MAX_ALLOWED_RPM; - F32 fansMinAllowedRPM = fansNominalRPM - ( fansNominalRPM * FANS_MIN_RPM_OUT_OF_RANGE_TOL ); - F32 fansMaxAllowedRPM = fansNominalRPM + ( fansNominalRPM * FANS_MAX_RPM_OUT_OF_RANGE_TOL ); + // The RPM is expected to be 5500 @ 100% duty cycle + // The nominal RPM = duty cycle * 5500 / 1.0 + // The RPM tolerance is -25% to +50% of the nominal RPM + F32 fansNominalRPM = fansStatus.targetDutyCycle * FANS_MAX_ALLOWED_RPM; + F32 fansMinAllowedRPM = fansNominalRPM - ( fansNominalRPM * FANS_MIN_RPM_OUT_OF_RANGE_TOL ); + F32 fansMaxAllowedRPM = fansNominalRPM + ( fansNominalRPM * FANS_MAX_RPM_OUT_OF_RANGE_TOL ); - for ( fan = FAN_INLET_1; fan < NUM_OF_FANS_NAMES; fan++ ) - { - rpm = getMeasuredFanRPM( fan ); - isFanRPMOutOfRange |= ( rpm < fansMinAllowedRPM ) || ( rpm > fansMaxAllowedRPM ); - } + // Loop through the fans and make sure the each of them have RPM in range + for ( fan = FAN_INLET_1; fan < NUM_OF_FANS_NAMES; fan++ ) + { + rpm = getMeasuredFanRPM( fan ); + isFanRPMOutOfRange |= ( ( rpm < fansMinAllowedRPM ) || ( rpm > fansMaxAllowedRPM ) ? TRUE : FALSE ); + } + if ( FALSE == hasAlarmBeenRaised ) + { isAlarmTriggered = isPersistentAlarmTriggered( ALARM_ID_HD_FAN_RPM_OUT_OF_RANGE, isFanRPMOutOfRange ); if ( TRUE == isAlarmTriggered ) @@ -449,6 +451,15 @@ hasAlarmBeenRaised = FALSE; rpmAlarmStartTimer = 0; } + else + { + // If the alarm has been raised and 24 hours has not elapsed, check if the fans RPM is back in range again + // If the fans RPM is in range again, clear the alarm + if ( FALSE == isFanRPMOutOfRange ) + { + clearAlarmCondition( ALARM_ID_HD_FAN_RPM_OUT_OF_RANGE ); + } + } fansMonitorCounter = 0; }