Index: firmware/App/Controllers/PermeateTank.c =================================================================== diff -u -r830213bc6dcc1a684610caf78c79d55f2cb41e93 -r18d4cfcb41570947e19250a549a62e52cdcd3aaa --- firmware/App/Controllers/PermeateTank.c (.../PermeateTank.c) (revision 830213bc6dcc1a684610caf78c79d55f2cb41e93) +++ firmware/App/Controllers/PermeateTank.c (.../PermeateTank.c) (revision 18d4cfcb41570947e19250a549a62e52cdcd3aaa) @@ -35,11 +35,6 @@ #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 ///< Publishing counter offset #define PERMEATE_TANK_FULL_SWITCH_MS ( 1 * MS_PER_SECOND ) ///< State switch timeout in full state (in ms) -#define PERMEATE_TANK_EMPTY_LEVEL_VOL_ML 0 ///< Permeate tank volume in empty level ( in ml ) -#define PERMEATE_TANK_LOW_LEVEL_VOL_ML 957 ///< Permeate tank volume in low level ( in ml ) -#define PERMEATE_TANK_HIGH_LEVEL_VOL_ML 1345 ///< Permeate tank volume in high level ( in ml ) -#define PERMEATE_TANK_FULL_LEVEL_VOL_ML 1532 ///< Permeate tank volume in full level ( in ml ) -#define RINSE_PUMP_TARGET_FLOW 228.89 ///< Rinse pump rate // ********** private data ********** @@ -48,11 +43,6 @@ 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 tankFullAlarmTimer; ///< Time stamp to track alarm timeout during tank full. -static U32 tankFillAlarmTimer; ///< Time stamp to track alarm timeout during tank fill. -static U32 tankFullDelayTime; ///< Time stamp to track delay before valve switch. -static F32 tankFullAlarmTimeout; ///< Permeate tank full alarm timeout -static F32 tankFillAlarmTimeout; ///< Permeate tank fill alarm timeout // ********** private function prototypes ********** @@ -77,11 +67,6 @@ permeateTankPublishInterval.ovData = PERMEATE_TANK_PUMP_DATA_PUB_INTERVAL; permeateTankPublishInterval.ovInitData = PERMEATE_TANK_PUMP_DATA_PUB_INTERVAL; permeateTankPublishInterval.override = OVERRIDE_RESET; - tankFullDelayTime = 0; - tankFullAlarmTimer = 0; - tankFillAlarmTimer = 0; - tankFullAlarmTimeout = 0.0F; - tankFillAlarmTimeout = 0.0F; } /*********************************************************************//** @@ -164,46 +149,6 @@ /*********************************************************************//** * @brief - * The getTankFullAlarmTimeout function returns the tank full alarm timeout - * @details \b Inputs: none - * @details \b Outputs: tankFullAlarmTimeout - * @return the alarm timeout for tank full - *************************************************************************/ -F32 getTankFullAlarmTimeout( void ) -{ - F32 expectedDeprimeTime = 0.0F; - F32 expectedTankFullTime = 0.0F; - F32 ddConsumptionRate = getTDDialysateFlowrate() + RINSE_PUMP_TARGET_FLOW; - - expectedTankFullTime = ( ( PERMEATE_TANK_HIGH_LEVEL_VOL_ML - PERMEATE_TANK_LOW_LEVEL_VOL_ML ) / ddConsumptionRate ) * SEC_PER_MIN; - expectedDeprimeTime = ( ( PERMEATE_TANK_LOW_LEVEL_VOL_ML - PERMEATE_TANK_EMPTY_LEVEL_VOL_ML ) / ddConsumptionRate ) * SEC_PER_MIN; - tankFullAlarmTimeout = expectedTankFullTime + expectedDeprimeTime; - - return tankFullAlarmTimeout; -} - -/*********************************************************************//** - * @brief - * The getTankFillAlarmTimeout function returns the tank fill alarm timeout - * @details \b Inputs: none - * @details \b Outputs: tankFillAlarmTimeout - * @return the alarm timeout for tank fill - *************************************************************************/ -F32 getTankFillAlarmTimeout( void ) -{ - F32 expectedOverfillTime = 0.0F; - F32 expectedTankFillTime = 0.0F; - F32 ddConsumptionRate = getTDDialysateFlowrate() + RINSE_PUMP_TARGET_FLOW; - - expectedTankFillTime = ( ( PERMEATE_TANK_HIGH_LEVEL_VOL_ML - PERMEATE_TANK_LOW_LEVEL_VOL_ML ) / ddConsumptionRate ) * SEC_PER_MIN; - expectedOverfillTime = ( ( PERMEATE_TANK_FULL_LEVEL_VOL_ML - PERMEATE_TANK_HIGH_LEVEL_VOL_ML ) / ddConsumptionRate ) * SEC_PER_MIN; - tankFillAlarmTimeout = ( expectedTankFillTime + ( expectedOverfillTime / 2 ) ); - - return tankFillAlarmTimeout; -} - -/*********************************************************************//** - * @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. @@ -291,11 +236,6 @@ PERMEATE_TANK_STATE_T state = PERMEATE_TANK_FILL_STATE; LEVEL_STATE_T level = getLevelStatus( P25_LEVL ); - if ( TRUE == didTimeout( tankFillAlarmTimer, getTankFillAlarmTimeout() ) ) - { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_FP_GEN_PERMEATE_TANK_FILL_TIMEOUT, level ) - } - // Transition to manual valve control state when requested if ( TRUE == pendingStopPermeateTankController ) { @@ -324,11 +264,6 @@ PERMEATE_TANK_STATE_T state = PERMEATE_TANK_FULL_STATE; LEVEL_STATE_T level = getLevelStatus( P25_LEVL ); - if ( TRUE == didTimeout( tankFullAlarmTimer, getTankFullAlarmTimeout() ) ) - { - 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 ) { @@ -337,10 +272,7 @@ } else if ( level == LEVEL_STATE_LOW ) { - if ( TRUE == didTimeout( tankFullDelayTime, PERMEATE_TANK_FULL_SWITCH_MS ) ) - { - state = PERMEATE_TANK_FILL_STATE; - } + state = PERMEATE_TANK_FILL_STATE; } return state; @@ -373,20 +305,17 @@ 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 ); - tankFillAlarmTimer = getMSTimerCount(); break; case PERMEATE_TANK_FULL_STATE: setValveState( M4_VALV, VALVE_STATE_CLOSED ); - setValveState( M12_VALV, VALVE_STATE_CLOSED ); + setValveState( M12_VALV, VALVE_STATE_OPEN ); setValveState( P6_VALV, VALVE_STATE_OPEN ); setValveState( P11_VALV, VALVE_STATE_OPEN ); setValveState( P33_VALV, VALVE_STATE_OPEN ); setValveState( P34_VALV, VALVE_STATE_CLOSED ); setValveState( P37_VALV, VALVE_STATE_CLOSED ); setValveState( P39_VALV, VALVE_STATE_CLOSED ); - tankFullDelayTime = getMSTimerCount(); - tankFullAlarmTimer = getMSTimerCount(); break; default: Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -r830213bc6dcc1a684610caf78c79d55f2cb41e93 -r18d4cfcb41570947e19250a549a62e52cdcd3aaa --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 830213bc6dcc1a684610caf78c79d55f2cb41e93) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 18d4cfcb41570947e19250a549a62e52cdcd3aaa) @@ -74,6 +74,7 @@ static F32 roPumpDutyCyclePctSet; ///< Currently set RO pump PWM duty cycle. static OVERRIDE_F32_T roPumpOpenLoopTargetDutyCycle; ///< Target RO pump open loop PWM. static BOOL roPumpStartControl; ///< boolean to determine when closed loop flow control starts +static U32 roPumpClosedLoopStartTimeMS; ///< Timeout timer for RO pump to reach minimum target flow // ********** private function prototypes ********** @@ -108,8 +109,6 @@ initializePIController( PI_CONTROLLER_ID_RO_PUMP_PRES, MIN_FLUID_PUMP_DUTY_CYCLE_PCT, ROP_PRESSURE_CONTROL_P_COEFFICIENT, ROP_PRESSURE_CONTROL_I_COEFFICIENT, MIN_FLUID_PUMP_DUTY_CYCLE_PCT, MAX_FLUID_PUMP_DUTY_CYCLE_PCT, FALSE, 0 ); - initPersistentAlarm( ALARM_ID_FP_PERMEATE_FLOW_RATE_BELOW_TARGET, FP_FLOW_RATE_BELOW_TARGET_CLEAR_MS, FP_FLOW_RATE_BELOW_TARGET_TIMEOUT_MS ); - roPumpState = RO_PUMP_OFF_STATE; isROPumpOn = FALSE; stopPumpRequest = FALSE; @@ -133,6 +132,7 @@ roPumpOpenLoopTargetDutyCycle.ovData = 0.0; roPumpOpenLoopTargetDutyCycle.ovInitData = 0.0; roPumpOpenLoopTargetDutyCycle.override = OVERRIDE_RESET; + roPumpClosedLoopStartTimeMS = 0; stopROPump(); } @@ -284,10 +284,8 @@ static RO_PUMP_STATE_T handleROPumpControlToTargetFlowState( void ) { RO_PUMP_STATE_T state = RO_PUMP_CONTROL_TO_TARGET_FLOW_STATE; - F32 nexttgtflow = 0.0; - F32 currentFlowRate = 0.0; - F32 adjustedFlowRRate = 0.0; - BOOL isFlowRateLow = FALSE; + F32 currentFlowRate = 0.0F; + F32 minRequiredFlowRate = 0.0F; // Check if need to switch control modes if ( getTargetROPumpPressure() > 0.0F ) @@ -311,10 +309,10 @@ else if ( ++roControlTimerCounter >= ROP_CONTROL_INTERVAL ) { currentFlowRate = getFilteredFlow( P16_FLOW ); - adjustedFlowRRate = (F32)getTargetROPumpFlowRateMLPM() * ROP_MIN_FLOW_TO_CONTROL_PCT; + minRequiredFlowRate = (F32)getTargetROPumpFlowRateMLPM() * ROP_MIN_FLOW_TO_CONTROL_PCT; // P16 flow seems to lag in current Leahi HW. We will wait till we hit a % of target flow before we start changing control. - if( ( TRUE == roPumpStartControl ) || ( currentFlowRate >= ( adjustedFlowRRate ) ) ) + if( ( TRUE == roPumpStartControl ) || ( currentFlowRate >= ( minRequiredFlowRate ) ) ) { roPumpDutyCyclePctSet = runPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, (F32)getTargetROPumpFlowRateMLPM(), currentFlowRate ); roPumpDutyCyclePctSet = MIN( roPumpDutyCyclePctSet, ( MAX_FLUID_PUMP_PWM_DUTY_CYCLE * MAX_FLUID_PUMP_DUTY_CYCLE_PCT ) ); @@ -326,11 +324,6 @@ } } roControlTimerCounter = 0; - - //is flow rate less than 75% of the target flow rate - // wait for 10 seconds for timeout - isFlowRateLow = ( ( currentFlowRate < ( adjustedFlowRRate ) ) ? TRUE : FALSE); - checkPersistentAlarm( ALARM_ID_FP_PERMEATE_FLOW_RATE_BELOW_TARGET, isFlowRateLow, currentFlowRate, adjustedFlowRRate); } return state; @@ -416,6 +409,7 @@ // Get the initial guess of the duty cycle roPumpDutyCyclePctSet = roPumpFlowToPWM( getTargetROPumpFlowRateMLPM() ); roControlTimerCounter = 0; + roPumpClosedLoopStartTimeMS = getMSTimerCount(); isROPumpOn = TRUE; result = TRUE; } Index: firmware/App/Modes/FPModes/FlushConcentrate.c =================================================================== diff -u -rbadf38264b5f9f238d46d860f165b1e1bb4311b7 -r18d4cfcb41570947e19250a549a62e52cdcd3aaa --- firmware/App/Modes/FPModes/FlushConcentrate.c (.../FlushConcentrate.c) (revision badf38264b5f9f238d46d860f165b1e1bb4311b7) +++ firmware/App/Modes/FPModes/FlushConcentrate.c (.../FlushConcentrate.c) (revision 18d4cfcb41570947e19250a549a62e52cdcd3aaa) @@ -1,6 +1,6 @@ /************************************************************************** * -* Copyright (c) 2025-2025 Diality Inc. - All Rights Reserved. +* Copyright (c) 2025-2026 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. Index: firmware/App/Modes/FPModes/FlushFilter.c =================================================================== diff -u -r830213bc6dcc1a684610caf78c79d55f2cb41e93 -r18d4cfcb41570947e19250a549a62e52cdcd3aaa --- firmware/App/Modes/FPModes/FlushFilter.c (.../FlushFilter.c) (revision 830213bc6dcc1a684610caf78c79d55f2cb41e93) +++ firmware/App/Modes/FPModes/FlushFilter.c (.../FlushFilter.c) (revision 18d4cfcb41570947e19250a549a62e52cdcd3aaa) @@ -20,11 +20,13 @@ #include "FPOperationModes.h" #include "MessageSupport.h" #include "Messaging.h" +#include "PersistentAlarm.h" #include "Pressure.h" +#include "ROPump.h" #include "TaskGeneral.h" +#include "Temperature.h" #include "Timers.h" #include "Valves.h" -#include "WaterQualityMonitor.h" /** * @addtogroup FPFilterFlush @@ -37,6 +39,10 @@ #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 ( 3 * SEC_PER_MIN * MS_PER_SECOND ) ///< Filter flush timeout for 3 minutes (in ms) #define FILTER_FLUSH_BOOST_PUMP_TGT_PSI 25 ///< Pressure target in PSI for the boost pump during filter flush. +#define MAX_INLET_TEMPERATURE_HIGH_PSI_C 40.0F ///< Maximum allowed Inlet temperature in C. +#define INLET_TEMPERATURE_PERSISTENCE_CLEAR_MS ( 5 * MS_PER_SECOND ) ///< Persistence timer to clear alarm in ms. +#define INLET_TEMPERATURE_PERSISTENCE_TIMER_MS ( 5 * MS_PER_SECOND ) ///< Persistence timer to trigger alarm in ms. +#define INLET_TEMPERATURE_CRITICAL_THRESHOLD_C 40.0F ///< Maximum allowed M3 Inlet temperature in C during filters flush state. // ********** private data ********** @@ -79,6 +85,8 @@ filterFlushTimer = 0; isFlushComplete = FALSE; pendingStartFilterFlushRequest = FALSE; + + initPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_CRITICAL_RANGE, INLET_TEMPERATURE_PERSISTENCE_CLEAR_MS, INLET_TEMPERATURE_PERSISTENCE_TIMER_MS ); } /*********************************************************************//** @@ -98,7 +106,6 @@ { case FILTER_FLUSH_IN_PROGRESS: filterFlushState = handleFilterFlushProgressState(); - checkInletTemperatures(); break; case FILTER_FLUSH_PAUSED: @@ -115,6 +122,7 @@ { setFilterFlushTransition( filterFlushState ); } + // publish filter flush data on interval publishFilterFlushData(); } @@ -129,12 +137,17 @@ static FP_FILTER_FLUSH_STATE_T handleFilterFlushProgressState( void ) { FP_FILTER_FLUSH_STATE_T state = FILTER_FLUSH_IN_PROGRESS; + F32 temperatureM3 = getFilteredPressureSensorTemperature( M3_PRES ); + BOOL isTempOutOfHighRange = FALSE; // if ( TRUE == 1 )// TODO Alarm and Stop State Rework // { // state = FILTER_FLUSH_PAUSED; // } + isTempOutOfHighRange = ( ( temperatureM3 >= INLET_TEMPERATURE_CRITICAL_THRESHOLD_C ) ? TRUE : FALSE ); + checkPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_CRITICAL_RANGE, isTempOutOfHighRange, temperatureM3, INLET_TEMPERATURE_CRITICAL_THRESHOLD_C ); + if( TRUE == didTimeout( filterFlushTimer, getFilterFlushTimeout() ) ) { isFlushComplete = TRUE; @@ -188,11 +201,13 @@ setValveState( P34_VALV, VALVE_STATE_CLOSED ); setValveState( P37_VALV, VALVE_STATE_CLOSED ); setValveState( P39_VALV, VALVE_STATE_OPEN ); - filterFlushTimer = getMSTimerCount(); + if ( TRUE == isBoostPumpInstalled() ) { setBoostPumpTargetPressure( FILTER_FLUSH_BOOST_PUMP_TGT_PSI ); } + signalROPumpHardStop(); + filterFlushTimer = getMSTimerCount(); break; case FILTER_FLUSH_PAUSED: Index: firmware/App/Modes/FPModes/FlushPermeate.c =================================================================== diff -u -rbadf38264b5f9f238d46d860f165b1e1bb4311b7 -r18d4cfcb41570947e19250a549a62e52cdcd3aaa --- firmware/App/Modes/FPModes/FlushPermeate.c (.../FlushPermeate.c) (revision badf38264b5f9f238d46d860f165b1e1bb4311b7) +++ firmware/App/Modes/FPModes/FlushPermeate.c (.../FlushPermeate.c) (revision 18d4cfcb41570947e19250a549a62e52cdcd3aaa) @@ -1,6 +1,6 @@ /************************************************************************** * -* Copyright (c) 2025-2025 Diality Inc. - All Rights Reserved. +* Copyright (c) 2025-2026 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. Index: firmware/App/Modes/FPModes/FlushPermeate.h =================================================================== diff -u -rbadf38264b5f9f238d46d860f165b1e1bb4311b7 -r18d4cfcb41570947e19250a549a62e52cdcd3aaa --- firmware/App/Modes/FPModes/FlushPermeate.h (.../FlushPermeate.h) (revision badf38264b5f9f238d46d860f165b1e1bb4311b7) +++ firmware/App/Modes/FPModes/FlushPermeate.h (.../FlushPermeate.h) (revision 18d4cfcb41570947e19250a549a62e52cdcd3aaa) @@ -1,6 +1,6 @@ /************************************************************************** * -* Copyright (c) 2025-2025 Diality Inc. - All Rights Reserved. +* Copyright (c) 2025-2026 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. Index: firmware/App/Modes/FPModes/InletPressureCheck.c =================================================================== diff -u -r830213bc6dcc1a684610caf78c79d55f2cb41e93 -r18d4cfcb41570947e19250a549a62e52cdcd3aaa --- firmware/App/Modes/FPModes/InletPressureCheck.c (.../InletPressureCheck.c) (revision 830213bc6dcc1a684610caf78c79d55f2cb41e93) +++ firmware/App/Modes/FPModes/InletPressureCheck.c (.../InletPressureCheck.c) (revision 18d4cfcb41570947e19250a549a62e52cdcd3aaa) @@ -17,10 +17,11 @@ #include "BoostPump.h" #include "FlowSensor.h" -#include "InletPressureCheck.h" #include "FPOperationModes.h" +#include "InletPressureCheck.h" #include "MessageSupport.h" #include "Messaging.h" +#include "PersistentAlarm.h" #include "Pressure.h" #include "ROPump.h" #include "TaskGeneral.h" @@ -34,20 +35,23 @@ // ********** private definitions ********** -#define INLET_PRES_CHECK_MAX_TIMEOUT ( 600 * MS_PER_SECOND ) ///< Max override timeout for 10 minutes +#define INLET_PRES_CHECK_MAX_TIMEOUT ( 10 * SEC_PER_MIN * MS_PER_SECOND ) ///< Max override timeout for 10 minutes #define INLET_PRES_CHECK_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the gen water mode data published. -#define INLET_PRES_CHECK_TIMEOUT ( 60 * MS_PER_SECOND ) ///< Inlet Pressure Check timer (in ms) +#define INLET_PRES_CHECK_BP_TIMEOUT ( 10 * MS_PER_SECOND ) ///< Inlet Pressure Check timer (in ms) for booster pump installed +#define INLET_PRES_CHECK_TIMEOUT ( 1 * MS_PER_SECOND ) ///< Inlet Pressure Check timer (in ms) for featured and de-featured #define INLET_PRES_CHECK_BOOST_PUMP_TGT_PWM 0.2F ///< target in PWM % for the BOOST pump during inlet pressure check. -#define INLET_PRES_CHECK_TGT_PSI 30 ///< Pressure target in PSI for the M3 during inlet pressure check. +#define INLET_PRES_CHECK_WITH_BP_TGT_PSI 30 ///< Pressure target in PSI for the M3 during inlet pressure check with booster pump. +#define INLET_PRES_CHECK_TGT_PSI 75 ///< Pressure target in PSI for the M3 during inlet pressure check without booster pump. #define INLET_PRES_CHECK_TOLERANCE_PSI 2 ///< Pressure tolerance in PSI for the M3 during inlet pressure check. -#define INLET_PRES_PERSISTENCE_TIME_MS ( 10 * MS_PER_SECOND ) ///< Persistence time for M3 during inlet pressure check. +#define INLET_PRES_PERSISTENCE_TIME_WITH_BP_MS ( 1 * MS_PER_SECOND ) ///< Persistence time for M3 during inlet pressure check with booster pump. +#define INLET_PRES_OUT_OF_RANGE_CLEAR_MS ( 1 * MS_PER_SECOND ) ///< Persistence time for M3 during inlet pressure check without booster pump. +#define INLET_PRES_OUT_OF_RANGE_TIMEOUT_MS ( 1 * MS_PER_SECOND ) ///< Persistence time for M3 during inlet pressure check without booster pump. // ********** private data ********** static FP_INLET_PRES_CHECK_STATE_T inletPressureCheckState; ///< Currently active Inlet Pressure check state. static U32 inletPressureCheckDataPublicationTimerCounter; ///< Used to schedule Inlet Pressure Check data publication to CAN bus. static U32 inletPressureCheckTimer; ///< Inlet Pressure check timeout timer -static U32 inletPressureCheckPersistanceStartTimeMS; ///< Current time for inlet pressure check persistence time started in milliseconds. static BOOL isPressureCheckComplete; ///< Inlet Pressure Check complete BOOL static OVERRIDE_U32_T inletPressureCheckDataPublishInterval; ///< Inlet Pressure Check mode data publish interval. static OVERRIDE_U32_T inletPressureCheckTimeout; ///< Inlet Pressure check timeout value @@ -75,18 +79,48 @@ inletPressureCheckDataPublishInterval.ovData = INLET_PRES_CHECK_DATA_PUBLISH_INTERVAL; inletPressureCheckDataPublishInterval.ovInitData = 0; inletPressureCheckDataPublishInterval.override = OVERRIDE_RESET; - inletPressureCheckTimeout.data = INLET_PRES_CHECK_TIMEOUT; - inletPressureCheckTimeout.ovData = INLET_PRES_CHECK_TIMEOUT; - inletPressureCheckTimeout.ovInitData = 0; - inletPressureCheckTimeout.override = OVERRIDE_RESET; inletPressureCheckDataPublicationTimerCounter = 0; inletPressureCheckTimer = 0; - inletPressureCheckPersistanceStartTimeMS = 0; isPressureCheckComplete = FALSE; + + if ( TRUE == isBoostPumpInstalled() ) + { + inletPressureCheckTimeout.data = INLET_PRES_CHECK_BP_TIMEOUT; + inletPressureCheckTimeout.ovData = INLET_PRES_CHECK_BP_TIMEOUT; + inletPressureCheckTimeout.ovInitData = 0; + inletPressureCheckTimeout.override = OVERRIDE_RESET; + } + else + { + inletPressureCheckTimeout.data = INLET_PRES_CHECK_TIMEOUT; + inletPressureCheckTimeout.ovData = INLET_PRES_CHECK_TIMEOUT; + inletPressureCheckTimeout.ovInitData = 0; + inletPressureCheckTimeout.override = OVERRIDE_RESET; + } + + // Pressure alarms + initPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_REGULATOR_OUT_OF_RANGE, INLET_PRES_OUT_OF_RANGE_CLEAR_MS, INLET_PRES_OUT_OF_RANGE_TIMEOUT_MS ); + initPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_REGULATOR_OUT_OF_RANGE, INLET_PRES_OUT_OF_RANGE_CLEAR_MS, INLET_PRES_OUT_OF_RANGE_TIMEOUT_MS ); + initPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_CRITICAL_OUT_RANGE, INLET_PRES_OUT_OF_RANGE_CLEAR_MS, INLET_PRES_OUT_OF_RANGE_TIMEOUT_MS ); } /*********************************************************************//** * @brief + * The transitionToInletPressureCheck function prepares for transition to + * inlet pressure check + * permeate mode. + * @details \b Inputs: inletPressureCheckState + * @details \b Outputs: none + * @return initial 0 + *************************************************************************/ +U32 transitionToInletPressureCheck( void ) +{ + initInletPressureCheck(); + return 0; +} + +/*********************************************************************//** + * @brief * The execInletPressureCheck function executes the inlet pressure check * state machine and publishes inlet pressure check data. * @details \b Inputs: inletPressureCheckState @@ -127,40 +161,56 @@ * The handleInletPressureCheckProgressState handles the in progress * state of inlet pressure check * @details \b Inputs: none - * @details \b Outputs: none + * @details \b Outputs: isPressureCheckComplete * @return the next state of Inlet Pressure check state *************************************************************************/ static FP_INLET_PRES_CHECK_STATE_T handleInletPressureCheckProgressState( void ) { FP_INLET_PRES_CHECK_STATE_T state = INLET_PRES_CHECK_IN_PROGRESS; - F32 inletPressure = 0.0; + F32 pressureM3 = getFilteredPressure(M3_PRES); + F32 minThreshold = INLET_PRES_CHECK_WITH_BP_TGT_PSI - INLET_PRES_CHECK_TOLERANCE_PSI; + F32 maxThreshold = INLET_PRES_CHECK_WITH_BP_TGT_PSI + INLET_PRES_CHECK_TOLERANCE_PSI; + BOOL isPresOutOfLowRange = FALSE; + BOOL isPresOutOfHighRange = FALSE; - inletPressure = getFilteredPressure(M3_PRES); - // check for inlet pressure (M3) within range - if( ( inletPressure >= (INLET_PRES_CHECK_TGT_PSI - INLET_PRES_CHECK_TOLERANCE_PSI) ) && ( inletPressure <= (INLET_PRES_CHECK_TGT_PSI + INLET_PRES_CHECK_TOLERANCE_PSI) ) ) + if ( TRUE == isBoostPumpInstalled() ) { - if ( 0 == inletPressureCheckPersistanceStartTimeMS ) + // timeout after 10 seconds + if ( TRUE == didTimeout(inletPressureCheckTimer , getInletPressureCheckTimeout() ) ) { - inletPressureCheckPersistanceStartTimeMS = getMSTimerCount(); + isPresOutOfLowRange = ( ( pressureM3 < minThreshold ) ? TRUE : FALSE ); + isPresOutOfHighRange = ( ( ( pressureM3 > maxThreshold ) ) ? TRUE : FALSE ); + // check for inlet pressure (M3) within range + if( ( pressureM3 >= minThreshold ) && ( pressureM3 <= maxThreshold ) ) + { + isPressureCheckComplete = TRUE; + state = INLET_PRES_CHECK_PAUSED; + } + else + { + // check persistent alarm for 1 second + checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_REGULATOR_OUT_OF_RANGE, isPresOutOfLowRange, pressureM3, minThreshold ); + checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_REGULATOR_OUT_OF_RANGE, isPresOutOfHighRange, pressureM3, maxThreshold ); + } } - else if ( TRUE == didTimeout( inletPressureCheckPersistanceStartTimeMS, INLET_PRES_PERSISTENCE_TIME_MS ) ) + } + else + { + // Change inlet pressure check for M3 criteria from 30 PSI to <75 PSI for both featured and de-featured + // ALARM_ID_FP_INLET_PRESSURE_CRITICAL_OUT_RANGE is defined for featured when > 75 and > 40 for de-featured so re using alarm ID + // INLET_PRES_CHECK_TGT_PSI = 75 + + isPresOutOfHighRange = ( ( pressureM3 >= INLET_PRES_CHECK_TGT_PSI ) ? TRUE : FALSE ); + + checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_REGULATOR_OUT_OF_RANGE, isPresOutOfHighRange, pressureM3, INLET_PRES_CHECK_TGT_PSI ); + + // stay in this state for 1 second for checking the persistent alarm + if ( TRUE == didTimeout(inletPressureCheckTimer , getInletPressureCheckTimeout() ) ) { - inletPressureCheckPersistanceStartTimeMS = 0; isPressureCheckComplete = TRUE; state = INLET_PRES_CHECK_PAUSED; } } - // reset the persistence timer when inlet pressure out of range - else if( ( inletPressure <= (INLET_PRES_CHECK_TGT_PSI - INLET_PRES_CHECK_TOLERANCE_PSI) ) || ( inletPressure >= (INLET_PRES_CHECK_TGT_PSI + INLET_PRES_CHECK_TOLERANCE_PSI) ) ) - { - inletPressureCheckPersistanceStartTimeMS = 0; - } - // Trigger alarm if M3 pressure is not within range - else if ( TRUE == didTimeout( inletPressureCheckTimer, getInletPressureCheckTimeout() ) ) - { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_RO_INLET_PRESSURE_OUT_HIGH_RANGE, INLET_PRES_CHECK_TIMEOUT, inletPressure) - state = INLET_PRES_CHECK_PAUSED; - } return state; } @@ -201,18 +251,24 @@ case INLET_PRES_CHECK_IN_PROGRESS: setValveState( M4_VALV, VALVE_STATE_CLOSED ); setValveState( M12_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 ); - - if ( TRUE == isBoostPumpInstalled() ) + if ( TRUE == isFPDefeatured() ) { - setBoostPumpTargetDutyCycle( INLET_PRES_CHECK_BOOST_PUMP_TGT_PWM ); + setValveState( D52_VALV, VALVE_STATE_CLOSED ); } - signalROPumpHardStop(); + else + { + 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 ); + if ( TRUE == isBoostPumpInstalled() ) + { + setBoostPumpTargetDutyCycle( INLET_PRES_CHECK_BOOST_PUMP_TGT_PWM ); + } + signalROPumpHardStop(); + } inletPressureCheckTimer = getMSTimerCount(); break; @@ -222,18 +278,26 @@ { setValveState( M4_VALV, VALVE_STATE_CLOSED ); setValveState( M12_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 ); - if ( TRUE == isBoostPumpInstalled() ) + if ( TRUE == isFPDefeatured() ) { - signalBoostPumpHardStop(); + setValveState( D52_VALV, VALVE_STATE_CLOSED ); } - signalROPumpHardStop(); + else + { + 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 ); + + if ( TRUE == isBoostPumpInstalled() ) + { + signalBoostPumpHardStop(); + } + signalROPumpHardStop(); + } } break; Index: firmware/App/Modes/FPModes/InletPressureCheck.h =================================================================== diff -u -rfb0f180eb25dbcfd15d58ef584d535efd1c24e30 -r18d4cfcb41570947e19250a549a62e52cdcd3aaa --- firmware/App/Modes/FPModes/InletPressureCheck.h (.../InletPressureCheck.h) (revision fb0f180eb25dbcfd15d58ef584d535efd1c24e30) +++ firmware/App/Modes/FPModes/InletPressureCheck.h (.../InletPressureCheck.h) (revision 18d4cfcb41570947e19250a549a62e52cdcd3aaa) @@ -1,6 +1,6 @@ /************************************************************************** * -* Copyright (c) 2025-2025 Diality Inc. - All Rights Reserved. +* Copyright (c) 2025-2026 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. Index: firmware/App/Modes/FPModes/ModeGenPermeate.c =================================================================== diff -u -rbadf38264b5f9f238d46d860f165b1e1bb4311b7 -r18d4cfcb41570947e19250a549a62e52cdcd3aaa --- firmware/App/Modes/FPModes/ModeGenPermeate.c (.../ModeGenPermeate.c) (revision badf38264b5f9f238d46d860f165b1e1bb4311b7) +++ firmware/App/Modes/FPModes/ModeGenPermeate.c (.../ModeGenPermeate.c) (revision 18d4cfcb41570947e19250a549a62e52cdcd3aaa) @@ -1,6 +1,6 @@ /************************************************************************** * -* Copyright (c) 2025-2025 Diality Inc. - All Rights Reserved. +* Copyright (c) 2025-2026 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. Index: firmware/App/Modes/FPModes/ModeGenPermeateDefeatured.c =================================================================== diff -u -rbadf38264b5f9f238d46d860f165b1e1bb4311b7 -r18d4cfcb41570947e19250a549a62e52cdcd3aaa --- firmware/App/Modes/FPModes/ModeGenPermeateDefeatured.c (.../ModeGenPermeateDefeatured.c) (revision badf38264b5f9f238d46d860f165b1e1bb4311b7) +++ firmware/App/Modes/FPModes/ModeGenPermeateDefeatured.c (.../ModeGenPermeateDefeatured.c) (revision 18d4cfcb41570947e19250a549a62e52cdcd3aaa) @@ -1,6 +1,6 @@ /************************************************************************** * -* Copyright (c) 2025-2025 Diality Inc. - All Rights Reserved. +* Copyright (c) 2025-2026 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. Index: firmware/App/Modes/FPModes/ModePreGenPermeate.c =================================================================== diff -u -rf470abe73ad49acbdf4b6d821270374a9d528286 -r18d4cfcb41570947e19250a549a62e52cdcd3aaa --- firmware/App/Modes/FPModes/ModePreGenPermeate.c (.../ModePreGenPermeate.c) (revision f470abe73ad49acbdf4b6d821270374a9d528286) +++ firmware/App/Modes/FPModes/ModePreGenPermeate.c (.../ModePreGenPermeate.c) (revision 18d4cfcb41570947e19250a549a62e52cdcd3aaa) @@ -1,14 +1,14 @@ /************************************************************************** * -* Copyright (c) 2025-2025 Diality Inc. - All Rights Reserved. +* Copyright (c) 2025-2026 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 ModePreGenPermeate.c * * @author (last) “rkallala” -* @date (last) 09-Dec-2025 +* @date (last) 14-Jan-2026 * * @author (original) Michael Garthwaite * @date (original) 08-Sep-2025 @@ -259,14 +259,22 @@ // state = FP_PRE_GENP_PAUSED; // } - execFilterFlush(); - - if ( TRUE == isFilterFlushComplete() ) + if ( TRUE == getTestConfigStatus( TEST_CONFIG_SKIP_FILTERS_FLUSH ) ) { signalStartPermeateFlush(); state = FP_PRE_GENP_PERMEATE_FLUSH; } + else + { + execFilterFlush(); + if ( TRUE == isFilterFlushComplete() ) + { + signalStartPermeateFlush(); + state = FP_PRE_GENP_PERMEATE_FLUSH; + } + } + return state; } Index: firmware/App/Modes/FPModes/ModePreGenPermeateDefeatured.c =================================================================== diff -u -r830213bc6dcc1a684610caf78c79d55f2cb41e93 -r18d4cfcb41570947e19250a549a62e52cdcd3aaa --- firmware/App/Modes/FPModes/ModePreGenPermeateDefeatured.c (.../ModePreGenPermeateDefeatured.c) (revision 830213bc6dcc1a684610caf78c79d55f2cb41e93) +++ firmware/App/Modes/FPModes/ModePreGenPermeateDefeatured.c (.../ModePreGenPermeateDefeatured.c) (revision 18d4cfcb41570947e19250a549a62e52cdcd3aaa) @@ -15,8 +15,10 @@ * ***************************************************************************/ +#include "FlushFilterDefeatured.h" #include "FPModeStandby.h" #include "FPOperationModes.h" +#include "InletPressureCheck.h" #include "Messaging.h" #include "MessageSupport.h" #include "ModeGenPermeateDefeatured.h" @@ -42,13 +44,11 @@ static U32 preGenPermeateDefDataPublicationTimerCounter; ///< Used to schedule generate Permeate data publication to CAN bus. static OVERRIDE_U32_T preGenPermeateDefDataPublishInterval; ///< Generate permeate mode data publish interval. static BOOL pendingStartPreGenDefRequest; ///< Flag indicating DD has requested FP start the generate permeate. -static U32 preGenPermeateDefFlushTimer; -static U32 preGenPermeateDefWaterCheckTimer; // ********** private function prototypes ********** +static FP_PRE_GENP_DEF_MODE_STATE_T handlePreGenPDefInletPressureCheckState( void ); static FP_PRE_GENP_DEF_MODE_STATE_T handlePreGenPDefFlushState( void ); -static FP_PRE_GENP_DEF_MODE_STATE_T handlePreGenPDefInletWaterState( void ); static FP_PRE_GENP_DEF_MODE_STATE_T handlePreGenPDefPausedState( void ); static void setModePreGenPDefTransition( FP_PRE_GENP_DEF_MODE_STATE_T state ); static U32 getPreGenPermeateDefDataPublishInterval( void ); @@ -64,15 +64,13 @@ *************************************************************************/ void initPreGenPermeateDefeaturedMode( void ) { - preGenPermeateDefState = FP_PRE_GENP_DEF_FLUSH; + preGenPermeateDefState = FP_PRE_GENP_DEF_INLET_PRESSURE_CHECK; preGenPermeateDefDataPublishInterval.data = PRE_GEN_DEF_PERMEATE_DATA_PUBLISH_INTERVAL; preGenPermeateDefDataPublishInterval.ovData = PRE_GEN_DEF_PERMEATE_DATA_PUBLISH_INTERVAL; preGenPermeateDefDataPublishInterval.ovInitData = 0; preGenPermeateDefDataPublishInterval.override = OVERRIDE_RESET; preGenPermeateDefDataPublicationTimerCounter = 0; pendingStartPreGenDefRequest = FALSE; - preGenPermeateDefFlushTimer = 0; - preGenPermeateDefWaterCheckTimer = 0; } /*********************************************************************//** @@ -107,14 +105,14 @@ // execute current gen Permeate defeatured state switch ( preGenPermeateDefState ) { + case FP_PRE_GENP_DEF_INLET_PRESSURE_CHECK: + preGenPermeateDefState = handlePreGenPDefInletPressureCheckState(); + break; + case FP_PRE_GENP_DEF_FLUSH: preGenPermeateDefState = handlePreGenPDefFlushState(); break; - case FP_PRE_GENP_DEF_INLET_WATER_CHECK: - preGenPermeateDefState = handlePreGenPDefInletWaterState(); - break; - case FP_PRE_GENP_DEF_PAUSED: preGenPermeateDefState = handlePreGenPDefPausedState(); break; @@ -149,28 +147,26 @@ // Execute on running state switch( state ) { - case FP_PRE_GENP_DEF_FLUSH: - setValveState( M4_VALV, VALVE_STATE_OPEN ); - setValveState( M12_VALV, VALVE_STATE_OPEN ); + case FP_PRE_GENP_DEF_INLET_PRESSURE_CHECK: + setValveState( M4_VALV, VALVE_STATE_CLOSED ); + setValveState( M12_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 ); - preGenPermeateDefFlushTimer = getMSTimerCount(); break; - case FP_PRE_GENP_DEF_INLET_WATER_CHECK: + case FP_PRE_GENP_DEF_FLUSH: setValveState( M4_VALV, VALVE_STATE_OPEN ); - setValveState( M12_VALV, VALVE_STATE_CLOSED ); + setValveState( M12_VALV, VALVE_STATE_OPEN ); 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 ); - preGenPermeateDefWaterCheckTimer = getMSTimerCount(); break; case FP_PRE_GENP_DEF_PAUSED: @@ -192,47 +188,41 @@ /*********************************************************************//** * @brief - * The handlePreGenPDefFlushState handles the supply water of gen permeate - * defeatured mode. - * @details \b Inputs: preGenPermeateDefFlushTimer + * The handlePreGenPDefInletPressureCheckState handles the inlet pressure check state of pre gen Permeate. + * @details \b Inputs: none * @details \b Outputs: none - * @return the next state of gen water defeatured mode + * @return the next state of pre gen Permeate mode *************************************************************************/ -static FP_PRE_GENP_DEF_MODE_STATE_T handlePreGenPDefFlushState( void ) +static FP_PRE_GENP_DEF_MODE_STATE_T handlePreGenPDefInletPressureCheckState( void ) { - FP_PRE_GENP_DEF_MODE_STATE_T state = FP_PRE_GENP_DEF_FLUSH; + FP_PRE_GENP_DEF_MODE_STATE_T state = FP_PRE_GENP_DEF_INLET_PRESSURE_CHECK; -// if ( TRUE == 1 )// TODO Alarm and Stop State Rework -// { -// state = FP_PRE_GENP_DEF_PAUSED; -// } + execInletPressureCheck(); - if( TRUE == didTimeout( preGenPermeateDefFlushTimer, PRE_GEN_DEF_FLUSH_TIMEOUT_MS ) ) + if ( TRUE == isInletPressureCheckCompleted() ) { - state = FP_PRE_GENP_DEF_INLET_WATER_CHECK; + signalStartDefFilterFlush(); + state = FP_PRE_GENP_DEF_FLUSH; } return state; } /*********************************************************************//** * @brief - * The handlePreGenPDefInletWaterState handles the pause state of gen permeate + * The handlePreGenPDefFlushState handles the supply water of gen permeate * defeatured mode. - * @details \b Inputs: preGenPermeateDefWaterCheckTimer + * @details \b Inputs: none * @details \b Outputs: none * @return the next state of gen water defeatured mode *************************************************************************/ -static FP_PRE_GENP_DEF_MODE_STATE_T handlePreGenPDefInletWaterState( void ) +static FP_PRE_GENP_DEF_MODE_STATE_T handlePreGenPDefFlushState( void ) { - FP_PRE_GENP_DEF_MODE_STATE_T state = FP_PRE_GENP_DEF_INLET_WATER_CHECK; + FP_PRE_GENP_DEF_MODE_STATE_T state = FP_PRE_GENP_DEF_FLUSH; -// if ( TRUE == 1 ))// TODO Alarm and Stop State Rework -// { -// state = FP_PRE_GENP_DEF_PAUSED; -// } + execFilterFlushDefeatured(); - if( TRUE == didTimeout( preGenPermeateDefWaterCheckTimer, PRE_GEN_DEF_WATER_CHECK_TIMEOUT_MS ) ) + if ( TRUE == isFilterFlushDefComplete() ) { transitionToGenPermeateDefeaturedMode(); requestGenWaterDefStart(); @@ -372,8 +362,8 @@ /*********************************************************************//** * @brief - * The testGenPermeateDefDataPublishIntervalOverride function overrides the - * DD generate water mode data publish interval. + * The testPreGenPermeateDefDataPublishIntervalOverride function overrides the + * DD pre generate water mode data publish interval. * @details \b Inputs: preGenPermeateDefDataPublishInterval * @details \b Outputs: preGenPermeateDefDataPublishInterval * @param Override message from Dialin which includes the interval Index: firmware/App/Monitors/Level.h =================================================================== diff -u -r846073b88a25474464d43b4c0e8f300b52021f96 -r18d4cfcb41570947e19250a549a62e52cdcd3aaa --- firmware/App/Monitors/Level.h (.../Level.h) (revision 846073b88a25474464d43b4c0e8f300b52021f96) +++ firmware/App/Monitors/Level.h (.../Level.h) (revision 18d4cfcb41570947e19250a549a62e52cdcd3aaa) @@ -1,6 +1,6 @@ /************************************************************************** * -* Copyright (c) 2024-2025 Diality Inc. - All Rights Reserved. +* Copyright (c) 2024-2026 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. Index: firmware/App/Monitors/WaterQualityMonitor.c =================================================================== diff -u -r830213bc6dcc1a684610caf78c79d55f2cb41e93 -r18d4cfcb41570947e19250a549a62e52cdcd3aaa --- firmware/App/Monitors/WaterQualityMonitor.c (.../WaterQualityMonitor.c) (revision 830213bc6dcc1a684610caf78c79d55f2cb41e93) +++ firmware/App/Monitors/WaterQualityMonitor.c (.../WaterQualityMonitor.c) (revision 18d4cfcb41570947e19250a549a62e52cdcd3aaa) @@ -19,6 +19,7 @@ #include "Flow.h" #include "FPModeStandby.h" #include "FPOperationModes.h" +#include "Messaging.h" #include "PersistentAlarm.h" #include "Pressure.h" #include "ROPump.h" @@ -34,37 +35,50 @@ // ********** private definitions ********** -#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 ) ///< Persistence timer to trigger alarm in ms. -#define INLET_TEMPERATURE_PERSISTENCE_CLEAR_MS ( 5 * MS_PER_SECOND ) ///< Persistence timer to clear alarm in ms. +#define INLET_TEMPERATURE_LOW_THRESHOLD_C 5.0F ///< Minimum allowed P10/D1 inlet temperature in C. +#define INLET_TEMPERATURE_HIGH_THRESHOLD_C 30.0F ///< Maximum allowed P10/D1 inlet temperature in C. +#define INLET_TEMPERATURE_PERSISTENCE_TIMER_MS ( 5 * MS_PER_SECOND ) ///< Persistence timer for P10/D1 inlet temperature to trigger alarm in milliseconds. +#define INLET_TEMPERATURE_PERSISTENCE_CLEAR_MS ( 5 * MS_PER_SECOND ) ///< Persistence timer for P10/D1 inlet temperature to clear alarm in milliseconds. -#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 25.0F ///< Minimum allowed Input warning low pressure value in psig for RO featured. -#define MAX_INLET_WATER_PRESSURE_WARNING_HIGH_PSIG 40.0F ///< Maximum allowed Input warning high pressure value in psig for RO featured. -#define MAX_INLET_WATER_PRESSURE_FAULT_HIGH_PSIG 75.0F ///< Maximum allowed Input fault high pressure value in psig for RO featured. -#define MIN_INLET_WATER_PRESSURE_DEFEATURED_WARNING_LOW_PSIG 5.0F ///< Minimum allowed Input warning low pressure value in psig for RO Defeatured. -#define MAX_INLET_WATER_PRESSURE_DEFEATURED_WARNING_HIGH_PSIG 10.0F ///< Maximum allowed Input warning high pressure value in psig for RO Defeatured. -#define MAX_INLET_WATER_PRESSURE_DEFEATURED_FAULT_HIGH_PSIG 40.0F ///< Maximum allowed Input fault high pressure value in psig for RO Defeatured. -#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 MAX_INLET_RO_PUMP_PRESSURE_WARNING_HIGH_PSIG 120.0F ///< Maximum allowed Input warning pressure to the RO membrane. +#define MAX_INLET_RO_PUMP_PRESSURE_WARNING_LOW_PSIG 58.0F ///< Minimum Input warning pressure to the RO membrane. +#define MIN_INLET_WATER_PRESSURE_WARNING_LOW_PSIG 25.0F ///< Minimum allowed M3 Input warning low pressure value in psig for RO featured. +#define MAX_INLET_WATER_PRESSURE_WARNING_HIGH_PSIG 40.0F ///< Maximum allowed M3 Input warning high pressure value in psig for RO featured. +#define MAX_INLET_WATER_PRESSURE_FAULT_HIGH_PSIG 75.0F ///< Maximum allowed M3 Input fault high pressure value in psig for RO featured. +#define MIN_INLET_WATER_PRESSURE_PSIG 1.0F ///< Minimum allowed P8 Input fault pressure value in psig for RO featured. +#define MIN_INLET_WATER_PRESSURE_DEFEATURED_WARNING_LOW_PSIG 5.0F ///< Minimum allowed M3 Input warning low pressure value in psig for RO Defeatured. +#define MAX_INLET_WATER_PRESSURE_DEFEATURED_WARNING_HIGH_PSIG 10.0F ///< Maximum allowed M3 Input warning high pressure value in psig for RO Defeatured. +#define MAX_INLET_WATER_PRESSURE_DEFEATURED_FAULT_HIGH_PSIG 40.0F ///< Maximum allowed M3 Input fault high pressure value in psig for RO Defeatured. +#define MIN_PRESSURE_RELIEF_WARNING_LOW_PSIG 13.0F ///< Minimum P17 pressure relief warning in psi +#define MAX_PRESSURE_RELIEF_WARNING_HIGH_PSIG 17.0F ///< Maximum P17 pressure relief warning in psi #define MAX_PERMEATE_FLOW_FAULT_THRESHOLD 1.25F ///< Maximum permeate flow threshold value in percentage. -#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 INLET_WATER_PRES_OUT_OF_RANGE_TIMEOUT_MS ( 5 * MS_PER_SECOND ) ///< Persistence period for M3 pressure out of range error in milliseconds. +#define INLET_WATER_PRES_OUT_OF_RANGE_CLEAR_MS ( 5 * MS_PER_SECOND ) ///< Persistence period for M3 pressure out of range clear in milliseconds. +#define INLET_WATER_PRES_RELIEF_OUT_OF_RANGE_TIMEOUT_MS ( 1 * MS_PER_SECOND ) ///< Persistence period for P17 pressure out of range error in milliseconds. +#define INLET_WATER_PRES_RELIEF_OUT_OF_RANGE_CLEAR_MS ( 1 * MS_PER_SECOND ) ///< Persistence period for P17 pressure out of range clear in milliseconds. +#define INLET_PRES_OUT_OF_RANGE_TIMEOUT_MS ( 3 * MS_PER_SECOND ) ///< Persistence period for p8 pressure out of range error in milliseconds. +#define INLET_PRES_OUT_OF_RANGE_CLEAR_MS ( 3 * MS_PER_SECOND ) ///< Persistence period for p8 pressure out of range clear in milliseconds. -#define OUTLET_CONDUCTIVITY_HIGH_THRESHOLD_US 200.0F ///< Minimum allowed inlet conductivity in uS/cm. +#define OUTLET_CONDUCTIVITY_HIGH_THRESHOLD_US 200.0F ///< Minimum allowed P18 permeate 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. +#define INLET_CONDUCTIVITY_HIGH_THRESHOLD_US 2000.0F ///< Maximum allowed P9 inlet conductivity in uS/cm. #define MIN_RO_REJECTION_RATIO_PCT 90.0F ///< Minimum RO rejection ration in percentage #define PERMEATE_FLOW_OUT_RANGE_PERSISTENCE_TIMEOUT_MS ( 5 * MS_PER_SECOND ) ///< Verify Water timer ( in ms ) #define PERMEATE_FLOW_OUT_RANGE_PERSISTENCE_CLEAR_MS ( 5 * MS_PER_SECOND ) ///< Verify Water timer ( in ms ) #define PERMEATE_FLOW_FAULT_MIN_THRESHOLD 200.0F ///< Permeate flow low tolerance limit #define PERMEATE_FLOW_OUT_OF_RANGE_TIMEOUT_MS ( 12 * MS_PER_SECOND ) ///< Permeate flow low tolerance out of range timeout +#define RO_PUMP_DUTY_CYCLE_WARNING_TIMEOUT_MS ( 1 * MS_PER_SECOND ) ///< Persistence period for duty cycle in warning range in milliseconds. +#define RO_PUMP_DUTY_CYCLE_WARNING_CLEAR_MS ( 1 * MS_PER_SECOND ) ///< Persistence period for duty cycle warning range clear in milliseconds. + +// pump manufacturer's data for pump current draw based on pump speed and outlet pressure If 58 PSI ≤ P13 < 120 PSI, +// the currently set P12 duty cycle (% PWM) must be < 0.0065(x^2) - 1.9859(x) + 193.23, where x = measured P13 pressure in PSI +#define QUADRATIC_COEFFICIENT 0.0065F ///< X2 quadratic coefficient +#define LINEAR_COEFFICIENT 1.9895F ///< X linear coefficient +#define CONSTANT_TERM 193.23F ///< Constant term + // ********** private data ********** // ********** private function prototypes ********** @@ -81,9 +95,12 @@ // 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_INLET_PRESSURE_CRITICAL_OUT_RANGE, INLET_WATER_PRES_OUT_OF_RANGE_CLEAR_MS, INLET_WATER_PRES_OUT_OF_RANGE_TIMEOUT_MS ); + + initPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_LOW_RANGE, INLET_PRES_OUT_OF_RANGE_TIMEOUT_MS, INLET_PRES_OUT_OF_RANGE_CLEAR_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 ); @@ -97,19 +114,23 @@ initPersistentAlarm( ALARM_ID_FP_PERMEATE_FLOW_OUT_HIGH_RANGE, PERMEATE_FLOW_OUT_RANGE_PERSISTENCE_CLEAR_MS, PERMEATE_FLOW_OUT_RANGE_PERSISTENCE_TIMEOUT_MS ); // fault , clearing timeout is not applicable initPersistentAlarm( ALARM_ID_FP_PERMEATE_FLOW_OUT_LOW_RANGE, 0, PERMEATE_FLOW_OUT_OF_RANGE_TIMEOUT_MS ); + + // duty cycle warning alarm + initPersistentAlarm( ALARM_ID_FP_POWER_BUDGET_OUT_OF_RANGE, RO_PUMP_DUTY_CYCLE_WARNING_CLEAR_MS, RO_PUMP_DUTY_CYCLE_WARNING_TIMEOUT_MS ); } /*********************************************************************//** * @brief * The checkInletPressures function checks the inlet water pressure * against the pressure threshold and alarm if the pressure is out of range. + * RO Featured, Water Production and RO Defeatured, Water Supply * @details \b Inputs: pressureM3 * @details \b Outputs: none * @details \b Alarms: ALARM_ID_FP_INLET_PRESSURE_OUT_LOW_RANGE when * M3 pressure goes beyond low pressure limit. * @details \b Alarms: ALARM_ID_FP_INLET_PRESSURE_OUT_HIGH_RANGE when * M3 pressure goes beyond high pressure limit - * @details \b Alarms: ALARM_ID_FP_INLET_PRESSURE_CRITICAL_OUT_RANGE when + * @details \b Alarms: when * M3 pressure goes beyond fault high pressure limit * @return none *************************************************************************/ @@ -122,18 +143,18 @@ if ( TRUE == isFPDefeatured() ) { - isPresOutOfLowRange = ( ( pressureM3 < MIN_INLET_WATER_PRESSURE_DEFEATURED_WARNING_LOW_PSIG ) ? TRUE : FALSE); - isPresOutOfHighRange = ( ( ( pressureM3 > MAX_INLET_WATER_PRESSURE_DEFEATURED_WARNING_HIGH_PSIG ) && ( pressureM3 < MAX_INLET_WATER_PRESSURE_DEFEATURED_FAULT_HIGH_PSIG ) ) ? TRUE : FALSE); - isPresOutOfHighRangeFault = ( ( pressureM3 > MAX_INLET_WATER_PRESSURE_DEFEATURED_FAULT_HIGH_PSIG ) ? TRUE : FALSE); + isPresOutOfLowRange = ( ( pressureM3 < MIN_INLET_WATER_PRESSURE_DEFEATURED_WARNING_LOW_PSIG ) ? TRUE : FALSE ); + isPresOutOfHighRange = ( ( ( pressureM3 > MAX_INLET_WATER_PRESSURE_DEFEATURED_WARNING_HIGH_PSIG ) && ( pressureM3 < MAX_INLET_WATER_PRESSURE_DEFEATURED_FAULT_HIGH_PSIG ) ) ? TRUE : FALSE ); + isPresOutOfHighRangeFault = ( ( pressureM3 > MAX_INLET_WATER_PRESSURE_DEFEATURED_FAULT_HIGH_PSIG ) ? TRUE : FALSE ); checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_LOW_RANGE, isPresOutOfLowRange, pressureM3, MIN_INLET_WATER_PRESSURE_DEFEATURED_WARNING_LOW_PSIG ); checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_HIGH_RANGE, isPresOutOfHighRange, pressureM3, MAX_INLET_WATER_PRESSURE_DEFEATURED_WARNING_HIGH_PSIG ); checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_CRITICAL_OUT_RANGE, isPresOutOfHighRangeFault, pressureM3, MAX_INLET_WATER_PRESSURE_DEFEATURED_FAULT_HIGH_PSIG ); } else { - isPresOutOfLowRange = ( ( pressureM3 < MIN_INLET_WATER_PRESSURE_WARNING_LOW_PSIG ) ? TRUE : FALSE); - isPresOutOfHighRange = ( ( ( pressureM3 > MAX_INLET_WATER_PRESSURE_WARNING_HIGH_PSIG ) && ( pressureM3 < MAX_INLET_WATER_PRESSURE_FAULT_HIGH_PSIG ) ) ? TRUE : FALSE); - isPresOutOfHighRangeFault = ( ( pressureM3 > MAX_INLET_WATER_PRESSURE_FAULT_HIGH_PSIG ) ? TRUE : FALSE); + isPresOutOfLowRange = ( ( pressureM3 < MIN_INLET_WATER_PRESSURE_WARNING_LOW_PSIG ) ? TRUE : FALSE ); + isPresOutOfHighRange = ( ( ( pressureM3 > MAX_INLET_WATER_PRESSURE_WARNING_HIGH_PSIG ) && ( pressureM3 < MAX_INLET_WATER_PRESSURE_FAULT_HIGH_PSIG ) ) ? TRUE : FALSE ); + isPresOutOfHighRangeFault = ( ( pressureM3 > MAX_INLET_WATER_PRESSURE_FAULT_HIGH_PSIG ) ? TRUE : FALSE ); checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_LOW_RANGE, isPresOutOfLowRange, pressureM3, MIN_INLET_WATER_PRESSURE_WARNING_LOW_PSIG ); checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_HIGH_RANGE, isPresOutOfHighRange, pressureM3, MAX_INLET_WATER_PRESSURE_WARNING_HIGH_PSIG ); checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_CRITICAL_OUT_RANGE, isPresOutOfHighRangeFault, pressureM3, MAX_INLET_WATER_PRESSURE_FAULT_HIGH_PSIG ); @@ -156,7 +177,7 @@ BOOL isFlowOutOfRange = FALSE; F32 maxAllowedPermeateFlow = (F32)getTargetROPumpFlowRateMLPM() * MAX_PERMEATE_FLOW_FAULT_THRESHOLD; - isFlowOutOfRange = ( ( permeateFlow > maxAllowedPermeateFlow ) ? TRUE : FALSE); + isFlowOutOfRange = ( ( permeateFlow > maxAllowedPermeateFlow ) ? TRUE : FALSE ); checkPersistentAlarm( ALARM_ID_FP_PERMEATE_FLOW_OUT_HIGH_RANGE, isFlowOutOfRange, permeateFlow, maxAllowedPermeateFlow ); } @@ -176,12 +197,30 @@ BOOL isFlowOutOfRange = FALSE; F32 minimumAllowedPermeateFlow = (F32)getTargetROPumpFlowRateMLPM() - PERMEATE_FLOW_FAULT_MIN_THRESHOLD; - isFlowOutOfRange = ( ( permeateFlow < minimumAllowedPermeateFlow ) ? TRUE : FALSE); - checkPersistentAlarm( ALARM_ID_FP_PERMEATE_FLOW_OUT_LOW_RANGE, isFlowOutOfRange, permeateFlow, minimumAllowedPermeateFlow); + isFlowOutOfRange = ( ( permeateFlow < minimumAllowedPermeateFlow ) ? TRUE : FALSE ); + checkPersistentAlarm( ALARM_ID_FP_PERMEATE_FLOW_OUT_LOW_RANGE, isFlowOutOfRange, permeateFlow, minimumAllowedPermeateFlow ); } /*********************************************************************//** * @brief + * The checkROInletPressure function checks the RO P8 pressure + * against the pressure threshold and alarm if the pressure is out of range. + * @details \b Inputs: pressureP8 + * @details \b Outputs: none + * @details \b Alarms: ALARM_ID_FP_INLET_PRESSURE_LOW_RANGE when + * P8 pressure less than 1 PSI. + * @return none + *************************************************************************/ +void checkROInletPressure( void ) +{ + F32 pressureP8 = getFilteredPressure( P8_PRES ); + BOOL isFlowOutOfRange = ( ( pressureP8 < MIN_INLET_WATER_PRESSURE_PSIG ) ? TRUE : FALSE ); + + checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_LOW_RANGE, isFlowOutOfRange, pressureP8, MIN_INLET_WATER_PRESSURE_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 @@ -194,14 +233,56 @@ { F32 pressureP13 = getPressure( P13_PRES ); - if ( pressureP13 > MAX_INLET_RO_PUMP_PRESSURE_WARNING_PSIG ) + if ( pressureP13 > MAX_INLET_RO_PUMP_PRESSURE_WARNING_HIGH_PSIG ) { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_RO_INLET_PRESSURE_OUT_HIGH_RANGE, 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_HIGH_PSIG ) } } /*********************************************************************//** * @brief + * The getCalculatedRODutyCycle function get the RO calculated dutycycle based on P13 pressure + * @details \b Inputs: none + * @details \b Outputs: none + * @return dutyCyclePct + *************************************************************************/ +F32 getCalculatedRODutyCycle( void ) +{ + F32 pressureP13 = getPressure( P13_PRES ); + // TODO verify the calculated dutycycle unit + // If 58 PSI ≤ P13 < 120 PSI, the currently set P12 duty cycle (% PWM) must be < 0.0065(x^2) - 1.9859(x) + 193.23, where x = measured P13 pressure in PSI + F32 dutyCyclePct = ( ( QUADRATIC_COEFFICIENT * ( pressureP13 * pressureP13 ) ) - ( LINEAR_COEFFICIENT * ( pressureP13 ) ) ) + CONSTANT_TERM; + + return dutyCyclePct; +} + +/*********************************************************************//** + * @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: none + * @details \b Outputs: none + * @details \b Alarms: ALARM_ID_FP_POWER_BUDGET_OUT_OF_RANGE when + * P13 pressure goes beyond high pressure limit. + * @return none + *************************************************************************/ +void checkRODutyCycle( void ) +{ + F32 pressureP13 = getPressure( P13_PRES ); + F32 currentDutyCyclePct = getCurrentROPumpDutyCyclePCT(); + BOOL isFdutyCycleOfRange = FALSE; + // TODO verify the calculated dutycycle unit + F32 calculatedDutyCyclePct = getCalculatedRODutyCycle(); + + if ( ( pressureP13 >= MAX_INLET_RO_PUMP_PRESSURE_WARNING_LOW_PSIG ) && ( pressureP13 < MAX_INLET_RO_PUMP_PRESSURE_WARNING_HIGH_PSIG ) ) + { + isFdutyCycleOfRange = currentDutyCyclePct > calculatedDutyCyclePct; + checkPersistentAlarm( ALARM_ID_FP_POWER_BUDGET_OUT_OF_RANGE, isFdutyCycleOfRange, calculatedDutyCyclePct, getCurrentROPumpDutyCyclePCT() ); + } +} + +/*********************************************************************//** + * @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 @@ -218,8 +299,9 @@ 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); + 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 ); } @@ -228,30 +310,39 @@ * @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, temperatureM3 + * @details \b Inputs: temperatureP10 for featured or temperatureD1 for de-featured * @details \b Outputs: none * @details \b Alarms: ALARM_ID_FP_INLET_TEMPERATURE_OUT_LOW_RANGE when - * P10 or M3 temperature goes beyond low temperature limit. + * P10 or D1 temperature goes beyond low temperature limit. * @details \b Alarms: ALARM_ID_FP_INLET_TEMPERATURE_OUT_HIGH_RANGE when - * P10 or M3 temperature goes beyond high temperature limit + * P10 or S1 temperature goes beyond high temperature limit * @return none *************************************************************************/ void checkInletTemperatures( void ) { - F32 temperatureP10 = getFilteredConductivitySensorTemperature( P9_COND ); - F32 temperatureM3 = getFilteredPressureSensorTemperature( M3_PRES ); + F32 temperatureD1; + F32 temperatureP10; 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 ); + if ( FALSE == isFPDefeatured() ) + { + temperatureP10 = getFilteredConductivitySensorTemperature( P9_COND ); + isTempOutOfLowRange = ( ( temperatureP10 < INLET_TEMPERATURE_LOW_THRESHOLD_C ) ? TRUE : FALSE ); + isTempOutOfHighRange = ( ( temperatureP10 > INLET_TEMPERATURE_HIGH_THRESHOLD_C ) ? TRUE : FALSE ); - isTempOutOfLowRange = ( ( temperatureM3 < INLET_TEMPERATURE_LOW_THRESHOLD_C ) ? TRUE : FALSE); - isTempOutOfHighRange = ( ( temperatureM3 > INLET_TEMPERATURE_HIGH_THRESHOLD_C ) ? TRUE : FALSE); - checkPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_LOW_RANGE, isTempOutOfLowRange, temperatureM3, INLET_TEMPERATURE_LOW_THRESHOLD_C ); - checkPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_HIGH_RANGE, isTempOutOfHighRange, temperatureM3, INLET_TEMPERATURE_HIGH_THRESHOLD_C ); + 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 ); + } + else + { + temperatureD1 = getTemperatureValue( D1_TEMP ); + isTempOutOfLowRange = ( ( temperatureD1 < INLET_TEMPERATURE_LOW_THRESHOLD_C ) ? TRUE : FALSE ); + isTempOutOfHighRange = ( ( temperatureD1 > INLET_TEMPERATURE_HIGH_THRESHOLD_C ) ? TRUE : FALSE ); + + checkPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_LOW_RANGE, isTempOutOfLowRange, temperatureD1, INLET_TEMPERATURE_LOW_THRESHOLD_C ); + checkPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_HIGH_RANGE, isTempOutOfHighRange, temperatureD1, INLET_TEMPERATURE_HIGH_THRESHOLD_C ); + } } /*********************************************************************//** @@ -269,7 +360,7 @@ F32 conductivityP9 = getFilteredConductivity( P9_COND ); BOOL isConductivtyOutOfLowRange = FALSE; - isConductivtyOutOfLowRange = ( ( conductivityP9 > INLET_CONDUCTIVITY_HIGH_THRESHOLD_US ) ? TRUE : 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 ); } @@ -288,7 +379,7 @@ F32 conductivityP18 = getFilteredConductivity( P18_COND ); BOOL isConductivityOutOfLowRange = FALSE; - isConductivityOutOfLowRange = ( ( conductivityP18 > OUTLET_CONDUCTIVITY_HIGH_THRESHOLD_US ) ? TRUE : 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 ); } @@ -306,9 +397,10 @@ { F32 avgRORR = getRORRAverage(); // Alarm if the filtered average is less than allowed RO rejection limit + //TODO update the macro with value from institutional configuration if ( avgRORR < MIN_RO_REJECTION_RATIO_PCT ) { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_REJECTION_RATIO_LOW_RANGE, avgRORR, MIN_RO_REJECTION_RATIO_PCT) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_REJECTION_RATIO_LOW_RANGE, avgRORR, MIN_RO_REJECTION_RATIO_PCT ) } } @@ -318,4 +410,26 @@ *************************************************************************/ +/*********************************************************************//** + * @brief + * The testROGetCurrentCalculatedDutyCycle function + * return RO calculated duty cycle at instantaneous pressure + * @details \b Inputs: none + * @details \b Outputs: calculated RO pump duty cycle response msg constructed and sent + * @details \b Message: \b Sent: MSG_ID_FP_RO_CALCULATED_DUTY_CYCLE_RESPONSE + * @param message a pointer to the message requesting calculated RO pump + * duty cycle from Dialin + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testROGetCurrentCalculatedDutyCycle( MESSAGE_T *message ) +{ + BOOL result = FALSE; + CURRENT_RO_PUMP_CAL_DUTY_CYCLE_DATA_T CalculatedRODutyCycle; + + CalculatedRODutyCycle.curentCalculatedDutyCycle = getCalculatedRODutyCycle(); + result = sendMessage( MSG_ID_FP_RO_CALCULATED_DUTY_CYCLE_RESPONSE, COMM_BUFFER_OUT_DD_CAN_PC, (U08*)&CalculatedRODutyCycle, sizeof( CURRENT_RO_PUMP_CAL_DUTY_CYCLE_DATA_T ) ); + + return result; +} + /**@}*/ Index: firmware/App/Monitors/WaterQualityMonitor.h =================================================================== diff -u -r830213bc6dcc1a684610caf78c79d55f2cb41e93 -r18d4cfcb41570947e19250a549a62e52cdcd3aaa --- firmware/App/Monitors/WaterQualityMonitor.h (.../WaterQualityMonitor.h) (revision 830213bc6dcc1a684610caf78c79d55f2cb41e93) +++ firmware/App/Monitors/WaterQualityMonitor.h (.../WaterQualityMonitor.h) (revision 18d4cfcb41570947e19250a549a62e52cdcd3aaa) @@ -32,6 +32,14 @@ // ********** public definitions ********** +#pragma pack(push, 1) +//Current calculated RO pump duty cycle data struct. +typedef struct +{ + F32 curentCalculatedDutyCycle; ///< Current calculate RO pump duty cycle based on P13 pressure +} CURRENT_RO_PUMP_CAL_DUTY_CYCLE_DATA_T; +#pragma pack(pop) + // ********** public definitions ********** void initWaterQualityMonitor( void ); @@ -46,5 +54,9 @@ void checkRORejectionRatio( void ); void checkPermeateHighFlow( void ); void checkPermeateLowFlow( void ); +void checkRODutyCycle( void ); +void checkROInletPressure( void ); +BOOL testROGetCurrentCalculatedDutyCycle( MESSAGE_T *message ); + #endif Index: firmware/App/Services/Messaging.c =================================================================== diff -u -r95e6caaa6bb9214dedb498c16b6ff064e498a8ab -r18d4cfcb41570947e19250a549a62e52cdcd3aaa --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision 95e6caaa6bb9214dedb498c16b6ff064e498a8ab) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision 18d4cfcb41570947e19250a549a62e52cdcd3aaa) @@ -1,14 +1,14 @@ /************************************************************************** * -* Copyright (c) 2024-2025 Diality Inc. - All Rights Reserved. +* Copyright (c) 2024-2026 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 Messaging.c * -* @author (last) “rkallala” -* @date (last) 09-Dec-2025 +* @author (last) Dara Navaei +* @date (last) 29-Dec-2025 * * @author (original) Vinayakam Mani * @date (original) 07-Aug-2024 @@ -244,6 +244,8 @@ { MSG_ID_FP_PERMEATE_TANK_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testPermeateTankDataPublishIntervalOverride }, { MSG_ID_FP_RO_PUMP_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testROPumpDataPublishIntervalOverride }, { MSG_ID_DD_RINSE_PUMP_DATA_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testRinsePumpDataPublishIntervalOverride }, + { MSG_ID_DD_RINSE_PUMP_PWM_PERCENT_OVERRIDE_REQUEST, &testRinsePumpPWMPercentOverride }, + { MSG_ID_DD_RINSE_PUMP_TURN_ON_OFF_REQUEST, &testRinsePumpTurnOnOffRequest }, { MSG_ID_FP_SET_START_STOP_OVERRIDE_REQUEST, &testSetGeneratePermeateSignal }, { MSG_ID_FP_RO_REJECTION_RATIO_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testRORejectionRatioDataPublishIntervalOverride }, { MSG_ID_FP_RO_FILTERED_REJECTION_RATIO_OVERRIDE_REQUEST, &testRORejectionRatioFilteredOverride }, @@ -259,6 +261,7 @@ { MSG_ID_FP_DEF_FLUSH_FILTER_TIMER_OVERRIDE_REQUEST, &testFilterFlushDefTimerOverride }, { MSG_ID_FP_DEF_PRE_GEN_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testPreGenPermeateDefDataPublishIntervalOverride}, { MSG_ID_FP_DEF_GEN_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testGenPermeateDefDataPublishIntervalOverride}, + { MSG_ID_FP_DEF_STATUS_REQUEST, &testGetFPDefeaturedStatus }, }; /// Calculation for number of entries in the incoming message function handler look-up table.