Index: firmware/App/Modes/StateTxBloodPrime.c =================================================================== diff -u -rc409eeaa2a43550767e463afb12e2c8422291e66 -rd0afb42f8728fd5ee05c90ec0e57e1f4eec4067b --- firmware/App/Modes/StateTxBloodPrime.c (.../StateTxBloodPrime.c) (revision c409eeaa2a43550767e463afb12e2c8422291e66) +++ firmware/App/Modes/StateTxBloodPrime.c (.../StateTxBloodPrime.c) (revision d0afb42f8728fd5ee05c90ec0e57e1f4eec4067b) @@ -76,6 +76,8 @@ 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 bloodPrimeTimeoutSec = 0; ///< +static U32 bloodPrimeCountdownSec = 0; ///< /// 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 }; @@ -89,6 +91,7 @@ static BLOOD_PRIME_STATE_T handleBloodPrimeRampState( void ); static BLOOD_PRIME_STATE_T handleBloodPrimeRunState( void ); static BLOOD_PRIME_STATE_T handleBloodPrimePausedState( void ); +static void handleBloodPrimePauseTimer( void ); static void publishBloodPrimeData( void ); /*********************************************************************//** @@ -236,6 +239,8 @@ // Blood prime flags should be handled by now - reset in case not handled by current state resetBloodPrimeFlags(); + handleBloodPrimePauseTimer(); + // Publish blood prime progress while in blood prime sub-mode publishBloodPrimeData(); } @@ -488,6 +493,50 @@ } /*********************************************************************//** +* @brief +* The handleTreatmentPausedBloodSittingTimer function handles the pause +* timeout and trigger warning/alarm. +* @details Inputs: bloodPrimeStartMS +* @details Outputs: bloodPrimeTimeoutSec, bloodPrimeCountdownSec +* @return none +*************************************************************************/ +static void handleBloodPrimePauseTimer( void ) +{ + U32 elapsedMS; + U32 elapsedSec; + + if ( BLOOD_PRIME_PAUSED_STATE == bloodPrimeState ) + { + elapsedMS = calcTimeSince( bloodPrimeStartMS ); + elapsedSec = elapsedMS / MS_PER_SECOND; + bloodPrimeTimeoutSec = BLOOD_PRIME_PAUSE_TIMEOUT_SEC; + if ( elapsedSec < BLOOD_PRIME_PAUSE_TIMEOUT_SEC ) + { + bloodPrimeCountdownSec = BLOOD_PRIME_PAUSE_TIMEOUT_SEC - elapsedSec; + } + else + { + bloodPrimeCountdownSec = 0; + } + // Warning when 1 minute is remaining + if ( bloodPrimeCountdownSec <= SEC_PER_MIN ) + { + activateAlarmNoData( ALARM_ID_TD_BLOOD_PRIME_PAUSE_WARNING ); + } + // Alarm when timeout reached + if ( bloodPrimeCountdownSec == 0 ) + { + activateAlarmNoData( ALARM_ID_TD_BLOOD_PRIME_PAUSE_TIMEOUT ); + } + } + else + { + bloodPrimeTimeoutSec = 0; + bloodPrimeCountdownSec = 0; + } +} + +/*********************************************************************//** * @brief * The publishBloodPrimeData function publishes blood prime data * at interval. @@ -499,37 +548,17 @@ *************************************************************************/ static void publishBloodPrimeData( void ) { - if ( ++bloodPrimePublishTimerCtr >= getU32OverrideValue( &bloodPrimePublishInterval ) ) - { - BLOOD_PRIME_DATA_PAYLOAD_T data; - U32 elapsedMS; - U32 elapsedSec; + if ( ++bloodPrimePublishTimerCtr >= getU32OverrideValue( &bloodPrimePublishInterval ) ) + { + BLOOD_PRIME_DATA_PAYLOAD_T data; + bloodPrimePublishTimerCtr = 0; + data.targetBloodPrimeVolumeMl = bloodPrimeTargetVolume_mL; + data.deliveredBloodPrimeVolumeMl = MAX( 0.0, getBloodPrimeVolume() ); + data.bloodPrimeTimeoutSec = bloodPrimeTimeoutSec; + data.bloodPrimeCountdownSec = bloodPrimeCountdownSec; - bloodPrimePublishTimerCtr = 0; - data.targetBloodPrimeVolumeMl = bloodPrimeTargetVolume_mL; - data.deliveredBloodPrimeVolumeMl = MAX( 0.0, getBloodPrimeVolume() ); - 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 ) ); - } + broadcastData( MSG_ID_TD_BLOOD_PRIME_PROGRESS_DATA, COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08*)&data, sizeof( BLOOD_PRIME_DATA_PAYLOAD_T ) ); + } }