Index: firmware/App/Controllers/Fans.c =================================================================== diff -u -rf5f00981805e265ce63058f650d784f06db4d188 -r98e24f0db83de34e3d44c4bd72df9f506f8ceddc --- firmware/App/Controllers/Fans.c (.../Fans.c) (revision f5f00981805e265ce63058f650d784f06db4d188) +++ firmware/App/Controllers/Fans.c (.../Fans.c) (revision 98e24f0db83de34e3d44c4bd72df9f506f8ceddc) @@ -51,7 +51,7 @@ typedef struct { F32 targetDutyCycle; ///< Fan's target duty cycle that was fed to the fans - U32 rpm[ NUM_OF_FANS_NAMES ]; ///< Fan's current tachometers reading in RPM + OVERRIDE_F32_T rpm[ NUM_OF_FANS_NAMES ]; ///< Fan's current tachometers reading in RPM } FAN_STATUS_T; static FAN_STATUS_T fansStatus; ///< Fans status. @@ -85,11 +85,13 @@ * The initFans function initializes the fans module. * @details Inputs: none * @details Outputs: fansExecState, fansMonitorCounter, fansControlCounter, - * fansPublishCounter, isPOSTComplete + * fansPublishCounter, isPOSTComplete, hasAlarmBeenRaised, fansStatus * @return none *************************************************************************/ void initFans( void ) { + FAN_NAMES_T fan; + // Initialize the variables fansExecState = FANS_EXEC_STATE_WAIT_FOR_POST_STATE; fansControlCounter = 0; @@ -98,6 +100,15 @@ isPOSTComplete = FALSE; hasAlarmBeenRaised = FALSE; + // Initialize the fans + for ( fan = FAN_INLET_1; fan < NUM_OF_FANS_NAMES; fan++ ) + { + fansStatus.rpm[ fan ].data = 0.0; + fansStatus.rpm[ fan ].ovData = 0.0; + fansStatus.rpm[ fan ].ovInitData = 0.0; + fansStatus.rpm[ fan ].override = OVERRIDE_RESET; + } + // Initialize a persistent alarm for fans RPM out of range initPersistentAlarm( ALARM_ID_HD_FAN_RPM_OUT_OF_RANGE, FANS_MAX_ALLOWED_RPM_OUT_OF_RANGE_INTERVAL, FANS_MAX_ALLOWED_RPM_OUT_OF_RANGE_INTERVAL ); } @@ -166,12 +177,18 @@ *************************************************************************/ F32 getMeasuredFanRPM( FAN_NAMES_T fan ) { - F32 rpm = 0.0; + F32 rpm; // Check if the called fan is in range if ( fan < NUM_OF_FANS_NAMES ) { - rpm = fansStatus.rpm[ fan ]; + // Assume there is no override + rpm = fansStatus.rpm[ fan ].data; + + if ( OVERRIDE_KEY == fansStatus.rpm[ fan ].override ) + { + rpm = fansStatus.rpm[ fan ].ovData; + } } else { @@ -344,12 +361,12 @@ // Otherwise, convert the pulse to RPM if ( FANS_ZERO_RPM_TOGGLE_PERIOD_VALUE == togglePeriods[ fan ] ) { - fansStatus.rpm[ fan ] = 0; + fansStatus.rpm[ fan ].data = 0; } else { // Convert toggle period to RPM - fansStatus.rpm[ fan ] = TOGGLE_PERIOD_2_RPM_COEFFICIENT / togglePeriods[ fan ]; + fansStatus.rpm[ fan ].data = TOGGLE_PERIOD_2_RPM_COEFFICIENT / togglePeriods[ fan ]; } } } @@ -380,7 +397,7 @@ for ( fan = FAN_INLET_1; fan < NUM_OF_FANS_NAMES; fan++ ) { - isFanRPMOutOfRange = ( fansStatus.rpm[ fan ] < fansMinAllowedRPM ) || ( fansStatus.rpm[ fan ] > fansMaxAllowedRPM ); + isFanRPMOutOfRange = ( getMeasuredFanRPM( fan ) < fansMinAllowedRPM ) || ( getMeasuredFanRPM( fan ) > fansMaxAllowedRPM ); isPersistentAlarmTriggered( ALARM_ID_DG_FAN_RPM_OUT_OF_RANGE, isFanRPMOutOfRange ); // If the RPM out of range alarm has been raised, do not raise it again, until its alarm silence time has been elapsed @@ -426,7 +443,7 @@ FANS_DATA_T fansData; fansData.fansTargetDutyCycle = fansStatus.targetDutyCycle * FRACTION_TO_PERCENT_FACTOR; - fansData.fanInlet1RPM = fansStatus.rpm[ FAN_INLET_1 ]; + fansData.fanInlet1RPM = getMeasuredFanRPM( FAN_INLET_1 ); broadcastFansData( &fansData ); @@ -487,5 +504,56 @@ return result; } +/*********************************************************************//** + * @brief + * The testSetFanRPMOverride function overrides the RPM of a fan. + * @details Inputs: none + * @details Outputs: fansStatus + * @param fanId fan ID + * @param rpm the RPM override value + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetFanRPMOverride( U32 fanId, F32 rpm ) +{ + BOOL result = FALSE; + + if ( fanId < NUM_OF_FANS_NAMES ) + { + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + fansStatus.rpm[ fanId ].ovData = rpm; + fansStatus.rpm[ fanId ].override = OVERRIDE_KEY; + } + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetFanRPMOverride function resets the override value of a fan. + * @details Inputs: none + * @details Outputs: fansStatus + * @param fanId fan index + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testResetFanRPMOverride( U32 fanId ) +{ + BOOL result = FALSE; + + if ( fanId < NUM_OF_FANS_NAMES ) + { + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + fansStatus.rpm[ fanId ].ovData = fansStatus.rpm[ fanId ].ovInitData; + fansStatus.rpm[ fanId ].override = OVERRIDE_RESET; + } + } + + return result; +} + /**@}*/