Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -r69ed3f91919e50b68ea448a70db81456fb4946a0 -r8b09199bae9870a8d63d4be9636ef66c849f8531 --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 69ed3f91919e50b68ea448a70db81456fb4946a0) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 8b09199bae9870a8d63d4be9636ef66c849f8531) @@ -1,14 +1,14 @@ /************************************************************************** * -* Copyright (c) 2020-2022 Diality Inc. - All Rights Reserved. +* Copyright (c) 2020-2023 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. * * @file Dialysis.c * -* @author (last) Darren Cox -* @date (last) 16-Aug-2022 +* @author (last) Dara Navaei +* @date (last) 01-Dec-2022 * * @author (original) Sean * @date (original) 15-Jan-2020 @@ -238,7 +238,7 @@ } #endif - setDialInPumpTargetFlowRate( setDialysateFlowRate, MOTOR_DIR_FORWARD, mode, 0.0F ); + setDialInPumpTargetFlowRate( setDialysateFlowRate, MOTOR_DIR_FORWARD, mode ); setDialOutPumpTargetRate( setDialysateFlowRate + (S32)setUFRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); // Start Heparin pump as appropriate @@ -327,7 +327,7 @@ mode = PUMP_CONTROL_MODE_OPEN_LOOP; } #endif - setDialInPumpTargetFlowRate( setDialysateFlowRate, MOTOR_DIR_FORWARD, mode, 0.0F ); + setDialInPumpTargetFlowRate( setDialysateFlowRate, MOTOR_DIR_FORWARD, mode ); setDialOutPumpTargetRate( setDialysateFlowRate + (S32)setUFRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); } @@ -531,8 +531,6 @@ { result = TRUE; sendTreatmentLogEventData( UF_PAUSE_EVENT, setUFRate, 0.0 ); - // Set outlet pump to dialysate rate - setDialOutPumpTargetRate( setDialysateFlowRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); // Go to UF paused state currentUFState = UF_PAUSED_STATE; sendTreatmentLogEventData( UF_START_RESUME_EVENT, UF_RUNNING_STATE, UF_PAUSED_STATE ); @@ -582,8 +580,6 @@ { result = TRUE; sendTreatmentLogEventData( UF_START_RESUME_EVENT, 0.0, setUFRate ); - // Set outlet pump to dialysate rate + set UF rate - setDialOutPumpTargetRate( setDialysateFlowRate + (S32)setUFRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); // Restart UF time accumulation for reference volume calculation lastUFTimeStamp = getMSTimerCount(); // Go to UF running state @@ -627,6 +623,8 @@ *************************************************************************/ void execDialysis( void ) { + DIALYSIS_STATE_T priorSubState = currentDialysisState; + // Check ultrafiltration max rate and accuracy during dialysis (even when ultrafiltration is paused). checkUFAccuracyAndVolume(); @@ -650,6 +648,10 @@ break; } + if ( priorSubState != currentDialysisState ) + { + SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_STATE_CHANGE, priorSubState, currentDialysisState ); + } // Publish saline bolus data at set interval (whether we are delivering one or not) publishSalineBolusData(); } @@ -665,6 +667,7 @@ static DIALYSIS_STATE_T handleDialysisUltrafiltrationState( void ) { DIALYSIS_STATE_T result = DIALYSIS_UF_STATE; + UF_STATE_T priorSubState = currentUFState; U32 preStop = getTreatmentParameterU32( TREATMENT_PARAM_HEPARIN_PRE_STOP_TIME ); F32 minRem = (F32)getTreatmentTimeRemainingSecs() / (F32)SEC_PER_MIN; @@ -674,11 +677,6 @@ stopSyringePump(); setHeparinCompleted(); } - // TODO - find a better way to start continuous delivery after bolus completes - if ( HEPARIN_STATE_STOPPED == getHeparinState() ) - { - startHeparinPump(); - } // Handle current ultrafiltration state switch ( currentUFState ) @@ -701,6 +699,11 @@ break; } + if ( priorSubState != currentUFState ) + { + SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_STATE_CHANGE, priorSubState, currentUFState ); + } + return result; } @@ -716,6 +719,8 @@ { DIALYSIS_STATE_T result = DIALYSIS_SALINE_BOLUS_STATE; + SALINE_BOLUS_STATE_T priorSubState = currentSalineBolusState; + switch ( currentSalineBolusState ) { case SALINE_BOLUS_STATE_IDLE: @@ -740,6 +745,11 @@ break; } + if ( priorSubState != currentSalineBolusState ) + { + SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_STATE_CHANGE, priorSubState, currentSalineBolusState ); + } + return result; } @@ -867,7 +877,7 @@ salineBolusStartRequested = FALSE; // Cmd all pumps to stop setBloodPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); - setDialInPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP, 0.0F ); + setDialInPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); setDialOutPumpTargetRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); stopSyringePump(); // Begin saline bolus @@ -894,6 +904,7 @@ { // Reset bolus data before we start bolusSalineVolumeDelivered_mL = 0.0; + expectedSalineBolusVolume_mL = 0.0; bolusSalineLastVolumeTimeStamp = getMSTimerCount(); // Bypass dialyzer @@ -902,17 +913,9 @@ // Switch to saline bag setValvePosition( VBA, VALVE_POSITION_C_CLOSE ); // Start blood pump at saline bolus rate -#ifndef RUN_PUMPS_OPEN_LOOP setBloodPumpTargetFlowRate( SALINE_BOLUS_FLOW_RATE, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); -#else - setBloodPumpTargetFlowRate( SALINE_BOLUS_FLOW_RATE, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); -#endif // Start dialysate inlet pump at re-circ rate -#ifndef RUN_PUMPS_OPEN_LOOP - setDialInPumpTargetFlowRate( DIALYSATE_FLOW_RATE_FOR_RECIRC, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP, 0.0F ); -#else - setDialInPumpTargetFlowRate( DIALYSATE_FLOW_RATE_FOR_RECIRC, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP, 0.0F ); -#endif + setDialInPumpTargetFlowRate( DIALYSATE_FLOW_RATE_FOR_RECIRC, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); // Begin saline bolus result = SALINE_BOLUS_STATE_IN_PROGRESS; } @@ -936,7 +939,7 @@ F32 timeSinceLastVolumeUpdateMin = (F32)calcTimeSince( bolusSalineLastVolumeTimeStamp ) / (F32)( MS_PER_SECOND * SEC_PER_MIN ); F32 bolusTargetVolume = (F32)getTreatmentParameterU32( TREATMENT_PARAM_SALINE_BOLUS_VOLUME ); F32 maxBolusErrorMl = bolusTargetVolume * MAX_BOLUS_ERROR_PCT; - F32 bldFlowRate = getMeasuredBloodFlowRate(); // TODO - should I use raw flow instead of filtered here??? + F32 bldFlowRate = getMeasuredBloodFlowRate(); F32 volSinceLastUpdateMl = bldFlowRate * timeSinceLastVolumeUpdateMin; F32 expVolSinceLastUpdateMl = (F32)getTargetBloodFlowRate() * timeSinceLastVolumeUpdateMin; @@ -979,7 +982,7 @@ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PUMP_FLOW_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) #endif { - activateAlarmNoData( ALARM_ID_SALINE_BOLUS_VOLUME_CHECK_FAILURE ); + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_SALINE_BOLUS_VOLUME_CHECK_FAILURE, bolusSalineVolumeDelivered_mL, expectedSalineBolusVolume_mL ); errorFound = TRUE; result = SALINE_BOLUS_STATE_IDLE; } @@ -1246,29 +1249,34 @@ { F32 loadCellPrimaryWeight, loadCellBackupWeight; F32 loadCellPreviousDrift, loadCellCurrentDrift; - F32 driftDiff = 0.0; + F32 driftDiff = 0.0F; U16 lcPrimaryIndex, lcBackupIndex; + HD_EVENT_ID_T event; if ( DG_RESERVOIR_1 == reservoirID ) { lcPrimaryIndex = LOAD_CELL_RESERVOIR_1_PRIMARY; - lcBackupIndex = LOAD_CELL_RESERVOIR_1_BACKUP; + lcBackupIndex = LOAD_CELL_RESERVOIR_1_BACKUP; + event = ( RESERVOIR_STEADY_CYCLE_START == cycle ? HD_EVENT_RSRVR_1_LOAD_CELL_START_VALUES : HD_EVENT_RSRVR_1_LOAD_CELL_END_VALUES ); } else { lcPrimaryIndex = LOAD_CELL_RESERVOIR_2_PRIMARY; - lcBackupIndex = LOAD_CELL_RESERVOIR_2_BACKUP; + lcBackupIndex = LOAD_CELL_RESERVOIR_2_BACKUP; + event = ( RESERVOIR_STEADY_CYCLE_START == cycle ? HD_EVENT_RSRVR_2_LOAD_CELL_START_VALUES : HD_EVENT_RSRVR_2_LOAD_CELL_END_VALUES ); } loadCellPrimaryWeight = getReservoirWeightLargeFilter( reservoirID ); loadCellBackupWeight = getReservoirBackupWeightLargeFilter( reservoirID ); loadCellCurrentDrift = loadCellPrimaryWeight - loadCellBackupWeight; + SEND_EVENT_WITH_2_F32_DATA( event, loadCellPrimaryWeight, loadCellBackupWeight ) + if ( ( RESERVOIR_STEADY_CYCLE_FINAL == cycle ) && ( lcLastSteadyWeight[ RESERVOIR_STEADY_CYCLE_START ][ lcPrimaryIndex ] > ( LOAD_CELL_ILLEGAL_WEIGHT_VALUE + 1 ) ) ) { // Start Weight has been previously saved, ok to test loadCellPreviousDrift = lcLastSteadyWeight[ RESERVOIR_STEADY_CYCLE_START ][ lcPrimaryIndex ] - lcLastSteadyWeight[ RESERVOIR_STEADY_CYCLE_START ][ lcBackupIndex ]; - driftDiff = fabs ( loadCellCurrentDrift - loadCellPreviousDrift ); + driftDiff = fabs ( loadCellCurrentDrift - loadCellPreviousDrift ); } // Save latest reading for next test time lcLastSteadyWeight[ cycle ][ lcPrimaryIndex ] = loadCellPrimaryWeight;