Ugly workaround for RPi3 touchscreen + Kivy issue

This commit is contained in:
Admar Schoonen 2023-04-08 17:10:44 +02:00
parent b6e07a1c4d
commit a84b3ec01a
1 changed files with 99 additions and 26 deletions

125
clock.py
View File

@ -4,10 +4,13 @@ import datetime
import math
import sys
import traceback
import copy
from kivy.config import Config
Config.set('graphics', 'width', '800')
Config.set('graphics', 'height', '480')
#Config.set('graphics', 'width', '800')
#Config.set('graphics', 'height', '480')
Config.set('graphics', 'width', '667')
Config.set('graphics', 'height', '400')
Config.set('graphics', 'maxfps', '60')
from kivy.app import App
@ -234,6 +237,30 @@ class AlarmSettings():
reading_light_brightness = 1
display_brightness = 10
class Touch():
def __init__(self, x=None):
if x is None:
self.pos = []
self.spos = []
self.is_empty = True
self.angle = 0
else:
self.pos = [i for i in x.pos]
self.spos = [i for i in x.spos]
self.is_empty = False
x = self.spos[0] - 0.5
y = self.spos[1] - 0.5
self.angle = math.atan2(y, x) / math.pi; # angle is between -1 and 1
def __repr__(self):
return ".is_empty: " + str(self.is_empty) + ", .pos: " + str(self.pos) + ", .spos: " + str(self.spos)
def copy(self, x):
self = Touch(x)
def clear(self):
self = Touch()
class MyClockWidget(FloatLayout):
grabbed = ""
face_numbers = []
@ -261,6 +288,8 @@ class MyClockWidget(FloatLayout):
draw_list_last_frame = []
draw_list_curr_frame = []
touch_prev = Touch()
def hide_widget(self, widget, hide=True):
if hasattr(widget, 'saved_attrs'):
if not hide:
@ -627,20 +656,47 @@ class MyClockWidget(FloatLayout):
super(MyClockWidget, self).on_touch_up(touch)
def on_touch_move(self, touch):
if self.grabbed == "":
return
alarm_settings = App.get_running_app().alarm_settings
self.alarm_set_timeout = 0
x = touch.pos[0] - self.size[0]/2
y = touch.pos[1] - self.size[1]/2
angle = math.atan2(y, x) / math.pi; # angle is between -1 and 1
touch_curr = Touch(touch)
# Ugly workaround for issue with Kivy and Raspberry Pi 3 + touch screen
tol = 0.5 # 0.5 is equal to 90 degrees
inc = 1 # 1 is equal to 180 degrees
if (self.touch_prev.is_empty == False) and (touch_curr.angle - self.touch_prev.angle >= tol):
while touch_curr.angle - self.touch_prev.angle >= tol:
touch_curr.angle -= inc
elif (self.touch_prev.is_empty == False) and (touch_curr.angle - self.touch_prev.angle <= -tol):
while touch_curr.angle - self.touch_prev.angle <= -tol:
touch_curr.angle += inc
self.touch_prev = copy.deepcopy(touch_curr)
if self.grabbed == "minute":
alarm_settings.alarm_modified = True
self.set_alarm_timeout_counter = 0
minute = round(-angle * 30 + 15)
if minute < 0:
minute = round(-touch_curr.angle * 30 + 15)
while minute < 0:
minute += 60
if minute == 60:
minute = 59
while minute >= 60:
minute -= 60
# Sometimes the hand is 30 minutes ahead / behind the place where the user touches the screen --> correct for this behavior
if (((minute - alarm_settings.alarm_time.minute) >= 15) and ((minute - alarm_settings.alarm_time.minute) <= 45)):
minute = minute - 30
elif (((minute - alarm_settings.alarm_time.minute) <= -15) and ((minute - alarm_settings.alarm_time.minute) >= -45)):
minute = minute + 30
while minute < 0:
minute += 60
while minute >= 60:
minute -= 60
# hour correction
hour = alarm_settings.alarm_time.hour
@ -649,10 +705,10 @@ class MyClockWidget(FloatLayout):
elif alarm_settings.alarm_time.minute <= 5 and minute >= 55:
hour -= 1
if hour == 24:
hour = 0
elif hour == -1:
hour = 23
while hour < 0:
hour += 24
while hour >= 24:
hour -= 24
alarm_settings.alarm_time = datetime.datetime(alarm_settings.alarm_time.year, \
alarm_settings.alarm_time.month, alarm_settings.alarm_time.day, \
@ -660,15 +716,28 @@ class MyClockWidget(FloatLayout):
elif self.grabbed == "hour":
alarm_settings.alarm_modified = True
self.set_alarm_timeout_counter = 0
hour = round(-angle * 6 + 3)
if hour < 0:
hour = round(-touch_curr.angle * 6 + 3)
while hour < 0:
hour += 12
if hour == 12:
hour = 0
while hour >= 12:
hour -= 12
# Sometimes the hand is 6 hours ahead / behind the place where the user touches the screen --> correct for this behavior
if (((hour - alarm_settings.alarm_time.hour) >= 3) and ((hour - alarm_settings.alarm_time.hour) <= 9)):
hour = hour - 6
if (((hour - alarm_settings.alarm_time.hour) <= -3) and ((hour - alarm_settings.alarm_time.hour) >= -9)):
hour = hour + 6
while hour < 0:
hour += 12
while hour >= 12:
hour -= 12
if alarm_settings.alarm_time.hour >= 12:
hour += 12
# AM / PM correction
if alarm_settings.alarm_time.hour == 11 and hour == 0:
hour = 12
@ -679,7 +748,7 @@ class MyClockWidget(FloatLayout):
elif alarm_settings.alarm_time.hour == 12 and hour == 23:
hour = 11
# AM / PM boundary
minute = alarm_settings.alarm_time.minute
alarm_settings.alarm_time = datetime.datetime(alarm_settings.alarm_time.year, \
alarm_settings.alarm_time.month, alarm_settings.alarm_time.day, \
hour, alarm_settings.alarm_time.minute, alarm_settings.alarm_time.second, 0)
@ -696,20 +765,24 @@ class MyClockWidget(FloatLayout):
minutes_hand = self.position_on_clock(time.minute/60+time.second/3600, length=0.40*hands.size[0])
hours_hand = self.position_on_clock(time.hour/12 + time.minute/720, length=0.35*hands.size[0])
self.grabbed = ""
if (0.85 <= touch.spos[0] <= 0.95) and (0.05 <= touch.spos[1] <= 0.15):
self.on_alarm_button_pressed()
elif (0.85 <= touch.spos[0] <= 0.95) and (0.85 <= touch.spos[1] <= 0.95):
self.on_settings_button_pressed()
elif self.view == "set_alarm":
self.set_alarm_timeout_counter = 0
if (minutes_hand.x - 0.1 * self.size[0] <= touch.pos[0] <= minutes_hand.x + 0.1 * self.size[0]) and \
(minutes_hand.y - 0.1 * self.size[1] <= touch.pos[1] <= minutes_hand.y + 0.1 * self.size[1]):
self.grabbed = "minute"
elif (hours_hand.x - 0.1 * self.size[0] <= touch.pos[0] <= hours_hand.x + 0.1 * self.size[0]) and \
(hours_hand.y - 0.1 * self.size[1] <= touch.pos[1] <= hours_hand.y + 0.1 * self.size[1]):
self.grabbed = "hour"
if self.grabbed == "":
if (minutes_hand.x - 0.1 * self.size[0] <= touch.pos[0] <= minutes_hand.x + 0.1 * self.size[0]) and \
(minutes_hand.y - 0.1 * self.size[1] <= touch.pos[1] <= minutes_hand.y + 0.1 * self.size[1]):
self.grabbed = "minute"
self.touch_prev.clear()
elif (hours_hand.x - 0.1 * self.size[0] <= touch.pos[0] <= hours_hand.x + 0.1 * self.size[0]) and \
(hours_hand.y - 0.1 * self.size[1] <= touch.pos[1] <= hours_hand.y + 0.1 * self.size[1]):
self.grabbed = "hour"
self.touch_prev.clear()
else:
self.grabbed = ""
print("grabbed: " + self.grabbed)
elif self.view == "settings_menu":
pass
elif self.view == "clock":