Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -r9ff57b5ab7490ee5bbc2c51b25f738ee6c569ec1 -r333e2d0c0462dcb4343a279420949cce716ebab7 --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 9ff57b5ab7490ee5bbc2c51b25f738ee6c569ec1) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 333e2d0c0462dcb4343a279420949cce716ebab7) @@ -155,7 +155,7 @@ //static DD_ACID_CONCENTRATES_RECORD_T acidConcentrateCalRecord; ///< Acid concentrate calibration record. //static DD_BICARB_CONCENTRATES_RECORD_T bicarbConcentrateCalRecord; ///< Bicarb concentrate calibration record. -//static DD_UF_PUMP_RECORD_T ultrafilterationPumpCalRecord; ///< Ultrafilteration pump calibration record. +//static DD_UF_PUMP_RECORD_T ultrafiltrationPumpCalRecord; ///< Ultrafiltration pump calibration record. //static DD_CONC_PUMPS_CAL_RECORD_T concentratePumpsCalRecord; ///< Concentrate pumps calibration record. // ********** private function prototypes ********** Index: firmware/App/Controllers/PistonPumpControl.h =================================================================== diff -u -re0fc678329b0cb25dd76fa5e23cc1f487851f0ec -r333e2d0c0462dcb4343a279420949cce716ebab7 --- firmware/App/Controllers/PistonPumpControl.h (.../PistonPumpControl.h) (revision e0fc678329b0cb25dd76fa5e23cc1f487851f0ec) +++ firmware/App/Controllers/PistonPumpControl.h (.../PistonPumpControl.h) (revision 333e2d0c0462dcb4343a279420949cce716ebab7) @@ -25,7 +25,7 @@ /** * @defgroup PistonPumpControl PistonPumpControl - * @brief PistonPumpControl unit. Performs Dosing and ultrafilteration functions via a state machine. + * @brief PistonPumpControl unit. Performs Dosing and ultrafiltration functions via a state machine. * * @addtogroup PistonPumpControl * @{ Fisheye: Tag 333e2d0c0462dcb4343a279420949cce716ebab7 refers to a dead (removed) revision in file `firmware/App/Controllers/Ultrafilteration.c'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 333e2d0c0462dcb4343a279420949cce716ebab7 refers to a dead (removed) revision in file `firmware/App/Controllers/Ultrafilteration.h'. Fisheye: No comparison available. Pass `N' to diff? Index: firmware/App/Controllers/Ultrafiltration.c =================================================================== diff -u --- firmware/App/Controllers/Ultrafiltration.c (revision 0) +++ firmware/App/Controllers/Ultrafiltration.c (revision 333e2d0c0462dcb4343a279420949cce716ebab7) @@ -0,0 +1,248 @@ +/************************************************************************** +* +* 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 Ultrafiltration.c +* +* @author (last) Vinayakam Mani +* @date (last) 23-Jul-2025 +* +* @author (original) Vinayakam Mani +* @date (original) 23-Jul-2025 +* +***************************************************************************/ + +#include "ConcentratePumps.h" +#include "Messaging.h" +#include "OperationModes.h" +#include "TaskGeneral.h" +#include "TDInterface.h" +#include "TestSupport.h" +#include "Ultrafiltration.h" + +/** + * @addtogroup Ultrafiltration + * @{ + */ + +// ********** private definitions ********** + +#define UF_DATA_PUBLISH_INTERVAL ( 1000 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the ultrafiltration data published. +#define UF_CONT_VOLUME 0xFFFF ///< Volume set to 0xFFFF enables contineous delivery based on the speed set. +#define ZERO_RATE 0.0F ///< Zero value. + +// ********** private data ********** + +static UF_EXEC_STATE_T ufExecState; ///< Current ultrafiltration executive state. +static BOOL isUltrafiltrationRequested; ///< Flag indicating ultrafiltration request. +static U32 ufDataPublicationTimerCounter; ///< Used to schedule ultrafiltration data publication to CAN bus. +static OVERRIDE_U32_T ufDataPublishInterval; ///< Ultrafiltration data publish interval. + +// ********** private function prototypes ********** + +static UF_EXEC_STATE_T handleUFRunningState( void ); +static UF_EXEC_STATE_T handleUFPausedState( void ); +static void updateUFRequest( void ); +static void publishUltrafiltrationData( void ); + +/*********************************************************************//** + * @brief + * The initUltrafiltration function initializes the ultrafiltration unit. + * @details \b Inputs: none + * @details \b Outputs: unit variables initialized + * @return none + *************************************************************************/ +void initUltrafiltration( void ) +{ + ufExecState = DD_UF_PAUSED; + ufDataPublishInterval.data = UF_DATA_PUBLISH_INTERVAL; + ufDataPublishInterval.ovData = UF_DATA_PUBLISH_INTERVAL; + ufDataPublishInterval.ovInitData = 0; + ufDataPublishInterval.override = OVERRIDE_RESET; + isUltrafiltrationRequested = FALSE; + ufDataPublicationTimerCounter = 0; +} + +/*********************************************************************//** + * @brief + * The transitionToUltrafiltration function prepares for transition to + * ultrafiltration. + * @details \b Inputs: none + * @details \b Outputs: isUltrafiltrationRequested,ufDataPublicationTimerCounter + * @return none + *************************************************************************/ +void transitionToUltrafiltration( void ) +{ + initUltrafiltration(); +} + +/*********************************************************************//** + * @brief + * The execUFControl function executes the ultrafiltration state machine. + * @details \b Inputs: ufExecState + * @details \b Outputs: ufExecState + * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT when wrong ultrafiltration + * state invoked. + * @return current state. + *************************************************************************/ +U32 execUFControl( void ) +{ + // Calculate UF volume and determine UF pause/run + updateUFRequest(); + + // execute current ultrafiltration exec state + switch ( ufExecState ) + { + case DD_UF_PAUSED: + ufExecState = handleUFPausedState(); + break; + + case DD_UF_RUNNING: + ufExecState = handleUFRunningState(); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_UF_INVALID_EXEC_STATE, ufExecState ) + ufExecState = DD_UF_PAUSED; + break; + } + + //Publish ultrafiltration data + publishUltrafiltrationData(); + + return ufExecState; +} + +/*********************************************************************//** + * @brief + * The handleUFPausedState function handles the ultrafiltration + * paused state. + * @details \b Inputs:isUltrafiltrationRequested + * @details \b Outputs: UF state + * @return next UF state. + *************************************************************************/ +static UF_EXEC_STATE_T handleUFPausedState( void ) +{ + UF_EXEC_STATE_T state = DD_UF_PAUSED; + + if ( TRUE == isUltrafiltrationRequested ) + { + setConcentratePumpTargetSpeed( D76_PUMP, getTDUFRate(), UF_CONT_VOLUME ); + requestConcentratePumpOn( D76_PUMP ); + + //Tranistion to run state + state = DD_UF_RUNNING; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleUFPausedState function handles the ultrafiltration + * running state. + * @details \b Inputs:isUltrafiltrationRequested + * @details \b Outputs: UF state + * @return next UF state. + *************************************************************************/ +static UF_EXEC_STATE_T handleUFRunningState( void ) +{ + UF_EXEC_STATE_T state = DD_UF_RUNNING; + + if ( TRUE != isUltrafiltrationRequested ) + { + requestConcentratePumpOff( D76_PUMP, FALSE ); + state = DD_UF_PAUSED; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The updateUFRequest function updates the ultrafiltration rate per iteration + * and of the ultrafiltration. + * @details \b Inputs: TD Uf rate, TD Dialysate flow rate and bypass flag + * @details \b Outputs: ufVolumeperIteration , isUltrafiltrationRequested + * @return none. + *************************************************************************/ +static void updateUFRequest( void ) +{ + // update latest UF run/pause request + if ( ( getTDUFRate() > ZERO_RATE ) && ( TRUE != getTDDialyzerBypass() ) && + ( getTDDialysateFlowrate() > ZERO_RATE ) ) + { + isUltrafiltrationRequested = TRUE; + } + else + { + isUltrafiltrationRequested = FALSE; + } +} + +/*********************************************************************//** + * @brief + * The getCurrentUFExecState function returns the current state + * of the ultrafiltration. + * @details \b Inputs: ufExecState + * @details \b Outputs: none + * @return the current state of UF execution state. + *************************************************************************/ +UF_EXEC_STATE_T getCurrentUFExecState( void ) +{ + return ufExecState; +} + +/*********************************************************************//** + * @brief + * The publishUltrafiltrationData function broadcasts the ultrafiltration + * data at defined interval. + * @details \b Inputs: ufDataPublicationTimerCounter + * @details \b Outputs: DD ultrafiltration data broadcast message sent + * @details \b Message \Sent: MSG_ID_DD_UF_DATA to publish the ultrafiltration + * data. + * @return none + *************************************************************************/ +static void publishUltrafiltrationData( void ) +{ + if ( ++ufDataPublicationTimerCounter >= getU32OverrideValue( &ufDataPublishInterval ) ) + { + UF_DATA_T data; + + data.ufExecState = (U32)ufExecState; + data.ufRate = getTDUFRate(); + data.isUFRequested = (U32)isUltrafiltrationRequested; + + broadcastData( MSG_ID_DD_UF_DATA, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&data, sizeof( UF_DATA_T ) ); + + ufDataPublicationTimerCounter = 0; + } +} + + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + +/*********************************************************************//** + * @brief + * The testDDUFDataPublishIntervalOverride function overrides the + * DD ultrafiltration data publish interval. + * @details \b Inputs: ufDataPublishInterval + * @details \b Outputs: ufDataPublishInterval + * @param Override message from Dialin which includes the interval + * (in ms) to override the DD ultrafiltration data publish interval to. + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testDDUFDataPublishIntervalOverride( MESSAGE_T *message ) +{ + BOOL result = u32BroadcastIntervalOverride( message, &ufDataPublishInterval, TASK_GENERAL_INTERVAL ); + + return result; +} + +/**@}*/ Index: firmware/App/Controllers/Ultrafiltration.h =================================================================== diff -u --- firmware/App/Controllers/Ultrafiltration.h (revision 0) +++ firmware/App/Controllers/Ultrafiltration.h (revision 333e2d0c0462dcb4343a279420949cce716ebab7) @@ -0,0 +1,53 @@ +/************************************************************************** +* +* 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 Ultrafiltration.h +* +* @author (last) Vinayakam Mani +* @date (last) 23-Jul-2025 +* +* @author (original) Vinayakam Mani +* @date (original) 23-Jul-2025 +* +***************************************************************************/ + +#ifndef __ULTRA_FILTERATION_H__ +#define __ULTRA_FILTERATION_H__ + +#include "DDCommon.h" +#include "DDDefs.h" + +/** + * @defgroup Ultrafiltration Ultrafiltration + * @brief Ultrafiltration control unit. Performs ultrafiltration functions via a state machine. + * + * @addtogroup Ultrafiltration + * @{ + */ + +// ********** public definitions ********** + +/// ultrafiltration data structure +typedef struct +{ + U32 ufExecState; ///< Ultrafiltration execution state + F32 ufRate; ///< Ultrafiltration rate from TD + U32 isUFRequested; ///< Ultrafiltration run or puase request +} UF_DATA_T; + +// ********** public function prototypes ********** + +void initUltrafiltration( void ); // Initialize ultrafiltration unit +void transitionToUltrafiltration( void ); // Prepares for transition to ultrafiltration execution +U32 execUFControl( void ); // Execute the ultrafiltration state machine +UF_EXEC_STATE_T getCurrentUFExecState( void ); // Get the current state of the balancing chamber execution + +BOOL testDDUFDataPublishIntervalOverride( MESSAGE_T *message ); // To override the UF data publish interval + +/**@}*/ + +#endif Index: firmware/App/DDCommon.h =================================================================== diff -u -rafb05eebd86337012af4f6a9d21cb9a1e7f5f16a -r333e2d0c0462dcb4343a279420949cce716ebab7 --- firmware/App/DDCommon.h (.../DDCommon.h) (revision afb05eebd86337012af4f6a9d21cb9a1e7f5f16a) +++ firmware/App/DDCommon.h (.../DDCommon.h) (revision 333e2d0c0462dcb4343a279420949cce716ebab7) @@ -43,10 +43,10 @@ //#define __PITEST__ 1 //Uncomment below if diener concentrate pump used -#define __DIENER_CONC_PUMP__ 1 +//#define __DIENER_CONC_PUMP__ 1 //Uncomment below if beta hardware is used -#define __BETA_HW_VER__ 1 +//#define __BETA_HW_VER__ 1 //Uncomment below if barometric pressure sensor reading available //#define __BARO_PRES_SENSOR__ 1 Index: firmware/App/Modes/ModeGenDialysate.c =================================================================== diff -u -rafb05eebd86337012af4f6a9d21cb9a1e7f5f16a -r333e2d0c0462dcb4343a279420949cce716ebab7 --- firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision afb05eebd86337012af4f6a9d21cb9a1e7f5f16a) +++ firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision 333e2d0c0462dcb4343a279420949cce716ebab7) @@ -32,7 +32,7 @@ #include "TDInterface.h" #include "Temperature.h" #include "Timers.h" -#include "Ultrafilteration.h" +#include "Ultrafiltration.h" #include "Valves.h" /** @@ -139,7 +139,7 @@ { initGenDialysateMode(); setCurrentSubState( NO_SUB_STATE ); - transitionToUltrafilteration(); + transitionToUltrafiltration(); return genDialysateState; } @@ -383,7 +383,7 @@ { DD_GEND_MODE_STATE_T state = DD_GEND_ISOLATED_UF_STATE; - //TODO: define isoalted ultrafilteration. + //TODO: define isoalted ultrafiltration. return state; } @@ -442,7 +442,7 @@ //Execute balancing chamber execBalancingChamberControl(); - //Execute ultrafilteration + //Execute ultrafiltration execUFControl(); // if TD asks for bypass or dialysate is not good to deliver Index: firmware/App/Services/FpgaDD.c =================================================================== diff -u -rf6fb03f1e20395a61a5d5996f11f802ab8eacb2f -r333e2d0c0462dcb4343a279420949cce716ebab7 --- firmware/App/Services/FpgaDD.c (.../FpgaDD.c) (revision f6fb03f1e20395a61a5d5996f11f802ab8eacb2f) +++ firmware/App/Services/FpgaDD.c (.../FpgaDD.c) (revision 333e2d0c0462dcb4343a279420949cce716ebab7) @@ -1986,7 +1986,7 @@ * hall sense pulse width. * @details \b Inputs: fpgaSensorReadings.fpgaD76PumpHallSense * @details \b Outputs: none - * @return ultrafilteration pump D76_Pump hall sense pulse width + * @return ultrafiltration pump D76_Pump hall sense pulse width *************************************************************************/ U16 getFPGAD76PumpHallSensePulseWidth( void ) { Index: firmware/App/Services/Messaging.c =================================================================== diff -u -rafb05eebd86337012af4f6a9d21cb9a1e7f5f16a -r333e2d0c0462dcb4343a279420949cce716ebab7 --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision afb05eebd86337012af4f6a9d21cb9a1e7f5f16a) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision 333e2d0c0462dcb4343a279420949cce716ebab7) @@ -43,7 +43,7 @@ #include "Temperature.h" #include "TDInterface.h" #include "Utilities.h" -#include "Ultrafilteration.h" +#include "Ultrafiltration.h" #include "Valves.h" Index: firmware/App/Services/TDInterface.c =================================================================== diff -u -r363b26b9ab427b7e39e505425c1b15e0584669cb -r333e2d0c0462dcb4343a279420949cce716ebab7 --- firmware/App/Services/TDInterface.c (.../TDInterface.c) (revision 363b26b9ab427b7e39e505425c1b15e0584669cb) +++ firmware/App/Services/TDInterface.c (.../TDInterface.c) (revision 333e2d0c0462dcb4343a279420949cce716ebab7) @@ -44,7 +44,7 @@ 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 ultrafilteration 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. @@ -192,7 +192,7 @@ * The setTDUFRate function sets the latest TD UF rate. * @details \b Inputs: none * @details \b Outputs: tdUFRate - * @param ultrafilteration flow rate. + * @param ultrafiltration flow rate. * @return none. *************************************************************************/ void setTDUFRate( F32 ufRate ) @@ -259,7 +259,7 @@ /*********************************************************************//** * @brief - * The getTDUFrate function gets the latest TD ultrafilteration flow + * The getTDUFrate function gets the latest TD ultrafiltration flow * rate. * @details \b Inputs: tdUFRate * @details \b Outputs: none Index: firmware/source/sys_main.c =================================================================== diff -u -rafb05eebd86337012af4f6a9d21cb9a1e7f5f16a -r333e2d0c0462dcb4343a279420949cce716ebab7 --- firmware/source/sys_main.c (.../sys_main.c) (revision afb05eebd86337012af4f6a9d21cb9a1e7f5f16a) +++ firmware/source/sys_main.c (.../sys_main.c) (revision 333e2d0c0462dcb4343a279420949cce716ebab7) @@ -84,7 +84,7 @@ #include "Timers.h" #include "Temperature.h" #include "Utilities.h" -#include "Ultrafilteration.h" +#include "Ultrafiltration.h" #include "Valves.h" #include "WatchdogMgmt.h" @@ -183,7 +183,7 @@ initTestConfigs(); initTDInterface(); initROInterface(); - initUltrafilteration(); + initUltrafiltration(); #ifdef __PUMPTEST__ initPistonPump(); #endif