Index: firmware/App/Controllers/Fans.c =================================================================== diff -u -rfe4bcb2c7b5a0ef8d30fd84750ec2c4256db03e2 -r4a9872d81bae53492c124d0378028ece422f1b4d --- firmware/App/Controllers/Fans.c (.../Fans.c) (revision fe4bcb2c7b5a0ef8d30fd84750ec2c4256db03e2) +++ firmware/App/Controllers/Fans.c (.../Fans.c) (revision 4a9872d81bae53492c124d0378028ece422f1b4d) @@ -394,8 +394,10 @@ { if ( FALSE == hasAlarmBeenRaised ) { - BOOL isFanRPMOutOfRange; 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 @@ -406,17 +408,24 @@ for ( fan = FAN_INLET_1; fan < NUM_OF_FANS_NAMES; fan++ ) { - isFanRPMOutOfRange = ( getMeasuredFanRPM( fan ) < fansMinAllowedRPM ) || ( getMeasuredFanRPM( fan ) > fansMaxAllowedRPM ); - isPersistentAlarmTriggered( ALARM_ID_HD_FAN_RPM_OUT_OF_RANGE, isFanRPMOutOfRange ); + rpm = getMeasuredFanRPM( fan ); + isFanRPMOutOfRange |= ( rpm < fansMinAllowedRPM ) || ( rpm > fansMaxAllowedRPM ); + } - // If the RPM out of range alarm has been raised, do not raise it again, until its alarm silence time has been elapsed - hasAlarmBeenRaised = ( TRUE == isAlarmActive( ALARM_ID_HD_FAN_RPM_OUT_OF_RANGE ) ? TRUE : FALSE ); + isAlarmTriggered = isPersistentAlarmTriggered( ALARM_ID_HD_FAN_RPM_OUT_OF_RANGE, isFanRPMOutOfRange ); - if ( ( TRUE == hasAlarmBeenRaised ) && ( 0 == rpmAlarmStartTimer ) ) - { - rpmAlarmStartTimer = getMSTimerCount(); - } + if ( TRUE == isAlarmTriggered ) + { + ALARM_DATA_T alarmData; + alarmData.data.flt.data = rpm; + activateAlarm1Data( ALARM_ID_HD_FAN_RPM_OUT_OF_RANGE, alarmData ); + hasAlarmBeenRaised = TRUE; } + + if ( ( TRUE == hasAlarmBeenRaised ) && ( 0 == rpmAlarmStartTimer ) ) + { + rpmAlarmStartTimer = getMSTimerCount(); + } } else if ( ( TRUE == hasAlarmBeenRaised ) && ( TRUE == didTimeout( rpmAlarmStartTimer, SECONDS_IN_A_DAY ) ) ) {