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; +} + /**@}*/