Index: firmware/App/Controllers/Fans.c =================================================================== diff -u -r1f500f8e6159a3fbab85ea68389e918a6df66400 -rd00ad426d849083922332f832e88e7137a1cad60 --- firmware/App/Controllers/Fans.c (.../Fans.c) (revision 1f500f8e6159a3fbab85ea68389e918a6df66400) +++ firmware/App/Controllers/Fans.c (.../Fans.c) (revision d00ad426d849083922332f832e88e7137a1cad60) @@ -12,14 +12,14 @@ // ********** 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.1 ///< Fans min PWM. +#define FANS_MAX_DUTY_CYCLE 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_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.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 ONE_MINUTE_TO_MICRO_SECONDS 60000000 ///< One minute to micro seconds conversion. +#define ONE_MINUTE_TO_MICRO_SECONDS ( SEC_PER_MIN * US_PER_SECOND ) ///< 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. Index: firmware/App/Controllers/Thermistors.c =================================================================== diff -u -r1f500f8e6159a3fbab85ea68389e918a6df66400 -rd00ad426d849083922332f832e88e7137a1cad60 --- firmware/App/Controllers/Thermistors.c (.../Thermistors.c) (revision 1f500f8e6159a3fbab85ea68389e918a6df66400) +++ firmware/App/Controllers/Thermistors.c (.../Thermistors.c) (revision d00ad426d849083922332f832e88e7137a1cad60) @@ -430,7 +430,7 @@ F32 const thermistorVoltage = adcValue * onBoardThermistorVoltageConvCoeff; // Calculate the thermistor resistor by solving: thermistorVoltage = (3 x 10) / (10 + R(T)) F32 const thermistorResistor = ( ( ONBOARD_THERMISTOR_REFERENCE_RESISTOR * ONBOARD_THERMISTOR_SOURCE_VOLTAGE ) - - ( ONBOARD_THERMISTOR_REFERENCE_RESISTOR * thermistorVoltage ) ) / thermistorVoltage; + ( ONBOARD_THERMISTOR_REFERENCE_RESISTOR * thermistorVoltage ) ) / thermistorVoltage; // 1/T = Ln(thermistorResistor/10)/3380 + 1/298 F32 const InvTemperature = ( logf( thermistorResistor / ONBOARD_THERMISTOR_REFERENCE_RESISTOR ) * onBoardThermistorBetaValueInv ) + onBoardThermistorRefTempInv; Index: firmware/App/Controllers/UVReactors.c =================================================================== diff -u -r45263215b372cd579e8e16bb8073c287c726c55d -rd00ad426d849083922332f832e88e7137a1cad60 --- firmware/App/Controllers/UVReactors.c (.../UVReactors.c) (revision 45263215b372cd579e8e16bb8073c287c726c55d) +++ firmware/App/Controllers/UVReactors.c (.../UVReactors.c) (revision d00ad426d849083922332f832e88e7137a1cad60) @@ -54,17 +54,17 @@ // ********** private data ********** -static UV_REACTOR_STATUS_T reactorsStatus[ NUM_OF_UV_REACTORS ]; ///< UV reactors status array -static UV_REACTORS_SELF_TEST_STATE_T uvReactorsSelfTestStates = UV_REACTORS_SELF_TEST_OFF; ///< UV reactors self test state -static SELF_TEST_STATUS_T uvReactosSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; ///< Valves self test result +static UV_REACTOR_STATUS_T reactorsStatus[ NUM_OF_UV_REACTORS ]; ///< UV reactors status array +static UV_REACTORS_SELF_TEST_STATE_T uvReactorsSelfTestStates = UV_REACTORS_SELF_TEST_OFF; ///< UV reactors self test state +static SELF_TEST_STATUS_T uvReactosSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; ///< Valves self test result static OVERRIDE_U32_T uvReactorsDataPublishInterval = { UV_REACTORS_DATA_PUB_INTERVAL, - UV_REACTORS_DATA_PUB_INTERVAL, 0, 0 }; ///< UV reactors data publish interval + UV_REACTORS_DATA_PUB_INTERVAL, 0, 0 }; ///< UV reactors data publish interval -static OVERRIDE_U32_T uvReactorsStateOverride[ NUM_OF_UV_REACTORS ] = { PIN_SIGNAL_LOW, PIN_SIGNAL_LOW, 0, 0 }; ///< UV reactors state override +static OVERRIDE_U32_T uvReactorsStateOverride[ NUM_OF_UV_REACTORS ]; ///< UV reactors state override TODO Remove -static U32 dataPublishCounter = 0; ///< UV reactors data publish counter -static U32 selfTestElapsedTime = 0; ///< UV reactors self test elapsed time +static U32 dataPublishCounter = 0; ///< UV reactors data publish counter +static U32 selfTestElapsedTime = 0; ///< UV reactors self test elapsed time // Self test functions static UV_REACTORS_SELF_TEST_STATE_T handleUVReactorsSelfTestOff( void ); @@ -91,18 +91,26 @@ *************************************************************************/ void initUVReactors( void ) { + UV_REACTORS_T reactor; uvReactosSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; uvReactorsSelfTestStates = UV_REACTORS_SELF_TEST_OFF; dataPublishCounter = 0; - // Initialize the UV reactors + // Initialize the UV reactors. These values are specific to the inlet and outlet reactor + // so they cannot be in a for loop reactorsStatus[ INLET_UV_REACTOR ].reactorEnablePin = INLET_UV_REACTOR_ENABLE_PIN; reactorsStatus[ INLET_UV_REACTOR ].reactorHealthStatusPin = INLET_UV_REACTOR_INDICATION_PIN; - reactorsStatus[ INLET_UV_REACTOR ].pinSignalState = PIN_SIGNAL_LOW; reactorsStatus[ OUTLET_UV_REACTOR ].reactorEnablePin = OUTLET_UV_REACTOR_ENABLE_PIN; reactorsStatus[ OUTLET_UV_REACTOR ].reactorHealthStatusPin = OUTLET_UV_REACTOR_INDICATION_PIN; - reactorsStatus[ OUTLET_UV_REACTOR ].pinSignalState = PIN_SIGNAL_LOW; + + // Initialize the common values in the UV reactors + for( reactor = INLET_UV_REACTOR; reactor < NUM_OF_UV_REACTORS; reactor++ ) + { + reactorsStatus[ reactor ].pinSignalState = PIN_SIGNAL_LOW; + reactorsStatus[ reactor ].execState = UV_REACTOR_STATE_OFF; + reactorsStatus[ reactor ].hasTurnOnBeenRequested = FALSE; + } } /*********************************************************************//** @@ -197,11 +205,19 @@ { BOOL result = FALSE; - if ( FALSE == reactorsStatus[ reactor ].hasTurnOnBeenRequested ) + // Check if the called reactor is in range. Otherwise, raise an alarm + if ( reactor < NUM_OF_UV_REACTORS ) { - reactorsStatus[ reactor ].hasTurnOnBeenRequested = TRUE; - result = TRUE; + if ( FALSE == reactorsStatus[ reactor ].hasTurnOnBeenRequested ) + { + reactorsStatus[ reactor ].hasTurnOnBeenRequested = TRUE; + result = TRUE; + } } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_UV_REACOTRS_INVALID_REACTOR_SELECTD, reactor ) + } return result; } @@ -217,12 +233,19 @@ BOOL turnOffUVReactor( UV_REACTORS_T reactor ) { BOOL result = FALSE; - - if ( TRUE == reactorsStatus[ reactor ].hasTurnOnBeenRequested ) + // Check if the called reactor is in range + if ( reactor < NUM_OF_UV_REACTORS ) { - reactorsStatus[ reactor ].hasTurnOnBeenRequested = FALSE; - result = TRUE; + if ( TRUE == reactorsStatus[ reactor ].hasTurnOnBeenRequested ) + { + reactorsStatus[ reactor ].hasTurnOnBeenRequested = FALSE; + result = TRUE; + } } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_UV_REACOTRS_INVALID_REACTOR_SELECTD, reactor ) + } return result; } @@ -258,15 +281,14 @@ { UV_REACTORS_SELF_TEST_STATE_T state = UV_REACTORS_SELF_TEST_CHECK_HEALTH; - if ( didTimeout( selfTestElapsedTime, SELF_TEST_DELAY_TIME ) ) { // Get the health status of the reactors BOOL isInletHealthy = isReactorHealthy( INLET_UV_REACTOR ); BOOL isOutletHealty = isReactorHealthy( OUTLET_UV_REACTOR ); // Check if both of them are healthy and if not, raise an alarm - if ( isInletHealthy || isOutletHealty ) + if ( isInletHealthy && isOutletHealty ) { uvReactosSelfTestResult = SELF_TEST_STATUS_PASSED; } @@ -312,8 +334,6 @@ { setReactorEnableStatus( reactor, PIN_SIGNAL_HIGH ); - // Set the turn on request flag to FALSE - reactorsStatus[ reactor ].hasTurnOnBeenRequested = FALSE; // Update the pin signal state reactorsStatus[ reactor ].pinSignalState = PIN_SIGNAL_HIGH; state = UV_REACTOR_STATE_ON; @@ -348,7 +368,7 @@ reactorsStatus[ reactor ].reactorUnhealthyCounter = 0; } - // Check if a reactor has been requested to be open + // Check if it has been requested to turn off a reactor if( FALSE == reactorsStatus[ reactor ].hasTurnOnBeenRequested ) { setReactorEnableStatus( reactor, PIN_SIGNAL_LOW ); @@ -414,8 +434,8 @@ /*********************************************************************//** * @brief * The publishUVReactorsData function publishes the UV reactors data. - * @details Inputs: dataPublishCounter, uvReactorsData, reactorsStatus - * @details Outputs: dataPublishCounter, uvReactorsData + * @details Inputs: dataPublishCounter, reactorsStatus + * @details Outputs: dataPublishCounter * @return none *************************************************************************/ static void publishUVReactorsData( void ) @@ -426,6 +446,8 @@ // Publish the reactors health status uvReactorsData.inletUVReactorHealthStatus = reactorsStatus[ INLET_UV_REACTOR ].reactorHealthStatusPin; uvReactorsData.outletUVReactorHealthStatus = reactorsStatus[ OUTLET_UV_REACTOR ].reactorHealthStatusPin; + uvReactorsData.inletUVReactorState = reactorsStatus[ INLET_UV_REACTOR ].execState; + uvReactorsData.outletUVReactorHealthStatus = reactorsStatus[ OUTLET_UV_REACTOR ].execState; broadcastUVReactorsData( &uvReactorsData ); @@ -495,7 +517,7 @@ * @param signal which is high for turn on and low for turn off * @return TRUE if override successful, FALSE if not *************************************************************************/ -BOOL testSetUVReactorsStateOverride( U32 reactor, PIN_SIGNAL_STATE_T signal ) +BOOL testSetUVReactorHealthOverride( U32 reactor, PIN_SIGNAL_STATE_T signal ) { BOOL result = FALSE; @@ -529,7 +551,7 @@ * @param reactor that its state will be reset * @return TRUE if override reset successful, FALSE if not *************************************************************************/ -BOOL testResetUVReactorsStateOverride( U32 reactor ) +BOOL testResetUVReactorHealthOverride( U32 reactor ) { BOOL result = FALSE; Index: firmware/App/Controllers/UVReactors.h =================================================================== diff -u -r1f500f8e6159a3fbab85ea68389e918a6df66400 -rd00ad426d849083922332f832e88e7137a1cad60 --- firmware/App/Controllers/UVReactors.h (.../UVReactors.h) (revision 1f500f8e6159a3fbab85ea68389e918a6df66400) +++ firmware/App/Controllers/UVReactors.h (.../UVReactors.h) (revision d00ad426d849083922332f832e88e7137a1cad60) @@ -7,8 +7,8 @@ /** * @defgroup UV Reactors UV Reactors * @brief UV reactors driver module. - * Controls the inlet and outlet of Acuva Strike II-B21 V10K L60 M UV reactors. - * Diality PN 1006797-001 + * Controls the inlet and outlet of Acuva Strike II-B21 V10K L60 M UV-LED reactors. + * EN: 50581:2012. The reactors have and On/Off switch and a health pin. * * @addtogroup UV Reactors * @{ @@ -27,6 +27,8 @@ { U32 inletUVReactorHealthStatus; ///< Inlet UV reactor health status U32 outletUVReactorHealthStatus; ///< Outlet UV reactor health status + U32 inletUVReactorState; ///< Inlet UV reactor state + U32 outletUVReactorState; ///< Outlet UV reactor state } UV_REACTORS_DATA_T; void initUVReactors( void ); @@ -42,13 +44,11 @@ BOOL turnOffUVReactor( UV_REACTORS_T reactor ); BOOL testSetReactorsDataPublishInterval( U32 value ); - BOOL testResetReactorsDataPublishInterval( void ); -BOOL testSetUVReactorsStateOverride( U32 reactor, PIN_SIGNAL_STATE_T signal ); +BOOL testSetUVReactorHealthOverride( U32 reactor, PIN_SIGNAL_STATE_T signal ); +BOOL testResetUVReactorHealthOverride( U32 reactor ); -BOOL testResetUVReactorsStateOverride( U32 reactor ); - /**@}*/ #endif Index: firmware/App/Drivers/InternalADC.c =================================================================== diff -u -r1f500f8e6159a3fbab85ea68389e918a6df66400 -rd00ad426d849083922332f832e88e7137a1cad60 --- firmware/App/Drivers/InternalADC.c (.../InternalADC.c) (revision 1f500f8e6159a3fbab85ea68389e918a6df66400) +++ firmware/App/Drivers/InternalADC.c (.../InternalADC.c) (revision d00ad426d849083922332f832e88e7137a1cad60) @@ -55,8 +55,8 @@ INT_ADC_REF_IN1, // 19 INT_ADC_REF_IN2, // 20 INT_ADC_BOARD_THERMISTOR, // 21 - INT_ADC_POWER_SUPPLY_1_THERMISTOR, // 22 - INT_ADC_POWER_SUPPLY_2_THERMISTOR // 23 + INT_ADC_POWER_SUPPLY_1_THERMISTOR, // 22 + INT_ADC_POWER_SUPPLY_2_THERMISTOR // 23 }; // ********** private data ********** Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -r1f500f8e6159a3fbab85ea68389e918a6df66400 -rd00ad426d849083922332f832e88e7137a1cad60 --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 1f500f8e6159a3fbab85ea68389e918a6df66400) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision d00ad426d849083922332f832e88e7137a1cad60) @@ -144,17 +144,18 @@ SW_FAULT_ID_UTIL_INVALID_WIN_COUNT, SW_FAULT_ID_UTIL_INVALID_WIN_MAX_COUNT, SW_FAULT_ID_PERSISTENT_ALARM_INVALID_INDEX, - SW_FAULT_ID_UV_REACTORS_INVALID_EXEC_STATE, // 55 + SW_FAULT_ID_UV_REACTORS_INVALID_EXEC_STATE, // 55 SW_FAULT_ID_UV_REACTORS_INVALID_SELF_TEST_STATE, SW_FAULT_ID_THERMISTORS_INVALID_EXEC_STATE, SW_FAULT_ID_THERMISTORS_INVALID_SELF_TEST_STATE, SW_FAULT_ID_INVALID_THERMISTOR_SELECTED, - SW_FAULT_ID_FAN_INVALID_EXEC_STATE, // 60 + SW_FAULT_ID_FAN_INVALID_EXEC_STATE, // 60 SW_FAULT_ID_FAN_INVALID_SELF_TEST_STATE, SW_FAULT_ID_INVALID_FAN_SELECTED, SW_FAULT_ID_RO_PUMP_INVALID_EXEC_STATE, SW_FAULT_ID_RO_PUMP_INVALID_FLOW_RATE_SET, - SW_FAULT_ID_DRAIN_PUMP_INVALID_EXEC_STATE, // 65 + SW_FAULT_ID_DRAIN_PUMP_INVALID_EXEC_STATE, // 65 + SW_FAULT_ID_UV_REACOTRS_INVALID_REACTOR_SELECTD, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/PIControllers.c =================================================================== diff -u -rd3671cad1447db7ad496ad6282324ef7570c5625 -rd00ad426d849083922332f832e88e7137a1cad60 --- firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision d3671cad1447db7ad496ad6282324ef7570c5625) +++ firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision d00ad426d849083922332f832e88e7137a1cad60) @@ -25,22 +25,31 @@ * @{ */ -// ********** private definitions ********** +// ********** private definitions ********** +/// Enumeration of PI controller direction. +typedef enum controller_Directions +{ + CONTROLLER_BIDIRECTIONAL = 0, ///< Controller runs bidirectional so it only covers positive and negative values + CONTROLLER_UNIDIRECTIONAL, ///< Controller run unidirectional so it only covers positive values + NUM_OF_CONTROLLELR_DIRECTIONS ///< Number of PI controllers directions +} PI_CONTROLLER_DIRECTIONS_T; + /// Record for PI controller. typedef struct { // -- PI's parameters -- - F32 Kp; ///< Proportional Value. - F32 Ki; ///< Integral Value. - F32 uMax; ///< Maximum control signal. - F32 uMin; ///< Minimum control signal. + F32 Kp; ///< Proportional Value. + F32 Ki; ///< Integral Value. + F32 uMax; ///< Maximum control signal. + F32 uMin; ///< Minimum control signal. // -- PI's signals -- - F32 referenceSignal; ///< reference signal. - F32 measuredSignal; ///< measured signal. - F32 errorSignal; ///< reference - measured signal. - F32 errorSumBeforeWindUp; ///< error signal before windup correction. - F32 errorSum; ///< error integral after windup correction. - F32 controlSignal; ///< actual control signal. + F32 referenceSignal; ///< reference signal. + F32 measuredSignal; ///< measured signal. + F32 errorSignal; ///< reference - measured signal. + F32 errorSumBeforeWindUp; ///< error signal before windup correction. + F32 errorSum; ///< error integral after windup correction. + F32 controlSignal; ///< actual control signal. + PI_CONTROLLER_DIRECTIONS_T direction; ///< PI controller control direction. } PI_CONTROLLER_T; #define MIN_KI NEARLY_ZERO ///< minimum integral coefficient - cannot be zero. @@ -51,11 +60,11 @@ /// PI Controllers - initial configurations. static PI_CONTROLLER_T piControllers[ NUM_OF_PI_CONTROLLERS_IDS ] = { // Kp Ki uMax uMin ref meas err esw esum ctrl - { 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, // PI_CONTROLLER_ID_RO_PUMP - { 0.0, 0.0, 0.99, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, // I_CONTROLLER_ID_RO_PUMP_RAMP_UP - { 0.0, 0.0, 3000, 300, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, // PI_CONTROLLER_ID_DRAIN_PUMP - { 0.0, 0.0, 1.39, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, // PI_CONTROLLER_ID_PRIMARY_HEATER - { 0.0, 0.0, 0.50, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 } // PI_CONTROLLER_ID_TRIMMER_HEATER + { 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, CONTROLLER_UNIDIRECTIONAL }, // PI_CONTROLLER_ID_RO_PUMP + { 0.0, 0.0, 0.99, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, CONTROLLER_UNIDIRECTIONAL }, // I_CONTROLLER_ID_RO_PUMP_RAMP_UP + { 0.0, 0.0, 3000, 300, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, CONTROLLER_BIDIRECTIONAL }, // PI_CONTROLLER_ID_DRAIN_PUMP + { 0.0, 0.0, 1.39, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, CONTROLLER_UNIDIRECTIONAL }, // PI_CONTROLLER_ID_PRIMARY_HEATER + { 0.0, 0.0, 0.50, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, CONTROLLER_UNIDIRECTIONAL } // PI_CONTROLLER_ID_TRIMMER_HEATER }; /*********************************************************************//** @@ -153,9 +162,19 @@ SET_CONTROLLER( controller, controllerID ); controller->referenceSignal = referenceSignal; - controller->measuredSignal = measuredSignal; - // calculate error signal - controller->errorSignal = referenceSignal - measuredSignal; + controller->measuredSignal = measuredSignal; + + // Calculate error signal + if ( controller->direction == CONTROLLER_UNIDIRECTIONAL ) + { + // To make sure that the outcome will be positive + controller->errorSignal = fabs( referenceSignal ) - ( referenceSignal < 0.0 ? ( measuredSignal * -1.0 ) : measuredSignal ); + } + else + { + controller->errorSignal = referenceSignal - measuredSignal; + } + controller->errorSum += controller->errorSignal; // anti-windup controller->errorSumBeforeWindUp = controller->errorSum; Index: firmware/App/Services/PIControllers.h =================================================================== diff -u -rab304e2ca6e3e40ed8cb12650e9855ae0b9649d8 -rd00ad426d849083922332f832e88e7137a1cad60 --- firmware/App/Services/PIControllers.h (.../PIControllers.h) (revision ab304e2ca6e3e40ed8cb12650e9855ae0b9649d8) +++ firmware/App/Services/PIControllers.h (.../PIControllers.h) (revision d00ad426d849083922332f832e88e7137a1cad60) @@ -53,8 +53,8 @@ CONTROLLER_SIGNAL_INTEGRAL_OUTPUT, ///< I portion of controller output signal CONTROLLER_SIGNAL_CONTROL, ///< Controller output signal NUM_OF_CONTROLLER_SIGNAL ///< Number of PI controller signals -} PI_CONTROLLER_SIGNALS_ID; - +} PI_CONTROLLER_SIGNALS_ID; + // ********** public function prototypes ********** void initializePIController( PI_CONTROLLER_ID_T controllerID, F32 initialControlSignal, Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r1538c71d0c6b97469d599befce15f068d9acf5d4 -rd00ad426d849083922332f832e88e7137a1cad60 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 1538c71d0c6b97469d599befce15f068d9acf5d4) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision d00ad426d849083922332f832e88e7137a1cad60) @@ -1177,14 +1177,17 @@ handleSetAccelCalibration( message ); break; - case MSG_ID_DG_START_STOP_UV_REACTORS_OVERRIDE: - handleStartStopUVReactorsOverrideRequest( message ); + case MSG_ID_DG_START_STOP_INLET_UV_REACTOR: + handleStartStopInletUVReactor( message ); break; case MSG_ID_UV_REACTORS_DATA_PUBLISH_INTERVAL_OVERRIDE: handleUVReactorsDataPunlishIntervalOverride( message ); break; + case MSG_ID_DG_START_STOP_OUTLET_UV_REACTOR: + break; + default: // TODO - unrecognized message ID received - ignore break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r1f500f8e6159a3fbab85ea68389e918a6df66400 -rd00ad426d849083922332f832e88e7137a1cad60 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 1f500f8e6159a3fbab85ea68389e918a6df66400) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision d00ad426d849083922332f832e88e7137a1cad60) @@ -2142,33 +2142,36 @@ /*********************************************************************//** * @brief -* The handleStartStopUVReactorsOverrideRequest function handles a request -* to override a UV reactors state. +* The handleStartStopInletUVReactor function handles a request to turn on/off +* the inlet UV reactor. * @details Inputs: none * @details Outputs: message handled * @param message a pointer to the message to handle * @return none *************************************************************************/ -void handleStartStopUVReactorsOverrideRequest( MESSAGE_T *message ) +BOOL handleStartStopInletUVReactor( 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 ) + + if ( message->hdr.payloadLen == sizeof(U32) ) { - memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) ); - if ( FALSE == payload.reset ) + BOOL startingReactor; + + memcpy( &startingReactor, message->payload, sizeof(U32) ); + + if ( TRUE == startingReactor ) { - result = testSetUVReactorsStateOverride( payload.index, (PIN_SIGNAL_STATE_T)(payload.state.u32) ); + result = turnOnUVReactor( INLET_UV_REACTOR ); } else { - result = testResetUVReactorsStateOverride( payload.index ); + result = turnOffUVReactor( INLET_UV_REACTOR ); } } - // respond to request - sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); + + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, result ); + + return result; } /*********************************************************************//** @@ -2235,4 +2238,38 @@ sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); } +/*********************************************************************//** +* @brief +* The handleStartStopOutletUVReactor function handles a request to turn on/off +* the outlet UV reactor. +* @details Inputs: none +* @details Outputs: message handled +* @param message a pointer to the message to handle +* @return none +*************************************************************************/ +BOOL handleStartStopOutletUVReactor( MESSAGE_T *message ) +{ + BOOL result = FALSE; + + if ( message->hdr.payloadLen == sizeof(U32) ) + { + BOOL startingReactor; + + memcpy( &startingReactor, message->payload, sizeof(U32) ); + + if ( TRUE == startingReactor ) + { + result = turnOnUVReactor( OUTLET_UV_REACTOR ); + } + else + { + result = turnOffUVReactor( OUTLET_UV_REACTOR ); + } + } + + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, result ); + + return result; +} + /**@}*/ Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r1f500f8e6159a3fbab85ea68389e918a6df66400 -rd00ad426d849083922332f832e88e7137a1cad60 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 1f500f8e6159a3fbab85ea68389e918a6df66400) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision d00ad426d849083922332f832e88e7137a1cad60) @@ -246,15 +246,18 @@ // MSG_ID_DG_ACCEL_SET_CALIBRATION: void handleSetAccelCalibration( MESSAGE_T *message ); -//MSG_ID_DG_START_STOP_UV_REACTORS -void handleStartStopUVReactorsOverrideRequest( MESSAGE_T *message ); +// MSG_ID_DG_START_STOP_INLET_UV_REACTOR +BOOL handleStartStopInletUVReactor( MESSAGE_T *message ); //MSG_ID_UV_REACTORS_DATA_PUBLISH_INTERVAL_OVERRIDE void handleUVReactorsDataPunlishIntervalOverride( MESSAGE_T *message ); // MSG_ID_DG_FANS_DATA_PUBLISH_OVERRIDE void handleFansDataPublishIntervalOverride( MESSAGE_T * message ); +// MSG_ID_DG_START_STOP_OUTLET_UV_REACTOR +BOOL handleStartStopOutletUVReactor( MESSAGE_T *message ); + /**@}*/ #endif