Index: dialin/common/alarm_defs.py =================================================================== diff -u -rf89093ee0f0b9159df2ae4e0b86971f0e0e1b448 -rcd3313bfafed2f2a1e43cf2591f1248db23d0b88 --- dialin/common/alarm_defs.py (.../alarm_defs.py) (revision f89093ee0f0b9159df2ae4e0b86971f0e0e1b448) +++ dialin/common/alarm_defs.py (.../alarm_defs.py) (revision cd3313bfafed2f2a1e43cf2591f1248db23d0b88) @@ -8,9 +8,9 @@ # @file alarm_defs.py # # @author (last) Peter Lucia -# @date (last) 23-Apr-2021 +# @date (last) 03-May-2021 # @author (original) Peter Lucia -# @date (original) 23-Apr-2021 +# @date (original) 03-May-2021 # ############################################################################ from enum import unique @@ -204,3 +204,12 @@ ALARM_ID_DIALYSATE_TEMPERATURE_HIGH = 182 ALARM_ID_DIALYSATE_TEMPERATURE_LOW = 183 ALARM_ID_DG_VOLTAGE_OUT_OF_RANGE = 184 + ALARM_ID_DG_DRAIN_CIRCULATION_LINE_TIMEOUT = 185 + ALARM_ID_DG_INVALID_LOAD_CELL_VALUE = 186 + ALARM_ID_HD_SYRINGE_PUMP_ENCODER_DIRECTION_ERROR = 187 + ALARM_ID_HD_SYRINGE_PUMP_CONTROLLER_DIRECTION_ERROR = 188 + ALARM_ID_HD_SYRINGE_PUMP_FAULT = 189 + ALARM_ID_HD_SYRINGE_PUMP_OVER_TRAVEL_ERROR = 190 + ALARM_ID_HD_SYRINGE_PUMP_NOT_ENOUGH_HEPARIN_ALARM = 191 + ALARM_ID_HD_SYRINGE_PUMP_DAC_WRITE_ERROR = 192 + ALARM_ID_HD_SYRINGE_PUMP_RUNNING_WHILE_BP_OFF_ERROR = 193 Index: dialin/common/msg_ids.py =================================================================== diff -u -rf89093ee0f0b9159df2ae4e0b86971f0e0e1b448 -rcd3313bfafed2f2a1e43cf2591f1248db23d0b88 --- dialin/common/msg_ids.py (.../msg_ids.py) (revision f89093ee0f0b9159df2ae4e0b86971f0e0e1b448) +++ dialin/common/msg_ids.py (.../msg_ids.py) (revision cd3313bfafed2f2a1e43cf2591f1248db23d0b88) @@ -8,9 +8,9 @@ # @file msg_ids.py # # @author (last) Peter Lucia -# @date (last) 23-Apr-2021 +# @date (last) 03-May-2021 # @author (original) Peter Lucia -# @date (original) 23-Apr-2021 +# @date (original) 03-May-2021 # ############################################################################ from enum import unique @@ -132,7 +132,7 @@ MSG_ID_UI_TREATMENT_LOG_DATA_REQUEST = 0X75 MSG_ID_HD_TREATMENT_LOG_DATA_RESPONSE = 0X76 MSG_ID_HD_POST_TREATMENT_STATE = 0X77 - MSG_ID___AVAILABLE_16 = 0X78 + MSG_ID_DG_START_STOP_CHEM_DISINFECT = 0X78 MSG_ID_DG_START_STOP_FLUSH = 0X79 MSG_ID_DG_FLUSH_DATA = 0X7A MSG_ID_HD_VOLTAGES_DATA = 0X7B @@ -225,7 +225,13 @@ MSG_ID_HD_ALARM_AUDIO_CURRENT_HG_OVERRIDE = 0X8054 MSG_ID_HD_ALARM_AUDIO_CURRENT_LG_OVERRIDE = 0X8055 MSG_ID_HD_ALARM_BACKUP_AUDIO_CURRENT_OVERRIDE = 0X8056 + MSG_ID_HD_VALVES_CURRENT_OVERRIDE = 0X8057 + MSG_ID_HD_SYRINGE_PUMP_STATUS_OVERRIDE = 0X8059 + MSG_ID_HD_SYRINGE_PUMP_ENCODER_STATUS_OVERRIDE = 0X805A + MSG_ID_HD_SYRINGE_PUMP_ADC_DAC_STATUS_OVERRIDE = 0X805B + MSG_ID_HD_SYRINGE_PUMP_ADC_READ_COUNTER_OVERRIDE = 0X805C MSG_ID_DG_VOLTAGES_DATA = 0X86 + MSG_ID_DG_CHEM_DISINFECT_DATA = 0X87 MSG_ID_PRESSURE_OCCLUSION_DATA = 0X9 MSG_ID_CAN_ERROR_COUNT = 0X999 MSG_ID_RTC_EPOCH = 0XA @@ -260,7 +266,7 @@ MSG_ID___AVAILABLE_13 = 0XA01E MSG_ID___AVAILABLE_14 = 0XA01F MSG_ID___AVAILABLE_15 = 0XA020 - MSG_ID_HEAT_DISINFECT_PUBLISH_INTERVAL_OVERRIDE = 0XA021 + MSG_ID___AVAILABLE_16 = 0XA021 MSG_ID_DG_SOFTWARE_RESET_REQUEST = 0XA022 MSG_ID_DG_CONCENTRATE_PUMP_MEASURED_SPEED_OVERRIDE = 0XA023 MSG_ID_CONCENTRATE_PUMP_TARGET_SPEED_OVERRIDE = 0XA024 Index: dialin/hd/syringe_pump.py =================================================================== diff -u -re75b8c0ebfdb35c2fc1fb2a66edf30ed1d23ada9 -rcd3313bfafed2f2a1e43cf2591f1248db23d0b88 --- dialin/hd/syringe_pump.py (.../syringe_pump.py) (revision e75b8c0ebfdb35c2fc1fb2a66edf30ed1d23ada9) +++ dialin/hd/syringe_pump.py (.../syringe_pump.py) (revision cd3313bfafed2f2a1e43cf2591f1248db23d0b88) @@ -55,6 +55,10 @@ self.syringe_pump_home_v = 0.0 self.syringe_pump_switch_v = 0.0 self.syringe_pump_force_v = 0.0 + self.syringe_pump_status = 0 + self.syringe_pump_encoder_status = 0 + self.syringe_pump_adc_dac_status = 0 + self.syringe_pump_adc_read_counter = 0 def get_syringe_pump_state(self): """ @@ -151,6 +155,38 @@ """ return self.syringe_pump_safety_volume_ml + def get_syringe_pump_status(self): + """ + Gets the current syringe pump status + + @return: latest published syringe pump status by HD firmware + """ + return self.syringe_pump_status + + def get_syringe_pump_encoder_status(self): + """ + Gets the current syringe pump encoder status + + @return: latest published syringe pump encoder status by HD firmware + """ + return self.syringe_pump_encoder_status + + def get_syringe_pump_adc_dac_status(self): + """ + Gets the current syringe pump ADC & DAC status + + @return: latest published syringe pump ADC & DAC status by HD firmware + """ + return self.syringe_pump_adc_dac_status + + def get_syringe_pump_adc_read_counter(self): + """ + Gets the current syringe pump ADC read counter + + @return: latest published ADC read counter by HD firmware + """ + return self.syringe_pump_adc_read_counter + @_publish(["syringe_pump_state", "syringe_pump_set_rate_ml_hr", "syringe_pump_meas_rate_ml_hr","syringe_pump_position", "syringe_pump_volume_ml","syringe_pump_home_v", @@ -185,6 +221,8 @@ message['message'][MsgFieldPositions.START_POS_FIELD_9:MsgFieldPositions.END_POS_FIELD_9])) saf = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_10:MsgFieldPositions.END_POS_FIELD_10])) + sts = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_11:MsgFieldPositions.END_POS_FIELD_11])) self.syringe_pump_state = sta[0] self.heparin_state = hep[0] @@ -196,6 +234,10 @@ self.syringe_pump_switch_v = det[0] self.syringe_pump_force_v = frc[0] self.syringe_pump_safety_volume_ml = saf[0] + self.syringe_pump_status = (sts[0] & 0xFF000000) >> 24 + self.syringe_pump_encoder_status = (sts[0] & 0x00FF0000) >> 16 + self.syringe_pump_adc_dac_status = (sts[0] & 0x0000FF00) >> 8 + self.syringe_pump_adc_read_counter = (sts[0] & 0x000000FF) def cmd_syringe_pump_operation(self, operation=SyringePumpOperations.SYRINGE_PUMP_OP_STOP.value, rate=0.0, volume=0.0): """ @@ -510,3 +552,155 @@ self.logger.debug("Timeout!!!!") return False + def cmd_syringe_pump_status_override(self, status:int=0, reset:int=NO_RESET): + """ + Constructs and sends the syringe pump status override command + Constraints: + Must be logged into HD. + + @param status: integer - status (0..255) + @param reset: integer - 1 to reset a previous override, 0 to override + @return: 1 if successful, zero otherwise + """ + + rst = integer_to_bytearray(reset) + sts = integer_to_bytearray(status & 0x000000FF) + payload = rst + sts + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_HD_SYRINGE_PUMP_STATUS_OVERRIDE.value, + payload=payload) + + self.logger.debug("override HD syringe pump status") + + # 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(status) + self.logger.debug("Syringe pump status 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_syringe_pump_encoder_status_override(self, status:int=0, reset:int=NO_RESET): + """ + Constructs and sends the syringe pump encoder status override command + Constraints: + Must be logged into HD. + + @param status: integer - encoder status (0..255) + @param reset: integer - 1 to reset a previous override, 0 to override + @return: 1 if successful, zero otherwise + """ + + rst = integer_to_bytearray(reset) + sts = integer_to_bytearray(status & 0x000000FF) + payload = rst + sts + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_HD_SYRINGE_PUMP_ENCODER_STATUS_OVERRIDE.value, + payload=payload) + + self.logger.debug("override HD syringe pump encoder status") + + # 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(status) + self.logger.debug("Syringe pump encoder status 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_syringe_pump_adc_dac_status_override(self, status:int=0, reset:int=NO_RESET): + """ + Constructs and sends the syringe pump ADC & DAC status override command + Constraints: + Must be logged into HD. + + @param status: integer - ADC and DAC status (0..255) + @param reset: integer - 1 to reset a previous override, 0 to override + @return: 1 if successful, zero otherwise + """ + + rst = integer_to_bytearray(reset) + sts = integer_to_bytearray(status & 0x000000FF) + payload = rst + sts + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_HD_SYRINGE_PUMP_ADC_DAC_STATUS_OVERRIDE.value, + payload=payload) + + self.logger.debug("override HD syringe pump ADC & DAC status") + + # 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(status) + self.logger.debug("Syringe pump ADC & DAC status 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_syringe_pump_adc_read_counter_override(self, counter:int=0, reset:int=NO_RESET): + """ + Constructs and sends the syringe pump ADC read counter override command + Constraints: + Must be logged into HD. + + @param counter: integer - status (0..255) + @param reset: integer - 1 to reset a previous override, 0 to override + @return: 1 if successful, zero otherwise + """ + + rst = integer_to_bytearray(reset) + ctr = integer_to_bytearray(counter & 0x000000FF) + payload = rst + ctr + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_HD_SYRINGE_PUMP_ADC_READ_COUNTER_OVERRIDE.value, + payload=payload) + + self.logger.debug("override HD syringe pump ADC read counter") + + # 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(counter) + self.logger.debug("Syringe pump ADC read counter 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 +