libpafeで行き先表示板
linuxで、Felica(Edy)の読み込みのできるライブラリ libpafe が単純で、使いやすそうだったので、ちょいと遊んでみた。 1秒間隔でポーリングさせ、Edyが認識できる度に"(在室)"と"(不在)"が切り替わるようにしてみた。Edy認識のプログラムを20行ほどと、判断+表示切替のShell Script を20行ほど、書いてみた。
下の電光掲示板は、随分前にサーバで制御できるようにしてあったので、 かなり簡単にできてます。
// felica.cxx // // EdyのIDを1秒間隔でポーリング。 // 見つけたらIDを表示して停止 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> extern "C" { #include <libpafe/libpafe.h> #include <libpafe/pasori_command.h> #include <libpafe/felica_command.h> } // 停止判定 volatile int flag_abort = 0 ; // ^C による停止の処理 void func_sigterm( int x ) { flag_abort = 1 ; } int main() { pasori* p ; // PaSoRiを初期化 if ( (p = pasori_open()) != NULL ) { felica* f ; sighandler_t old ; pasori_init( p ) ; // pasori_set_timeout( p , 0 ) ; // timeout forever // イベントハンドラの切り替え old = signal( SIGTERM , func_sigterm ) ; while( !flag_abort ) { // Felicaがあるかチェックする(Edyのみ) if ( (f = felica_polling( p , FELICA_POLLING_EDY , 0 , 1 )) != NULL ) { uint8 idm[ 16 ] ; // IDmを取得する felica_get_idm( f , idm ) ; printf( "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n" , idm[ 0 ] , idm[ 1 ] , idm[ 2 ] , idm[ 3 ] , idm[ 4 ] , idm[ 5 ] , idm[ 6 ] , idm[ 7 ] ) ; // felica_free()があるはずなんだけど... free( f ) ; // 強制終了 flag_abort = 1 ; break ; } // 1秒間隔 usleep( 1000000 ) ; } // イベントハンドラを戻す signal( SIGTERM , old ) ; // PaSoRiを閉じる pasori_close( p ) ; } return 0 ; }
これを処理する Shell Script。
#!/bin/bash MY_EDY_ID="11:22:33:44:55:66:77:88" EDY_ID="/usr/local/bin/edy_id" EABADGE="/usr/local/bin/eabadge.pl" STATE="HERE" while [ "$STATE" != "" ]; do case $STATE in HERE ) $EABADGE -f "(在室)" ;; OUT ) $EABADGE -f "(不在)" ;; esac GET_ID=`$EDY_ID` while [ "$GET_ID" != "$MY_EDY_ID" ]; do GET_ID=`$EDY_ID` done case $STATE in HERE ) STATE="OUT" ;; OUT ) STATE="HERE" ;; esac done