Index: dialin/dg/dialysate_generator.py =================================================================== diff -u -r58b407f058f91bdecf050dcf2bd336bb0abc395b -r5c4333a9fe36fe3abc9f475368875e0077e6b86d --- dialin/dg/dialysate_generator.py (.../dialysate_generator.py) (revision 58b407f058f91bdecf050dcf2bd336bb0abc395b) +++ dialin/dg/dialysate_generator.py (.../dialysate_generator.py) (revision 5c4333a9fe36fe3abc9f475368875e0077e6b86d) @@ -114,7 +114,7 @@ #self.pressures = DGPressures(self.can_interface) #self.reservoirs = DGReservoirs(self.can_interface) #self.valves = DGValves(self.can_interface) - #self.ro_pump = DGROPump(self.can_interface) + self.ro_pump = DGROPump(self.can_interface) #self.drain_pump = DGDrainPump(self.can_interface) self.heaters = Heaters(self.can_interface) self.temperature_sensors = TemperatureSensors(self.can_interface) Index: dialin/dg/ro_pump.py =================================================================== diff -u -r832c90d58ce012f8c4dbfb3cfaa6fcf631724dbb -r5c4333a9fe36fe3abc9f475368875e0077e6b86d --- dialin/dg/ro_pump.py (.../ro_pump.py) (revision 832c90d58ce012f8c4dbfb3cfaa6fcf631724dbb) +++ dialin/dg/ro_pump.py (.../ro_pump.py) (revision 5c4333a9fe36fe3abc9f475368875e0077e6b86d) @@ -108,7 +108,7 @@ if reset == RESET: str_res = "reset back to normal" else: - str_res = str(prs) + str_res = str(pressure) print( "RO pump pressure set point overridden to " + str_res + " PSI: " + str(received_message['message'][DenaliMessage.PAYLOAD_START_INDEX])) Index: dialin/dg/temperature_sensors.py =================================================================== diff -u -refdf22298708b66820df4084023381f8409634bc -r5c4333a9fe36fe3abc9f475368875e0077e6b86d --- dialin/dg/temperature_sensors.py (.../temperature_sensors.py) (revision efdf22298708b66820df4084023381f8409634bc) +++ dialin/dg/temperature_sensors.py (.../temperature_sensors.py) (revision 5c4333a9fe36fe3abc9f475368875e0077e6b86d) @@ -16,13 +16,15 @@ ############################################################################ import struct from ..utils.conversions import integer_to_bytearray +from ..utils.conversions import float_to_bytearray from .constants import NO_RESET from ..protocols.CAN import (DenaliMessage, DenaliChannels) class TemperatureSensors: MSG_ID_DG_TEMPERATURE_DATA = 0x2D MSG_ID_TEMPERATURE_SENSORS_PUBLISH_INTERVAL_OVERRIDE = 0xA012 + MSG_ID_TEMPERATURE_SENSORS_VALUE_OVERRIDE = 0xA010 # Inlet primary temperature sensor START_POS_INLET_PRIMARY_TEMP = DenaliMessage.PAYLOAD_START_INDEX @@ -94,47 +96,47 @@ message['message'][self.START_POS_INLET_PRIMARY_TEMP:self.END_POS_INLET_PRIMARY_TEMP])) self.inletPrimary = sensorsData[0] - sensorsData = struct.unpack('i', bytearray( + sensorsData = struct.unpack('f', bytearray( message['message'][self.START_POS_OUTLET_PRIMARY_TEMP:self.END_POS_OUTLET_PRIMARY_TEMP])) self.outletPrimary = sensorsData[0] - sensorsData = struct.unpack('i', bytearray( + sensorsData = struct.unpack('f', bytearray( message['message'][self.START_POS_CD1_TEMP:self.END_POS_CD1_TEMP])) self.cd1 = sensorsData[0] - sensorsData = struct.unpack('i', bytearray( + sensorsData = struct.unpack('f', bytearray( message['message'][self.START_POS_CD2_TEMP:self.END_POS_CD2_TEMP])) self.cd2 = sensorsData[0] - sensorsData = struct.unpack('i', bytearray( + sensorsData = struct.unpack('f', bytearray( message['message'][self.START_POS_OUTLET_REDUNDANCY_TEMP:self.END_POS_OUTLET_REDUNDANCY_TEMP])) self.outletRedundancy = sensorsData[0] - sensorsData = struct.unpack('i', bytearray( + sensorsData = struct.unpack('f', bytearray( message['message'][self.START_POS_INLET_DIALYSATE_TEMP:self.END_POS_INLET_DIALYSATE_TEMP])) self.inletDialysate = sensorsData[0] - sensorsData = struct.unpack('i', bytearray( + sensorsData = struct.unpack('f', bytearray( message['message'][self.START_POS_PRI_TC_TEMP:self.END_POS_PRI_TC_TEMP])) self.primaryTC = sensorsData[0] - sensorsData = struct.unpack('i', bytearray( + sensorsData = struct.unpack('f', bytearray( message['message'][self.START_POS_TRI_TC_TEMP:self.END_POS_TRI_TC_TEMP])) self.trimmerTC = sensorsData[0] - sensorsData = struct.unpack('i', bytearray( + sensorsData = struct.unpack('f', bytearray( message['message'][self.START_POS_PRI_CJ_TEMP:self.END_POS_PRI_CJ_TEMP])) self.primaryCJ = sensorsData[0] - sensorsData = struct.unpack('i', bytearray( + sensorsData = struct.unpack('f', bytearray( message['message'][self.START_POS_TRI_CJ_TEMP:self.END_POS_TRI_CJ_TEMP])) self.trimmerCJ = sensorsData[0] - sensorsData = struct.unpack('i', bytearray( + sensorsData = struct.unpack('f', bytearray( message['message'][self.START_POS_PRI_INTERNAL_TEMP:self.END_POS_PRI_INTERNAL_TEMP])) self.primaryInternal = sensorsData[0] - sensorsData = struct.unpack('i', bytearray( + sensorsData = struct.unpack('f', bytearray( message['message'][self.START_POS_TRI_INTERNAL_TEMP:self.END_POS_TRI_INTERNAL_TEMP])) self.trimmerInternal = sensorsData[0] @@ -165,3 +167,35 @@ else: print("Timeout!!!!") return False + + def cmd_temperature_sensors_override_value(self, sensorIndex, sensorValue, reset=NO_RESET): + """ + Constructs and sends the value override of a temperature sensor + + \param sensorIndex : Index of the sensor + \param sensorValue: Value of the sensor to be overriden + \returns 1 if successful, zero otherwise + """ + rst = integer_to_bytearray(reset) + value = float_to_bytearray(sensorValue) + index = integer_to_bytearray(sensorIndex) + + payload = rst + value + index + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message_id=self.MSG_ID_TEMPERATURE_SENSORS_VALUE_OVERRIDE, + payload=payload) + + print("Setting sensor {} to {} C".format(sensorIndex, sensorValue)) + + # Send message + received_message = self.can_interface.send(message) + + # If there is content in message + if received_message is not None: + # Response payload is OK or not + return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] + else: + print("Timeout!!!!") + return False + Index: tests/dg_heaters_test.py =================================================================== diff -u -r59cde4f29ed4a5f31caf00ca7687ee7c531ba2c5 -r5c4333a9fe36fe3abc9f475368875e0077e6b86d --- tests/dg_heaters_test.py (.../dg_heaters_test.py) (revision 59cde4f29ed4a5f31caf00ca7687ee7c531ba2c5) +++ tests/dg_heaters_test.py (.../dg_heaters_test.py) (revision 5c4333a9fe36fe3abc9f475368875e0077e6b86d) @@ -1,4 +1,19 @@ - +########################################################################### +# +# Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. +# +# THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN +# WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. +# +# @file HemodialysisDevice.py +# +# @date 31-Mar-2020 +# @author P. Lucia +# +# @brief This class provides the basic interface to communicate with +# the HD board. +# +############################################################################ import sys sys.path.append("..") from dialin.dg.dialysate_generator import DG @@ -8,14 +23,60 @@ dg = DG() - #test = dg.heaters.heatersData - + dg.cmd_log_in_to_dg() + counter=0 dg.cmd_ui_request_dg_version() - sleep(2) - print('DG Version {}'.format(dg.dg_version)) + sleep(1) + print(dg.dg_version) + """ + dg.ro_pump.cmd_ro_pump_set_point_override(120) + + + dg.heaters.cmd_set_dialysate_target_temperature() + + sleep(1) + #dg.heaters.cmd_start_primary_heater() + #sleep(1) + dg.heaters.cmd_start_trimmer_heater() + sleep(1) + #dg.heaters.cmd_heaters_broadcast_interval_override(200) + #dg.temperature_sensors.cmd_temperature_sensors_override_value(0, 125.0, reset=1) + #dg.temperature_sensors.cmd_temperature_sensors_broadcast_interval_override(200, reset=1) + + #dg.ro_pump.cmd_ro_flow_rate_override(0.46) + while True: - #print(dg.heaters.heatersData) - print(dg.temperature_sensors.temperatureSensorsData) - sleep(2) + print("TPi: {}, TPo: {}, TD1: {}, TD2: {}, TRo: {}, TDi: {}".format(dg.temperature_sensors.inletPrimary, + dg.temperature_sensors.outletPrimary, + dg.temperature_sensors.cd1, + dg.temperature_sensors.cd2, + dg.temperature_sensors.outletRedundancy, + dg.temperature_sensors.inletDialysate)) + #print("Main Primary Heater DC: {}".format(dg.heaters.mainPrimaryHeaterPWM)) + #print("Small Primary Heater DC: {}".format(dg.heaters.smallPrimaryHeaterPWM)) + #print("Trimmer Heater DC: {}".format(dg.heaters.trimmerHeaterPWM)) + sleep(1) + counter = counter + 1 + + if counter > 60: + #print(counter) + break + + dg.heaters.cmd_stop_trimmer_heater() + #dg.heaters.cmd_stop_primary_heater() + sleep(1) + + + while True: + print("Main Primary Heater DC: {}".format(dg.heaters.mainPrimaryHeaterPWM)) + print("Small Primary Heater DC: {}".format(dg.heaters.smallPrimaryHeaterPWM)) + print("Trimmer Heater DC: {}".format(dg.heaters.trimmerHeaterPWM)) + sleep(0.7) + """ + + + + +