Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -r6f02ff4686ec9dfc60247e9ed3fc9c5cc7771543 -r9ee205a82fc3bb2b6cdf871a2ef506b7a6caf88f --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 6f02ff4686ec9dfc60247e9ed3fc9c5cc7771543) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 9ee205a82fc3bb2b6cdf871a2ef506b7a6caf88f) @@ -150,6 +150,7 @@ static OVERRIDE_F32_T bpFlowAlphaYIntercept; ///< Blood flow estimation term for alpha Y intercept. static OVERRIDE_F32_T bpFlowWearATerm; ///< Blood flow estimation term for wear slope. static OVERRIDE_F32_T bpFlowWearBTerm; ///< Blood flow estimation term for wear offset. +static OVERRIDE_F32_T bpStrokeVolumeMlPerRev; //static TD_PUMPS_CAL_RECORD_T bloodPumpCalRecord; ///< Blood pump calibration record. @@ -1433,4 +1434,21 @@ return result; } +/*********************************************************************//** +* @brief +* The testBPStrokeVolumeOverride function overrides the stroke volume +* (mL per rotor revolution) used in the blood flow estimation equation. +* @details \b Inputs: none +* @details \b Outputs: bpStrokeVolumeMlPerRev +* @param message Override message from Dialin which includes the stroke +* volume (mL per rotor revolution) to override with. +* @return TRUE if override successful, FALSE if not +*************************************************************************/ +BOOL testBPStrokeVolumeOverride( MESSAGE_T *message ) +{ + BOOL result = f32Override( message, &bpStrokeVolumeMlPerRev ); + + return result; +} + /**@}*/ Index: firmware/App/Controllers/BloodFlow.h =================================================================== diff -u -r395522dffef1348e176564925656012f529c1910 -r9ee205a82fc3bb2b6cdf871a2ef506b7a6caf88f --- firmware/App/Controllers/BloodFlow.h (.../BloodFlow.h) (revision 395522dffef1348e176564925656012f529c1910) +++ firmware/App/Controllers/BloodFlow.h (.../BloodFlow.h) (revision 9ee205a82fc3bb2b6cdf871a2ef506b7a6caf88f) @@ -87,6 +87,7 @@ BOOL testBPFlowAlphaYInterceptOverride( MESSAGE_T *message ); BOOL testBPFlowWearATermOverride( MESSAGE_T *message ); BOOL testBPFlowWearBTermOverride( MESSAGE_T *message ); +BOOL testBPStrokeVolumeOverride( MESSAGE_T *message ); /**@}*/ 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 ) ); } Index: firmware/App/Services/Messaging.c =================================================================== diff -u -rc01e44290174eb4098c14b17031ac538d7560b03 -r9ee205a82fc3bb2b6cdf871a2ef506b7a6caf88f --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision c01e44290174eb4098c14b17031ac538d7560b03) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision 9ee205a82fc3bb2b6cdf871a2ef506b7a6caf88f) @@ -168,9 +168,9 @@ { MSG_ID_TD_EJECTOR_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testEjectorDataPublishIntervalOverride }, { MSG_ID_TD_SET_AIR_TRAP_CONTROL, &testSetAirTrapControl }, { MSG_ID_TD_HOME_BLOOD_PUMP, &testHomeBloodPump }, - { MSG_ID_TD_BLOOD_FLOW_ALPHA_Y_INTERCEPT_OVERRIDE_REQUEST, &testBPFlowAlphaYInterceptOverride }, { MSG_ID_TD_BLOOD_FLOW_WEAR_A_TERM_OVERRIDE_REQUEST, &testBPFlowWearATermOverride }, { MSG_ID_TD_BLOOD_FLOW_WEAR_B_TERM_OVERRIDE_REQUEST, &testBPFlowWearBTermOverride }, + { MSG_ID_TD_BLOOD_FLOW_STROKE_VOLUME_OVERRIDE_REQUEST, &testBPStrokeVolumeOverride }, { MSG_ID_TD_SET_TEST_CONFIGURATION, &testSetTestConfiguration }, { MSG_ID_TD_GET_TEST_CONFIGURATION, &testGetTestConfiguration }, { MSG_ID_TD_RESET_ALL_TEST_CONFIGURATIONS, &testResetAllTestConfigurations },