Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -r6ba3eebfe02e3918402e30e0bd775bcfbcb06443 -r1f91b5a53bda942b0967817bbd5e68a499dbf816 --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 6ba3eebfe02e3918402e30e0bd775bcfbcb06443) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 1f91b5a53bda942b0967817bbd5e68a499dbf816) @@ -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) Dara Navaei -* @date (last) 25-Aug-2022 +* @author (last) Michael Garthwaite +* @date (last) 19-Jan-2023 * * @author (original) Sean * @date (original) 15-Jan-2020 @@ -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; @@ -701,6 +704,11 @@ break; } + if ( priorSubState != currentUFState ) + { + SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_STATE_CHANGE, priorSubState, currentUFState ); + } + return result; } @@ -716,6 +724,8 @@ { DIALYSIS_STATE_T result = DIALYSIS_SALINE_BOLUS_STATE; + SALINE_BOLUS_STATE_T priorSubState = currentSalineBolusState; + switch ( currentSalineBolusState ) { case SALINE_BOLUS_STATE_IDLE: @@ -740,6 +750,11 @@ break; } + if ( priorSubState != currentSalineBolusState ) + { + SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_STATE_CHANGE, priorSubState, currentSalineBolusState ); + } + return result; } @@ -902,17 +917,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 ); -#else - setDialInPumpTargetFlowRate( DIALYSATE_FLOW_RATE_FOR_RECIRC, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP); -#endif // Begin saline bolus result = SALINE_BOLUS_STATE_IN_PROGRESS; } @@ -1246,29 +1253,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;