From 0484c450f3ec52822d40b70ee7107460582027cb Mon Sep 17 00:00:00 2001 From: Carlos Falcon Date: Thu, 30 Sep 2021 11:23:38 +0200 Subject: [PATCH] Allow to define I/O pins as dynamic attributes Implement AntoineDupre proposal. Add pin dev_property to set the list of active pins Fix #1 --- tango_ds/raspberry_pi/RaspberryPiIO.py | 446 +++++-------------------- 1 file changed, 83 insertions(+), 363 deletions(-) diff --git a/tango_ds/raspberry_pi/RaspberryPiIO.py b/tango_ds/raspberry_pi/RaspberryPiIO.py index 7657829..f1b6fd4 100644 --- a/tango_ds/raspberry_pi/RaspberryPiIO.py +++ b/tango_ds/raspberry_pi/RaspberryPiIO.py @@ -6,7 +6,7 @@ KITS 2018-05-31. """ - +import re import socket import numpy as np @@ -14,7 +14,12 @@ from raspberry_pi.resource import catch_connection_error -from tango import AttReqType, AttrWriteType, DispLevel +from tango import (AttReqType, + AttrWriteType, + DispLevel, + CmdArgType, + Attr, + READ_WRITE) from tango import DevState, DebugIt from tango.server import Device, attribute, command, pipe, device_property @@ -22,170 +27,84 @@ class RaspberryPiIO(Device): - - #attributes - pin3_voltage = attribute(label="PIN_3 voltage", dtype=bool, - display_level=DispLevel.OPERATOR, - access=AttrWriteType.READ_WRITE, - doc="PIN_3 voltage", - fget="get_pin3_voltage", - fset="set_pin3_voltage", - fisallowed="is_voltage_allowed") - - pin3_output = attribute(label="PIN_3 output", dtype=bool, - display_level=DispLevel.OPERATOR, - access=AttrWriteType.READ_WRITE, - doc="PIN_3 output", - fget="get_pin3_output", - fset="set_pin3_output", - fisallowed="is_output_allowed") - - pin5_voltage = attribute(label="PIN_5 voltage", dtype=bool, - display_level=DispLevel.OPERATOR, - access=AttrWriteType.READ_WRITE, - doc="PIN_5 voltage", - fget="get_pin5_voltage", - fset="set_pin5_voltage", - fisallowed="is_voltage_allowed") - - pin5_output = attribute(label="PIN_5 output", dtype=bool, - display_level=DispLevel.OPERATOR, - access=AttrWriteType.READ_WRITE, - doc="PIN_5 output", - fget="get_pin5_output", - fset="set_pin5_output", - fisallowed="is_output_allowed") - - pin7_voltage = attribute(label="PIN_7 voltage", dtype=bool, - display_level=DispLevel.OPERATOR, - access=AttrWriteType.READ_WRITE, - doc="PIN_7 voltage", - fget="get_pin7_voltage", - fset="set_pin7_voltage", - fisallowed="is_voltage_allowed") - - pin7_output = attribute(label="PIN_7 output", dtype=bool, - display_level=DispLevel.OPERATOR, - access=AttrWriteType.READ_WRITE, - doc="PIN_7 output", - fget="get_pin7_output", - fset="set_pin7_output", - fisallowed="is_output_allowed") - - pin8_voltage = attribute(label="PIN_8 voltage", dtype=bool, - display_level=DispLevel.OPERATOR, - access=AttrWriteType.READ_WRITE, - doc="PIN_8 voltage", - fget="get_pin8_voltage", - fset="set_pin8_voltage", - fisallowed="is_voltage_allowed") - - pin8_output = attribute(label="PIN_8 output", dtype=bool, - display_level=DispLevel.OPERATOR, - access=AttrWriteType.READ_WRITE, - doc="PIN_8 output", - fget="get_pin8_output", - fset="set_pin8_output", - fisallowed="is_output_allowed") - - pin10_voltage = attribute(label="PIN_10 voltage", dtype=bool, - display_level=DispLevel.OPERATOR, - access=AttrWriteType.READ_WRITE, - doc="PIN_10 voltage", - fget="get_pin10_voltage", - fset="set_pin10_voltage", - fisallowed="is_voltage_allowed") - - pin10_output = attribute(label="PIN_10 output", dtype=bool, - display_level=DispLevel.OPERATOR, - access=AttrWriteType.READ_WRITE, - doc="PIN_10 output", - fget="get_pin10_output", - fset="set_pin10_output", - fisallowed="is_output_allowed") - - pin11_voltage = attribute(label="PIN_11 voltage", dtype=bool, - display_level=DispLevel.OPERATOR, - access=AttrWriteType.READ_WRITE, - doc="PIN_11 voltage", - fget="get_pin11_voltage", - fset="set_pin11_voltage", - fisallowed="is_voltage_allowed") - - pin11_output = attribute(label="PIN_11 output", dtype=bool, - display_level=DispLevel.OPERATOR, - access=AttrWriteType.READ_WRITE, - doc="PIN_11 output", - fget="get_pin11_output", - fset="set_pin11_output", - fisallowed="is_output_allowed") - - pin12_voltage = attribute(label="PIN_12 voltage", dtype=bool, - display_level=DispLevel.OPERATOR, - access=AttrWriteType.READ_WRITE, - doc="PIN_12 voltage", - fget="get_pin12_voltage", - fset="set_pin12_voltage", - fisallowed="is_voltage_allowed") - - pin12_output = attribute(label="PIN_12 output", dtype=bool, - display_level=DispLevel.OPERATOR, - access=AttrWriteType.READ_WRITE, - doc="PIN_12 output", - fget="get_pin12_output", - fset="set_pin12_output", - fisallowed="is_output_allowed") - - pin13_voltage = attribute(label="PIN_13 voltage", dtype=bool, - display_level=DispLevel.OPERATOR, - access=AttrWriteType.READ_WRITE, - doc="PIN_13 voltage", - fget="get_pin13_voltage", - fset="set_pin13_voltage", - fisallowed="is_voltage_allowed") - - pin13_output = attribute(label="PIN_13 output", dtype=bool, - display_level=DispLevel.OPERATOR, - access=AttrWriteType.READ_WRITE, - doc="PIN_13 output", - fget="get_pin13_output", - fset="set_pin13_output", - fisallowed="is_output_allowed") - - pin15_voltage = attribute(label="PIN_15 voltage", dtype=bool, - display_level=DispLevel.OPERATOR, - access=AttrWriteType.READ_WRITE, - doc="PIN_15 voltage", - fget="get_pin15_voltage", - fset="set_pin15_voltage", - fisallowed="is_voltage_allowed") - - pin15_output = attribute(label="PIN_15 output", dtype=bool, - display_level=DispLevel.OPERATOR, - access=AttrWriteType.READ_WRITE, - doc="PIN_15 output", - fget="get_pin15_output", - fset="set_pin15_output", - fisallowed="is_output_allowed") - - pin16_voltage = attribute(label="PIN_16 voltage", dtype=bool, - display_level=DispLevel.OPERATOR, - access=AttrWriteType.READ_WRITE, - doc="PIN_16 voltage", - fget="get_pin16_voltage", - fset="set_pin16_voltage", - fisallowed="is_voltage_allowed") - - pin16_output = attribute(label="PIN_16 output", dtype=bool, - display_level=DispLevel.OPERATOR, - access=AttrWriteType.READ_WRITE, - doc="PIN_16 output", - fget="get_pin16_output", - fset="set_pin16_output", - fisallowed="is_output_allowed") - Host = device_property(dtype=str) Port = device_property(dtype=int, default_value=9788) + pins = device_property(dtype=(int,)) + + def _get_pin(self, attr_name): + m = re.search('\s*(?P[\d]+)\s*', attr_name) + if m: + pin_number = m.groupdict().get('pin', None) + else: + pin_number = None + + if pin_number is None: + raise Exception('Error geting pin number from [{}]'.format(attr_name)) + + return pin_number + + def initialize_dynamic_attributes(self): + for pin_number in self.pins: + # Create attribute name + voltage_attrname = "pin{}_voltage".format(pin_number) + output_attrname = "pin{}_output".format(pin_number) + # Get tango type + tango_type = CmdArgType.DevBoolean + # Create attributes + voltage_attr = Attr(voltage_attrname, + tango_type, READ_WRITE) + output_attr = Attr(output_attrname, + tango_type, READ_WRITE) + # Add attribute and setup read/write/allowed method + self.add_attribute( + voltage_attr, + r_meth=self.read_pin_voltage, + w_meth=self.write_pin_voltage, + is_allo_meth=self.is_voltage_allowed) + self.add_attribute( + output_attr, + r_meth=self.read_pin_output, + w_meth=self.write_pin_output, + is_allo_meth=self.is_output_allowed) + # If event needed, setup change event + #self.set_change_event(voltage_attrname, True, True) + #self.set_change_event(output_attrname, True, True) + + # Voltage + + @catch_connection_error + def read_pin_voltage(self, attr): + attr_name = attr.get_name() + pin_number = self._get_pin(attr_name) + value = self.raspberry.readvoltage(pin_number) + setattr(self, "pin{}_voltage".format(pin_number), value) + attr.set_value(value) + + @catch_connection_error + def write_pin_voltage(self, attr): + w_value = attr.get_write_value() + attr_name = attr.get_name() + pin_number = self._get_pin(attr_name) + python_attr = "pin{}_voltage".format(pin_number) + self.set_voltage(w_value, pin_number, getattr(self, python_attr)) + setattr(self, "{}".format(attr_name), w_value) + + # Ouptut + + @catch_connection_error + def read_pin_output(self, attr): + attr_name = attr.get_name() + pin_number = self._get_pin(attr_name) + value = self.raspberry.readoutput(pin_number) + setattr(self, "__pin{}_output".format(pin_number), value) + attr.set_value(value) + + @catch_connection_error + def write_pin_output(self, attr): + w_value = attr.get_write_value() + attr_name = attr.get_name() + pin_number = self._get_pin(attr_name) + self.raspberry.setoutput(pin_number, w_value) def init_device(self): Device.init_device(self) @@ -246,205 +165,6 @@ def set_voltage(self, value, pin, output): if not request: raise ValueError("Pin must be setup as an output first") - #gpio3 - @catch_connection_error - def get_pin3_voltage(self): - self.__pin3_voltage = self.raspberry.readvoltage(3) - return self.__pin3_voltage - - @catch_connection_error - def set_pin3_voltage(self, value): - self.get_pin3_output() - self.set_voltage(value, 3, self.__pin3_output) - - @catch_connection_error - def get_pin3_output(self): - self.__pin3_output = self.raspberry.readoutput(3) - return self.__pin3_output - - @catch_connection_error - def set_pin3_output(self, value): - self.raspberry.setoutput(3, value) - - #gpio5 - @catch_connection_error - def get_pin5_voltage(self): - self.__pin5_voltage = self.raspberry.readvoltage(5) - return self.__pin5_voltage - - @catch_connection_error - def set_pin5_voltage(self, value): - self.get_pin5_output() - self.set_voltage(value, 5, self.__pin5_output) - - @catch_connection_error - def get_pin5_output(self): - self.__pin5_output = self.raspberry.readoutput(5) - return self.__pin5_output - - @catch_connection_error - def set_pin5_output(self, value): - self.raspberry.setoutput(5, value) - - #gpio7 - @catch_connection_error - def get_pin7_voltage(self): - self.__pin7_voltage = self.raspberry.readvoltage(7) - return self.__pin7_voltage - - @catch_connection_error - def set_pin7_voltage(self, value): - self.get_pin7_output() - self.set_voltage(value, 7, self.__pin7_output) - - @catch_connection_error - def get_pin7_output(self): - self.__pin7_output = self.raspberry.readoutput(7) - return self.__pin7_output - - @catch_connection_error - def set_pin7_output(self, value): - self.raspberry.setoutput(7, value) - - #gpio8 - @catch_connection_error - def get_pin8_voltage(self): - self.__pin8_voltage = self.raspberry.readvoltage(8) - return self.__pin8_voltage - - @catch_connection_error - def set_pin8_voltage(self, value): - self.get_pin8_output() - self.set_voltage(value, 8, self.__pin8_output) - - @catch_connection_error - def get_pin8_output(self): - self.__pin8_output = self.raspberry.readoutput(8) - return self.__pin8_output - - @catch_connection_error - def set_pin8_output(self, value): - self.raspberry.setoutput(8, value) - - #gpio10 - @catch_connection_error - def get_pin10_voltage(self): - self.__pin10_voltage = self.raspberry.readvoltage(10) - return self.__pin10_voltage - - @catch_connection_error - def set_pin10_voltage(self, value): - self.get_pin10_output() - self.set_voltage(value, 10, self.__pin10_output) - - @catch_connection_error - def get_pin10_output(self): - self.__pin10_output = self.raspberry.readoutput(10) - return self.__pin10_output - - @catch_connection_error - def set_pin10_output(self, value): - self.raspberry.setoutput(10, value) - - #gpio11 - @catch_connection_error - def get_pin11_voltage(self): - self.__pin11_voltage = self.raspberry.readvoltage(11) - return self.__pin11_voltage - - @catch_connection_error - def set_pin11_voltage(self, value): - self.get_pin11_output() - self.set_voltage(value, 11, self.__pin11_output) - - @catch_connection_error - def get_pin11_output(self): - self.__pin11_output = self.raspberry.readoutput(11) - return self.__pin11_output - - @catch_connection_error - def set_pin11_output(self, value): - self.raspberry.setoutput(11, value) - - #gpio12 - @catch_connection_error - def get_pin12_voltage(self): - self.__pin12_voltage = self.raspberry.readvoltage(12) - return self.__pin12_voltage - - @catch_connection_error - def set_pin12_voltage(self, value): - self.get_pin12_output() - self.set_voltage(value, 12, self.__pin12_output) - - @catch_connection_error - def get_pin12_output(self): - self.__pin12_output = self.raspberry.readoutput(12) - return self.__pin12_output - - @catch_connection_error - def set_pin12_output(self, value): - self.raspberry.setoutput(12, value) - - #gpio13 - @catch_connection_error - def get_pin13_voltage(self): - self.__pin13_voltage = self.raspberry.readvoltage(13) - return self.__pin13_voltage - - @catch_connection_error - def set_pin13_voltage(self, value): - self.get_pin13_output() - self.set_voltage(value, 13, self.__pin13_output) - - @catch_connection_error - def get_pin13_output(self): - self.__pin13_output = self.raspberry.readoutput(13) - return self.__pin13_output - - @catch_connection_error - def set_pin13_output(self, value): - self.raspberry.setoutput(13, value) - - #gpio15 - @catch_connection_error - def get_pin15_voltage(self): - self.__pin15_voltage = self.raspberry.readvoltage(15) - return self.__pin15_voltage - - @catch_connection_error - def set_pin15_voltage(self, value): - self.get_pin15_output() - self.set_voltage(value, 15, self.__pin15_output) - - @catch_connection_error - def get_pin15_output(self): - self.__pin15_output = self.raspberry.readoutput(15) - return self.__pin15_output - - @catch_connection_error - def set_pin15_output(self, value): - self.raspberry.setoutput(15, value) - - #gpio16 - @catch_connection_error - def get_pin16_voltage(self): - self.__pin16_voltage = self.raspberry.readvoltage(16) - return self.__pin16_voltage - - @catch_connection_error - def set_pin16_voltage(self, value): - self.get_pin16_output() - self.set_voltage(value, 16, self.__pin16_output) - - @catch_connection_error - def get_pin16_output(self): - self.__pin16_output = self.raspberry.readoutput(16) - return self.__pin16_output - - @catch_connection_error - def set_pin16_output(self, value): - self.raspberry.setoutput(16, value) #End of gpio's def is_TurnOff_allowed(self):