From 1ec5cc172c728ab5d30dce3db730be2cdcc5a5a9 Mon Sep 17 00:00:00 2001 From: David Escalona Date: Mon, 24 Oct 2022 18:55:55 +0200 Subject: [PATCH] meta-digi-dey: crank-demos: fix crank demo for CCMP15 Crank demo was not working on CCMP15 devices due to several changes on weston service and the user launching it. This commit makes several fixes to make the demo to work again: - Add 'DEMO_USER' parameter to determine which user will launch the demo. Update recipe and start script accordingly. - Add 'DEMO_DISPLAY' parameter to determine the display that will be used to launch the demo. Update recipe and start script accordingly. - Parameterize the name of the Weston service after which the demo must be started. Update recipe and service file accordingly. - Give Crank engine read and execution permissions so the engine can be started by any user. - Add new method to the demo start script to wait until Wayland is fully setup before actually starting the demo. Signed-off-by: David Escalona --- .../crank-demos/crank-demos/crank-demo-init | 38 +++++++++++++------ .../crank-demos/crank-demo.service | 2 +- .../crank-demos/crank-demos_7.1.bb | 18 +++++++-- .../crank-sbengine/crank-sbengine/sb-launcher | 5 ++- .../crank-sbengine/crank-sbengine_7.1.bb | 1 + 5 files changed, 48 insertions(+), 16 deletions(-) diff --git a/meta-digi-dey/recipes-crank/crank-demos/crank-demos/crank-demo-init b/meta-digi-dey/recipes-crank/crank-demos/crank-demos/crank-demo-init index df37d886b..c0000eac5 100644 --- a/meta-digi-dey/recipes-crank/crank-demos/crank-demos/crank-demo-init +++ b/meta-digi-dey/recipes-crank/crank-demos/crank-demos/crank-demo-init @@ -14,8 +14,10 @@ #=============================================================================== readonly DEMO="##CRANK_DEMO_PATH##" +readonly DEMO_DISPLAY="##CRANK_DEMO_DISPLAY##" readonly DEMO_OPTS="##CRANK_DEMO_OPTIONS##" readonly DEMO_ENV="##CRANK_DEMO_ENV##" +readonly DEMO_USER="##CRANK_DEMO_USER##" readonly SB_LAUNCHER="sb-launcher" readonly SB_LAUNCHER_SCRIPT="/usr/bin/${SB_LAUNCHER}" readonly CRANK_DEMO="crank-demo" @@ -31,14 +33,9 @@ log() { } get_crank_demo_pid() { - local pids="$(pidof -o $$ "${SB_LAUNCHER}" 2>/dev/null)" + local pid="$(pgrep -f ${DEMO})" - [ -n "${pids}" ] || return 1 - for pid in ${pids}; do - local cmd_line=$(xargs -0 < /proc/${pid}/cmdline) - local app="${cmd_line##* }" - [ "${app}" = "${DEMO}" ] && { echo "${pid}"; return 0; } - done + [ -n "${pid}" ] && { echo "${pid}"; return 0; } return 1 } @@ -46,7 +43,7 @@ get_crank_demo_pid() { check_is_running() { local pid - if [ -f "${PID_FILE}" ]; then + if [ -s "${PID_FILE}" ]; then pid="$(cat ${PID_FILE})" else pid="$(get_crank_demo_pid)" @@ -57,18 +54,35 @@ check_is_running() { kill -0 "${pid}" >/dev/null 2>&1 && return 0 fi + rm -f "${PID_FILE}" + return 1 } +wait_for_wayland() { + local count=20 + local wayland_socket="/run/user/$(id -u ${DEMO_USER})/${DEMO_DISPLAY}" + + [ -S "${wayland_socket}" -o ! -d "/usr/share/wayland/" ] && return 0 + while [ ! -S "${wayland_socket}" ]; do + sleep 1 + count=$((count-1)) + if [ "${count}" = 0 ]; then + return 1 + fi + done + return 0 +} + stop() { - check_is_running || { rm -f "${PID_FILE}"; return; } + check_is_running || return local pid="$(cat ${PID_FILE})" kill -TERM "${pid}" >/dev/null 2>&1 local STOP_TIMEOUT="5" for i in $(seq ${STOP_TIMEOUT}); do - check_is_running || { rm -f "${PID_FILE}"; log info "stopped"; break; } + check_is_running || { log info "stopped"; break; } if [ "${i}" -eq ${STOP_TIMEOUT} ]; then log warning "stop: ${CRANK_DEMO} did not stop gracefully" kill -KILL "${pid}" >/dev/null 2>&1 @@ -80,9 +94,11 @@ stop() { start() { check_is_running && { log warning "start: ${CRANK_DEMO} ALREADY running"; exit 0; } - env ${DEMO_ENV} ${SB_LAUNCHER_SCRIPT} ${DEMO_OPTS} ${DEMO} >/dev/null 2>&1 & + wait_for_wayland + env ${DEMO_ENV} ${SB_LAUNCHER_SCRIPT} ${DEMO_USER} ${DEMO_OPTS} ${DEMO} >/dev/null 2>&1 & if [ $? -eq 0 ]; then echo $! > ${PID_FILE} + log info "$(cat ${PID_FILE})" log info "started" fi } diff --git a/meta-digi-dey/recipes-crank/crank-demos/crank-demos/crank-demo.service b/meta-digi-dey/recipes-crank/crank-demos/crank-demos/crank-demo.service index a7a9e4585..7d4144c69 100644 --- a/meta-digi-dey/recipes-crank/crank-demos/crank-demos/crank-demo.service +++ b/meta-digi-dey/recipes-crank/crank-demos/crank-demos/crank-demo.service @@ -3,7 +3,7 @@ Description=Crank Software demo Documentation=https://www.cranksoftware.com/ # Make sure we are started after graphic service is available -After=weston@root.service +After=##WESTON_SERVICE## [Service] Type=forking diff --git a/meta-digi-dey/recipes-crank/crank-demos/crank-demos_7.1.bb b/meta-digi-dey/recipes-crank/crank-demos/crank-demos_7.1.bb index 1174b6b78..bed219efc 100644 --- a/meta-digi-dey/recipes-crank/crank-demos/crank-demos_7.1.bb +++ b/meta-digi-dey/recipes-crank/crank-demos/crank-demos_7.1.bb @@ -15,12 +15,20 @@ SRC_URI = " \ SRC_URI[md5sum] = "e7cfbe9590041c0d9bf8c64ab69ee57d" SRC_URI[sha256sum] = "2aa767f51183a5e96bacf5e4b03345524d29c30f7338b1a55e5a1080252bfd4a" +WESTON_SERVICE ?= "weston@root.service" +WESTON_SERVICE:ccmp15 ?= "weston-launch.service" + CRANK_DEMOS_TARBALL_PATH ?= "" -CRANK_DEMO_PATH ?= "${datadir}/crank/apps/Thermostat/Thermostat.gapp" +CRANK_DEMO_DISPLAY ?= "wayland-0" +CRANK_DEMO_DISPLAY:ccmp15 ?= "wayland-1" +CRANK_DEMO_ENV ?= "DISPLAY=:0.0 XDG_RUNTIME_DIR=/run/user/0 WAYLAND_DISPLAY=\${DEMO_DISPLAY}" +CRANK_DEMO_ENV:ccimx6ul ?= "" +CRANK_DEMO_ENV:ccmp15 ?= "DISPLAY=:0.0 XDG_RUNTIME_DIR=/run/user/1000 WAYLAND_DISPLAY=\${DEMO_DISPLAY}" CRANK_DEMO_OPTIONS ?= "" CRANK_DEMO_OPTIONS:ccimx6ul ?= "-odev-input,mouse=/dev/input/mouse0 -oscreen_mgr,swcursor" -CRANK_DEMO_ENV ?= "DISPLAY=:0.0 XDG_RUNTIME_DIR=/run/user/0 WAYLAND_DISPLAY=wayland-0" -CRANK_DEMO_ENV:ccimx6ul ?= "" +CRANK_DEMO_PATH ?= "${datadir}/crank/apps/Thermostat/Thermostat.gapp" +CRANK_DEMO_USER ?= "root" +CRANK_DEMO_USER:ccmp15 ?= "weston" # The tarball is only available for downloading after registration, so provide # a PREMIRROR to a local directory that can be configured in the project's @@ -64,6 +72,8 @@ do_install () { # Install systemd unit files install -d ${D}${systemd_unitdir}/system install -m 0644 ${WORKDIR}/crank-demo.service ${D}${systemd_unitdir}/system/ + sed -i -e "s@##WESTON_SERVICE##@${WESTON_SERVICE}@g" \ + "${D}${systemd_unitdir}/system/crank-demo.service" fi # Install wrapper bootscript to launch Crank demo on boot @@ -72,6 +82,8 @@ do_install () { sed -i -e "s@##CRANK_DEMO_PATH##@${CRANK_DEMO_PATH}@g" \ -e "s@##CRANK_DEMO_OPTIONS##@${CRANK_DEMO_OPTIONS}@g" \ -e "s@##CRANK_DEMO_ENV##@${CRANK_DEMO_ENV}@g" \ + -e "s@##CRANK_DEMO_USER##@${CRANK_DEMO_USER}@g" \ + -e "s@##CRANK_DEMO_DISPLAY##@${CRANK_DEMO_DISPLAY}@g" \ "${D}${sysconfdir}/crank-demo" ln -sf ${sysconfdir}/crank-demo ${D}${sysconfdir}/init.d/crank-demo } diff --git a/meta-digi-dey/recipes-crank/crank-sbengine/crank-sbengine/sb-launcher b/meta-digi-dey/recipes-crank/crank-sbengine/crank-sbengine/sb-launcher index e4ed475e9..c1bcd3455 100644 --- a/meta-digi-dey/recipes-crank/crank-sbengine/crank-sbengine/sb-launcher +++ b/meta-digi-dey/recipes-crank/crank-sbengine/crank-sbengine/sb-launcher @@ -2,4 +2,7 @@ ENGINE="/usr/share/crank/sbengine" -exec env LD_LIBRARY_PATH="${ENGINE}/lib" SB_PLUGINS="${ENGINE}/plugins" ${ENGINE}/bin/sbengine "$@" +USER=$1 +shift + +exec su -l "${USER}" -c "env LD_LIBRARY_PATH=${ENGINE}/lib SB_PLUGINS=${ENGINE}/plugins ${ENGINE}/bin/sbengine $*" diff --git a/meta-digi-dey/recipes-crank/crank-sbengine/crank-sbengine_7.1.bb b/meta-digi-dey/recipes-crank/crank-sbengine/crank-sbengine_7.1.bb index 7a39ab385..b6395e064 100644 --- a/meta-digi-dey/recipes-crank/crank-sbengine/crank-sbengine_7.1.bb +++ b/meta-digi-dey/recipes-crank/crank-sbengine/crank-sbengine_7.1.bb @@ -42,6 +42,7 @@ do_install () { # Copy the engine install -d -m 0755 ${D}${datadir}/crank/sbengine cp -drf ${S}/${SBENGINE_NAME}/* ${D}${datadir}/crank/sbengine + chmod a+rx ${D}${datadir}/crank/sbengine/* } FILES:${PN} = " \