Index: firmware/App/Modes/StateTxBloodPrime.c =================================================================== diff -u -r63fdc9a97e335c359fed989383cb56db57dc272f -r9ee205a82fc3bb2b6cdf871a2ef506b7a6caf88f --- firmware/App/Modes/StateTxBloodPrime.c (.../StateTxBloodPrime.c) (revision 63fdc9a97e335c359fed989383cb56db57dc272f) +++ firmware/App/Modes/StateTxBloodPrime.c (.../StateTxBloodPrime.c) (revision 9ee205a82fc3bb2b6cdf871a2ef506b7a6caf88f) @@ -56,6 +56,9 @@ /// Tubing portion of blood prime volume to prime the blood side circuit (in mL). #define TUBING_BLOOD_PRIME_VOLUME_ML 126 +/// +#define BLOOD_PRIME_PAUSE_TIMEOUT_SEC ( 5 * SEC_PER_MIN ) + // ********** private data ********** static BLOOD_PRIME_STATE_T bloodPrimeState; ///< Current state of the blood prime sub-mode. @@ -72,7 +75,7 @@ static U32 bloodPrimePublishTimerCtr; ///< Timer counter for determining interval for blood prime status to be published. static U32 lastBloodPrimeFlowRate_mL_min; ///< Flow rate prior to pausing blood prime. static U32 requestedBloodFlowRate_mL_min; ///< Requested blood flow rate from UI. -static U32 bloodPrimeStartMS = 0; ///< Start time of Blood Prime (ms timer count) +static U32 bloodPrimeStartMS = 0; ///< Start time of Blood Prime (ms timer count) /// Interval (in task intervals) at which to publish blood prime data to CAN bus. static OVERRIDE_U32_T bloodPrimePublishInterval = { BLOOD_PRIME_DATA_PUBLISH_INTERVAL, BLOOD_PRIME_DATA_PUBLISH_INTERVAL, BLOOD_PRIME_DATA_PUBLISH_INTERVAL, 0 }; @@ -120,7 +123,7 @@ estRampSeconds = (F32)MIN_RAMP_TIME_SEC; } bloodPrimeRampStep_mL = rampRateSpan / estRampSeconds; - bloodPrimeStartMS = getMSTimerCount(); + bloodPrimeStartMS = 0; } /*********************************************************************//** @@ -275,6 +278,7 @@ setValvePosition( H1_VALV, VALVE_POSITION_C_CLOSE ); setValvePosition( H19_VALV, VALVE_POSITION_C_CLOSE ); result = BLOOD_PRIME_PAUSED_STATE; + bloodPrimeStartMS = getMSTimerCount(); } // When UI changes blood flow rate else if ( TRUE == pendingFlowChangeRequest ) @@ -332,6 +336,7 @@ setValvePosition( H1_VALV, VALVE_POSITION_C_CLOSE ); setValvePosition( H19_VALV, VALVE_POSITION_C_CLOSE ); result = BLOOD_PRIME_PAUSED_STATE; + bloodPrimeStartMS = getMSTimerCount(); } // When UI changes blood flow rate else if ( TRUE == pendingFlowChangeRequest ) @@ -503,10 +508,25 @@ bloodPrimePublishTimerCtr = 0; data.targetBloodPrimeVolumeMl = bloodPrimeTargetVolume_mL; data.deliveredBloodPrimeVolumeMl = MAX( 0.0, getBloodPrimeVolume() ); - elapsedMS = calcTimeSince( bloodPrimeStartMS ); - elapsedSec = elapsedMS / 1000U; - data.bloodPrimeTimeoutSec = bloodPrimeStartMS; - data.bloodPrimeCountdownSec = elapsedSec; + if ( BLOOD_PRIME_PAUSED_STATE == bloodPrimeState ) + { + elapsedMS = calcTimeSince( bloodPrimeStartMS ); + elapsedSec = elapsedMS / MS_PER_SECOND; + data.bloodPrimeTimeoutSec = BLOOD_PRIME_PAUSE_TIMEOUT_SEC; + if ( elapsedSec < BLOOD_PRIME_PAUSE_TIMEOUT_SEC ) + { + data.bloodPrimeCountdownSec = BLOOD_PRIME_PAUSE_TIMEOUT_SEC - elapsedSec; + } + else + { + data.bloodPrimeCountdownSec = 0; + } + } + else + { + data.bloodPrimeTimeoutSec = 0; + data.bloodPrimeCountdownSec = 0; + } broadcastData( MSG_ID_TD_BLOOD_PRIME_PROGRESS_DATA, COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08*)&data, sizeof( BLOOD_PRIME_DATA_PAYLOAD_T ) ); }