Index: firmware/App/Controllers/MixingControl.c =================================================================== diff -u -rf364406cd1f672078ca38ae8aad5bc508e9b64dd -rcf3c037762699407089411de04bc9d1f4b597784 --- firmware/App/Controllers/MixingControl.c (.../MixingControl.c) (revision f364406cd1f672078ca38ae8aad5bc508e9b64dd) +++ firmware/App/Controllers/MixingControl.c (.../MixingControl.c) (revision cf3c037762699407089411de04bc9d1f4b597784) @@ -159,6 +159,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 // mixing static OVERRIDE_F32_T mixingControlAcidVolume; ///< Acid concentrate volume in ml ( overrideable). @@ -338,44 +340,6 @@ /*********************************************************************//** * @brief - * The execDialysateCompositionMixingController function adjusts the volume of acid and bicarb based on the target - * conductivity of bicarb and dialysate solution - * @details \b Inputs: dialysateMix[ mixId ].dialysateMixingState - * @details \b Outputs:dialysateMix[ mixId ].dialysateMixingState - * @details \b Alarms: ALARM_ID_DD_SOFTWARE_FAULT if invalid dialysate mixing - * state machine found. - * @return none - *************************************************************************/ -static void handleDialysateCompositionMixing( void ) -{ - DIALYSATE_MIXING_ID_T mixId; - - for ( mixId = DIALYSATE_MIX_ID_FIRST; mixId < NUM_OF_DIALYSATE_MIXING_ID; mixId++ ) - { - switch ( dialysateMix[ mixId ].dialysateMixingState ) - { - case DIALYSATE_MIXING_OPEN_LOOP_STATE: - dialysateMix[ mixId ].dialysateMixingState = handleDialysateMixOpenLoopState( mixId ); - break; - - case DIALYSATE_MIXING_RAMP_UP_STATE: - dialysateMix[ mixId ].dialysateMixingState = handleDialysateMixRampToTargetState( mixId ); - break; - - case DIALYSATE_MIXING_CONTROL_TO_TARGET_STATE: - dialysateMix[ mixId ].dialysateMixingState = handleDialysateMixControlToTargetState( mixId ); - break; - - default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_DIALYSATE_MIX_EXEC_INVALID_STATE, mixId ) - dialysateMix[ mixId ].dialysateMixingState = DIALYSATE_MIXING_OPEN_LOOP_STATE; - break; - } - } -} - -/*********************************************************************//** - * @brief * The execMixingControl function executes the dialysate and bicarb open loop /closed loop * related state machines * @details \b Inputs: Balancing chamber state @@ -769,6 +733,7 @@ } else { + lastBicarbMixVolume = getBicarbMixVol(); //use the previous value } @@ -801,6 +766,7 @@ else { // use the previous value + lastAcidMixVolume = getAcidMixVol(); } debugAcidControl = getDebugPIControllerSignals( PI_CONTROLLER_ID_ACID_VOL ); @@ -812,10 +778,44 @@ return state; } +/*********************************************************************//** + * @brief + * The execDialysateCompositionMixingController function adjusts the volume of acid and bicarb based on the target + * conductivity of bicarb and dialysate solution + * @details \b Inputs: dialysateMix[ mixId ].dialysateMixingState + * @details \b Outputs:dialysateMix[ mixId ].dialysateMixingState + * @details \b Alarms: ALARM_ID_DD_SOFTWARE_FAULT if invalid dialysate mixing + * state machine found. + * @return none + *************************************************************************/ +static void handleDialysateCompositionMixing( void ) +{ + DIALYSATE_MIXING_ID_T mixId; + for ( mixId = DIALYSATE_MIX_ID_FIRST; mixId < NUM_OF_DIALYSATE_MIXING_ID; mixId++ ) + { + switch ( dialysateMix[ mixId ].dialysateMixingState ) + { + case DIALYSATE_MIXING_OPEN_LOOP_STATE: + dialysateMix[ mixId ].dialysateMixingState = handleDialysateMixOpenLoopState( mixId ); + break; + case DIALYSATE_MIXING_RAMP_UP_STATE: + dialysateMix[ mixId ].dialysateMixingState = handleDialysateMixRampToTargetState( mixId ); + break; + case DIALYSATE_MIXING_CONTROL_TO_TARGET_STATE: + dialysateMix[ mixId ].dialysateMixingState = handleDialysateMixControlToTargetState( mixId ); + break; + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_DIALYSATE_MIX_EXEC_INVALID_STATE, mixId ) + dialysateMix[ mixId ].dialysateMixingState = DIALYSATE_MIXING_OPEN_LOOP_STATE; + break; + } + } +} + /*********************************************************************//** * @brief * The publishMixingControlData function broadcasts the Mixing Controller @@ -837,10 +837,12 @@ data.acidMixingState = (U32)dialysateMix[ ACID_MIX_ID ].dialysateMixingState; data.acidControlInterval = (U32)dialysateMix[ ACID_MIX_ID ].controlTimerCounter; - data.bicarbVolume = getBicarbMixVol(); - data.acidVolume = getAcidMixVol(); + data.currentBicarbMixVolume = getBicarbMixVol(); + data.lastBicarbMixVolume = lastBicarbMixVolume; + data.currentAcidMixVolume = getAcidMixVol(); + data.currentAcidMixVolume = lastAcidMixVolume; - // broadcast theretical pre and post conductivity + //TODO :broadcast theretical pre and post conductivity // TODO: remove after feature testing memcpy( &data.bicarbData, &bicarbControlSignals, sizeof( PI_CONTROLLER_SIGNALS_DATA ) ); Index: firmware/App/Controllers/MixingControl.h =================================================================== diff -u -rf364406cd1f672078ca38ae8aad5bc508e9b64dd -rcf3c037762699407089411de04bc9d1f4b597784 --- firmware/App/Controllers/MixingControl.h (.../MixingControl.h) (revision f364406cd1f672078ca38ae8aad5bc508e9b64dd) +++ firmware/App/Controllers/MixingControl.h (.../MixingControl.h) (revision cf3c037762699407089411de04bc9d1f4b597784) @@ -41,8 +41,10 @@ U32 bicarbControlInterval; ///< Bicarb Control interval U32 acidMixingState; ///< Acid mixing state U32 acidControlInterval; ///< Acid control interval - F32 bicarbVolume; ///< Mixing control bicarb mix volume - F32 acidVolume; ///< Mixing control acid mix volume + F32 currentBicarbMixVolume; ///< Mixing control current bicarb mix volume + F32 lastBicarbMixVolume; ///< Mixing control last bicarb mix volume + F32 currentAcidMixVolume; ///< Mixing control current acid mix volume + F32 lastAcidMixVolume; ///< Mixing control last acid mix volume // TODO: remove after closed loops stabilized PI_CONTROLLER_SIGNALS_DATA bicarbData; ///< Mixing control bicarb mixing closed loop control signals data PI_CONTROLLER_SIGNALS_DATA acidData; ///< Mixing control acid mixing closed loop control signals data