Index: firmware/App/Controllers/DialOutFlow.c =================================================================== diff -u -ref5af6dd03da43ed68e147403f5923a9e1d8de8b -rd954cab1e721ac955f98feb260d7b978ec14ccab --- firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision ef5af6dd03da43ed68e147403f5923a9e1d8de8b) +++ firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision d954cab1e721ac955f98feb260d7b978ec14ccab) @@ -588,7 +588,7 @@ /*********************************************************************//** * @brief setDialOutPumpDirection - * The setDialOutPumpDirection function sets the set dialIn pump direction to \n + * The setDialOutPumpDirection function sets the set dialOut pump direction to \n * the given direction. * @details * Inputs : none @@ -896,9 +896,6 @@ } -/**@}*/ - - /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ @@ -1050,11 +1047,11 @@ /*********************************************************************//** * @brief * The testSetMeasuredDialOutPumpRotorSpeedOverride function overrides the measured \n - * dialIn pump rotor speed. \n + * dialOut pump rotor speed. \n * @details * Inputs : DialOutPumpRotorSpeedRPM * Outputs : DialOutPumpRotorSpeedRPM - * @param value : override measured dialIn pump rotor speed (in RPM) + * @param value : override measured dialOut pump rotor speed (in RPM) * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testSetMeasuredDialOutPumpRotorSpeedOverride( F32 value ) @@ -1074,7 +1071,7 @@ /*********************************************************************//** * @brief * The testResetMeasuredDialOutPumpRotorSpeedOverride function resets the override of the \n - * measured dialIn pump rotor speed. + * measured dialOut pump rotor speed. * @details * Inputs : DialOutPumpRotorSpeedRPM * Outputs : DialOutPumpRotorSpeedRPM @@ -1097,11 +1094,11 @@ /*********************************************************************//** * @brief * The testSetMeasuredDialOutPumpSpeedOverride function overrides the measured \n - * dialIn pump motor speed. \n + * dialOut pump motor speed. \n * @details * Inputs : dialOutPumpSpeedRPM * Outputs : dialOutPumpSpeedRPM - * @param value : override measured dialIn pump motor speed (in RPM) + * @param value : override measured dialOut pump motor speed (in RPM) * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testSetMeasuredDialOutPumpSpeedOverride( F32 value ) @@ -1121,7 +1118,7 @@ /*********************************************************************//** * @brief * The testResetMeasuredDialOutPumpSpeedOverride function resets the override of the \n - * measured dialIn pump motor speed. + * measured dialOut pump motor speed. * @details * Inputs : dialOutPumpSpeedRPM * Outputs : dialOutPumpSpeedRPM @@ -1144,11 +1141,11 @@ /*********************************************************************//** * @brief * The testSetMeasuredDialOutPumpMCSpeedOverride function overrides the measured \n - * dialIn pump motor speed. \n + * dialOut pump motor speed. * @details * Inputs : dialOutPumpMCSpeedRPM * Outputs : dialOutPumpMCSpeedRPM - * @param value : override measured dialIn pump speed (in RPM) + * @param value : override measured dialOut pump speed (in RPM) * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testSetMeasuredDialOutPumpMCSpeedOverride( F32 value ) @@ -1168,7 +1165,7 @@ /*********************************************************************//** * @brief * The testResetMeasuredDialOutPumpMCSpeedOverride function resets the override of the \n - * measured dialIn pump motor speed. + * measured dialOut pump motor speed. * @details * Inputs : dialOutPumpMCSpeedRPM * Outputs : dialOutPumpMCSpeedRPM @@ -1191,11 +1188,11 @@ /*********************************************************************//** * @brief * The testSetMeasuredDialOutPumpMCCurrentOverride function overrides the measured \n - * dialIn pump motor current. \n + * dialOut pump motor current. * @details * Inputs : dialOutPumpMCCurrentmA * Outputs : dialOutPumpMCCurrentmA - * @param value : override measured dialIn pump current (in mA) + * @param value : override measured dialOut pump current (in mA) * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testSetMeasuredDialOutPumpMCCurrentOverride( F32 value ) @@ -1215,7 +1212,7 @@ /*********************************************************************//** * @brief * The testResetMeasuredDialOutPumpMCCurrentOverride function resets the override of the \n - * measured dialIn pump motor current. + * measured dialOut pump motor current. * @details * Inputs : dialOutPumpMCCurrentmA * Outputs : dialOutPumpMCCurrentmA @@ -1238,7 +1235,7 @@ /*********************************************************************//** * @brief * The testSetDialOutLoadCellWeightOverride function overrides the value of the \n - * load cell sensor with a given weight (in grams). \n + * load cell sensor with a given weight (in grams). * @details * Inputs : loadCellWeightInGrams[] * Outputs : loadCellWeightInGrams[] @@ -1290,4 +1287,4 @@ return result; } - +/**@}*/ 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; Index: firmware/App/Modes/Dialysis.h =================================================================== diff -u -rca8a81beba20b62acf98cea4d934354ce512bcfe -rd954cab1e721ac955f98feb260d7b978ec14ccab --- firmware/App/Modes/Dialysis.h (.../Dialysis.h) (revision ca8a81beba20b62acf98cea4d934354ce512bcfe) +++ firmware/App/Modes/Dialysis.h (.../Dialysis.h) (revision d954cab1e721ac955f98feb260d7b978ec14ccab) @@ -1,6 +1,6 @@ /**********************************************************************//** * - * Copyright (c) 2020 Diality Inc. - All Rights Reserved. + * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER.