Index: dialin/common/msg_defs.py =================================================================== diff -u -rdfa8befbb517c638f2813076b2dab2a5fb1fe3a2 -rd2024aeddcff9b4ac0040fd92a9c95d65708c643 --- dialin/common/msg_defs.py (.../msg_defs.py) (revision dfa8befbb517c638f2813076b2dab2a5fb1fe3a2) +++ dialin/common/msg_defs.py (.../msg_defs.py) (revision d2024aeddcff9b4ac0040fd92a9c95d65708c643) @@ -140,6 +140,11 @@ MSG_ID_DG_AIR_TRAP_DATA_BROADCAST_INTERVAL_OVERRIDE = 0x8032 # HD air trap data broadcast interval override request MSG_ID_DG_AIR_TRAP_LEVEL_SENSOR_OVERRIDE = 0x8033 # HD air trap level sensor override request MSG_ID_HD_SOFTWARE_RESET_REQUEST = 0x8034 # HD reset request + MSG_ID_BLOOD_FLOW_SIG_STRENGTH_OVERRIDE = 0x8035 # Blood flow signal strength override request + MSG_ID_DIAL_IN_FLOW_SIG_STRENGTH_OVERRIDE = 0x8036 # Dialysate flow signal strength override request + MSG_ID_BLOOD_PUMP_HOME_CMD = 0x8037 # Blood pump home command + MSG_ID_DIAL_IN_PUMP_HOME_CMD = 0x8038 # Dialysate inlet pump home command + MSG_ID_DIAL_OUT_PUMP_HOME_CMD = 0x8039 # Dialysate outlet pump home command MSG_ID_FIRST_DG_TESTER_MESSAGE = 0xA000 # First DG test message ID MSG_ID_DG_TESTER_LOGIN_REQUEST = MSG_ID_FIRST_DG_TESTER_MESSAGE # DG tester log-in Index: dialin/hd/blood_flow.py =================================================================== diff -u -r9fed7e633ffc4cf92a93e22ccff7d5aa078801ce -rd2024aeddcff9b4ac0040fd92a9c95d65708c643 --- dialin/hd/blood_flow.py (.../blood_flow.py) (revision 9fed7e633ffc4cf92a93e22ccff7d5aa078801ce) +++ dialin/hd/blood_flow.py (.../blood_flow.py) (revision d2024aeddcff9b4ac0040fd92a9c95d65708c643) @@ -53,6 +53,7 @@ self.measured_blood_pump_mc_speed = 0.0 self.measured_blood_pump_mc_current = 0.0 self.pwm_duty_cycle_pct = 0.0 + self.flow_signal_strength = 0.0 def get_target_blood_flow_rate(self): """ @@ -106,13 +107,21 @@ """ Gets the pwm duty cycle pct - @return: the pwm duty cycle pct + @return: the pwm duty cycle pct (0..100) """ return self.pwm_duty_cycle_pct + def get_flow_signal_strength(self): + """ + Gets the blood flow signal strength pct + + @return: the blood flow signal strength pct (0..100) + """ + return self.flow_signal_strength + @_publish(["target_blood_flow_rate", "measured_blood_flow_rate", "measured_blood_pump_rotor_speed", "measured_blood_pump_speed", "measured_blood_pump_mc_speed", "measured_blood_pump_mc_current", - "pwm_duty_cycle_pct"]) + "pwm_duty_cycle_pct", "flow_signal_strength"]) def _handler_blood_flow_sync(self, message): """ Handles published blood flow data messages. Blood flow data are captured @@ -136,6 +145,8 @@ message['message'][MsgFldPositions.START_POS_FIELD_6:MsgFldPositions.END_POS_FIELD_6])) pwm = struct.unpack('f', bytearray( message['message'][MsgFldPositions.START_POS_FIELD_7:MsgFldPositions.END_POS_FIELD_7])) + sig = struct.unpack('f', bytearray( + message['message'][MsgFldPositions.START_POS_FIELD_8:MsgFldPositions.END_POS_FIELD_8])) self.target_blood_flow_rate = tgt[0] self.measured_blood_flow_rate = flow[0] @@ -144,6 +155,7 @@ self.measured_blood_pump_mc_speed = mcspeed[0] self.measured_blood_pump_mc_current = mccurr[0] self.pwm_duty_cycle_pct = pwm[0] + self.flow_signal_strength = sig[0] def cmd_blood_flow_set_point_override(self, flow, mode=PUMP_CONTROL_MODE_CLOSED_LOOP, reset=NO_RESET): """ @@ -390,6 +402,46 @@ self.logger.debug("Timeout!!!!") return False + def cmd_blood_flow_signal_strength_override(self, signal_strength, reset=NO_RESET): + """ + Constructs and sends the measured blood flow signal strength % override \n + command. + Constraints: + Must be logged into HD. + + @param signal_strength: float - pct (0..100) 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) + sig = float_to_bytearray(signal_strength) + payload = rst + sig + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_BLOOD_FLOW_SIG_STRENGTH_OVERRIDE, + payload=payload) + + self.logger.debug("override measured blood flow signal strength") + + # Send message + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + # self.logger.debug(received_message) + if reset == RESET: + str_sig = "reset back to normal" + else: + str_sig = str(signal_strength) + self.logger.debug("Blood pump flow signal strength overridden to " + str_sig + " %: " + + 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_flow_broadcast_interval_override(self, ms, reset=NO_RESET): """ Constructs and sends the measured blood flow broadcast interval override command @@ -444,19 +496,44 @@ message_id=MsgIds.MSG_ID_HD_BLOOD_FLOW_SET_CALIBRATION, payload=payload) - print("Setting blood flow calibration factors") + self.logger.debug("Setting blood flow calibration factors") # Send message received_message = self.can_interface.send(message) # If there is content... if received_message is not None: - print(received_message) - # str_res = str(flow) - print("Blood flow calibration factors set to : " + str(gain) + ", " + str(offset) + ". " + + self.logger.debug("Blood flow calibration factors set to : " + str(gain) + ", " + str(offset) + ". " + str(received_message['message'][DenaliMessage.PAYLOAD_START_INDEX])) # response payload is OK or not OK return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] else: - print("Timeout!!!!") + self.logger.debug("Timeout!!!!") return False + + def cmd_home_blood_pump(self): + """ + Constructs and sends a blood pump home request message to the HD. + Constraints: + Must be logged into HD. + Blood pump must be stopped (off) prior to requesting home position. + + @return: 1 if successful, zero otherwise + """ + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_BLOOD_PUMP_HOME_CMD) + + self.logger.debug("Homing blood pump") + + # Send message + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + self.logger.debug("Blood pump homed : " + + 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 Index: dialin/hd/dialysate_inlet_flow.py =================================================================== diff -u -r9fed7e633ffc4cf92a93e22ccff7d5aa078801ce -rd2024aeddcff9b4ac0040fd92a9c95d65708c643 --- dialin/hd/dialysate_inlet_flow.py (.../dialysate_inlet_flow.py) (revision 9fed7e633ffc4cf92a93e22ccff7d5aa078801ce) +++ dialin/hd/dialysate_inlet_flow.py (.../dialysate_inlet_flow.py) (revision d2024aeddcff9b4ac0040fd92a9c95d65708c643) @@ -53,6 +53,7 @@ self.measured_dialysate_inlet_pump_mc_speed = 0.0 self.measured_dialysate_inlet_pump_mc_current = 0.0 self.pwm_duty_cycle_pct = 0.0 + self.flow_signal_strength = 0.0 def get_target_dialysate_inlet_flow_rate(self): """ @@ -106,17 +107,27 @@ """ Gets the pwm duty cycle pct - @return: the pwm dutcy cycle pct + @return: the pwm dutcy cycle pct (0..100) """ return self.pwm_duty_cycle_pct + def get_flow_signal_strength(self): + """ + Gets the dialysate flow signal strength pct + + @return: the dialysate flow signal strength pct (0..100) + """ + return self.flow_signal_strength + @_publish([ "target_dialysate_inlet_flow_rate", + "measured_dialysate_inlet_flow_rate", "measured_dialysate_inlet_pump_rotor_speed", "measured_dialysate_inlet_pump_speed", "measured_dialysate_inlet_pump_mc_speed", "measured_dialysate_inlet_pump_mc_current", - "pwm_duty_cycle_pct" + "pwm_duty_cycle_pct,", + "flow_signal_strength" ]) def _handler_dialysate_inlet_flow_sync(self, message): """ @@ -141,6 +152,8 @@ message['message'][MsgFldPositions.START_POS_FIELD_6:MsgFldPositions.END_POS_FIELD_6])) pwm = struct.unpack('f', bytearray( message['message'][MsgFldPositions.START_POS_FIELD_7:MsgFldPositions.END_POS_FIELD_7])) + sig = struct.unpack('f', bytearray( + message['message'][MsgFldPositions.START_POS_FIELD_8:MsgFldPositions.END_POS_FIELD_8])) self.target_dialysate_inlet_flow_rate = tgt[0] self.measured_dialysate_inlet_flow_rate = flow[0] @@ -149,6 +162,7 @@ self.measured_dialysate_inlet_pump_mc_speed = mcspeed[0] self.measured_dialysate_inlet_pump_mc_current = mccurr[0] self.pwm_duty_cycle_pct = pwm[0] + self.flow_signal_strength = sig[0] def cmd_dialysate_inlet_flow_set_point_override(self, flow, mode=PUMP_CONTROL_MODE_CLOSED_LOOP, reset=NO_RESET): """ @@ -395,6 +409,46 @@ self.logger.debug("Timeout!!!!") return False + def cmd_dialysate_flow_signal_strength_override(self, signal_strength, reset=NO_RESET): + """ + Constructs and sends the measured dialysate flow signal strength % override \n + command. + Constraints: + Must be logged into HD. + + @param signal_strength: float - pct (0..100) 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) + sig = float_to_bytearray(signal_strength) + payload = rst + sig + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_DIAL_IN_FLOW_SIG_STRENGTH_OVERRIDE, + payload=payload) + + self.logger.debug("override measured dialysate flow signal strength") + + # Send message + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + # self.logger.debug(received_message) + if reset == RESET: + str_sig = "reset back to normal" + else: + str_sig = str(signal_strength) + self.logger.debug("Dialysate pump flow signal strength overridden to " + str_sig + " %: " + + 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_dialysate_inlet_flow_broadcast_interval_override(self, ms, reset=NO_RESET): """ Constructs and sends the measured dialysate inlet flow broadcast interval override command @@ -464,3 +518,30 @@ else: print("Timeout!!!!") return False + + def cmd_home_dialysate_inlet_pump(self): + """ + Constructs and sends a dialysate inlet pump home request message to the HD. + Constraints: + Must be logged into HD. + Dialysate inlet pump must be stopped (off) prior to requesting home position. + + @return: 1 if successful, zero otherwise + """ + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_BLOOD_PUMP_HOME_CMD) + + self.logger.debug("Homing dialysate inlet pump") + + # Send message + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + self.logger.debug("Dialysate inlet pump homed : " + + 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 Index: dialin/hd/dialysate_outlet_flow.py =================================================================== diff -u -r9fed7e633ffc4cf92a93e22ccff7d5aa078801ce -rd2024aeddcff9b4ac0040fd92a9c95d65708c643 --- dialin/hd/dialysate_outlet_flow.py (.../dialysate_outlet_flow.py) (revision 9fed7e633ffc4cf92a93e22ccff7d5aa078801ce) +++ dialin/hd/dialysate_outlet_flow.py (.../dialysate_outlet_flow.py) (revision d2024aeddcff9b4ac0040fd92a9c95d65708c643) @@ -547,3 +547,30 @@ self.can_interface.send(message, 0) return 0 + + def cmd_home_blood_pump(self): + """ + Constructs and sends a dialysate outlet pump home request message to the HD. + Constraints: + Must be logged into HD. + Dialysate outlet pump must be stopped (off) prior to requesting home position. + + @return: 1 if successful, zero otherwise + """ + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_BLOOD_PUMP_HOME_CMD) + + self.logger.debug("Homing dialysate outlet pump") + + # Send message + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + self.logger.debug("Dialysate outlet pump homed : " + + 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