Index: dialin/common/alarm_defs.py =================================================================== diff -u -rd653a36e16148f5877dab6ff4cfeb24920e0990e -r8521df172e2d7a82d880e96ae21d7c146e3e2b64 --- dialin/common/alarm_defs.py (.../alarm_defs.py) (revision d653a36e16148f5877dab6ff4cfeb24920e0990e) +++ dialin/common/alarm_defs.py (.../alarm_defs.py) (revision 8521df172e2d7a82d880e96ae21d7c146e3e2b64) @@ -213,7 +213,7 @@ ALARM_ID_DG_DRAIN_PUMP_OFF_FAULT = 190 ALARM_ID_DG_FLOW_RATE_OUT_OF_UPPER_RANGE = 191 ALARM_ID_DG_FLOW_RATE_OUT_OF_LOWER_RANGE = 192 - ALARM_ID_AVAILABLE_5 = 193 + ALARM_ID_HD_PARTIAL_OCCLUSION_BLOOD_PUMP = 193 ALARM_ID_DG_RO_PUMP_DUTY_CYCLE_OUT_OF_RANGE = 194 ALARM_ID_DG_RO_PUMP_PRESSURE_OUT_OF_RANGE = 195 ALARM_ID_DG_CPI_CPO_SENSORS_FPGA_FAULT = 196 Index: dialin/common/hd_defs.py =================================================================== diff -u -r1f6af0afb3388e3a491e1446f336fff9997a3dba -r8521df172e2d7a82d880e96ae21d7c146e3e2b64 --- dialin/common/hd_defs.py (.../hd_defs.py) (revision 1f6af0afb3388e3a491e1446f336fff9997a3dba) +++ dialin/common/hd_defs.py (.../hd_defs.py) (revision 8521df172e2d7a82d880e96ae21d7c146e3e2b64) @@ -364,7 +364,9 @@ HD_EVENT_BLOOD_LEAK_SELF_TEST_RESULT = 26 # HD Blood leak self test result. HD_EVENT_BLOOD_LEAK_NUM_OF_SET_POINT_CHECK_FAILURES = 27 # HD blood leak number of setpoint check failures HD_EVENT_DRY_SELF_TEST_PRESSURE_DECAY_WAIT_PERIOD = 28 # HD dry self test pressure decay wait period - NUM_OF_EVENT_IDS = 29 # Total number of HD events + HD_EVENT_INSTIT_RECORD_UPDATE = 29 # HD new institutional record has been updated. + HD_EVENT_PARTIAL_OCCLUSION_BASELINE = 30 # HD event partial occlusion baseline event + NUM_OF_EVENT_IDS = 31 # Total number of HD events @unique class HDEventDataType(DialinEnum): Index: dialin/common/msg_defs.py =================================================================== diff -u -rcc8a08ba970da928777664b796d199414061ad65 -r8521df172e2d7a82d880e96ae21d7c146e3e2b64 --- dialin/common/msg_defs.py (.../msg_defs.py) (revision cc8a08ba970da928777664b796d199414061ad65) +++ dialin/common/msg_defs.py (.../msg_defs.py) (revision 8521df172e2d7a82d880e96ae21d7c146e3e2b64) @@ -125,15 +125,15 @@ REQUEST_REJECT_REASON_SALINE_BOLUS_IN_PROGRESS = 16 REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE = 17 REQUEST_REJECT_REASON_HEPARIN_PRESTOP_EXCEEDS_DURATION = 18 - REQUEST_REJECT_REASON_ARTERIAL_PRESSURE_LOW_VS_HIGH = 19 - REQUEST_REJECT_REASON_VENOUS_PRESSURE_LOW_VS_HIGH = 20 + REQUEST_REJECT_REASON_DG_FILTER_FLUSH_HAS_BEEN_EXPIRED = 19 + REQUEST_REJECT_REASON_AVAILABLE_2 = 20 REQUEST_REJECT_REASON_SALINE_MAX_VOLUME_REACHED = 21 REQUEST_REJECT_REASON_SALINE_BOLUS_NOT_IN_PROGRESS = 22 REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE = 23 REQUEST_REJECT_REASON_ALARM_IS_ACTIVE = 24 REQUEST_REJECT_REASON_INVALID_COMMAND = 25 REQUEST_REJECT_REASON_TREATMENT_IS_COMPLETED = 26 - REQUEST_REJECT_REASON_RINSEBACK_MAX_VOLUME_REACHED = 27 + REQUEST_REJECT_REASON_ADDL_RINSEBACK_MAX_VOLUME_REACHED = 27 REQUEST_REJECT_REASON_DIALYZER_NOT_INVERTED = 28 REQUEST_REJECT_REASON_NO_PATIENT_CONNECTION_CONFIRM = 29 REQUEST_REJECT_REASON_HEPARIN_PAUSE_INVALID_IN_THIS_STATE = 30 Index: dialin/common/msg_ids.py =================================================================== diff -u -r0f2706175dc86651605a7c74126c9fea13f7f7d0 -r8521df172e2d7a82d880e96ae21d7c146e3e2b64 --- dialin/common/msg_ids.py (.../msg_ids.py) (revision 0f2706175dc86651605a7c74126c9fea13f7f7d0) +++ dialin/common/msg_ids.py (.../msg_ids.py) (revision 8521df172e2d7a82d880e96ae21d7c146e3e2b64) @@ -205,7 +205,7 @@ MSG_ID_HD_DG_SERVICE_MODE_REQUEST = 0xB6 MSG_ID_DG_RTC_EPOCH_DATA = 0xB7 MSG_ID_HD_DG_USAGE_INFO_REQUEST = 0xB8 - MSG_ID_MSG_AVAILABLE_9 = 0xB9 + MSG_ID_UI_HD_RESET_IN_SERVICE_MODE_REQUEST = 0xB9 MSG_ID_HD_UI_CONFIRMATION_REQUEST = 0xBA MSG_ID_UI_CONFIRMATION_RESULT_RESPONSE = 0xBB MSG_ID_UI_SET_DG_RO_MODE = 0xBC @@ -391,6 +391,8 @@ MSG_ID_HD_GET_INSTITUTIONAL_RECORD = 0x809E MSG_ID_HD_SET_INSTITUTIONAL_RECORD = 0x809F MSG_ID_HD_SEND_INSTITUTIONAL_RECORD = 0x80A0 + MSG_ID_HD_PARTIAL_OCCLUSION_BLOOD_PUMP_OVERRIDE = 0x80A1 + MSG_ID_HD_PARTIAL_OCCL_BLOOD_PUMP_BASELINE_OVERRIDE = 0x80A2 MSG_ID_DG_TESTER_LOGIN_REQUEST = 0xA000 MSG_ID_DG_ALARM_STATE_OVERRIDE = 0xA001 Index: dialin/hd/institutional_record.py =================================================================== diff -u -rcc8a08ba970da928777664b796d199414061ad65 -r8521df172e2d7a82d880e96ae21d7c146e3e2b64 --- dialin/hd/institutional_record.py (.../institutional_record.py) (revision cc8a08ba970da928777664b796d199414061ad65) +++ dialin/hd/institutional_record.py (.../institutional_record.py) (revision 8521df172e2d7a82d880e96ae21d7c146e3e2b64) @@ -56,7 +56,7 @@ _DEFAULT_MAX_HEPARIN_DISP_RATE_MLPHR = 1.0 _DEFAULT_MIN_HEPARIN_BOLUS_VOLUME_ML = 0.0 _DEFAULT_MAX_HEPARIN_BOLUS_VOLUME_ML = 2.0 - _DEFAULT_ENABLE_CHEM_DISINFECT = 1 + _DEFAULT_ENABLE_CHEM_DISINFECT = 0 _RECORD_SPECS_BYTES = 12 _DEFAULT_TIME_VALUE = 0 Index: dialin/hd/pressure_occlusion.py =================================================================== diff -u -r1f6af0afb3388e3a491e1446f336fff9997a3dba -r8521df172e2d7a82d880e96ae21d7c146e3e2b64 --- dialin/hd/pressure_occlusion.py (.../pressure_occlusion.py) (revision 1f6af0afb3388e3a491e1446f336fff9997a3dba) +++ dialin/hd/pressure_occlusion.py (.../pressure_occlusion.py) (revision 8521df172e2d7a82d880e96ae21d7c146e3e2b64) @@ -55,6 +55,8 @@ self.arterial_pressure_limit_max = 0 self.venous_pressure_limit_min = 0 self.venous_pressure_limit_max = 0 + self.blood_pump_occlusion_long_filter = 0.0 + self.partial_occlusion_baseline = 0.0 def get_arterial_pressure(self): """ @@ -97,8 +99,20 @@ def get_pressure_limits_state(self): """ Gets the current pressure limits state. + Pressure states: + PRESSURE_LIMITS_STATE_OFF = 0 Off - not pressure low/high alarms will be detected) + PRESSURE_LIMITS_STATE_IDLE = 1 Idle - in Treatment mode state where BP is stopped - no pressure low/high alarms + PRESSURE_LIMITS_STATE_WIDE = 2 Wide - in Treatment mode state where BP is running but wide limits apply + PRESSURE_LIMITS_STATE_STABILIZATION = 3 Stabilization - in Treatment mode state where BP is running (dialysis + or stop), but need to stabilize first + PRESSURE_LIMITS_STATE_STABILIZATION_2 = 4 Second stage stabilization - re adjust the pressure that has been + drifted due to UF control etc and limit + windows apply + PRESSURE_LIMITS_STATE_STABLE = 5 Stable - in Treatment mode state where BP is running (dialysis or stop) and + limit windows apply - @return: (int) The pressure limits state (0=stabilization, 1=stable) + + @return: (int) The pressure limits state """ return self.pressure_limits_state @@ -134,6 +148,22 @@ """ return self.venous_pressure_limit_max + def get_filtered_blood_pump_occlusion(self): + """ + Gets the filtered blood pump occlusion + + @return: (float) The filtered blood pump occlusion + """ + return self.blood_pump_occlusion_long_filter + + def get_partial_blood_pump_occlusion_baseline(self): + """ + Gets the partial blood pump occlusion baseline + + @return: (float) The partial blood pump occlusion baseline + """ + return self.partial_occlusion_baseline + @publish([ "hd_pressure_occlusion_timestamp", "arterial_pressure", @@ -145,7 +175,9 @@ "venous_pressure_limit_min", "venous_pressure_limit_max", "arterial_long_filtered_pressure", - "venous_long_filtered_pressure" + "venous_long_filtered_pressure", + "blood_pump_occlusion_long_filter", + "partial_occlusion_blood_pump_baseline" ]) def _handler_pressure_occlusion_sync(self, message, timestamp=0.0): """ @@ -176,6 +208,10 @@ message['message'][MsgFieldPositions.START_POS_FIELD_9:MsgFieldPositions.END_POS_FIELD_9])) lfv = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_10:MsgFieldPositions.END_POS_FIELD_10])) + fbp = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_11:MsgFieldPositions.END_POS_FIELD_11])) + pob = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_12:MsgFieldPositions.END_POS_FIELD_12])) self.arterial_pressure = art[0] self.venous_pressure = ven[0] @@ -187,6 +223,8 @@ self.venous_pressure_limit_max = vpu[0] self.arterial_long_filtered_pressure = lfa[0] self.venous_long_filtered_pressure = lfv[0] + self.blood_pump_occlusion_long_filter = fbp[0] + self.partial_occlusion_baseline = pob[0] self.hd_pressure_occlusion_timestamp = timestamp def cmd_arterial_pressure_measured_override(self, pres: float, filtered: bool = False, reset: int = NO_RESET) -> int: @@ -308,6 +346,82 @@ self.logger.debug("Timeout!!!!") return False + def cmd_filtered_blood_pump_measured_occlusion_override(self, filtered_occl: float, reset: int = NO_RESET) -> int: + """ + Constructs and sends the measured filtered blood pump occlusion pressure override command + Constraints: + Must be logged into HD. + + @param filtered_occl: float - pressure (in counts) to override with + @param reset: integer - 1 to reset a previous override, 0 to override + @return: 1 if successful, zero otherwise + """ + + rst = integer_to_bytearray(reset) + occ = float_to_bytearray(filtered_occl) + payload = rst + occ + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_HD_PARTIAL_OCCLUSION_BLOOD_PUMP_OVERRIDE.value, + payload=payload) + + self.logger.debug("override measured filtered blood pump occlusion pressure") + + # Send message + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + if reset == RESET: + str_res = "reset back to normal. " + else: + str_res = str(filtered_occl) + self.logger.debug("Filtered Blood pump occlusion pressure (measured) overridden to " + str_res + + str(received_message['message'][DenaliMessage.PAYLOAD_START_INDEX])) + # response payload is OK or not OK + return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] + else: + self.logger.debug("Timeout!!!!") + return False + + def cmd_blood_pump_measured_partial_occlusion_baseline_override(self, partial_occl_baseline: float, reset: int = NO_RESET) -> int: + """ + Constructs and sends the partial blood pump occlusion pressure baseline override command + Constraints: + Must be logged into HD. + + @param partial_occl_baseline: float - partial blood pump occlusion baseline override with + @param reset: integer - 1 to reset a previous override, 0 to override + @return: 1 if successful, zero otherwise + """ + + rst = integer_to_bytearray(reset) + occ_bl = float_to_bytearray(partial_occl_baseline) + payload = rst + occ_bl + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_HD_PARTIAL_OCCL_BLOOD_PUMP_BASELINE_OVERRIDE.value, + payload=payload) + + self.logger.debug("override partial blood pump occlusion baseline pressure") + + # Send message + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + if reset == RESET: + str_res = "reset back to normal. " + else: + str_res = str(partial_occl_baseline) + self.logger.debug(" Partial Blood pump occlusion baseline pressure overridden to " + str_res + + str(received_message['message'][DenaliMessage.PAYLOAD_START_INDEX])) + # response payload is OK or not OK + return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] + else: + self.logger.debug("Timeout!!!!") + return False + def cmd_pressure_occlusion_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the pressure/occlusion broadcast interval override command