Index: dialin/common/msg_ids.py =================================================================== diff -u -r0cca339a72337e4c56665e7c5aff65944909cfb3 -rf9ade5206d6da9dc2ef510ef0d985ecc4bf44924 --- dialin/common/msg_ids.py (.../msg_ids.py) (revision 0cca339a72337e4c56665e7c5aff65944909cfb3) +++ dialin/common/msg_ids.py (.../msg_ids.py) (revision f9ade5206d6da9dc2ef510ef0d985ecc4bf44924) @@ -167,10 +167,8 @@ MSG_ID_UI_ACTIVE_ALARMS_LIST_REQUEST = 0x97 MSG_ID_HD_ACTIVE_ALARMS_LIST_REQUEST_RESPONSE = 0x98 MSG_ID_HD_SERIAL_NUMBER = 0x99, - MSG_ID_DG_CHEM_DISINFECT_TO_UI_DATA_PUBLISH = 0x9A - MSG_ID_DG_HEAT_DISINFECT_TO_UI_DATA_PUBLISH = 0x9B - MSG_ID_HD_SET_STANDBY_DISINFECT_SUB_MODE_REQUEST = 0x9C - MSG_ID_HD_SET_STANDBY_DISINFECT_SUB_MODE_RESPONSE = 0x9D + MSG_ID_HD_SET_STANDBY_DISINFECT_SUB_MODE_REQUEST = 0x9A + MSG_ID_HD_SET_STANDBY_DISINFECT_SUB_MODE_RESPONSE = 0x9B MSG_ID_DIALYSATE_FLOW_DATA = 0X8 MSG_ID_TESTER_LOGIN_REQUEST = 0X8000 MSG_ID_DIAL_OUT_FLOW_SET_PT_OVERRIDE = 0X8001 Index: dialin/dg/chemical_disinfect.py =================================================================== diff -u -r8ded14e44a1f69305149bfb2cd638252eaae8d1a -rf9ade5206d6da9dc2ef510ef0d985ecc4bf44924 --- dialin/dg/chemical_disinfect.py (.../chemical_disinfect.py) (revision 8ded14e44a1f69305149bfb2cd638252eaae8d1a) +++ dialin/dg/chemical_disinfect.py (.../chemical_disinfect.py) (revision f9ade5206d6da9dc2ef510ef0d985ecc4bf44924) @@ -1,7 +1,7 @@ import struct from ..common.msg_defs import MsgIds, MsgFieldPositions -from ..protocols.CAN import (DenaliMessage, DenaliChannels) +from ..protocols.CAN import DenaliMessage, DenaliChannels from ..utils.base import _AbstractSubSystem, _publish, DialinEnum from logging import Logger from enum import unique @@ -38,6 +38,19 @@ @unique +class ChemDisinfectUIStates(DialinEnum): + + CHEM_DISINFECT_UI_STATE_NOT_RUNNING = 0 + CHEM_DISINFECT_UI_STATE_FLUSH_BEFORE_DISINFECT = 1 + CHEM_DISINFECT_UI_STATE_MIX_WATER_AND_ACID = 2 + CHEM_DISINFECT_UI_STATE_REMOVE_ACID = 3 + CHEM_DISINFECT_UI_STATE_DISINFECT_DEVICE = 4 + CHEM_DISINFECT_UI_STATE_FLUSH_AFTER_DISINFECT = 5 + CHEM_DISINFECT_UI_STATE_CANCEL_DISINFECT = 6 + CHEM_DISINFECT_UI_STATE_COMPLETE = 7 + + +@unique class ChemCancellationModes(DialinEnum): CANCELLATION_MODE_NONE = 0 @@ -63,7 +76,8 @@ self.chemical_disinfect_state = 0 self.overall_elapsed_time = 0 self.state_elapsed_time = 0 - self.disinfect_elapsed_time = 0 + self.chemical_disinfect_target_time = 0 + self.chemical_disinfect_elapsed_time = 0 self.cancellation_mode = 0 self.r1_level = 0 self.r2_level = 0 @@ -78,25 +92,29 @@ self._handler_chemical_disinfect_sync) channel_id = DenaliChannels.dg_to_ui_ch_id - msg_id = MsgIds.MSG_ID_DG_CHEM_DISINFECT_TO_UI_DATA_PUBLISH.value + msg_id = MsgIds.MSG_ID_DG_CHEM_DISINFECT_TIME_DATA.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_chemical_disinfect_to_ui_sync) - @_publish(["disinfect_elapsed_time"]) + @_publish(["chemical_disinfect_elapsed_time"]) def _handler_chemical_disinfect_to_ui_sync(self, message ): """ Handles published chemical disinfect message @param message: published chemical disinfect to UI data message @returns none """ - disinfect_elapsed_time = struct.unpack('i', bytearray( + disinfect_target_time = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] + disinfect_elapsed_time = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - self.disinfect_elapsed_time = int(disinfect_elapsed_time / 1000) + self.chemical_disinfect_target_time = int(disinfect_target_time / 1000) + self.chemical_disinfect_target_time = int(disinfect_elapsed_time / 1000) @_publish(["chemical_disinfect_state", "overall_elapsed_time", "state_elapsed_time", "cancellation_mode", - "r1_level", "r2_level", "target_post_rinse_count", "current_post_rinse_count"]) + "r1_level", "r2_level", "target_post_rinse_count", "current_post_rinse_count", + "chemical_disinfect_ui_state"]) def _handler_chemical_disinfect_sync(self, message): """ Handles published chemical disinfect message Index: dialin/dg/dialysate_generator.py =================================================================== diff -u -r8cc6f4843c77fc7bfe358c9f752740919c25f65f -rf9ade5206d6da9dc2ef510ef0d985ecc4bf44924 --- dialin/dg/dialysate_generator.py (.../dialysate_generator.py) (revision 8cc6f4843c77fc7bfe358c9f752740919c25f65f) +++ dialin/dg/dialysate_generator.py (.../dialysate_generator.py) (revision f9ade5206d6da9dc2ef510ef0d985ecc4bf44924) @@ -48,6 +48,7 @@ from .chemical_disinfect import ChemicalDisinfect from enum import unique + @unique class DGOperationModes(DialinEnum): Index: dialin/dg/heat_disinfect.py =================================================================== diff -u -r8ded14e44a1f69305149bfb2cd638252eaae8d1a -rf9ade5206d6da9dc2ef510ef0d985ecc4bf44924 --- dialin/dg/heat_disinfect.py (.../heat_disinfect.py) (revision 8ded14e44a1f69305149bfb2cd638252eaae8d1a) +++ dialin/dg/heat_disinfect.py (.../heat_disinfect.py) (revision f9ade5206d6da9dc2ef510ef0d985ecc4bf44924) @@ -1,11 +1,12 @@ import struct from ..common.msg_defs import MsgIds, MsgFieldPositions -from ..protocols.CAN import (DenaliMessage, DenaliChannels) +from ..protocols.CAN import DenaliMessage, DenaliChannels from ..utils.base import _AbstractSubSystem, _publish, DialinEnum from logging import Logger from enum import unique + @unique class HeatDisinfectStates(DialinEnum): @@ -35,6 +36,19 @@ @unique +class HeatDisinfectUIStates(DialinEnum): + + HEAT_DISINFECT_UI_STATE_NOT_RUNNING = 0 + HEAT_DISINFECT_UI_STATE_FLUSH_BEFORE_DISINFECT = 1 + HEAT_DISINFECT_UI_STATE_HEAT_UP_WATER = 2 + HEAT_DISINFECT_UI_STATE_DISINFECT_DEVICE = 3 + HEAT_DISINFECT_UI_STATE_COOL_DOWN_DEVICE = 4 + HEAT_DISINFECT_UI_STATE_FLUSH_AFTER_DISINFECT = 5 + HEAT_DISINFECT_UI_STATE_CANCEL_DISINFECT = 6 + HEAT_DISINFECT_UI_STATE_COMPLETE = 7 + + +@unique class HeatCancellationModes(DialinEnum): CANCELLATION_MODE_NONE = 0 @@ -58,9 +72,11 @@ self.logger = logger self.heat_disinfect_state = 0 + self.heat_disinfect_ui_state = 0 self.overall_elapsed_time = 0 self.state_elapsed_time = 0 - self.disinfect_elapsed_time = 0 + self.heat_disinfect_target_time = 0 + self.heat_disinfect_elapsed_time = 0 self.cancellation_mode = 0 self.r1_level = 0 self.r2_level = 0 @@ -72,25 +88,28 @@ self._handler_heat_disinfect_sync) channel_id = DenaliChannels.dg_to_ui_ch_id - msg_id = MsgIds.MSG_ID_DG_HEAT_DISINFECT_TO_UI_DATA_PUBLISH.value + msg_id = MsgIds.MSG_ID_DG_HEAT_DISINFECT_TIME_DATA.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_heat_disinfect_to_ui_sync) - @_publish(["disinfect_elapsed_time"]) + @_publish(["heat_disinfect_target_time", "heat_disinfect_elapsed_time"]) def _handler_heat_disinfect_to_ui_sync(self, message): """ Handles published heat disinfect message @param message: published heat disinfect UI data message @returns none """ - disinfect_elapsed_time = struct.unpack('i', bytearray( + disinfect_target_time = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] + disinfect_elapsed_time = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - self.disinfect_elapsed_time = int(disinfect_elapsed_time / 1000) + self.heat_disinfect_target_time = int(disinfect_target_time / 1000) + self.heat_disinfect_elapsed_time = int(disinfect_elapsed_time / 1000) @_publish(["heat_disinfect_state", "overall_elapsed_time", "state_elapsed_time", "cancellation_mode", "r1_level", - "r2_level"]) + "r2_level", "heat_disinfect_ui_state"]) def _handler_heat_disinfect_sync(self, message): """ Handles published heat disinfect message @@ -110,12 +129,15 @@ message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] r2 = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6]))[0] + ui = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7]))[0] self.heat_disinfect_state = state self.overall_elapsed_time = int(elapsed_time / 1000) self.state_elapsed_time = int(state_elapsed_time / 1000) self.cancellation_mode = cancellation_mode self.r1_level = r1 self.r2_level = r2 + self.heat_disinfect_ui_state = ui Index: tests/dg_heat_and_chemical_disinfect_test.py =================================================================== diff -u -r0cca339a72337e4c56665e7c5aff65944909cfb3 -rf9ade5206d6da9dc2ef510ef0d985ecc4bf44924 --- tests/dg_heat_and_chemical_disinfect_test.py (.../dg_heat_and_chemical_disinfect_test.py) (revision 0cca339a72337e4c56665e7c5aff65944909cfb3) +++ tests/dg_heat_and_chemical_disinfect_test.py (.../dg_heat_and_chemical_disinfect_test.py) (revision f9ade5206d6da9dc2ef510ef0d985ecc4bf44924) @@ -3,8 +3,8 @@ import sys sys.path.append("..") from dialin.dg.dialysate_generator import DG -from dialin.dg.heat_disinfect import HeatDisinfectStates, HeatCancellationModes -from dialin.dg.chemical_disinfect import ChemicalDisinfectStates, ChemCancellationModes +from dialin.dg.heat_disinfect import HeatDisinfectStates, HeatCancellationModes, HeatDisinfectUIStates +from dialin.dg.chemical_disinfect import ChemicalDisinfectStates, ChemCancellationModes, ChemDisinfectUIStates from dialin.dg.drain_pump import DrainPumpStates from dialin.dg.thermistors import ThermistorsNames from dialin.dg.temperature_sensors import TemperatureSensorsNames @@ -17,13 +17,14 @@ info = ('State, {}, Overall_elapsed_time, {}, State_elapsed_time, {}, Disinfect_elapsed_time, {}, ' 'Cancellation_mode, {}, R1_level, {:5.3f}, R2_level, {:5.3f}, Current_rinse_count, {}, ' - 'Total_rinse_count, {}, ' + 'Total_rinse_count, {}, UI_state, {}, ' .format(ChemicalDisinfectStates(dg.chemical_disinfect.chemical_disinfect_state).name, dg.chemical_disinfect.overall_elapsed_time, dg.chemical_disinfect.state_elapsed_time, - dg.chemical_disinfect.disinfect_elapsed_time, + dg.chemical_disinfect.chemical_disinfect_elapsed_time, ChemCancellationModes(dg.chemical_disinfect.cancellation_mode).name, dg.chemical_disinfect.r1_level, - dg.chemical_disinfect.r2_level, - dg.chemical_disinfect.current_post_rinse_count, dg.chemical_disinfect.target_post_rinse_count)) + dg.chemical_disinfect.r2_level, dg.chemical_disinfect.current_post_rinse_count, + dg.chemical_disinfect.target_post_rinse_count, + ChemDisinfectUIStates(dg.chemical_disinfect.chemical_disinfect_ui_state).name)) return info @@ -40,13 +41,12 @@ def get_heat_disinfect_mode_info(): info = ('State, {}, Overall_elapsed_time, {}, State_elapsed_time, {}, Disinfect_elapsed_time, {}, ' - 'Cancellation_mode, {}, R1_level, {:5.3f}, R1_drift, {:5.3f}, R2_level, {:5.3f}, R2_drift, {:5.3f}, ' + 'Cancellation_mode, {}, R1_level, {:5.3f}, R2_level, {:5.3f}, UI_state, {}, ' .format(HeatDisinfectStates(dg.heat_disinfect.heat_disinfect_state).name, dg.heat_disinfect.overall_elapsed_time, dg.heat_disinfect.state_elapsed_time, - dg.heat_disinfect.disinfect_elapsed_time, + dg.heat_disinfect.heat_disinfect_elapsed_time, HeatCancellationModes(dg.heat_disinfect.cancellation_mode).name, dg.heat_disinfect.r1_level, - (dg.heat_disinfect.r1_level - dg.load_cells.load_cell_A1), dg.heat_disinfect.r2_level, - (dg.heat_disinfect.r2_level - dg.load_cells.load_cell_B1))) + dg.heat_disinfect.r2_level, HeatDisinfectUIStates(dg.heat_disinfect.heat_disinfect_ui_state).name)) return info @@ -318,11 +318,11 @@ #run_chemical_disinfect() - run_dg() + #run_dg() - #hd = HD() - #sleep(1) - #hd.ui.cmd_ui_set_standby_submode_to_disinfect() + hd = HD() + sleep(1) + hd.ui.cmd_ui_set_standby_submode_to_disinfect()