Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -ref5af6dd03da43ed68e147403f5923a9e1d8de8b -rd954cab1e721ac955f98feb260d7b978ec14ccab --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision ef5af6dd03da43ed68e147403f5923a9e1d8de8b) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision d954cab1e721ac955f98feb260d7b978ec14ccab) @@ -31,9 +31,9 @@ // ********** private definitions ********** -#define MAX_UF_ACCURACY_ERROR_ML 250 ///< Maximum ultrafiltration accuracy error in mL over the entire treatment. -#define MAX_UF_ACCURACY_ERROR_ML_PER_HR 100 ///< Maximum ultrafiltration accuracy error in mL/hr. -#define UF_ACCURACY_CHECK_INTERVAL ((1 * MIN_PER_HOUR * SEC_PER_MIN * MS_PER_SECOND) / TASK_GENERAL_INTERVAL) ///< Ultrafiltration rate accuracy check interval count +#define MAX_UF_RATE_ML_PER_MIN 45.83 ///< Maximum ultrafiltration rate in mL/min (2750 mL/hr). +#define MAX_UF_ACCURACY_ERROR_ML 25.0 ///< Maximum ultrafiltration accuracy error in mL over the entire treatment. +#define UF_ACCURACY_CHECK_INTERVAL ((1 * SEC_PER_MIN * MS_PER_SECOND) / TASK_GENERAL_INTERVAL) ///< Ultrafiltration rate accuracy check interval count // ********** private data ********** @@ -64,9 +64,10 @@ static UF_STATE_T handleUFStartState( void ); static UF_STATE_T handleUFPausedState( void ); static UF_STATE_T handleUFRunningState( void ); -static UF_STATE_T handleUFCompletedOrOffState( void ); +static UF_STATE_T handleUFOffState( void ); +static UF_STATE_T handleUFCompletedState( void ); -static void checkUFAccuracy( void ); +static void checkUFAccuracyAndVolume( void ); static void updateUFVolumes( void ); /*********************************************************************//** @@ -138,6 +139,11 @@ setDialysateFlowRate = dPFlow; maxUFVolumeML = maxUFVol; setUFRate = uFRate; + + setBloodPumpTargetFlowRate( setBloodFlowRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); // TODO - test code - remove later + setDialInPumpTargetFlowRate( setDialysateFlowRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); +// setBloodPumpTargetFlowRate( setBloodFlowRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); // TODO - restore these later +// setDialInPumpTargetFlowRate( setDialysateFlowRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); } /*********************************************************************//** @@ -208,6 +214,22 @@ /*********************************************************************//** * @brief + * The getUltrafiltrationVolumeCollected function gets the current ultrafiltration \n + * volume collected so far for current treatment. + * @details + * Inputs : measUFVolume, measUFVolumeFromPriorReservoirs + * Outputs : none + * @return currentUFState + *************************************************************************/ +F32 getUltrafiltrationVolumeCollected( void ) +{ + F32 result = measUFVolume; + + return result; +} + +/*********************************************************************//** + * @brief * The pauseUF function pauses ultrafiltration. * @details * Inputs : currentDialysisState, currentUFState @@ -278,8 +300,8 @@ *************************************************************************/ void execDialysis( void ) { - // check ultrafiltration accuracy during dialysis (even when ultrafiltration is paused). - checkUFAccuracy(); + // check ultrafiltration max rate and accuracy during dialysis (even when ultrafiltration is paused). + checkUFAccuracyAndVolume(); // dialysis state machine switch ( currentDialysisState ) @@ -330,10 +352,14 @@ currentUFState = handleUFRunningState(); break; - case UF_COMPLETED_OR_OFF_STATE: - currentUFState = handleUFCompletedOrOffState(); + case UF_OFF_STATE: + currentUFState = handleUFOffState(); break; + case UF_COMPLETED_STATE: + currentUFState = handleUFCompletedState(); + break; + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_DIALYSIS_INVALID_UF_STATE, currentUFState ) break; @@ -376,7 +402,7 @@ if ( maxUFVolumeML < NEARLY_ZERO ) { - result = UF_COMPLETED_OR_OFF_STATE; + result = UF_OFF_STATE; } else { @@ -440,7 +466,7 @@ // if we've reached target UF volume, UF is complete if ( measUFVolume >= maxUFVolumeML ) { - result = UF_COMPLETED_OR_OFF_STATE; + result = UF_COMPLETED_STATE; } // TODO - test code - remove later @@ -455,51 +481,62 @@ /*********************************************************************//** * @brief - * The handleUFCompletedOrOffState function handles the UF Completed or Off \n - * state of the ultrafiltration state machine. + * The handleUFCompletedOrOffState function handles the UF Off state \n + * of the ultrafiltration state machine. * @details * Inputs : none * Outputs : UF volumes updated and provided to DPo pump controller. * @return next ultrafiltration state *************************************************************************/ -static UF_STATE_T handleUFCompletedOrOffState( void ) +static UF_STATE_T handleUFOffState( void ) { - UF_STATE_T result = UF_COMPLETED_OR_OFF_STATE; + UF_STATE_T result = UF_OFF_STATE; // calculate UF volumes and provide to dialysate outlet pump controller updateUFVolumes(); - // TODO - test code - remove later - if ( TRUE == isStopButtonPressed() ) - { - // do nothing - } + return result; +} +/*********************************************************************//** + * @brief + * The handleUFCompletedState function handles the UF Completed \n + * state of the ultrafiltration state machine. This is a terminal state. + * @details + * Inputs : none + * Outputs : UF volumes updated and provided to DPo pump controller. + * @return next ultrafiltration state + *************************************************************************/ +static UF_STATE_T handleUFCompletedState( void ) +{ + UF_STATE_T result = UF_COMPLETED_STATE; + + // calculate UF volumes and provide to dialysate outlet pump controller + updateUFVolumes(); + return result; } /*********************************************************************//** * @brief - * The checkUFAccuracy function checks ultrafiltration accuracy for the last \n - * minute and triggers an alarm if out of spec. + * The checkUF function checks ultrafiltration accuracy for the last \n + * minute and checks total UF volume. Triggers an alarm if out of spec. * @details * Inputs : uFAccuracyCheckTimerCtr, lastUFVolumeChecked, measUFVolume * Outputs : uFAccuracyCheckTimerCtr, lastUFVolumeChecked * @return none *************************************************************************/ -static void checkUFAccuracy( void ) +static void checkUFAccuracyAndVolume( void ) { - // check UF accuracy at 1 hour intervals + // check UF accuracy at 1 minute intervals if ( ++uFAccuracyCheckTimerCtr >= UF_ACCURACY_CHECK_INTERVAL ) { - F32 uFMeasRatePerHr = measUFVolume - lastUFVolumeChecked; - F32 uFSetRatePerHr = ( setUFRate * (F32)MIN_PER_HOUR ); - F32 uFRateError = FABS( uFSetRatePerHr - uFMeasRatePerHr ); + F32 uFMeasRate = measUFVolume - lastUFVolumeChecked; - // check UF accuracy - if ( uFRateError > (F32)MAX_UF_ACCURACY_ERROR_ML_PER_HR ) + // check UF max rate + if ( uFMeasRate > MAX_UF_RATE_ML_PER_MIN ) { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_UF_RATE_ACCURACY_ERROR, uFSetRatePerHr, uFMeasRatePerHr ); + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_UF_RATE_TOO_HIGH_ERROR, uFMeasRate ); } // reset for next check lastUFVolumeChecked = measUFVolume;