Index: firmware/App/Services/TDInterface.c =================================================================== diff -u -rc07917caced76b53a0ed8f35167fac6f9d8310a4 -rf4a8565c7edec12094b8a737ed7b8cd3424a9208 --- firmware/App/Services/TDInterface.c (.../TDInterface.c) (revision c07917caced76b53a0ed8f35167fac6f9d8310a4) +++ firmware/App/Services/TDInterface.c (.../TDInterface.c) (revision f4a8565c7edec12094b8a737ed7b8cd3424a9208) @@ -7,8 +7,8 @@ * * @file TDInterface.c * -* @author (last) Michael Garthwaite -* @date (last) 30-Oct-2025 +* @author (last) “rkallala” +* @date (last) 09-Dec-2025 * * @author (original) Vinayakam Mani * @date (original) 06-Nov-2024 @@ -17,6 +17,7 @@ #include "DialysatePumps.h" #include "FPInterface.h" +#include "FPOperationModes.h" #include "Messaging.h" #include "MessagePayloads.h" #include "ModeGenDialysate.h" @@ -37,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 ); @@ -66,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; } /**********************************************************************//** @@ -185,7 +235,7 @@ *************************************************************************/ void setTDDialysateFlowrate( F32 dialFlowrate ) { - tdDialysateFlowrate = dialFlowrate; + tdDialysateFlowrate.data = dialFlowrate; } /*********************************************************************//** @@ -198,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; } /*********************************************************************//** @@ -241,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; } /*********************************************************************//** @@ -255,7 +305,7 @@ *************************************************************************/ F32 getTDDialysateFlowrate( void ) { - return tdDialysateFlowrate; + return getF32OverrideValue( &tdDialysateFlowrate ); } /*********************************************************************//** @@ -268,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 ); } /*********************************************************************//** @@ -297,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; } /*********************************************************************//** @@ -320,7 +373,9 @@ *************************************************************************/ DD_BICARB_TYPES_T getTDBicarbConcentrateType( void ) { - return tdBicarbType; + U32 value = getU32OverrideValue( &tdBicarbType ); + + return (DD_BICARB_TYPES_T)value; } /*********************************************************************//** @@ -341,16 +396,30 @@ { PRE_GEN_DIALYSATE_REQ_PAYLOAD_T startPreGenRequest; DD_OP_MODE_T ddMode = getCurrentOperationMode(); + FP_OP_MODE_T fpMode = getCurrentFPOperationMode(); memcpy( &startPreGenRequest, message->payload, sizeof( PRE_GEN_DIALYSATE_REQ_PAYLOAD_T ) ); // Process the pre-gen dialysate delivery request message if ( ( DD_MODE_STAN == ddMode ) && ( TRUE == startPreGenRequest.start ) ) { // Start FP Pre-Generate Permeate - fpReason = signalStartGenPermeate(); + + if ( FP_MODE_STAN == fpMode ) + { + fpReason = signalStartGenPermeate(); + } + else + { + fpReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; + } // start pre-gen dialysate result = requestDDPreGenStart(); + + if ( REQUEST_REJECT_REASON_NONE != fpReason ) + { + result = FALSE; + } // Update Temperature, Acid/Bicarb type and dialysate rate for pregen process. setTDDialysateFlowrate( startPreGenRequest.dialRate ); setTDTargetDialysateTemperature( startPreGenRequest.dialTemp ); @@ -364,6 +433,11 @@ result = requestDDPreGenStop(); // stop FP Pre-Generate Permeate fpReason = signalStopGenPermeate(); + + if ( REQUEST_REJECT_REASON_NONE != fpReason ) + { + result = FALSE; + } } } } @@ -419,6 +493,11 @@ result = requestDDGenDialyasteStop(); // stop FP Pre-Generate Permeate fpReason = signalStopGenPermeate(); + + if ( REQUEST_REJECT_REASON_NONE != fpReason ) + { + result = FALSE; + } } else { @@ -450,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; +} + /**@}*/