Index: leahi_dialin/fp/modules/valves.py =================================================================== diff -u -r6364355a60f818cb66570b78b4c69e00a0d5865d -r71975b0c600fd9bd4b2a43cc707e6b0a2012f8b0 --- leahi_dialin/fp/modules/valves.py (.../valves.py) (revision 6364355a60f818cb66570b78b4c69e00a0d5865d) +++ leahi_dialin/fp/modules/valves.py (.../valves.py) (revision 71975b0c600fd9bd4b2a43cc707e6b0a2012f8b0) @@ -20,7 +20,7 @@ from collections import OrderedDict from .constants import NO_RESET -from leahi_dialin.common.fp_defs import FPValveStates, FPValveNames, BETA_IOFP_VALVE_OFFSET +from leahi_dialin.common.fp_defs import fp_enum_repository, BETA_IOFP_VALVE_OFFSET from leahi_dialin.common.msg_defs import MsgIds from leahi_dialin.protocols.CAN import DenaliMessage, DenaliChannels from leahi_dialin.utils.base import AbstractSubSystem, publish, DialinEnum @@ -62,19 +62,19 @@ self.can_interface.register_receiving_publication_function(channel_id, self.msg_id_fp_valves_states_data, self._handler_valves_sync) self.valve_states_all = 0x0000 - self.m4_valv = {"id": FPValveNames.M4_VALV.value, "state": DEENERGIZED} - self.m12_valv = {"id": FPValveNames.M12_VALV.value, "state": DEENERGIZED} - self.p11_valv = {"id": FPValveNames.P11_VALV.value, "state": DEENERGIZED} - self.p33_valv = {"id": FPValveNames.P33_VALV.value, "state": DEENERGIZED} - self.p34_valv = {"id": FPValveNames.P34_VALV.value, "state": DEENERGIZED} - self.p37_valv = {"id": FPValveNames.P37_VALV.value, "state": DEENERGIZED} - self.p39_valv = {"id": FPValveNames.P39_VALV.value, "state": DEENERGIZED} - self.p6_valv = {"id": FPValveNames.P6_VALV.value, "state": DEENERGIZED} + self.m4_valv = {"id": fp_enum_repository.FPValveNames.M4_VALV.value, "state": DEENERGIZED} + self.m12_valv = {"id": fp_enum_repository.FPValveNames.M12_VALV.value, "state": DEENERGIZED} + self.p11_valv = {"id": fp_enum_repository.FPValveNames.P11_VALV.value, "state": DEENERGIZED} + self.p33_valv = {"id": fp_enum_repository.FPValveNames.P33_VALV.value, "state": DEENERGIZED} + self.p34_valv = {"id": fp_enum_repository.FPValveNames.P34_VALV.value, "state": DEENERGIZED} + self.p37_valv = {"id": fp_enum_repository.FPValveNames.P37_VALV.value, "state": DEENERGIZED} + self.p39_valv = {"id": fp_enum_repository.FPValveNames.P39_VALV.value, "state": DEENERGIZED} + self.p6_valv = {"id": fp_enum_repository.FPValveNames.P6_VALV.value, "state": DEENERGIZED} # NOTE: The len function counts the enums with the same number only once. - self.valve_states_enum = [0 for _ in range(len(FPValveNames))] + self.valve_states_enum = [0 for _ in range(len(fp_enum_repository.FPValveNames))] - for valve in FPValveNames.__members__: + for valve in fp_enum_repository.FPValveNames.__members__: self.valves_sensed_states[valve] = '' def get_valve_states(self): @@ -94,6 +94,55 @@ self.p6_valv.get("state") ] + @publish([ + "msg_id_fp_valves_states_data", + "valve_states_all", + "m4_valv", + "m12_valv", + "p11_valv", + "p33_valv", + "p34_valv", + "p37_valv", + "p39_valv", + "p6_valv", + "valve_states_enum", + "fp_valves_states_timestamp" + ]) + def _handler_valves_sync(self, message, timestamp=0.0): + """ + Handles published FP valves states message. + + @param message: published FP valves states message + @return: none + """ + + # Extract each valve state from U08 valves states using bit-masking + io_valves = struct.unpack('B', 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.valve_states_all = io_valves[0] + + # Extract each valve state from U08 valves states using bit-masking + fp_valves = struct.unpack('B', 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.valve_states_all += fp_valves[0] << 8 + + # Extract each valve sensed state from U08 valves states using bit-masking + start = self.END_FP_VALVES_STATES + end = start + 1 + for valve_id in self.valves_sensed_states: + valve_state_number = struct.unpack('B', bytearray(message['message'][start:end]))[0] + self.valves_sensed_states[valve_id] = fp_enum_repository.FPValveStates(valve_state_number).name + start = end + end += 1 + + self.fp_valves_states_timestamp = timestamp + @staticmethod def sort_by_id(observation): """