2014年3月13日木曜日

BBBでQtアプリの自動起動

目的

Qtを使用してBBB上でGUIアプリを動作させる。
GUIアプリではKeyPressEventを使用してキーボードの入力値を取得している
GUIアプリはBBBの電源投入で自動起動させる

環境

BeagleBoneBlack + AngStrom(3.8) + Qt(5.1)
# uname -a
Linux beaglebone 3.8.13 #1 SMP Wed Aug 14 16:25:00 CEST 2013 armv7l GNU/Linux

Qt Window Systemを使用する為、XServerを無効化しておく。

BOOT時にXServerを無効化してCUIモードで起動する
# systemctl disable gdm.service

XServerはsystemdで管理されているので、GUIモード中にCUIモードにしたい場合
# systemctl stop gdm.service

Xserverをまた立ち上げたい場合
# systemctl enable gdm.service

オートログイン化の為に、以下のサービスを編集している。
/etc/systemd/system/getty.target.wants/serial-getty@tty1.service
#ExecStart=-/sbin/agetty --noclear %I 38400 linux
ExecStart=-/sbin/agetty -a root %I 38400 linux

試行

【1】telnetでログインしてQt-GUIアプリを起動

・ウィンドウ生成 成功
・ログファイル出力 成功
・仮想キーボード・LCD4ボタン共に反応せず


【2】BOOT1時のsystemdによる自動起動

・ウィンドウ生成 成功
・ログファイル出力 成功
・仮想キーボード・LCD4ボタン共に反応せず
・init.dによる起動も試みたが同様

【3】USBキーボードを接続してログイン、Qt-GUIアプリを手動起動

・ウィンドウ生成 成功
・ログファイル出力 成功
 仮想キーボード・LCD4ボタン共に反応せず

考察

BBBに直ログインした場合、端末名はtty1。
telnetでログインした場合、端末名はttyO0。
systemdで自動起動した場合、端末名は"?"("ps ax"コマンドで確認)
tty1からアプリを起動しないとキーボードを取得出来ないらしい。
systemdによる起動は、ログインプロンプトに先駆けて行われるので端末と結び付けられていない。
なのでログイン後にアプリを自動起動する必要があるが、.bashrcや.bash_profileはAngstromでは機能しない。

対策

ログインプロンプトはsystemdによって管理されるサービスによって実行され、コマンドはagettyが使用される。
agettyは、ログインの方法に標準の"/bin/login"の代わりに独自のプログラムをroot権限で実行する"-l"オプションが存在する。
これを利用して、アプリの起動→終了後に/bin/loginを実行するスクリプトをagettyから読み出す。

/etc/systemd/system/getty.target.wants/serial-getty@tty1.service
[Service]
ExecStart=-/sbin/agetty -l /home/root/MyApp.sh -a root %I 38400 linux

/home/root/MyApp.sh
#!/bin/bash

/home/root/MyApp -qws
/bin/login root

参考文献

man of agetty
Linux起動の仕組みを理解しよう[rcスクリプト編]
Automatic login on Angstrom Linux
Systemd入門(1) - Unitの概念を理解する
自作プログラムをデーモンとして起動させる(by init.d)
systemdの*.serviceファイルの書き方

Create Startup Script in Angstrom
Automatic login on Angstrom Linux

BeagleBone Black(Angstrom)にSSHで入れるようにする

Qt4 自前のsignalの作り方
Qt Events

.bashrc と .bash_profile 結局どっちを使えばいい?

0 件のコメント:

コメントを投稿