Linuxでリモコンを使う(2)

前回の続きです。

PC-OP-RS1と通信ができるようになったので、プログラムを書いてLinuxからコマンドで機器を操作できるようにします。

技術的には基本的にシリアルプログラミングができれば書けるのですが、PC-OP-RS1のコマンド体系がわからないことにはどうしようもありません。
調べたのはちょっと昔の話なので記憶が定かではありませんが、確かこちらを参考にさせていただいたと思います。

ちなみに上記記事にはperlのサンプルがありますが、私はCが好きなのでここではCで書きます。

コマンドは、16進だとただの数値ですが、ASCIIに直すとなんとなく意味が見えてきます。コマンドの意図とマクロ名があっているかどうかわかりませんが、こんなかんじでdefineしておきます。

#define PCOPRS1_CMD_DATA_COMPLETION     'E'
#define PCOPRS1_CMD_LED_OK              'O'
#define PCOPRS1_CMD_RECEIVE_DATA        'S'
#define PCOPRS1_CMD_OK                  'Y'
#define PCOPRS1_CMD_RECEIVE_CANCEL      'c'
#define PCOPRS1_CMD_LED                 'i'
#define PCOPRS1_CMD_RECEIVE             'r'
#define PCOPRS1_CMD_TRANSMIT            't'
#define PCOPRS1_CMD_CHANNEL(ch)         ('0' + (ch))

シリアルデバイスをオープンして設定するところは大雑把に書くとこんなかんじで

int fd;
struct termios newtio; 

fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY);

newtio.c_cflag = B115200 | CS8 | CLOCAL | CREAD;
newtio.c_iflag = 0;
newtio.c_oflag = 0;
newtio.c_lflag = 0;
newtio.c_cc[VMIN] = 1;
newtio.c_cc[VTIME] = 0;

tcflush(fd, TCIFLUSH);
tcsetattr(fd, TCSANOW, &newtio);

リモコンデータの送受信のシーケンスは上記仙石さんの記事の通りなので省略。
あとは受信データをセーブ/ロードする仕組みを合わせて実装すれば、最低限のリモコン機能は完成です。

とりあえずCのソースコードgithubに置いてありますので適当に。
コンパイルすると lemon_corn というコマンドができますが、例えば
lemon_corn -r tv_pwr
でテレビリモコンの電源ボタン信号を学習すると、
lemon_corn tv_pwr
でテレビの電源が操作できるようになります。