Index: firmware/App/Controllers/MixingControl.c =================================================================== diff -u -rc0e1f5f4c4657c156a87cc8be6c3db38bb14db33 -r10721a671c9e1ed73b448799f35e00e46efa6680 --- firmware/App/Controllers/MixingControl.c (.../MixingControl.c) (revision c0e1f5f4c4657c156a87cc8be6c3db38bb14db33) +++ firmware/App/Controllers/MixingControl.c (.../MixingControl.c) (revision 10721a671c9e1ed73b448799f35e00e46efa6680) @@ -99,8 +99,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 @@ -117,11 +117,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 @@ -162,8 +162,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). @@ -250,13 +250,13 @@ 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; @@ -283,8 +283,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; @@ -293,8 +293,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; @@ -329,8 +329,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(),\ @@ -612,47 +612,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 ) { - 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 ); } /*********************************************************************//** @@ -685,8 +694,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(); @@ -701,10 +710,10 @@ } 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 = getDialysateTargetConductivity(); + F32 DialysateDeltaConductivity = getDialysateDeltaConductivity(); if ( TRUE != getTestConfigStatus( TEST_CONFIG_DD_ENABLE_DOSING_OPEN_LOOP_CONTROL ) ) { @@ -772,7 +781,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 ) @@ -785,7 +794,7 @@ else { //use the previous value, this is for debug - lastBicarbMixVolume = getBicarbMixVol(); + mixingControlLastBicarbMixVolume = getBicarbMixVol(); } debugBicarbControl = getDebugPIControllerSignals( PI_CONTROLLER_ID_BICARB_VOL ); @@ -805,7 +814,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 @@ -819,7 +828,7 @@ else { // use the previous value, this is for debug - lastAcidMixVolume = getAcidMixVol(); + mixingControlLastAcidMixVolume = getAcidMixVol(); } debugAcidControl = getDebugPIControllerSignals( PI_CONTROLLER_ID_ACID_VOL ); @@ -891,11 +900,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 ) );