(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 デジタルの番組表取得 |