Index: leahi_dialin/dd/modules/valves.py =================================================================== diff -u -rfd7a25d8f068bcba594c01410a02a03f6afbcd59 -rf4c08ccd4729e3e1758ab4d7bc2723a66ffec3c1 --- leahi_dialin/dd/modules/valves.py (.../valves.py) (revision fd7a25d8f068bcba594c01410a02a03f6afbcd59) +++ leahi_dialin/dd/modules/valves.py (.../valves.py) (revision f4c08ccd4729e3e1758ab4d7bc2723a66ffec3c1) @@ -77,6 +77,10 @@ # Valves states publish message field positions START_POS_VALVES_STATES = DenaliMessage.PAYLOAD_START_INDEX END_POS_VALVES_STATES = START_POS_VALVES_STATES + 2 # Valves States come in as a U16 value (2 bytes) + START_POS_BCV_VALVES_STATES = END_POS_VALVES_STATES + END_POS_BCV_VALVES_STATES = START_POS_BCV_VALVES_STATES + 1 + START_POS_UFI_VALVES_STATES = END_POS_BCV_VALVES_STATES + END_POS_UFI_VALVES_STATES = START_POS_UFI_VALVES_STATES + 1 def __init__(self, can_interface, logger: Logger): """ @@ -95,8 +99,39 @@ msg_id = MsgIds.MSG_ID_DD_VALVES_STATES_DATA.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_valves_sync) - self.valve_states_all = 0x0000 + self.valve_states_all = 0x00000000 + self.valve_state_VDR = {"id": DDValveNames.VDR.value, "state": DEENERGIZED} + self.valve_state_VTD = {"id": DDValveNames.VTD.value, "state": DEENERGIZED} + self.valve_state_VHB = {"id": DDValveNames.VHB.value, "state": DEENERGIZED} + self.valve_state_VRP = {"id": DDValveNames.VRP.value, "state": DEENERGIZED} + self.valve_state_VHO = {"id": DDValveNames.VHO.value, "state": DEENERGIZED} + self.valve_state_VDB1 = {"id": DDValveNames.VDB1.value, "state": DEENERGIZED} + self.valve_state_VP1 = {"id": DDValveNames.VP1.value, "state": DEENERGIZED} + self.valve_state_VPT = {"id": DDValveNames.VPT.value, "state": DEENERGIZED} + self.valve_state_VDB2 = {"id": DDValveNames.VDB2.value, "state": DEENERGIZED} + self.valve_state_VDI = {"id": DDValveNames.VDI.value, "state": DEENERGIZED} + self.valve_state_VDO = {"id": DDValveNames.VDO.value, "state": DEENERGIZED} + self.valve_state_VP2 = {"id": DDValveNames.VP2.value, "state": DEENERGIZED} + self.valve_state_VHI = {"id": DDValveNames.VHI.value, "state": DEENERGIZED} + self.valve_state_VWI = {"id": DDValveNames.VWI.value, "state": DEENERGIZED} + self.valve_state_rsvrd1 = {"id": DDValveNames.RSRVD_SPACE1.value, "state": DEENERGIZED} + self.valve_state_rsvrd2 = {"id": DDValveNames.RSRVD_SPACE2.value, "state": DEENERGIZED} + self.valve_state_BCV1 = {"id": DDValveNames.BCV1.value, "state": DEENERGIZED} + self.valve_state_BCV2 = {"id": DDValveNames.BCV2.value, "state": DEENERGIZED} + self.valve_state_BCV3 = {"id": DDValveNames.BCV3.value, "state": DEENERGIZED} + self.valve_state_BCV4 = {"id": DDValveNames.BCV4.value, "state": DEENERGIZED} + self.valve_state_BCV5 = {"id": DDValveNames.BCV5.value, "state": DEENERGIZED} + self.valve_state_BCV6 = {"id": DDValveNames.BCV6.value, "state": DEENERGIZED} + self.valve_state_BCV7 = {"id": DDValveNames.BCV7.value, "state": DEENERGIZED} + self.valve_state_BCV8 = {"id": DDValveNames.BCV8.value, "state": DEENERGIZED} + + self.valve_state_UFI1 = {"id": DDValveNames.BCV1.value, "state": DEENERGIZED} + self.valve_state_UFI2 = {"id": DDValveNames.BCV1.value, "state": DEENERGIZED} + self.valve_state_UFI3 = {"id": DDValveNames.BCV1.value, "state": DEENERGIZED} + self.valve_state_UFI4 = {"id": DDValveNames.BCV1.value, "state": DEENERGIZED} + + # NOTE: The len function counts the enums with the same number only once. This is not the case in the DG valves # class because each valve must have a unique ID. self.valve_states_enum = [0 for _ in range(len(DDValveNames))] @@ -108,36 +143,37 @@ """ Gets the valve states - @return: All valve states: \n - [\n - Valve Reservoir Fill \n - Valve Reservoir Inlet \n - Reserved Space \n - Valve Reservoir Outlet \n - Valve Pressure Outlet \n - Valve Bypass Filter \n - Valve Recirculate \n - Valve Drain \n - Valve Pressure Inlet \n - Valve Sampling Port \n - Valve Reservoir 1 Drain \n - Valve Reservoir 2 Drain \n - Valve Production Drain \n - ]\n + @return: All valve states """ return [ - self.valve_state_VRF.get("state", None), - self.valve_state_VRI.get("state", None), - self.valve_state_VRO.get("state", None), - self.valve_state_VPO.get("state", None), - self.valve_state_VBF.get("state", None), - self.valve_state_VRC.get("state", None), self.valve_state_VDR.get("state", None), - self.valve_state_VPI.get("state", None), - self.valve_state_VSP.get("state", None), - self.valve_state_VRD1.get("state", None), - self.valve_state_VRD2.get("state", None), - self.valve_state_VPD.get("state", None) + self.valve_state_VTD.get("state", None), + self.valve_state_VHB.get("state", None), + self.valve_state_VRP.get("state", None), + self.valve_state_VHO.get("state", None), + self.valve_state_VDB1.get("state", None), + self.valve_state_VP1.get("state", None), + self.valve_state_VPT.get("state", None), + self.valve_state_VDB2.get("state", None), + self.valve_state_VDI.get("state", None), + self.valve_state_VDO.get("state", None), + self.valve_state_VP2.get("state", None), + self.valve_state_VHI.get("state", None), + self.valve_state_VWI.get("state", None), + self.valve_state_rsvrd1.get("state", None), + self.valve_state_rsvrd2.get("state", None), + self.valve_state_BCV1.get("state", None), + self.valve_state_BCV2.get("state", None), + self.valve_state_BCV3.get("state", None), + self.valve_state_BCV4.get("state", None), + self.valve_state_BCV5.get("state", None), + self.valve_state_BCV6.get("state", None), + self.valve_state_BCV7.get("state", None), + self.valve_state_BCV8.get("state", None), + self.valve_state_UFI1.get("state", None), + self.valve_state_UFI2.get("state", None), + self.valve_state_UFI3.get("state", None), + self.valve_state_UFI4.get("state", None) ] @staticmethod @@ -146,38 +182,6 @@ Converts a published dictionary of valve state information to an ordered list of tuples. - For example: - hd = 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}, - 'valve_state_VPI': {'id': 8, 'state': True}, - 'valve_state_VPO': {'id': 4, 'state': True}, - 'valve_state_VR1': {'id': 10, 'state': True}, - 'valve_state_VR2': {'id': 11, 'state': True}, - 'valve_state_VRC': {'id': 6, 'state': True}, - 'valve_state_VRF': {'id': 0, 'state': True}, - 'valve_state_VRI': {'id': 1, 'state': True}, - 'valve_state_VRO': {'id': 3, 'state': True}, - 'valve_state_VSP': {'id': 9, 'state': True}, - 'valve_states_all': 8191} - self.logger.debug(hd.valves.sort_by_id(observation)) - - ('valve_state_VRF', 0, True) - ('valve_state_VRI', 1, True) - ('valve_state_VRO', 3, True) - ('valve_state_VPO', 4, True) - ('valve_state_VBF', 5, True) - ('valve_state_VRC', 6, True) - ('valve_state_VDR', 7, True) - ('valve_state_VPI', 8, True) - ('valve_state_VSP', 9, True) - ('valve_state_VR1', 10, True) - ('valve_state_VR2', 11, True) - ('valve_state_VPD', 12, True) - @param observation: dictionary of the observed valve states @return: a list of tuples of the valve states """ @@ -205,18 +209,34 @@ @publish([ "dg_valves_states_timestamp", "valve_states_all", - "valve_state_VRF", - "valve_state_VRI", - "valve_state_VRO", - "valve_state_VPO", - "valve_state_VBF", - "valve_state_VRC", "valve_state_VDR", - "valve_state_VPI", - "valve_state_VSP", - "valve_state_VRD1", - "valve_state_VRD2", - "valve_state_VPD", + "valve_state_VTD", + "valve_state_VHB", + "valve_state_VRP", + "valve_state_VHO", + "valve_state_VDB1", + "valve_state_VP1", + "valve_state_VPT", + "valve_state_VDB2", + "valve_state_VDI", + "valve_state_VDO", + "valve_state_VP2", + "valve_state_VHI", + "valve_state_VWI", + "valve_state_rsvrd1", + "valve_state_rsvrd2", + "valve_state_BCV1", + "valve_state_BCV2", + "valve_state_BCV3", + "valve_state_BCV4", + "valve_state_BCV5", + "valve_state_BCV6", + "valve_state_BCV7", + "valve_state_BCV8", + "valve_state_UFI1", + "valve_state_UFI2", + "valve_state_UFI3", + "valve_state_UFI4", "valve_states_enum" ]) def _handler_valves_sync(self, message, timestamp=0.0): @@ -228,39 +248,45 @@ """ 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["state"] = self._binary_to_valve_state(vst[0] & 1) - self.valve_state_VRI["state"] = self._binary_to_valve_state(vst[0] & 2) - self.valve_state_VRO["state"] = self._binary_to_valve_state(vst[0] & 8) - self.valve_state_VPO["state"] = self._binary_to_valve_state(vst[0] & 16) - self.valve_state_VBF["state"] = self._binary_to_valve_state(vst[0] & 32) - self.valve_state_VRC["state"] = self._binary_to_valve_state(vst[0] & 64) - self.valve_state_VDR["state"] = self._binary_to_valve_state(vst[0] & 128) - self.valve_state_VPI["state"] = self._binary_to_valve_state(vst[0] & 256) - self.valve_state_VSP["state"] = self._binary_to_valve_state(vst[0] & 512) - self.valve_state_VRD1["state"] = self._binary_to_valve_state(vst[0] & 1024) - self.valve_state_VRD2["state"] = self._binary_to_valve_state(vst[0] & 2048) - self.valve_state_VPD["state"] = self._binary_to_valve_state(vst[0] & 4096) + self.valve_state_VDR["state"] = self._binary_to_valve_state(vst[0] & 1) + self.valve_state_VTD["state"] = self._binary_to_valve_state(vst[0] & 2) + self.valve_state_VHB["state"] = self._binary_to_valve_state(vst[0] & 8) + self.valve_state_VRP["state"] = self._binary_to_valve_state(vst[0] & 16) + self.valve_state_VHO["state"] = self._binary_to_valve_state(vst[0] & 32) + self.valve_state_VDB1["state"] = self._binary_to_valve_state(vst[0] & 64) + self.valve_state_VP1["state"] = self._binary_to_valve_state(vst[0] & 128) + self.valve_state_VPT["state"] = self._binary_to_valve_state(vst[0] & 256) + self.valve_state_VDB2["state"] = self._binary_to_valve_state(vst[0] & 512) + self.valve_state_VDI["state"] = self._binary_to_valve_state(vst[0] & 1024) + self.valve_state_VDO["state"] = self._binary_to_valve_state(vst[0] & 2048) + self.valve_state_VP2["state"] = self._binary_to_valve_state(vst[0] & 4096) + self.valve_state_VHI["state"] = self._binary_to_valve_state(vst[0] & 8192) + self.valve_state_VWI["state"] = self._binary_to_valve_state(vst[0] & 16384) + self.valve_state_rsvrd1["state"] = self._binary_to_valve_state(vst[0] & 32768) + self.valve_state_rsvrd2["state"] = self._binary_to_valve_state(vst[0] & 65536) - self.valve_states_enum[DDValveNames.VALVE_RESERVOIR_FILL.value] = VRdVRfStates(self._binary_to_valve_state(vst[0] & 1)).name # VRF - self.valve_states_enum[DDValveNames.VALVE_RESERVOIR_INLET.value] = VRoVRiStates(self._binary_to_valve_state(vst[0] & 2)).name # VRI - self.valve_states_enum[DDValveNames.VALVE_RESERVOIR_OUTLET.value] = VRoVRiStates(self._binary_to_valve_state(vst[0] & 8)).name # VRO - self.valve_states_enum[DDValveNames.VALVE_PRESSURE_OUTLET.value] = VPoStates(self._binary_to_valve_state(vst[0] & 16)).name # VPO - self.valve_states_enum[DDValveNames.VALVE_BYPASS_FILTER.value] = VPiVSPVBfVRD1VRD2States(self._binary_to_valve_state(vst[0] & 32)).name # VBF - self.valve_states_enum[DDValveNames.VALVE_RECIRCULATE.value] = VDrVRcStates(self._binary_to_valve_state(vst[0] & 64)).name # VRC - self.valve_states_enum[DDValveNames.VALVE_DRAIN.value] = VDrVRcStates(self._binary_to_valve_state(vst[0] & 128)).name # VDR - self.valve_states_enum[DDValveNames.VALVE_PRESSURE_INLET.value] = VPiVSPVBfVRD1VRD2States(self._binary_to_valve_state(vst[0] & 256)).name # VPI - self.valve_states_enum[DDValveNames.VALVE_SAMPLING_PORT.value] = VPiVSPVBfVRD1VRD2States(self._binary_to_valve_state(vst[0] & 512)).name # VSP - self.valve_states_enum[DDValveNames.VALVE_RESERVOIR_DRAIN_1.value] = VPiVSPVBfVRD1VRD2States(self._binary_to_valve_state(vst[0] & 1024)).name # VRD1 - self.valve_states_enum[DDValveNames.VALVE_RESERVOIR_DRAIN_2.value] = VPiVSPVBfVRD1VRD2States(self._binary_to_valve_state(vst[0] & 2048)).name # VRD2 - self.valve_states_enum[DDValveNames.VALVE_PRODUCTION_DRAIN.value] = VPdStates(self._binary_to_valve_state(vst[0] & 4096)).name # VPD + bcv = struct.unpack('B', bytearray(message['message'][self.START_POS_BCV_VALVES_STATES:self.END_POS_BCV_VALVES_STATES])) + self.valve_state_BCV1["state"] = self._binary_to_valve_state(bcv[0] & 1) + self.valve_state_BCV2["state"] = self._binary_to_valve_state(bcv[0] & 2) + self.valve_state_BCV3["state"] = self._binary_to_valve_state(bcv[0] & 8) + self.valve_state_BCV4["state"] = self._binary_to_valve_state(bcv[0] & 16) + self.valve_state_BCV5["state"] = self._binary_to_valve_state(bcv[0] & 32) + self.valve_state_BCV6["state"] = self._binary_to_valve_state(bcv[0] & 64) + self.valve_state_BCV7["state"] = self._binary_to_valve_state(bcv[0] & 128) + self.valve_state_BCV8["state"] = self._binary_to_valve_state(bcv[0] & 256) - start = self.END_POS_VALVES_STATES + ufi = struct.unpack('B', bytearray(message['message'][self.START_POS_UFI_VALVES_STATES:self.END_POS_UFI_VALVES_STATES])) + self.valve_state_UFI1["state"] = self._binary_to_valve_state(ufi[0] & 1) + self.valve_state_UFI2["state"] = self._binary_to_valve_state(ufi[0] & 2) + self.valve_state_UFI3["state"] = self._binary_to_valve_state(ufi[0] & 8) + self.valve_state_UFI4["state"] = self._binary_to_valve_state(ufi[0] & 16) + + start = self.END_POS_UFI_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] = DGValvesSensedStates(valve_state_number).name + self.valves_sensed_states[valve_id] = DDValveNames(valve_state_number).name start = end end += 1 @@ -277,21 +303,6 @@ @param state: bool - valve state @param reset: integer - 1 to reset a previous override, 0 to override @return: 1 if successful, zero otherwise - - valve IDs: \n - 0 = Valve Reservoir Fill \n - 1 = Valve Reservoir Inlet \n - 2 = Reserved Space \n - 3 = Valve Reservoir Outlet \n - 4 = Valve Pressure Outlet \n - 5 = Valve Bypass Filter \n - 6 = Valve Recirculate \n - 7 = Valve Drain \n - 8 = Valve Pressure Inlet \n - 9 = Valve Sampling Port \n - 10 = Valve Reservoir 1 Drain \n - 11 = Valve Reservoir 2 Drain \n - 12 = Valve Production Drain \n """ rst = integer_to_bytearray(reset) @@ -327,21 +338,6 @@ @param state: bool - valve state @param reset: integer - 1 to reset a previous override, 0 to override @return: 1 if successful, zero otherwise - - valve IDs: \n - 0 = Valve Reservoir Fill \n - 1 = Valve Reservoir Inlet \n - 2 = Reserved Space \n - 3 = Valve Reservoir Outlet \n - 4 = Valve Pressure Outlet \n - 5 = Valve Bypass Filter \n - 6 = Valve Recirculate \n - 7 = Valve Drain \n - 8 = Valve Pressure Inlet \n - 9 = Valve Sampling Port \n - 10 = Valve Reservoir 1 Drain \n - 11 = Valve Reservoir 2 Drain \n - 12 = Valve Production Drain \n """ rst = integer_to_bytearray(reset)