Index: firmware/App/Controllers/Fans.c =================================================================== diff -u -r72376b7008cfe0e1a8213b547116561d28acd55a -ra89d6b091874136d75a9bfbdbbc1ff00f42467b3 --- firmware/App/Controllers/Fans.c (.../Fans.c) (revision 72376b7008cfe0e1a8213b547116561d28acd55a) +++ firmware/App/Controllers/Fans.c (.../Fans.c) (revision a89d6b091874136d75a9bfbdbbc1ff00f42467b3) @@ -1,14 +1,14 @@ /************************************************************************** * -* Copyright (c) 2019-2022 Diality Inc. - All Rights Reserved. +* Copyright (c) 2020-2022 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 Fans.c * -* @author (last) Dara Navaei -* @date (last) 05-Jan-2022 +* @author (last) Sean Nash +* @date (last) 15-Jul-2022 * * @author (original) Dara Navaei * @date (original) 25-Nov-2020 @@ -36,28 +36,28 @@ // ********** private definitions ********** -#define FANS_MIN_DUTY_CYCLE 0.1 ///< Fans min PWM. -#define FANS_MAX_DUTY_CYCLE 0.95 ///< Fans max PWM. +#define FANS_MIN_DUTY_CYCLE 0.1F ///< Fans min PWM. +#define FANS_MAX_DUTY_CYCLE 0.95F ///< Fans max PWM. #define MIN_ALLOWED_AMBIENT_TEMPERATURE 20 ///< Min allowed ambient temperature. #define MAX_ALLOWED_AMBINET_TEMPERATURE 70 ///< Max allowed ambient temperature. -#define FANS_MAX_ALLOWED_RAMP_UP_DELTA_DUTY_CYCLE 0.3 ///< Fans max allowed ramp up PWM change. -#define FANS_MAX_ALLOWED_RAMP_DOWN_DELTA_DUTY_CYCLE 0.005 ///< Fans min allowed ramp down PWM change. +#define FANS_MAX_ALLOWED_RAMP_UP_DELTA_DUTY_CYCLE 0.3F ///< Fans max allowed ramp up PWM change. +#define FANS_MAX_ALLOWED_RAMP_DOWN_DELTA_DUTY_CYCLE 0.005F ///< Fans min allowed ramp down PWM change. -#define TOGGLE_PERIOD_RESOLUTION_SECONDS 0.0000025 ///< FPGA fans toggle period resolution in micro seconds. +#define TOGGLE_PERIOD_RESOLUTION_SECONDS 0.0000025F ///< FPGA fans toggle period resolution in micro seconds. #define ROTATIONAL_TO_TOGGLE_PERIOD_CONVERSION 4 ///< FPGA rotational to toggle period conversion coefficient. #define FANS_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Fans publish data time interval in counts. #define FANS_CONTROL_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Fans control time interval in counts. #define FANS_ZERO_RPM_TOGGLE_PERIOD_VALUE 0xFFFF ///< Fans zero RPM toggle period value. #define MIN_TARGET_RPM_IN_SELF_TEST 1000 ///< Fans min target RPM that they should be during POST. #define FANS_SELF_TEST_WAIT_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Fans self test wait time for the fans to get to RPM. -#define FANS_SELF_TEST_TARGET_PWM 0.5 ///< Fans self test target PWM for testing the fans are running. +#define FANS_SELF_TEST_TARGET_PWM 0.5F ///< Fans self test target PWM for testing the fans are running. #define FANS_MAX_ALLOWED_RPM_OUT_OF_RANGE_INTERVAL ( 3 * MS_PER_SECOND ) ///< Fans max allowed RPM out of range time interval. #define FANS_MAX_ALLOWED_RPM 5500 ///< Fans max allowed RPM value. #define FANS_MIN_ALLOWED_RPM 150 ///< Fans max allowed RPM value. -#define FANS_MIN_RPM_OUT_OF_RANGE_TOL 0.25 ///< Fans min RPM out of range tolerance. -#define FANS_MAX_RPM_OUT_OF_RANGE_TOL 0.5 ///< Fans max RPM out of range tolerance. -#define DATA_PUBLISH_COUNTER_START_COUNT 4 ///< Data publish counter start count. +#define FANS_MIN_RPM_OUT_OF_RANGE_TOL 0.25F ///< Fans min RPM out of range tolerance. +#define FANS_MAX_RPM_OUT_OF_RANGE_TOL 0.5F ///< Fans max RPM out of range tolerance. +#define DATA_PUBLISH_COUNTER_START_COUNT 12 ///< Data publish counter start count. /// Fans exec states typedef enum fans_Exec_States @@ -75,13 +75,15 @@ OVERRIDE_F32_T rpm[ NUM_OF_FANS_NAMES ]; ///< Fan's current tachometers reading in RPM. } FAN_STATUS_T; +// ********** private data ********** + static FAN_STATUS_T fansStatus; ///< Fans status. static FANS_EXEC_STATES_T fansExecState = FANS_EXEC_STATE_WAIT_FOR_POST_STATE; ///< Fans exec state. static U32 fansControlCounter = 0; ///< Fans control interval counter. static U32 fansPublishCounter; ///< Fans data publish interval counter. static BOOL isPOSTComplete = FALSE; ///< Flag that indicates whether POST is complete or not. static BOOL hasAlarmBeenRaised = FALSE; ///< Flag that indicates whether the RPM out of range alarm been raise. -static OVERRIDE_U32_T rpmAlarmStartTimeOffset = { 0, 0, 0, 0 }; ///< RPM out of range alarm start time offset. +static U32 rpmAlarmStartTimeOffset; ///< RPM out of range alarm start time offset. static U32 rpmAlarmStartTime = 0; ///< RPM alarm start time. static DG_FANS_CAL_RECORD_T fansCalReocrd; ///< Fans calibration record. @@ -93,6 +95,8 @@ static OVERRIDE_U32_T fansPublishInterval = { FANS_DATA_PUBLISH_INTERVAL, FANS_DATA_PUBLISH_INTERVAL, 0, 0 }; ///< Fans publish time interval override. +// ********** private function prototypes ********** + static FANS_EXEC_STATES_T handleExecStateWaitForPOST( void ); static FANS_EXEC_STATES_T handleExecStateRun( void ); @@ -101,7 +105,6 @@ static F32 getMaximumTemperature( void ); static void convertTogglePeriod2RPM( void ); static void monitorFans( void ); -static U32 getRPMAlarmStartTimeOffset( void ); static void publishFansData( void ); /*********************************************************************//** @@ -118,25 +121,22 @@ FAN_NAMES_T fan; // Initialize the variables - fansExecState = FANS_EXEC_STATE_WAIT_FOR_POST_STATE; - fansControlCounter = 0; - fansPublishCounter = DATA_PUBLISH_COUNTER_START_COUNT; - isPOSTComplete = FALSE; - hasAlarmBeenRaised = FALSE; - rpmAlarmStartTime = 0; - rpmAlarmStartTimeOffset.data = 0; - rpmAlarmStartTimeOffset.ovData = 0; - rpmAlarmStartTimeOffset.ovInitData = 0; - rpmAlarmStartTimeOffset.override = OVERRIDE_RESET; + fansExecState = FANS_EXEC_STATE_WAIT_FOR_POST_STATE; + fansControlCounter = 0; + fansPublishCounter = DATA_PUBLISH_COUNTER_START_COUNT; + isPOSTComplete = FALSE; + hasAlarmBeenRaised = FALSE; + rpmAlarmStartTime = 0; + rpmAlarmStartTimeOffset = 0; + fansStatus.dutyCycle.data = 0.0; + fansStatus.dutyCycle.ovData = 0.0; + fansStatus.dutyCycle.ovInitData = 0.0; + fansStatus.dutyCycle.override = OVERRIDE_RESET; + fansStatus.targetRPM = 0.0; // Initialize the fans for ( fan = FAN_INLET_1; fan < NUM_OF_FANS_NAMES; fan++ ) { - fansStatus.dutyCycle.data = 0.0; - fansStatus.dutyCycle.ovData = 0.0; - fansStatus.dutyCycle.ovInitData = 0.0; - fansStatus.dutyCycle.override = OVERRIDE_RESET; - fansStatus.targetRPM = 0.0; fansStatus.rpm[ fan ].data = 0.0; fansStatus.rpm[ fan ].ovData = 0.0; fansStatus.rpm[ fan ].ovInitData = 0.0; @@ -479,7 +479,7 @@ for ( fan = FAN_INLET_1; fan < NUM_OF_FANS_NAMES; fan++ ) { rpm = getMeasuredFanRPM( fan ); - isFanRPMOutOfRange |= ( ( fabs( rpm - fansMinAllowedRPM ) < NEARLY_ZERO ) || ( fabs( rpm - fansMaxAllowedRPM ) > NEARLY_ZERO ) ? TRUE : FALSE ); + isFanRPMOutOfRange |= ( ( rpm < fansMinAllowedRPM ) || ( ( rpm > fansMaxAllowedRPM ) ) ? TRUE : FALSE ); } // If the fans alarm has been raised already, do not raise again @@ -492,39 +492,28 @@ SET_ALARM_WITH_1_F32_DATA( ALARM_ID_DG_FAN_RPM_OUT_OF_RANGE, rpm ) // Set the alarm flag to TRUE hasAlarmBeenRaised = TRUE; + + // If the alarm has been raised but the start time of the alarm has not been set, set the alarm start timer + if ( 0 == rpmAlarmStartTime ) + { + rpmAlarmStartTime = getMSTimerCount(); + } } - // If the alarm has been raised but the start time of the alarm has not been set, set the alarm start timer - if ( ( TRUE == hasAlarmBeenRaised ) && ( 0 == rpmAlarmStartTime ) ) - { - rpmAlarmStartTime = getMSTimerCount(); - } } - // If the alarm has been raised the silence the alarm time has elapsed, get ready to raise the alarm in case the RPM was out of range - // Once the alarm is raised, it is not raised again for 24 hours - else if ( ( TRUE == hasAlarmBeenRaised ) && ( ( calcTimeSince( rpmAlarmStartTime ) + getRPMAlarmStartTimeOffset() ) >= SECONDS_IN_A_DAY * MS_PER_SECOND ) ) + // If the alarm has been raised and the alarm has been silent for at least a day, set the flag to FALSE + // This way, if the fans RPM are out of range the alarm will be raised again. This alarm is supposed to be raised + // and remain silent for a defined period of time. + else { - hasAlarmBeenRaised = FALSE; - rpmAlarmStartTime = 0; - } -} + S32 elapsedTime = rpmAlarmStartTime - rpmAlarmStartTimeOffset; -/*********************************************************************//** - * @brief - * The getRPMAlarmStartTimeOffset function gets the RPM alarm start time offset in MS. - * @details Inputs: rpmAlarmStartTimeOffset - * @details Outputs: none - * @return the RPM alarm start time offset - *************************************************************************/ -static U32 getRPMAlarmStartTimeOffset( void ) -{ - U32 startTime = rpmAlarmStartTimeOffset.data; - - if ( OVERRIDE_KEY == rpmAlarmStartTimeOffset.override ) - { - startTime = rpmAlarmStartTimeOffset.ovData; + if ( calcTimeSince( elapsedTime ) >= SECONDS_IN_A_DAY * MS_PER_SECOND ) + { + hasAlarmBeenRaised = FALSE; + rpmAlarmStartTime = 0; + rpmAlarmStartTimeOffset = 0; + } } - - return startTime; } /*********************************************************************//** @@ -549,11 +538,11 @@ fansData.fanOutlet1RPM = getMeasuredFanRPM( FAN_OUTLET_1 ); fansData.fanOutlet2RPM = getMeasuredFanRPM( FAN_OUTLET_2 ); fansData.fanOutlet3RPM = getMeasuredFanRPM( FAN_OUTLET_3 ); - fansData.rpmAlarmTimeOffset = getRPMAlarmStartTimeOffset(); + fansData.rpmAlarmTimeOffset = calcTimeSince( rpmAlarmStartTime - rpmAlarmStartTimeOffset ); broadcastData( MSG_ID_DG_FANS_DATA, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&fansData, sizeof( FANS_DATA_T ) ); - fansPublishCounter = DATA_PUBLISH_COUNTER_START_COUNT; + fansPublishCounter = 0; } } @@ -663,55 +652,27 @@ /*********************************************************************//** * @brief - * The testSetFanRPMAlarmStartTimeOffsetOverride function overrides the RPM alarm - * start time offset. + * The testSetFanRPMAlarmStartTimestamp function set the fan RPM alarm start + * time offset. * @details Inputs: none * @details Outputs: rpmAlarmStartTimeOffset - * @param hours hours to override - * @param minutes minutes to override + * @param milliSeconds the milliseconds the time to be offset * @return TRUE if override successful, FALSE if not *************************************************************************/ -BOOL testSetFanRPMAlarmStartTimeOffsetOverride( U32 hours, U32 minutes ) +BOOL testSetFanRPMAlarmStartTimestamp( U32 milliSeconds ) { BOOL result = FALSE; if ( TRUE == isTestingActivated() ) { - rpmAlarmStartTimeOffset.ovData = ( ( hours * MIN_PER_HOUR * SEC_PER_MIN ) + ( minutes * SEC_PER_MIN ) ) * MS_PER_SECOND; - rpmAlarmStartTimeOffset.override = OVERRIDE_KEY; - - result = TRUE; + rpmAlarmStartTimeOffset = milliSeconds; } return result; } /*********************************************************************//** * @brief - * The testResetFanRPMAlarmStartTimeOffsetOverride function resets the RPM alarm - * start time offset override. - * @details Inputs: none - * @details Outputs: rpmAlarmStartTimeOffset - * @return TRUE if override successful, FALSE if not - *************************************************************************/ -BOOL testResetFanRPMAlarmStartTimeOffsetOverride( void ) -{ - BOOL result = FALSE; - - if ( TRUE == isTestingActivated() ) - { - rpmAlarmStartTimeOffset.override = OVERRIDE_RESET; - rpmAlarmStartTimeOffset.ovData = 0; - rpmAlarmStartTimeOffset.data = 0; - - result = TRUE; - } - - return result; -} - -/*********************************************************************//** - * @brief * The testSetFansDutyCycleOverride function overrides fans duty cycle * @details Inputs: none * @details Outputs: fansStatus