ふらふらと、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; }
---------------------------------------------------------