lpcmanager

Fix touch orientation, that ws initially changing QT EVDEV parameter environment variable and now change TSLIB configuration file path environment variable to pick configuration file matching orientation
from svghmi.svghmi import SVGHMI, SVGHMILibrary, paths
import os
# set default values so that COG browser is managed by SVGHMI
SVGHMI.XSD = """<?xml version="1.0" encoding="utf-8" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="SVGHMI">
<xsd:complexType>
<xsd:attribute name="OnStart" type="xsd:string" use="optional" default="{LPCBrowserStart}"/>
<xsd:attribute name="OnStop" type="xsd:string" use="optional" default="{LPCBrowserStop}"/>
<xsd:attribute name="Portrait" type="xsd:boolean" use="optional" default="false"/>
<xsd:attribute name="Rotate180" type="xsd:boolean" use="optional" default="false"/>
<xsd:attribute name="EnableWatchdog" type="xsd:boolean" use="optional" default="true"/>
<xsd:attribute name="OnWatchdog" type="xsd:string" use="optional" default="{LPCBrowserRestart}"/>
<xsd:attribute name="WatchdogInitial" use="optional" default="30">
<xsd:simpleType>
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="2"/>
<xsd:maxInclusive value="600"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
<xsd:attribute name="WatchdogInterval" use="optional" default="5">
<xsd:simpleType>
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="2"/>
<xsd:maxInclusive value="60"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
<xsd:attribute name="Port" type="xsd:integer" use="optional" default="8008"/>
<xsd:attribute name="Interface" type="xsd:string" use="optional" default="localhost"/>
<xsd:attribute name="Path" type="xsd:string" use="optional" default="{name}"/>
<xsd:attribute name="MaxConnections" use="optional" default="4">
<xsd:simpleType>
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="1"/>
<xsd:maxInclusive value="16"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:complexType>
</xsd:element>
</xsd:schema>
"""
old_get_SVGHMI_options = SVGHMI.get_SVGHMI_options
def get_SVGHMI_options(self):
svghmi_options = old_get_SVGHMI_options(self)
portrait = self.GetParamsAttributes("SVGHMI.Portrait")["value"]
rotate180 = self.GetParamsAttributes("SVGHMI.Rotate180")["value"]
eglfs_angle,touch_angle = {
(False,False): ("0","0"),
(False,True): ("90","90"),
(True,False): ("180","180"),
(True,True): ("-90","270")}[(rotate180,portrait)]
# When we were using EVDEV, this was how rotation was done:
# 'QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=rotate=' + touch_angle + \
browser_commandline = 'TSLIB_CONFFILE=/etc/ts_' + touch_angle + ".conf" \
' QT_QPA_EGLFS_ROTATION=' + eglfs_angle + \
' qt_webenginewidgets_minimal' + \
' --js-flags="--max_old_space_size=16 --gc_interval=100 --optimize_for_size"' + \
' --single-process' + \
' --no-sandbox "' + svghmi_options["url"] + '"'
svghmi_options.update(
{"LPCBrowserStart": "sh -c '"+browser_commandline+"'",
"LPCBrowserStop": "killall qt_webenginewidgets_minimal",
"LPCBrowserRestart": "sh -c 'killall qt_webenginewidgets_minimal; sleep 1; "+browser_commandline+" '"})
return svghmi_options
SVGHMI.get_SVGHMI_options = get_SVGHMI_options
def getDefaultSVG(self):
ScriptDirectory = paths.AbsDir(__file__)
portrait = self.GetParamsAttributes("SVGHMI.Portrait")["value"]
return os.path.join(ScriptDirectory, "portrait.svg" if portrait else "landscape.svg")
SVGHMI.getDefaultSVG = getDefaultSVG
old_Generate_C = SVGHMILibrary.Generate_C
def Generate_C(self, *args, **kwargs):
already_found_browser_launch = False
for CTNChild in self.GetCTR().IterChildren():
if isinstance(CTNChild, SVGHMI):
# spot browser launch abuse
if CTNChild.GetParamsAttributes("SVGHMI.OnStart")["value"].find("{LPCBrowserStart}") >= 0:
if already_found_browser_launch:
self.FatalError("SVGHMI: Only one HMI can launch browser")
already_found_browser_launch = True
return old_Generate_C(self, *args, **kwargs)
SVGHMILibrary.Generate_C = Generate_C