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; +} + /**@}*/ Index: firmware/App/Controllers/Fans.h =================================================================== diff -u -r4164cba570c42566aee10d7cce23c3cea0d903ee -r98e24f0db83de34e3d44c4bd72df9f506f8ceddc --- firmware/App/Controllers/Fans.h (.../Fans.h) (revision 4164cba570c42566aee10d7cce23c3cea0d903ee) +++ firmware/App/Controllers/Fans.h (.../Fans.h) (revision 98e24f0db83de34e3d44c4bd72df9f506f8ceddc) @@ -37,6 +37,9 @@ BOOL testSetFanPublishIntervalOverride( U32 value ); BOOL testResetFanPublishIntervalOverride( void ); +BOOL testSetFanRPMOverride( U32 fanId, F32 rpm ); +BOOL testResetFanRPMOverride( U32 fanId ); + /**@}*/ Index: firmware/App/Controllers/Temperatures.c =================================================================== diff -u -rf5f00981805e265ce63058f650d784f06db4d188 -r98e24f0db83de34e3d44c4bd72df9f506f8ceddc --- firmware/App/Controllers/Temperatures.c (.../Temperatures.c) (revision f5f00981805e265ce63058f650d784f06db4d188) +++ firmware/App/Controllers/Temperatures.c (.../Temperatures.c) (revision 98e24f0db83de34e3d44c4bd72df9f506f8ceddc) @@ -142,6 +142,15 @@ break; } + // Convert the ADC values to temperature + convertADC2Temperature(); + + // Monitor the values for a gross range check + // Monitor is called in this function because this driver is constantly reading + // the temperatures values. Also the internal ADC values are processed with moving average in the internalADC driver + // So the temperatures drivers just gets the latest ADC value and converts it to temperature + monitorTemperatures(); + // Publish the data publishTemperaturesData(); } @@ -223,15 +232,6 @@ temperaturesStatus[ TEMPSENSOR_VENOUS_PRESSURE_SENSOR ].rawADCRead = getFPGAVenousPressureTemperature(); temperaturesStatus[ TEMPSENSOR_PBA_ADC_SENSOR ].rawADCRead = getFPGAPBAADCTemperature(); - // Convert the ADC values to temperature - convertADC2Temperature(); - - // Monitor the values for a gross range check - // Monitor is called in this function because this driver is constantly reading - // the temperatures values. Also the internal ADC values are processed with moving average in the internalADC driver - // So the temperatures drivers just gets the latest ADC value and converts it to temperature - monitorTemperatures(); - // Zero the counter for the next round of reading adcReadCounter = 0; } Index: firmware/App/Modes/ModeInitPOST.c =================================================================== diff -u -r69b93e39861c5493d273f25d9e43cacd0b5819e2 -r98e24f0db83de34e3d44c4bd72df9f506f8ceddc --- firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 69b93e39861c5493d273f25d9e43cacd0b5819e2) +++ firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 98e24f0db83de34e3d44c4bd72df9f506f8ceddc) @@ -129,12 +129,6 @@ postState = handlePOSTStatus( testStatus ); break; - case POST_STATE_BATTERY: - // TODO implement the battery self test - testStatus = SELF_TEST_STATUS_PASSED; - postState = handlePOSTStatus( testStatus ); - break; - case POST_STATE_WATCHDOG: testStatus = execWatchdogTest(); postState = handlePOSTStatus( testStatus ); Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r01470ee3c64ededcc77a4f7378e49013a7ee5602 -r98e24f0db83de34e3d44c4bd72df9f506f8ceddc --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 01470ee3c64ededcc77a4f7378e49013a7ee5602) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 98e24f0db83de34e3d44c4bd72df9f506f8ceddc) @@ -1701,6 +1701,10 @@ handleTestFansBroadcastIntervalOverrideRequest( message ); break; + case MSG_ID_HD_FANS_RPM_OVERRIDE: + handleFansRPMOverride( message ); + break; + case MSG_ID_HD_SET_CALIBRATION_RECORD: handleSetHDCalibrationRecord( message ); break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r01470ee3c64ededcc77a4f7378e49013a7ee5602 -r98e24f0db83de34e3d44c4bd72df9f506f8ceddc --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 01470ee3c64ededcc77a4f7378e49013a7ee5602) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 98e24f0db83de34e3d44c4bd72df9f506f8ceddc) @@ -23,6 +23,7 @@ #include "AlarmLamp.h" #include "Buttons.h" #include "ConsumableSelfTest.h" +#include "Fans.h" #include "FPGA.h" #include "ModeStandby.h" #include "ModeTreatmentParams.h" @@ -7145,4 +7146,35 @@ sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); } +/*********************************************************************//** + * @brief + * The handleFansRPMOverride function handles a request to override a fans RPM value. + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleFansRPMOverride( MESSAGE_T *message ) +{ + TEST_OVERRIDE_ARRAY_PAYLOAD_T payload; + BOOL result = FALSE; + + // verify payload length + if ( sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) ); + if ( FALSE == payload.reset ) + { + result = testSetFanRPMOverride( payload.index, payload.state.f32 ); + } + else + { + result = testResetFanRPMOverride( payload.index ); + } + } + + // respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + /**@}*/ Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r01470ee3c64ededcc77a4f7378e49013a7ee5602 -r98e24f0db83de34e3d44c4bd72df9f506f8ceddc --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 01470ee3c64ededcc77a4f7378e49013a7ee5602) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 98e24f0db83de34e3d44c4bd72df9f506f8ceddc) @@ -790,6 +790,9 @@ // MSG_ID_HD_FANS_PUBLISH_INTERVAL_OVERRIDE void handleTestFansBroadcastIntervalOverrideRequest( MESSAGE_T *message ); +// MSG_ID_HD_FANS_RPM_OVERRIDE +void handleFansRPMOverride( MESSAGE_T *message ); + /**@}*/ #endif Index: firmware/App/Services/WatchdogMgmt.c =================================================================== diff -u -rf3326a3d0fd2a465a518e31ee578e335db301c27 -r98e24f0db83de34e3d44c4bd72df9f506f8ceddc --- firmware/App/Services/WatchdogMgmt.c (.../WatchdogMgmt.c) (revision f3326a3d0fd2a465a518e31ee578e335db301c27) +++ firmware/App/Services/WatchdogMgmt.c (.../WatchdogMgmt.c) (revision 98e24f0db83de34e3d44c4bd72df9f506f8ceddc) @@ -184,7 +184,7 @@ } else { - activateAlarmNoData( ALARM_ID_WATCHDOG_POST_TEST_FAILED ); + activateAlarmNoData( ALARM_ID_HD_WATCHDOG_POST_TEST_FAILED ); watchdogSelfTestStatus = SELF_TEST_STATUS_FAILED; } watchdogSelfTestTimerCount = getMSTimerCount();