Index: firmware/App/Controllers/MixingControl.c =================================================================== diff -u -r42541cc4700d748d524400f61d99e288a0e11f3e -r917d510b37f14e22cde8c28b223f8e4894aeda94 --- firmware/App/Controllers/MixingControl.c (.../MixingControl.c) (revision 42541cc4700d748d524400f61d99e288a0e11f3e) +++ firmware/App/Controllers/MixingControl.c (.../MixingControl.c) (revision 917d510b37f14e22cde8c28b223f8e4894aeda94) @@ -8,7 +8,7 @@ * @file MixingControl.c * * @author (last) Sameer Kalliadan Poyil -* @date (last) 25-Jun-2026 +* @date (last) 10-Jul-2026 * * @author (original) Sameer Kalliadan Poyil * @date (original) 15-Jun-2026 @@ -97,8 +97,8 @@ #define STD_DILUTION_BICARB_POST_MIX_NA 37.0F ///< Bicarb post mix Sodium #define STD_DILUTION_BICARB_POST_MIX_CHO3 33.0F ///< Post mix bicarbonate -//#define DIALYSATE_TARGET_STD_NA_SETTINGS 137.0F ///< Standard target sodium -//#define DIALYSATE_TARGET_STD_BICARB_SETTING 33.0F ///< Standard bicarb +#define MILLISIEMENS_TO_MICROSIEMENS(x) ( ( ( F32 )( x ) ) * 1000.0F ) ///< Milli siemense to micro siemense convertion factor + #define DIALYSATE_TARGET_USER_ADJ_SODIUM_SETTING getTDSodiumConcentration() ///< User Sodium #define DIALYSATE_TARGET_USER_ADJ_BICARB_SETTING getTDBicarbonateConcentration() ///< User bicarb @@ -115,11 +115,11 @@ #define FINAL_NA_ADJ_MIX ( ACID_TARGET_CONCENTRATE_NA + BICARB_PERCENT_CHANGE_NA ) ///< Final adjusted sodium -#define FINAL_NAHCO3_ADJ_MIX ( BICARB_PERCENT_CHANGE_NAHCO3 ) +#define FINAL_NAHCO3_ADJ_MIX ( BICARB_PERCENT_CHANGE_NAHCO3 ) ///< Final Bicarbonate part -#define FINAL_ACID_MIX ( ACID_MIX_VOLUME_ML * ACID_PERCENT_CHANGE ) ///< Final Acid Mix +#define FINAL_ACID_MIX ( ACID_MIX_VOLUME_ML * ACID_PERCENT_CHANGE ) ///< Final Acid Mix volume -#define FINAL_BICARB_MIX ( BICARB_MIX_VOLUME_ML * BICARB_PERCENT_CHANGE ) ///< Final bicarb mix +#define FINAL_BICARB_MIX ( BICARB_MIX_VOLUME_ML * BICARB_PERCENT_CHANGE ) ///< Final bicarb mix volume #define BICARB_CONDUCTIVITY_PRE ( STD_DILUTION_BICARB_POST_MIX_NA * BICARB_PERCENT_CHANGE * getTDBicarbConversionFactor() ) ///< Theoretical bicarb conductivity pre mix @@ -160,8 +160,8 @@ // publish static OVERRIDE_U32_T mixingControlDataPublishInterval; ///< Mixing Control data publish interval. static U32 mixingControlDataPublicationTimerCounter; ///< Used to schedule mixingControl data publication to CAN bus. -static F32 lastBicarbMixVolume; ///< Deadband bicarb mix volume -static F32 lastAcidMixVolume; ///< Deadband acid mix volume +static F32 mixingControlLastBicarbMixVolume; ///< Previously stored value, if bicarb control in dead band +static F32 mixingControlLastAcidMixVolume; ///< Previously stored value, if acid control in dead band // mixing static OVERRIDE_F32_T mixingControlAcidVolume; ///< Acid concentrate volume in ml ( overrideable). @@ -248,19 +248,16 @@ mixingControlDataPublishInterval.ovInitData = 0; mixingControlDataPublishInterval.override = OVERRIDE_RESET; - mixingControlAcidVolume.data = DEFAULT_ACID_VOLUME_ML; - mixingControlAcidVolume.ovData = DEFAULT_ACID_VOLUME_ML; + mixingControlAcidVolume.data = FINAL_ACID_MIX; + mixingControlAcidVolume.ovData = FINAL_ACID_MIX; mixingControlAcidVolume.ovInitData = 0.0F; mixingControlAcidVolume.override = OVERRIDE_RESET; - mixingControlBicarbVolume.data = DEFAULT_BICARB_VOLUME_ML; - mixingControlBicarbVolume.ovData = DEFAULT_BICARB_VOLUME_ML; + mixingControlBicarbVolume.data = FINAL_BICARB_MIX; + mixingControlBicarbVolume.ovData = FINAL_BICARB_MIX; mixingControlBicarbVolume.ovInitData = 0.0F; mixingControlBicarbVolume.override = OVERRIDE_RESET; - lastAcidMixVolume = 0; - lastBicarbMixVolume = 0; - mixingControlAcidVolumeKpGain.data = ACID_VOL_CONTROL_P_COEFFICIENT; mixingControlAcidVolumeKpGain.ovData = ACID_VOL_CONTROL_P_COEFFICIENT; mixingControlAcidVolumeKpGain.ovInitData = 0.0F; @@ -281,8 +278,8 @@ mixingControlBicarbVolumeKiGain.ovInitData = 0.0F; mixingControlBicarbVolumeKiGain.override = OVERRIDE_RESET; - mixingControlBicarbTargetConductivity.data = BICARB_TARGET_CONDUCTIVITY; - mixingControlBicarbTargetConductivity.ovData = BICARB_TARGET_CONDUCTIVITY; + mixingControlBicarbTargetConductivity.data = getBicarbConductivityPre(); + mixingControlBicarbTargetConductivity.ovData = getBicarbConductivityPre(); mixingControlBicarbTargetConductivity.ovInitData = 0.0F; mixingControlBicarbTargetConductivity.override = OVERRIDE_RESET; @@ -291,8 +288,8 @@ mixingControlBicarbDeltaConductivity.ovInitData = 0.0F; mixingControlBicarbDeltaConductivity.override = OVERRIDE_RESET; - mixingControlDialysateTargetConductivity.data = DIALYSATE_TARGET_CONDUCTIVITY; - mixingControlDialysateTargetConductivity.ovData = DIALYSATE_TARGET_CONDUCTIVITY; + mixingControlDialysateTargetConductivity.data = getTotalConductivity(); + mixingControlDialysateTargetConductivity.ovData = getTotalConductivity(); mixingControlDialysateTargetConductivity.ovInitData = 0.0F; mixingControlDialysateTargetConductivity.override = OVERRIDE_RESET; @@ -327,8 +324,8 @@ mixingControlAcidControlInterval.override = OVERRIDE_RESET; mixingControlDataPublicationTimerCounter = 0; - lastBicarbMixVolume = 0; - lastAcidMixVolume = 0; + mixingControlLastBicarbMixVolume = 0; + mixingControlLastAcidMixVolume = 0; initializePIController( PI_CONTROLLER_ID_BICARB_VOL, 0.0F,\ getBicarbKpGainCoefficient(), getBicarbKiGainCoefficient(),\ @@ -610,48 +607,56 @@ * The getTotalConductivity function gets the total conductivity of bicarb and acid * @details \b Inputs: none * @details \b Outputs: none - * @return conductivity + * @return totalConductivity(Dialysate conductivity) in uS/cm *************************************************************************/ static F32 getTotalConductivity( void ) { - return TOTAL_CONDUCTIVITY; + F32 totalConductivity = TOTAL_CONDUCTIVITY; + // convert milli siemense to micro siemense + return MILLISIEMENS_TO_MICROSIEMENS( totalConductivity ); } /*********************************************************************//** * @brief * The getAcidConducivityPost function gets the acid conductivity post * @details \b Inputs: none * @details \b Outputs: none - * @return conductivity + * @return acidConductivityPost in uS/cm *************************************************************************/ static F32 getAcidConducivityPost( void ) { - return ACID_CONDUCTIVITY_POST; + F32 acidConductivityPost = ACID_CONDUCTIVITY_POST; + // convert milli siemense to micro siemense + return MILLISIEMENS_TO_MICROSIEMENS( acidConductivityPost ); } /*********************************************************************//** * @brief - * The getBicarbConductivityPost function gets the bicarb conductivity post + * The getBicarbConductivityPost function gets the bicarb conductivity after mix * @details \b Inputs: none * @details \b Outputs: none - * @return conductivity + * @return bicarbConductivityPost in uS/cm *************************************************************************/ static F32 getBicarbConductivityPost( void ) { - //TODO: Update to return bicarb post conductivity once defined. - return BICARB_CONDUCTIVITY_PRE; + // right now post mix value is same as BICARB_CONDUCTIVITY_PRE + F32 bicarbConductivityPost = BICARB_CONDUCTIVITY_PRE; + // convert milli siemense to micro siemense + return MILLISIEMENS_TO_MICROSIEMENS( bicarbConductivityPost ); } /*********************************************************************//** * @brief - * The getBicarbConductivityPre function gets the bicarb conductivity pre + * The getBicarbConductivityPre function gets the bicarb conductivity before mix * @details \b Inputs: none * @details \b Outputs: none - * @return conductivity + * @return bicarbConductivityPre in uS/cm *************************************************************************/ static F32 getBicarbConductivityPre( void ) { - return BICARB_CONDUCTIVITY_PRE; + F32 bicarbConductivityPre = BICARB_CONDUCTIVITY_PRE; + // convert milli siemense to micro siemense + return MILLISIEMENS_TO_MICROSIEMENS( bicarbConductivityPre ); } /*********************************************************************//** @@ -684,8 +689,8 @@ if ( BICARB_MIX_ID == mixId ) { - //TODO: right now using the fixed conductivity , later use the calculated version API F32 measuredBicarbConductivity = getFilteredConductivity( D17_COND ); + // reads getBicarbConductivityPre() F32 bicarbConductivity = getBicarbTargetConductivity(); F32 bicarbDeltaConductivity = getBicarbDeltaConductivity(); @@ -700,8 +705,8 @@ } else if ( ACID_MIX_ID == mixId ) { - //TODO: right now using the fixed conductivity , later use the calculated version API F32 measuredAcidBicarbMixConductivity = getFilteredConductivity( D27_COND ); + // reads getTotalConductivity(); F32 DialysateConductivity = getDialysateTargetConductivity(); F32 DialysateDeltaConductivity = getDialysateDeltaConductivity(); @@ -771,7 +776,7 @@ // Control based on the measured and target conductivity PI_CONTROLLER_SIGNALS_DATA debugBicarbControl; F32 measuredBicarbConductivity = getFilteredConductivity( D17_COND ); - F32 bicarbConductivity = getBicarbTargetConductivity();//getBicarbConductivityPre(); + F32 bicarbConductivity = getBicarbConductivityPre(); //TODO: ALARM if measuredDialysateConductivity or bicarbConductivity is or both 0 if ( fabs ( bicarbConductivity - measuredBicarbConductivity ) > BICARB_DEADBAND_CONTROL ) @@ -784,7 +789,7 @@ else { //use the previous value, this is for debug - lastBicarbMixVolume = getBicarbMixVol(); + mixingControlLastBicarbMixVolume = getBicarbMixVol(); } debugBicarbControl = getDebugPIControllerSignals( PI_CONTROLLER_ID_BICARB_VOL ); @@ -804,7 +809,7 @@ // TODO: use the calculated API F32 measuredDialysateConductivity = getFilteredConductivity( D27_COND ); - F32 DialysateConductivity = getDialysateTargetConductivity();//getTotalConductivity(); + F32 DialysateConductivity = getTotalConductivity(); PI_CONTROLLER_SIGNALS_DATA debugAcidControl; //TODO: ALARM if measuredDialysateConductivity or DialysateConductivity is or both 0 @@ -818,7 +823,7 @@ else { // use the previous value, this is for debug - lastAcidMixVolume = getAcidMixVol(); + mixingControlLastAcidMixVolume = getAcidMixVol(); } debugAcidControl = getDebugPIControllerSignals( PI_CONTROLLER_ID_ACID_VOL ); @@ -890,11 +895,15 @@ data.acidControlInterval = (U32)dialysateMix[ ACID_MIX_ID ].controlTimerCounter; data.currentBicarbMixVolume = getBicarbMixVol(); - data.lastBicarbMixVolume = lastBicarbMixVolume; + data.lastBicarbMixVolume = mixingControlLastBicarbMixVolume; data.currentAcidMixVolume = getAcidMixVol(); - data.lastAcidMixVolume = lastAcidMixVolume; + data.lastAcidMixVolume = mixingControlLastAcidMixVolume; - //TODO :broadcast theretical pre and post conductivity + data.bicarbConductivityPreMix = getBicarbConductivityPre(); + data.bicarbConductivityPostMix = getBicarbConductivityPost(); + data.acidConductivityPostMix = getAcidConducivityPost(); + // acid+bicarb conductivity or Dialysate conductivity + data.totalConductivity = getTotalConductivity(); // TODO: remove after feature testing memcpy( &data.bicarbData, &bicarbControlSignals, sizeof( PI_CONTROLLER_SIGNALS_DATA ) );