1
0
This repository has been archived on 2024-11-10. You can view files and clone it, but cannot push or open issues or pull requests.

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)