Index: dialin/dg/dialysate_generator.py =================================================================== diff -u -rde47961f6e48e38b2118b4c437718031c854aaba -r05353eded4d42bb6db53eb398486254af20f7cf0 --- dialin/dg/dialysate_generator.py (.../dialysate_generator.py) (revision de47961f6e48e38b2118b4c437718031c854aaba) +++ dialin/dg/dialysate_generator.py (.../dialysate_generator.py) (revision 05353eded4d42bb6db53eb398486254af20f7cf0) @@ -53,7 +53,9 @@ END_POS_MAJOR = START_POS_MAJOR + 1 START_POS_MINOR = END_POS_MAJOR END_POS_MINOR = START_POS_MINOR + 1 - START_POS_BUILD = END_POS_MINOR + START_POS_MICRO = END_POS_MINOR + END_POS_MICRO = START_POS_MICRO + 1 + START_POS_BUILD = END_POS_MICRO END_POS_BUILD = START_POS_BUILD + 2 # DG operation modes @@ -96,7 +98,7 @@ self.handler_dg_version) # initialize variables that will be populated by DG version response - self.dg_version = '' + self.dg_version = None # create properties self.dg_operation_mode = self.DG_OP_MODE_INIT_POST @@ -115,6 +117,7 @@ \param message: response message from HD regarding valid treatment parameter ranges.\n U08 Major \n U08 Minor \n + U08 Micro \n U16 Build \n \returns none @@ -123,10 +126,13 @@ message['message'][self.START_POS_MAJOR:self.END_POS_MAJOR])) minor = struct.unpack('B', bytearray( message['message'][self.START_POS_MINOR:self.END_POS_MINOR])) + micro = struct.unpack('B', bytearray( + message['message'][self.START_POS_MICRO:self.END_POS_MICRO])) build = struct.unpack('H', bytearray( message['message'][self.START_POS_BUILD:self.END_POS_BUILD])) - self.dg_version = 'v' + str(major) + '.' + str(minor) + '.' + str(build) + if len(major) > 0 and len(minor) > 0 and len(micro) > 0 and len(build) > 0: + self.dg_version = f"v{major[0]}.{minor[0]}.{micro[0]}-{build[0]}" def handler_dg_op_mode_sync(self, message): """ Index: dialin/hd/buttons.py =================================================================== diff -u -reac1e596b8ae87b8cc098eea57564bcf39985fcb -r05353eded4d42bb6db53eb398486254af20f7cf0 --- dialin/hd/buttons.py (.../buttons.py) (revision eac1e596b8ae87b8cc098eea57564bcf39985fcb) +++ dialin/hd/buttons.py (.../buttons.py) (revision 05353eded4d42bb6db53eb398486254af20f7cf0) @@ -42,6 +42,7 @@ def cmd_off_button_override(self, state, reset=NO_RESET): """ Constructs and sends the Off button override command + See HD/App/Controllers/Buttons.c \param state: integer - 1 to override off button to "pressed", 0 to "released" \param reset: integer - 1 to reset a previous override, 0 to override @@ -79,6 +80,7 @@ def cmd_stop_button_override(self, state, reset=NO_RESET): """ Constructs and sends the Stop button override command + See HD/App/Controllers/Buttons.c \param state: integer - 1 to override stop button to "pressed", 0 to "released" \param reset: integer - 1 to reset a previous override, 0 to override Index: dialin/hd/constants.py =================================================================== diff -u -r8c39fe1f9affe360ee6a97c5e6243e58a5c27509 -r05353eded4d42bb6db53eb398486254af20f7cf0 --- dialin/hd/constants.py (.../constants.py) (revision 8c39fe1f9affe360ee6a97c5e6243e58a5c27509) +++ dialin/hd/constants.py (.../constants.py) (revision 05353eded4d42bb6db53eb398486254af20f7cf0) @@ -17,3 +17,5 @@ RESET = 1 NO_RESET = 0 +BUTTON_PRESSED = 1 +BUTTON_RELEASED = 0 Index: dialin/hd/ui_proxy.py =================================================================== diff -u -rd24761670b6f557bf44ff5bb762c119a2e7cc889 -r05353eded4d42bb6db53eb398486254af20f7cf0 --- dialin/hd/ui_proxy.py (.../ui_proxy.py) (revision d24761670b6f557bf44ff5bb762c119a2e7cc889) +++ dialin/hd/ui_proxy.py (.../ui_proxy.py) (revision 05353eded4d42bb6db53eb398486254af20f7cf0) @@ -53,7 +53,9 @@ END_POS_MAJOR = START_POS_MAJOR + 1 START_POS_MINOR = END_POS_MAJOR END_POS_MINOR = START_POS_MINOR + 1 - START_POS_BUILD = END_POS_MINOR + START_POS_MICRO = END_POS_MINOR + END_POS_MICRO = START_POS_MICRO + 1 + START_POS_BUILD = END_POS_MICRO END_POS_BUILD = START_POS_BUILD + 2 # HD update on valid treatment parameter ranges message field positions @@ -132,7 +134,7 @@ self.handler_hd_version) # initialize variables that will be populated by HD version response - self.hd_version = '' + self.hd_version = None # initialize variables that will be populated by treatment parameter ranges message self.min_treatment_duration_min = 0 self.max_treatment_duration_min = 0 @@ -166,6 +168,7 @@ \param message: response message from HD regarding valid treatment parameter ranges.\n U08 Major \n U08 Minor \n + U08 Micro \n U16 Build \n \returns none @@ -174,10 +177,14 @@ message['message'][self.START_POS_MAJOR:self.END_POS_MAJOR])) minor = struct.unpack('B', bytearray( message['message'][self.START_POS_MINOR:self.END_POS_MINOR])) + micro = struct.unpack('B', bytearray( + message['message'][self.START_POS_MICRO:self.END_POS_MICRO])) build = struct.unpack('H', bytearray( message['message'][self.START_POS_BUILD:self.END_POS_BUILD])) - self.hd_version = 'v'+str(major)+'.'+str(minor)+'.'+str(build) + if len(major) > 0 and len(minor) > 0 and len(micro) > 0 and len(build) > 0: + self.hd_version = f"v{major[0]}.{minor[0]}.{micro[0]}-{build[0]}" + return self.hd_version def handler_treatment_param_ranges(self, message): """ Index: tests/test_demo.py =================================================================== diff -u --- tests/test_demo.py (revision 0) +++ tests/test_demo.py (revision 05353eded4d42bb6db53eb398486254af20f7cf0) @@ -0,0 +1,103 @@ +########################################################################### +# +# Copyright (c) 2019-2019 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 test_demo.py +# +# @date 15-May-2020 +# @author P. Lucia +# +# @brief This is a demo script to exercise the HD and DG. +# +############################################################################ +import sys +sys.path.append("..") +from dialin.dg.dialysate_generator import DG +from dialin.hd.hemodialysis_device import HD +from dialin.hd.constants import RESET, NO_RESET, BUTTON_PRESSED, BUTTON_RELEASED +import time + + +def test_dg_version(): + """ + Prints the DG version. + \returns None + """ + dg = DG() + if dg.cmd_log_in_to_dg(): + dg.cmd_ui_request_dg_version() + time.sleep(0.5) + print(dg.dg_version) + + +def test_hd_version(): + """ + Prints the HD version. + \returns None + """ + hd = HD() + + if hd.cmd_log_in_to_hd(): + hd.ui.cmd_ui_request_hd_version() + time.sleep(0.5) + print(f"Current HD version: {hd.ui.hd_version}") + + +def test_hd_off_button(): + """ + Simulates pressing the off button + \returns None + """ + hd = HD() + + if hd.cmd_log_in_to_hd(): + # reset previous override + hd.buttons.cmd_off_button_override(BUTTON_PRESSED, RESET) + + # simulate off button pressed + hd.buttons.cmd_off_button_override(BUTTON_PRESSED, NO_RESET) + + +def test_hd_stop_button(): + """ + Simulates pressing the stop button + \returns None + """ + raise NotImplementedError + """ + hd = HD() + + if hd.cmd_log_in_to_hd(): + hd.buttons.cmd_stop_button_override() + """ + + +def test_hd_blood_flow(ml_per_min=110): + """ + Sets the HD blood flow rate (mL / min) + \returns None + """ + hd = HD() + if hd.cmd_log_in_to_hd(): + hd.bloodflow.cmd_blood_flow_set_point_override(0, RESET) + hd.bloodflow.cmd_blood_flow_set_point_override(ml_per_min, NO_RESET) + while True: + print("measured blood flow rate: {0}".format(hd.bloodflow.measured_blood_flow_rate)) + time.sleep(0.5) + + +def test_stop_hd_blood_flow(): + """ + Stops the HD blood flow + \returns None + """ + hd = HD() + if hd.cmd_log_in_to_hd(): + hd.bloodflow.cmd_blood_flow_set_point_override(0, NO_RESET) + + +if __name__ == '__main__': + test_hd_version()