Index: firmware/App/Controllers/Fans.c =================================================================== diff -u -rddb9707d9e6e46c4b384782aeec20d41f3822996 -r22f1a58ac8e419353ec004b04e7c765c1d59df2b --- firmware/App/Controllers/Fans.c (.../Fans.c) (revision ddb9707d9e6e46c4b384782aeec20d41f3822996) +++ firmware/App/Controllers/Fans.c (.../Fans.c) (revision 22f1a58ac8e419353ec004b04e7c765c1d59df2b) @@ -52,7 +52,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. @@ -86,14 +86,16 @@ /*********************************************************************//** * @brief * The initFans function initializes the fans module. - * @details Inputs: fansExecState, fansStatus, fansControlCounter, - * fansPublishCounter + * @details Inputs: none * @details Outputs: fansExecState, fansStatus, fansControlCounter, - * fansPublishCounter + * fansPublishCounter, fansMonitorCounter, isPOSTComplete, hasAlarmBeenRaised, + * rpmAlarmStartTimer * @return none *************************************************************************/ void initFans( void ) { + FAN_NAMES_T fan; + // Initialize the variables fansExecState = FANS_EXEC_STATE_WAIT_FOR_POST_STATE; fansControlCounter = 0; @@ -103,6 +105,15 @@ hasAlarmBeenRaised = FALSE; rpmAlarmStartTimer = 0; + // 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_DG_FAN_RPM_OUT_OF_RANGE, FANS_MAX_ALLOWED_RPM_OUT_OF_RANGE_INTERVAL, FANS_MAX_ALLOWED_RPM_OUT_OF_RANGE_INTERVAL ); } @@ -171,12 +182,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 { @@ -380,12 +397,12 @@ // Otherwise, convert the pulse to RPM if ( togglePeriods[ fan ] == FANS_ZERO_RPM_TOGGLE_PERIOD_VALUE ) { - 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 ]; } } } @@ -417,8 +434,8 @@ for ( fan = FAN_INLET_1; fan < NUM_OF_FANS_NAMES; fan++ ) { - isFanRPMOutOfRange = ( fansStatus.rpm[ fan ] < fansMinAllowedRPM ) || ( fansStatus.rpm[ fan ] > fansMaxAllowedRPM ); - checkPersistentAlarm( ALARM_ID_DG_FAN_RPM_OUT_OF_RANGE, isFanRPMOutOfRange, fansStatus.rpm[ fan ], FANS_MAX_ALLOWED_RPM ); + isFanRPMOutOfRange = ( getMeasuredFanRPM( fan ) < fansMinAllowedRPM ) || ( getMeasuredFanRPM( fan ) > fansMaxAllowedRPM ); + checkPersistentAlarm( ALARM_ID_DG_FAN_RPM_OUT_OF_RANGE, isFanRPMOutOfRange, getMeasuredFanRPM( fan ), FANS_MAX_ALLOWED_RPM ); // 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_DG_FAN_RPM_OUT_OF_RANGE ) ? TRUE : FALSE ); @@ -473,12 +490,12 @@ FANS_DATA_T fansData; fansData.fansTargetDutyCycle = fansStatus.targetDutyCycle * FRACTION_TO_PERCENT_FACTOR; - fansData.fanInlet1RPM = fansStatus.rpm[ FAN_INLET_1 ]; - fansData.fanInlet2RPM = fansStatus.rpm[ FAN_INLET_2 ]; - fansData.fanInlet3RPM = fansStatus.rpm[ FAN_INLET_3 ]; - fansData.fanOutlet1RPM = fansStatus.rpm[ FAN_OUTLET_1 ]; - fansData.fanOutlet2RPM = fansStatus.rpm[ FAN_OUTLET_2 ]; - fansData.fanOutlet3RPM = fansStatus.rpm[ FAN_OUTLET_3 ]; + fansData.fanInlet1RPM = getMeasuredFanRPM( FAN_INLET_1 ); + fansData.fanInlet2RPM = getMeasuredFanRPM( FAN_INLET_2 ); + fansData.fanInlet3RPM = getMeasuredFanRPM( FAN_INLET_3 ); + fansData.fanOutlet1RPM = getMeasuredFanRPM( FAN_OUTLET_1 ); + fansData.fanOutlet2RPM = getMeasuredFanRPM( FAN_OUTLET_2 ); + fansData.fanOutlet3RPM = getMeasuredFanRPM( FAN_OUTLET_3 ); broadcastFansData( &fansData ); @@ -539,4 +556,55 @@ 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; +} + /**@}*/