From b1a314c60eb4a2463538898b78b350f5a30507b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartosz=20Ko=C5=9Bci=C3=B3w?= Date: Sun, 21 May 2017 19:41:48 +0200 Subject: [PATCH] touch abstract xpt rotation --- gfxlcd/abstract/touch.py | 21 ++++++++ .../{touch_320x480.py => touch_480x320.py} | 10 ++-- gfxlcd/driver/ad7843/ad7843.py | 13 ++--- gfxlcd/driver/xpt2046/xpt2046.py | 52 ++++++++++++++----- 4 files changed, 70 insertions(+), 26 deletions(-) create mode 100644 gfxlcd/abstract/touch.py rename gfxlcd/demos/{touch_320x480.py => touch_480x320.py} (75%) diff --git a/gfxlcd/abstract/touch.py b/gfxlcd/abstract/touch.py new file mode 100644 index 0000000..c3cb11a --- /dev/null +++ b/gfxlcd/abstract/touch.py @@ -0,0 +1,21 @@ +"""Touch panel interface""" +import abc + + +class Touch(metaclass=abc.ABCMeta): + """Touch class""" + + @abc.abstractmethod + def init(self): + """some additional init""" + return + + @abc.abstractmethod + def get_position(self): + """returns pressed position""" + return + + @abc.abstractmethod + def close(self): + """close functions""" + return diff --git a/gfxlcd/demos/touch_320x480.py b/gfxlcd/demos/touch_480x320.py similarity index 75% rename from gfxlcd/demos/touch_320x480.py rename to gfxlcd/demos/touch_480x320.py index 6ffd702..d730194 100644 --- a/gfxlcd/demos/touch_320x480.py +++ b/gfxlcd/demos/touch_480x320.py @@ -15,13 +15,9 @@ lcd_tft.init() def callback(position): print('(x,y)', position) -touch = XPT2046(320, 480, 17, callback, 7) -# touch.correction = { -# 'x': 1,#3394,#364, -# 'y': 1,#3350,#430, -# 'ratio_x': 1, -# 'ratio_y': 1 -# } +touch = XPT2046(480, 320, 17, callback, 7) +#touch.rotate = 270 + touch.init() while True: diff --git a/gfxlcd/driver/ad7843/ad7843.py b/gfxlcd/driver/ad7843/ad7843.py index 5f5e9e1..a8fdd5b 100644 --- a/gfxlcd/driver/ad7843/ad7843.py +++ b/gfxlcd/driver/ad7843/ad7843.py @@ -1,8 +1,9 @@ import spidev # pylint: disable=I0011,F0401 import RPi.GPIO +from gfxlcd.abstract.touch import Touch -class AD7843(object): +class AD7843(Touch): """AD7843 class""" def __init__(self, width, height, int_pin=None, callback=None, cs_pin=None, spi=0, speed=1000000): self.width = width @@ -21,6 +22,7 @@ class AD7843(object): self.int_pin = int_pin self.callback = callback self.bouncetime = 500 + self.rotate = 0 def init(self): """some init functions""" @@ -54,14 +56,14 @@ class AD7843(object): buffer = [] fuse = 40 while len(buffer) < 20 and fuse > 0: - # if self.cs_pin: - # RPi.GPIO.output(self.cs_pin, 0) + if self.cs_pin: + RPi.GPIO.output(self.cs_pin, 0) self.spi.xfer2([0xd0]) recvx = self.spi.readbytes(2) self.spi.xfer2([0x90]) recvy = self.spi.readbytes(2) - # if self.cs_pin: - # RPi.GPIO.output(self.cs_pin, 1) + if self.cs_pin: + RPi.GPIO.output(self.cs_pin, 1) tc_rx = recvx[0] << 5 tc_rx |= recvx[1] >> 3 @@ -71,7 +73,6 @@ class AD7843(object): pos_x = self.get_x(tc_rx) pos_y = self.get_y(tc_ry) - print(pos_x, pos_y) if 0 <= pos_x <= self.width and 0 <= pos_y <= self.height: buffer.append((pos_x, pos_y)) fuse -= 1 diff --git a/gfxlcd/driver/xpt2046/xpt2046.py b/gfxlcd/driver/xpt2046/xpt2046.py index 3eb21f9..40c1b9a 100644 --- a/gfxlcd/driver/xpt2046/xpt2046.py +++ b/gfxlcd/driver/xpt2046/xpt2046.py @@ -1,8 +1,9 @@ import spidev # pylint: disable=I0011,F0401 import RPi.GPIO +from gfxlcd.abstract.touch import Touch -class XPT2046(object): +class XPT2046(Touch): """XPT2046 class""" def __init__(self, width, height, int_pin=None, callback=None, cs_pin=None, spi=0, speed=1000000): self.width = width @@ -14,13 +15,14 @@ class XPT2046(object): self.correction = { 'x': 540, 'y': 50, - 'ratio_x': 0.94, #14.35, - 'ratio_y': 1.26, #10.59 + 'ratio_x': 0.94, + '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""" @@ -33,18 +35,36 @@ class XPT2046(object): RPi.GPIO.setup(self.cs_pin, RPi.GPIO.OUT) RPi.GPIO.output(self.cs_pin, 1) - def get_x(self, value): - """correct value to x""" - return int((value - self.correction['x']) / self.correction['ratio_x']) - - def get_y(self, value): - """correct value to y""" - return int((value - self.correction['y']) / self.correction['ratio_y']) + # def get_x(self, value): + # """correct value to x""" + # return int((value - self.correction['x']) / self.correction['ratio_x']) + # + # def get_y(self, value): + # """correct value to y""" + # return int((value - self.correction['y']) / self.correction['ratio_y']) def _interrupt(self, channel): """call users callback""" self.callback(self.get_position()) + def _get_xy(self, offset_x, offset_y): + """correct x and y""" + if self.rotate == 0: + return int((offset_x - self.correction['x']) / self.correction['ratio_x']), \ + self.height - int((offset_y - self.correction['y']) / self.correction['ratio_y']) + + if self.rotate == 90: + return int((offset_y - self.correction['y']) / self.correction['ratio_y']), \ + int((offset_x - self.correction['x']) / self.correction['ratio_x']), + + if self.rotate == 180: + return self.width - int((offset_x - self.correction['x']) / self.correction['ratio_x']), \ + int((offset_y - self.correction['y']) / self.correction['ratio_y']) + + if self.rotate == 270: + return self.height - int((offset_y - self.correction['y']) / self.correction['ratio_y']), \ + self.width - int((offset_x - self.correction['x']) / self.correction['ratio_x']) + def get_position(self): """get touch coords""" buffer = [] @@ -72,14 +92,20 @@ class XPT2046(object): if self.cs_pin: RPi.GPIO.output(self.cs_pin, 1) if tc_rz > 10: - pos_x = self.get_x(tc_rx) - pos_y = self.get_y(tc_ry) - if 0 <= pos_x <= self.width and 0 <= pos_y <= self.height: + pos_x, pos_y = self._get_xy(tc_rx, tc_ry) + if self._in_bounds(pos_x, pos_y): buffer.append((pos_x, pos_y)) fuse -= 1 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 == 280: + 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: