Index: firmware/App/Controllers/DGInterface.c =================================================================== diff -u -r5ce2656c662525e10acd1e55f16f7aca5ce9b4d6 -r0339d8357ff90e6540ec4420b536336e8c2bc6ea --- firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision 5ce2656c662525e10acd1e55f16f7aca5ce9b4d6) +++ firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision 0339d8357ff90e6540ec4420b536336e8c2bc6ea) @@ -235,7 +235,7 @@ void execDGInterfaceMonitor( void ) { // Trigger alarm if not receiving new load cell data message in timely manner - checkDGDataFreshness( ALARM_ID_HD_NEW_LOAD_CELL_DATA_MESSAGE_NOT_RECEIVE, &dgLoadCellDataFreshFlag ); + /*checkDGDataFreshness( ALARM_ID_HD_NEW_LOAD_CELL_DATA_MESSAGE_NOT_RECEIVE, &dgLoadCellDataFreshFlag ); // Trigger alarm if not receiving new dialysate temperature data message in timely manner checkDGDataFreshness( ALARM_ID_HD_NEW_DIALYSATE_TEMPERATURE_DATA_MESSAGE_NOT_RECEIVE, &dgDialysateTemperatureDataFreshFlag ); @@ -246,7 +246,7 @@ // Trigger alarm if not receiving new DG op mode message in timely manner checkDGDataFreshness( ALARM_ID_HD_NEW_DG_OPERATION_MODE_MESSAGE_NOT_RECEIVE, &dgOpModeDataFreshFlag ); - // Check to see if DG has restarted + // Check to see if DG has restarted*/ checkDGRestart(); // Check the status of the trimmer heater @@ -452,26 +452,26 @@ /*********************************************************************//** * @brief - * The getDialysateTemperature function gets the latest dialysate temperature. - * @details Inputs: dgDialysateTemp + * The getDGDisinfectsStates function returns the DG disinfects readings. + * @details Inputs: none * @details Outputs: none - * @return the current dialysate temperature + * @return the current DG disinfects readings *************************************************************************/ -F32 getDialysateTemperature( void ) +DG_DISINFECT_UI_STATES_T getDGDisinfectsStates( void ) { - return dgDialysateTemp; + return disinfectsStatus; } /*********************************************************************//** * @brief - * The getDGDisinfectsStates function returns the DG disinfects readings. - * @details Inputs: none + * The getDialysateTemperature function gets the latest dialysate temperature. + * @details Inputs: dgDialysateTemp * @details Outputs: none - * @return the current DG disinfects readings + * @return the current dialysate temperature *************************************************************************/ -DG_DISINFECT_UI_STATES_T getDGDisinfectsStates( void ) +F32 getDialysateTemperature( void ) { - return disinfectsStatus; + return dgDialysateTemp; } /*********************************************************************//** Index: firmware/App/Controllers/DialInFlow.c =================================================================== diff -u -rdecd87eaf64e68ee4690c046f48ae47977928729 -r0339d8357ff90e6540ec4420b536336e8c2bc6ea --- firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision decd87eaf64e68ee4690c046f48ae47977928729) +++ firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 0339d8357ff90e6540ec4420b536336e8c2bc6ea) @@ -74,6 +74,7 @@ /// Persist time (task intervals) for flow vs. motor speed error condition. static const U32 DIP_FLOW_VS_SPEED_PERSIST = ((5 * MS_PER_SECOND) / TASK_PRIORITY_INTERVAL); +//static const U32 DIP_FLOW_VS_SPEED_PERSIST = ((60 * MS_PER_SECOND) / TASK_PRIORITY_INTERVAL); //DN-03NOV2022 - Make it 1 minutes for testing /// Persist time (task intervals) for motor off error condition. static const U32 DIP_OFF_ERROR_PERSIST = ((5 * MS_PER_SECOND) / TASK_PRIORITY_INTERVAL); /// Persist time (task intervals) motor speed error condition. Index: firmware/App/Controllers/SyringePump.c =================================================================== diff -u -r5ce2656c662525e10acd1e55f16f7aca5ce9b4d6 -r0339d8357ff90e6540ec4420b536336e8c2bc6ea --- firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 5ce2656c662525e10acd1e55f16f7aca5ce9b4d6) +++ firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 0339d8357ff90e6540ec4420b536336e8c2bc6ea) @@ -93,6 +93,7 @@ /// Expected position of empty in relation to home position. #define SYRINGE_PUMP_EMPTY_POS ( SYRINGE_ENCODER_COUNTS_PER_ML * 10.84F ) + /// Margin of error for empty position determination. #define SYRINGE_PUMP_EMPTY_POS_MARGIN ( SYRINGE_ENCODER_COUNTS_PER_ML * 0.5F ) /// Minimum retract position. @@ -156,8 +157,10 @@ #define SYRINGE_PUMP_STALL_SPEED_THRESHOLD 0.05F ///< Minimum syringe pump speed to be considered not stalled. #define SYRINGE_PUMP_ADC_FPGA_ERROR_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< Syringe pump ADC FPGA error timeout in milliseconds. + #define SYRINGE_PUMP_DAC_MAX_RETRIES 5 ///< Syringe pump DAC retries to write. #define SYRINGE_PUMP_DAC_TIMER ( 200 / TASK_PRIORITY_INTERVAL ) ///< Syringe pump DAC timer between retries. + /// Defined states for the syringe pump control state machine. typedef enum SyringePump_States { Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r5ce2656c662525e10acd1e55f16f7aca5ce9b4d6 -r0339d8357ff90e6540ec4420b536336e8c2bc6ea --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 5ce2656c662525e10acd1e55f16f7aca5ce9b4d6) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 0339d8357ff90e6540ec4420b536336e8c2bc6ea) @@ -629,8 +629,7 @@ signalBloodPumpHardStop(); signalDialOutPumpHardStop(); - //setDialInPumpTargetFlowRate( DIP_PATIENT_CONNECTION_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - setDialInPumpTargetFlowRate( 250, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); // TODO remove this line once the new flow control is implemented + setDialInPumpTargetFlowRate( DIP_PATIENT_CONNECTION_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); cmdStartDGTrimmerHeater(); } @@ -1178,6 +1177,7 @@ rsrvrCmd.reservoirID = (U32)DG_RESERVOIR_1; rsrvrCmd.useLastTrimmerHeaterDC = FALSE; reservoirFlushedStatus[ DG_RESERVOIR_1 ] = TRUE; + cmdSetDGActiveReservoir( &rsrvrCmd ); } } @@ -1188,6 +1188,7 @@ rsrvrCmd.reservoirID = (U32)DG_RESERVOIR_2; rsrvrCmd.useLastTrimmerHeaterDC = FALSE; reservoirFlushedStatus[ DG_RESERVOIR_2 ] = TRUE; + cmdSetDGActiveReservoir( &rsrvrCmd ); } } Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r5ce2656c662525e10acd1e55f16f7aca5ce9b4d6 -r0339d8357ff90e6540ec4420b536336e8c2bc6ea --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 5ce2656c662525e10acd1e55f16f7aca5ce9b4d6) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 0339d8357ff90e6540ec4420b536336e8c2bc6ea) @@ -66,6 +66,7 @@ static OVERRIDE_U32_T standbyModePublishInterval = { DISINFECTS_DATA_PUB_INTERVAL, DISINFECTS_DATA_PUB_INTERVAL, DISINFECTS_DATA_PUB_INTERVAL, 0 }; static const U32 SERVICE_TIME_INTERVAL_S = (U32)( 365 * 0.5 * SECONDS_IN_A_DAY ); ///< HD/DG 6-month service interval in seconds. +static BOOL homingInitiated; ///< Flag indicates actuator homing has been initiated from standby mode. // ********** private function prototypes ********** @@ -109,6 +110,7 @@ heatDisinfectStartReqReceived = FALSE; chemDisinfectStartReqReceived = FALSE; disinfectCancelReqID = GENERIC_CONFIRM_ID_NONE; + homingInitiated = FALSE; dgDisinfectState = DG_DISINFECT_NOT_RUNNING_STATE; homingInitiated = FALSE; } Index: firmware/App/Modes/Prime.c =================================================================== diff -u -r5ce2656c662525e10acd1e55f16f7aca5ce9b4d6 -r0339d8357ff90e6540ec4420b536336e8c2bc6ea --- firmware/App/Modes/Prime.c (.../Prime.c) (revision 5ce2656c662525e10acd1e55f16f7aca5ce9b4d6) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision 0339d8357ff90e6540ec4420b536336e8c2bc6ea) @@ -61,6 +61,8 @@ #define STEADY_VOLUME_COUNT_SEC ( 10000 / LOAD_CELL_STEADY_VOLUME_SAMPLING_TIME ) ///< Counter must be greater than 10 seconds before steady volume is true. #define STEADY_VOLUME_TIME_DEADLINE_MS ( 55 * MS_PER_SECOND ) ///< Time in msec for the steady volume deadline time out. +#define VENOUS_PRESSURE_BUBBLE_CLEAR_MAX_MMHG ( 200.0F ) ///< Maximum arterial pressure reading (in mmHg) for bubble clear. + /// States of the treatment reservoir management state machine. typedef enum PrimeReservoirMgmt_States { @@ -110,6 +112,7 @@ static U32 noAirDetectedStartTime; ///< starting time when detecting no air. static U32 purgeAirTimeOutStartTime; ///< Starting time for purge air state time out. static U32 primeSalineDialyzerStartTime; ///< Starting time of priming saline dialyzer circuit. +static U32 primeSalineDialyzerBubbleClearStartTime; ///< Starting time of priming saline dialyzer bubble clear. static U32 primeDialysateDialyzerStartTime; ///< Starting time of priming dialysate dialyzer circuit. static U32 primeDialysateBypassStartTime; ///< Starting time of priming dialysate bypass circuit. static U32 steadyVolumeSamplingStartTime; ///< Load cell steady volume sampling interval starting time. @@ -719,6 +722,7 @@ primeSalineDialyzerTimeLimit = (U32)( ( ( dialyzerDialysateVolume * DIALYZER_VOLUME_SCALE_FACTOR + DIALYZER_DVI_PATH_VOLUME_ML ) * SEC_PER_MIN * MS_PER_SECOND ) / BLOOD_PUMP_FLOW_RATE_SALINE_DIALYZER_ML_MIN ); primeSalineDialyzerStartTime = getMSTimerCount(); + primeSalineDialyzerBubbleClearStartTime = getMSTimerCount(); if ( TRUE == doesAlarmStatusIndicateStop() ) { @@ -739,8 +743,24 @@ *************************************************************************/ static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeSalineDialyzerState( void ) { + static BOOL bubbleClearActive = FALSE; + HD_PRE_TREATMENT_PRIME_STATE_T state = HD_PRIME_SALINE_DIALYZER_STATE; + // Close valve 4-5 times to create pressure to clear Dialyzer bubbles + if ( TRUE == didTimeout( primeSalineDialyzerBubbleClearStartTime, ( primeSalineDialyzerTimeLimit / 5 ) ) ) + { + primeSalineDialyzerBubbleClearStartTime = getMSTimerCount(); + setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); + bubbleClearActive = TRUE; + } + // TODO - could also check for valve closed too long here (maybe > 2sec) in case not opening based on pressure + if ( ( TRUE == bubbleClearActive ) && ( getMeasuredVenousPressure() > VENOUS_PRESSURE_BUBBLE_CLEAR_MAX_MMHG ) ) + { + // Pressure max reached, release pressure + setValvePosition( VDI, VALVE_POSITION_A_INSERT_EJECT ); + bubbleClearActive = FALSE; + } if ( TRUE == didTimeout( primeSalineDialyzerStartTime, primeSalineDialyzerTimeLimit ) ) { state = HD_PRIME_RESERVOIR_TWO_FILL_COMPLETE_STATE; Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -r5ce2656c662525e10acd1e55f16f7aca5ce9b4d6 -r0339d8357ff90e6540ec4420b536336e8c2bc6ea --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 5ce2656c662525e10acd1e55f16f7aca5ce9b4d6) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 0339d8357ff90e6540ec4420b536336e8c2bc6ea) @@ -354,7 +354,7 @@ } else { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_NO_CART_SELF_TEST_TIMEOUT, currentNoCartSelfTestsState ); +// SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_NO_CART_SELF_TEST_TIMEOUT, currentNoCartSelfTestsState ); } } } @@ -1312,8 +1312,8 @@ { if ( TRUE == isSyringePumpPrimed() ) { + syringeOcclusionDelayStartTime = getMSTimerCount(); // Get the current time to check for occlusion after 1 second has elapsed state = DRY_SELF_TESTS_SYRINGE_PUMP_OCCLUSION_DETECTION_STATE; - syringeOcclusionDelayStartTime = getMSTimerCount(); // Get the current time to check for occlusion after 3 seconds has elapsed } else {