Index: firmware/App/Controllers/Fans.c =================================================================== diff -u -r2f2d0ccadd8a09037eb3d0dd144549b2c8c8129b -r45263215b372cd579e8e16bb8073c287c726c55d --- firmware/App/Controllers/Fans.c (.../Fans.c) (revision 2f2d0ccadd8a09037eb3d0dd144549b2c8c8129b) +++ firmware/App/Controllers/Fans.c (.../Fans.c) (revision 45263215b372cd579e8e16bb8073c287c726c55d) @@ -12,25 +12,26 @@ // ********** private definitions ********** -#define FANS_MIN_PWM_PERCENT 0.1 ///< Fans min PWM. -#define FANS_MAX_PWM_PERCENT 0.95 ///< 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_PWM_CHANGE 0.3 ///< Fans max allowed ramp up PWM change. -#define FANS_MAX_ALLOWED_RAMP_DOWN_PWM_CHANGE 0.005 ///< Fans min allowed ramp down PWM change. +#define FANS_MIN_PWM_PERCENT 0.1 ///< Fans min PWM. +#define FANS_MAX_PWM_PERCENT 0.95 ///< 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_PWM_CHANGE 0.3 ///< Fans max allowed ramp up PWM change. +#define FANS_MAX_ALLOWED_RAMP_DOWN_PWM_CHANGE 0.005 ///< Fans min allowed ramp down PWM change. -#define ONE_MINUTE_TO_MICRO_SECONDS 60000000 ///< One minute to micro seconds conversion. -#define TOGGLE_PERIOD_RESOLUTION 2.5 ///< FPGA fans toggle period resolution in micro seconds. -#define ROTATIONAL_TO_TOGGLE_PERIOD_CONVERSION_COEFF 4 ///< FPGA rotational to toggle period conversion coefficient. +#define ONE_MINUTE_TO_MICRO_SECONDS 60000000 ///< One minute to micro seconds conversion. +#define TOGGLE_PERIOD_RESOLUTION 2.5 ///< FPGA fans toggle period resolution in micro seconds. +#define ROTATIONAL_TO_TOGGLE_PERIOD_CONVERSION_COEFF 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 +#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. /// Fans self test states typedef enum fans_Self_Test { FANS_SELF_TEST_START = 0, ///< Fans self test start state + FAN_SELF_TEST_COMPLETE, ///< Fans self test complete state NUM_OF_SELF_TEST_STATES, ///< Number of fans self test } FANS_SELF_TEST_STATES_T; @@ -45,20 +46,20 @@ /// Fans status struct typedef struct { - F32 targetPWM; ///< Fan's Target PWM - F32 calculatedPWM; ///< Fan's calculated PWM from the calculations - U32 rpm[ NUM_OF_FANS_NAMES ]; ///< Fan's current speed + F32 targetPWM; ///< Fan's Target PWM + F32 calculatedPWM; ///< Fan's calculated PWM from the calculations + U32 rpm[ NUM_OF_FANS_NAMES ]; ///< Fan's current speed } FAN_STATUS_T; -static FAN_STATUS_T fansStatus; ///< Fans status -static SELF_TEST_STATUS_T fansSelfTestReslt = SELF_TEST_STATUS_IN_PROGRESS; ///< Fans self test result -static FANS_SELF_TEST_STATES_T fansSelfTestState = FANS_SELF_TEST_START; ///< Fans self test state -static FANS_EXEC_STATES_T fansExecState = FANS_EXEC_STATE_START; ///< Fans exec state -static U32 fansControlCounter = 0; ///< Fans control interval counter -static U32 fansPublishCounter = 0; ///< Fans data publish interval counter +static FAN_STATUS_T fansStatus; ///< Fans status +static SELF_TEST_STATUS_T fansSelfTestReslt = SELF_TEST_STATUS_IN_PROGRESS; ///< Fans self test result +static FANS_SELF_TEST_STATES_T fansSelfTestState = FANS_SELF_TEST_START; ///< Fans self test state +static FANS_EXEC_STATES_T fansExecState = FANS_EXEC_STATE_START; ///< Fans exec state +static U32 fansControlCounter = 0; ///< Fans control interval counter +static U32 fansPublishCounter = 0; ///< Fans data publish interval counter static const F32 slope = ( MAX_ALLOWED_AMBINET_TEMPERATURE - MIN_ALLOWED_AMBIENT_TEMPERATURE ) / - ( FANS_MAX_PWM_PERCENT - FANS_MIN_PWM_PERCENT ); ///< Temperature to PWM conversion slope + ( FANS_MAX_PWM_PERCENT - FANS_MIN_PWM_PERCENT ); ///< Temperature to PWM conversion slope /// FGPA Toggle to RPM conversion coefficient static F32 const toggle2RPMCoefficient = ( ONE_MINUTE_TO_MICRO_SECONDS * ROTATIONAL_TO_TOGGLE_PERIOD_CONVERSION_COEFF ) / TOGGLE_PERIOD_RESOLUTION; @@ -97,13 +98,29 @@ /*********************************************************************//** * @brief * The execFansSelfTest function executes the fans self test. - * @details Inputs: FILL UP - * @details Outputs: FILL UP + * @details Inputs: fansSelfTestState, fansSelfTestReslt + * @details Outputs: fansSelfTestState, fansSelfTestReslt * @return Status of self test *************************************************************************/ SELF_TEST_STATUS_T execFansSelfTest( void ) { + switch ( fansSelfTestState ) + { + case FANS_SELF_TEST_START: + break; + case FAN_SELF_TEST_COMPLETE: + // Done with POST. Do nothing + break; + + default: + // Wrong state called + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_FAN_INVALID_SELF_TEST_STATE, fansSelfTestState ); + fansSelfTestState = FAN_SELF_TEST_COMPLETE; + break; + } + + return fansSelfTestReslt; } /*********************************************************************//** @@ -314,7 +331,7 @@ switch ( fan ) { case FAN_INLET_1: - RPM = getFPGAFan1Pulse(); //TODO is this the right place? + RPM = getFPGAInletFan1Pulse(); //TODO is this the right place? break; case FAN_INLET_2: @@ -326,7 +343,7 @@ break; case FAN_OUTLET_1: - RPM = getFPGAFan2Pulse(); //TODO is this the right place? + RPM = getFPGAInletFan2Pulse(); //TODO is this the right place? break; case FAN_OUTLET_2: @@ -391,7 +408,12 @@ fansData.fansCalculatedPWM = fansStatus.calculatedPWM * 100; fansData.fansTargetPWM = fansStatus.targetPWM * 100; - //TODO fill up the speeds + 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 ]; broadcastFansData( &fansData ); @@ -403,13 +425,51 @@ * TEST SUPPORT FUNCTIONS *************************************************************************/ +/*********************************************************************//** + * @brief + * The testSetFanPublishIntervalOverride function overrides the fans data + * publish interval. + * @details Inputs: fansPublishInterval + * @details Outputs: fansPublishInterval + * @param: value : override fans data publish interval with (in ms) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ BOOL testSetFanPublishIntervalOverride( U32 value ) { + BOOL result = FALSE; + if ( TRUE == isTestingActivated() ) + { + U32 intvl = value / TASK_GENERAL_INTERVAL; + + result = TRUE; + fansPublishInterval.ovData = intvl; + fansPublishInterval.override = OVERRIDE_KEY; + } + + return result; } + +/*********************************************************************//** + * @brief + * The testResetFanPublishIntervalOverride function resets the override + * of the fans data publish interval. + * @details Inputs: fansPublishInterval + * @details Outputs: fansPublishInterval + * @return TRUE if override reset successful, FALSE if not + ************************************************************************/ BOOL testResetFanPublishIntervalOverride( void ) { + BOOL result = FALSE; + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + fansPublishInterval.override = OVERRIDE_RESET; + fansPublishInterval.ovData = fansPublishInterval.ovInitData; + } + + return result; } - +/**@}*/