iMON VFD の Fedora 8 での設定
ふらふらと、iMON VFD というものを買ってしまいました:
http://www.mustardseed.co.jp/product/product_imon.html
赤外線リモコンと USB 接続の VFD (蛍光表示管) がセットになったものです。
Fedora 8 で使ってみたので、その備忘録です。
赤外線リモコンのドライバは、LIRC を使用した。
LIRC には、VFD のドライバも含まれている。
インストールしたもの:
lirc-devel-0.8.2-2.fc8
pulseaudio-module-lirc-0.9.7-0.17.svn20071017.fc8
lirc-doc-0.8.2-2.fc8
rhythmbox-lirc-0.11.3-5.fc8
totem-lirc-2.20.1-1.fc8
lirc-0.8.2-2.fc8
赤外線リモコン用のデーモンの設定ファイルは、
/usr/share/doc/lirc-doc-0.8.2/remotes/imon/lircd.conf.imon-pad
を
/etc/lircd.conf
へコピーした。
なお、FastForward ボタンのコードが 0x2B8115B7 となっているが、
0x2B8155B7 ぽいので、書き換えた(これは、LIRC付属の mode2 という
プログラムでわかる)。
サービスとして、lircd を起動した。
VFD への文字表示は、/dev/lcd0 を通して行われるが、/dev/lcd0 の
パーミッションが 0660 (owner=root, group=root) で、一般ユーザ
から書き込めないので、次のファイルを
/etc/udev/rules.d/51-udev-my.rules
に置いた(マシンを起動する度に、/dev/lcd0 が作り直されるので、
"chmod 666 /dev/lcd0" では、起動後に 0600 に戻ってしまうため):
---------------------------------------------------------
KERNEL=="lcd0", MODE="0666"
---------------------------------------------------------
リモコンのボタンと、アプリケーションとの対応は、
~/.lircrc
というファイルに書く。今回は、totem でテレビを見て、rhythmbox で
MP3 ファイルを聞くように設定した(リスト1 参照)。
リスト1 中、channel というプログラムが登場するが、これはリスト2
に示すチャンネル切り替え用の自作のどうってことない perl プログラム。
この ~/.lircrc の問題点:
2桁のチャンネルを見ようとすると、例えば、"12" を見ようとすると、
"1", "2" とボタンを押すことになるのだが、その時、"1" と "2" の
チャンネルがチラリと映ってしまう。どうやって回避したらよいのか
さっぱりわからない。
アプリケーションの起動や終了などは、irexec というプログラムから
行われる。これは、gnome のセッションとして登録した。
参考文献:
- "[smdn] Linux/Fedora Core/iMON VFD"
<http://smdn.invisiblefulmoon.net/index.php?cmd=read&page=Linux%2FFedora%20Core%2FiMON%20VFD>
LinuxからiMON VFD の VFD を操作する方法が載っている。
- "How to configure and use LIRC"
<http://www.g-loaded.eu/2006/01/10/how-to-configure-and-use-lirc/>
~/.lircrc の書き方を step by step で説明している。
- /usr/share/doc/lirc-doc-0.8.2/doc/html/index.html
LIRC のドキュメント。
- totem/src/totem-remote.c, rhythmbox/plugins/lirc/rb-lirc-plugin.c
LIRC plugin のキーワード(config に指定する文字列)が定義されている。
--- リスト1: ~/.lircrc -----------------------------------
begin irexec
begin
prog = irexec
remote = iMON-PAD
button = MyTV
config = totem /dev/video0 &
mode = totem
end
begin
prog = irexec
remote = iMON-PAD
button = MyMusic
config = rhythmbox &
mode = rhythmbox
end
begin
remote = iMON-PAD
button = AppExit
mode = irexec
end
end irexec
begin totem
begin
remote = iMON-PAD
button = MyTV
mode = totem
end
begin
prog = irexec
remote = iMON-PAD
button = MyMusic
config = rhythmbox &
mode = rhythmbox
end
begin
prog = totem
remote = iMON-PAD
button = AppExit
config = quit
mode = irexec
end
begin
prog = irexec
remote = iMON-PAD
button = 1
config = channel 1
end
begin
prog = irexec
remote = iMON-PAD
button = 2
config = channel 2
end
begin
prog = irexec
remote = iMON-PAD
button = 3
config = channel 3
end
begin
prog = irexec
remote = iMON-PAD
button = 4
config = channel 4
end
begin
prog = irexec
remote = iMON-PAD
button = 5
config = channel 5
end
begin
prog = irexec
remote = iMON-PAD
button = 6
config = channel 6
end
begin
prog = irexec
remote = iMON-PAD
button = 8
config = channel 8
end
begin
prog = irexec
remote = iMON-PAD
button = 9
config = channel 9
end
begin
prog = irexec
remote = iMON-PAD
button = 1
button = 0
config = channel 10
end
begin
prog = irexec
remote = iMON-PAD
button = 1
button = 1
config = channel 11
end
begin
prog = irexec
remote = iMON-PAD
button = 1
button = 2
config = channel 12
end
begin
prog = irexec
remote = iMON-PAD
button = 2
button = 2
config = channel 22
end
begin
prog = irexec
remote = iMON-PAD
button = Ch+
config = channel +
end
begin
prog = irexec
remote = iMON-PAD
button = Ch-
config = channel -
end
begin
prog = totem
remote = iMON-PAD
button = Vol+
config = volume_up
end
begin
prog = totem
remote = iMON-PAD
button = Vol-
config = volume_down
end
begin
prog = totem
remote = iMON-PAD
button = Mute
config = mute
end
begin
prog = totem
remote = iMON-PAD
button = FullScreen
config = fullscreen
end
end totem
begin rhythmbox
begin
prog = irexec
remote = iMON-PAD
button = MyTV
config = totem /dev/video0 &
mode = totem
end
begin
remote = iMON-PAD
button = MyMusic
mode = rhythmbox
end
begin
prog = irexec
remote = iMON-PAD
button = AppExit
config = rhythmbox --quit
mode = irexec
end
begin
prog = rhythmbox
remote = iMON-PAD
button = Play
config = play
end
begin
prog = rhythmbox
remote = iMON-PAD
button = Stop
config = stop
end
begin
prog = rhythmbox
remote = iMON-PAD
button = Pause
config = pause
end
begin
prog = rhythmbox
remote = iMON-PAD
button = NextChapter
config = next
end
begin
prog = rhythmbox
remote = iMON-PAD
button = PrevChapter
config = previous
end
begin
prog = rhythmbox
remote = iMON-PAD
button = FastForward
config = seek_forward
end
begin
prog = rhythmbox
remote = iMON-PAD
button = Rewind
config = seek_backward
end
begin
prog = rhythmbox
remote = iMON-PAD
button = Vol+
config = volume_up
end
begin
prog = rhythmbox
remote = iMON-PAD
button = Vol-
config = volume_down
end
begin
prog = rhythmbox
remote = iMON-PAD
button = Mute
config = mute
end
end rhythmbox
---------------------------------------------------------
--- リスト2: channel -------------------------------------
#!/usr/bin/perl
@chlist = (
{channel => 1, name => "NHK"},
{channel => 2, name => "Tokyo MX"},
{channel => 3, name => "NHK Education"},
{channel => 4, name => "NTV"},
{channel => 5, name => "tvk"},
{channel => 6, name => "TBS"},
{channel => 8, name => "Fuji TV"},
{channel => 9, name => "iTSCOM Channel"},
{channel => 10, name => "TV Asahi"},
{channel => 11, name => "Shop Channel"},
{channel => 12, name => "TV Tokyo"},
{channel => 22, name => "Open University of Japan"}
);
$lcd = "/dev/lcd0";
$prevchannel = "$ENV{'HOME'}/.prevchannel";
sub dochannel {
local($idx) = @_;
my $ch = $chlist[$idx]{channel};
if ($ch == 22) {
system("ivtv-tune --freqtable=japan-cable --channel=$ch");
} else {
system("ivtv-tune --freqtable=japan-bcast --channel=$ch");
}
if (open(VFD, "+< $lcd")) {
print VFD "CH: $ch: $chlist[$idx]{name}";
close VFD;
}
}
$idx = 0;
if ($#ARGV >= 0) {
$ch =$ARGV[0];
if ($ch eq '+') {
if (open(FP, $prevchannel)) {
$idx = <FP>; close FP;
if (++$idx > $#chlist) { $idx = 0; }
}
} elsif ($ch eq '-') {
if (open(FP, $prevchannel)) {
$idx = <FP>; close FP;
if (--$idx < 0) { $idx = $#chlist; }
}
} else {
for ($i = 0; $i <= $#chlist; $i++) {
if ($chlist[$i]{channel} == $ch) { $idx = $i; last; }
}
}
}
dochannel($idx);
if (open(FP, "> $prevchannel")) { print(FP $idx); close FP; }
---------------------------------------------------------
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735