Index: dialin/common/msg_defs.py =================================================================== diff -u -rf053467ac7cfb9fe349e394342d3a9253a377403 -r79b47911f0ea424cd8dc10c1e1f150b84d4dfa54 --- dialin/common/msg_defs.py (.../msg_defs.py) (revision f053467ac7cfb9fe349e394342d3a9253a377403) +++ dialin/common/msg_defs.py (.../msg_defs.py) (revision 79b47911f0ea424cd8dc10c1e1f150b84d4dfa54) @@ -100,5 +100,15 @@ END_POS_FIELD_19 = START_POS_FIELD_19 + 4 START_POS_FIELD_20 = END_POS_FIELD_19 END_POS_FIELD_20 = START_POS_FIELD_20 + 4 + START_POS_FIELD_21 = END_POS_FIELD_20 + END_POS_FIELD_21 = START_POS_FIELD_21 + 4 + START_POS_FIELD_22 = END_POS_FIELD_21 + END_POS_FIELD_22 = START_POS_FIELD_22 + 4 + START_POS_FIELD_23 = END_POS_FIELD_22 + END_POS_FIELD_23 = START_POS_FIELD_23 + 4 + START_POS_FIELD_24 = END_POS_FIELD_23 + END_POS_FIELD_24 = START_POS_FIELD_24 + 4 + START_POS_FIELD_25 = END_POS_FIELD_24 + END_POS_FIELD_25 = START_POS_FIELD_25 + 4 Index: dialin/dg/hd_proxy.py =================================================================== diff -u -r178ae89233002c16562b4539611acedef032ccbd -r79b47911f0ea424cd8dc10c1e1f150b84d4dfa54 --- dialin/dg/hd_proxy.py (.../hd_proxy.py) (revision 178ae89233002c16562b4539611acedef032ccbd) +++ dialin/dg/hd_proxy.py (.../hd_proxy.py) (revision 79b47911f0ea424cd8dc10c1e1f150b84d4dfa54) @@ -267,3 +267,33 @@ self.logger.debug("Sending sample water command") self.can_interface.send(message, 0) + def cmd_start_stop_heat_disinfect(self, start=True): + """ + Constructs and sends the start/stop DG heat disinfection command + + @param start: (bool) True = start heat disinfection, False = stop heat disinfection. + @return: non-zero integer if successful, False otherwise + """ + # 1 is to start + if start: + cmd = 1 + str = "Starting" + else: + cmd = 0 + str = "Stopping" + payload = integer_to_bytearray(cmd) + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message_id=MsgIds.MSG_ID_DG_START_STOP_HEAT_DISINFECT.value, + payload=payload) + + self.logger.debug(str + " DG heat disinfect") + + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + # response payload is OK or not OK + return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] + else: + self.logger.debug("Timeout!!!!") + return False Index: dialin/dg/ro_pump.py =================================================================== diff -u -rf053467ac7cfb9fe349e394342d3a9253a377403 -r79b47911f0ea424cd8dc10c1e1f150b84d4dfa54 --- dialin/dg/ro_pump.py (.../ro_pump.py) (revision f053467ac7cfb9fe349e394342d3a9253a377403) +++ dialin/dg/ro_pump.py (.../ro_pump.py) (revision 79b47911f0ea424cd8dc10c1e1f150b84d4dfa54) @@ -26,9 +26,9 @@ @unique class ROPumpStates(DialinEnum): RO_PUMP_OFF_STATE = 0 - RO_PUMP_RAMP_UP_STATE = 1 - RO_PUMP_VERIFY_FLOW_STATE = 2 - RO_PUMP_CONTROL_TO_TARGET_STATE = 3 + RO_PUMP_RAMP_UP_TO_TARGET_FLOW_STATE = 1 + RO_PUMP_CONTROL_TO_TARGET_FLOW_STATE = 2 + RO_PUMP_CONTROL_TO_MAX_PRESSURE_STATE = 3 RO_PUMP_OPEN_LOOP_STATE = 4 @@ -57,6 +57,7 @@ self.measured_flow_rate_lpm = 0.0 self.pwm_duty_cycle_pct = 0.0 self.ro_pump_state = 0.0 + self.target_flow_lpm = 0.0 def get_target_pressure(self): """ @@ -100,19 +101,22 @@ @return: None """ - tgt = struct.unpack('f', bytearray( + tgt_pres = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] flow = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] pwm = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] ro_state = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] + tgt_flow = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] - self.target_pressure_psi = tgt + self.target_pressure_psi = tgt_pres self.measured_flow_rate_lpm = flow self.pwm_duty_cycle_pct = pwm self.ro_pump_state = ROPumpStates(ro_state).name if ROPumpStates.has_value(ro_state) else 'State Unknown' + self.target_flow_lpm = tgt_flow def cmd_ro_pump_set_point_override(self, pressure, reset=NO_RESET): """ Index: dialin/hd/hemodialysis_device.py =================================================================== diff -u -raf21ad6b590a05515b33e573d1c9236f21cafa3e -r79b47911f0ea424cd8dc10c1e1f150b84d4dfa54 --- dialin/hd/hemodialysis_device.py (.../hemodialysis_device.py) (revision af21ad6b590a05515b33e573d1c9236f21cafa3e) +++ dialin/hd/hemodialysis_device.py (.../hemodialysis_device.py) (revision 79b47911f0ea424cd8dc10c1e1f150b84d4dfa54) @@ -18,6 +18,7 @@ from .air_trap import HDAirTrap from .alarms import HDAlarms from .buttons import HDButtons +from .fluid_leak import HDFluidLeak from .ui_proxy import HDUIProxy from .watchdog import HDWatchdog from .rtc import HDRTC @@ -64,9 +65,8 @@ @param can_interface: (str) CANBus interface name, e.g. "can0" @param log_level: (str) Logging level, defaults to None - - """ + super().__init__() self._log_manager = _LogManager(log_level=log_level, log_filepath=self.__class__.__name__+".log") self.logger = self._log_manager.logger @@ -89,11 +89,11 @@ self.hd_operation_sub_mode = 0 # Create command groups - self.accel = HDAccelerometer(self.can_interface, self.logger) self.air_trap = HDAirTrap(self.can_interface, self.logger) self.alarms = HDAlarms(self.can_interface, self.logger) self.buttons = HDButtons(self.can_interface, self.logger) + self.fluid_leak = HDFluidLeak(self.can_interface, self.logger) self.ui = HDUIProxy(self.can_interface, self.logger) self.rtc = HDRTC(self.can_interface, self.logger) self.watchdog = HDWatchdog(self.can_interface, self.logger) Index: dialin/hd/ui_proxy.py =================================================================== diff -u -raf21ad6b590a05515b33e573d1c9236f21cafa3e -r79b47911f0ea424cd8dc10c1e1f150b84d4dfa54 --- dialin/hd/ui_proxy.py (.../ui_proxy.py) (revision af21ad6b590a05515b33e573d1c9236f21cafa3e) +++ dialin/hd/ui_proxy.py (.../ui_proxy.py) (revision 79b47911f0ea424cd8dc10c1e1f150b84d4dfa54) @@ -262,6 +262,14 @@ """ return self.fpga_version + def get_reject_reasons(self): + """ + Gets all possible reject reasons + + @return: OrderedDict(), {"": ... } + """ + return self.reject_reasons + def get_treatment_parameters(self): """ Gets the array of treatment parameters set by user or Dialin @@ -270,6 +278,23 @@ """ return self.treatment_parameters + def get_treatment_parameters_reject_reasons(self): + """ + Gets the array of reject reasons for treatment parameters by HD firmware + + @return: the array of reject reasons + """ + return self.treatment_parameters_reject_reasons + + def get_treatment_parameters_valid(self): + """ + Gets the T/F flag for whether treatment parameters + are considered valid by HD. + + @return: True if treatment parameters are valid, False if not + """ + return self.treatment_parameters_valid + def get_min_treatment_duration_min(self): """ Gets the min treatment duration @@ -334,14 +359,6 @@ """ return self.duration_change_reject_reason - def get_reject_reasons(self): - """ - Gets all possible reject reasons - - @return: OrderedDict(), {"": ... } - """ - return self.reject_reasons - def get_duration_change_time_min(self): """ Gets the duration change time @@ -444,177 +461,6 @@ """ return self.target_dialysate_flow_rate - def get_treatment_parameters_valid(self): - """ - Gets the T/F flag for whether treatment parameters - are considered valid by HD. - - @return: True if treatment parameters are valid, False if not - """ - return self.treatment_parameters_valid - - def get_treatment_parameters_reject_reasons(self): - """ - Gets the reject reason codes for the treatment parameters - sent to the HD for validation. - - @return: The array of reject reason codes for all treatment parameters - """ - return self.treatment_parameters_reject_reasons - - def get_blood_flow_rate_reject_reason(self): - """ - Gets the reject reason code for the blood flow rate - treatment parameter. - - @return: The reject reason code for the blood flow rate - """ - return self.blood_flow_rate_reject_reason - - def get_dialysate_flow_rate_reject_reason(self): - """ - Gets the reject reason code for the dialysate flow rate - treatment parameter. - - @return: The reject reason code for the dialysate flow rate - """ - return self.dialysate_flow_rate_reject_reason - - def get_treatment_duration_reject_reason(self): - """ - Gets the reject reason code for the treatment duration - treatment parameter. - - @return: The reject reason code for the treatment duration - """ - return self.treatment_duration_reject_reason - - def get_heparin_pre_stop_time_reject_reason(self): - """ - Gets the reject reason code for the Heparin pre-stop - time treatment parameter. - - @return: The reject reason code for the Heparin pre-stop time - """ - return self.heparin_pre_stop_time_reject_reason - - def get_saline_bolus_volume_reject_reason(self): - """ - Gets the reject reason code for the saline bolus volume - treatment parameter. - - @return: The reject reason code for the saline bolus volume - """ - return self.saline_bolus_volume_reject_reason - - def get_acid_concentrate_reject_reason(self): - """ - Gets the reject reason code for the acid concentrate - treatment parameter. - - @return: The reject reason code for the acid concentrate - """ - return self.acid_concentrate_reject_reason - - def get_bicarb_concentrate_reject_reason(self): - """ - Gets the reject reason code for the bicarbonate - concentrate treatment parameter. - - @return: The reject reason code for the bicarbonate concentrate - """ - return self.bicarb_concentrate_reject_reason - - def get_dialyzer_type_reject_reason(self): - """ - Gets the reject reason code for the dialyzer type treatment - parameter. - - @return: The reject reason code for the dialyzer type - """ - return self.dialyzer_type_reject_reason - - def get_blood_pressure_meas_interval_reject_reason(self): - """ - Gets the reject reason code for the BP measurement interval - treatment parameter. - - @return: The reject reason code for the BP measurement interval - """ - return self.blood_pressure_meas_interval_reject_reason - - def get_rinseback_flow_rate_reject_reason(self): - """ - Gets the reject reason code for the rinseback flow rate - treatment parameter. - - @return: The reject reason code for the rinseback flow rate - """ - return self.rinseback_flow_rate_reject_reason - - def get_arterial_pressure_low_alarm_limit_reject_reason(self): - """ - Gets the reject reason code for the arterial pressure low alarm - limit treatment parameter. - - @return: The reject reason code for the arterial pressure low alarm limit - """ - return self.arterial_pressure_low_alarm_limit_reject_reason - - def get_arterial_pressure_high_alarm_limit_reject_reason(self): - """ - Gets the reject reason code for the arterial pressure high alarm - limit treatment parameter. - - @return: The reject reason code for the arterial pressure high alarm limit - """ - return self.arterial_pressure_high_alarm_limit_reject_reason - - def get_venous_pressure_low_alarm_limit_reject_reason(self): - """ - Gets the reject reason code for the venous pressure low alarm - limit treatment parameter. - - @return: The reject reason code for the venous pressure low alarm limit - """ - return self.venous_pressure_low_alarm_limit_reject_reason - - def get_venous_pressure_high_alarm_limit_reject_reason(self): - """ - Gets the reject reason code for the venous pressure high alarm - limit treatment parameter. - - @return: The reject reason code for the venous pressure high alarm limit - """ - return self.venous_pressure_high_alarm_limit_reject_reason - - def get_heparin_dispense_rate_reject_reason(self): - """ - Gets the reject reason code for the Heparin dispense rate - treatment parameter. - - @return: The reject reason code for the Heparin dispense rate - """ - return self.heparin_dispense_rate_reject_reason - - def get_heparin_bolus_volume_reject_reason(self): - """ - Gets the reject reason code for the Heparin bolus volume - treatment parameter. - - @return: The reject reason code for the Heparin bolus volume - """ - return self.heparin_bolus_volume_reject_reason - - def get_dialysate_temperature_reject_reason(self): - """ - Gets the reject reason code for the dialysate temperature - treatment parameter. - - @return: The reject reason code for dialysate temperature - """ - return self.dialysate_temperature_reject_reason - def get_saline_bolus_reject_reason(self): """ Gets the reject reason code for the saline bolus request @@ -772,23 +618,7 @@ @_publish([ "treatment_parameters_valid", - "blood_flow_rate_reject_reason", - "dialysate_flow_rate_reject_reason", - "treatment_duration_reject_reason", - "heparin_pre_stop_time_reject_reason", - "saline_bolus_volume_reject_reason", - "acid_concentrate_reject_reason", - "bicarb_concentrate_reject_reason", - "dialyzer_type_reject_reason", - "blood_pressure_meas_interval_reject_reason", - "rinseback_flow_rate_reject_reason", - "arterial_pressure_low_alarm_limit_reject_reason", - "arterial_pressure_high_alarm_limit_reject_reason", - "venous_pressure_low_alarm_limit_reject_reason", - "venous_pressure_high_alarm_limit_reject_reason", - "heparin_dispense_rate_reject_reason", - "heparin_bolus_volume_reject_reason", - "dialysate_temperature_reject_reason" + "treatment_parameters_reject_reasons" ]) def _handler_treatment_param_settings_response(self, message): """ @@ -857,23 +687,23 @@ self.treatment_parameters_valid = True else: self.treatment_parameters_valid = False - self.blood_flow_rate_reject_reason = bld[0] - self.dialysate_flow_rate_reject_reason = dia[0] - self.treatment_duration_reject_reason = dur[0] - self.heparin_pre_stop_time_reject_reason = sto[0] - self.saline_bolus_volume_reject_reason = sal[0] - self.acid_concentrate_reject_reason = acd[0] - self.bicarb_concentrate_reject_reason = bic[0] - self.dialyzer_type_reject_reason = dlz[0] - self.blood_pressure_meas_interval_reject_reason = bpi[0] - self.rinseback_flow_rate_reject_reason = rbf[0] - self.arterial_pressure_low_alarm_limit_reject_reason = apl[0] - self.arterial_pressure_high_alarm_limit_reject_reason = aph[0] - self.venous_pressure_low_alarm_limit_reject_reason = vpl[0] - self.venous_pressure_high_alarm_limit_reject_reason = vph[0] - self.heparin_dispense_rate_reject_reason = hdr[0] - self.heparin_bolus_volume_reject_reason = hbv[0] - self.dialysate_temperature_reject_reason = tmp[0] + self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_BLOOD_FLOW_RATE_ML_MIN.value] = bld[0] + self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_DIALYSATE_FLOW_RATE_ML_MIN.value] = dia[0] + self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_TREATMENT_DURATION_MIN.value] = dur[0] + self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_HEPARIN_PRESTOP_MIN.value] = sto[0] + self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_SALINE_BOLUS_VOLUME_ML.value] = sal[0] + self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_ACID_CONCENTRATE.value] = acd[0] + self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_BICARB_CONCENTRATE.value] = bic[0] + self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_DIALYZER_TYPE.value] = dlz[0] + self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_BLOOD_PRESSURE_MEAS_INTERVAL_MIN.value] = bpi[0] + self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_RINSEBACK_FLOW_RATE_ML_MIN.value] = rbf[0] + self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_ARTERIAL_PRESSURE_HIGH_LIMIT_MMHG.value] = apl[0] + self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_ARTERIAL_PRESSURE_LOW_LIMIT_MMHG.value] = aph[0] + self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_VENOUS_PRESSURE_HIGH_LIMIT_MMHG.value] = vpl[0] + self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_VENOUS_PRESSURE_LOW_LIMIT_MMHG.value] = vph[0] + self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_HEPARIN_DISPENSE_RATE_ML_HR.value] = hdr[0] + self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME_ML.value] = hbv[0] + self.treatment_parameters_reject_reasons[self.TreatmentParameters.TREATMENT_PARAM_DIALYSATE_TEMPERATURE_C.value] = tmp[0] @_publish([ "min_treatment_duration_min", Index: dialin/hd/valves.py =================================================================== diff -u -r46fb3f18ae1a349eeb8bcc56d243618737ae3279 -r79b47911f0ea424cd8dc10c1e1f150b84d4dfa54 --- dialin/hd/valves.py (.../valves.py) (revision 46fb3f18ae1a349eeb8bcc56d243618737ae3279) +++ dialin/hd/valves.py (.../valves.py) (revision 79b47911f0ea424cd8dc10c1e1f150b84d4dfa54) @@ -122,6 +122,13 @@ self.hd_air_trap_status = 0 + def get_hd_air_trap_status(self): + """ + Returns the hd air trap status + @return: (str) the HD air trap status + """ + return self.hd_air_trap_status + def get_hd_valves_status(self): """ Gets the hd valves status