refactor touch classes

This commit is contained in:
Bartosz Kościów 2017-05-21 20:29:00 +02:00
parent d35c996400
commit 125110ee51
4 changed files with 59 additions and 117 deletions

View File

@ -1,21 +1,71 @@
"""Touch panel interface""" """Touch panel interface"""
import spidev # pylint: disable=I0011,F0401
import abc import abc
import RPi.GPIO
class Touch(metaclass=abc.ABCMeta): class Touch(metaclass=abc.ABCMeta):
"""Touch class""" """Touch class"""
def __init__(self, width, height, int_pin=None, callback=None, cs_pin=None, spi=0, speed=1000000):
self.width = width
self.height = height
self.spi = spidev.SpiDev()
self.spi.open(spi, 0)
self.spi.max_speed_hz = speed
self.spi.mode = 0
self.cs_pin = cs_pin
self.int_pin = int_pin
self.callback = callback
self.bouncetime = 500
self.rotate = 0
self.correction = {
'x': 0,
'y': 0,
'ratio_x': 1,
'ratio_y': 1,
}
@abc.abstractmethod
def init(self): def init(self):
"""some additional init""" """some init functions"""
return if self.int_pin:
RPi.GPIO.setup(self.int_pin, RPi.GPIO.IN)
RPi.GPIO.add_event_detect(
self.int_pin, RPi.GPIO.BOTH, callback=self._interrupt, bouncetime=self.bouncetime
)
if self.cs_pin:
RPi.GPIO.setup(self.cs_pin, RPi.GPIO.OUT)
RPi.GPIO.output(self.cs_pin, 1)
@abc.abstractmethod @abc.abstractmethod
def get_position(self): def get_position(self):
"""returns pressed position""" """returns pressed position"""
return return
@abc.abstractmethod
def close(self): def close(self):
"""close functions""" """close action"""
return if self.int_pin:
RPi.GPIO.remove_event_detect(self.int_pin)
self.spi.close()
def _interrupt(self, channel):
"""call users callback"""
self.callback(self.get_position())
def _calculate_avr(self, points):
"""calculate x,y by average"""
if len(points) == 0:
return None
sum_x = 0
sum_y = 0
for point in points:
sum_x += point[0]
sum_y += point[1]
return int(sum_x / len(points)), int(sum_y / len(points))
def _in_bounds(self, pos_x, pos_y):
"""checks if point is in range"""
if self.rotate == 0 or self.rotate == 180:
return 0 <= pos_x <= self.width and 0 <= pos_y <= self.height
else:
return 0 <= pos_y <= self.width and 0 <= pos_x <= self.height

View File

@ -16,7 +16,7 @@ def callback(position):
print('(x,y)', position) print('(x,y)', position)
touch = AD7843(240, 320, 26, callback) touch = AD7843(240, 320, 26, callback)
# touch.rotate = 270 touch.rotate = 180
touch.init() touch.init()
while True: while True:

View File

@ -1,4 +1,3 @@
import spidev # pylint: disable=I0011,F0401
import RPi.GPIO import RPi.GPIO
from gfxlcd.abstract.touch import Touch from gfxlcd.abstract.touch import Touch
@ -6,34 +5,13 @@ from gfxlcd.abstract.touch import Touch
class AD7843(Touch): class AD7843(Touch):
"""AD7843 class""" """AD7843 class"""
def __init__(self, width, height, int_pin=None, callback=None, cs_pin=None, spi=0, speed=1000000): def __init__(self, width, height, int_pin=None, callback=None, cs_pin=None, spi=0, speed=1000000):
self.width = width super().__init__(width, height, int_pin, callback, cs_pin, spi, speed)
self.height = height
self.spi = spidev.SpiDev()
self.spi.open(spi, 0)
self.spi.max_speed_hz = speed
self.spi.mode = 0
self.correction = { self.correction = {
'x': 364, 'x': 364,
'y': 430, 'y': 430,
'ratio_x': 14.35, 'ratio_x': 14.35,
'ratio_y': 10.59 'ratio_y': 10.59
} }
self.cs_pin = cs_pin
self.int_pin = int_pin
self.callback = callback
self.bouncetime = 500
self.rotate = 0
def init(self):
"""some init functions"""
if self.int_pin:
RPi.GPIO.setup(self.int_pin, RPi.GPIO.IN)
RPi.GPIO.add_event_detect(
self.int_pin, RPi.GPIO.BOTH, callback=self._interrupt, bouncetime=self.bouncetime
)
if self.cs_pin:
RPi.GPIO.setup(self.cs_pin, RPi.GPIO.OUT)
RPi.GPIO.output(self.cs_pin, 1)
def _get_xy(self, offset_x, offset_y): def _get_xy(self, offset_x, offset_y):
"""correct x and y""" """correct x and y"""
@ -53,14 +31,6 @@ class AD7843(Touch):
return int((offset_y - self.correction['y']) / self.correction['ratio_y']), \ return int((offset_y - self.correction['y']) / self.correction['ratio_y']), \
self.width - int((offset_x - self.correction['x']) / self.correction['ratio_x']) self.width - int((offset_x - self.correction['x']) / self.correction['ratio_x'])
def _interrupt(self, channel):
"""call users callback"""
if self.cs_pin:
RPi.GPIO.output(self.cs_pin, 0)
self.callback(self.get_position())
if self.cs_pin:
RPi.GPIO.output(self.cs_pin, 1)
def get_position(self): def get_position(self):
"""get touch coords""" """get touch coords"""
buffer = [] buffer = []
@ -87,29 +57,3 @@ class AD7843(Touch):
fuse -= 1 fuse -= 1
return self._calculate_avr(buffer) return self._calculate_avr(buffer)
def _in_bounds(self, pos_x, pos_y):
"""checks if point is in range"""
if self.rotate == 0 or self.rotate == 180:
return 0 <= pos_x <= self.width and 0 <= pos_y <= self.height
else:
return 0 <= pos_y <= self.width and 0 <= pos_x <= self.height
def _calculate_avr(self, points):
"""calculate x,y by average"""
if len(points) == 0:
return None
sum_x = 0
sum_y = 0
for point in points:
sum_x += point[0]
sum_y += point[1]
return int(sum_x / len(points)), int(sum_y / len(points))
def close(self):
"""close action"""
if self.int_pin:
RPi.GPIO.remove_event_detect(self.int_pin)
self.spi.close()

View File

@ -1,4 +1,3 @@
import spidev # pylint: disable=I0011,F0401
import RPi.GPIO import RPi.GPIO
from gfxlcd.abstract.touch import Touch from gfxlcd.abstract.touch import Touch
@ -6,38 +5,13 @@ from gfxlcd.abstract.touch import Touch
class XPT2046(Touch): class XPT2046(Touch):
"""XPT2046 class""" """XPT2046 class"""
def __init__(self, width, height, int_pin=None, callback=None, cs_pin=None, spi=0, speed=1000000): def __init__(self, width, height, int_pin=None, callback=None, cs_pin=None, spi=0, speed=1000000):
self.width = width super().__init__(width, height, int_pin, callback, cs_pin, spi, speed)
self.height = height
self.spi = spidev.SpiDev()
self.spi.open(spi, 0)
self.spi.max_speed_hz = speed
self.spi.mode = 0
self.correction = { self.correction = {
'x': 540, 'x': 540,
'y': 50, 'y': 50,
'ratio_x': 0.94, 'ratio_x': 0.94,
'ratio_y': 1.26, 'ratio_y': 1.26,
} }
self.cs_pin = cs_pin
self.int_pin = int_pin
self.callback = callback
self.bouncetime = 500
self.rotate = 0
def init(self):
"""some init functions"""
if self.int_pin:
RPi.GPIO.setup(self.int_pin, RPi.GPIO.IN)
RPi.GPIO.add_event_detect(
self.int_pin, RPi.GPIO.BOTH, callback=self._interrupt, bouncetime=self.bouncetime
)
if self.cs_pin:
RPi.GPIO.setup(self.cs_pin, RPi.GPIO.OUT)
RPi.GPIO.output(self.cs_pin, 1)
def _interrupt(self, channel):
"""call users callback"""
self.callback(self.get_position())
def _get_xy(self, offset_x, offset_y): def _get_xy(self, offset_x, offset_y):
"""correct x and y""" """correct x and y"""
@ -90,29 +64,3 @@ class XPT2046(Touch):
fuse -= 1 fuse -= 1
return self._calculate_avr(buffer) return self._calculate_avr(buffer)
def _in_bounds(self, pos_x, pos_y):
"""checks if point is in range"""
if self.rotate == 0 or self.rotate == 180:
return 0 <= pos_x <= self.width and 0 <= pos_y <= self.height
else:
return 0 <= pos_y <= self.width and 0 <= pos_x <= self.height
def _calculate_avr(self, points):
"""calculate x,y by average"""
if len(points) == 0:
return None
sum_x = 0
sum_y = 0
for point in points:
sum_x += point[0]
sum_y += point[1]
return int(sum_x / len(points)), int(sum_y / len(points))
def close(self):
"""close action"""
if self.int_pin:
RPi.GPIO.remove_event_detect(self.int_pin)
self.spi.close()