Index: dialin/dg/load_cells.py =================================================================== diff -u -r5e834984727c1798784d95ae17f686cb8d72fdca -rae1e423f7cf68432e1e3daf01b50a162de4563e4 --- dialin/dg/load_cells.py (.../load_cells.py) (revision 5e834984727c1798784d95ae17f686cb8d72fdca) +++ dialin/dg/load_cells.py (.../load_cells.py) (revision ae1e423f7cf68432e1e3daf01b50a162de4563e4) @@ -55,7 +55,7 @@ @param can_interface: Denali Can Messenger object """ - super().__init__(can_interface) + super().__init__() self.can_interface = can_interface Index: dialin/dg/valves.py =================================================================== diff -u -r06b80e958bf06899c4bb1ba8980afd439a292d64 -rae1e423f7cf68432e1e3daf01b50a162de4563e4 --- dialin/dg/valves.py (.../valves.py) (revision 06b80e958bf06899c4bb1ba8980afd439a292d64) +++ dialin/dg/valves.py (.../valves.py) (revision ae1e423f7cf68432e1e3daf01b50a162de4563e4) @@ -141,19 +141,19 @@ vst = struct.unpack('H', bytearray(message['message'][self.START_POS_VALVES_STATES:self.END_POS_VALVES_STATES])) self.valve_states_all = vst[0] # Extract each valve state from U16 valves states using bit-masking - self.valve_state_VRF = self._binary_to_valve_state(vst[0] & 0x0001) - self.valve_state_VRI = self._binary_to_valve_state(vst[0] & 0x0002) - self.valve_state_VRD = self._binary_to_valve_state(vst[0] & 0x0004) - self.valve_state_VRO = self._binary_to_valve_state(vst[0] & 0x0008) - self.valve_state_VPO = self._binary_to_valve_state(vst[0] & 0x0016) - self.valve_state_VBF = self._binary_to_valve_state(vst[0] & 0x0032) - self.valve_state_VRC = self._binary_to_valve_state(vst[0] & 0x0064) - self.valve_state_VDR = self._binary_to_valve_state(vst[0] & 0x0128) - self.valve_state_VPI = self._binary_to_valve_state(vst[0] & 0x0256) - self.valve_state_VSP = self._binary_to_valve_state(vst[0] & 0x0512) - self.valve_state_VR1 = self._binary_to_valve_state(vst[0] & 0x1024) - self.valve_state_VR2 = self._binary_to_valve_state(vst[0] & 0x2048) - self.valve_state_VPD = self._binary_to_valve_state(vst[0] & 0x4096) + self.valve_state_VRF = self._binary_to_valve_state(vst[0] & 1) + self.valve_state_VRI = self._binary_to_valve_state(vst[0] & 2) + self.valve_state_VRD = self._binary_to_valve_state(vst[0] & 4) + self.valve_state_VRO = self._binary_to_valve_state(vst[0] & 8) + self.valve_state_VPO = self._binary_to_valve_state(vst[0] & 16) + self.valve_state_VBF = self._binary_to_valve_state(vst[0] & 32) + self.valve_state_VRC = self._binary_to_valve_state(vst[0] & 64) + self.valve_state_VDR = self._binary_to_valve_state(vst[0] & 128) + self.valve_state_VPI = self._binary_to_valve_state(vst[0] & 256) + self.valve_state_VSP = self._binary_to_valve_state(vst[0] & 512) + self.valve_state_VR1 = self._binary_to_valve_state(vst[0] & 1024) + self.valve_state_VR2 = self._binary_to_valve_state(vst[0] & 2048) + self.valve_state_VPD = self._binary_to_valve_state(vst[0] & 4096) def cmd_valve_override(self, state, valve, reset=NO_RESET): """ Index: dialin/hd/blood_flow.py =================================================================== diff -u -r044087c3a2f8b762452ebd58eaeb27db968b31a2 -rae1e423f7cf68432e1e3daf01b50a162de4563e4 --- dialin/hd/blood_flow.py (.../blood_flow.py) (revision 044087c3a2f8b762452ebd58eaeb27db968b31a2) +++ dialin/hd/blood_flow.py (.../blood_flow.py) (revision ae1e423f7cf68432e1e3daf01b50a162de4563e4) @@ -18,10 +18,11 @@ DenaliChannels) from ..utils.conversions import integer_to_bytearray, float_to_bytearray from .constants import RESET, NO_RESET +from ..utils.base import _AbstractSubSystem, _publish import struct -class HDBloodFlow: +class HDBloodFlow(_AbstractSubSystem): """ \class HD_BloodFlow @@ -61,6 +62,8 @@ @param outer_instance: reference to the HD (outer) class. """ + super().__init__() + self.can_interface = can_interface if self.can_interface is not None: @@ -133,6 +136,9 @@ """ return self.pwm_duty_cycle_pct + @_publish(["target_blood_flow_rate", "measured_blood_flow_rate", "measured_blood_pump_rotor_speed", + "measured_blood_pump_speed", "measured_blood_pump_mc_speed", "measured_blood_pump_mc_current", + "pwm_duty_cycle_pct"]) def _handler_blood_flow_sync(self, message): """ Handles published blood flow data messages. Blood flow data are captured Index: dialin/hd/dialysate_inlet_flow.py =================================================================== diff -u -r044087c3a2f8b762452ebd58eaeb27db968b31a2 -rae1e423f7cf68432e1e3daf01b50a162de4563e4 --- dialin/hd/dialysate_inlet_flow.py (.../dialysate_inlet_flow.py) (revision 044087c3a2f8b762452ebd58eaeb27db968b31a2) +++ dialin/hd/dialysate_inlet_flow.py (.../dialysate_inlet_flow.py) (revision ae1e423f7cf68432e1e3daf01b50a162de4563e4) @@ -19,8 +19,9 @@ DenaliChannels) from ..utils.conversions import integer_to_bytearray, float_to_bytearray from .constants import RESET, NO_RESET +from ..utils.base import _AbstractSubSystem, _publish -class HDDialysateInletFlow: +class HDDialysateInletFlow(_AbstractSubSystem): """ \class HD_DialysateInletFlow @@ -59,6 +60,7 @@ HD_DialysateFlow constructor """ + super().__init__() self.can_interface = can_interface if self.can_interface is not None: @@ -75,7 +77,6 @@ self.measured_dialysate_inlet_pump_mc_current = 0.0 self.pwm_duty_cycle_pct = 0.0 - def get_target_dialysate_inlet_flow_rate(self): """ Gets the target dialysate inlet flow rate @@ -132,6 +133,14 @@ """ return self.pwm_duty_cycle_pct + @_publish([ + "target_dialysate_inlet_flow_rate", + "measured_dialysate_inlet_pump_rotor_speed", + "measured_dialysate_inlet_pump_speed", + "measured_dialysate_inlet_pump_mc_speed", + "measured_dialysate_inlet_pump_mc_current", + "pwm_duty_cycle_pct" + ]) def _handler_dialysate_inlet_flow_sync(self, message): """ Handles published dialysate inlet flow data messages. Dialysate flow data are captured Index: dialin/hd/dialysate_outlet_flow.py =================================================================== diff -u -r044087c3a2f8b762452ebd58eaeb27db968b31a2 -rae1e423f7cf68432e1e3daf01b50a162de4563e4 --- dialin/hd/dialysate_outlet_flow.py (.../dialysate_outlet_flow.py) (revision 044087c3a2f8b762452ebd58eaeb27db968b31a2) +++ dialin/hd/dialysate_outlet_flow.py (.../dialysate_outlet_flow.py) (revision ae1e423f7cf68432e1e3daf01b50a162de4563e4) @@ -19,8 +19,10 @@ DenaliChannels) from ..utils.conversions import integer_to_bytearray, float_to_bytearray from .constants import RESET, NO_RESET +from ..utils.base import _AbstractSubSystem, _publish -class HDDialysateOutletFlow: + +class HDDialysateOutletFlow(_AbstractSubSystem): """ Hemodialysis Device (HD) Dialin API sub-class for dialysate outlet pump related commands. """ @@ -57,6 +59,7 @@ """ HDDialysateFlow constructor """ + super().__init__() self.can_interface = can_interface if self.can_interface is not None: @@ -127,6 +130,15 @@ """ return self.pwm_duty_cycle_pct + @_publish([ + "reference_dialysate_outlet_uf_volume", + "measured_dialysate_outlet_uf_volume", + "measured_dialysate_outlet_pump_rotor_speed", + "measured_dialysate_outlet_pump_speed", + "measured_dialysate_outlet_pump_mc_speed", + "measured_dialysate_outlet_pump_mc_current", + "pwm_duty_cycle_pct" + ]) def _handler_dialysate_outlet_flow_sync(self, message): """ Handles published dialysate outlet flow data messages. Dialysate flow data are captured Index: dialin/hd/pressure_occlusion.py =================================================================== diff -u -r044087c3a2f8b762452ebd58eaeb27db968b31a2 -rae1e423f7cf68432e1e3daf01b50a162de4563e4 --- dialin/hd/pressure_occlusion.py (.../pressure_occlusion.py) (revision 044087c3a2f8b762452ebd58eaeb27db968b31a2) +++ dialin/hd/pressure_occlusion.py (.../pressure_occlusion.py) (revision ae1e423f7cf68432e1e3daf01b50a162de4563e4) @@ -19,9 +19,10 @@ DenaliChannels) from ..utils.conversions import integer_to_bytearray, float_to_bytearray from .constants import RESET, NO_RESET +from ..utils.base import _AbstractSubSystem, _publish -class HDPressureOcclusion: +class HDPressureOcclusion(_AbstractSubSystem): """ Hemodialysis Device (HD) Dialin API sub-class for pressure related commands. """ @@ -53,6 +54,7 @@ @return: HDPressureOcclusion object. """ + super().__init__() self.can_interface = can_interface if self.can_interface is not None: @@ -106,6 +108,14 @@ """ return self.dialysate_outlet_pump_occlusion + + @_publish([ + "arterial_pressure", + "venous_pressure", + "blood_pump_occlusion", + "dialysate_inlet_pump_occlusion", + "dialysate_outlet_pump_occlusion" + ]) def _handler_pressure_occlusion_sync(self, message): """ Handles published pressure & occlusion data messages. Pressure data are captured Index: dialin/utils/base.py =================================================================== diff -u -r5e834984727c1798784d95ae17f686cb8d72fdca -rae1e423f7cf68432e1e3daf01b50a162de4563e4 --- dialin/utils/base.py (.../base.py) (revision 5e834984727c1798784d95ae17f686cb8d72fdca) +++ dialin/utils/base.py (.../base.py) (revision ae1e423f7cf68432e1e3daf01b50a162de4563e4) @@ -21,7 +21,7 @@ class _AbstractSubSystem(ABC): @abstractmethod - def __init__(self, can_interface: str = "can0"): + def __init__(self): """ Initialization function for the sub system @@ -42,6 +42,7 @@ """ self._observers.remove(observer) + def _publish(keys): """ Decorator that accepts a list of variable names to publish Index: tests/test_demo.py =================================================================== diff -u -rc6c42e21248dd7f4bf391b75541aaaae14a1ab42 -rae1e423f7cf68432e1e3daf01b50a162de4563e4 --- tests/test_demo.py (.../test_demo.py) (revision c6c42e21248dd7f4bf391b75541aaaae14a1ab42) +++ tests/test_demo.py (.../test_demo.py) (revision ae1e423f7cf68432e1e3daf01b50a162de4563e4) @@ -94,5 +94,24 @@ print(dialin.__version__) +def test_valves(): + dg = DG() + if dg.cmd_log_in_to_dg(): + print(dg.valves.get_valve_states()) + + for valve_id in range(0, 13): + dg.valves.cmd_valve_override(False, valve_id, RESET) + + for valve_id in range(0, 13): + if valve_id % 2 == 0: + dg.valves.cmd_valve_override(True, valve_id, NO_RESET) + else: + dg.valves.cmd_valve_override(False, valve_id, RESET) + + print("Sleeping...") + time.sleep(5) + print(dg.valves.get_valve_states()) + + if __name__ == '__main__': - test_dialin_version() + test_valves()