Index: firmware/App/Modes/Rinseback.c =================================================================== diff -u -ra51419e487a62eac8bce5f5e2a6c366b11e9e11e -r5072f7dedbe4be9dd9d2bfe9a46f53c1d3f356fc --- firmware/App/Modes/Rinseback.c (.../Rinseback.c) (revision a51419e487a62eac8bce5f5e2a6c366b11e9e11e) +++ firmware/App/Modes/Rinseback.c (.../Rinseback.c) (revision 5072f7dedbe4be9dd9d2bfe9a46f53c1d3f356fc) @@ -64,6 +64,7 @@ static U32 rinsebackTimerCtr; ///< Timer counter for time spent in rinseback sub-mode. static F32 cumulativeRinsebackVolume_mL; ///< Total cumulative rinseback volume (in mL). +static F32 targetRinsebackVolumePlusAdditional_mL; ///< Target rinseback volume w/ additional volume(s) added (in mL). static F32 additionalRinsebackVolume_mL; ///< Total volume (in mL) delivered so far for additional volume request. static U32 rinsebackMotorCount; ///< The cumulative sum of BP motor encoder counts used for independent rinseback volume check. static U32 rinsebackLastMotorCount; ///< The last BP motor encoder count read for independent rinseback volume check. @@ -120,6 +121,7 @@ { rinsebackState = RINSEBACK_STOP_INIT_STATE; rinsebackRate_mL_min = getTreatmentParameterU32( TREATMENT_PARAM_RINSEBACK_FLOW_RATE ); + targetRinsebackVolumePlusAdditional_mL = TARGET_RINSEBACK_VOLUME_ML; rinsebackTimerCtr = 0; cumulativeRinsebackVolume_mL = 0.0; additionalRinsebackVolume_mL = 0.0; @@ -481,6 +483,7 @@ { rinsebackAdditionalTimerCtr = 0; additionalRinsebackVolume_mL = 0.0; + targetRinsebackVolumePlusAdditional_mL += TARGET_ADDITIONAL_RINSEBACK_VOLUME_ML; setupForRinsebackDelivery( MIN_RINSEBACK_FLOW_RATE_ML_MIN ); result = RINSEBACK_RUN_ADDITIONAL_STATE; } @@ -934,8 +937,8 @@ if ( ++rinsebackPublishTimerCtr >= RINSEBACK_DATA_PUBLISH_INTERVAL ) { RINSEBACK_DATA_PAYLOAD_T data; - U32 timeout = MAX_RINSEBACK_TIME / TASK_GENERAL_INTERVAL; - U32 countdown = ( rinsebackTimerCtr >= MAX_RINSEBACK_TIME ? 0 : ( MAX_RINSEBACK_TIME - rinsebackTimerCtr ) / TASK_GENERAL_INTERVAL ); + U32 timeout = MAX_RINSEBACK_TIME / ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ); + U32 countdown = ( rinsebackTimerCtr >= MAX_RINSEBACK_TIME ? 0 : ( MAX_RINSEBACK_TIME - rinsebackTimerCtr ) / ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ); rinsebackPublishTimerCtr = 0; // If we have completed rinseback, timeout is no longer in force - indicate by zeroing timeout @@ -944,8 +947,16 @@ timeout = 0; } data.targetRinsebackVolumeMl = TARGET_RINSEBACK_VOLUME_ML; + if ( RINSEBACK_RUN_ADDITIONAL_STATE == rinsebackState ) + { + data.targetRinsebackVolumeMl = targetRinsebackVolumePlusAdditional_mL; + } data.deliveredRinsebackVolumeMl = cumulativeRinsebackVolume_mL; data.rinsebackFlowRateMlMin = rinsebackRate_mL_min; + if ( RINSEBACK_RUN_ADDITIONAL_STATE == rinsebackState ) + { + data.rinsebackFlowRateMlMin = MIN_RINSEBACK_FLOW_RATE_ML_MIN; + } data.timeout = timeout; data.countdown = countdown; broadcastRinsebackData( data );