Index: firmware/App/Controllers/PermeateTank.c =================================================================== diff -u -r3417933e6edf61a914c428e2fa944b3b349272a4 -r39405d73782b8b9cf1fc26238640e683efcebbb5 --- firmware/App/Controllers/PermeateTank.c (.../PermeateTank.c) (revision 3417933e6edf61a914c428e2fa944b3b349272a4) +++ firmware/App/Controllers/PermeateTank.c (.../PermeateTank.c) (revision 39405d73782b8b9cf1fc26238640e683efcebbb5) @@ -20,6 +20,7 @@ #include "Messaging.h" #include "PermeateTank.h" #include "TaskGeneral.h" +#include "TDInterface.h" #include "Timers.h" #include "Utilities.h" #include "Valves.h" @@ -33,9 +34,12 @@ #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_FILL_SWITCH_MS ( 10 * MS_PER_SECOND ) ///< state switch timeout in fill state ( in ms ) -#define PERMEATE_TANK_FULL_SWITCH_MS ( 1 * MS_PER_SECOND ) ///< state switch timeout in full state (in ms) -#define PERMEATE_TANK_FULL_TIMEOUT_MS ( 60 * MS_PER_SECOND ) ///< timeout being in full state too long ( in ms ) +#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 ********** @@ -44,9 +48,11 @@ static OVERRIDE_U32_T permeateTankPublishInterval; ///< Interval (in ms) at which to publish permeate tank data to CAN bus. static BOOL pendingStartPermeateTankController; ///< Flag indicates an air trap controller start request is pending. static BOOL pendingStopPermeateTankController; ///< Flag indicates an air trap controller stop request is pending. -static U32 tankFullAlarmTimeout; ///< Time stamp to track alarm timeout. +static U32 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 U32 tankFillDelayTime; ///< Time stamp to track fill timeout. +static F32 tankFullAlarmTimeout; ///< Permeate tank full alarm timeout +static F32 tankFillAlarmTimeout; ///< Permeate tank fill alarm timeout // ********** private function prototypes ********** @@ -71,9 +77,11 @@ permeateTankPublishInterval.ovData = PERMEATE_TANK_PUMP_DATA_PUB_INTERVAL; permeateTankPublishInterval.ovInitData = PERMEATE_TANK_PUMP_DATA_PUB_INTERVAL; permeateTankPublishInterval.override = OVERRIDE_RESET; - tankFillDelayTime = 0; tankFullDelayTime = 0; - tankFullAlarmTimeout = 0; + tankFullAlarmTimer = 0; + tankFillAlarmTimer = 0; + tankFullAlarmTimeout = 0.0F; + tankFillAlarmTimeout = 0.0F; } /*********************************************************************//** @@ -156,6 +164,46 @@ /*********************************************************************//** * @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. @@ -243,6 +291,11 @@ 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 ) { @@ -254,13 +307,6 @@ { state = PERMEATE_TANK_FULL_STATE; } - else if ( level == LEVEL_STATE_LOW ) - { - if ( TRUE == didTimeout( tankFillDelayTime, PERMEATE_TANK_FILL_SWITCH_MS ) ) - { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_FP_GEN_PERMEATE_TANK_FILL_TIMEOUT, level ) - } - } return state; } @@ -278,7 +324,7 @@ PERMEATE_TANK_STATE_T state = PERMEATE_TANK_FULL_STATE; LEVEL_STATE_T level = getLevelStatus( P25_LEVL ); - if ( TRUE == didTimeout( tankFullAlarmTimeout, PERMEATE_TANK_FULL_TIMEOUT_MS ) ) + if ( TRUE == didTimeout( tankFullAlarmTimer, getTankFullAlarmTimeout() ) ) { SET_ALARM_WITH_1_U32_DATA( ALARM_ID_FP_GEN_PERMEATE_TANK_FULL_TIMEOUT, level ) } @@ -327,20 +373,20 @@ 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 ); - tankFillDelayTime = getMSTimerCount(); + tankFillAlarmTimer = getMSTimerCount(); break; case PERMEATE_TANK_FULL_STATE: setValveState( M4_VALV, VALVE_STATE_CLOSED ); setValveState( M12_VALV, VALVE_STATE_CLOSED ); - setValveState( P6_VALV, VALVE_STATE_CLOSED ); + setValveState( P6_VALV, VALVE_STATE_OPEN ); setValveState( P11_VALV, VALVE_STATE_OPEN ); setValveState( P33_VALV, VALVE_STATE_OPEN ); - setValveState( P34_VALV, VALVE_STATE_OPEN ); + setValveState( P34_VALV, VALVE_STATE_CLOSED ); setValveState( P37_VALV, VALVE_STATE_CLOSED ); setValveState( P39_VALV, VALVE_STATE_CLOSED ); tankFullDelayTime = getMSTimerCount(); - tankFullAlarmTimeout = getMSTimerCount(); + tankFullAlarmTimer = getMSTimerCount(); break; default: Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -r2760c0a8db7842773a63e726f510e875d8555524 -r39405d73782b8b9cf1fc26238640e683efcebbb5 --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 2760c0a8db7842773a63e726f510e875d8555524) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 39405d73782b8b9cf1fc26238640e683efcebbb5) @@ -1,17 +1,17 @@ /************************************************************************** * -* Copyright (c) 2020-2024 Diality Inc. - All Rights Reserved. +* Copyright (c) 2025-2025 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 ROPump.c * -* @author (last) Sean Nash -* @date (last) 12-Nov-2024 +* @author (last) Michael Garthwaite +* @date (last) 08-Sep-2025 * -* @author (original) Sean Nash -* @date (original) 12-Nov-2024 +* @author (original) Michael Garthwaite +* @date (original) 08-Sep-2025 * ***************************************************************************/ #include // for log() Index: firmware/App/Drivers/FluidPump.c =================================================================== diff -u -r43161808ceba270f92822369359aa299c647c9fe -r39405d73782b8b9cf1fc26238640e683efcebbb5 --- firmware/App/Drivers/FluidPump.c (.../FluidPump.c) (revision 43161808ceba270f92822369359aa299c647c9fe) +++ firmware/App/Drivers/FluidPump.c (.../FluidPump.c) (revision 39405d73782b8b9cf1fc26238640e683efcebbb5) @@ -1,17 +1,17 @@ /************************************************************************** * -* Copyright (c) 2020-2024 Diality Inc. - All Rights Reserved. +* Copyright (c) 2025-2025 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 FluidPump.c * -* @author (last) Sean Nash -* @date (last) 12-Nov-2024 +* @author (last) Michael Garthwaite +* @date (last) 08-Sep-2025 * -* @author (original) Sean Nash -* @date (original) 12-Nov-2024 +* @author (original) Michael Garthwaite +* @date (original) 08-Sep-2025 * ***************************************************************************/ Index: firmware/App/Modes/FPModes/FPModeFault.c =================================================================== diff -u -r5b941642e3248f74f6c8da7c21458b787fadf8ca -r39405d73782b8b9cf1fc26238640e683efcebbb5 --- firmware/App/Modes/FPModes/FPModeFault.c (.../FPModeFault.c) (revision 5b941642e3248f74f6c8da7c21458b787fadf8ca) +++ firmware/App/Modes/FPModes/FPModeFault.c (.../FPModeFault.c) (revision 39405d73782b8b9cf1fc26238640e683efcebbb5) @@ -1,17 +1,17 @@ /************************************************************************** * -* Copyright (c) 2024-2024 Diality Inc. - All Rights Reserved. +* Copyright (c) 2025-2025 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 FPModeFault.c * -* @author (last) Michael Garthwaite -* @date (last) 28-Feb-2025 +* @author (last) “Raghu +* @date (last) 14-Oct-2025 * * @author (original) Michael Garthwaite -* @date (original) 28-Feb-2025 +* @date (original) 08-Sep-2025 * ***************************************************************************/ Index: firmware/App/Modes/FPModes/FPModeStandby.c =================================================================== diff -u -rfd21e08ba076054488aa112641e0db4191ee0b35 -r39405d73782b8b9cf1fc26238640e683efcebbb5 --- firmware/App/Modes/FPModes/FPModeStandby.c (.../FPModeStandby.c) (revision fd21e08ba076054488aa112641e0db4191ee0b35) +++ firmware/App/Modes/FPModes/FPModeStandby.c (.../FPModeStandby.c) (revision 39405d73782b8b9cf1fc26238640e683efcebbb5) @@ -1,17 +1,17 @@ /************************************************************************** * -* Copyright (c) 2024-2024 Diality Inc. - All Rights Reserved. +* Copyright (c) 2025-2025 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 FPModeStandby.c * -* @author (last) Michael Garthwaite -* @date (last) 28-Feb-2025 +* @author (last) “Raghu +* @date (last) 14-Oct-2025 * * @author (original) Michael Garthwaite -* @date (original) 28-Feb-2025 +* @date (original) 08-Sep-2025 * ***************************************************************************/ Index: firmware/App/Modes/FPModes/FPOperationModes.c =================================================================== diff -u -rc69355cb062c3580725558809f66699f0d552e5a -r39405d73782b8b9cf1fc26238640e683efcebbb5 --- firmware/App/Modes/FPModes/FPOperationModes.c (.../FPOperationModes.c) (revision c69355cb062c3580725558809f66699f0d552e5a) +++ firmware/App/Modes/FPModes/FPOperationModes.c (.../FPOperationModes.c) (revision 39405d73782b8b9cf1fc26238640e683efcebbb5) @@ -1,17 +1,17 @@ /************************************************************************** * -* Copyright (c) 2024-2024 Diality Inc. - All Rights Reserved. +* Copyright (c) 2025-2025 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 FPOperationModes.c * -* @author (last) Sean -* @date (last) 15-Nov-2024 +* @author (last) Michael Garthwaite +* @date (last) 12-Nov-2025 * -* @author (original) Sean -* @date (original) 15-Nov-2024 +* @author (original) Michael Garthwaite +* @date (original) 08-Sep-2025 * ***************************************************************************/ Index: firmware/App/Modes/FPModes/FlushConcentrate.c =================================================================== diff -u -r3417933e6edf61a914c428e2fa944b3b349272a4 -r39405d73782b8b9cf1fc26238640e683efcebbb5 --- firmware/App/Modes/FPModes/FlushConcentrate.c (.../FlushConcentrate.c) (revision 3417933e6edf61a914c428e2fa944b3b349272a4) +++ firmware/App/Modes/FPModes/FlushConcentrate.c (.../FlushConcentrate.c) (revision 39405d73782b8b9cf1fc26238640e683efcebbb5) @@ -20,6 +20,7 @@ #include "FlowSensor.h" #include "FlushConcentrate.h" #include "FPOperationModes.h" +#include "Level.h" #include "MessageSupport.h" #include "Messaging.h" #include "PermeateTank.h" @@ -39,23 +40,27 @@ #define CONCENTRATE_FLUSH_MAX_TIMEOUT ( 600 * MS_PER_SECOND ) ///< Max override timeout for 10 minutes #define CONCENTRATE_FLUSH_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the gen water mode data published. #define CONCENTRATE_FLUSH_TIMEOUT ( 30 * MS_PER_SECOND ) ///< Concentrate flush timer (in ms) -#define CONCENTRATE_FLUSH_RO_PUMP_TGT_PWM 0.8F ///< target in PWM % for the RO pump during concentrate flush. +#define CONCENTRATE_FLUSH_RO_PUMP_TGT_PWM 0.75F ///< target in PWM % for the RO pump during concentrate flush. #define CONCENTRATE_FLUSH_BOOST_PUMP_TGT_PSI 25 ///< Pressure target in PSI for the boost pump during concentrate flush. #define CONCENTRATE_FLUSH_VOLUME_THRESHOLD_ML 1000.0F ///< Integrated volume threshold in ml #define CONCENTRATE_FLUSH_VOLUME_THRESHOLD_PCT 0.9F ///< Integrated volume threshold percentage #define CONCENTRATE_FLUSH_VOLUME_THRESHOLD CONCENTRATE_FLUSH_VOLUME_THRESHOLD_ML * CONCENTRATE_FLUSH_VOLUME_THRESHOLD_PCT ///< alarm threshold for integrated volume +#define CONCENTRATE_FLUSH_WAIT_FOR_TANK_FULL_TIMEOUT ( 60 * MS_PER_SECOND ) ///< Concentrate flush wait for tank full timer (in ms) +#define CONCENTRATE_FLUSH_WAIT_FOR_TANK_FULL_TGT_FLOW 700 ///< target flow rate for waiting for tank state +#define CONCENTRATE_FLUSH_BOOST_PUMP_TGT_PSI 25 ///< Pressure target in PSI for the boost pump during concentrate flush. +#define MIN_BOOST_PUMP_DUTY_CYCLE_PCT 0.5F ///< Minimum duty cycle value for boost pump during open loop control + // ********** private data ********** -static const F32 CONCENTRATE_FLOW_INTEGRATOR = 1.0F / (F32)( SEC_PER_MIN * ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ); ///< Multiplier to convert flow (mL/min) into volume (mL) for period of general task interval. static FP_CONC_FLUSH_STATE_T concentrateFlushState; ///< Currently active Concentrate flush state. static U32 concentrateFlushDataPublicationTimerCounter; ///< Used to schedule Concentrate flush data publication to CAN bus. static OVERRIDE_U32_T concentrateFlushDataPublishInterval; ///< Concentrate Flush mode data publish interval. static OVERRIDE_U32_T concentrateFlushTimeout; ///< Concentrate Flush timeout value static U32 concentrateFlushTimer; ///< Concentrate Flush timeout timer static BOOL pendingStartConcentrateFlushRequest; ///< signal to start flushing. static BOOL isFlushComplete; ///< Concentrate Flush complete BOOL -static F32 cumulativeConcentrateVolume_mL; ///< cumulative concentrate volume for integrated volume +static BOOL isTankFilled; ///< Concentrate tank filled in permeate flush state // ********** private function prototypes ********** @@ -88,7 +93,7 @@ concentrateFlushTimer = 0; isFlushComplete = FALSE; pendingStartConcentrateFlushRequest = FALSE; - cumulativeConcentrateVolume_mL = 0.0F; + isTankFilled = FALSE; } /*********************************************************************//** @@ -131,35 +136,45 @@ /*********************************************************************//** * @brief * The handleConcentrateFlushProgressState handles the in progress state of Concentrate flush - * @details \b Inputs: none - * @details \b Outputs: none + * @details \b Inputs: concentrateFlushTimer + * @details \b Outputs: isFlushComplete * @return the next state of Concentrate flush state *************************************************************************/ static FP_CONC_FLUSH_STATE_T handleConcentrateFlushProgressState( void ) { FP_CONC_FLUSH_STATE_T state = CONC_FLUSH_IN_PROGRESS; - BOOL isVolumeOutOfRange = FALSE; + LEVEL_STATE_T level = getLevelStatus( P25_LEVL ); // if ( TRUE == 1 ) )// TODO Alarm and Stop State Rework // { // state = CONC_FLUSH_PAUSED; // } - // TODO - Condition is to be removed once P7 flow meter is removed. - cumulativeConcentrateVolume_mL = getFlowRate( P7_FLOW ) * CONCENTRATE_FLOW_INTEGRATOR; - if( TRUE == didTimeout( concentrateFlushTimer, getConcentrateFlushTimeout() ) ) + if ( TRUE == didTimeout( concentrateFlushTimer, getConcentrateFlushTimeout() ) ) { - isVolumeOutOfRange = ( cumulativeConcentrateVolume_mL >= CONCENTRATE_FLUSH_VOLUME_THRESHOLD ? TRUE : FALSE ); - - if( FALSE == isVolumeOutOfRange ) - { isFlushComplete = TRUE; state = CONC_FLUSH_PAUSED; + } + // Manual control of Permeate tank to prevent over fill. + if ( LEVEL_STATE_HIGH == level ) + { + setValveState( M4_VALV, VALVE_STATE_CLOSED ); + if ( TRUE == isBoostPumpInstalled() ) + { + F32 currentDutyCyclePct = getCurrentBoostPumpDutyCyclePCT() > MIN_BOOST_PUMP_DUTY_CYCLE_PCT ? getCurrentBoostPumpDutyCyclePCT(): MIN_BOOST_PUMP_DUTY_CYCLE_PCT; + + setBoostPumpTargetDutyCycle( currentDutyCyclePct ); + isTankFilled = TRUE; } - else + } + else if ( LEVEL_STATE_LOW == level ) + { + setValveState( M4_VALV, VALVE_STATE_OPEN ); + // set boost pump to closed loop when M4 closed. Added Tank fill check to avoid reset during initial transition + if ( ( TRUE == isBoostPumpInstalled() ) && ( TRUE == isTankFilled ) ) { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_CONCENTRATE_FLUSH_VOLUME_OUT_OF_RANGE, CONCENTRATE_FLUSH_VOLUME_THRESHOLD, cumulativeConcentrateVolume_mL) - state = CONC_FLUSH_PAUSED; + setBoostPumpTargetPressure( CONCENTRATE_FLUSH_BOOST_PUMP_TGT_PSI ); + isTankFilled = FALSE; } } @@ -168,9 +183,9 @@ /*********************************************************************//** * @brief - * The handleConcentrateFlushProgressState handles the in progress state of Concentrate flush - * @details \b Inputs: none - * @details \b Outputs: none + * The handleConcentrateFlushPausedState handles the paused state of Concentrate flush + * @details \b Inputs: pendingStartConcentrateFlushRequest + * @details \b Outputs: isFlushComplete, pendingStartConcentrateFlushRequest * @return the next state of Concentrate flush state *************************************************************************/ static FP_CONC_FLUSH_STATE_T handleConcentrateFlushPausedState( void ) @@ -210,14 +225,12 @@ setValveState( P34_VALV, VALVE_STATE_CLOSED ); setValveState( P37_VALV, VALVE_STATE_OPEN ); setValveState( P39_VALV, VALVE_STATE_OPEN ); - startPermeateTankControl(); if ( TRUE == isBoostPumpInstalled() ) { setBoostPumpTargetPressure( CONCENTRATE_FLUSH_BOOST_PUMP_TGT_PSI ); } setROPumpTargetDutyCycle( CONCENTRATE_FLUSH_RO_PUMP_TGT_PWM, TRUE ); concentrateFlushTimer = getMSTimerCount(); - cumulativeConcentrateVolume_mL = 0; break; case CONC_FLUSH_PAUSED: @@ -232,7 +245,6 @@ setValveState( P34_VALV, VALVE_STATE_CLOSED ); setValveState( P37_VALV, VALVE_STATE_CLOSED ); setValveState( P39_VALV, VALVE_STATE_CLOSED ); - if ( TRUE == isBoostPumpInstalled() ) { signalBoostPumpHardStop(); Index: firmware/App/Modes/FPModes/FlushFilter.c =================================================================== diff -u -r3417933e6edf61a914c428e2fa944b3b349272a4 -r39405d73782b8b9cf1fc26238640e683efcebbb5 --- firmware/App/Modes/FPModes/FlushFilter.c (.../FlushFilter.c) (revision 3417933e6edf61a914c428e2fa944b3b349272a4) +++ firmware/App/Modes/FPModes/FlushFilter.c (.../FlushFilter.c) (revision 39405d73782b8b9cf1fc26238640e683efcebbb5) @@ -15,6 +15,7 @@ * ***************************************************************************/ +#include "BoostPump.h" #include "FlushFilter.h" #include "FPOperationModes.h" #include "MessageSupport.h" @@ -23,6 +24,7 @@ #include "TaskGeneral.h" #include "Timers.h" #include "Valves.h" +#include "WaterQualityMonitor.h" /** * @addtogroup FPFilterFlush @@ -33,8 +35,8 @@ #define FILTER_FLUSH_MAX_TIMEOUT ( 600 * MS_PER_SECOND ) ///< Max override timeout for 10 minutes #define FILTER_FLUSH_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the gen water mode data published. -#define FILTER_FLUSH_TIMEOUT ( 30 * MS_PER_SECOND ) ///< filter flush timer (in ms) -#define FILTER_HEALTH_PRESSURE_DIFF 15 ///< Filter flush pressure difference threshold for alarm +#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. // ********** private data ********** @@ -96,6 +98,7 @@ { case FILTER_FLUSH_IN_PROGRESS: filterFlushState = handleFilterFlushProgressState(); + checkInletTemperatures(); break; case FILTER_FLUSH_PAUSED: @@ -120,14 +123,12 @@ * @brief * The handleFilterFlushProgressState handles the in progress state of filter flush * @details \b Inputs: filterFlushTimer - * @details \b Outputs: none + * @details \b Outputs: isFlushComplete * @return the next state of filter flush state *************************************************************************/ static FP_FILTER_FLUSH_STATE_T handleFilterFlushProgressState( void ) { FP_FILTER_FLUSH_STATE_T state = FILTER_FLUSH_IN_PROGRESS; - BOOL isPressureOutOfRange = FALSE; - F32 pressureDif = 0.0; // if ( TRUE == 1 )// TODO Alarm and Stop State Rework // { @@ -136,27 +137,16 @@ if( TRUE == didTimeout( filterFlushTimer, getFilterFlushTimeout() ) ) { - pressureDif = fabs( getFilteredPressure(M3_PRES) - getFilteredPressure(P8_PRES) ); - isPressureOutOfRange = ( pressureDif > FILTER_HEALTH_PRESSURE_DIFF ? TRUE : FALSE ); - - if( TRUE == isPressureOutOfRange ) - { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_FILTER_HEALTH_PRESSURE_OUT_OF_RANGE, pressureDif, FILTER_HEALTH_PRESSURE_DIFF ); - state = FILTER_FLUSH_PAUSED; - } - else - { - isFlushComplete = TRUE; - state = FILTER_FLUSH_PAUSED; - } + isFlushComplete = TRUE; + state = FILTER_FLUSH_PAUSED; } return state; } /*********************************************************************//** * @brief - * The handleFilterFlushProgressState handles the in progress state of filter flush + * The handleFilterFlushPausedState handles the pause state of filter flush * @details \b Inputs: pendingStartFilterFlushRequest * @details \b Outputs: pendingStartFilterFlushRequest, isFlushComplete * @return the next state of filter flush state @@ -199,6 +189,10 @@ setValveState( P37_VALV, VALVE_STATE_CLOSED ); setValveState( P39_VALV, VALVE_STATE_OPEN ); filterFlushTimer = getMSTimerCount(); + if ( TRUE == isBoostPumpInstalled() ) + { + setBoostPumpTargetPressure( FILTER_FLUSH_BOOST_PUMP_TGT_PSI ); + } break; case FILTER_FLUSH_PAUSED: @@ -213,6 +207,10 @@ setValveState( P34_VALV, VALVE_STATE_CLOSED ); setValveState( P37_VALV, VALVE_STATE_CLOSED ); setValveState( P39_VALV, VALVE_STATE_CLOSED ); + if ( TRUE == isBoostPumpInstalled() ) + { + signalBoostPumpHardStop(); + } } break; Index: firmware/App/Modes/FPModes/FlushPermeate.c =================================================================== diff -u -r3417933e6edf61a914c428e2fa944b3b349272a4 -r39405d73782b8b9cf1fc26238640e683efcebbb5 --- firmware/App/Modes/FPModes/FlushPermeate.c (.../FlushPermeate.c) (revision 3417933e6edf61a914c428e2fa944b3b349272a4) +++ firmware/App/Modes/FPModes/FlushPermeate.c (.../FlushPermeate.c) (revision 39405d73782b8b9cf1fc26238640e683efcebbb5) @@ -19,9 +19,9 @@ #include "Conductivity.h" #include "FlushPermeate.h" #include "FPOperationModes.h" +#include "Level.h" #include "MessageSupport.h" #include "Messaging.h" -#include "PermeateTank.h" #include "Pressure.h" #include "ROPump.h" #include "TaskGeneral.h" @@ -35,13 +35,14 @@ // ********** private definitions ********** -#define PERMEATE_FLUSH_MAX_TIMEOUT ( 600 * MS_PER_SECOND ) ///< Max override timeout for 10 minutes +#define PERMEATE_FLUSH_MAX_TIMEOUT ( 10 * SEC_PER_MIN * MS_PER_SECOND ) ///< Max override timeout for 10 minutes #define PERMEATE_FLUSH_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the gen water mode data published. -#define PERMEATE_FLUSH_TIMEOUT ( 120 * MS_PER_SECOND ) ///< Permeate flush timer (in ms) -#define PERMEATE_FLUSH_ALARM_TIMEOUT ( 180 * MS_PER_SECOND ) ///< Permeate flush alarm timer (in ms) +#define PERMEATE_FLUSH_TIMEOUT ( 2 * SEC_PER_MIN * MS_PER_SECOND ) ///< Permeate flush timer (in ms) timeout for 2 minutes +#define PERMEATE_FLUSH_ALARM_TIMEOUT ( 5 * SEC_PER_MIN * MS_PER_SECOND ) ///< Permeate flush alarm timer (in ms) timeout for 5 minutes #define PERMEATE_FLUSH_RO_PUMP_TGT_ML 700 ///< Pressure target in ml/min for the RO pump during permeate flush. #define PERMEATE_FLUSH_BOOST_PUMP_TGT_PSI 25 ///< Pressure target in PSI for the boost pump during permeate flush. #define PERMEATE_FLUSH_CONDUCTIVITY_THRESHOLD 200.0F ///< Conductivity alarm threshold for permeate flush. +#define MIN_BOOST_PUMP_DUTY_CYCLE_PCT 0.5F ///< Minimum duty cycle value for boost pump during open loop control // ********** private data ********** @@ -54,6 +55,7 @@ static U32 permeateFlushAlarmTimer; static BOOL pendingStartPermeateFlushRequest; ///< signal to start flushing. static BOOL isFlushComplete; ///< Permeate Flush complete BOOL +static BOOL isTankFilled; ///< Permeate tank filled in permeate flush state // ********** private function prototypes ********** @@ -92,6 +94,7 @@ permeateFlushAlarmTimer = 0; isFlushComplete = FALSE; pendingStartPermeateFlushRequest = FALSE; + isTankFilled = FALSE; } /*********************************************************************//** @@ -141,25 +144,51 @@ static FP_PERM_FLUSH_STATE_T handlePermeateFlushProgressState( void ) { FP_PERM_FLUSH_STATE_T state = PERM_FLUSH_IN_PROGRESS; + LEVEL_STATE_T level = getLevelStatus( P25_LEVL ); // if ( TRUE == 1 ))// TODO Alarm and Stop State Rework // { // state = PERM_FLUSH_PAUSED; // } - if( TRUE == didTimeout( permeateFlushTimer, getPermeateFlushTimeout() ) ) + // Manual control of Permeate tank while in Permeate Flush + // to prevent overfill. + if ( LEVEL_STATE_HIGH == level ) { + setValveState( M4_VALV, VALVE_STATE_CLOSED ); + if ( TRUE == isBoostPumpInstalled() ) + { + // TODO update the default min duty cycle value after testing + F32 currentDutyCyclePct = getCurrentBoostPumpDutyCyclePCT() > MIN_BOOST_PUMP_DUTY_CYCLE_PCT ? getCurrentBoostPumpDutyCyclePCT(): MIN_BOOST_PUMP_DUTY_CYCLE_PCT; + + setBoostPumpTargetDutyCycle( currentDutyCyclePct ); + isTankFilled = TRUE; + } + } + else if ( LEVEL_STATE_LOW == level ) + { + setValveState( M4_VALV, VALVE_STATE_OPEN ); + // set boost pump to closed loop when M4 closed. Added Tank fill check to avoid reset during initial transition + if ( ( TRUE == isBoostPumpInstalled() ) && ( TRUE == isTankFilled ) ) + { + setBoostPumpTargetPressure( PERMEATE_FLUSH_BOOST_PUMP_TGT_PSI ); + isTankFilled = FALSE; + } + } + + if ( TRUE == didTimeout( permeateFlushTimer, getPermeateFlushTimeout() ) ) + { F32 p18conductivity = getFilteredConductivity( P18_COND ); - if( PERMEATE_FLUSH_CONDUCTIVITY_THRESHOLD > p18conductivity ) + if ( ( PERMEATE_FLUSH_CONDUCTIVITY_THRESHOLD > p18conductivity ) && ( LEVEL_STATE_HIGH == level ) ) { isFlushComplete = TRUE; state = PERM_FLUSH_PAUSED; } - // If conductivity is not in range, continue to monitor until timeout + // If conductivity is not in range, continue to monitor until timeout, TODO if conductivity fluctuates for another 3 minutes else { - if( TRUE == didTimeout( permeateFlushAlarmTimer, getPermeateFlushAlarmTimeout() ) ) + if ( TRUE == didTimeout( permeateFlushAlarmTimer, getPermeateFlushAlarmTimeout() ) ) { SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_PERMEATE_FLUSH_CONDUCTIVITY_TIMEOUT, PERMEATE_FLUSH_CONDUCTIVITY_THRESHOLD, p18conductivity) state = PERM_FLUSH_PAUSED; @@ -215,7 +244,6 @@ setValveState( P34_VALV, VALVE_STATE_CLOSED ); setValveState( P37_VALV, VALVE_STATE_CLOSED ); setValveState( P39_VALV, VALVE_STATE_OPEN ); - startPermeateTankControl(); if ( TRUE == isBoostPumpInstalled() ) { setBoostPumpTargetPressure( PERMEATE_FLUSH_BOOST_PUMP_TGT_PSI ); @@ -239,7 +267,6 @@ setValveState( P34_VALV, VALVE_STATE_CLOSED ); setValveState( P37_VALV, VALVE_STATE_CLOSED ); setValveState( P39_VALV, VALVE_STATE_CLOSED ); - if ( TRUE == isBoostPumpInstalled() ) { signalBoostPumpHardStop(); Index: firmware/App/Modes/FPModes/ModeGenPermeate.c =================================================================== diff -u -rfac466fa1f67f47d717288d64ac71235188a884d -r39405d73782b8b9cf1fc26238640e683efcebbb5 --- firmware/App/Modes/FPModes/ModeGenPermeate.c (.../ModeGenPermeate.c) (revision fac466fa1f67f47d717288d64ac71235188a884d) +++ firmware/App/Modes/FPModes/ModeGenPermeate.c (.../ModeGenPermeate.c) (revision 39405d73782b8b9cf1fc26238640e683efcebbb5) @@ -8,10 +8,10 @@ * @file ModeGenPermeate.c * * @author (last) Michael Garthwaite -* @date (last) 28-Feb-2025 +* @date (last) 08-Sep-2025 * * @author (original) Michael Garthwaite -* @date (original) 28-Feb-2025 +* @date (original) 08-Sep-2025 * ***************************************************************************/ Index: firmware/App/Modes/FPModes/ModeGenPermeateDefeatured.c =================================================================== diff -u -r3417933e6edf61a914c428e2fa944b3b349272a4 -r39405d73782b8b9cf1fc26238640e683efcebbb5 --- firmware/App/Modes/FPModes/ModeGenPermeateDefeatured.c (.../ModeGenPermeateDefeatured.c) (revision 3417933e6edf61a914c428e2fa944b3b349272a4) +++ firmware/App/Modes/FPModes/ModeGenPermeateDefeatured.c (.../ModeGenPermeateDefeatured.c) (revision 39405d73782b8b9cf1fc26238640e683efcebbb5) @@ -24,6 +24,7 @@ #include "TaskGeneral.h" #include "Timers.h" #include "Valves.h" +#include "WaterQualityMonitor.h" /** * @addtogroup FPGenPermeateDefeaturedMode @@ -118,6 +119,9 @@ setModeGenPDefTransition( genPermeateDefState ); SEND_EVENT_WITH_2_U32_DATA( FP_EVENT_GENP_DEF_CHANGE, genPermeateDefState, prevState ) } + + checkInletPressures(); + //Publish Gen Permeate mode data publishGenPDefModeData(); @@ -140,7 +144,7 @@ { case FP_GENP_DEF_SUPPLY_WATER: 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 ); Index: firmware/App/Modes/FPModes/ModePreGenPermeate.c =================================================================== diff -u -r3417933e6edf61a914c428e2fa944b3b349272a4 -r39405d73782b8b9cf1fc26238640e683efcebbb5 --- firmware/App/Modes/FPModes/ModePreGenPermeate.c (.../ModePreGenPermeate.c) (revision 3417933e6edf61a914c428e2fa944b3b349272a4) +++ firmware/App/Modes/FPModes/ModePreGenPermeate.c (.../ModePreGenPermeate.c) (revision 39405d73782b8b9cf1fc26238640e683efcebbb5) @@ -31,6 +31,7 @@ #include "TaskGeneral.h" #include "Timers.h" #include "Valves.h" +#include "WaterQualityMonitor.h" /** * @addtogroup FPPreGenPermeateMode @@ -40,9 +41,10 @@ // ********** private definitions ********** #define PRE_GENP_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the pre gen Permeate mode data published. -#define VERIFY_WATER_RO_PUMP_TGT_FLOW_ML 700 ///< Target flow rate for RO pump in ml/min +#define VERIFY_WATER_RO_PUMP_TGT_FLOW_ML 750 ///< Target flow rate for RO pump in ml/min #define VERIFY_WATER_BOOST_PUMP_TGT_PSI 25 ///< Target pressure for boost pump in psi. #define VERIFY_WATER_TIMEOUT_MS ( 30 * MS_PER_SECOND ) ///< Verify Water timer ( in ms ) +#define FLOW_CONTROL_STABLIZED_TIMEOUT_MS ( 25 * MS_PER_SECOND ) ///< Flow control stablized time ( in ms ) // ********** private data ********** @@ -113,6 +115,7 @@ U32 execPreGenPMode( void ) { FP_PRE_GENP_MODE_STATE_T previouspreGenPState = preGenPState; + // execute current pre gen Permeate state switch ( preGenPState ) { @@ -145,7 +148,7 @@ break; } - if( previouspreGenPState != preGenPState ) + if ( previouspreGenPState != preGenPState ) { setModePreGenPTransition( preGenPState ); SEND_EVENT_WITH_2_U32_DATA( FP_EVENT_PRE_GEN_CHANGE, preGenPState, previouspreGenPState ) @@ -194,6 +197,7 @@ 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 ); + startPermeateTankControl(); if ( TRUE == isBoostPumpInstalled() ) { @@ -263,7 +267,7 @@ execFilterFlush(); - if( TRUE == isFilterFlushComplete() ) + if ( TRUE == isFilterFlushComplete() ) { signalStartPermeateFlush(); state = FP_PRE_GENP_PERMEATE_FLUSH; @@ -291,7 +295,7 @@ execPermeateFlush(); - if( TRUE == isPermeateFlushComplete() ) + if ( TRUE == isPermeateFlushComplete() ) { signalStartConcentrateFlush(); state = FP_PRE_GENP_CONCENTRATE_FLUSH; @@ -319,7 +323,7 @@ execConcentrateFlush(); - if( TRUE == isConcentrateFlushComplete() ) + if ( TRUE == isConcentrateFlushComplete() ) { state = FP_PRE_GENP_VERIFY_WATER; } @@ -340,12 +344,24 @@ FP_PRE_GENP_MODE_STATE_T state = FP_PRE_GENP_VERIFY_WATER; F32 roCurrentDutyCycle = getCurrentROPumpDutyCyclePCT(); + //Stay in this state for 25 seconds to stablize flow control + if ( TRUE == didTimeout( verifyWaterTimer, FLOW_CONTROL_STABLIZED_TIMEOUT_MS ) ) + { + // check next 5 seconds for water quality + // check permeate high flow rate is within range + checkPermeateHighFlow(); + // check low flow rate is within range + checkPermeateLowFlow(); + // check conductivity is within range + checkOutletConductivity(); + } + // if ( TRUE == 1 ))// TODO Alarm and Stop State Rework // { // state = FP_PRE_GENP_PAUSED; // } - - if( TRUE == didTimeout( verifyWaterTimer, VERIFY_WATER_TIMEOUT_MS ) ) + // wait 30 second before moving to water generation mode + if ( TRUE == didTimeout( verifyWaterTimer, VERIFY_WATER_TIMEOUT_MS ) ) { transitionToGenPermeateMode(); requestGenWaterStart(); // transition function will clear start flag Index: firmware/App/Modes/FPModes/ModePreGenPermeateDefeatured.c =================================================================== diff -u -r5b941642e3248f74f6c8da7c21458b787fadf8ca -r39405d73782b8b9cf1fc26238640e683efcebbb5 --- firmware/App/Modes/FPModes/ModePreGenPermeateDefeatured.c (.../ModePreGenPermeateDefeatured.c) (revision 5b941642e3248f74f6c8da7c21458b787fadf8ca) +++ firmware/App/Modes/FPModes/ModePreGenPermeateDefeatured.c (.../ModePreGenPermeateDefeatured.c) (revision 39405d73782b8b9cf1fc26238640e683efcebbb5) @@ -1,17 +1,17 @@ /************************************************************************** * -* Copyright (c) 2024-2024 Diality Inc. - All Rights Reserved. +* Copyright (c) 2025-2025 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 ModePreGenPermeateDefeatured.c * * @author (last) Michael Garthwaite -* @date (last) 28-Feb-2025 +* @date (last) 12-Nov-2025 * * @author (original) Michael Garthwaite -* @date (original) 28-Feb-2025 +* @date (original) 08-Sep-2025 * ***************************************************************************/ Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r43161808ceba270f92822369359aa299c647c9fe -r39405d73782b8b9cf1fc26238640e683efcebbb5 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 43161808ceba270f92822369359aa299c647c9fe) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 39405d73782b8b9cf1fc26238640e683efcebbb5) @@ -1,17 +1,17 @@ /************************************************************************** * -* Copyright (c) 2024-2024 Diality Inc. - All Rights Reserved. +* Copyright (c) 2024-2025 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 ModeStandby.c * * @author (last) Vinayakam Mani -* @date (last) 06-Aug-2024 +* @date (last) 04-Aug-2025 * * @author (original) Vinayakam Mani -* @date (original) 06-Aug-2024 +* @date (original) 07-Aug-2024 * ***************************************************************************/ Index: firmware/App/Monitors/Conductivity.c =================================================================== diff -u -r7f54a204787abc0840b3593101c8be64de3b8e65 -r39405d73782b8b9cf1fc26238640e683efcebbb5 --- firmware/App/Monitors/Conductivity.c (.../Conductivity.c) (revision 7f54a204787abc0840b3593101c8be64de3b8e65) +++ firmware/App/Monitors/Conductivity.c (.../Conductivity.c) (revision 39405d73782b8b9cf1fc26238640e683efcebbb5) @@ -1,17 +1,17 @@ /************************************************************************** * -* Copyright (c) 2024-2024 Diality Inc. - All Rights Reserved. +* Copyright (c) 2024-2025 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 Conductivity.c * * @author (last) Vinayakam Mani -* @date (last) 10-Sep-2024 +* @date (last) 10-Sep-2025 * * @author (original) Vinayakam Mani -* @date (original) 10-Sep-2024 +* @date (original) 13-Sep-2024 * ***************************************************************************/ #include // Used for calculating the polynomial calibration equation. Index: firmware/App/Monitors/Conductivity.h =================================================================== diff -u -r7f54a204787abc0840b3593101c8be64de3b8e65 -r39405d73782b8b9cf1fc26238640e683efcebbb5 --- firmware/App/Monitors/Conductivity.h (.../Conductivity.h) (revision 7f54a204787abc0840b3593101c8be64de3b8e65) +++ firmware/App/Monitors/Conductivity.h (.../Conductivity.h) (revision 39405d73782b8b9cf1fc26238640e683efcebbb5) @@ -1,17 +1,17 @@ /************************************************************************** * -* Copyright (c) 2024-2024 Diality Inc. - All Rights Reserved. +* Copyright (c) 2024-2025 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 Conductivity.h * * @author (last) Vinayakam Mani -* @date (last) 10-Sep-2024 +* @date (last) 09-Sep-2025 * * @author (original) Vinayakam Mani -* @date (original) 10-Sep-2024 +* @date (original) 13-Sep-2024 * ***************************************************************************/ Index: firmware/App/Monitors/WaterQualityMonitor.c =================================================================== diff -u -rf8dce02ab5c2789b446df6a99d2f9c3bf4947911 -r39405d73782b8b9cf1fc26238640e683efcebbb5 --- firmware/App/Monitors/WaterQualityMonitor.c (.../WaterQualityMonitor.c) (revision f8dce02ab5c2789b446df6a99d2f9c3bf4947911) +++ firmware/App/Monitors/WaterQualityMonitor.c (.../WaterQualityMonitor.c) (revision 39405d73782b8b9cf1fc26238640e683efcebbb5) @@ -1,17 +1,17 @@ /************************************************************************** * -* Copyright (c) 2024-2024 Diality Inc. - All Rights Reserved. +* Copyright (c) 2025-2025 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 (last) “rkallala” +* @date (last) 23-Oct-2025 * -* @author (original) Sean Nash -* @date (original) 21-Nov-2024 +* @author (original) Michael Garthwaite +* @date (original) 08-Sep-2025 * ***************************************************************************/ Index: firmware/App/Monitors/WaterQualityMonitor.h =================================================================== diff -u -r3c6e233681b5a51632bdb6a06b20506fe50cd9f0 -r39405d73782b8b9cf1fc26238640e683efcebbb5 --- firmware/App/Monitors/WaterQualityMonitor.h (.../WaterQualityMonitor.h) (revision 3c6e233681b5a51632bdb6a06b20506fe50cd9f0) +++ firmware/App/Monitors/WaterQualityMonitor.h (.../WaterQualityMonitor.h) (revision 39405d73782b8b9cf1fc26238640e683efcebbb5) @@ -7,11 +7,11 @@ * * @file WaterQualityMonitor.h * -* @author (last) Michael Garthwaite -* @date (last) 21-Nov-2024 +* @author (last) “rkallala” +* @date (last) 23-Oct-2025 * * @author (original) Michael Garthwaite -* @date (original) 21-Nov-2024 +* @date (original) 08-Sep-2025 * ***************************************************************************/ #ifndef __WATER_QUALITY_MONITOR_H Index: firmware/App/Services/Messaging.c =================================================================== diff -u -r76ede35cf15c9310c2915151f1d47998f22b71de -r39405d73782b8b9cf1fc26238640e683efcebbb5 --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision 76ede35cf15c9310c2915151f1d47998f22b71de) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision 39405d73782b8b9cf1fc26238640e683efcebbb5) @@ -1,17 +1,17 @@ /************************************************************************** * -* Copyright (c) 2024-2024 Diality Inc. - All Rights Reserved. +* Copyright (c) 2024-2025 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) Vinayakam Mani -* @date (last) 06-Aug-2024 +* @author (last) Varshini Nagabooshanam +* @date (last) 02-Dec-2025 * * @author (original) Vinayakam Mani -* @date (original) 06-Aug-2024 +* @date (original) 07-Aug-2024 * ***************************************************************************/ @@ -233,6 +233,7 @@ { MSG_ID_FP_FILTERED_COND_SENSOR_TEMPERATURE_OVERRIDE_REQUEST, &testFPConductivitySensorFilteredTemperatureReadingsOverride }, { MSG_ID_DD_VOLTAGE_DATA_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testVoltageDataPublishIntervalOverride }, { MSG_ID_DD_MONITORED_VOLTAGE_OVERRIDE_REQUEST, &testVoltageOverride }, + { MSG_ID_DD_TREATMENT_PARAMS_OVERRIDE_REQUEST, &testTDTreatmentParamsOverride }, { MSG_ID_FP_LEVEL_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testFPLevelsDataPublishIntervalOverride }, { MSG_ID_FP_LEVEL_OVERRIDE_REQUEST, &testFPLevelStateOverride }, { MSG_ID_FP_PERMEATE_TANK_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testPermeateTankDataPublishIntervalOverride }, Index: firmware/App/Services/TDInterface.c =================================================================== diff -u -rc69355cb062c3580725558809f66699f0d552e5a -r39405d73782b8b9cf1fc26238640e683efcebbb5 --- firmware/App/Services/TDInterface.c (.../TDInterface.c) (revision c69355cb062c3580725558809f66699f0d552e5a) +++ firmware/App/Services/TDInterface.c (.../TDInterface.c) (revision 39405d73782b8b9cf1fc26238640e683efcebbb5) @@ -1,17 +1,17 @@ /************************************************************************** * -* Copyright (c) 2024-2024 Diality Inc. - All Rights Reserved. +* Copyright (c) 2024-2025 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 TDInterface.c * -* @author (last) Vinayakam Mani -* @date (last) 28-Oct-2024 +* @author (last) Varshini Nagabooshanam +* @date (last) 04-Dec-2025 * * @author (original) Vinayakam Mani -* @date (original) 28-Oct-2024 +* @date (original) 06-Nov-2024 * ***************************************************************************/ @@ -38,22 +38,49 @@ // ********** private definitions ********** -#define TD_DATA_FRESHNESS_TIMEOUT_MS ( 3 * MS_PER_SECOND ) ///< TD data freshness timeout (in ms). +#define TD_DATA_FRESHNESS_TIMEOUT_MS ( 3 * MS_PER_SECOND ) ///< TD data freshness timeout (in ms). +#define TD_DIALYSATE_FLOWRATE_MIN_ML_MIN ( 50.0F ) ///< TD Min dialysate flow rate (mL/min) +#define TD_DIALYSATE_FLOWRATE_MAX_ML_MIN ( 600.0F ) ///< TD Max dialysate flow rate (mL/min) + +#define TD_UF_RATE_MIN_ML_MIN ( 0.0F ) ///< TD Min UF rate (mL/min) +#define TD_UF_RATE_MAX_ML_MIN ( 2000.0F / 60.0F ) ///< TD Max UF rate (mL/min) + +#define TD_DIALYSATE_TEMP_MIN_DEGC ( 35.0F ) ///< TD Min dialysate temperature (deg C) +#define TD_DIALYSATE_TEMP_MAX_DEGC ( 38.0F ) ///< TD Max dialysate temperature (deg C) + +#define TD_ACID_TYPE_MIN ( 0U ) ///< TD Min acid type index +#define TD_ACID_TYPE_MAX ( (U32)( NUM_OF_ACID_TYPE - 1U ) ) ///< TD Max acid type index + +#define TD_BICARB_TYPE_MIN ( 0U ) ///< TD Min bicarb type index +#define TD_BICARB_TYPE_MAX ( (U32)( NUM_OF_BICARB_TYPE - 1U ) ) ///< TD Max bicarb type index + +/// Enumeration of TD Treatment Overrides +typedef enum TD_Treatment_Override +{ + TD_TREATMENT_OVERRIDE_DIALYSATE_FLOWRATE = 0, ///< TD Dialysate flow rate + TD_TREATMENT_OVERRIDE_UF_RATE, ///< TD Ultrafilteration rate + TD_TREATMENT_OVERRIDE_DIALYSATE_TEMP, ///< TD Target Dialysate Temperature + TD_TREATMENT_OVERRIDE_ACID_TYPE, ///< TD Acid type + TD_TREATMENT_OVERRIDE_BICARB_TYPE, ///< TD Bicarb type + NUM_OF_TD_TREATMENT_OVERRIDES, ///< Number of TD override treatment parameters +} TD_TREATMENT_OVERRIDE_INDEX_T; + // ********** private data ********** // TD status -static TD_OP_MODE_T tdCurrentOpMode; ///< Current TD operation mode. -static U32 tdSubMode; ///< Current state (sub-mode) of current TD operation mode. -static F32 tdDialysateFlowrate; ///< TD dialysate flow rate -static F32 tdUFRate; ///< TD ultrafiltration rate -static F32 tdTargetDialysateTemp; ///< TD target dialysate temperature -static BOOL tdDialyzerBypass; ///< TD dialyzer bypass -static DD_ACID_TYPES_T tdAcidType; ///< TD Acid type. -static DD_BICARB_TYPES_T tdBicarbType; ///< TD Bicarb type. +static TD_OP_MODE_T tdCurrentOpMode; ///< Current TD operation mode. +static U32 tdSubMode; ///< Current state (sub-mode) of current TD operation mode. +static BOOL tdDialyzerBypass; ///< TD dialyzer bypass -static BOOL tdOpModeDataFreshFlag = FALSE; ///< Flag to signal/process fresh TD op mode data +static BOOL tdOpModeDataFreshFlag = FALSE; ///< Flag to signal/process fresh TD op mode data +static OVERRIDE_F32_T tdDialysateFlowrate; ///< TD Dialysate flow rate +static OVERRIDE_F32_T tdUFRate; ///< TD ultrafiltration rate +static OVERRIDE_F32_T tdDialysateTemp; ///< TD Target Dialysate Temperature +static OVERRIDE_U32_T tdAcidType; ///< TD Acid type +static OVERRIDE_U32_T tdBicarbType; ///< TD Bicarb type + // ********** private function prototypes ********** static void checkTDDataFreshness( ALARM_ID_T alarmID, BOOL *tdFreshDataFlag ); @@ -67,15 +94,37 @@ *************************************************************************/ void initTDInterface( void ) { - // Initialize unit variables - tdCurrentOpMode = MODE_INIT; - tdSubMode = 0; - tdDialysateFlowrate = MAX_DIALYSATE_FLOW_RATE; // Will update later based on the TD value - tdUFRate = 0.0F; - tdTargetDialysateTemp = 0.0F; - tdDialyzerBypass = FALSE; - tdAcidType = ACID_08_1251_1; - tdBicarbType = BICARB_08_677753_0; + // Initialize unit state variables + tdCurrentOpMode = MODE_INIT; + tdSubMode = 0U; + tdDialyzerBypass = FALSE; + tdOpModeDataFreshFlag = FALSE; + + // Initialize treatment parameters from TD + tdDialysateFlowrate.data = 0.0F; + tdDialysateFlowrate.ovData = 0.0F; + tdDialysateFlowrate.ovInitData = TD_DIALYSATE_FLOWRATE_MIN_ML_MIN; + tdDialysateFlowrate.override = OVERRIDE_RESET; + + tdUFRate.data = 0.0F; + tdUFRate.ovData = 0.0F; + tdUFRate.ovInitData = TD_UF_RATE_MIN_ML_MIN; + tdUFRate.override = OVERRIDE_RESET; + + tdDialysateTemp.data = 0.0F; + tdDialysateTemp.ovData = 0.0F; + tdDialysateTemp.ovInitData = TD_DIALYSATE_TEMP_MIN_DEGC; + tdDialysateTemp.override = OVERRIDE_RESET; + + tdAcidType.data = TD_ACID_TYPE_MIN; + tdAcidType.ovData = TD_ACID_TYPE_MIN; + tdAcidType.ovInitData = TD_ACID_TYPE_MIN; + tdAcidType.override = OVERRIDE_RESET; + + tdBicarbType.data = TD_BICARB_TYPE_MIN; + tdBicarbType.ovData = TD_BICARB_TYPE_MIN; + tdBicarbType.ovInitData = TD_BICARB_TYPE_MIN; + tdBicarbType.override = OVERRIDE_RESET; } /**********************************************************************//** @@ -186,7 +235,7 @@ *************************************************************************/ void setTDDialysateFlowrate( F32 dialFlowrate ) { - tdDialysateFlowrate = dialFlowrate; + tdDialysateFlowrate.data = dialFlowrate; } /*********************************************************************//** @@ -199,21 +248,21 @@ *************************************************************************/ void setTDUFRate( F32 ufRate ) { - tdUFRate = ufRate; + tdUFRate.data = ufRate; } /*********************************************************************//** * @brief * The setTDTargetDialysateTemperature function sets the latest TD dialysate * temperature. * @details \b Inputs: none - * @details \b Outputs: tdTargetDialysateTemp + * @details \b Outputs: tdDialysateTemp * @param Target dialysate temperature. * @return none. *************************************************************************/ void setTDTargetDialysateTemperature( F32 dialTemperature ) { - tdTargetDialysateTemp = dialTemperature; + tdDialysateTemp.data = dialTemperature; } /*********************************************************************//** @@ -242,8 +291,8 @@ *************************************************************************/ void setTDAcidAndBicarbType( U32 acid, U32 bicarb ) { - tdAcidType = (DD_ACID_TYPES_T)acid; - tdBicarbType = (DD_BICARB_TYPES_T)bicarb; + tdAcidType.data = (DD_ACID_TYPES_T)acid; + tdBicarbType.data = (DD_BICARB_TYPES_T)bicarb; } /*********************************************************************//** @@ -256,7 +305,7 @@ *************************************************************************/ F32 getTDDialysateFlowrate( void ) { - return tdDialysateFlowrate; + return getF32OverrideValue( &tdDialysateFlowrate ); } /*********************************************************************//** @@ -269,20 +318,20 @@ *************************************************************************/ F32 getTDUFRate( void ) { - return tdUFRate; + return getF32OverrideValue( &tdUFRate ); } /*********************************************************************//** * @brief * The getTDTargetDialysateTemperature function gets the latest TD * target dialysate temperature rate. - * @details \b Inputs: tdTargetDialysateTemp + * @details \b Inputs: tdDialysateTemp * @details \b Outputs: none * @return Latest target dialysate temperature. *************************************************************************/ F32 getTDTargetDialysateTemperature( void ) { - return tdTargetDialysateTemp; + return getF32OverrideValue( &tdDialysateTemp ); } /*********************************************************************//** @@ -298,17 +347,20 @@ return tdDialyzerBypass; } -/*********************************************************************//** + +/****************************************************************************** * @brief * The getTDAcidConcentrateType function gets the latest Acid concentrate * type. * @details \b Inputs: tdAcidType - * @details \b Outputs: none - * @return Latest acid concentrate type. - *************************************************************************/ + * @details \b Outputs: None + * @return Latest acid concentrate type. . + ******************************************************************************/ DD_ACID_TYPES_T getTDAcidConcentrateType( void ) { - return tdAcidType; + U32 value = getU32OverrideValue( &tdAcidType ); + + return (DD_ACID_TYPES_T)value; } /*********************************************************************//** @@ -321,7 +373,9 @@ *************************************************************************/ DD_BICARB_TYPES_T getTDBicarbConcentrateType( void ) { - return tdBicarbType; + U32 value = getU32OverrideValue( &tdBicarbType ); + + return (DD_BICARB_TYPES_T)value; } /*********************************************************************//** @@ -475,4 +529,58 @@ *************************************************************************/ +/****************************************************************************** +* @brief +* Processes TD treatment parameter override request from Dialin. +* @details \b Inputs: Override payload from Dialin (TEST_OVERRIDE_ARRAY_PAYLOAD_T) +* @details \b Outputs: Updated TD override structures and treatment parameter +* update flag. +* @param message Pointer to the override message received from Dialin. +* @return TRUE if the override is successfully applied, FALSE otherwise. +******************************************************************************/ +BOOL testTDTreatmentParamsOverride( MESSAGE_T *message ) +{ + BOOL result = FALSE; + TEST_OVERRIDE_ARRAY_PAYLOAD_T payload; + + getOverrideArrayPayloadFromMessage( message, &payload ); + + if ( DD_MODE_GEND == getCurrentOperationMode() ) + { + switch ( (TD_TREATMENT_OVERRIDE_INDEX_T)payload.index ) + { + case TD_TREATMENT_OVERRIDE_DIALYSATE_FLOWRATE: + result = f32Override( message, &tdDialysateFlowrate ); + break; + + case TD_TREATMENT_OVERRIDE_UF_RATE: + result = f32Override( message, &tdUFRate ); + break; + + case TD_TREATMENT_OVERRIDE_DIALYSATE_TEMP: + result = f32Override( message, &tdDialysateTemp ); + break; + + case TD_TREATMENT_OVERRIDE_ACID_TYPE: + result = u32Override( message,&tdAcidType,TD_ACID_TYPE_MIN,TD_ACID_TYPE_MAX ); + break; + + case TD_TREATMENT_OVERRIDE_BICARB_TYPE: + result = u32Override( message,&tdBicarbType,TD_BICARB_TYPE_MIN,TD_BICARB_TYPE_MAX ); + break; + + default: + result = FALSE; + break; + } + + if ( TRUE == result ) + { + setTreatmentParamUpdate(); + } + } + + return result; +} + /**@}*/