108 lines
3.4 KiB
Python
108 lines
3.4 KiB
Python
from enum import Enum
|
|
from xml_reader import Xml_reader
|
|
import RPi.GPIO as GPIO
|
|
|
|
class Interface_handler:
|
|
"""handles the access to the various interfaces (e.g. GPIO)
|
|
"""
|
|
|
|
class Pin(Enum):
|
|
"""list of all usable pins
|
|
|
|
enables restricting methods to these pins
|
|
"""
|
|
GIO_2 = 3
|
|
GIO_3 = 5
|
|
GIO_4 = 7
|
|
GIO_5 = 29
|
|
GIO_6 = 31
|
|
GIO_7 = 26
|
|
GIO_8 = 24
|
|
GIO_9 = 21
|
|
GIO_10 = 19
|
|
GIO_11 = 23
|
|
GIO_12 = 32
|
|
GIO_13 = 33
|
|
GIO_14 = 8
|
|
GIO_15 = 10
|
|
GIO_16 = 36
|
|
GIO_17 = 11
|
|
GIO_18 = 12
|
|
GIO_19 = 35
|
|
GIO_20 = 38
|
|
GIO_21 = 40
|
|
GIO_22 = 15
|
|
GIO_23 = 16
|
|
GIO_24 = 18
|
|
GIO_25 = 22
|
|
GIO_26 = 37
|
|
GIO_27 = 13
|
|
|
|
def __init__(self, xml_reader):
|
|
"""inits the interface_handler
|
|
"""
|
|
if not isinstance(xml_reader, Xml_reader):
|
|
raise TypeError('xml_reader must be an instance of XML_reader')
|
|
self.xml_reader = xml_reader
|
|
self.init_gpio()
|
|
|
|
def init_gpio(self):
|
|
"""initialises the GPIO pins
|
|
"""
|
|
GPIO.setmode(GPIO.BOARD)
|
|
for device_name in self.xml_reader.get_device_names():
|
|
protocol, pins in self.xml_reader.get_port(device_name)
|
|
for pin in pins:
|
|
if protocol == "AI" or "DI":
|
|
GPIO.setup(self.Pin(pin),GPIO.IN)
|
|
elif protocol == "AO" or "DO":
|
|
GPIO.setup(self.Pin(pin),GPIO.OUT)
|
|
else:
|
|
raise NotImplementedError('the protocol of the device %s is not implemented' % device_name)
|
|
|
|
|
|
def read(self, device_name):
|
|
"""reads the current value from the pins of one device
|
|
|
|
Args:
|
|
device_name (string): the name of the device
|
|
|
|
Raises:
|
|
NameError: the device cannot be found in the config.xml
|
|
|
|
Returns:
|
|
dict: {'pin': 'value'}
|
|
"""
|
|
if self.xml_reader.get_port(device_name) == None:
|
|
raise NameError('the device with the name %s is unknown' % device_name)
|
|
returnValues = dict()
|
|
protocol, pins = self.xml_reader.get_port(device_name)
|
|
if not protocol == "AI" or "DI":
|
|
raise ValueError("you can not read from device %s" % device_name)
|
|
for pin in self.xml_reader.get_port(device_name)["pins"]:
|
|
returnValues.update({
|
|
pin,
|
|
GPIO.read(self.Pin(pin))
|
|
})
|
|
return returnValues
|
|
|
|
def write(self, device_name, value):
|
|
"""writes a value to all the pins of a device
|
|
|
|
Args:
|
|
device_name (string): name of the device
|
|
value (float): the value to be written
|
|
|
|
Raises:
|
|
NameError: device not found in config.xml
|
|
TypeError: value has wrong type
|
|
"""
|
|
if self.xml_reader.get_port(device_name) == None:
|
|
raise NameError('the device with the name %s is unknown' % device_name)
|
|
if not isinstance(value,float):
|
|
raise TypeError('the value to write must be of type float')
|
|
protocol, pins = self.xml_reader.get_port(device_name)
|
|
if not protocol == "AO" or "DO":
|
|
raise ValueError("you cannot write to device %s" % device_name)
|
|
for pin in self.xml_reader.get_port(device_name)["pins"]:
|
|
GPIO.write(self.Pin(pin,value)) |