142 lines
4.2 KiB
Python
142 lines
4.2 KiB
Python
# SPDX-License-Identifier: GPL-2.0
|
|
# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
|
|
|
|
import os
|
|
import socket
|
|
import sys
|
|
from threading import Thread
|
|
import xbmc
|
|
import xbmcgui
|
|
import xbmcaddon
|
|
|
|
TEXT_ALIGN_LEFT = 0
|
|
TEXT_ALIGN_RIGHT = 1
|
|
TEXT_ALIGN_CENTER_X = 2
|
|
TEXT_ALIGN_CENTER_Y = 4
|
|
TEXT_ALIGN_RIGHT_CENTER_Y = 5
|
|
TEXT_ALIGN_LEFT_CENTER_X_CENTER_Y = 6
|
|
ACTION_PREVIOUS_MENU = 10
|
|
ACTION_BACKSPACE = 92
|
|
|
|
SOCK_PATH = "/tmp/ts_calibrate.socket"
|
|
TSLIB_EDGE_OFFEST = 50
|
|
CROSSHAIR_IMAGE_SIZE = 23
|
|
CROSSHAIR_IMAGE_OFFSET = 11
|
|
SKIN_WIDTH = 1280 # we are using 720p skin
|
|
SKIN_HEIGHT = 720
|
|
|
|
class coordinates:
|
|
var_x = 0
|
|
var_y = 0
|
|
|
|
def server_thread(conn, self):
|
|
while True:
|
|
data = conn.recv(128)
|
|
if not data:
|
|
break
|
|
|
|
self.currentTarget = self.currentTarget + 1
|
|
if self.currentTarget > 0:
|
|
self.removeControl(self.targetImage)
|
|
|
|
if self.currentTarget == 5:
|
|
xbmcgui.Dialog().ok("Calibration", "Calibration done.")
|
|
break
|
|
|
|
self.info.setLabel("Touch '" + data + "' crosshair")
|
|
self.targetImage = xbmcgui.ControlImage(
|
|
self.touch_points[self.currentTarget].var_x - CROSSHAIR_IMAGE_OFFSET,
|
|
self.touch_points[self.currentTarget].var_y - CROSSHAIR_IMAGE_OFFSET,
|
|
CROSSHAIR_IMAGE_SIZE, CROSSHAIR_IMAGE_SIZE,
|
|
self.crosshair_path, colorDiffuse='0x00000000')
|
|
self.addControl(self.targetImage)
|
|
|
|
# out of loop, close connection
|
|
conn.close()
|
|
os.remove(SOCK_PATH)
|
|
self.retval = 0
|
|
self.close()
|
|
|
|
class ts_calibrate(xbmcgui.WindowDialog):
|
|
def __init__(self):
|
|
self.retval = 0
|
|
self.media_path=os.path.join(addon.getAddonInfo('path'), 'resources','media') + '/'
|
|
self.crosshair_path = self.media_path + 'crosshair.png'
|
|
self.currentTarget = -1
|
|
|
|
self.edge_offset_x = TSLIB_EDGE_OFFEST * SKIN_WIDTH / self.getWidth()
|
|
self.edge_offset_y = TSLIB_EDGE_OFFEST * SKIN_HEIGHT / self.getHeight()
|
|
|
|
self.touch_points = [coordinates() for i in range(5)]
|
|
self.touch_points[0].var_x = self.edge_offset_x
|
|
self.touch_points[0].var_y = self.edge_offset_y
|
|
self.touch_points[1].var_x = SKIN_WIDTH - self.edge_offset_x
|
|
self.touch_points[1].var_y = self.edge_offset_y
|
|
self.touch_points[2].var_x = SKIN_WIDTH - self.edge_offset_x
|
|
self.touch_points[2].var_y = SKIN_HEIGHT - self.edge_offset_y
|
|
self.touch_points[3].var_x = self.edge_offset_x
|
|
self.touch_points[3].var_y = SKIN_HEIGHT - self.edge_offset_y
|
|
self.touch_points[4].var_x = SKIN_WIDTH / 2
|
|
self.touch_points[4].var_y = SKIN_HEIGHT / 2
|
|
|
|
self.background = xbmcgui.ControlImage(0, 0, SKIN_WIDTH, SKIN_HEIGHT,
|
|
self.media_path + 'background.jpg', colorDiffuse = '0xffffffff')
|
|
self.addControl(self.background)
|
|
|
|
tmp_str = "Tslib/Kodi calibration utility\n\nTouch crosshair to calibrate"
|
|
tmp_str += "\n\nresolution: " + str(self.getWidth()) + "x" + str(self.getHeight())
|
|
tmp_str += "\nskin: " + str(SKIN_WIDTH) + "x" + str(SKIN_HEIGHT)
|
|
|
|
self.about = xbmcgui.ControlLabel(
|
|
10, 80, SKIN_WIDTH, 400,
|
|
"", textColor = '0xffffffff', font = 'font25', alignment = TEXT_ALIGN_CENTER_X)
|
|
self.addControl(self.about)
|
|
self.about.setLabel(tmp_str)
|
|
|
|
self.info = xbmcgui.ControlLabel(
|
|
20, SKIN_HEIGHT/2 - 40,
|
|
1000, 400,
|
|
"", textColor = '0xffffffff', font = 'font30', alignment = TEXT_ALIGN_LEFT)
|
|
self.addControl(self.info)
|
|
self.info.setLabel("")
|
|
|
|
if os.path.exists(SOCK_PATH):
|
|
os.remove(SOCK_PATH)
|
|
|
|
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
|
sock.bind(SOCK_PATH)
|
|
sock.listen(1)
|
|
|
|
# enter calibration mode
|
|
os.system("killall -SIGUSR1 ts_uinput_touch")
|
|
|
|
print 'Waiting for calibration connection'
|
|
conn, addr = sock.accept()
|
|
print 'Calibration connection accepted'
|
|
|
|
self.t = Thread(target=server_thread, args=(conn, self,))
|
|
self.t.start()
|
|
|
|
def onAction(self, action):
|
|
if action == ACTION_PREVIOUS_MENU or action == ACTION_BACKSPACE:
|
|
self.retval = 0
|
|
self.close()
|
|
|
|
addon = xbmcaddon.Addon(id = 'service.touchscreen')
|
|
finished = False
|
|
|
|
while finished == False:
|
|
dialog = ts_calibrate()
|
|
dialog.doModal()
|
|
|
|
if dialog.retval == 0:
|
|
finished = True
|
|
del dialog
|
|
|
|
del addon
|
|
# exit calibration mode
|
|
os.system("killall -SIGUSR2 ts_uinput_touch")
|
|
|
|
if os.path.exists(SOCK_PATH):
|
|
os.remove(SOCK_PATH)
|
|
|