BeagleBone загружается в приложение Qt с сенсорным экраном

Как и многие другие люди, я хочу, чтобы приложение Qt запускалось непосредственно при загрузке BeagleBone Black. Используя ответы из других тем, например: Beaglebone Boot to Qt App ; Запуск приложения QT при загрузке на встроенном Устройство Linux (Beaglebone Black)

У меня есть BeagleBone Black revC с Angstrom 2012-09-12.

Мне удалось запустить приложение при загрузке со следующей настройкой службы:

"autoShow.service"
[Unit]
Description=Autorun Qt app
ConditionFileIsExecutable=/home/root/ShowcaseNice

[Service]
Type=simple
TimeoutStartSec=120
WorkingDirectory=/home/root
ExecStart=/bin/sh -c 'source /etc/profile ; /home/root/ShowcaseNice -qws'
Restart=always

[Install]
WantedBy=multi-user.target

Но мое приложение использует сенсорный интерфейс через сенсорный экран (4DCAPE-43T) и оно вообще не работает. Кажется, что библиотека tslib не загружается, когда systemd запускает мое приложение. Я сделал такой вывод, потому что когда я добавляю эту строку в сервис [Unit]:

ConditionPathExists=/dev/input/touchscreen0

Затем служба не загружает приложение и показывает сообщение об ошибке, потому что путь не существует.

Кроме того, если я заменю тип с простого на бездействующий, то приложение будет загружаться только тогда, когда BeagleBone находится в режиме ожидания и, следовательно, большую часть времени в конце каждого процесса загрузки иногда работает.

Поэтому я попытался найти способ обеспечить выполнение моего приложения после завершения загрузки tslib, но я не смог найти, что загружает tslib (не службу?). Итак, как я могу убедиться, что файл «/dev/input/touchscreen0» уже существует перед запуском?

Спасибо!

PS: поскольку файл моего профиля упоминается в моем сервисе из-за определений переменных среды, вот он:

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

PATH="/usr/local/bin:/usr/bin:/bin"
EDITOR="/bin/vi"            # needed for packages like cron
test -z "$TERM" && TERM="vt100" # Basic terminal capab. For screen etc.

if [ ! -e /etc/localtime ]; then
    TZ="UTC"        # Time Zone. Look at http://theory.uwinnipeg.ca/gnu/glibc/libc_303.html 
            # for an explanation of how to set this to your local timezone.
    export TZ
fi
if [ "$HOME" = "/home/root" ]; then
    PATH=$PATH:/usr/local/sbin:/usr/sbin:/sbin
fi
if [ "$PS1" ]; then
    # works for bash and ash (no other shells known to be in use here)
    PS1='\u@\h:\w\$ '
fi
if [ -d /etc/profile.d ]; then
    for i in /etc/profile.d/* ; do
      . $i
    done
    unset i
fi

PATH=$PATH:/opt/qt/lib
QWS_MOUSE_PROTO="LinuxInput:/dev/input/touchscreen0 MouseMan:/dev/input/mouse2"
SLOTS=/sys/devices/bone_capemgr.8/slots
PINS=/sys/kernel/debug/pinctrl/44e10800.pinmux/pins
export PATH PS1 OPIEDIR QPEDIR QTDIR EDITOR TERM QWS_MOUSE_PROTO SLOTS PINS
echo DM-GPIO-Test > $SLOTS
umask 022

EDIT1: служебный файл изменен на:

"autoShow.service"
[Unit]
Description=Autorun Qt app
ConditionFileIsExecutable=/home/root/ShowcaseNice
After=systemd-modules-load.service

[Service]
Type=oneshot
WorkingDirectory=/home/root
ExecStart=/bin/sh -c 'source /etc/profile ; /home/root/ShowcaseNice -qws'
Restart=always
RemainAfterExit=1;

[Install]
WantedBy=multi-user.target

И я получаю следующий вывод после проверки состояния во время работы приложения (без работы сенсорных возможностей):

root@beaglebone:~# systemctl status systemd-modules-load.service
systemd-modules-load.service - Load Kernel Modules
      Loaded: loaded (/lib/systemd/system/systemd-modules-load.service; static)
      Active: active (exited) since Sat 2000-01-01 01:16:39 CET; 29s ago
        Docs: man:systemd-modules-load.service(8)
              man:modules-load.d(5)
     Process: 89 ExecStart=/lib/systemd/systemd-modules-load (code=exited, status=0/SUCCESS)
      CGroup: name=systemd:/system/systemd-modules-load.service
Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.

root@beaglebone:~# systemctl status autoShow.service
autoShow.service - Autorun Qt app
      Loaded: loaded (/lib/systemd/system/autoShow.service; enabled)
      Active: activating (start) since Sat 2000-01-01 01:16:39 CET; 32s ago
    Main PID: 140 (sh)
      CGroup: name=systemd:/system/autoShow.service
          |-140 /bin/sh -c source /etc/profile ; /home/root/ShowcaseNice -qws
          `-195 /home/root/ShowcaseNice -qws
Jan 01 01:16:39 beaglebone systemd[1]: Starting Autorun Qt app...
Jan 01 01:16:45 beaglebone sh[140]: Cannot open mouse input device '/dev/input/touchscreen0': No such file or directory

root@beaglebone:~# systemctl status rc-local.service
rc-local.service
      Loaded: error (Reason: No such file or directory)
      Active: inactive (dead)

РЕДАКТИРОВАТЬ 2: После нескольких тестов, объединяющих предложение, я нашел промежуточное решение, которое, похоже, работает большую часть времени. Но иногда сенсорные возможности все еще не работают. Поскольку у меня возникают другие проблемы с systemd (см. этот пост), Я положил это сбоку.

Вот мой почти рабочий служебный файл:

"autoShow.service"
[Unit]
Description=Autorun Qt app
ConditionFileIsExecutable=/home/root/ShowcaseNice

[Service]
[email protected] or getty.target
Requires=systemd-modules-load.service
WorkingDirectory=/home/root
ExecStart=/bin/sh -c 'source /etc/profile ; /home/root/ShowcaseNice -qws'
Restart=always
sysVStartPriority=99
Type=idle

[Install]
WantedBy=multi-user.target

person Puck    schedule 18.09.2014    source источник
comment
Вы пробовали [email protected] или getty.target   -  person Mahendra Gunawardena    schedule 19.09.2014
comment
Да, я уже пробовал это раньше и пробовал снова (даже с трюком с низким приоритетом, данным Эриком), но он не работает.   -  person Puck    schedule 24.09.2014


Ответы (1)


На самом деле ничто не загружает tslib. Это пользовательская наземная библиотека. Если устройство не существует, когда systemd пытается запустить вашу программу, это, скорее всего, связано с тем, что модуль ядра для оборудования еще не загружен.

After=systemd-modules-load.service

Добавление этого в вашу службу должно заставить systemd запускать вашу программу после загрузки всех статически определенных модулей ядра.

Если это еще не поздно, подумайте о том, чтобы просто запустить свою программу из /etc/rc.local или установить «After=rc-local.service» (execs /etc/rc.local). /etc/rc.local должен быть последним, что запускает systemd по умолчанию.

rc-local.service:

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.

[Unit]
Description=Local customization

[Service]
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99

rc.local должен быть исполняемым:

#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

Я даже не думал об этом, но вы можете просто добавить SysVStartPriority=[1-99] в свой сервис. Это не рекомендуемый атрибут (systemd.service рекомендует после или до), но это проще, чем выяснить, что происходит в процессе загрузки в systemd. Им действительно нужны лучшие инструменты для отображения порядка загрузки.

person Erik Nedwidek    schedule 18.09.2014
comment
Спасибо! Я попытался добавить строку After=systemd-modules-load.service, но безуспешно, так как, когда я пытался изменить тип на холостой, это иногда срабатывало, но не всегда. Я хотел попробовать с rc-local.service или с /etc/rc.local, но в ядре 3.8.13 нет ни службы, ни файла... знаете ли вы эквивалент для этой версии? (Подробности см. в РЕДАКТИРОВАТЬ1) - person Puck; 19.09.2014
comment
Смотрите мои правки. Я бы хотел, чтобы rc.local вернулся, так как именно в него я поместил все свои настройки, но вы также можете использовать его трюк SysVStartPriority, чтобы заставить вашу службу запускаться позже. - person Erik Nedwidek; 19.09.2014
comment
Я попробовал трюк SysVSStartPriority, но все равно не работает. Только Type=idle немного работает. - person Puck; 24.09.2014