Index: dialin/dg/dialysate_generator.py =================================================================== diff -u -r363867c876456821000c189f86fbb55b4d583c50 -rfffbd99bcd6d15ce790e490e3b455fda43e34b8d --- dialin/dg/dialysate_generator.py (.../dialysate_generator.py) (revision 363867c876456821000c189f86fbb55b4d583c50) +++ dialin/dg/dialysate_generator.py (.../dialysate_generator.py) (revision fffbd99bcd6d15ce790e490e3b455fda43e34b8d) @@ -319,46 +319,6 @@ self.logger.debug("requesting DG software reset") # Send message - received_message = self.can_interface.send(message) + self.can_interface.send(message, 0) + self.logger.debug("Sent request to DG to reset...") - if received_message is not None: - if received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] == 1: - self.logger.debug("DG is resetting...") - else: - self.logger.debug("DG reset request failed.") - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False - - def cmd_dg_change_operation_mode_request(self, mode=0): - """ - Constructs and sends an DG change operation mode request via CAN bus. - Constraints: - Must be logged into DG. - - \returns response message if received, False if no response received - - @return: 1 if successful, zero otherwise - - """ - - mode_byte_array = integer_to_bytearray(mode) - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=MsgIds.MSG_ID_DG_OPERATION_MODE_REQUEST.value, - payload=mode_byte_array) - - self.logger.debug("requesting DG operation mode change") - - # Send message - received_message = self.can_interface.send(message) - - if received_message is not None: - if received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] == 1: - self.logger.debug("request changing DG operation mode succesfully...") - else: - self.logger.debug("DG operation mode change request failed.") - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False Index: dialin/dg/hd_proxy.py =================================================================== diff -u -r363867c876456821000c189f86fbb55b4d583c50 -rfffbd99bcd6d15ce790e490e3b455fda43e34b8d --- dialin/dg/hd_proxy.py (.../hd_proxy.py) (revision 363867c876456821000c189f86fbb55b4d583c50) +++ dialin/dg/hd_proxy.py (.../hd_proxy.py) (revision fffbd99bcd6d15ce790e490e3b455fda43e34b8d) @@ -113,7 +113,7 @@ self.logger.debug("Timeout!!!!") return False - def cmd_drain(self, volume=200): + def cmd_drain(self, volume=200, tareLoadCell=False): """ Constructs and sends the drain command. Constraints: @@ -125,7 +125,8 @@ """ vol = integer_to_bytearray(volume) - payload = vol + tare = integer_to_bytearray(tareLoadCell) + payload = vol + tare message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, message_id=MsgIds.MSG_ID_DG_DRAIN_CMD.value, Index: dialin/dg/valves.py =================================================================== diff -u -r10719896ee0040b340e58ecad680a39bc4b9ff2d -rfffbd99bcd6d15ce790e490e3b455fda43e34b8d --- dialin/dg/valves.py (.../valves.py) (revision 10719896ee0040b340e58ecad680a39bc4b9ff2d) +++ dialin/dg/valves.py (.../valves.py) (revision fffbd99bcd6d15ce790e490e3b455fda43e34b8d) @@ -19,14 +19,57 @@ from ..common.msg_defs import MsgIds from .constants import NO_RESET from ..protocols.CAN import (DenaliMessage, DenaliChannels) -from ..utils.base import _AbstractSubSystem, _publish +from ..utils.base import _AbstractSubSystem, _publish, DialinEnum from logging import Logger +from enum import unique # Valve states ENERGIZED = True DEENERGIZED = False +@unique +class VPiVSPVBfStates(DialinEnum): + + VALVE_STATE_CLOSED = 0 + VALVE_STATE_OPEN = 1 + + +@unique +class VPdStates(DialinEnum): + + VALVE_STATE_OPEN_C_TO_NO = 0 + VALVE_STATE_DRAIN_C_TO_NC = 1 + + +@unique +class VPoStates(DialinEnum): + + VALVE_STATE_NOFILL_C_TO_NO = 0 + VALVE_STATE_FILL_C_TO_NC = 1 + + +@unique +class VDrVRcStates(DialinEnum): + + VALVE_STATE_DRAIN_C_TO_NO = 0 + VALVE_STATE_RECIRC_C_TO_NC = 1 + + +@unique +class VRoVRiStates(DialinEnum): + + VALVE_STATE_R1_C_TO_NO = 0 + VALVE_STATE_R2_C_TO_NC = 1 + + +@unique +class VRdVRfStates(DialinEnum): + + VALVE_STATE_R2_C_TO_NO = 0 + VALVE_STATE_R1_C_TO_NC = 1 + + class DGValves(_AbstractSubSystem): """ Dialysate Generation (DG) interface for valve related commands. @@ -50,6 +93,7 @@ VALVE_RESERVOIR_1 = 10 # VR1 VALVE_RESERVOIR_2 = 11 # VR2 VALVE_PRODUCTION_DRAIN = 12 # VPD + NUM_OF_VALVES = 13 # Number of valves def __init__(self, can_interface, logger: Logger): """ @@ -81,6 +125,8 @@ self.valve_state_VR2 = {"id": self.VALVE_RESERVOIR_2, "state": DEENERGIZED} self.valve_state_VPD = {"id": self.VALVE_PRODUCTION_DRAIN, "state": DEENERGIZED} + self.valve_states_enum = [0 for i in range(self.NUM_OF_VALVES)] + def get_valve_states(self): """ Gets the valve states @@ -127,6 +173,7 @@ For example: >>> dg = DG() >>> observation = {'datetime': datetime.datetime(2020, 7, 13, 10, 43, 27, 433357), + 'valve_state_VBF': {'id': 5, 'state': True}, 'valve_state_VDR': {'id': 7, 'state': True}, 'valve_state_VPD': {'id': 12, 'state': True}, @@ -142,6 +189,7 @@ 'valve_state_VSP': {'id': 9, 'state': True}, 'valve_states_all': 8191} >>> self.logger.debug(dg.valves.sort_by_id(observation)) + ('valve_state_VRF', 0, True) ('valve_state_VRI', 1, True) ('valve_state_VRD', 2, True) @@ -193,7 +241,8 @@ "valve_state_VSP", "valve_state_VR1", "valve_state_VR2", - "valve_state_VPD" + "valve_state_VPD", + "valve_states_enum" ]) def _handler_valves_sync(self, message): """ @@ -220,6 +269,20 @@ self.valve_state_VR2["state"] = self._binary_to_valve_state(vst[0] & 2048) self.valve_state_VPD["state"] = self._binary_to_valve_state(vst[0] & 4096) + self.valve_states_enum[self.VALVE_RESERVOIR_FILL] = VRdVRfStates(self._binary_to_valve_state(vst[0] & 1)).name # VRF + self.valve_states_enum[self.VALVE_RESERVOIR_INLET] = VRoVRiStates(self._binary_to_valve_state(vst[0] & 2)).name # VRI + self.valve_states_enum[self.VALVE_RESERVOIR_DRAIN] = VRdVRfStates(self._binary_to_valve_state(vst[0] & 4)).name # VRD + self.valve_states_enum[self.VALVE_RESERVOIR_OUTLET] = VRoVRiStates(self._binary_to_valve_state(vst[0] & 8)).name # VRO + self.valve_states_enum[self.VALVE_PRESSURE_OUTLET] = VPoStates(self._binary_to_valve_state(vst[0] & 16)).name # VPO + self.valve_states_enum[self.VALVE_BYPASS_FILTER] = VPiVSPVBfStates(self._binary_to_valve_state(vst[0] & 32)).name # VBF + self.valve_states_enum[self.VALVE_RECIRCULATE] = VDrVRcStates(self._binary_to_valve_state(vst[0] & 64)).name # VRC + self.valve_states_enum[self.VALVE_DRAIN] = VDrVRcStates(self._binary_to_valve_state(vst[0] & 128)).name # VDR + self.valve_states_enum[self.VALVE_PRESSURE_INLET] = VPiVSPVBfStates(self._binary_to_valve_state(vst[0] & 256)).name # VPI + self.valve_states_enum[self.VALVE_SAMPLING_PORT] = VPiVSPVBfStates(self._binary_to_valve_state(vst[0] & 512)).name # VSP + self.valve_states_enum[self.VALVE_RESERVOIR_1] = self._binary_to_valve_state(vst[0] & 1024) # VR1 + self.valve_states_enum[self.VALVE_RESERVOIR_2] = self._binary_to_valve_state(vst[0] & 2048) # VR2 + self.valve_states_enum[self.VALVE_PRODUCTION_DRAIN] = VPdStates(self._binary_to_valve_state(vst[0] & 4096)).name # VPD + def cmd_valve_override(self, state, valve, reset=NO_RESET): """ Constructs and sends the valve state override command.