KURO-RS rs_send の修正

HS-DHGL KURO-RS

KURO-RS を HS-DHGL に接続した直後は、 send を3回実行しないとリモコンデータを送ってくれない。

(KURO-RS や PC-OP-RS1 をお使いのかたのところでは、 こんな現象発生していないのだろうか?
私のところだけ?)

rs_send.c の修正

これでは使い物にならないので、rs_send.c を修正することに。

試行錯誤の結果、
・「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$

/usr/local/bin/rs_send の更新

/usr/local/bin/rs_send を置き換える。
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$

動作確認

電源を入れて3chにする。
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。
USB ケーブルを抜き差しし、電源を入れて5chにする。
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 録!! に取り込めるかな。




HS-DH320GL
楽天市場
Yahoo!ショッピング
somap.com
TSUKUMO ネットショップ
ValuMore!
ムラウチドットコム
アット・ニフティストア icon
Joshin web icon
KURO-RS
楽天市場
Amazon
Yahoo!ショッピング
TSUKUMO
クレバリー


KURO-RS リモコンスクリプトの修正
ハックの記録
LinkStation/玄箱 をハックしよう

ハック de 録 !!の修正(1)BS デジタルの番組表取得

Copyright (C) 2003-2007 Yasunari Yamashita. All Rights Reserved.
yasunari @ yamasita.jp 山下康成@京都府向日市