Index: dialin/common/msg_ids.py =================================================================== diff -u -raf21ad6b590a05515b33e573d1c9236f21cafa3e -r2e961b0daeddacde19f8a16718ed5eea3bd383f0 --- dialin/common/msg_ids.py (.../msg_ids.py) (revision af21ad6b590a05515b33e573d1c9236f21cafa3e) +++ dialin/common/msg_ids.py (.../msg_ids.py) (revision 2e961b0daeddacde19f8a16718ed5eea3bd383f0) @@ -216,6 +216,15 @@ MSG_ID_HD_BLOOD_LEAK_STATUS_DETECTOR_OVERRIDE = 0X804D MSG_ID_HD_BLOOD_LEAK_STATE_SEND_INTERVAL_OVERRIDE = 0X804E MSG_ID_HD_BLOOD_LEAK_STATE_DETECTOR_OVERRIDE = 0X804F + MSG_ID_HD_MONITORED_VOLTAGES_SEND_INTERVAL_OVERRIDE = 0x8050 + MSG_ID_HD_MONITORED_VOLTAGES_OVERRIDE = 0x8051 + MSG_ID_HD_ALARM_INFO_SEND_INTERVAL_OVERRIDE = 0x8052 + MSG_ID_HD_ALARM_AUDIO_VOLUME_LEVEL_OVERRIDE = 0x8053 + MSG_ID_HD_ALARM_AUDIO_CURRENT_HG_OVERRIDE = 0x8054 + MSG_ID_HD_ALARM_AUDIO_CURRENT_LG_OVERRIDE = 0x8055 + MSG_ID_HD_ALARM_BACKUP_AUDIO_CURRENT_OVERRIDE = 0x8056 + MSG_ID_HD_VALVES_CURRENT_OVERRIDE = 0x8057 + MSD_ID_HD_VALVES_POSITION_COUNT_OVERRIDE = 0x8058 MSG_ID_PRESSURE_OCCLUSION_DATA = 0X9 MSG_ID_CAN_ERROR_COUNT = 0X999 MSG_ID_RTC_EPOCH = 0XA Index: dialin/dg/uv_reactors.py =================================================================== diff -u -r56f06b55eb8ab96bd69d12eb9d9d5c71241755ad -r2e961b0daeddacde19f8a16718ed5eea3bd383f0 --- dialin/dg/uv_reactors.py (.../uv_reactors.py) (revision 56f06b55eb8ab96bd69d12eb9d9d5c71241755ad) +++ dialin/dg/uv_reactors.py (.../uv_reactors.py) (revision 2e961b0daeddacde19f8a16718ed5eea3bd383f0) @@ -23,6 +23,14 @@ UV_REACTOR_STATE_ON = 1 +@unique +class ReactorsHealthStatus(DialinEnum): + + UV_REACTOR_NOT_HEALTHY = 0 + UV_REACTOR_HEALTHY = 1 + UV_REACTOR_OFF = 2 + + class UVReactors(_AbstractSubSystem): """ @@ -46,36 +54,36 @@ self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_uv_reactors_sync) - self.inlet_uv_reactor_health = 0.0 - self.outlet_uv_reactor_health = 0.0 - self.inlet_uv_reactor_state = 0.0 - self.outlet_uv_reactor_state = 0.0 + self.inlet_uv_reactor_health = 0 + self.outlet_uv_reactor_health = 0 + self.inlet_uv_reactor_state = 0 + self.outlet_uv_reactor_state = 0 - def get_inlet_uv_reactor_health(self): + def get_inlet_uv_reactor_health(self) -> int: """ Gets the inlet UV reactor health @return: Inlet UV reactor health """ return self.inlet_uv_reactor_health - def get_outlet_uv_reactor_health(self): + def get_outlet_uv_reactor_health(self) -> int: """ Gets the outlet UV reactor health @return: Outlet UV reactor health """ return self.outlet_uv_reactor_health - def get_inlet_uv_reactor_state(self): + def get_inlet_uv_reactor_state(self) -> int: """ Gets the inlet UV reactor state @return: Inlet UV reactor state """ return self.inlet_uv_reactor_state - def get_outlet_uv_reactor_state(self): + def get_outlet_uv_reactor_state(self) -> int: """ Gets the outlet UV reactor state @@ -85,7 +93,7 @@ @_publish(['inlet_uv_reactor_health', 'outlet_uv_reactor_health', 'inlet_uv_reactor_state', 'outlet_uv_reactor_state']) - def _handler_uv_reactors_sync(self, message): + def _handler_uv_reactors_sync(self, message:dict) -> None: """ Handles published thermistors message. @@ -105,13 +113,10 @@ self.outlet_uv_reactor_health = outlet_health # Check if the received state from firmware is in range otherwise, the state will be unknown - self.inlet_uv_reactor_state = ReactorsStates(inlet_state).name if ReactorsStates.has_value(inlet_state)\ - else 'Inlet UV reactor state unknown' + self.inlet_uv_reactor_state = inlet_state + self.outlet_uv_reactor_state = outlet_state - self.outlet_uv_reactor_state = ReactorsStates(outlet_state).name if ReactorsStates.has_value(outlet_state)\ - else 'Outlet UV reactor state unknown' - - def cmd_uv_reactors_data_broadcast_interval_override(self, ms, reset=NO_RESET): + def cmd_uv_reactors_data_broadcast_interval_override(self, ms:int, reset:int=NO_RESET) -> int: """ Constructs and sends the UV reactors data publish interval. Constraints: @@ -152,22 +157,22 @@ self.logger.debug("Timeout!!!!") return False - def cmd_uv_reactors_health_override(self, health, reactor, reset=NO_RESET): + def cmd_uv_reactors_health_override(self, health:int, reactor:int, reset:int=NO_RESET) -> int: """ Constructs and sends the UV reactors' health override command. Constraints: Must be logged into DG. - @param reactor: (int) UV reactor index @param health: (int) 0 for unhealthy and 1 for healthy + @param reactor: (int) UV reactor index @param reset: (int) 0 for no reset and 1 for reset """ reset_value = integer_to_bytearray(reset) rctr = integer_to_bytearray(reactor) hlth = integer_to_bytearray(health) - payload = reset_value + rctr + hlth + payload = reset_value + hlth + rctr - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, message_id=MsgIds.MSG_ID_DG_UV_REACTORS_HEALTH_OVERRIDE.value, payload=payload) # Send message @@ -181,7 +186,7 @@ self.logger.debug("UV reactors health override Timeout!!!") return False - def cmd_start_stop_inlet_uv_reactor(self, state=ReactorsStates.UV_REACTOR_STATE_OFF.name): + def cmd_start_stop_inlet_uv_reactor(self, state:int=ReactorsStates.UV_REACTOR_STATE_OFF.value) -> int: """ Constructs and sends a start/stop command to the DG inlet UV reactor @@ -190,7 +195,7 @@ """ rst = integer_to_bytearray(0) inlet_uv_reactor_index = integer_to_bytearray(0) - if state == ReactorsStates.UV_REACTOR_STATE_ON.name: + if state == ReactorsStates.UV_REACTOR_STATE_ON.value: payload = rst + integer_to_bytearray(1) + inlet_uv_reactor_index operation = 'Turning on ' else: @@ -212,21 +217,23 @@ self.logger.debug(operation + "inlet UV reactor timeout!!") return False - def cmd_start_stop_outlet_uv_reactor(self, state=ReactorsStates.UV_REACTOR_STATE_OFF.name): + def cmd_start_stop_outlet_uv_reactor(self, state:int=ReactorsStates.UV_REACTOR_STATE_ON.value) -> int: """ Constructs and sends a start/stop command to the DG outlet UV reactor @param: state: (int) the state of the outlet UV reactor. 0 for Off and 1 for On. @return: 1 if successful, zero otherwise """ - if state == ReactorsStates.UV_REACTOR_STATE_ON: - payload = integer_to_bytearray(1) + rst = integer_to_bytearray(0) + outlet_uv_reactor_index = integer_to_bytearray(1) + if state == ReactorsStates.UV_REACTOR_STATE_ON.value: + payload = rst + integer_to_bytearray(1) + outlet_uv_reactor_index operation = 'Turning on ' else: - payload = integer_to_bytearray(0) + payload = rst + integer_to_bytearray(0) + outlet_uv_reactor_index operation = 'Turning off ' - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, message_id=MsgIds.MSG_ID_DG_START_STOP_UV_REACTORS.value, payload=payload) # Send message Index: dialin/hd/valves.py =================================================================== diff -u -re8a9ef206a66a4846bb5cd4e8ad995de11922caa -r2e961b0daeddacde19f8a16718ed5eea3bd383f0 --- dialin/hd/valves.py (.../valves.py) (revision e8a9ef206a66a4846bb5cd4e8ad995de11922caa) +++ dialin/hd/valves.py (.../valves.py) (revision 2e961b0daeddacde19f8a16718ed5eea3bd383f0) @@ -16,7 +16,7 @@ import struct -from ..utils.conversions import integer_to_bytearray +from ..utils.conversions import integer_to_bytearray, float_to_bytearray from .constants import NO_RESET from ..protocols.CAN import (DenaliMessage, DenaliChannels) from ..utils.base import _AbstractSubSystem, _publish, DialinEnum @@ -137,7 +137,7 @@ """ return self.valves_status - def cmd_hd_valves_broadcast_interval_override(self, ms, reset=NO_RESET): + def cmd_hd_valves_broadcast_interval_override(self, ms:int, reset:int=NO_RESET) -> int: """ Constructs and sends broadcast time interval @@ -165,7 +165,7 @@ self.logger.debug("Timeout!!!!") return False - def cmd_set_hd_valve_position(self, valve, position, reset=NO_RESET): + def cmd_set_hd_valve_position(self, valve:int, position:int, reset:int=NO_RESET) -> int: """ Constructs and sends the HD valves set position for a valve @@ -200,8 +200,78 @@ self.logger.debug("HD cmd_valve_override Timeout!!!") return False - def cmd_set_hd_valve_pwm(self, valve, pwm, direction, reset=NO_RESET): + def cmd_set_hd_valve_current_override(self, valve:int, current:float, reset:int=NO_RESET) -> int: """ + Constructs and sends the HD valves set position for a valve + + @param valve: integer - Valve number: + VDI = 0 + VDO = 1 + VBA = 2 + VBV = 3 + @param current: float value to override current + @param reset: integer - 1 to reset a previous override, 0 to override + @returns 1 if successful, zero otherwise + """ + reset_value = integer_to_bytearray(reset) + vlv = integer_to_bytearray(valve) + cur = float_to_bytearray(current) + payload = reset_value + cur + vlv + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_HD_VALVES_CURRENT_OVERRIDE.value, + payload=payload) + # Send message + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + + self.logger.debug("Setting {} current to {:5.3f} A".format(str(ValvesEnum(valve).name), current)) + + # response payload is OK or not OK + return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] + else: + self.logger.debug("HD current override Timeout!!!") + return False + + def cmd_set_hd_valve_position_count_override(self, valve:int, position:int, reset:int=NO_RESET) -> int: + """ + Constructs and sends the HD valves set position for a valve + + @param valve: integer - Valve number: + VDI = 0 + VDO = 1 + VBA = 2 + VBV = 3 + @param position: integer value + @param reset: integer - 1 to reset a previous override, 0 to override + @returns 1 if successful, zero otherwise + """ + reset_value = integer_to_bytearray(reset) + vlv = integer_to_bytearray(valve) + pos = integer_to_bytearray(position) + payload = reset_value + pos + vlv + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSD_ID_HD_VALVES_POSITION_COUNT_OVERRIDE.value, + payload=payload) + # Send message + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + + self.logger.debug("Setting {} position to {} ".format(str(ValvesEnum(valve).name), position)) + + # response payload is OK or not OK + return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] + else: + self.logger.debug("HD current override Timeout!!!") + return False + + def cmd_set_hd_valve_pwm(self, valve:int, pwm:int, direction:int, reset:int=NO_RESET) -> int: + """ Constructs and sends the HD valves PWM command @param valve: integer - Valve number: @@ -235,7 +305,7 @@ self.logger.debug("HD cmd_valve_override Timeout!!!") return False - def cmd_home_hd_valve(self, valve): + def cmd_home_hd_valve(self, valve:int) -> int: """ Constructs and sends the HD valves home command @@ -262,7 +332,7 @@ self.logger.debug("HD Homing Valve Timeout!!!") return False - def cmd_set_hd_air_trap_valve(self, valve_state=AirTrapState.STATE_CLOSED.name): + def cmd_set_hd_air_trap_valve(self, valve_state:int=AirTrapState.STATE_CLOSED.name) -> int: """ Constructs and sends an open/close command to the HD air trap valve @@ -291,7 +361,7 @@ return False @_publish(["valves_status"]) - def _handler_hd_valves_sync(self, message): + def _handler_hd_valves_sync(self, message:dict) -> None: """ Handles published HD valves data messages. HD valves data are captured for reference. @@ -332,4 +402,3 @@ if AirTrapState.has_value(air_trap): self.hd_air_trap_status = AirTrapState(air_trap).name - Index: tests/hd_valves_test.py =================================================================== diff -u -rdf4353089f674167fa92bebb1447d2278b9b30d9 -r2e961b0daeddacde19f8a16718ed5eea3bd383f0 --- tests/hd_valves_test.py (.../hd_valves_test.py) (revision df4353089f674167fa92bebb1447d2278b9b30d9) +++ tests/hd_valves_test.py (.../hd_valves_test.py) (revision 2e961b0daeddacde19f8a16718ed5eea3bd383f0) @@ -46,8 +46,14 @@ sleep(3) valves.cmd_home_hd_valve(valve.value) - sleep(5) + sleep(3) + valves.cmd_set_hd_valve_current_override(valve.value, 0.85, reset=1) + sleep(3) + + valves.cmd_set_hd_valve_position_count_override(valve.value, 5000, reset=1) + sleep(2) + f = open("Valves_Test_200.log", "w") while counter < loops: @@ -79,6 +85,7 @@ while overall_counter < (overall_time_seconds / sleep_time): sleep(sleep_time) + print('done') """ print("Reset") Index: tests/test_uv_reactors.py =================================================================== diff -u -r56f06b55eb8ab96bd69d12eb9d9d5c71241755ad -r2e961b0daeddacde19f8a16718ed5eea3bd383f0 --- tests/test_uv_reactors.py (.../test_uv_reactors.py) (revision 56f06b55eb8ab96bd69d12eb9d9d5c71241755ad) +++ tests/test_uv_reactors.py (.../test_uv_reactors.py) (revision 2e961b0daeddacde19f8a16718ed5eea3bd383f0) @@ -2,16 +2,32 @@ import sys sys.path.append("..") from dialin.dg.dialysate_generator import DG -from dialin.dg.uv_reactors import ReactorsStates +from dialin.dg.uv_reactors import ReactorsStates, ReactorsHealthStatus, ReactorsNames from time import sleep dg = DG(log_level='DEBUG') dg.cmd_log_in_to_dg() sleep(1) -dg.uv_reactors.cmd_start_stop_inlet_uv_reactor(state=ReactorsStates.UV_REACTOR_STATE_ON.name) +#dg.uv_reactors.cmd_start_stop_inlet_uv_reactor(ReactorsStates.UV_REACTOR_STATE_ON.value) +dg.uv_reactors.cmd_start_stop_outlet_uv_reactor(ReactorsStates.UV_REACTOR_STATE_ON.value) +#dg.uv_reactors.cmd_uv_reactors_health_override(ReactorsNames.INLET_UV_REACTOR.value, +# ReactorsHealthStatus.UV_REACTOR_NOT_HEALTHY.value, reset=1) + while True: + try: + sleep(1) + print('Inlet_health, {}, Inlet_state, {}, Outlet_health, {}, Outlet_health, {}'. + format(dg.uv_reactors.inlet_uv_reactor_state, + ReactorsHealthStatus(dg.uv_reactors.inlet_uv_reactor_health).name, + dg.uv_reactors.outlet_uv_reactor_state, + ReactorsHealthStatus(dg.uv_reactors.outlet_uv_reactor_health).name)) - sleep(1) - print(dg.uv_reactors.inlet_uv_reactor_state, dg.uv_reactors.inlet_uv_reactor_health) + except KeyboardInterrupt: + dg.uv_reactors.cmd_start_stop_inlet_uv_reactor(ReactorsStates.UV_REACTOR_STATE_OFF.name) + dg.uv_reactors.cmd_start_stop_outlet_uv_reactor(ReactorsStates.UV_REACTOR_STATE_OFF.name) + dg.uv_reactors.cmd_uv_reactors_health_override(ReactorsNames.OUTLET_UV_REACTOR.value, + ReactorsHealthStatus.UV_REACTOR_NOT_HEALTHY.value, reset=1) + break +