Index: leahi_dialin/fp/modules/valves.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/fp/modules/valves.py (.../valves.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/fp/modules/valves.py (.../valves.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -15,7 +15,6 @@ ############################################################################ # Module imports -import struct from logging import Logger from collections import OrderedDict @@ -27,26 +26,16 @@ from leahi_dialin.common.msg_ids import MsgIds from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.protocols.CAN import CanMessenger, CanMessage, CanChannels -from leahi_dialin.utils.abstract_classes import AbstractSubSystem +from leahi_dialin.utils.abstract_classes import AbstractSubSystem, LocalVars from leahi_dialin.utils.base import publish from leahi_dialin.utils.conversions import integer_to_bytearray -# Valve states -ENERGIZED = True -DEENERGIZED = False - - class FPValves(AbstractSubSystem): """ Dialin API sub-class for FP valve related commands. """ - # Valves states publish message field positions - START_IO_VALVES_STATES = CanMessage.PAYLOAD_START_INDEX - END_IO_VALVES_STATES = START_IO_VALVES_STATES + 1 # IO Valves States come in as a U08 value (1 byte) - START_FP_VALVES_STATES = END_IO_VALVES_STATES - END_FP_VALVES_STATES = START_FP_VALVES_STATES + 1 # FP Valves States come in as a U08 value (1 byte) def __init__(self, can_interface: CanMessenger, logger: Logger): """ @@ -64,53 +53,42 @@ self.fp_valves_states_timestamp = 0.0 #: The timestamp of the last message self.valve_states_all = 0x0000 #: States of all the vales in binary format self.valves_sensed_states = OrderedDict() #: The Valve's Sensed State data in dictionary format - self.m4_valv = {"id": fp_enum_repository.FPValveNames.M4_VALV.value, "state": DEENERGIZED} #: The M4 valve's value - self.m12_valv = {"id": fp_enum_repository.FPValveNames.M12_VALV.value, "state": DEENERGIZED} #: The M12 valve's value - self.p11_valv = {"id": fp_enum_repository.FPValveNames.P11_VALV.value, "state": DEENERGIZED} #: The P11 valve's value - self.p33_valv = {"id": fp_enum_repository.FPValveNames.P33_VALV.value, "state": DEENERGIZED} #: The P33 valve's value - self.p34_valv = {"id": fp_enum_repository.FPValveNames.P34_VALV.value, "state": DEENERGIZED} #: The P34 valve's value - self.p37_valv = {"id": fp_enum_repository.FPValveNames.P37_VALV.value, "state": DEENERGIZED} #: The P37 valve's value - self.p39_valv = {"id": fp_enum_repository.FPValveNames.P39_VALV.value, "state": DEENERGIZED} #: The P39 valve's value - self.p6_valv = {"id": fp_enum_repository.FPValveNames.P6_VALV.value, "state": DEENERGIZED} #: The P6 valve's value + self.m4_valv = {"id": fp_enum_repository.FPValveNames.M4_VALV.value, "state": fp_enum_repository.FPValveStates.VALVE_STATE_CLOSED.value } #: The M4 valve's value + self.m12_valv = {"id": fp_enum_repository.FPValveNames.M12_VALV.value, "state": fp_enum_repository.FPValveStates.VALVE_STATE_CLOSED.value } #: The M12 valve's value + self.p11_valv = {"id": fp_enum_repository.FPValveNames.P11_VALV.value, "state": fp_enum_repository.FPValveStates.VALVE_STATE_CLOSED.value } #: The P11 valve's value + self.p33_valv = {"id": fp_enum_repository.FPValveNames.P33_VALV.value, "state": fp_enum_repository.FPValveStates.VALVE_STATE_CLOSED.value } #: The P33 valve's value + self.p34_valv = {"id": fp_enum_repository.FPValveNames.P34_VALV.value, "state": fp_enum_repository.FPValveStates.VALVE_STATE_CLOSED.value } #: The P34 valve's value + self.p37_valv = {"id": fp_enum_repository.FPValveNames.P37_VALV.value, "state": fp_enum_repository.FPValveStates.VALVE_STATE_CLOSED.value } #: The P37 valve's value + self.p39_valv = {"id": fp_enum_repository.FPValveNames.P39_VALV.value, "state": fp_enum_repository.FPValveStates.VALVE_STATE_CLOSED.value } #: The P39 valve's value + self.p6_valv = {"id": fp_enum_repository.FPValveNames.P6_VALV.value, "state": fp_enum_repository.FPValveStates.VALVE_STATE_CLOSED.value } #: The P6 valve's value #: States of all the vales in list format self.valve_states_enum = {} for i in range(0, fp_enum_repository.FPValveNames.NUM_OF_FP_VALVES.value): valve_name = fp_enum_repository.FPValveNames(i).name self.valve_states_enum[valve_name] = 0 self.valves_sensed_states[valve_name] = '' - - - @staticmethod - def sort_by_id(observation): - """ - Converts a published dictionary of valve state information to an ordered list - of tuples. - @param observation: dictionary of the observed valve states - @return: a list of tuples of the valve states - """ - result = [] - for key, value in observation.items(): - if isinstance(value, dict): - result.append((key, value.get("id", None), value.get("state", None))) - result = sorted(result, key=lambda each: each[1]) - return result - - @staticmethod - def _binary_to_valve_state(binary) -> bool: +# ============================================================ Properties ============================================================ + @property + def fp_valves(self) -> dict: """ - @param binary: binary value - @return: 1 = energized, otherwise de-energized + The Valves data """ - if binary != 0: - return ENERGIZED - else: - return DEENERGIZED + return {fp_enum_repository.FPValveNames.M4_VALV.name: self.m4_valv['state'], + fp_enum_repository.FPValveNames.M12_VALV.name: self.m12_valv['state'], + fp_enum_repository.FPValveNames.P11_VALV.name: self.p11_valv['state'], + fp_enum_repository.FPValveNames.P33_VALV.name: self.p33_valv['state'], + fp_enum_repository.FPValveNames.P34_VALV.name: self.p34_valv['state'], + fp_enum_repository.FPValveNames.P37_VALV.name: self.p37_valv['state'], + fp_enum_repository.FPValveNames.P39_VALV.name: self.p39_valv['state'], + fp_enum_repository.FPValveNames.P6_VALV.name: self.p6_valv['state']} + +# ============================================================ Handlers ============================================================ @publish([ "msg_id_fp_valves_states_data", "valve_states_all", @@ -132,37 +110,46 @@ @param message: published FP valves states message @return: none """ + io_valves = LocalVars('io_valves') + fp_valves = LocalVars('fp_valves') + + msg_list = [] + msg_list.append((io_valves, DataTypes.U08)) + msg_list.append((fp_valves, DataTypes.U08)) + + self.process_into_vars(decoder_list = msg_list, message = message) + # Extract each valve state from U08 valves states using bit-masking - io_valves = struct.unpack(DataTypes.U08.unpack_attrib(), bytearray(message['message'][self.START_IO_VALVES_STATES:self.END_IO_VALVES_STATES])) - self.m4_valv["state"] = self._binary_to_valve_state(io_valves[0] & 1) - self.m12_valv["state"] = self._binary_to_valve_state(io_valves[0] & 2) + self.m4_valv["state"] = fp_enum_repository.FPValveStates(io_valves.value & 1) + self.m12_valv["state"] = fp_enum_repository.FPValveStates(io_valves.value & 2) self.valve_states_all = io_valves[0] # Extract each valve state from U08 valves states using bit-masking - fp_valves = struct.unpack(DataTypes.U08.unpack_attrib(), bytearray(message['message'][self.START_FP_VALVES_STATES:self.END_FP_VALVES_STATES])) - self.p11_valv["state"] = self._binary_to_valve_state(fp_valves[0] & 1) - self.p33_valv["state"] = self._binary_to_valve_state(fp_valves[0] & 2) - self.p34_valv["state"] = self._binary_to_valve_state(fp_valves[0] & 4) - self.p37_valv["state"] = self._binary_to_valve_state(fp_valves[0] & 8) - self.p39_valv["state"] = self._binary_to_valve_state(fp_valves[0] & 16) - self.p6_valv["state"] = self._binary_to_valve_state(fp_valves[0] & 32) + self.p11_valv["state"] = fp_enum_repository.FPValveStates(fp_valves.value & 1) + self.p33_valv["state"] = fp_enum_repository.FPValveStates(fp_valves.value & 2) + self.p34_valv["state"] = fp_enum_repository.FPValveStates(fp_valves.value & 4) + self.p37_valv["state"] = fp_enum_repository.FPValveStates(fp_valves.value & 8) + self.p39_valv["state"] = fp_enum_repository.FPValveStates(fp_valves.value & 16) + self.p6_valv["state"] = fp_enum_repository.FPValveStates(fp_valves.value & 32) self.valve_states_all += fp_valves[0] << 8 # Updating Valve_states_enum for i in range(0, fp_enum_repository.FPValveNames.NUM_OF_FP_VALVES.value): valve_name = fp_enum_repository.FPValveNames(i).name self.valve_states_enum[valve_name] = eval(f'self.{valve_name.lower()}["state"]') - # Extract each valve sensed state from U08 valves states using bit-masking - start = self.END_FP_VALVES_STATES - end = start + 1 + # Extract each valve sensed state + start = len(msg_list) * DataTypes.U08.size() + msg_list_2 = [] for valve_id in self.valves_sensed_states: - self.valves_sensed_states[valve_id] = struct.unpack(DataTypes.U08.unpack_attrib(), bytearray(message['message'][start:end]))[0] - start = end - end += 1 + msg_list.append((self.valves_sensed_states, valve_id, DataTypes.U08)) + + self.process_into_vars(decoder_list = msg_list_2, message = message, start_from_byte = start) self.fp_valves_states_timestamp = timestamp + +# ============================================================ Overrides and Requests ============================================================ def cmd_valve_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the FP valve state override command.