Index: dialin/common/msg_defs.py =================================================================== diff -u -rea4c7120d474c48238d909b514109c320181b65f -r300390c34a81a42b5eb606e4f4499a1439bfc432 --- dialin/common/msg_defs.py (.../msg_defs.py) (revision ea4c7120d474c48238d909b514109c320181b65f) +++ dialin/common/msg_defs.py (.../msg_defs.py) (revision 300390c34a81a42b5eb606e4f4499a1439bfc432) @@ -118,6 +118,7 @@ MSG_ID_HD_CONTINUE_TO_TREATMENT_RESPONSE = 0x65 # HD response to user request to continue to treatment MSG_ID_UI_PATIENT_CONNECTION_CONFIRM = 0x66 # UI user has confirmed patient connection completed MSG_ID_HD_PATIENT_CONNECTION_CONFIRM_RESPONSE = 0x67 # HD response to user confirmation of patient connection + MSG_ID_UI_CONSUMABLE_INSTALL_CONFIRM = 0x68 # UI user has confirmed consumable install MSG_ID_CAN_ERROR_COUNT = 0x999 # test code in support of EMC testing Index: dialin/dg/dialysate_generator.py =================================================================== diff -u -r1ab15a50a984c98b85eb63b7dd843fda51f4a412 -r300390c34a81a42b5eb606e4f4499a1439bfc432 --- dialin/dg/dialysate_generator.py (.../dialysate_generator.py) (revision 1ab15a50a984c98b85eb63b7dd843fda51f4a412) +++ dialin/dg/dialysate_generator.py (.../dialysate_generator.py) (revision 300390c34a81a42b5eb606e4f4499a1439bfc432) @@ -16,22 +16,23 @@ import struct from .accelerometer import DGAccelerometer from .alarms import DGAlarms +from .calibration import DGCalibration +from .concentrate_pumps import ConcentratePumps +from .conductivity_sensors import ConductivitySensors from .drain_pump import DGDrainPump +from .fans import Fans from .hd_proxy import DGHDProxy +from .heaters import Heaters +from .heat_disinfection import HeatDisinfection from .load_cells import DGLoadCells from .pressures import DGPressures from .reservoirs import DGReservoirs -from .valves import DGValves from .ro_pump import DGROPump -from .heaters import Heaters +from .samplewater import DGSampleWater from .temperature_sensors import TemperatureSensors -from .conductivity_sensors import ConductivitySensors -from .heat_disinfection import HeatDisinfection from .thermistors import Thermistors -from .fans import Fans from .uv_reactors import UVReactors -from .concentrate_pumps import ConcentratePumps -from .calibration import DGCalibration +from .valves import DGValves from ..utils.conversions import integer_to_bytearray from ..protocols.CAN import (DenaliCanMessenger, DenaliMessage, DenaliChannels) from ..utils.base import _AbstractSubSystem, _publish, _LogManager @@ -133,23 +134,24 @@ # Create command groups self.accel = DGAccelerometer(self.can_interface, self.logger) + self.alarms = DGAlarms(self.can_interface, self.logger) + self.calibration = DGCalibration(self.can_interface, self.logger) + self.concentrate_pumps = ConcentratePumps(self.can_interface, self.logger) + self.conductivity_sensors = ConductivitySensors(self.can_interface, self.logger) + self.drain_pump = DGDrainPump(self.can_interface, self.logger) + self.fans = Fans(self.can_interface, self.logger) self.hd_proxy = DGHDProxy(self.can_interface, self.logger) + self.heaters = Heaters(self.can_interface, self.logger) + self.heat_disinfect = HeatDisinfection(self.can_interface, self.logger) self.load_cells = DGLoadCells(self.can_interface, self.logger) self.pressures = DGPressures(self.can_interface, self.logger) self.reservoirs = DGReservoirs(self.can_interface, self.logger) - self.valves = DGValves(self.can_interface, self.logger) self.ro_pump = DGROPump(self.can_interface, self.logger) - self.drain_pump = DGDrainPump(self.can_interface, self.logger) - self.heaters = Heaters(self.can_interface, self.logger) + self.samplewater = DGSampleWater(self.can_interface, self.logger) self.temperature_sensors = TemperatureSensors(self.can_interface, self.logger) - self.conductivity_sensors = ConductivitySensors(self.can_interface, self.logger) - self.concentrate_pumps = ConcentratePumps(self.can_interface, self.logger) - self.alarms = DGAlarms(self.can_interface, self.logger) - self.heat_disinfect = HeatDisinfection(self.can_interface, self.logger) self.thermistors = Thermistors(self.can_interface, self.logger) - self.fans = Fans(self.can_interface, self.logger) self.uv_reactors = UVReactors(self.can_interface, self.logger) - self.calibration = DGCalibration(self.can_interface, self.logger) + self.valves = DGValves(self.can_interface, self.logger) def get_version(self): """ Index: dialin/dg/hd_proxy.py =================================================================== diff -u -r8bdc5afe603faab1247807fce2b875834468cefe -r300390c34a81a42b5eb606e4f4499a1439bfc432 --- dialin/dg/hd_proxy.py (.../hd_proxy.py) (revision 8bdc5afe603faab1247807fce2b875834468cefe) +++ dialin/dg/hd_proxy.py (.../hd_proxy.py) (revision 300390c34a81a42b5eb606e4f4499a1439bfc432) @@ -260,3 +260,18 @@ payload=payload) self.logger.debug("Stopping heat disinfection process") self.can_interface.send(message, 0) + + def cmd_sample_water(self, cmd): + """ + Constructs and sends sample water command + + @param cmd: int - 0 = stop, 1 = start, 2 = flush, 3 = end. + @returns none + """ + payload = integer_to_bytearray(cmd) + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message_id=MsgIds.MSG_ID_DG_SAMPLE_WATER_CMD.value, + payload=payload) + self.logger.debug("Sending sample water command") + self.can_interface.send(message, 0) + Index: dialin/dg/samplewater.py =================================================================== diff -u -rea4c7120d474c48238d909b514109c320181b65f -r300390c34a81a42b5eb606e4f4499a1439bfc432 --- dialin/dg/samplewater.py (.../samplewater.py) (revision ea4c7120d474c48238d909b514109c320181b65f) +++ dialin/dg/samplewater.py (.../samplewater.py) (revision 300390c34a81a42b5eb606e4f4499a1439bfc432) @@ -37,7 +37,7 @@ self.logger = logger if self.can_interface is not None: - self.can_interface.register_receiving_publication_function(DenaliChannels.hd_sync_broadcast_ch_id, + self.can_interface.register_receiving_publication_function(DenaliChannels.dg_sync_broadcast_ch_id, MsgIds.MSG_ID_DG_FILTER_FLUSH_PROGRESS.value, self._handler_filter_flush_progress_sync) @@ -76,3 +76,4 @@ message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] self.filter_flush_time_countdown = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] + Index: dialin/hd/pretreatment.py =================================================================== diff -u -rea4c7120d474c48238d909b514109c320181b65f -r300390c34a81a42b5eb606e4f4499a1439bfc432 --- dialin/hd/pretreatment.py (.../pretreatment.py) (revision ea4c7120d474c48238d909b514109c320181b65f) +++ dialin/hd/pretreatment.py (.../pretreatment.py) (revision 300390c34a81a42b5eb606e4f4499a1439bfc432) @@ -25,12 +25,13 @@ class PreTreatmentSubModes(DialinEnum): HD_PRE_TREATMENT_START_STATE = 0 HD_PRE_TREATMENT_WATER_SAMPLE_STATE = 1 - HD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE = 2 - HD_PRE_TREATMENT_CART_INSTALL_STATE = 3 - HD_PRE_TREATMENT_SELF_TEST_DRY_STATE = 4 - HD_PRE_TREATMENT_PRIME_STATE = 5 - HD_PRE_TREATMENT_RECIRCULATE_STATE = 6 - HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE = 7 + HD_PRE_TREATMENT_CONSUMABLE_SELF_TEST_STATE = 2 + HD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE = 3 + HD_PRE_TREATMENT_CART_INSTALL_STATE = 4 + HD_PRE_TREATMENT_SELF_TEST_DRY_STATE = 5 + HD_PRE_TREATMENT_PRIME_STATE = 6 + HD_PRE_TREATMENT_RECIRCULATE_STATE = 7 + HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE = 8 @unique @@ -40,6 +41,16 @@ @unique +class PreTreatmentConsumableSelfTestStates(DialinEnum): + CONSUMABLE_SELF_TESTS_INSTALL = 0 + CONSUMABLE_SELF_TESTS_FILL_CMD_STATE = 1 + CONSUMABLE_SELF_TESTS_WATER_QUALITY_CHECK_STATE = 2 + CONSUMABLE_SELF_TESTS_BICARB_PUMP_CHECK_STATE = 3 + CONSUMABLE_SELF_TESTS_ACID_PUMP_CHECK_STATE = 4 + CONSUMABLE_SELF_TESTS_COMPLETE_STATE = 5 + + +@unique class PreTreatmentNoCartSelfTestStates(DialinEnum): NO_CART_SELF_TESTS_START_STATE = 0 NO_CART_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE = 1 @@ -127,6 +138,7 @@ self.pre_treatment_submode = 0 self.pre_treatment_sample_water_state = 0 + self.pre_treatment_consumable_self_test_state = 0 self.pre_treatment_no_cart_self_test_state = 0 self.pre_treatment_installation_state = 0 self.pre_treatment_dry_self_test_state = 0 @@ -159,6 +171,14 @@ """ return self.pre_treatment_sample_water_state + def get_pre_treatment_consumable_self_test_state(self): + """ + Gets the pre-treatment consumable self-test state + + @return: The pre-treatment consumable self-test state + """ + return self.pre_treatment_consumable_self_test_state + def get_pre_treatment_no_cart_self_test_state(self): """ Gets the pre-treatment no cartridge self-test state @@ -258,6 +278,7 @@ @_publish([ "pre_treatment_submode", "pre_treatment_sample_water_state", + "pre_treatment_consumable_self_test_state", "pre_treatment_no_cart_self_test_state", "pre_treatment_installation_state", "pre_treatment_dry_self_test_state", @@ -277,18 +298,20 @@ message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] pt_sw_state = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - pt_no_cart_st_state = struct.unpack('i', bytearray( + pt_consumable_st_state = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] - self.pre_treatment_installation_state = struct.unpack('i', bytearray( + pt_no_cart_st_state = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] - pt_dry_st_state = struct.unpack('i', bytearray( + self.pre_treatment_installation_state = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] - pt_prime_state = struct.unpack('i', bytearray( + pt_dry_st_state = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6]))[0] - pt_recirc_state = struct.unpack('i', bytearray( + pt_prime_state = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7]))[0] - self.pre_treatment_patient_connection_state = struct.unpack('i', bytearray( + pt_recirc_state = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_8:MsgFieldPositions.END_POS_FIELD_8]))[0] + self.pre_treatment_patient_connection_state = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_9:MsgFieldPositions.END_POS_FIELD_9]))[0] self.pre_treatment_submode = 'Unknown SubMode' if PreTreatmentSubModes.has_value(pt_submode): @@ -298,6 +321,10 @@ if PreTreatmentSampleWaterStates.has_value(pt_sw_state): self.pre_treatment_sample_water_state = PreTreatmentSampleWaterStates(pt_sw_state).name + self.pre_treatment_consumable_self_test_state = 'Unknown State' + if PreTreatmentConsumableSelfTestStates.has_value(pt_consumable_st_state): + self.pre_treatment_consumable_self_test_state = PreTreatmentConsumableSelfTestStates(pt_consumable_st_state).name + self.pre_treatment_no_cart_self_test_state = 'Unknown State' if PreTreatmentNoCartSelfTestStates.has_value(pt_no_cart_st_state): self.pre_treatment_no_cart_self_test_state = PreTreatmentNoCartSelfTestStates(pt_no_cart_st_state).name @@ -365,6 +392,7 @@ """ self.prime_timeout = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] + message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] self.prime_time_countdown = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] + message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] + Index: dialin/hd/ui_proxy.py =================================================================== diff -u -r84bc297f6f9b0c6594b73ac1045ad64f8f6e347d -r300390c34a81a42b5eb606e4f4499a1439bfc432 --- dialin/hd/ui_proxy.py (.../ui_proxy.py) (revision 84bc297f6f9b0c6594b73ac1045ad64f8f6e347d) +++ dialin/hd/ui_proxy.py (.../ui_proxy.py) (revision 300390c34a81a42b5eb606e4f4499a1439bfc432) @@ -1548,17 +1548,30 @@ self.logger.debug("Sending user sample water result " + str(result) + " to HD.") self.can_interface.send(message, 0) - def cmd_ui_installation_confirm(self): + def cmd_ui_consumable_installation_confirm(self): """ - Constructs and sends a ui installation confirm message + Constructs and sends a ui consumable installation confirm message @return: none """ message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_UI_CONSUMABLE_INSTALL_CONFIRM.value) + + self.logger.debug("Sending user consumable installation confirm to HD.") + self.can_interface.send(message, 0) + + def cmd_ui_disposable_installation_confirm(self): + """ + Constructs and sends a ui disposable installation confirm message + + @return: none + """ + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, message_id=MsgIds.MSG_ID_UI_INSTALLATION_CONFIRM.value) - self.logger.debug("Sending user installation confirm to HD.") + self.logger.debug("Sending user disposable installation confirm to HD.") self.can_interface.send(message, 0) def cmd_ui_start_prime_request(self): @@ -1599,3 +1612,4 @@ self.logger.debug("Sending user continue to treatment request to HD.") self.can_interface.send(message, 0) +