Index: firmware/App/Controllers/Valves.c =================================================================== diff -u -r410afd26b3ae5e372310c696c82f58c59235e10d -r337136fc77fe5628fa727aac6252a06238561a10 --- firmware/App/Controllers/Valves.c (.../Valves.c) (revision 410afd26b3ae5e372310c696c82f58c59235e10d) +++ firmware/App/Controllers/Valves.c (.../Valves.c) (revision 337136fc77fe5628fa727aac6252a06238561a10) @@ -50,7 +50,8 @@ 0x0020, 0x0040, 0x0080, - 0x0100 + 0x0100, + 0x0200, }; // ********** private data ********** Index: firmware/App/Controllers/Valves.h =================================================================== diff -u -r30d20b2415fa9a6069044a54c3b1fe2c00cb894b -r337136fc77fe5628fa727aac6252a06238561a10 --- firmware/App/Controllers/Valves.h (.../Valves.h) (revision 30d20b2415fa9a6069044a54c3b1fe2c00cb894b) +++ firmware/App/Controllers/Valves.h (.../Valves.h) (revision 337136fc77fe5628fa727aac6252a06238561a10) @@ -33,12 +33,15 @@ { M4_VALV = 0, ///< Valve (M4) FIRST_VALVE = M4_VALV, ///< First valve - P39_VALV, ///< Valve (P39) + M7_VALV, ///< Valve (M7) P6_VALV, ///< Valve (P6) P11_VALV, ///< Valve (P11) P33_VALV, ///< Valve (P33) P34_VALV, ///< Valve (P34) P37_VALV, ///< Valve (P37) + P39_VALV, ///< Valve (P39) + P20_VALV, ///< Valve (P20) + P43_VALV, ///< Valve (P43) NUM_OF_VALVES ///< Number of valves } VALVES_T; Index: firmware/App/Modes/FlushConcentrate.c =================================================================== diff -u -r921198ed4c337cd5bcebbeedd7d724da4b1e23be -r337136fc77fe5628fa727aac6252a06238561a10 --- firmware/App/Modes/FlushConcentrate.c (.../FlushConcentrate.c) (revision 921198ed4c337cd5bcebbeedd7d724da4b1e23be) +++ firmware/App/Modes/FlushConcentrate.c (.../FlushConcentrate.c) (revision 337136fc77fe5628fa727aac6252a06238561a10) @@ -204,12 +204,15 @@ { case CONC_FLUSH_IN_PROGRESS: 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_CLOSED ); setValveState( P34_VALV, VALVE_STATE_CLOSED ); setValveState( P37_VALV, VALVE_STATE_OPEN ); setValveState( P39_VALV, VALVE_STATE_OPEN ); + setValveState( P20_VALV, VALVE_STATE_CLOSED ); + setValveState( P43_VALV, VALVE_STATE_CLOSED ); if ( TRUE == isBoostPumpInstalled() ) { @@ -226,12 +229,15 @@ if ( FALSE == isConcentrateFlushComplete() ) { 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_CLOSED ); setValveState( P34_VALV, VALVE_STATE_CLOSED ); setValveState( P37_VALV, VALVE_STATE_CLOSED ); setValveState( P39_VALV, VALVE_STATE_CLOSED ); + setValveState( P20_VALV, VALVE_STATE_CLOSED ); + setValveState( P43_VALV, VALVE_STATE_CLOSED ); if ( TRUE == isBoostPumpInstalled() ) { Index: firmware/App/Modes/FlushFilter.c =================================================================== diff -u -r29a015bc3ce9b9cdfcb033fb47d70af6a5ea3be9 -r337136fc77fe5628fa727aac6252a06238561a10 --- firmware/App/Modes/FlushFilter.c (.../FlushFilter.c) (revision 29a015bc3ce9b9cdfcb033fb47d70af6a5ea3be9) +++ firmware/App/Modes/FlushFilter.c (.../FlushFilter.c) (revision 337136fc77fe5628fa727aac6252a06238561a10) @@ -192,12 +192,15 @@ { case FILTER_FLUSH_IN_PROGRESS: setValveState( M4_VALV, VALVE_STATE_OPEN ); + setValveState( M7_VALV, VALVE_STATE_CLOSED ); setValveState( P6_VALV, VALVE_STATE_OPEN ); setValveState( P11_VALV, VALVE_STATE_CLOSED ); setValveState( P33_VALV, VALVE_STATE_CLOSED ); 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 ); filterFlushTimer = getMSTimerCount(); break; @@ -206,12 +209,15 @@ if ( FALSE == isFilterFlushComplete() ) { 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_CLOSED ); setValveState( P34_VALV, VALVE_STATE_CLOSED ); setValveState( P37_VALV, VALVE_STATE_CLOSED ); setValveState( P39_VALV, VALVE_STATE_CLOSED ); + setValveState( P20_VALV, VALVE_STATE_CLOSED ); + setValveState( P43_VALV, VALVE_STATE_CLOSED ); } break; Index: firmware/App/Modes/FlushPermeate.c =================================================================== diff -u -r921198ed4c337cd5bcebbeedd7d724da4b1e23be -r337136fc77fe5628fa727aac6252a06238561a10 --- firmware/App/Modes/FlushPermeate.c (.../FlushPermeate.c) (revision 921198ed4c337cd5bcebbeedd7d724da4b1e23be) +++ firmware/App/Modes/FlushPermeate.c (.../FlushPermeate.c) (revision 337136fc77fe5628fa727aac6252a06238561a10) @@ -206,12 +206,15 @@ { case PERM_FLUSH_IN_PROGRESS: 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_CLOSED ); 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() ) { @@ -229,12 +232,15 @@ if ( FALSE == isPermeateFlushComplete() ) { 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_CLOSED ); setValveState( P34_VALV, VALVE_STATE_CLOSED ); setValveState( P37_VALV, VALVE_STATE_CLOSED ); setValveState( P39_VALV, VALVE_STATE_CLOSED ); + setValveState( P20_VALV, VALVE_STATE_CLOSED ); + setValveState( P43_VALV, VALVE_STATE_CLOSED ); if ( TRUE == isBoostPumpInstalled() ) { Index: firmware/App/Modes/ModeFault.c =================================================================== diff -u -r30d20b2415fa9a6069044a54c3b1fe2c00cb894b -r337136fc77fe5628fa727aac6252a06238561a10 --- firmware/App/Modes/ModeFault.c (.../ModeFault.c) (revision 30d20b2415fa9a6069044a54c3b1fe2c00cb894b) +++ firmware/App/Modes/ModeFault.c (.../ModeFault.c) (revision 337136fc77fe5628fa727aac6252a06238561a10) @@ -11,7 +11,7 @@ #include "Valves.h" /** - * @addtogroup ROFaultMode + * @addtogroup FPFaultMode * @{ */ Index: firmware/App/Modes/ModeGenPermeate.c =================================================================== diff -u -r30d20b2415fa9a6069044a54c3b1fe2c00cb894b -r337136fc77fe5628fa727aac6252a06238561a10 --- firmware/App/Modes/ModeGenPermeate.c (.../ModeGenPermeate.c) (revision 30d20b2415fa9a6069044a54c3b1fe2c00cb894b) +++ firmware/App/Modes/ModeGenPermeate.c (.../ModeGenPermeate.c) (revision 337136fc77fe5628fa727aac6252a06238561a10) @@ -167,12 +167,16 @@ { 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 ); @@ -181,12 +185,15 @@ 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() ) { Index: firmware/App/Modes/ModeGenPermeateDefeatured.c =================================================================== diff -u -r8d272582cbd2cb5fc0c6af0fead2867ce02658b0 -r337136fc77fe5628fa727aac6252a06238561a10 --- firmware/App/Modes/ModeGenPermeateDefeatured.c (.../ModeGenPermeateDefeatured.c) (revision 8d272582cbd2cb5fc0c6af0fead2867ce02658b0) +++ firmware/App/Modes/ModeGenPermeateDefeatured.c (.../ModeGenPermeateDefeatured.c) (revision 337136fc77fe5628fa727aac6252a06238561a10) @@ -139,22 +139,28 @@ { case FP_GENP_DEF_SUPPLY_WATER: setValveState( M4_VALV, VALVE_STATE_OPEN ); + setValveState( M7_VALV, VALVE_STATE_CLOSED ); setValveState( P6_VALV, VALVE_STATE_CLOSED ); setValveState( P11_VALV, VALVE_STATE_CLOSED ); setValveState( P33_VALV, VALVE_STATE_CLOSED ); setValveState( P34_VALV, VALVE_STATE_CLOSED ); setValveState( P37_VALV, VALVE_STATE_CLOSED ); setValveState( P39_VALV, VALVE_STATE_CLOSED ); + setValveState( P20_VALV, VALVE_STATE_CLOSED ); + setValveState( P43_VALV, VALVE_STATE_CLOSED ); break; case FP_GENP_DEF_PAUSED: 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_CLOSED ); setValveState( P34_VALV, VALVE_STATE_CLOSED ); setValveState( P37_VALV, VALVE_STATE_CLOSED ); setValveState( P39_VALV, VALVE_STATE_CLOSED ); + setValveState( P20_VALV, VALVE_STATE_CLOSED ); + setValveState( P43_VALV, VALVE_STATE_CLOSED ); break; default: Index: firmware/App/Modes/ModePreGenPermeate.c =================================================================== diff -u -rf4870116c87345ee0ea062df5b30187e1e113ddc -r337136fc77fe5628fa727aac6252a06238561a10 --- firmware/App/Modes/ModePreGenPermeate.c (.../ModePreGenPermeate.c) (revision f4870116c87345ee0ea062df5b30187e1e113ddc) +++ firmware/App/Modes/ModePreGenPermeate.c (.../ModePreGenPermeate.c) (revision 337136fc77fe5628fa727aac6252a06238561a10) @@ -184,12 +184,15 @@ case FP_PRE_GENP_VERIFY_WATER: 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() ) { Index: firmware/App/Modes/ModePreGenPermeateDefeatured.c =================================================================== diff -u -r1cf11f4c1f6a1f1fd40270889723fbec040fc7ec -r337136fc77fe5628fa727aac6252a06238561a10 --- firmware/App/Modes/ModePreGenPermeateDefeatured.c (.../ModePreGenPermeateDefeatured.c) (revision 1cf11f4c1f6a1f1fd40270889723fbec040fc7ec) +++ firmware/App/Modes/ModePreGenPermeateDefeatured.c (.../ModePreGenPermeateDefeatured.c) (revision 337136fc77fe5628fa727aac6252a06238561a10) @@ -150,34 +150,43 @@ { case FP_PRE_GENP_DEF_FLUSH: setValveState( M4_VALV, VALVE_STATE_OPEN ); + setValveState( M7_VALV, VALVE_STATE_CLOSED ); setValveState( P6_VALV, VALVE_STATE_CLOSED ); setValveState( P11_VALV, VALVE_STATE_CLOSED ); setValveState( P33_VALV, VALVE_STATE_CLOSED ); setValveState( P34_VALV, VALVE_STATE_CLOSED ); setValveState( P37_VALV, VALVE_STATE_CLOSED ); setValveState( P39_VALV, VALVE_STATE_CLOSED ); + setValveState( P20_VALV, VALVE_STATE_CLOSED ); + setValveState( P43_VALV, VALVE_STATE_CLOSED ); preGenPermeateDefFlushTimer = getMSTimerCount(); break; case FP_PRE_GENP_DEF_INLET_WATER_CHECK: setValveState( M4_VALV, VALVE_STATE_OPEN ); + setValveState( M7_VALV, VALVE_STATE_CLOSED ); setValveState( P6_VALV, VALVE_STATE_CLOSED ); setValveState( P11_VALV, VALVE_STATE_CLOSED ); setValveState( P33_VALV, VALVE_STATE_CLOSED ); setValveState( P34_VALV, VALVE_STATE_CLOSED ); setValveState( P37_VALV, VALVE_STATE_CLOSED ); setValveState( P39_VALV, VALVE_STATE_CLOSED ); + setValveState( P20_VALV, VALVE_STATE_CLOSED ); + setValveState( P43_VALV, VALVE_STATE_CLOSED ); preGenPermeateDefWaterCheckTimer = getMSTimerCount(); break; case FP_PRE_GENP_DEF_PAUSED: 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_CLOSED ); setValveState( P34_VALV, VALVE_STATE_CLOSED ); setValveState( P37_VALV, VALVE_STATE_CLOSED ); setValveState( P39_VALV, VALVE_STATE_CLOSED ); + setValveState( P20_VALV, VALVE_STATE_CLOSED ); + setValveState( P43_VALV, VALVE_STATE_CLOSED ); break; default: Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r30d20b2415fa9a6069044a54c3b1fe2c00cb894b -r337136fc77fe5628fa727aac6252a06238561a10 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 30d20b2415fa9a6069044a54c3b1fe2c00cb894b) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 337136fc77fe5628fa727aac6252a06238561a10) @@ -67,12 +67,15 @@ initStandbyMode(); 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_CLOSED ); setValveState( P34_VALV,VALVE_STATE_CLOSED ); setValveState( P37_VALV, VALVE_STATE_CLOSED ); setValveState( P39_VALV,VALVE_STATE_CLOSED ); + setValveState( P20_VALV, VALVE_STATE_CLOSED ); + setValveState( P43_VALV, VALVE_STATE_CLOSED ); signalROPumpHardStop(); Index: firmware/App/Monitors/Conductivity.c =================================================================== diff -u -r8d272582cbd2cb5fc0c6af0fead2867ce02658b0 -r337136fc77fe5628fa727aac6252a06238561a10 --- firmware/App/Monitors/Conductivity.c (.../Conductivity.c) (revision 8d272582cbd2cb5fc0c6af0fead2867ce02658b0) +++ firmware/App/Monitors/Conductivity.c (.../Conductivity.c) (revision 337136fc77fe5628fa727aac6252a06238561a10) @@ -37,34 +37,46 @@ // ********** private definitions ********** -#define COND_SENSOR_REPORT_PERIOD ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Broadcast conductivity values message every second. -#define DATA_PUBLISH_COUNTER_START_COUNT 40 ///< Data publish counter start count. -#define CONDUCTIVITY_SAMPLE_FILTER_MS ( 500 ) ///< Filter conductivity data for given time -#define CONDUCTIVITY_TEMP_SAMPLE_FILTER_MS ( 500 ) ///< Filter conductivity temperature data for given time -#define SIZE_OF_FLOW_ROLLING_AVG ( CONDUCTIVITY_SAMPLE_FILTER_MS / TASK_PRIORITY_INTERVAL ) ///< Filtered conductivity moving average sample count. -#define SIZE_OF_FLOW_TEMP_ROLLING_AVG ( CONDUCTIVITY_TEMP_SAMPLE_FILTER_MS / TASK_PRIORITY_INTERVAL ) ///< Filtered conductivity temprature moving average sample count. +#define COND_SENSOR_REPORT_PERIOD ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Broadcast conductivity values message every second. +#define DATA_PUBLISH_COUNTER_START_COUNT 40 ///< Data publish counter start count. +#define CONDUCTIVITY_SAMPLE_FILTER_MS ( 500 ) ///< Filter conductivity data for given time +#define CONDUCTIVITY_TEMP_SAMPLE_FILTER_MS ( 500 ) ///< Filter conductivity temperature data for given time +#define SIZE_OF_FLOW_ROLLING_AVG ( CONDUCTIVITY_SAMPLE_FILTER_MS / TASK_PRIORITY_INTERVAL ) ///< Filtered conductivity moving average sample count. +#define SIZE_OF_FLOW_TEMP_ROLLING_AVG ( CONDUCTIVITY_TEMP_SAMPLE_FILTER_MS / TASK_PRIORITY_INTERVAL ) ///< Filtered conductivity temprature moving average sample count. /// Filter conductivity readings record. typedef struct { - F32 conductivityReadings[ SIZE_OF_FLOW_ROLLING_AVG ]; ///< Holds conductivity sample rolling average. - U32 conductivityReadingsIdx; ///< Index for next sample in rolling average array. - F32 conductivityReadingsTotal; ///< Rolling total - used to calc average. - U32 conductivityReadingsCount; ///< Number of samples in rolling average buffer + F32 conductivityReadings[ SIZE_OF_FLOW_ROLLING_AVG ]; ///< Holds conductivity sample rolling average. + U32 conductivityReadingsIdx; ///< Index for next sample in rolling average array. + F32 conductivityReadingsTotal; ///< Rolling total - used to calc average. + U32 conductivityReadingsCount; ///< Number of samples in rolling average buffer } FILTER_CONDUCTIVITY_READINGS_T; +/// Filter conductivity sensor temperature readings record. +typedef struct +{ + F32 conductivityTempReadings[ SIZE_OF_FLOW_ROLLING_AVG ]; ///< Holds conductivity sample rolling average. + U32 conductivityTempReadingsIdx; ///< Index for next sample in rolling average array. + F32 conductivityTempReadingsTotal; ///< Rolling total - used to calc average. + U32 conductivityTempReadingsCount; ///< Number of samples in rolling average buffer +} FILTER_CONDUCTIVITY_TEMPERATURE_READINGS_T; + // ********** private data ********** -static FILTER_CONDUCTIVITY_READINGS_T filteredConductivityReadings[NUM_OF_CONDUCTIVITY_SENSORS]; ///< Filtered conductivity reading for conductivity sensors. -static OVERRIDE_F32_T filteredcurrentConductivityReadings[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< filtered current conductivity sensor conductivity readings (overrideable). -static U32 conductivityPublishTimerCounter; ///< Conductivity data publication counter. -static OVERRIDE_U32_T conductivityDataPublishInterval; ///< Conductivity sensors publish time interval override. +static FILTER_CONDUCTIVITY_READINGS_T filteredConductivityReadings[NUM_OF_CONDUCTIVITY_SENSORS]; ///< Filtered conductivity reading for conductivity sensors. +static OVERRIDE_F32_T filteredcurrentConductivityReadings[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< filtered current conductivity sensor conductivity readings (overrideable). +static FILTER_CONDUCTIVITY_TEMPERATURE_READINGS_T filteredConductivityTemperatureReadings[NUM_OF_CONDUCTIVITY_SENSORS]; ///< Filtered temperature reading for conductivity sensors. +static OVERRIDE_F32_T filteredcurrentTemperatureReadings[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< filtered current conductivity sensor temperature readings (overrideable). +static U32 conductivityPublishTimerCounter; ///< Conductivity data publication counter. +static OVERRIDE_U32_T conductivityDataPublishInterval; ///< Conductivity sensors publish time interval override. // ********** private function prototypes ********** static void publishConductivitySensorsData( void ); static void filterConductivitySensors( void ); static void filterConductivitySensorReadings( void ); +static void filterConductivitySensorTemperatureReadings( void ); /*********************************************************************//** * @brief @@ -93,14 +105,21 @@ filteredConductivityReadings[ sensor ].conductivityReadingsIdx = 0; filteredConductivityReadings[ sensor ].conductivityReadingsTotal = 0.0F; filteredConductivityReadings[ sensor ].conductivityReadingsCount = 0; + + filteredcurrentTemperatureReadings[ sensor ].data = 0.0F; + filteredcurrentTemperatureReadings[ sensor ].ovData = 0.0F; + filteredcurrentTemperatureReadings[ sensor ].ovInitData = 0.0F; + filteredcurrentTemperatureReadings[ sensor ].override = OVERRIDE_RESET; + + filteredConductivityTemperatureReadings[ sensor ].conductivityTempReadingsIdx = 0; + filteredConductivityTemperatureReadings[ sensor ].conductivityTempReadingsTotal = 0.0F; + filteredConductivityTemperatureReadings[ sensor ].conductivityTempReadingsCount = 0; } conductivityDataPublishInterval.data = COND_SENSOR_REPORT_PERIOD; conductivityDataPublishInterval.ovData = COND_SENSOR_REPORT_PERIOD; conductivityDataPublishInterval.ovInitData = 0; conductivityDataPublishInterval.override = OVERRIDE_RESET; - - } /*********************************************************************//** @@ -131,15 +150,18 @@ /*********************************************************************//** * @brief - * The filterConductivitySensors function gets averages the raw conductivity. + * The filterConductivitySensors function gets averages the raw conductivity + * and temperature from the conductivity sensor. * @details \b Inputs: conductivity readings from FPGA - * @details \b Outputs: filteredConductivityReadings[] + * @details \b Outputs: filteredConductivityReadings[], filterConductivitySensorTemperatureReadings[] * @return none *************************************************************************/ static void filterConductivitySensors( void ) { //Filter conductivity sensor reading filterConductivitySensorReadings(); + //Filter conductivity sensor temperature + filterConductivitySensorTemperatureReadings(); } /*********************************************************************//** @@ -186,16 +208,16 @@ for ( sensor = CONDUCTIVITYSENSORS_FIRST; sensor < NUM_OF_CONDUCTIVITY_SENSORS; sensor++ ) { - F32 rawFlow = (F32)getConductivityValue( sensor ); + F32 rawCond = (F32)getConductivityValue( sensor ); // TODO - calibrate if ( filteredConductivityReadings[sensor].conductivityReadingsCount >= SIZE_OF_FLOW_ROLLING_AVG ) { filteredConductivityReadings[sensor].conductivityReadingsTotal -= filteredConductivityReadings[sensor].conductivityReadings[ filteredConductivityReadings[sensor].conductivityReadingsIdx ]; } - filteredConductivityReadings[sensor].conductivityReadings[ filteredConductivityReadings[sensor].conductivityReadingsIdx ] = rawFlow; - filteredConductivityReadings[sensor].conductivityReadingsTotal += rawFlow; + filteredConductivityReadings[sensor].conductivityReadings[ filteredConductivityReadings[sensor].conductivityReadingsIdx ] = rawCond; + filteredConductivityReadings[sensor].conductivityReadingsTotal += rawCond; filteredConductivityReadings[sensor].conductivityReadingsIdx = INC_WRAP( filteredConductivityReadings[sensor].conductivityReadingsIdx, 0, SIZE_OF_FLOW_ROLLING_AVG - 1 ); filteredConductivityReadings[sensor].conductivityReadingsCount = INC_CAP( filteredConductivityReadings[sensor].conductivityReadingsCount, SIZE_OF_FLOW_ROLLING_AVG ); filteredcurrentConductivityReadings[sensor].data = filteredConductivityReadings[sensor].conductivityReadingsTotal / (F32)filteredConductivityReadings[sensor].conductivityReadingsCount; @@ -204,11 +226,71 @@ /*********************************************************************//** * @brief - * The publishConductivitySensorsData function publishes RO conductivity data + * The getFilteredConductivitySensorTemperature function gets the filtered + * temperature (in C) for a given conductivity sensor. + * @details \b Alarm: ALARM_ID_FP_SOFTWARE_FAULT if given sensor is invalid. + * @details \b Inputs: filteredConductivityTemperatureReadings[] + * @details \b Outputs: none + * @param sensor ID of conductivity sensor to get filtered conductivity reading for. + * @return The filtered current temperature (in C) for the given conductivity sensor + *************************************************************************/ +F32 getFilteredConductivitySensorTemperature( CONDUCTIVITY_SENSORS_T sensor ) +{ + F32 result = 0.0F; + + if ( sensor < NUM_OF_CONDUCTIVITY_SENSORS ) + { + result = filteredcurrentTemperatureReadings[ sensor ].data; + if ( OVERRIDE_KEY == filteredcurrentTemperatureReadings[ sensor ].override ) + { + result = filteredcurrentTemperatureReadings[ sensor ].ovData; + } + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_FILTERED_CONDUCTIVITY_SENSOR_ID, (U32)sensor ) + } + + return result; +} + +/*********************************************************************//** + * @brief + * The filterConductivitySensorTemperatureReadings function filters the temperature + * rates for defined interval to get average conductivity rates. + * @details \b Inputs: filteredConductivityTemperatureReadings[] + * @details \b Outputs: filteredConductivityTemperatureReadings[], filteredcurrentTemperatureReadings[] + * @return none + *************************************************************************/ +static void filterConductivitySensorTemperatureReadings( void ) +{ + CONDUCTIVITY_SENSORS_T sensor; + + for ( sensor = CONDUCTIVITYSENSORS_FIRST; sensor < NUM_OF_CONDUCTIVITY_SENSORS; sensor++ ) + { + F32 rawTemp = (F32)getConductivityTemperatureValue( sensor ); + + // TODO - calibrate + + if ( filteredConductivityTemperatureReadings[sensor].conductivityTempReadingsCount >= SIZE_OF_FLOW_ROLLING_AVG ) + { + filteredConductivityTemperatureReadings[sensor].conductivityTempReadingsTotal -= filteredConductivityTemperatureReadings[sensor].conductivityTempReadings[ filteredConductivityTemperatureReadings[sensor].conductivityTempReadingsIdx ]; + } + filteredConductivityTemperatureReadings[sensor].conductivityTempReadings[ filteredConductivityTemperatureReadings[sensor].conductivityTempReadingsIdx ] = rawTemp; + filteredConductivityTemperatureReadings[sensor].conductivityTempReadingsTotal += rawTemp; + filteredConductivityTemperatureReadings[sensor].conductivityTempReadingsIdx = INC_WRAP( filteredConductivityTemperatureReadings[sensor].conductivityTempReadingsIdx, 0, SIZE_OF_FLOW_ROLLING_AVG - 1 ); + filteredConductivityTemperatureReadings[sensor].conductivityTempReadingsCount = INC_CAP( filteredConductivityTemperatureReadings[sensor].conductivityTempReadingsCount, SIZE_OF_FLOW_ROLLING_AVG ); + filteredcurrentTemperatureReadings[sensor].data = filteredConductivityTemperatureReadings[sensor].conductivityTempReadingsTotal / (F32)filteredConductivityTemperatureReadings[sensor].conductivityTempReadingsCount; + } +} + +/*********************************************************************//** + * @brief + * The publishConductivitySensorsData function publishes FP conductivity data * at a set interval. * @details \b Inputs: conductivityPublishTimerCounter * @details \b Outputs: conductivityPublishTimerCounter - * @details \b Message \b Sent: MSG_ID_RO_CONDUCTIVITY_DATA to publish conductivity data. + * @details \b Message \b Sent: MSG_ID_FP_CONDUCTIVITY_DATA to publish conductivity data. * @return none *************************************************************************/ static void publishConductivitySensorsData( void ) @@ -218,8 +300,8 @@ { CONDUCTIVITY_DATA_T data; - data.p9Conductivity = getConductivityValue( P9_COND ); - data.p18Conductivity = getConductivityValue( P18_COND ); + data.p9Conductivity = getFilteredConductivity( P9_COND ); + data.p18Conductivity = getFilteredConductivity( P18_COND ); conductivityPublishTimerCounter = 0; broadcastData( MSG_ID_FP_CONDUCTIVITY_DATA, COMM_BUFFER_OUT_CAN_FP_BROADCAST, (U08*)&data, sizeof( CONDUCTIVITY_DATA_T ) ); @@ -266,4 +348,22 @@ return result; } +/*********************************************************************//** + * @brief + * The testConductivitySensorFilteredTemperatureReadingsOverride function + * overrides the filtered value of the specified conductivity sensor + * with a given value. + * @details \b Inputs: none + * @details \b Outputs: filteredcurrentTemperatureReadings[] + * @param message Override message from Dialin which includes a sensor + * ID and override value of the conductivity rate for that sensor. + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testConductivitySensorFilteredTemperatureReadingsOverride( MESSAGE_T *message ) +{ + BOOL result = f32ArrayOverride( message, &filteredcurrentTemperatureReadings[0], NUM_OF_CONDUCTIVITY_SENSORS - 1 ); + + return result; +} + /**@}*/ Index: firmware/App/Monitors/Conductivity.h =================================================================== diff -u -r410afd26b3ae5e372310c696c82f58c59235e10d -r337136fc77fe5628fa727aac6252a06238561a10 --- firmware/App/Monitors/Conductivity.h (.../Conductivity.h) (revision 410afd26b3ae5e372310c696c82f58c59235e10d) +++ firmware/App/Monitors/Conductivity.h (.../Conductivity.h) (revision 337136fc77fe5628fa727aac6252a06238561a10) @@ -43,6 +43,7 @@ void initConductivity( void ); void execConductivity( void ); F32 getFilteredConductivity( CONDUCTIVITY_SENSORS_T sensor ); +F32 getFilteredConductivitySensorTemperature( CONDUCTIVITY_SENSORS_T sensor ); BOOL testConductivitySensorDataPublishIntervalOverride( MESSAGE_T *message ); Index: firmware/App/Monitors/Pressure.c =================================================================== diff -u -raf3b8065167834683ec01c8c8342b3d196fca593 -r337136fc77fe5628fa727aac6252a06238561a10 --- firmware/App/Monitors/Pressure.c (.../Pressure.c) (revision af3b8065167834683ec01c8c8342b3d196fca593) +++ firmware/App/Monitors/Pressure.c (.../Pressure.c) (revision 337136fc77fe5628fa727aac6252a06238561a10) @@ -40,19 +40,6 @@ #define SIZE_OF_PRESSURE_ROLLING_AVG ( PRESSURE_SAMPLE_FILTER_MS / TASK_PRIORITY_INTERVAL ) ///< Filtered pressure moving average. #define SIZE_OF_PRESSURETEMP_ROLLING_AVG ( PRESSURE_TEMP_SAMPLE_FILTER_MS / TASK_PRIORITY_INTERVAL ) ///< Filtered pressure temprature w/ 1 second moving average. -#define MAX_INLET_RO_PUMP_PRESSURE_WARNING 120.0F -#define MIN_INLET_WATER_PRESSURE_WARNING_LOW_PSIG 30.0F ///< Minimum allowed Input low pressure value in psig without boost pump. -#define MAX_INLET_WATER_PRESSURE_WARNING_HIGH_PSIG 80.0F ///< Maximum allowed Input high pressure value in psig without boost pump. -#define MIN_INLET_WATER_PRESSURE_WARNING_BOOST_LOW_PSIG 10.0F ///< Minimum allowed Input low pressure value in psig with boost pump. -#define MAX_INLET_WATER_PRESSURE_WARNING_BOOST_HIGH_PSIG 80.0F ///< Maximum allowed Input high pressure value in psig with boost pump. -#define MIN_PRESSURE_RELIEF_WARNING_LOW_PSI 13.0F -#define MAX_PRESSURE_RELIEF_WARNING_HIGH_PSIG 17.0F -#define INLET_WATER_PRES_OUT_OF_RANGE_TIMEOUT_MS ( 5 * MS_PER_SECOND ) ///< Persistence period for pressure out of range error in milliseconds. -#define INLET_WATER_PRES_OUT_OF_RANGE_CLEAR_MS ( 5 * MS_PER_SECOND ) ///< Persistence period for pressure out of range clear in milliseconds. -#define INLET_WATER_PRES_RELIEF_OUT_OF_RANGE_TIMEOUT_MS ( 5 * MS_PER_SECOND ) ///< Persistence period for pressure out of range error in milliseconds. -#define INLET_WATER_PRES_RELIEF_OUT_OF_RANGE_CLEAR_MS ( 5 * MS_PER_SECOND ) ///< Persistence period for pressure out of range clear in milliseconds. - - /// Defined states for the pressures monitor state machine. typedef enum PresMonitor_States { @@ -83,7 +70,6 @@ static OVERRIDE_F32_T filteredcurrentPressureReadings[ NUM_OF_PRESSURE_SENSORS ]; ///< filtered current pressure sensor pressure readings (overrideable). static OVERRIDE_F32_T filteredcurrentPresTempReadings[ NUM_OF_PRESSURE_SENSORS ]; ///< filtered current pressure sensor temperature readings (overrideable). -//static RO_PRES_SENSORS_CAL_RECORD_T pressuresCalRecord; ///< Pressures calibration record. static FILTER_PRESSURE_READINGS_T filteredPressureReadings[NUM_OF_PRESSURE_SENSORS]; ///< Filtered pressure reading for pressure sensors. static FILTER_PRESSURE_TEMPERATURE_READINGS_T filteredPressureTempReadings[NUM_OF_PRESSURE_SENSORS]; ///< Filtered pressure reading for pressure sensors. @@ -96,15 +82,10 @@ static void filterPressureSensors( void ); static void filterPressureSensorReadings( void ); static void filterPressureSensorTemperatureReadings( void ); -//static F32 getCalibrationAppliedPressure( U08 sensorId, F32 pressure ); static F32 getConvertedPressure( PRESSURE_SENSORS_T sensor, F32 pressure ); static PRESSURE_STATE_T handlePressuresInitState( void ); static PRESSURE_STATE_T handlePressuresContReadState( void ); static void publishPressuresData( void ); -static void monitorPressureSenors( void ); -static void monitorOperationModeAlarms( FP_OP_MODE_T opMode ); -static void monitorPreGenAlarms( void ); -static void monitorGenPAlarms( void ); /*********************************************************************//** * @brief @@ -149,12 +130,6 @@ pressuresDataPublishInterval.ovData = PRESSURES_DATA_PUB_INTERVAL; pressuresDataPublishInterval.ovInitData = 0; pressuresDataPublishInterval.override = OVERRIDE_RESET; - - 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 ); - initPersistentAlarm( ALARM_ID_FP_PRESSURE_RELIEF_OUT_LOW_RANGE, INLET_WATER_PRES_RELIEF_OUT_OF_RANGE_CLEAR_MS, INLET_WATER_PRES_RELIEF_OUT_OF_RANGE_TIMEOUT_MS ); - initPersistentAlarm( ALARM_ID_FP_PRESSURE_RELIEF_OUT_HIGH_RANGE, INLET_WATER_PRES_RELIEF_OUT_OF_RANGE_CLEAR_MS, INLET_WATER_PRES_RELIEF_OUT_OF_RANGE_TIMEOUT_MS ); - initPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_REGULATOR_OUT_OF_RANGE, INLET_WATER_PRES_OUT_OF_RANGE_CLEAR_MS, INLET_WATER_PRES_OUT_OF_RANGE_TIMEOUT_MS ); } /*********************************************************************//** @@ -341,153 +316,13 @@ pressuresState = PRESSURE_INIT_STATE; break; } - - monitorPressureSenors(); // publish pressure/occlusion data on interval publishPressuresData(); } -/*********************************************************************//** - * @brief - * The monitorPressureSenors function monitors the temperature sensors' - * temperature value and raises an alarm if any of them are out of range - * for more than the specified time. - * @details \b Inputs: tempSensors - * @details \b Outputs: tempSensors - * @details \b Alarms: ALARM_ID_DD_TEMPERATURE_SENSOR_OUT_OF_RANGE when the - * measured temperature exceeds the maximum limit temperature. - * @return none - *************************************************************************/ -static void monitorPressureSenors( void ) -{ - monitorOperationModeAlarms( getCurrentOperationMode() ); -} - -static void monitorOperationModeAlarms( FP_OP_MODE_T opMode ) -{ - switch ( opMode ) - { - case FP_MODE_FAUL: - break; - - case FP_MODE_SERV: - break; - - case FP_MODE_INIT: - break; - - case FP_MODE_STAN: - break; - - case FP_MODE_PGEN: - monitorPreGenAlarms(); - break; - - case FP_MODE_GENP: - monitorGenPAlarms(); - break; - - case FP_MODE_DPGW: - break; - - case FP_MODE_DEGW: - break; - default: - // SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_TEMPERATURE_SENSORS_EXEC_INVALID_STATE, tempSensorsExecState ); - // tempSensorsExecState = TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES; - break; - } -} - /*********************************************************************//** * @brief - * The monitorPreGenAlarms function checks pressure alarm conditions for alarms that are - * monitored in Pre-Generate Permeate mode. - * @details \b Inputs: none - * @details \b Outputs: none - * @return none - *************************************************************************/ -static void monitorPreGenAlarms( void ) -{ - FP_PRE_GENP_MODE_STATE_T preGenState = getCurrentPreGenPState(); - F32 pressureM1 = getFilteredPressure( M1_PRES ); - F32 pressureP17 = getFilteredPressure( P17_PRES ); - F32 pressureP13 = getFilteredPressure( P13_PRES ); - BOOL isPresOutOfLowRange = FALSE; - BOOL isPresOutOfHighRange = FALSE; - BOOL isPresReliefOutOfLowRange = FALSE; - BOOL isPresReliefOutOfHighRange = FALSE; - - if ( pressureP13 > MAX_INLET_RO_PUMP_PRESSURE_WARNING ) - { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_RO_INLET_PRESSURE_OUT_HIGH_RANGE, pressureP13, MAX_INLET_RO_PUMP_PRESSURE_WARNING ) - } - - if (TRUE == isBoostPumpInstalled() ) - { - isPresOutOfLowRange = ( ( pressureM1 < MIN_INLET_WATER_PRESSURE_WARNING_BOOST_LOW_PSIG ) ? TRUE : FALSE); - isPresOutOfHighRange = ( ( pressureM1 > MAX_INLET_WATER_PRESSURE_WARNING_BOOST_HIGH_PSIG ) ? TRUE : FALSE); - checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_LOW_RANGE, isPresOutOfLowRange, pressureM1, MIN_INLET_WATER_PRESSURE_WARNING_BOOST_LOW_PSIG ); - checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_HIGH_RANGE, isPresOutOfHighRange, pressureM1, MAX_INLET_WATER_PRESSURE_WARNING_BOOST_HIGH_PSIG ); - } - else - { - isPresOutOfLowRange = ( ( pressureM1 < MIN_INLET_WATER_PRESSURE_WARNING_LOW_PSIG ) ? TRUE : FALSE); - isPresOutOfHighRange = ( ( pressureM1 > MAX_INLET_WATER_PRESSURE_WARNING_HIGH_PSIG ) ? TRUE : FALSE); - checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_LOW_RANGE, isPresOutOfLowRange, pressureM1, MIN_INLET_WATER_PRESSURE_WARNING_LOW_PSIG ); - checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_HIGH_RANGE, isPresOutOfHighRange, pressureM1, MAX_INLET_WATER_PRESSURE_WARNING_HIGH_PSIG ); - } - - if ( preGenState == FP_PRE_GENP_VERIFY_WATER ) - { - isPresReliefOutOfLowRange = ( ( pressureP17 < MIN_PRESSURE_RELIEF_WARNING_LOW_PSI ) ? TRUE : FALSE); - isPresReliefOutOfHighRange = ( ( pressureP17 > MAX_PRESSURE_RELIEF_WARNING_HIGH_PSIG ) ? TRUE : FALSE); - checkPersistentAlarm( ALARM_ID_FP_PRESSURE_RELIEF_OUT_LOW_RANGE, isPresReliefOutOfLowRange, pressureP17, MIN_PRESSURE_RELIEF_WARNING_LOW_PSI ); - checkPersistentAlarm( ALARM_ID_FP_PRESSURE_RELIEF_OUT_HIGH_RANGE, isPresReliefOutOfHighRange, pressureP17, MAX_PRESSURE_RELIEF_WARNING_HIGH_PSIG ); - } - -} - -/*********************************************************************//** - * @brief - * The monitorGenPAlarms function checks pressure alarm conditions for alarms that are - * monitored in Generate Permeate mode - * @details \b Inputs: none - * @details \b Outputs: none - * @return none - *************************************************************************/ -static void monitorGenPAlarms( void ) -{ - F32 pressureM1 = getFilteredPressure( M1_PRES ); - F32 pressureP13 = getFilteredPressure( P13_PRES ); - BOOL isPresOutOfLowRange = FALSE; - BOOL isPresOutOfHighRange = FALSE; - - if ( pressureP13 > MAX_INLET_RO_PUMP_PRESSURE_WARNING ) - { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_RO_INLET_PRESSURE_OUT_HIGH_RANGE, pressureP13, MAX_INLET_RO_PUMP_PRESSURE_WARNING ) - } - - if (TRUE == isBoostPumpInstalled() ) - { - isPresOutOfLowRange = ( ( pressureM1 < MIN_INLET_WATER_PRESSURE_WARNING_BOOST_LOW_PSIG ) ? TRUE : FALSE); - isPresOutOfHighRange = ( ( pressureM1 > MAX_INLET_WATER_PRESSURE_WARNING_BOOST_HIGH_PSIG ) ? TRUE : FALSE); - checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_LOW_RANGE, isPresOutOfLowRange, pressureM1, MIN_INLET_WATER_PRESSURE_WARNING_BOOST_LOW_PSIG ); - checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_HIGH_RANGE, isPresOutOfHighRange, pressureM1, MAX_INLET_WATER_PRESSURE_WARNING_BOOST_HIGH_PSIG ); - } - else - { - isPresOutOfLowRange = ( ( pressureM1 < MIN_INLET_WATER_PRESSURE_WARNING_LOW_PSIG ) ? TRUE : FALSE); - isPresOutOfHighRange = ( ( pressureM1 > MAX_INLET_WATER_PRESSURE_WARNING_HIGH_PSIG ) ? TRUE : FALSE); - checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_LOW_RANGE, isPresOutOfLowRange, pressureM1, MIN_INLET_WATER_PRESSURE_WARNING_LOW_PSIG ); - checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_HIGH_RANGE, isPresOutOfHighRange, pressureM1, MAX_INLET_WATER_PRESSURE_WARNING_HIGH_PSIG ); - } - -} - -/*********************************************************************//** - * @brief * The filterPressureSensorReadings function filters the pressures for * defined interval to get average pressure reading. * @details \b Inputs: filteredPressureReadings,currentPressureReadings @@ -617,10 +452,10 @@ /*********************************************************************//** * @brief - * The publishPressuresData function publishes RO pressures data at a set interval. + * The publishPressuresData function publishes FP pressures data at a set interval. * @details \b Inputs: pressuresDataPublicationTimerCounter * @details \b Outputs: pressuresDataPublicationTimerCounter - * @details \b Message \b Sent: MSG_ID_RO_PRESSURES_DATA to publish pressure data. + * @details \b Message \b Sent: MSG_ID_FP_PRESSURES_DATA to publish pressure data. * @return none *************************************************************************/ static void publishPressuresData( void ) Index: firmware/App/Monitors/Temperature.c =================================================================== diff -u -r81aa682aa24931c7f44aea82ec72fb3dfabc7890 -r337136fc77fe5628fa727aac6252a06238561a10 --- firmware/App/Monitors/Temperature.c (.../Temperature.c) (revision 81aa682aa24931c7f44aea82ec72fb3dfabc7890) +++ firmware/App/Monitors/Temperature.c (.../Temperature.c) (revision 337136fc77fe5628fa727aac6252a06238561a10) @@ -15,18 +15,9 @@ * ***************************************************************************/ -#include "AlarmMgmtFP.h" #include "Messaging.h" #include "MessageSupport.h" -#include "ModeGenPermeate.h" -#include "ModeGenPermeateDefeatured.h" -#include "ModePreGenPermeate.h" -#include "ModePreGenPermeateDefeatured.h" -#include "OperationModes.h" -#include "PersistentAlarm.h" -#include "Pressure.h" #include "Temperature.h" -#include "Timers.h" #include "TaskPriority.h" #include "Utilities.h" @@ -36,43 +27,11 @@ */ // ********** private definitions ********** -#define ADC_FPGA_READ_DELAY 30U ///< Delay in ms before reading the ADC values from FPGA. -#define TEMP_SENSORS_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Temperature sensors publish data time interval. -#define TEMP_SENSORS_FPGA_ERROR_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< Temperature sensors FPGA error timeout in milliseconds. - -#define DATA_PUBLISH_COUNTER_START_COUNT 30 ///< Data publish counter start count. - -#define TEMPERATURE_INLET_LOW_THRESHOLD 5.0F -#define TEMPERATURE_INLET_HIGH_THRESHOLD 30.0F -#define TEMPERATURE_INLET_PERSISTENCE_TIMER ( 5 * MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) -#define TEMPERATURE_INLET_PERSISTENCE_CLEAR ( 5 * MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) - -/// Temperature sensor exec states. -typedef enum tempSensors_Exec_States -{ - TEMPSENSORS_EXEC_STATE_START = 0, ///< Temperature sensors exec start - TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES, ///< Temperature sensors exec get ADC values - NUM_OF_TEMPSENSORS_EXEC_STATES, ///< Total number of exec states -} TEMPSENSORS_EXEC_STATES_T; - // ********** private data ********** -static TEMPSENSORS_EXEC_STATES_T tempSensorsExecState; ///< TemperatureSensor exec state. -static U32 startTime; ///< star time to read FPGA values. -static U32 dataPublicationTimerCounter; ///< Temperature sensors data publish timer counter. -static OVERRIDE_U32_T tempSensorsPublishInterval; ///< Temperature sensors publish time interval override. - // ********** private function prototypes ********** -static TEMPSENSORS_EXEC_STATES_T handleExecStart( void ); -static TEMPSENSORS_EXEC_STATES_T handleExecGetADCValues( void ); -static void publishTemperatureSensorsData( void ); -static void monitorTemperatureSenors( void ); -static void monitorOperationModeAlarms( FP_OP_MODE_T opMode ); -static void monitorPreGenAlarms( void ); -static void monitorPreGenDefAlarms( void ); -static void monitorGenPAlarms( void ); /*********************************************************************//** * @brief @@ -83,293 +42,28 @@ *************************************************************************/ void initTemperature( void ) { - startTime = 0; - tempSensorsExecState = TEMPSENSORS_EXEC_STATE_START; - 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; - // Initialize the temperature sensors initTemperatureSensors(); - - initPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_LOW_RANGE, TEMPERATURE_INLET_PERSISTENCE_CLEAR, TEMPERATURE_INLET_PERSISTENCE_TIMER ); - initPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_HIGH_RANGE, TEMPERATURE_INLET_PERSISTENCE_CLEAR, TEMPERATURE_INLET_PERSISTENCE_TIMER ); } /*********************************************************************//** * @brief - * The execTemperatureSensorsSelfTest function runs the TemperatureSensors - * POST during the self-test. - * @details \b Inputs: none - * @details \b Outputs: none - * @return tempSensorsSelfTestState which is the status of the self test - *************************************************************************/ -//SELF_TEST_STATUS_T execTemperatureSensorsSelfTest( void ) -//{ -// SELF_TEST_STATUS_T result = SELF_TEST_STATUS_IN_PROGRESS; -// -// //BOOL calStatus = getNVRecord2Driver( GET_CAL_TEMP_SENSORS, (U08*)&tempSensorCalRecord, sizeof( DD_TEMP_SENSORS_CAL_RECORD_T ), -// // NUM_OF_CAL_DATA_TEMP_SENSORS, ALARM_ID_DD_TEMPERATURE_SENSORS_INVALID_CAL_RECORD ); -// BOOL calStatus = TRUE; -// -// if ( TRUE == calStatus ) -// { -// result = SELF_TEST_STATUS_PASSED; -// } -// else -// { -// result = SELF_TEST_STATUS_FAILED; -// } -// -// return result; -//} - -/*********************************************************************//** - * @brief * The execTemperatureSensors function executes the temperature sensors' * state machine. - * @details \b Inputs: tempSensorsExecState - * @details \b Outputs: tempSensorsExecState - * @details \b Alarms: ALARM_ID_DD_SOFTWARE_FAULT when invalid temperature - * sensor state is seen. - * @return none - *************************************************************************/ -void execTemperatureSensors( void ) -{ - // Monitor the temperature values - monitorTemperatureSenors(); - - // Publish the data - publishTemperatureSensorsData(); -} - -/*********************************************************************//** - * @brief - * The handleExecStart function waits for a period of time and switches to - * the state that reads the ADC values from FPGA. - * @details \b Inputs: startTime - * @details \b Outputs: startTime, baroCoeffsWaitToRcvStartTime - * @return the next state of the state machine - *************************************************************************/ -static TEMPSENSORS_EXEC_STATES_T handleExecStart( void ) -{ - TEMPSENSORS_EXEC_STATES_T state = TEMPSENSORS_EXEC_STATE_START; - - if ( 0 == startTime ) - { - startTime = getMSTimerCount(); - } - // A delay to let FPGA to boot up - else if ( TRUE == didTimeout( startTime, ADC_FPGA_READ_DELAY ) ) - { - startTime = 0; - state = TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES; - } - - return state; -} - -/*********************************************************************//** - * @brief - * The handleExecGetADCValues function reads the ADC values from FPGA and - * at the specified time intervals and calls required functions to calculate - * the actual tempetature from the raw ADC values. - * @details \b Inputs: FPGA - * @details \b Outputs: temperature value. - * @return the next state of the state machine - *************************************************************************/ -static TEMPSENSORS_EXEC_STATES_T handleExecGetADCValues( void ) -{ - // Read temperature sensors - readTemperatureSensors(); - - return TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES; -} - -/*********************************************************************//** - * @brief - * The monitorTemperatureSensors function monitors the temperature sensors' - * temperature value and raises an alarm if any of them are out of range - * for more than the specified time. - * @details \b Inputs: tempSensors - * @details \b Outputs: tempSensors - * @details \b Alarms: ALARM_ID_DD_TEMPERATURE_SENSOR_OUT_OF_RANGE when the - * measured temperature exceeds the maximum limit temperature. - * @return none - *************************************************************************/ -static void monitorTemperatureSenors( void ) -{ - monitorOperationModeAlarms( getCurrentOperationMode() ); -} - -static void monitorOperationModeAlarms( FP_OP_MODE_T opMode ) -{ - switch ( opMode ) - { - case FP_MODE_FAUL: - break; - - case FP_MODE_SERV: - break; - - case FP_MODE_INIT: - break; - - case FP_MODE_STAN: - break; - - case FP_MODE_PGEN: - monitorPreGenAlarms(); - break; - - case FP_MODE_GENP: - monitorGenPAlarms(); - break; - - case FP_MODE_DPGW: - monitorPreGenDefAlarms(); - break; - - case FP_MODE_DEGW: - break; - default: - // SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_TEMPERATURE_SENSORS_EXEC_INVALID_STATE, tempSensorsExecState ); - // tempSensorsExecState = TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES; - break; - } -} - -/*********************************************************************//** - * @brief - * The monitorPreGenAlarms function checks temperature alarm conditions for alarms that are - * monitored in Pre-Generate Permeate mode * @details \b Inputs: none * @details \b Outputs: none * @return none *************************************************************************/ -static void monitorPreGenAlarms( void ) +void execTemperatureSensors( void ) { - FP_PRE_GENP_MODE_STATE_T preGenState = getCurrentPreGenPState(); - F32 temperatureP10 = getTemperatureValue( P10_TEMP ); - BOOL isTempOutOfLowRange = FALSE; - BOOL isTempOutOfHighRange = FALSE; - - if ( ( preGenState > FP_PRE_GENP_FILTER_FLUSH ) && ( preGenState != FP_PRE_GENP_PAUSED ) ) - { - isTempOutOfLowRange = ( ( temperatureP10 < TEMPERATURE_INLET_LOW_THRESHOLD ) ? TRUE : FALSE); - isTempOutOfHighRange = ( ( temperatureP10 > TEMPERATURE_INLET_HIGH_THRESHOLD ) ? TRUE : FALSE); - checkPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_LOW_RANGE, isTempOutOfLowRange, temperatureP10, TEMPERATURE_INLET_LOW_THRESHOLD ); - checkPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_HIGH_RANGE, isTempOutOfHighRange, temperatureP10, TEMPERATURE_INLET_HIGH_THRESHOLD ); - // TODO - Check M1 temp - } + return; } -/*********************************************************************//** - * @brief - * The monitorGenPAlarms function checks temperature alarm conditions for alarms that are - * monitored in Generate Permeate mode - * @details \b Inputs: none - * @details \b Outputs: none - * @return none - *************************************************************************/ -static void monitorGenPAlarms( void ) -{ - FP_GENP_MODE_STATE_T genState = getCurrentGenPermeateState(); - F32 temperatureP10 = getTemperatureValue( P10_TEMP ); - BOOL isTempOutOfLowRange = FALSE; - BOOL isTempOutOfHighRange = FALSE; - - isTempOutOfLowRange = ( ( temperatureP10 < TEMPERATURE_INLET_LOW_THRESHOLD ) ? TRUE : FALSE); - isTempOutOfHighRange = ( ( temperatureP10 > TEMPERATURE_INLET_HIGH_THRESHOLD ) ? TRUE : FALSE); - checkPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_LOW_RANGE, isTempOutOfLowRange, temperatureP10, TEMPERATURE_INLET_LOW_THRESHOLD ); - checkPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_HIGH_RANGE, isTempOutOfHighRange, temperatureP10, TEMPERATURE_INLET_HIGH_THRESHOLD ); - // TODO - Check M1 temp - -} - -/*********************************************************************//** - * @brief - * The monitorPreGenDefAlarms function checks temperature alarm conditions for alarms that are - * monitored in Pre-Generate Permeate, Defeatured mode - * @details \b Inputs: none - * @details \b Outputs: none - * @return none - *************************************************************************/ -static void monitorPreGenDefAlarms( void ) -{ - //FP_PRE_GENP_DEF_MODE_STATE_T preGenDefState; - F32 temperatureM3 = getFilteredPressureSensorTemperature( M3_PRES ); - BOOL isTempOutOfLowRange = FALSE; - BOOL isTempOutOfHighRange = FALSE; - - //if ( preGenDefState == FP_PRE_GENP_DEF_INLET_WATER_CHECK ) - - isTempOutOfLowRange = ( ( temperatureM3 < TEMPERATURE_INLET_LOW_THRESHOLD ) ? TRUE : FALSE); - isTempOutOfHighRange = ( ( temperatureM3 > TEMPERATURE_INLET_HIGH_THRESHOLD ) ? TRUE : FALSE); - checkPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_LOW_RANGE, isTempOutOfLowRange, temperatureM3, TEMPERATURE_INLET_LOW_THRESHOLD ); - checkPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_HIGH_RANGE, isTempOutOfHighRange, temperatureM3, TEMPERATURE_INLET_HIGH_THRESHOLD ); - - -} - -/*********************************************************************//** - * @brief - * The publishTemperatureSensorsData function broadcasts the temperature - * sensors data at the publication interval. - * @details \b Inputs: dataPublicationTimerCounter and publish interval time. - * @details \b Outputs: dataPublicationTimerCounter - * @details \b Message \b Sent: MSG_ID_DD_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 = getTemperatureValue( P10_TEMP ); - data.p19Temp = getTemperatureValue( P19_TEMP ); - 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 ); - - 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 -r41c4d109b7bc172d93ae1f4e4b20acaf96547807 -r337136fc77fe5628fa727aac6252a06238561a10 --- firmware/App/Monitors/Temperature.h (.../Temperature.h) (revision 41c4d109b7bc172d93ae1f4e4b20acaf96547807) +++ firmware/App/Monitors/Temperature.h (.../Temperature.h) (revision 337136fc77fe5628fa727aac6252a06238561a10) @@ -24,38 +24,19 @@ /** * @defgroup Temperature Temperature * @brief Temperature Monitor unit. monitors the temperature sensors - * for the RO sub-system. + * for the FP sub-system. * * @addtogroup Temperature * @{ */ // ********** 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 -} TEMPERATURE_SENSORS_DATA_T; - // ********** public function prototypes ********** void initTemperature( void ); void execTemperatureSensors( void ); -//SELF_TEST_STATUS_T execTemperatureSensorsSelfTest( void ); -BOOL testTemperatureSensorsDataPublishIntervalOverride( MESSAGE_T *message ); - /**@}*/ #endif Index: firmware/App/Monitors/WaterQualityMonitor.c =================================================================== diff -u --- firmware/App/Monitors/WaterQualityMonitor.c (revision 0) +++ firmware/App/Monitors/WaterQualityMonitor.c (revision 337136fc77fe5628fa727aac6252a06238561a10) @@ -0,0 +1,319 @@ +/************************************************************************** +* +* Copyright (c) 2024-2024 Diality Inc. - All Rights Reserved. +* +* THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN +* WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. +* +* @file WaterQualityMonitor.c +* +* @author (last) Sean Nash +* @date (last) 21-Nov-2024 +* +* @author (original) Sean Nash +* @date (original) 21-Nov-2024 +* +***************************************************************************/ + +#include "Conductivity.h" +#include "Flow.h" +#include "ModeStandby.h" +#include "OperationModes.h" +#include "PersistentAlarm.h" +#include "Pressure.h" +#include "SystemCommFP.h" +#include "TaskPriority.h" +#include "Temperature.h" +#include "WaterQualityMonitor.h" + +/** + * @addtogroup WaterQualityMonitor + * @{ + */ + + + +// ********** 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. +#define INLET_TEMPERATURE_PERSISTENCE_CLEAR_MS ( 5 * MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Persistence timer to clear alarm in ms. + +#define MAX_INLET_RO_PUMP_PRESSURE_WARNING_PSIG 120.0F ///< Maximum allowed Input pressure to the RO membrane. +#define MIN_INLET_WATER_PRESSURE_WARNING_LOW_PSIG 30.0F ///< Minimum allowed Input low pressure value in psig without boost pump. +#define MAX_INLET_WATER_PRESSURE_WARNING_HIGH_PSIG 80.0F ///< Maximum allowed Input high pressure value in psig without boost pump. +#define MIN_INLET_WATER_PRESSURE_WARNING_BOOST_LOW_PSIG 10.0F ///< Minimum allowed Input low pressure value in psig with boost pump. +#define MAX_INLET_WATER_PRESSURE_WARNING_BOOST_HIGH_PSIG 80.0F ///< Maximum allowed Input high pressure value in psig with boost pump. +#define MIN_PRESSURE_RELIEF_WARNING_LOW_PSIG 13.0F ///< Minimum pressure relief warning in psi +#define MAX_PRESSURE_RELIEF_WARNING_HIGH_PSIG 17.0F ///< Maximum pressure relief warning in psi +#define INLET_WATER_PRES_OUT_OF_RANGE_TIMEOUT_MS ( 5 * MS_PER_SECOND ) ///< Persistence period for pressure out of range error in milliseconds. +#define INLET_WATER_PRES_OUT_OF_RANGE_CLEAR_MS ( 5 * MS_PER_SECOND ) ///< Persistence period for pressure out of range clear in milliseconds. +#define INLET_WATER_PRES_RELIEF_OUT_OF_RANGE_TIMEOUT_MS ( 5 * MS_PER_SECOND ) ///< Persistence period for pressure out of range error in milliseconds. +#define INLET_WATER_PRES_RELIEF_OUT_OF_RANGE_CLEAR_MS ( 5 * MS_PER_SECOND ) ///< Persistence period for pressure out of range clear in milliseconds. + +#define OUTLET_CONDUCTIVITY_HIGH_THRESHOLD_US 200.0F ///< Minimum allowed inlet conductivity in uS/cm. +#define INLET_WATER_COND_OUT_OF_RANGE_TIMEOUT_MS ( 5 * MS_PER_SECOND ) ///< Persistence period for conductivity out of range error in milliseconds. +#define INLET_WATER_COND_OUT_OF_RANGE_CLEAR_MS ( 5 * MS_PER_SECOND ) ///< Persistence period for conductivity out of range clear in milliseconds. +#define INLET_CONDUCTIVITY_HIGH_THRESHOLD_US 2000.0F ///< Maximum allowed outlet conductivity in uS/cm. + + +// ********** 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 initWaterQualityMonitor function initializes the Water Quality Monitor unit. + * @details \b Inputs: none + * @details \b Outputs: Water Quality Monitor unit is initialized. + * @return none + *************************************************************************/ +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 ); + initPersistentAlarm( ALARM_ID_FP_PRESSURE_RELIEF_OUT_LOW_RANGE, INLET_WATER_PRES_RELIEF_OUT_OF_RANGE_CLEAR_MS, INLET_WATER_PRES_RELIEF_OUT_OF_RANGE_TIMEOUT_MS ); + initPersistentAlarm( ALARM_ID_FP_PRESSURE_RELIEF_OUT_HIGH_RANGE, INLET_WATER_PRES_RELIEF_OUT_OF_RANGE_CLEAR_MS, INLET_WATER_PRES_RELIEF_OUT_OF_RANGE_TIMEOUT_MS ); + initPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_REGULATOR_OUT_OF_RANGE, INLET_WATER_PRES_OUT_OF_RANGE_CLEAR_MS, INLET_WATER_PRES_OUT_OF_RANGE_TIMEOUT_MS ); + + // Temperature Alarms + initPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_LOW_RANGE, INLET_TEMPERATURE_PERSISTENCE_CLEAR_MS, INLET_TEMPERATURE_PERSISTENCE_TIMER_MS ); + initPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_HIGH_RANGE, INLET_TEMPERATURE_PERSISTENCE_CLEAR_MS, INLET_TEMPERATURE_PERSISTENCE_TIMER_MS ); + + // Conductivity Alarms + initPersistentAlarm( ALARM_ID_FP_INLET_CONDUCTIVITY_OUT_HIGH_RANGE, INLET_WATER_COND_OUT_OF_RANGE_CLEAR_MS, INLET_WATER_COND_OUT_OF_RANGE_TIMEOUT_MS ); + initPersistentAlarm( ALARM_ID_FP_RO_OUTLET_CONDUCTIVITY_HIGH_RANGE, INLET_WATER_COND_OUT_OF_RANGE_CLEAR_MS, INLET_WATER_COND_OUT_OF_RANGE_TIMEOUT_MS ); +} + +/*********************************************************************//** + * @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 + * @details \b Outputs: none + * @details \b Alarms: ALARM_ID_FP_INLET_PRESSURE_OUT_LOW_RANGE when + * M1 pressure goes beyond low pressure limit. + * @details \b Alarms: ALARM_ID_FP_INLET_PRESSURE_OUT_HIGH_RANGE when + * M1 pressure goes beyond high pressure limit + * @return none + *************************************************************************/ +void checkInletPressures( void ) +{ + F32 pressureM1 = getFilteredPressure( M1_PRES ); + BOOL isPresOutOfLowRange = FALSE; + BOOL isPresOutOfHighRange = FALSE; + + if ( TRUE == isBoostPumpInstalled() ) + { + isPresOutOfLowRange = ( ( pressureM1 < MIN_INLET_WATER_PRESSURE_WARNING_BOOST_LOW_PSIG ) ? TRUE : FALSE); + isPresOutOfHighRange = ( ( pressureM1 > MAX_INLET_WATER_PRESSURE_WARNING_BOOST_HIGH_PSIG ) ? TRUE : FALSE); + checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_LOW_RANGE, isPresOutOfLowRange, pressureM1, MIN_INLET_WATER_PRESSURE_WARNING_BOOST_LOW_PSIG ); + checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_HIGH_RANGE, isPresOutOfHighRange, pressureM1, MAX_INLET_WATER_PRESSURE_WARNING_BOOST_HIGH_PSIG ); + } + else + { + isPresOutOfLowRange = ( ( pressureM1 < MIN_INLET_WATER_PRESSURE_WARNING_LOW_PSIG ) ? TRUE : FALSE); + isPresOutOfHighRange = ( ( pressureM1 > MAX_INLET_WATER_PRESSURE_WARNING_HIGH_PSIG ) ? TRUE : FALSE); + checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_LOW_RANGE, isPresOutOfLowRange, pressureM1, MIN_INLET_WATER_PRESSURE_WARNING_LOW_PSIG ); + checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_HIGH_RANGE, isPresOutOfHighRange, pressureM1, MAX_INLET_WATER_PRESSURE_WARNING_HIGH_PSIG ); + } +} + +/*********************************************************************//** + * @brief + * The checkROPressures function checks the RO membrane pressure + * against the pressure threshold and alarm if the pressure is out of range. + * @details \b Inputs: pressureP13 + * @details \b Outputs: none + * @details \b Alarms: ALARM_ID_FP_RO_INLET_PRESSURE_OUT_HIGH_RANGE when + * P13 pressure goes beyond high pressure limit. + * @return none + *************************************************************************/ +void checkROPressures( void ) +{ + F32 pressureP13 = getPressure( P13_PRES ); + + if ( pressureP13 > MAX_INLET_RO_PUMP_PRESSURE_WARNING_PSIG ) + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_RO_INLET_PRESSURE_OUT_HIGH_RANGE, pressureP13, MAX_INLET_RO_PUMP_PRESSURE_WARNING_PSIG ) + } +} + + +/*********************************************************************//** + * @brief + * The checkROPressures function checks the RO membrane outlet pressure + * against the pressure threshold and alarm if the pressure is out of range. + * @details \b Inputs: pressureP17 + * @details \b Outputs: none + * @details \b Alarms: ALARM_ID_FP_PRESSURE_RELIEF_OUT_LOW_RANGE when + * P17 pressure goes beyond low pressure limit. + * @details \b Alarms: ALARM_ID_FP_PRESSURE_RELIEF_OUT_HIGH_RANGE when + * P17 pressure goes beyond high pressure limit. + * @return none + *************************************************************************/ +void checkPressureRelief( void ) +{ + F32 pressureP17 = getFilteredPressure( P17_PRES ); + BOOL isPresReliefOutOfLowRange = FALSE; + BOOL isPresReliefOutOfHighRange = FALSE; + + isPresReliefOutOfLowRange = ( ( pressureP17 < MIN_PRESSURE_RELIEF_WARNING_LOW_PSIG ) ? TRUE : FALSE); + isPresReliefOutOfHighRange = ( ( pressureP17 > MAX_PRESSURE_RELIEF_WARNING_HIGH_PSIG ) ? TRUE : FALSE); + checkPersistentAlarm( ALARM_ID_FP_PRESSURE_RELIEF_OUT_LOW_RANGE, isPresReliefOutOfLowRange, pressureP17, MIN_PRESSURE_RELIEF_WARNING_LOW_PSIG ); + checkPersistentAlarm( ALARM_ID_FP_PRESSURE_RELIEF_OUT_HIGH_RANGE, isPresReliefOutOfHighRange, pressureP17, MAX_PRESSURE_RELIEF_WARNING_HIGH_PSIG ); +} + +/*********************************************************************//** + * @brief + * The checkInletTemperatures function checks the inlet water temperature + * against the temperature threshold and alarm if the temperature is out of range. + * @details \b Inputs: temperatureP10, temperatureM1 + * @details \b Outputs: none + * @details \b Alarms: ALARM_ID_FP_INLET_TEMPERATURE_OUT_LOW_RANGE when + * P10 or M1 temperature goes beyond low temperature limit. + * @details \b Alarms: ALARM_ID_FP_INLET_TEMPERATURE_OUT_HIGH_RANGE when + * P10 or M1 temperature goes beyond high temperature limit + * @return none + *************************************************************************/ +void checkInletTemperatures( void ) +{ + F32 temperatureP10 = getTemperatureValue( P10_TEMP ); + F32 temperatureM1 = getFilteredPressureSensorTemperature( M1_PRES ); + BOOL isTempOutOfLowRange = FALSE; + BOOL isTempOutOfHighRange = FALSE; + + isTempOutOfLowRange = ( ( temperatureP10 < INLET_TEMPERATURE_LOW_THRESHOLD_C ) ? TRUE : FALSE); + isTempOutOfHighRange = ( ( temperatureP10 > INLET_TEMPERATURE_HIGH_THRESHOLD_C ) ? TRUE : FALSE); + checkPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_LOW_RANGE, isTempOutOfLowRange, temperatureP10, INLET_TEMPERATURE_LOW_THRESHOLD_C ); + checkPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_HIGH_RANGE, isTempOutOfHighRange, temperatureP10, INLET_TEMPERATURE_HIGH_THRESHOLD_C ); + + isTempOutOfLowRange = ( ( temperatureM1 < INLET_TEMPERATURE_LOW_THRESHOLD_C ) ? TRUE : FALSE); + isTempOutOfHighRange = ( ( temperatureM1 > INLET_TEMPERATURE_HIGH_THRESHOLD_C ) ? TRUE : FALSE); + checkPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_LOW_RANGE, isTempOutOfLowRange, temperatureM1, INLET_TEMPERATURE_LOW_THRESHOLD_C ); + checkPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_HIGH_RANGE, isTempOutOfHighRange, temperatureM1, INLET_TEMPERATURE_HIGH_THRESHOLD_C ); +} + +/*********************************************************************//** + * @brief + * The checkInletConductivity function checks the inlet conductivity + * against the conductivity threshold and alarm if the conductivity is out of range. + * @details \b Inputs: conductivityP9 + * @details \b Outputs: none + * @details \b Alarms: ALARM_ID_FP_INLET_CONDUCTIVITY_OUT_HIGH_RANGE when + * P9 pressure goes beyond high conductivity limit. + * @return none + *************************************************************************/ +void checkInletConductivity( void ) +{ + F32 conductivityP9 = getFilteredConductivity( P9_COND ); + BOOL isConductivtyOutOfLowRange = FALSE; + + isConductivtyOutOfLowRange = ( ( conductivityP9 > INLET_CONDUCTIVITY_HIGH_THRESHOLD_US ) ? TRUE : FALSE); + checkPersistentAlarm( ALARM_ID_FP_INLET_CONDUCTIVITY_OUT_HIGH_RANGE, isConductivtyOutOfLowRange, conductivityP9, INLET_CONDUCTIVITY_HIGH_THRESHOLD_US ); +} + +/*********************************************************************//** + * @brief + * The checkInletConductivity function checks the inlet conductivity + * against the conductivity threshold and alarm if the conductivity is out of range. + * @details \b Inputs: conductivityP18 + * @details \b Outputs: none + * @details \b Alarms: ALARM_ID_FP_RO_OUTLET_CONDUCTIVITY_HIGH_RANGE when + * P9 pressure goes beyond high conductivity limit. + * @return none + *************************************************************************/ +void checkOutletConductivity( void ) +{ + F32 conductivityP18 = getFilteredConductivity( P18_COND ); + BOOL isConductivityOutOfLowRange = FALSE; + + isConductivityOutOfLowRange = ( ( conductivityP18 > OUTLET_CONDUCTIVITY_HIGH_THRESHOLD_US ) ? TRUE : FALSE); + 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 --- firmware/App/Monitors/WaterQualityMonitor.h (revision 0) +++ firmware/App/Monitors/WaterQualityMonitor.h (revision 337136fc77fe5628fa727aac6252a06238561a10) @@ -0,0 +1,65 @@ +/************************************************************************** +* +* Copyright (c) 2024-2024 Diality Inc. - All Rights Reserved. +* +* THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN +* WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. +* +* @file WaterQualityMonitor.h +* +* @author (last) Michael Garthwaite +* @date (last) 21-Nov-2024 +* +* @author (original) Michael Garthwaite +* @date (original) 21-Nov-2024 +* +***************************************************************************/ +#ifndef __WATER_QUALITY_MONITOR_H +#define __WATER_QUALITY_MONITOR_H + +#include "FPCommon.h" +#include "FPDefs.h" + +/** + * @defgroup WaterQualityMonitor WaterQualityMonitor + * @brief WaterQualityMonitor module monitors the inlet water conditions for FP sub-system. + * Considers temperature, pressure, flows, and conductivity. + * WaterQualityMonitor manufacturer: Custom built modules. + * + * @addtogroup WaterQualityMonitor + * @{ + */ + +// ********** 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 ); +void execWaterQualityMonitor( void ); +void checkInletPressures( void ); +void checkROPressures( void ); +void checkPressureRelief( void ); +void checkInletTemperatures( void ); +void checkInletConductivity( void ); +void checkOutletConductivity( void ); + +BOOL testTemperatureSensorsDataPublishIntervalOverride( MESSAGE_T *message ); + +#endif Index: firmware/App/Services/Messaging.c =================================================================== diff -u -r81aa682aa24931c7f44aea82ec72fb3dfabc7890 -r337136fc77fe5628fa727aac6252a06238561a10 --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision 81aa682aa24931c7f44aea82ec72fb3dfabc7890) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision 337136fc77fe5628fa727aac6252a06238561a10) @@ -21,6 +21,7 @@ #include "Temperature.h" #include "Utilities.h" #include "Valves.h" +#include "WaterQualityMonitor.h" /** * @addtogroup Messaging Index: firmware/App/Tasks/TaskPriority.c =================================================================== diff -u -r410afd26b3ae5e372310c696c82f58c59235e10d -r337136fc77fe5628fa727aac6252a06238561a10 --- firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision 410afd26b3ae5e372310c696c82f58c59235e10d) +++ firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision 337136fc77fe5628fa727aac6252a06238561a10) @@ -10,6 +10,7 @@ #include "Temperature.h" #include "Valves.h" #include "WatchdogMgmt.h" +#include "WaterQualityMonitor.h" /** * @addtogroup TaskPriority @@ -41,8 +42,8 @@ // Monitor levels execLevels(); - // Monitor temperatures - execTemperatureSensors(); + // Monitor temperatures within water quality module. + execWaterQualityMonitor(); // Monitor pressure sensors execPressureSensor(); Index: firmware/source/sys_main.c =================================================================== diff -u -r81aa682aa24931c7f44aea82ec72fb3dfabc7890 -r337136fc77fe5628fa727aac6252a06238561a10 --- firmware/source/sys_main.c (.../sys_main.c) (revision 81aa682aa24931c7f44aea82ec72fb3dfabc7890) +++ firmware/source/sys_main.c (.../sys_main.c) (revision 337136fc77fe5628fa727aac6252a06238561a10) @@ -63,6 +63,7 @@ #include "sys_dma.h" #include "AlarmMgmtFP.h" +#include "BoostPump.h" #include "CommBuffers.h" #include "Conductivity.h" #include "DDInterface.h" @@ -193,6 +194,7 @@ // Controllers initROPump(); + initBoostPump(); initValves(); // Monitors @@ -204,14 +206,17 @@ // Modes initOperationModes(); - initGenPermeateMode(); - initStandbyMode(); initInitAndPOSTMode(); initFaultMode(); + initStandbyMode(); + initPreGenPermeateDefeaturedMode(); initPreGenPMode(); + initGenPermeateMode(); + initGenPermeateDefeaturedMode(); initFilterFlush(); initConcentrateFlush(); initPermeateFlush(); + } /*************************************************************************