Index: firmware/App/Controllers/PermeateTank.c =================================================================== diff -u -rf79d3737907fd08293d56f60f9f439ac68c81855 -r6dd382e3988fac2f9ee041b4738d67305e17a6a2 --- firmware/App/Controllers/PermeateTank.c (.../PermeateTank.c) (revision f79d3737907fd08293d56f60f9f439ac68c81855) +++ firmware/App/Controllers/PermeateTank.c (.../PermeateTank.c) (revision 6dd382e3988fac2f9ee041b4738d67305e17a6a2) @@ -31,22 +31,367 @@ // ********** private definitions ********** -#define PERMEATE_TANK_PUMP_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) for permeate tank broadcast +#define PERMEATE_TANK_PUMP_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) for permeate tank broadcast +#define PERMEATE_TANK_PUBLISH_COUNTER_START_COUNT 9 +#define PERMEATE_TANK_FULL_SWITCH_MS ( 6 * MS_PER_SECOND ) ///< state switch timeout (in ms) +#define PERMEATE_TANK_FULL_TIMEOUT_MS ( 60 * MS_PER_SECOND ) // ********** private data ********** -static PERMEATE_TANK_STATE_T permeateTankControllerState; ///< Current state of permeate controller state machine. -static U32 permeateTankDataPublicationTimerCounter; ///< Used to schedule permeate tank data publication to CAN bus. -static OVERRIDE_U32_T permeateTankPublishInterval; ///< Interval (in ms) at which to publish permeate tank data to CAN bus. +static PERMEATE_TANK_STATE_T permeateTankControllerState; ///< Current state of permeate controller state machine. +static U32 permeateTankDataPublicationTimerCounter; ///< Used to schedule permeate tank data publication to CAN bus. +static OVERRIDE_U32_T permeateTankPublishInterval; ///< Interval (in ms) at which to publish permeate tank data to CAN bus. +static BOOL pendingStartPermeateTankController; ///< Flag indicates an air trap controller start request is pending. +static BOOL pendingStopPermeateTankController; ///< Flag indicates an air trap controller stop request is pending. +static U32 tankFullAlarmTimeout; ///< Time stamp to track alarm timeout. +static U32 tankFullDelayTime; ///< Time stamp to track delay before valve switch. // ********** private function prototypes ********** -static void publishAirTrapData( void ); +static PERMEATE_TANK_STATE_T handlePermeateTankManualControlState( void ); +static PERMEATE_TANK_STATE_T handlePermeateTankFillState( void ); +static PERMEATE_TANK_STATE_T handlePermeateTankFullState( void ); +static void setPermeateTankTransition( PERMEATE_TANK_STATE_T state ); +static void publishPermeateTankData( void ); +/*********************************************************************//** + * @brief + * The initPermeateTank function initializes the permeate tank controller unit. + * @details \b Inputs: none + * @details \b Outputs: permeate tank controller unit initialized + * @return none + *************************************************************************/ +void initPermeateTank( void ) +{ + resetPermeateTank(); + permeateTankDataPublicationTimerCounter = PERMEATE_TANK_PUBLISH_COUNTER_START_COUNT; + permeateTankPublishInterval.data = PERMEATE_TANK_PUMP_DATA_PUB_INTERVAL; + permeateTankPublishInterval.ovData = PERMEATE_TANK_PUMP_DATA_PUB_INTERVAL; + permeateTankPublishInterval.ovInitData = PERMEATE_TANK_PUMP_DATA_PUB_INTERVAL; + permeateTankPublishInterval.override = OVERRIDE_RESET; + tankFullDelayTime = 0; + tankFullAlarmTimeout = 0; + +} + +/*********************************************************************//** + * @brief + * The resetPermeateTank function resets certain parts of the permeate tank module + * between water generation. + * @details \b Inputs: none + * @details \b Outputs: Permeate Tank controller reset. + * @return none + *************************************************************************/ +void resetPermeateTank( void ) +{ + permeateTankControllerState = PERMEATE_TANK_INIT_STATE; + pendingStartPermeateTankController = FALSE; + pendingStopPermeateTankController = FALSE; +} + +/*********************************************************************//** + * @brief + * The startPermeateTankControl function requests a start to permeate tank control. + * @details \b Inputs: permeateTankControllerState + * @details \b Outputs: pendingStartPermeateTankController + * @return none + *************************************************************************/ +void startPermeateTankControl( void ) +{ + if ( FALSE == isPermeateTankControlling() ) + { + pendingStartPermeateTankController = TRUE; + } +} + +/*********************************************************************//** + * @brief + * The endPermeateTankControl function requests a stop to permeate tank control. + * @details \b Inputs: permeateTankControllerState + * @details \b Outputs: pendingStopPermeateTankController + * @return none + *************************************************************************/ +void endPermeateTankControl( void ) +{ + if ( TRUE == isPermeateTankControlling() ) + { + pendingStopPermeateTankController = TRUE; + } +} + +/*********************************************************************//** + * @brief + * The isPermeateTankControlling function determines whether the permeate tank is + * currently controlling. + * @details \b Inputs: permeateTankControllerState + * @details \b Outputs: none + * @return TRUE if air trap is currently controlling, FALSE if not. + *************************************************************************/ +BOOL isPermeateTankControlling( void ) +{ + BOOL result = FALSE; + + if ( permeateTankControllerState > PERMEATE_TANK_MANUAL_CONTROL_STATE ) + { + result = TRUE; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The getPermeateTankState function returns the current state of the + * permeate tank controller. + * @details \b Inputs: permeateTankControllerState + * @details \b Outputs: none + * @return the current state of permeate tank + *************************************************************************/ +PERMEATE_TANK_STATE_T getPermeateTankState( void ) +{ + return permeateTankControllerState; +} +/*********************************************************************//** + * @brief + * The execPermeateTankController function executes the air trap control state machine. + * @details \b Alarm: ALARM_ID_FP_SOFTWARE_FAULT if current permeate tank control + * state is invalid. + * @details \b Message \b Sent: MSG_ID_TD_EVENT if air trap valve closed due to fault. + * @details \b Inputs: permeateTankControllerState + * @details \b Outputs: permeateTankControllerState + * @return none + *************************************************************************/ +void execPermeateTankController( void ) +{ + PERMEATE_TANK_STATE_T prevState = permeateTankControllerState; + // If we have faulted, close valve and go to manual control + if ( FP_MODE_FAUL == getCurrentOperationMode() ) + { + endPermeateTankControl(); + } + + // Execute air trap state machine + switch( permeateTankControllerState ) + { + case PERMEATE_TANK_INIT_STATE: + permeateTankControllerState = PERMEATE_TANK_MANUAL_CONTROL_STATE; + break; + + case PERMEATE_TANK_MANUAL_CONTROL_STATE: + permeateTankControllerState = handlePermeateTankManualControlState(); + break; + + case PERMEATE_TANK_FILL_STATE: + permeateTankControllerState = handlePermeateTankFillState(); + break; + + case PERMEATE_TANK_FULL_STATE: + permeateTankControllerState = handlePermeateTankFullState(); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_SOFTWARE_FAULT, (U32)SW_FAULT_ID_FP_INVALID_PERMEATE_TANK_STATE, (U32)permeateTankControllerState ) + permeateTankControllerState = PERMEATE_TANK_INIT_STATE; + break; + } + + if ( prevState != permeateTankControllerState ) + { + setPermeateTankTransition( permeateTankControllerState ); + } + + // Publish permeate tank data if due + publishPermeateTankData(); +} + +/*********************************************************************//** + * @brief + * The handlePermeateTankManualControlState function handles the manual control + * state of the permeate tank. + * @details \b Inputs: permeateTankControllerState + * @details \b Outputs: none + * @return next state + *************************************************************************/ +static PERMEATE_TANK_STATE_T handlePermeateTankManualControlState( void ) +{ + PERMEATE_TANK_STATE_T state = PERMEATE_TANK_MANUAL_CONTROL_STATE; + + // Transition to valve control states when requested + if ( TRUE == pendingStartPermeateTankController ) + { + pendingStartPermeateTankController = FALSE; + state = PERMEATE_TANK_FILL_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleAirTrapRaiseLevelState function handles the raise level state + * of the permeate tank. + * @details \b Message \b Sent: MSG_ID_TD_EVENT if raising level completed + * @details \b Inputs: pendingStopAirTrapController + * @details \b Outputs: none + * @return next state + *************************************************************************/ +static PERMEATE_TANK_STATE_T handlePermeateTankFillState( void ) +{ + PERMEATE_TANK_STATE_T state = PERMEATE_TANK_FILL_STATE; + LEVEL_STATE_T level = getLevelStatus(); + + // Transition to manual valve control state when requested + if ( TRUE == pendingStopPermeateTankController ) + { + pendingStopPermeateTankController = FALSE; + state = PERMEATE_TANK_MANUAL_CONTROL_STATE; + } + + else if ( LEVEL_STATE_HIGH == level ) + { + state = PERMEATE_TANK_FULL_STATE; + } + + else if ( level <= LEVEL_STATE_MEDIUM ) + { + // expected state. No action required. + // If level is low we still want to fill. + } + + + return state; +} + +/*********************************************************************//** + * @brief + * The handlePermeateTankFullState function handles the lower level state + * of the permeate tank. + * @details \b Inputs: none + * @details \b Outputs: none + * @return next state + *************************************************************************/ +static PERMEATE_TANK_STATE_T handlePermeateTankFullState( void ) +{ + PERMEATE_TANK_STATE_T state = PERMEATE_TANK_FULL_STATE; + LEVEL_STATE_T level = getLevelStatus(); + + if ( TRUE == didTimeout( tankFullAlarmTimeout, PERMEATE_TANK_FULL_TIMEOUT_MS ) ) + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_FP_GEN_PERMEATE_TANK_FULL_TIMEOUT, level ) + } + + // Transition to manual valve control state when requested + if ( TRUE == pendingStopPermeateTankController ) + { + pendingStopPermeateTankController = FALSE; + state = PERMEATE_TANK_MANUAL_CONTROL_STATE; + } + + else if ( ( ( level == LEVEL_STATE_MEDIUM ) && ( TRUE == didTimeout( tankFullDelayTime, PERMEATE_TANK_FULL_SWITCH_MS ) ) ) || + ( level == LEVEL_STATE_LOW ) ) + { + state = PERMEATE_TANK_FILL_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The setPermeateTankTransition function sets the actuators and variables + * for the state transition in permeate tank controller. + * @details Inputs: Valve states + * @details Outputs: Actuate valves + * @param state permeate tank state enum + * @return none + *************************************************************************/ +static void setPermeateTankTransition( PERMEATE_TANK_STATE_T state ) +{ + // Execute on running state + switch( state ) + { + case PERMEATE_TANK_INIT_STATE: + case PERMEATE_TANK_MANUAL_CONTROL_STATE: + break; + + case PERMEATE_TANK_FILL_STATE: + setValveState( M4_VALV,VALVE_STATE_OPEN ); + setValveState( M7_VALV, VALVE_STATE_CLOSED ); + setValveState( P6_VALV, VALVE_STATE_CLOSED ); + setValveState( P11_VALV, VALVE_STATE_OPEN ); + setValveState( P33_VALV, VALVE_STATE_OPEN ); // TODO - Change valves to handle RO rejection config + setValveState( P34_VALV, VALVE_STATE_CLOSED ); // Current set to Medium recovery for alpha HW + setValveState( P37_VALV, VALVE_STATE_CLOSED ); + setValveState( P39_VALV, VALVE_STATE_OPEN ); + setValveState( P20_VALV, VALVE_STATE_CLOSED ); + setValveState( P43_VALV, VALVE_STATE_CLOSED ); + break; + + case PERMEATE_TANK_FULL_STATE: + setValveState( M4_VALV, VALVE_STATE_CLOSED ); + setValveState( M7_VALV, VALVE_STATE_CLOSED ); + setValveState( P6_VALV, VALVE_STATE_CLOSED ); + setValveState( P11_VALV, VALVE_STATE_CLOSED ); + setValveState( P33_VALV, VALVE_STATE_OPEN ); + setValveState( P34_VALV, VALVE_STATE_CLOSED ); + setValveState( P37_VALV, VALVE_STATE_CLOSED ); + setValveState( P39_VALV, VALVE_STATE_OPEN ); + setValveState( P20_VALV, VALVE_STATE_CLOSED ); + setValveState( P43_VALV, VALVE_STATE_CLOSED ); + tankFullDelayTime = getMSTimerCount(); + tankFullAlarmTimeout = getMSTimerCount(); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_SOFTWARE_FAULT, SW_FAULT_ID_FP_INVALID_GENP_STATE, state ) + break; + } +} + +/*********************************************************************//** + * @brief + * The publishPermeateTankData function publishes permeate tank at the set interval. + * @details \b Message \b Sent: MSG_ID_FP_PERMEATE_TANK_DATA + * @details \b Inputs: permeateTankDataPublicationTimerCounter + * @details \b Outputs: permeateTankDataPublicationTimerCounter + * @return none + *************************************************************************/ +static void publishPermeateTankData( void ) +{ + // publish RO pump data on interval + if ( ++permeateTankDataPublicationTimerCounter >= getU32OverrideValue( &permeateTankPublishInterval ) ) + { + PERMEATE_TANK_DATA_T data; + data.tankState = permeateTankControllerState; + + broadcastData( MSG_ID_FP_PERMEATE_TANK_DATA, COMM_BUFFER_OUT_CAN_FP_BROADCAST, (U08*)&data, sizeof( PERMEATE_TANK_DATA_T ) ); + permeateTankDataPublicationTimerCounter = 0; + } +} + + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ +/*********************************************************************//** + * @brief + * The testPermeateTankDataPublishIntervalOverride function overrides the + * permeate tank data publish interval. + * @details \b Inputs: permeateTankPublishInterval + * @details \b Outputs: permeateTankPublishInterval + * @param message Override message from Dialin which includes the value + * that override permeate tank data publish interval with (in ms) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testPermeateTankDataPublishIntervalOverride( MESSAGE_T *message ) +{ + BOOL result = u32BroadcastIntervalOverride( message, &permeateTankPublishInterval, TASK_GENERAL_INTERVAL ); + + return result; +} + + /**@}*/ Index: firmware/App/Controllers/PermeateTank.h =================================================================== diff -u -r8e72441bc5cd51272b1dc6b14d6c95b4888d6301 -r6dd382e3988fac2f9ee041b4738d67305e17a6a2 --- firmware/App/Controllers/PermeateTank.h (.../PermeateTank.h) (revision 8e72441bc5cd51272b1dc6b14d6c95b4888d6301) +++ firmware/App/Controllers/PermeateTank.h (.../PermeateTank.h) (revision 6dd382e3988fac2f9ee041b4738d67305e17a6a2) @@ -37,25 +37,28 @@ typedef enum PermeateTank_States { PERMEATE_TANK_INIT_STATE = 0, ///< Initialization state. - PERMEATE_TANK_MANUAL_CONTROL_STATE, ///< Manually control air trap valve state. - PERMEATE_TANK_FILL_STATE, ///< Raise level state. - PERMEATE_TANK_FULL_STATE, ///< Lower level state. - NUM_OF_PERMEATE_TANK_STATES ///< Number of air trap controller states. + PERMEATE_TANK_MANUAL_CONTROL_STATE, ///< Manually control permeate valve state. + PERMEATE_TANK_FILL_STATE, ///< Tank fill state + PERMEATE_TANK_FULL_STATE, ///< Tank full state. + NUM_OF_PERMEATE_TANK_STATES ///< Number of permeate tank controller states. } PERMEATE_TANK_STATE_T; -// ********** public data ********** +/// Permeate Tank data record. +typedef struct +{ + U32 tankState; ///< Permeate Tank current state. +} PERMEATE_TANK_DATA_T; - // ********** public function prototypes ********** void initPermeateTank(void); void resetPermeateTank( void ); void execPermeateTankController(void); -void execPermeateTankMonitor( void ); void startPermeateTankControl( void ); void endPermeateTankControl( void ); BOOL isPermeateTankControlling( void ); +PERMEATE_TANK_STATE_T getPermeateTankState( void ); BOOL testPermeateTankDataPublishIntervalOverride( MESSAGE_T *message ); BOOL testSetPermeateTankControl( MESSAGE_T *message ); Index: firmware/App/Modes/FPModeFault.c =================================================================== diff -u -rf79d3737907fd08293d56f60f9f439ac68c81855 -r6dd382e3988fac2f9ee041b4738d67305e17a6a2 --- firmware/App/Modes/FPModeFault.c (.../FPModeFault.c) (revision f79d3737907fd08293d56f60f9f439ac68c81855) +++ firmware/App/Modes/FPModeFault.c (.../FPModeFault.c) (revision 6dd382e3988fac2f9ee041b4738d67305e17a6a2) @@ -271,9 +271,15 @@ { U32 i; - if ( TRUE == isFPDefeatured() ) + if ( FALSE == isFPDefeatured() ) { + if ( TRUE == isBoostPumpInstalled() ) + { + signalBoostPumpHardStop(); + } + signalROPumpHardStop(); + if ( TRUE == isDrainEnabled ) { setValveState( M4_VALV, VALVE_STATE_CLOSED ); @@ -287,20 +293,12 @@ setValveState( P20_VALV, VALVE_STATE_CLOSED ); setValveState( P43_VALV, VALVE_STATE_CLOSED ); } - else { for ( i = FIRST_VALVE; i <= NUM_OF_VALVES; i++ ) { setValveState( (VALVES_T)i, VALVE_STATE_CLOSED); } - - if (TRUE == isBoostPumpInstalled()) - { - signalBoostPumpHardStop(); - } - - signalROPumpHardStop(); } } // Defeatured System. Only have m4 to control Index: firmware/App/Modes/FlushConcentrate.c =================================================================== diff -u -rf79d3737907fd08293d56f60f9f439ac68c81855 -r6dd382e3988fac2f9ee041b4738d67305e17a6a2 --- firmware/App/Modes/FlushConcentrate.c (.../FlushConcentrate.c) (revision f79d3737907fd08293d56f60f9f439ac68c81855) +++ firmware/App/Modes/FlushConcentrate.c (.../FlushConcentrate.c) (revision 6dd382e3988fac2f9ee041b4738d67305e17a6a2) @@ -22,6 +22,7 @@ #include "FPOperationModes.h" #include "MessageSupport.h" #include "Messaging.h" +#include "PermeateTank.h" #include "Pressure.h" #include "ROPump.h" #include "TaskGeneral.h" @@ -139,10 +140,10 @@ FP_CONC_FLUSH_STATE_T state = CONC_FLUSH_IN_PROGRESS; BOOL isVolumeOutOfRange = FALSE; - if ( TRUE == 1 ) // Alarm Change - { - state = CONC_FLUSH_PAUSED; - } +// if ( TRUE == 1 ) )// TODO Alarm and Stop State Rework +// { +// state = CONC_FLUSH_PAUSED; +// } cumulativeConcentrateVolume_mL = getFlowRate( P7_FLOW ) * CONCENTRATE_FLOW_INTEGRATOR; @@ -211,7 +212,7 @@ setValveState( P39_VALV, VALVE_STATE_OPEN ); setValveState( P20_VALV, VALVE_STATE_CLOSED ); setValveState( P43_VALV, VALVE_STATE_CLOSED ); - + startPermeateTankControl(); if ( TRUE == isBoostPumpInstalled() ) { setBoostPumpTargetPressure( CONCENTRATE_FLUSH_BOOST_PUMP_TGT_PSI ); Index: firmware/App/Modes/FlushFilter.c =================================================================== diff -u -rf79d3737907fd08293d56f60f9f439ac68c81855 -r6dd382e3988fac2f9ee041b4738d67305e17a6a2 --- firmware/App/Modes/FlushFilter.c (.../FlushFilter.c) (revision f79d3737907fd08293d56f60f9f439ac68c81855) +++ firmware/App/Modes/FlushFilter.c (.../FlushFilter.c) (revision 6dd382e3988fac2f9ee041b4738d67305e17a6a2) @@ -34,7 +34,7 @@ #define FILTER_FLUSH_MAX_TIMEOUT ( 600 * MS_PER_SECOND ) ///< Max override timeout for 10 minutes #define FILTER_FLUSH_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the gen water mode data published. #define FILTER_FLUSH_TIMEOUT ( 30 * MS_PER_SECOND ) ///< filter flush timer (in ms) -#define FILTER_HEALTH_PRESSURE_DIFF 10 +#define FILTER_HEALTH_PRESSURE_DIFF 15 ///< Filter flush pressure difference threshold for alarm // ********** private data ********** @@ -129,10 +129,10 @@ BOOL isPressureOutOfRange = FALSE; F32 pressureDif = 0.0; - if ( TRUE == 1 )// Alarm Change - { - state = FILTER_FLUSH_PAUSED; - } +// if ( TRUE == 1 )// TODO Alarm and Stop State Rework +// { +// state = FILTER_FLUSH_PAUSED; +// } if( TRUE == didTimeout( filterFlushTimer, getFilterFlushTimeout() ) ) { @@ -148,7 +148,6 @@ { isFlushComplete = TRUE; state = FILTER_FLUSH_PAUSED; - } } return state; Index: firmware/App/Modes/FlushPermeate.c =================================================================== diff -u -rf79d3737907fd08293d56f60f9f439ac68c81855 -r6dd382e3988fac2f9ee041b4738d67305e17a6a2 --- firmware/App/Modes/FlushPermeate.c (.../FlushPermeate.c) (revision f79d3737907fd08293d56f60f9f439ac68c81855) +++ firmware/App/Modes/FlushPermeate.c (.../FlushPermeate.c) (revision 6dd382e3988fac2f9ee041b4738d67305e17a6a2) @@ -21,6 +21,7 @@ #include "FPOperationModes.h" #include "MessageSupport.h" #include "Messaging.h" +#include "PermeateTank.h" #include "Pressure.h" #include "ROPump.h" #include "TaskGeneral.h" @@ -38,7 +39,7 @@ #define PERMEATE_FLUSH_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the gen water mode data published. #define PERMEATE_FLUSH_TIMEOUT ( 30 * MS_PER_SECOND ) ///< Permeate flush timer (in ms) #define PERMEATE_FLUSH_ALARM_TIMEOUT ( 120 * MS_PER_SECOND ) ///< Permeate flush timer (in ms) -#define PERMEATE_FLUSH_RO_PUMP_TGT_PSI 15 ///< Pressure target in PSI for the RO pump during permeate flush. +#define PERMEATE_FLUSH_RO_PUMP_TGT_ML 700 ///< Pressure target in ml/min for the RO pump during permeate flush. #define PERMEATE_FLUSH_BOOST_PUMP_TGT_PSI 25 ///< Pressure target in PSI for the boost pump during permeate flush. #define PERMEATE_FLUSH_CONDUCTIVITY_THRESHOLD 200.0F ///< Conductivity alarm threshold for permeate flush. @@ -141,10 +142,10 @@ { FP_PERM_FLUSH_STATE_T state = PERM_FLUSH_IN_PROGRESS; - if ( TRUE == 1 )// Alarm Change - { - state = PERM_FLUSH_PAUSED; - } +// if ( TRUE == 1 ))// TODO Alarm and Stop State Rework +// { +// state = PERM_FLUSH_PAUSED; +// } if( TRUE == didTimeout( permeateFlushTimer, getPermeateFlushTimeout() ) ) { @@ -213,12 +214,12 @@ setValveState( P39_VALV, VALVE_STATE_OPEN ); setValveState( P20_VALV, VALVE_STATE_CLOSED ); setValveState( P43_VALV, VALVE_STATE_CLOSED ); - + startPermeateTankControl(); if ( TRUE == isBoostPumpInstalled() ) { setBoostPumpTargetPressure( PERMEATE_FLUSH_BOOST_PUMP_TGT_PSI ); } - setROPumpTargetPressure( PERMEATE_FLUSH_RO_PUMP_TGT_PSI ); + setROPumpTargetPressure( PERMEATE_FLUSH_RO_PUMP_TGT_ML ); permeateFlushTimer = getMSTimerCount(); permeateFlushAlarmTimer = getMSTimerCount(); pendingStartPermeateFlushRequest = FALSE; Index: firmware/App/Modes/ModeGenPermeate.c =================================================================== diff -u -rf79d3737907fd08293d56f60f9f439ac68c81855 -r6dd382e3988fac2f9ee041b4738d67305e17a6a2 --- firmware/App/Modes/ModeGenPermeate.c (.../ModeGenPermeate.c) (revision f79d3737907fd08293d56f60f9f439ac68c81855) +++ firmware/App/Modes/ModeGenPermeate.c (.../ModeGenPermeate.c) (revision 6dd382e3988fac2f9ee041b4738d67305e17a6a2) @@ -24,6 +24,7 @@ #include "Messaging.h" #include "ModeGenPermeate.h" #include "ModePreGenPermeate.h" +#include "PermeateTank.h" #include "ROPump.h" #include "TaskGeneral.h" #include "Timers.h" @@ -37,21 +38,16 @@ // ********** private definitions ********** #define PRE_GEN_PERMEATE_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the gen permeate mode data published. -#define GEN_PERMEATE_TANK_FULL_SWITCH_MS ( 6 * MS_PER_SECOND ) ///< state switch timeout (in ms) -#define GEN_PERMEATE_TANK_FULL_TIMEOUT_MS ( 60 * MS_PER_SECOND ) -#define GEN_PERMEATE_BOOST_PUMP_TGT_PSI 25 -#define GEN_PERMEATE_PWM_DEFAULT 0.22F +#define GEN_PERMEATE_BOOST_PUMP_TGT_PSI 25 ///< Pressure target in PSI for the boost pump during generate permeate mode. +#define GEN_PERMEATE_RO_PUMP_TGT_ML 700 ///< Flow target in ml/min for the ro pump during generate permeate mode. + // ********** private data ********** static FP_GENP_MODE_STATE_T genPermeateState; ///< Currently active generate Permeate state. static U32 genPermeateDataPublicationTimerCounter; ///< Used to schedule generate Permeate data publication to CAN bus. static OVERRIDE_U32_T genPermeateDataPublishInterval; ///< Generate permeate mode data publish interval. -static U32 tankFullDelayTime; ///< Time stamp to track delay before valve switch. -static BOOL pendingStartGenRequest; ///< Flag indicating DD has requested FP start the generate permeate. -static F32 genPermeateRODutyCycle; -static F32 genPermeateBoostDutyCycle; -static U32 tankFullAlarmTimeout; +static BOOL pendingStartGenRequest; ///< Flag indicating DD has requested FP start the generate permeate. // ********** private function prototypes ********** @@ -76,11 +72,7 @@ genPermeateDataPublishInterval.ovInitData = 0; genPermeateDataPublishInterval.override = OVERRIDE_RESET; genPermeateDataPublicationTimerCounter = 0; - tankFullDelayTime = 0; - tankFullAlarmTimeout = 0; pendingStartGenRequest = 0; - genPermeateRODutyCycle = 0.0F; - genPermeateBoostDutyCycle = 0.0F; } /*********************************************************************//** @@ -96,18 +88,8 @@ initGenPermeateMode(); setCurrentSubState( genPermeateState ); setModeGenPTransition( genPermeateState ); - - // Setting RO pump pwm at the start instead of - // each transition to allow testing of different target control - // while in Gen Permeate - if ( 0.0F == getGenPermeateRODutyCycle() ) // we skipped verify water via dialin - { - setROPumpTargetDutyCycle( GEN_PERMEATE_PWM_DEFAULT ); - } - else - { - setROPumpTargetDutyCycle( getGenPermeateRODutyCycle() ); - } + startPermeateTankControl(); + setROPumpTargetFlowRateMLPM( GEN_PERMEATE_RO_PUMP_TGT_ML ); return genPermeateState; } @@ -166,41 +148,17 @@ switch( state ) { case FP_GENP_TANK_FILL_STATE: - setValveState( M4_VALV,VALVE_STATE_OPEN ); - setValveState( M7_VALV, VALVE_STATE_CLOSED ); - setValveState( P6_VALV, VALVE_STATE_CLOSED ); - setValveState( P11_VALV, VALVE_STATE_OPEN ); - setValveState( P33_VALV, VALVE_STATE_OPEN ); // TODO - Change valves to handle RO rejection config - setValveState( P34_VALV, VALVE_STATE_CLOSED ); // Current set to Medium recovery for alpha HW - setValveState( P37_VALV, VALVE_STATE_CLOSED ); - setValveState( P39_VALV, VALVE_STATE_OPEN ); - setValveState( P20_VALV, VALVE_STATE_CLOSED ); - setValveState( P43_VALV, VALVE_STATE_CLOSED ); - if ( TRUE == isBoostPumpInstalled() ) { setBoostPumpTargetPressure( GEN_PERMEATE_BOOST_PUMP_TGT_PSI ); } break; case FP_GENP_TANK_FULL_STATE: - setValveState( M4_VALV, VALVE_STATE_CLOSED ); - setValveState( M7_VALV, VALVE_STATE_CLOSED ); - setValveState( P6_VALV, VALVE_STATE_CLOSED ); - setValveState( P11_VALV, VALVE_STATE_CLOSED ); - setValveState( P33_VALV, VALVE_STATE_OPEN ); - setValveState( P34_VALV, VALVE_STATE_CLOSED ); - setValveState( P37_VALV, VALVE_STATE_CLOSED ); - setValveState( P39_VALV, VALVE_STATE_OPEN ); - setValveState( P20_VALV, VALVE_STATE_CLOSED ); - setValveState( P43_VALV, VALVE_STATE_CLOSED ); - if ( TRUE == isBoostPumpInstalled() ) { signalBoostPumpHardStop(); } - tankFullDelayTime = getMSTimerCount(); - tankFullAlarmTimeout = getMSTimerCount(); break; default: @@ -219,25 +177,13 @@ static FP_GENP_MODE_STATE_T handleGenPTankFillState( void ) { FP_GENP_MODE_STATE_T state = FP_GENP_TANK_FILL_STATE; - LEVEL_STATE_T level = getLevelStatus(); + PERMEATE_TANK_STATE_T permemeateTankState = getPermeateTankState(); - if ( LEVEL_STATE_HIGH == level ) + if ( permemeateTankState == PERMEATE_TANK_FULL_STATE ) { state = FP_GENP_TANK_FULL_STATE; - // save boost pump - if ( TRUE == isBoostPumpInstalled() ) - { - setGenPermeateBoostDutyCycle( getCurrentBoostPumpDutyCyclePCT() ); - SEND_EVENT_WITH_2_U32_DATA( FP_EVENT_GENP_BOOST_SET_PWM, getCurrentBoostPumpDutyCyclePCT(), getFluidPumpReadPWMDutyCycle( P40_PUMP ) ) - } } - else if ( level <= LEVEL_STATE_MEDIUM ) - { - // expected state. No action required. - // If level is low we still want to fill. - } - return state; } @@ -251,16 +197,10 @@ static FP_GENP_MODE_STATE_T handleGenPTankFullState( void ) { FP_GENP_MODE_STATE_T state = FP_GENP_TANK_FULL_STATE; - LEVEL_STATE_T level = getLevelStatus(); + PERMEATE_TANK_STATE_T permemeateTankState = getPermeateTankState(); - if ( TRUE == didTimeout( tankFullAlarmTimeout, GEN_PERMEATE_TANK_FULL_TIMEOUT_MS ) ) + if ( permemeateTankState == PERMEATE_TANK_FILL_STATE ) { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_FP_GEN_PERMEATE_TANK_FULL_TIMEOUT, level ) - } - - if ( ( ( level == LEVEL_STATE_MEDIUM ) && ( TRUE == didTimeout( tankFullDelayTime, GEN_PERMEATE_TANK_FULL_SWITCH_MS ) ) ) || - ( level == LEVEL_STATE_LOW ) ) - { state = FP_GENP_TANK_FILL_STATE; } @@ -269,58 +209,6 @@ /*********************************************************************//** * @brief - * The getGenPermeateBoostDutyCycle function returns the current Boost pump pwm setting - * in gen permeate mode. - * @details \b Inputs: genPermeateBoostDutyCycle - * @details \b Outputs: genPermeateBoostDutyCycle - * @return the current pwm setting for the RO Pump - *************************************************************************/ -F32 getGenPermeateBoostDutyCycle( void ) -{ - return genPermeateBoostDutyCycle; -} - -/*********************************************************************//** - * @brief - * The setGenPermeateBoostDutyCycle function sets the Boost pump pwm in gen permeate - * mode - * @details \b Inputs: none - * @details \b Outputs: genPermeateBoostDutyCycle - * @return none - *************************************************************************/ -void setGenPermeateBoostDutyCycle( F32 duty) -{ - genPermeateBoostDutyCycle = duty; -} - -/*********************************************************************//** - * @brief - * The getGenPermeateRODutyCycle function returns the current pwm setting - * for the RO pump in gen permeate mode. - * @details \b Inputs: genPermeateRODutyCycle - * @details \b Outputs: genPermeateRODutyCycle - * @return the current pwm setting for the RO Pump - *************************************************************************/ -F32 getGenPermeateRODutyCycle( void ) -{ - return genPermeateRODutyCycle; -} - -/*********************************************************************//** - * @brief - * The setGenPermeateRODutyCycle function sets the RO PWM pump in gen permeate - * mode - * @details \b Inputs: none - * @details \b Outputs: genPermeateRODutyCycle - * @return none - *************************************************************************/ -void setGenPermeateRODutyCycle( F32 duty) -{ - genPermeateRODutyCycle = duty; -} - -/*********************************************************************//** - * @brief * The getCurrentGenPermeateState function returns the current state of the * gen permeate mode. * @details \b Inputs: genPermeateState Index: firmware/App/Modes/ModeGenPermeateDefeatured.c =================================================================== diff -u -rdfec1cd93855e2b0aebfb2303f5fc8584a012440 -r6dd382e3988fac2f9ee041b4738d67305e17a6a2 --- firmware/App/Modes/ModeGenPermeateDefeatured.c (.../ModeGenPermeateDefeatured.c) (revision dfec1cd93855e2b0aebfb2303f5fc8584a012440) +++ firmware/App/Modes/ModeGenPermeateDefeatured.c (.../ModeGenPermeateDefeatured.c) (revision 6dd382e3988fac2f9ee041b4738d67305e17a6a2) @@ -181,10 +181,10 @@ { FP_GENP_DEF_MODE_STATE_T state = FP_GENP_DEF_SUPPLY_WATER; - if ( TRUE == 1 )// Alarm Change - { - state = FP_GENP_DEF_PAUSED; - } +// if ( TRUE == 1 ))// TODO Alarm and Stop State Rework +// { +// state = FP_GENP_DEF_PAUSED; +// } return state; } Index: firmware/App/Modes/ModePreGenPermeate.c =================================================================== diff -u -rdfec1cd93855e2b0aebfb2303f5fc8584a012440 -r6dd382e3988fac2f9ee041b4738d67305e17a6a2 --- firmware/App/Modes/ModePreGenPermeate.c (.../ModePreGenPermeate.c) (revision dfec1cd93855e2b0aebfb2303f5fc8584a012440) +++ firmware/App/Modes/ModePreGenPermeate.c (.../ModePreGenPermeate.c) (revision 6dd382e3988fac2f9ee041b4738d67305e17a6a2) @@ -27,6 +27,7 @@ #include "Messaging.h" #include "ModeGenPermeate.h" #include "ModePreGenPermeate.h" +#include "PermeateTank.h" #include "ROPump.h" #include "TaskGeneral.h" #include "Timers.h" @@ -40,8 +41,8 @@ // ********** private definitions ********** #define PRE_GENP_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the pre gen Permeate mode data published. -#define VERIFY_WATER_RO_PUMP_TGT_PSI 15 -#define VERIFY_WATER_BOOST_PUMP_TGT_PSI 25 +#define VERIFY_WATER_RO_PUMP_TGT_FLOW_ML 700 ///< Target flow rate for RO pump in ml/min +#define VERIFY_WATER_BOOST_PUMP_TGT_PSI 25 ///< Target pressure for boost pump in psi. #define VERIFY_WATER_TIMEOUT_MS ( 5 * MS_PER_SECOND ) // ********** private data ********** @@ -97,6 +98,7 @@ initPreGenPMode(); setCurrentSubState( preGenPState ); setModePreGenPTransition( preGenPState ); + resetPermeateTank(); return preGenPState; } @@ -199,7 +201,7 @@ { setBoostPumpTargetPressure( VERIFY_WATER_BOOST_PUMP_TGT_PSI ); } - setROPumpTargetPressure( VERIFY_WATER_RO_PUMP_TGT_PSI ); + setROPumpTargetFlowRateMLPM( VERIFY_WATER_RO_PUMP_TGT_FLOW_ML ); verifyWaterTimer = getMSTimerCount(); break; @@ -223,10 +225,10 @@ { FP_PRE_GENP_MODE_STATE_T state = FP_PRE_GENP_INLET_PRESSURE_CHECK; - if ( TRUE == 1 )// Alarm Change - { - state = FP_PRE_GENP_PAUSED; - } +// if ( TRUE == 1 ))// TODO Alarm and Stop State Rework +// { +// state = FP_PRE_GENP_PAUSED; +// } if ( FALSE == isBoostPumpInstalled() ) { @@ -251,10 +253,10 @@ { FP_PRE_GENP_MODE_STATE_T state = FP_PRE_GENP_FILTER_FLUSH; - if ( TRUE == 1 )// Alarm Change - { - state = FP_PRE_GENP_PAUSED; - } +// if ( TRUE == 1 ))// TODO Alarm and Stop State Rework +// { +// state = FP_PRE_GENP_PAUSED; +// } execFilterFlush(); @@ -279,10 +281,10 @@ { FP_PRE_GENP_MODE_STATE_T state = FP_PRE_GENP_PERMEATE_FLUSH; - if ( TRUE == 1 )// Alarm Change - { - state = FP_PRE_GENP_PAUSED; - } +// if ( TRUE == 1 ))// TODO Alarm and Stop State Rework +// { +// state = FP_PRE_GENP_PAUSED; +// } execPermeateFlush(); @@ -307,10 +309,10 @@ { FP_PRE_GENP_MODE_STATE_T state = FP_PRE_GENP_CONCENTRATE_FLUSH; - if ( TRUE == 1 )// Alarm Change - { - state = FP_PRE_GENP_PAUSED; - } +// if ( TRUE == 1 ))// TODO Alarm and Stop State Rework +// { +// state = FP_PRE_GENP_PAUSED; +// } execConcentrateFlush(); @@ -335,14 +337,13 @@ FP_PRE_GENP_MODE_STATE_T state = FP_PRE_GENP_VERIFY_WATER; F32 roCurrentDutyCycle = getCurrentROPumpDutyCyclePCT(); - if ( TRUE == 1 )// Alarm Change - { - state = FP_PRE_GENP_PAUSED; - } +// if ( TRUE == 1 ))// TODO Alarm and Stop State Rework +// { +// state = FP_PRE_GENP_PAUSED; +// } if( TRUE == didTimeout( verifyWaterTimer, VERIFY_WATER_TIMEOUT_MS ) ) { - setGenPermeateRODutyCycle( roCurrentDutyCycle ); transitionToGenPermeateMode(); requestGenWaterStart(); // transition function will clear start flag isPreGenComplete = TRUE; Index: firmware/App/Modes/ModePreGenPermeateDefeatured.c =================================================================== diff -u -rdfec1cd93855e2b0aebfb2303f5fc8584a012440 -r6dd382e3988fac2f9ee041b4738d67305e17a6a2 --- firmware/App/Modes/ModePreGenPermeateDefeatured.c (.../ModePreGenPermeateDefeatured.c) (revision dfec1cd93855e2b0aebfb2303f5fc8584a012440) +++ firmware/App/Modes/ModePreGenPermeateDefeatured.c (.../ModePreGenPermeateDefeatured.c) (revision 6dd382e3988fac2f9ee041b4738d67305e17a6a2) @@ -207,10 +207,10 @@ { FP_PRE_GENP_DEF_MODE_STATE_T state = FP_PRE_GENP_DEF_FLUSH; - if ( TRUE == 1 )// Alarm Change - { - state = FP_PRE_GENP_DEF_PAUSED; - } +// if ( TRUE == 1 )// TODO Alarm and Stop State Rework +// { +// state = FP_PRE_GENP_DEF_PAUSED; +// } if( TRUE == didTimeout( preGenPermeateDefFlushTimer, PRE_GEN_DEF_FLUSH_TIMEOUT_MS ) ) { @@ -231,10 +231,10 @@ { FP_PRE_GENP_DEF_MODE_STATE_T state = FP_PRE_GENP_DEF_INLET_WATER_CHECK; - if ( TRUE == 1 )// Alarm Change - { - state = FP_PRE_GENP_DEF_PAUSED; - } +// if ( TRUE == 1 ))// TODO Alarm and Stop State Rework +// { +// state = FP_PRE_GENP_DEF_PAUSED; +// } if( TRUE == didTimeout( preGenPermeateDefWaterCheckTimer, PRE_GEN_DEF_WATER_CHECK_TIMEOUT_MS ) ) { @@ -256,10 +256,10 @@ { FP_PRE_GENP_DEF_MODE_STATE_T state = FP_PRE_GENP_DEF_PAUSED; - if ( TRUE == 1 )// Alarm Change - { - state = FP_PRE_GENP_DEF_PAUSED; - } +// if ( TRUE == 1 ))// TODO Alarm and Stop State Rework +// { +// state = FP_PRE_GENP_DEF_PAUSED; +// } return state; } Index: firmware/App/Monitors/Temperature.c =================================================================== diff -u -r337136fc77fe5628fa727aac6252a06238561a10 -r6dd382e3988fac2f9ee041b4738d67305e17a6a2 --- firmware/App/Monitors/Temperature.c (.../Temperature.c) (revision 337136fc77fe5628fa727aac6252a06238561a10) +++ firmware/App/Monitors/Temperature.c (.../Temperature.c) (revision 6dd382e3988fac2f9ee041b4738d67305e17a6a2) @@ -15,8 +15,11 @@ * ***************************************************************************/ +#include "Conductivity.h" +#include "Flow.h" #include "Messaging.h" #include "MessageSupport.h" +#include "Pressure.h" #include "Temperature.h" #include "TaskPriority.h" #include "Utilities.h" @@ -28,11 +31,18 @@ // ********** private definitions ********** +#define TEMP_SENSORS_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Temperature sensors publish data time interval. +#define DATA_PUBLISH_COUNTER_START_COUNT 30 ///< Data publish counter start count. + // ********** private data ********** +static OVERRIDE_U32_T tempSensorsPublishInterval; ///< Temperature sensor data publication counter. +static U32 dataPublicationTimerCounter; ///< Timer counter used to schedule temp sensor data publication to CAN bus. // ********** private function prototypes ********** +static void publishTemperatureSensorsData( void ); + /*********************************************************************//** * @brief * The initTemperature function initializes the temperature unit. @@ -57,13 +67,68 @@ *************************************************************************/ void execTemperatureSensors( void ) { - return; + publishTemperatureSensorsData(); } +/*********************************************************************//** + * @brief + * The publishTemperatureSensorsData function broadcasts the temperature + * sensors data at the publication interval. + * @details \b Inputs: dataPublicationTimerCounter, tempSensorsPublishInterval + * @details \b Outputs: dataPublicationTimerCounter + * @details \b Message \b Sent: MSG_ID_FP_TEMPERATURE_DATA publishes the temperature + * data in a periodic interval. + * @return none + *************************************************************************/ +static void publishTemperatureSensorsData( void ) +{ + if ( ++dataPublicationTimerCounter >= getU32OverrideValue( &tempSensorsPublishInterval ) ) + { + TEMPERATURE_SENSORS_DATA_T data; + data.p10Temp = getFilteredConductivitySensorTemperature( P9_COND ); + data.p19Temp = getFilteredConductivitySensorTemperature( P18_COND ); + data.m1Temp = getFilteredPressureSensorTemperature( M1_PRES ); + data.m3Temp = getFilteredPressureSensorTemperature( M3_PRES ); + data.p8Temp = getFilteredPressureSensorTemperature( P8_PRES ); + data.p13Temp = getFilteredPressureSensorTemperature( P13_PRES ); + data.p17Temp = getFilteredPressureSensorTemperature( P17_PRES ); + data.x1Temp = getFilteredPressureSensorTemperature( X1_PRES ); + data.x2Temp = getFilteredPressureSensorTemperature( X2_PRES ); + data.x3Temp = getFilteredPressureSensorTemperature( X3_PRES ); + data.x4Temp = getFilteredPressureSensorTemperature( X4_PRES ); + data.p7Temp = getFilteredFlowSensorTemperature( P7_FLOW ); + data.p16Temp = getFilteredFlowSensorTemperature( P16_FLOW ); + + broadcastData( MSG_ID_FP_TEMPERATURE_DATA, COMM_BUFFER_OUT_CAN_FP_BROADCAST, (U08*)&data, sizeof( TEMPERATURE_SENSORS_DATA_T ) ); + dataPublicationTimerCounter = 0; + } +} + + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ + + +/*********************************************************************//** + * @brief + * The testTemperatureSensorsDataPublishIntervalOverride function overrides the + * temperature sensors data publish interval. + * @details \b Inputs: none + * @details \b Outputs: tempSensorsPublishInterval + * @param Override message from Dialin which includes the interval + * (in ms) to override the temperature sensor data broadcast interval to. + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testTemperatureSensorsDataPublishIntervalOverride( MESSAGE_T *message ) +{ + BOOL result = u32BroadcastIntervalOverride( message, &tempSensorsPublishInterval, TASK_PRIORITY_INTERVAL ); + + return result; +} + + /**@}*/ Index: firmware/App/Monitors/Temperature.h =================================================================== diff -u -r337136fc77fe5628fa727aac6252a06238561a10 -r6dd382e3988fac2f9ee041b4738d67305e17a6a2 --- firmware/App/Monitors/Temperature.h (.../Temperature.h) (revision 337136fc77fe5628fa727aac6252a06238561a10) +++ firmware/App/Monitors/Temperature.h (.../Temperature.h) (revision 6dd382e3988fac2f9ee041b4738d67305e17a6a2) @@ -32,11 +32,31 @@ // ********** public definitions ********** +/// Temperature sensors data structure. +typedef struct +{ + F32 p10Temp; ///< P10 temperature from inlet conductivity sensor. + F32 p19Temp; ///< P19 temperature from outlet conductivity sensor. + F32 m1Temp; ///< Temperature before pressure regulator (M1) + F32 m3Temp; ///< Temperature after pressure regulator (M3) + F32 p8Temp; ///< Temperature before inlet conductivity sensor (P8) + F32 p13Temp; ///< Temperature before RO filter (P13) + F32 p17Temp; ///< Temperature after RO filter (P17) + F32 x1Temp; ///< Temperature before RO pump (X1) + F32 x2Temp; ///< Temperature RO Concentrate + F32 x3Temp; ///< Temperature RO Concentrate drop + F32 x4Temp; ///< Temperature drain drop + F32 p7Temp; ///< Temperature RO inlet + F32 p16Temp; ///< Temperature RO outlet +} TEMPERATURE_SENSORS_DATA_T; + // ********** public function prototypes ********** void initTemperature( void ); void execTemperatureSensors( void ); +BOOL testTemperatureSensorsDataPublishIntervalOverride( MESSAGE_T *message ); + /**@}*/ #endif Index: firmware/App/Monitors/WaterQualityMonitor.c =================================================================== diff -u -r94d93795b2a516b3bdd7fc7030eb5eac933bfcd0 -r6dd382e3988fac2f9ee041b4738d67305e17a6a2 --- firmware/App/Monitors/WaterQualityMonitor.c (.../WaterQualityMonitor.c) (revision 94d93795b2a516b3bdd7fc7030eb5eac933bfcd0) +++ firmware/App/Monitors/WaterQualityMonitor.c (.../WaterQualityMonitor.c) (revision 6dd382e3988fac2f9ee041b4738d67305e17a6a2) @@ -35,8 +35,6 @@ // ********** private definitions ********** -#define TEMP_SENSORS_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Temperature sensors publish data time interval. -#define DATA_PUBLISH_COUNTER_START_COUNT 30 ///< Data publish counter start count. #define INLET_TEMPERATURE_LOW_THRESHOLD_C 5.0F ///< Minimum allowed Inlet temperature in C. #define INLET_TEMPERATURE_HIGH_THRESHOLD_C 30.0F ///< Maximum allowed Inlet temperature in C. #define INLET_TEMPERATURE_PERSISTENCE_TIMER_MS ( 5 * MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Persistence timer to trigger alarm in ms. @@ -61,11 +59,8 @@ // ********** private data ********** -static OVERRIDE_U32_T tempSensorsPublishInterval; ///< Temperature sensor data publication counter. -static U32 dataPublicationTimerCounter; ///< Timer counter used to schedule temp sensor data publication to CAN bus. // ********** private function prototypes ********** -static void publishTemperatureSensorsData( void ); /*********************************************************************//** * @brief @@ -76,13 +71,7 @@ *************************************************************************/ void initWaterQualityMonitor( void ) { - dataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; - tempSensorsPublishInterval.data = TEMP_SENSORS_DATA_PUBLISH_INTERVAL; - tempSensorsPublishInterval.ovData = TEMP_SENSORS_DATA_PUBLISH_INTERVAL; - tempSensorsPublishInterval.ovInitData = 0; - tempSensorsPublishInterval.override = OVERRIDE_RESET; - // Pressure alarms initPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_LOW_RANGE, INLET_WATER_PRES_OUT_OF_RANGE_CLEAR_MS, INLET_WATER_PRES_OUT_OF_RANGE_TIMEOUT_MS ); initPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_HIGH_RANGE, INLET_WATER_PRES_OUT_OF_RANGE_CLEAR_MS, INLET_WATER_PRES_OUT_OF_RANGE_TIMEOUT_MS ); @@ -101,19 +90,6 @@ /*********************************************************************//** * @brief - * The execWaterQualityMonitor function executes the water quality - * state machine. - * @details \b Inputs: none - * @details \b Outputs: none - * @return none - *************************************************************************/ -void execWaterQualityMonitor( void ) -{ - publishTemperatureSensorsData(); -} - -/*********************************************************************//** - * @brief * The checkInletPressures function checks the inlet water pressure * against the pressure threshold and alarm if the pressure is out of range. * @details \b Inputs: pressureM1 @@ -259,62 +235,10 @@ checkPersistentAlarm( ALARM_ID_FP_RO_OUTLET_CONDUCTIVITY_HIGH_RANGE, isConductivityOutOfLowRange, conductivityP18, OUTLET_CONDUCTIVITY_HIGH_THRESHOLD_US ); } -/*********************************************************************//** - * @brief - * The publishTemperatureSensorsData function broadcasts the temperature - * sensors data at the publication interval. - * @details \b Inputs: dataPublicationTimerCounter, tempSensorsPublishInterval - * @details \b Outputs: dataPublicationTimerCounter - * @details \b Message \b Sent: MSG_ID_FP_TEMPERATURE_DATA publishes the temperature - * data in a periodic interval. - * @return none - *************************************************************************/ -static void publishTemperatureSensorsData( void ) -{ - if ( ++dataPublicationTimerCounter >= getU32OverrideValue( &tempSensorsPublishInterval ) ) - { - TEMPERATURE_SENSORS_DATA_T data; - data.p10Temp = getFilteredConductivitySensorTemperature( P9_COND ); - data.p19Temp = getFilteredConductivitySensorTemperature( P18_COND ); - data.m1Temp = getFilteredPressureSensorTemperature( M1_PRES ); - data.m3Temp = getFilteredPressureSensorTemperature( M3_PRES ); - data.p8Temp = getFilteredPressureSensorTemperature( P8_PRES ); - data.p13Temp = getFilteredPressureSensorTemperature( P13_PRES ); - data.p17Temp = getFilteredPressureSensorTemperature( P17_PRES ); - data.x1Temp = getFilteredPressureSensorTemperature( X1_PRES ); - data.x2Temp = getFilteredPressureSensorTemperature( X2_PRES ); - data.x3Temp = getFilteredPressureSensorTemperature( X3_PRES ); - data.x4Temp = getFilteredPressureSensorTemperature( X4_PRES ); - data.p7Temp = getFilteredFlowSensorTemperature( P7_FLOW ); - data.p16Temp = getFilteredFlowSensorTemperature( P16_FLOW ); - - broadcastData( MSG_ID_FP_TEMPERATURE_DATA, COMM_BUFFER_OUT_CAN_FP_BROADCAST, (U08*)&data, sizeof( TEMPERATURE_SENSORS_DATA_T ) ); - dataPublicationTimerCounter = 0; - } -} - - /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ -/*********************************************************************//** - * @brief - * The testTemperatureSensorsDataPublishIntervalOverride function overrides the - * temperature sensors data publish interval. - * @details \b Inputs: none - * @details \b Outputs: tempSensorsPublishInterval - * @param Override message from Dialin which includes the interval - * (in ms) to override the temperature sensor data broadcast interval to. - * @return TRUE if override successful, FALSE if not - *************************************************************************/ -BOOL testTemperatureSensorsDataPublishIntervalOverride( MESSAGE_T *message ) -{ - BOOL result = u32BroadcastIntervalOverride( message, &tempSensorsPublishInterval, TASK_PRIORITY_INTERVAL ); - - return result; -} - /**@}*/ Index: firmware/App/Monitors/WaterQualityMonitor.h =================================================================== diff -u -r337136fc77fe5628fa727aac6252a06238561a10 -r6dd382e3988fac2f9ee041b4738d67305e17a6a2 --- firmware/App/Monitors/WaterQualityMonitor.h (.../WaterQualityMonitor.h) (revision 337136fc77fe5628fa727aac6252a06238561a10) +++ firmware/App/Monitors/WaterQualityMonitor.h (.../WaterQualityMonitor.h) (revision 6dd382e3988fac2f9ee041b4738d67305e17a6a2) @@ -32,23 +32,6 @@ // ********** public definitions ********** -/// Temperature sensors data structure. -typedef struct -{ - F32 p10Temp; ///< P10 temperature from inlet conductivity sensor. - F32 p19Temp; ///< P19 temperature from outlet conductivity sensor. - F32 m1Temp; ///< Temperature before pressure regulator (M1) - F32 m3Temp; ///< Temperature after pressure regulator (M3) - F32 p8Temp; ///< Temperature before inlet conductivity sensor (P8) - F32 p13Temp; ///< Temperature before RO filter (P13) - F32 p17Temp; ///< Temperature after RO filter (P17) - F32 x1Temp; ///< Temperature before RO pump (X1) - F32 x2Temp; ///< Temperature RO Concentrate - F32 x3Temp; ///< Temperature RO Concentrate drop - F32 x4Temp; ///< Temperature drain drop - F32 p7Temp; ///< Temperature RO inlet - F32 p16Temp; ///< Temperature RO outlet -} TEMPERATURE_SENSORS_DATA_T; // ********** public definitions ********** void initWaterQualityMonitor( void ); @@ -60,6 +43,4 @@ void checkInletConductivity( void ); void checkOutletConductivity( void ); -BOOL testTemperatureSensorsDataPublishIntervalOverride( MESSAGE_T *message ); - #endif Index: firmware/App/Services/AlarmMgmtFP.c =================================================================== diff -u -rf79d3737907fd08293d56f60f9f439ac68c81855 -r6dd382e3988fac2f9ee041b4738d67305e17a6a2 --- firmware/App/Services/AlarmMgmtFP.c (.../AlarmMgmtFP.c) (revision f79d3737907fd08293d56f60f9f439ac68c81855) +++ firmware/App/Services/AlarmMgmtFP.c (.../AlarmMgmtFP.c) (revision 6dd382e3988fac2f9ee041b4738d67305e17a6a2) @@ -386,39 +386,47 @@ * @brief * The testClearAllAlarms function clears all active alarms, even if they * are non-recoverable or faults. The caller of this function must provide - * the correct 32-bit key. A Dialin user must also be logged into DD. + * the correct 32-bit key. A Dialin user must also be logged into TD. + * @details \b Message \b Sent: MSG_ID_ALARM_CLEARED for each active alarm. * @details \b Inputs: none * @details \b Outputs: alarmIsActive[], alarmStartedAt[] - * @details \b Message \b Sent: MSG_ID_ALARM_CLEARED to clear all alarms. - * @param key 32-bit supervisor alarm key required to perform this function - * @return TRUE if override reset successful, FALSE if not + * @param message Pointer to a clear all alarms message which contains a + * 32-bit supervisor alarm key required to perform this function + * @return TRUE if command was successful, FALSE if rejected *************************************************************************/ -BOOL testClearAllAlarms( U32 key ) +BOOL testClearAllAlarms( MESSAGE_T *message ) { BOOL result = FALSE; + U32 key; - // Verify key - if ( SUPERVISOR_ALARM_KEY == key ) + // Verify tester has logged in with TD + if ( TRUE == isTestingActivated() ) { - // Verify tester has logged in with HD - if ( TRUE == isTestingActivated() ) + // Verify payload length + if ( sizeof(U32) == message->hdr.payloadLen ) { - ALARM_ID_T a; + memcpy( &key, message->payload, sizeof(U32) ); - // Clear all active alarms - for ( a = ALARM_ID_NO_ALARM; a < NUM_OF_ALARM_IDS; a++ ) + // Verify key + if ( SUPERVISOR_ALARM_KEY == key ) { - if ( TRUE == isAlarmActive( a ) ) + ALARM_ID_T a; + + // Clear all active alarms + for ( a = ALARM_ID_NO_ALARM; a < NUM_OF_ALARM_IDS; a++ ) { - ALARM_NAME_DATA_T data; + if ( TRUE == isAlarmActive( a ) ) + { + ALARM_NAME_DATA_T data; - data.alarmName = (U32)a; + data.alarmName = (U32)a; - broadcastData( MSG_ID_ALARM_CLEARED, COMM_BUFFER_OUT_CAN_FP_ALARM, (U08*)&data, sizeof( ALARM_NAME_DATA_T ) ); - setAlarmActive( a, FALSE ); + broadcastData( MSG_ID_ALARM_CLEARED, COMM_BUFFER_OUT_CAN_FP_ALARM, (U08*)&data, sizeof( ALARM_NAME_DATA_T ) ); + setAlarmActive( a, FALSE ); + } } + result = TRUE; } - result = TRUE; } } Index: firmware/App/Services/AlarmMgmtFP.h =================================================================== diff -u -r410afd26b3ae5e372310c696c82f58c59235e10d -r6dd382e3988fac2f9ee041b4738d67305e17a6a2 --- firmware/App/Services/AlarmMgmtFP.h (.../AlarmMgmtFP.h) (revision 410afd26b3ae5e372310c696c82f58c59235e10d) +++ firmware/App/Services/AlarmMgmtFP.h (.../AlarmMgmtFP.h) (revision 6dd382e3988fac2f9ee041b4738d67305e17a6a2) @@ -47,10 +47,9 @@ BOOL isAnyCleaningModeInletWaterConditionActive( void ); -BOOL testClearAllAlarms( U32 key ); -BOOL testSetAlarmInfoPublishIntervalOverride( U32 ms ); -BOOL testResetAlarmInfoPublishIntervalOverride( void ); +BOOL testClearAllAlarms( MESSAGE_T *message ); + /**@}*/ #endif Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -r8d272582cbd2cb5fc0c6af0fead2867ce02658b0 -r6dd382e3988fac2f9ee041b4738d67305e17a6a2 --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 8d272582cbd2cb5fc0c6af0fead2867ce02658b0) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 6dd382e3988fac2f9ee041b4738d67305e17a6a2) @@ -137,6 +137,7 @@ SW_FAULT_ID_INVALID_FILTERED_CONDUCTIVITY_SENSOR_ID = 120, SW_FAULT_ID_FP_INVALID_CONCENTRATE_FLUSH_STATE = 121, SW_FAULT_ID_FP_INVALD_GENP_DEF_STATE = 122, + SW_FAULT_ID_FP_INVALID_PERMEATE_TANK_STATE = 123, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/Messaging.c =================================================================== diff -u -r1301bfde565dbdae1a8c168090938d94f58cef13 -r6dd382e3988fac2f9ee041b4738d67305e17a6a2 --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision 1301bfde565dbdae1a8c168090938d94f58cef13) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision 6dd382e3988fac2f9ee041b4738d67305e17a6a2) @@ -114,7 +114,10 @@ { MSG_ID_FP_RO_PUMP_STOP_REQUEST, &testROPumpHardStop }, { MSG_ID_FW_VERSIONS_REQUEST, &handleVersionRequestMessage }, { MSG_ID_FP_SAFETY_SHUTDOWN_OVERRIDE_REQUEST, &testSetResetSafetyShutdownOverride }, +{ MSG_ID_FP_ALARM_STATE_OVERRIDE_REQUEST, &testAlarmStateOverride }, +{ MSG_ID_FP_ALARM_CLEAR_ALL_ALARMS_REQUEST, &testClearAllAlarms }, + }; #define NUM_OF_FUNCTION_HANDLERS (sizeof(MSG_FUNCTION_HANDLER_LOOKUP) / sizeof(MSG_HANDLER_LOOKUP_T)) Index: firmware/App/Tasks/TaskGeneral.c =================================================================== diff -u -r94d93795b2a516b3bdd7fc7030eb5eac933bfcd0 -r6dd382e3988fac2f9ee041b4738d67305e17a6a2 --- firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision 94d93795b2a516b3bdd7fc7030eb5eac933bfcd0) +++ firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision 6dd382e3988fac2f9ee041b4738d67305e17a6a2) @@ -3,6 +3,7 @@ #include "AlarmMgmtFP.h" #include "FPOperationModes.h" #include "Messaging.h" +#include "PermeateTank.h" #include "ROPump.h" #include "SystemCommFP.h" #include "TaskGeneral.h" @@ -34,6 +35,9 @@ // Manage data received from other sub-systems execSystemCommRx(); + // Control Permeate Tank + execPermeateTankController(); + // Monitor voltages // execVoltagesMonitor(); Index: firmware/App/Tasks/TaskPriority.c =================================================================== diff -u -r337136fc77fe5628fa727aac6252a06238561a10 -r6dd382e3988fac2f9ee041b4738d67305e17a6a2 --- firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision 337136fc77fe5628fa727aac6252a06238561a10) +++ firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision 6dd382e3988fac2f9ee041b4738d67305e17a6a2) @@ -10,7 +10,6 @@ #include "Temperature.h" #include "Valves.h" #include "WatchdogMgmt.h" -#include "WaterQualityMonitor.h" /** * @addtogroup TaskPriority @@ -42,15 +41,15 @@ // Monitor levels execLevels(); - // Monitor temperatures within water quality module. - execWaterQualityMonitor(); - // Monitor pressure sensors execPressureSensor(); // Monitor flow sensors execFlowMonitor(); + // Monitor Temperature sensors + execTemperatureSensors(); + // Control valves execValves(); Index: firmware/source/sys_main.c =================================================================== diff -u -r94d93795b2a516b3bdd7fc7030eb5eac933bfcd0 -r6dd382e3988fac2f9ee041b4738d67305e17a6a2 --- firmware/source/sys_main.c (.../sys_main.c) (revision 94d93795b2a516b3bdd7fc7030eb5eac933bfcd0) +++ firmware/source/sys_main.c (.../sys_main.c) (revision 6dd382e3988fac2f9ee041b4738d67305e17a6a2) @@ -84,6 +84,7 @@ #include "ModeGenPermeate.h" #include "ModePreGenPermeate.h" #include "MsgQueues.h" +#include "PermeateTank.h" #include "Pressure.h" #include "ROPump.h" #include "SafetyShutdown.h" @@ -196,6 +197,7 @@ initROPump(); initBoostPump(); initValves(); + initPermeateTank(); // Monitors initConductivity();