Ugly workaround for RPi3 touchscreen + Kivy issue
This commit is contained in:
parent
b6e07a1c4d
commit
a84b3ec01a
125
clock.py
125
clock.py
|
@ -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":
|
||||
|
|
Loading…
Reference in New Issue