(KURO-RS や PC-OP-RS1 をお使いのかたのところでは、
こんな現象発生していないのだろうか?
私のところだけ?)
試行錯誤の結果、
・「1文字受け取るまでブロックしない」ようにしておいて、
・コマンド送信後、3秒内にレスポンスがなければ再度コマンド送信
・他
とすれば、
USB ケーブルを接続した後の1回目でも
ちゃんとリモコンデータを送信してくれることがわかった。
てきとーに作ったパッチ。
yasunari@sil:/usr/local/src/kuro-rs$ diff -c rs_send.c.orig rs_send.c
*** rs_send.c.orig 2006-12-10 19:58:05.000000000 +0900
--- rs_send.c 2007-09-23 11:47:56.235174768 +0900
***************
*** 30,35 ****
--- 30,36 ----
FILE *data_fp = NULL ; /* リモコン情報ファイルポインタ */
struct termios oldTIO ; /* 現在のシリアルポートの設定 */
struct termios newTIO ; /* 新規のシリアルポートの設定 */
+ int retry_count;
/* 引数チェック */
if(argc >= 2)
***************
*** 66,72 ****
goto final;
}
- tcgetattr(fd, &oldTIO); /* 現在のシリアルポートの設定を退避させる */
bzero(&newTIO, sizeof(newTIO)); /* 新しいポートの設定の構造体をクリア */
newTIO.c_cflag= (BAUDRATE | CS8 | CLOCAL | CREAD);
--- 67,72 ----
***************
*** 76,94 ****
newTIO.c_oflag=0; /* rawモード */
newTIO.c_lflag=0; /* 非カノニカル入力 */
newTIO.c_cc[VTIME]=0; /* キャラクタ間タイマは未使用 */
! newTIO.c_cc[VMIN]=1; /* 1文字受け取るまでブロックする */
! tcflush(fd,TCIFLUSH); /* ポートのクリア */
tcsetattr(fd, TCSANOW, &newTIO); /* ポートの設定を有効にする */
/* リモコン情報送信 */
sBuf[0] = 't';
write(fd, &sBuf, 1);
! read(fd, rBuf, BUFSIZE);
if(rBuf[0] != 'Y')
{
! printf("send err \n");
! goto final;
}
/* 出力ポート番号選択 */
if(strcmp(port_name, "2") == 0)
--- 76,107 ----
newTIO.c_oflag=0; /* rawモード */
newTIO.c_lflag=0; /* 非カノニカル入力 */
newTIO.c_cc[VTIME]=0; /* キャラクタ間タイマは未使用 */
! newTIO.c_cc[VMIN]=0; /* 1文字受け取るまでブロックしない */
! tcflush(fd,TCIOFLUSH); /* ポートのクリア */
tcsetattr(fd, TCSANOW, &newTIO); /* ポートの設定を有効にする */
/* リモコン情報送信 */
+ retry1s:
+ retry_count = 0;
sBuf[0] = 't';
write(fd, &sBuf, 1);
!
! retry1r:
! if ( read(fd, rBuf, BUFSIZE) == 0 ) {
! if ( ++retry_count > 3 )
! goto retry1s;
! sleep(1);
! goto retry1r;
! }
!
if(rBuf[0] != 'Y')
{
! printf("send err %x(%c)\n",rBuf[0],rBuf[0]);
! sleep(1);
! goto retry1s;
}
+ tcflush(fd,TCIOFLUSH); /* ポートのクリア */
+
/* 出力ポート番号選択 */
if(strcmp(port_name, "2") == 0)
***************
*** 108,120 ****
sBuf[0] = '1';
}
write(fd, &sBuf, 1);
! read(fd, rBuf, BUFSIZE);
if(rBuf[0] != 'Y')
{
! printf("send err \n");
! goto final;
}
if((data_fp = fopen(data_filename, "rb")) == NULL)
{
--- 121,145 ----
sBuf[0] = '1';
}
+ retry2s:
+ retry_count = 0;
write(fd, &sBuf, 1);
! retry2r:
! if ( read(fd, rBuf, BUFSIZE) == 0 ) {
! if ( ++retry_count > 3 )
! goto retry2s;
! sleep(1);
! goto retry2r;
! }
!
if(rBuf[0] != 'Y')
{
! printf("send err %x(%c)\n",rBuf[0],rBuf[0]);
! sleep(1);
! goto retry2s;
}
+ tcflush(fd,TCIOFLUSH); /* ポートのクリア */
+
if((data_fp = fopen(data_filename, "rb")) == NULL)
{
***************
*** 122,140 ****
goto final;
}
fread(sBuf, sizeof(unsigned char), REC_DATA_SIZE, data_fp);
write(fd,&sBuf, REC_DATA_SIZE);
! read(fd, rBuf, BUFSIZE);
if(rBuf[0] != 'E')
{
! printf("send err \n");
! goto final;
}
printf("Send File : [%s] \n",data_filename);
/* 終了処理 */
final:
- tcsetattr(fd, TCSANOW, &oldTIO);
if(fd != 0)
{
close(fd);
--- 147,173 ----
goto final;
}
fread(sBuf, sizeof(unsigned char), REC_DATA_SIZE, data_fp);
+ retry3s:
+ retry_count = 0;
write(fd,&sBuf, REC_DATA_SIZE);
! retry3r:
! if ( read(fd, rBuf, BUFSIZE) == 0 ) {
! if ( ++retry_count > 3 )
! goto retry3s;
! sleep(1);
! goto retry3r;
! }
if(rBuf[0] != 'E')
{
! printf("send err %x(%c)\n",rBuf[0],rBuf[0]);
! sleep(1);
! goto retry3s;
}
printf("Send File : [%s] \n",data_filename);
/* 終了処理 */
final:
if(fd != 0)
{
close(fd);
yasunari@sil:/usr/local/src/kuro-rs$
yasunari@sil:/usr/local/src/kuro-rs$ mv /usr/local/bin/rs_send /usr/local/bin/rs_send.old yasunari@sil:/usr/local/src/kuro-rs$ cp send /usr/local/bin/rs_send yasunari@sil:/usr/local/src/kuro-rs$
yasunari@sil:/usr/local/src/kuro-rs$ /usr/local/bin/infrared_remocon BUTTON_POWER BUTTON_3 /usr/local/lib/kuro-rs/DST-BX500/BUTTON_POWER - 1 - /dev/ttyUSB0 Send File : [/usr/local/lib/kuro-rs/DST-BX500/BUTTON_POWER] /usr/local/lib/kuro-rs/DST-BX500/BUTTON_3 - 1 - /dev/ttyUSB0 Send File : [/usr/local/lib/kuro-rs/DST-BX500/BUTTON_3] yasunari@sil:/usr/local/src/kuro-rs$OK。
yasunari@sil:/usr/local/src/kuro-rs$ /usr/local/bin/infrared_remocon BUTTON_POWER /usr/local/lib/kuro-rs/DST-BX500/BUTTON_POWER - 1 - /dev/ttyUSB0 Send File : [/usr/local/lib/kuro-rs/DST-BX500/BUTTON_POWER] yasunari@sil:/usr/local/src/kuro-rs$OK。
yasunari@sil:/usr/local/src/kuro-rs$ /usr/local/bin/infrared_remocon BUTTON_POWER BUTTON_5 /usr/local/lib/kuro-rs/DST-BX500/BUTTON_POWER - 1 - /dev/ttyUSB0 Send File : [/usr/local/lib/kuro-rs/DST-BX500/BUTTON_POWER] /usr/local/lib/kuro-rs/DST-BX500/BUTTON_5 - 1 - /dev/ttyUSB0 Send File : [/usr/local/lib/kuro-rs/DST-BX500/BUTTON_5] yasunari@sil:/usr/local/src/kuro-rs$OK。
これで安心してハック de 録!! に取り込めるかな。
|
|
|
← KURO-RS リモコンスクリプトの修正 |
ハックの記録 LinkStation/玄箱 をハックしよう |
→ ハック de 録 !!の修正(1)BS デジタルの番組表取得 |