Index: dialin/common/msg_defs.py =================================================================== diff -u -r111a7cd39ffa7b39669e7f38fbf3ff6fe9eae3e5 -r2700dbd3c0ced061a3d8141eb00e9e3a7a3e2817 --- dialin/common/msg_defs.py (.../msg_defs.py) (revision 111a7cd39ffa7b39669e7f38fbf3ff6fe9eae3e5) +++ dialin/common/msg_defs.py (.../msg_defs.py) (revision 2700dbd3c0ced061a3d8141eb00e9e3a7a3e2817) @@ -136,6 +136,8 @@ MSG_ID_UI_DISPOSABLE_REMOVAL_CONFIRM = 0x73 # UI user has confirmed disposable removal MSG_ID_HD_TREATMENT_LOG_DATA = 0x74 # HD sends treatment log data to UI message + MSG_ID_DG_START_STOP_FLUSH = 0x79 # HD to DG start/stop DG flush mode + MSG_ID_CAN_ERROR_COUNT = 0x999 # test code in support of EMC testing # service/test CAN messages Index: dialin/dg/dialysate_generator.py =================================================================== diff -u -r6ee95f85e0504b8c7214258074e3022b50c982bd -r2700dbd3c0ced061a3d8141eb00e9e3a7a3e2817 --- dialin/dg/dialysate_generator.py (.../dialysate_generator.py) (revision 6ee95f85e0504b8c7214258074e3022b50c982bd) +++ dialin/dg/dialysate_generator.py (.../dialysate_generator.py) (revision 2700dbd3c0ced061a3d8141eb00e9e3a7a3e2817) @@ -23,7 +23,6 @@ from .fans import Fans from .hd_proxy import DGHDProxy from .heaters import Heaters -from .heat_disinfect import HeatDisinfect from .load_cells import DGLoadCells from .pressures import DGPressures from .reservoirs import DGReservoirs @@ -44,6 +43,7 @@ from ..protocols.CAN import (DenaliCanMessenger, DenaliMessage, DenaliChannels) from ..utils.base import _AbstractSubSystem, _publish, _LogManager from ..common.msg_defs import MsgIds, MsgFieldPositions +from .flush import FlushMode class DG(_AbstractSubSystem): @@ -166,6 +166,7 @@ self.service_record = DGServiceNVRecord(self.can_interface, self.logger) self.scheduled_runs_record = DGScheduledRunsNVRecord(self.can_interface, self.logger) self.valves = DGValves(self.can_interface, self.logger) + self.flush = FlushMode(self.can_interface, self.logger) def get_version(self): """ Index: dialin/dg/flush.py =================================================================== diff -u -r7c9dd1487f23d6bf314dcff09b77a25d9a26d1c2 -r2700dbd3c0ced061a3d8141eb00e9e3a7a3e2817 --- dialin/dg/flush.py (.../flush.py) (revision 7c9dd1487f23d6bf314dcff09b77a25d9a26d1c2) +++ dialin/dg/flush.py (.../flush.py) (revision 2700dbd3c0ced061a3d8141eb00e9e3a7a3e2817) @@ -44,7 +44,7 @@ if self.can_interface is not None: channel_id = DenaliChannels.dg_sync_broadcast_ch_id - msg_id = MsgIds.MSG_ID_DG_FLUSH_DATA.value + msg_id = 0#MsgIds.MSG_ID_DG_FLUSH_DATA.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_flush_sync) @_publish(["flush_state", "overall_elapsed_time", "state_elapsed_time"]) Index: dialin/dg/hd_proxy.py =================================================================== diff -u -r01db18a18769df2048346f868412fc8a12631fc0 -r2700dbd3c0ced061a3d8141eb00e9e3a7a3e2817 --- dialin/dg/hd_proxy.py (.../hd_proxy.py) (revision 01db18a18769df2048346f868412fc8a12631fc0) +++ dialin/dg/hd_proxy.py (.../hd_proxy.py) (revision 2700dbd3c0ced061a3d8141eb00e9e3a7a3e2817) @@ -215,38 +215,6 @@ self.logger.debug("Timeout!!!!") return False - def cmd_start_heat_disinfection(self): - """ - Constructs and sends start heat disinfect command - Constraints: - N/A - - @returns none - """ - # 1 is to start - payload = integer_to_bytearray(1) - 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("Starting heat disinfection process") - received_message = self.can_interface.send(message) - - def cmd_stop_heat_disinfection(self): - """ - Constructs and sends stop heat disinfect command - Constraints: - N/A - - @returns none - """ - # 1 is to start - payload = integer_to_bytearray(0) - 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("Stopping heat disinfection process") - received_message = self.can_interface.send(message) - def cmd_stop_primary_heater(self): """ Constructs and sends stop heat disinfect command @@ -277,9 +245,9 @@ def cmd_start_stop_heat_disinfect(self, start=True): """ - Constructs and sends the start/stop DG heat disinfection command + Constructs and sends the start/stop DG heat disinfect command - @param start: (bool) True = start heat disinfection, False = stop heat disinfection. + @param start: (bool) True = start heat disinfect, False = stop heat disinfect. @return: non-zero integer if successful, False otherwise """ # 1 is to start @@ -305,3 +273,34 @@ else: self.logger.debug("Timeout!!!!") return False + + def cmd_start_stop_dg_flush(self, start=True): + """ + Constructs and sends the start/stop DG flush command + + @param start: (bool) True = start flush, False = stop flush. + @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_FLUSH.value, + payload=payload) + + self.logger.debug(str + " DG flush") + + 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/heaters.py =================================================================== diff -u -r18c04cbcd10619250868cec39470a2b29c86121b -r2700dbd3c0ced061a3d8141eb00e9e3a7a3e2817 --- dialin/dg/heaters.py (.../heaters.py) (revision 18c04cbcd10619250868cec39470a2b29c86121b) +++ dialin/dg/heaters.py (.../heaters.py) (revision 2700dbd3c0ced061a3d8141eb00e9e3a7a3e2817) @@ -52,6 +52,8 @@ self.main_primary_heater_duty_cycle = 0 self.small_primary_heater_duty_cycle = 0 self.trimmer_heater_duty_cycle = 0 + self.primary_heaters_target_temperature = 0.0 + self.trimmer_heater_target_temperature = 0.0 if self.can_interface is not None: channel_id = DenaliChannels.dg_sync_broadcast_ch_id @@ -78,11 +80,28 @@ """ Gets the trimmer heater duty cycle - @return: Trimmer primary heater duty cycle + @return: Trimmer heater duty cycle """ return self.trimmer_heater_duty_cycle - @_publish(["main_primary_heater_duty_cycle", "small_primary_heater_duty_cycle", "trimmer_heater_duty_cycle"]) + def get_primary_heaters_target_temp(self): + """ + Gets the primary heaters target temperature + + @return: Primary heater target temperature + """ + return self.primary_heaters_target_temperature + + def get_trimmer_heater_target_temperature(self): + """ + Gets the trimmer heater target temperature + + @return: Trimmer heater target temperature + """ + return self.trimmer_heater_target_temperature + + @_publish(["main_primary_heater_duty_cycle", "small_primary_heater_duty_cycle", "trimmer_heater_duty_cycle", + "primary_heaters_target_temperature", "trimmer_heater_target_temperature"]) def _handler_heaters_sync(self, message): """ Handles published heaters message @@ -91,15 +110,21 @@ @returns none """ main_primary_heater_pwm = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1])) + message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] small_primary_heater_pwm = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2])) + message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] trimmer_heater_pwm = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3])) + message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] + primary_heaters_temp = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] + trimmer_heater_temp = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] - self.main_primary_heater_duty_cycle = main_primary_heater_pwm[0] - self.small_primary_heater_duty_cycle = small_primary_heater_pwm[0] - self.trimmer_heater_duty_cycle = trimmer_heater_pwm[0] + self.main_primary_heater_duty_cycle = main_primary_heater_pwm + self.small_primary_heater_duty_cycle = small_primary_heater_pwm + self.trimmer_heater_duty_cycle = trimmer_heater_pwm + self.primary_heaters_target_temperature = primary_heaters_temp + self.trimmer_heater_target_temperature = trimmer_heater_temp def cmd_start_stop_primary_heater(self, state=HeatersStartStop.STOP.name): """ Index: tests/dg_heat_disinfect_test.py =================================================================== diff -u -r16c42ec1b3d2ee30b81a3a06a130cc9ab00cbe62 -r2700dbd3c0ced061a3d8141eb00e9e3a7a3e2817 --- tests/dg_heat_disinfect_test.py (.../dg_heat_disinfect_test.py) (revision 16c42ec1b3d2ee30b81a3a06a130cc9ab00cbe62) +++ tests/dg_heat_disinfect_test.py (.../dg_heat_disinfect_test.py) (revision 2700dbd3c0ced061a3d8141eb00e9e3a7a3e2817) @@ -36,7 +36,7 @@ def get_heat_disinfect_mode_info(): - info = ('State, {}, Overall_elapsed_time, {}, State_elapsed_time, {}, Disinfect_elapsed_time {}, ' + 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} ' .format(HeatDisinfectStates(dg.heat_disinfect.heat_disinfect_state).name, dg.heat_disinfect.overall_elapsed_time, dg.heat_disinfect.state_elapsed_time, @@ -96,7 +96,7 @@ info = ('Pri_main_DC, {:5.3f}, Pri_small_DC, {:5.3f}, Pri_int_temp, {:5.3f}, Prim_CJ_temp, {:5.3f}, ' 'Prim_TC_temp, {:5.3f}, Trimmer_DC, {:5.3f}, Trim_int_temp, {:5.3f}, Trim_CJ_temp, {:5.3f}, ' 'Trim_TC_temp, {:5.3f}, Prim_TC_raw, {:5.3f}, Prim_CJ_raw, {:5.3f}, Trimmer_TC_raw, {:5.3f}, ' - 'Trimmer_CJ_raw, {:5.3f}, '. + 'Trimmer_CJ_raw, {:5.3f}, Primary_target_temp, {:5.3f}, Trimmer_target_temp, {:5.3f}, '. format(dg.heaters.main_primary_heater_duty_cycle, dg.heaters.small_primary_heater_duty_cycle, dg.temperature_sensors.temperature_sensors[TemperatureSensorsNames.PRIMARY_HEATER_INTERNAL.name], dg.temperature_sensors.temperature_sensors[TemperatureSensorsNames.PRIMARY_HEATER_COLD_JUNCTION.name], @@ -106,7 +106,8 @@ dg.temperature_sensors.temperature_sensors[TemperatureSensorsNames.TRIMMER_HEATER_COLD_JUNCTION.name], dg.temperature_sensors.temperature_sensors[TemperatureSensorsNames.TRIMMER_HEATER_THERMOCOUPLE.name], dg.temperature_sensors.primary_raw_thermo_couple, dg.temperature_sensors.primary_raw_cold_junc, - dg.temperature_sensors.trimmer_raw_thermo_couple, dg.temperature_sensors.trimmer_raw_cold_junc)) + dg.temperature_sensors.trimmer_raw_thermo_couple, dg.temperature_sensors.trimmer_raw_cold_junc, + dg.heaters.primary_heaters_target_temperature, dg.heaters.trimmer_heater_target_temperature)) return info @@ -140,7 +141,7 @@ complete_counter = 1 f = open("/home/fw/projects/dialin/tests/Heat_disinfect.log", "w") - #dg.hd_proxy.cmd_start_stop_heat_disinfect() + dg.hd_proxy.cmd_start_stop_heat_disinfect() try: while True: Index: tests/test_flush.py =================================================================== diff -u -r01db18a18769df2048346f868412fc8a12631fc0 -r2700dbd3c0ced061a3d8141eb00e9e3a7a3e2817 --- tests/test_flush.py (.../test_flush.py) (revision 01db18a18769df2048346f868412fc8a12631fc0) +++ tests/test_flush.py (.../test_flush.py) (revision 2700dbd3c0ced061a3d8141eb00e9e3a7a3e2817) @@ -61,7 +61,7 @@ complete_counter = 1 f = open("/home/fw/projects/dialin/tests/Flush_mode.log", "w") - #dg.flush.cmd_start_stop_flush() + dg.hd_proxy.cmd_start_stop_dg_flush() try: while True: flush = get_flush_mode_info() @@ -80,15 +80,15 @@ if dg.dg_operation_mode == 3 or dg.dg_operation_mode == 4: # If it is the first call, stop heat disinfect if complete_counter == 1: - dg.flush.cmd_start_stop_flush(start=False) + dg.hd_proxy.cmd_start_stop_flush(start=False) pass # Write a few more complete states to make sure the complete state items are recorded elif complete_counter == 3: f.close() break except KeyboardInterrupt: - dg.flush.cmd_start_stop_flush(start=False) + dg.hd_proxy.cmd_start_stop_flush(start=False) f.close()