●QV-10の通信プロトコル             1996.4.16 ken-ichi HAYASHI

以下に書かれている情報は林が独自に調査したものです。
この情報に関してCASIOさんに問い合わせ等を行なうことは
「絶対に」しないでください。

以下に書かれている情報は大嘘かも知れません。
この情報にしたがったせいでQV-10やその中の画像が破壊されたり、
精神的、物質的損害を被ったとしても林は一切責任をとりません。

以下に書かれている情報は予告なく修正されます。

QV-10とホストコンピュータとは専用の接続ケーブルで
接続しますが、これをRS-232Cコネクタ側(ホストコンピュータ側)
から眺めた場合、以下のようなプロトコルで通信しているようです。

9600baud 8 bit stop bit 1 Non parity
フロー制御 一切なし

RTSがOFFでないとQV10からのデータは流れて来ません
CTSは常にONになってるみたいですが、関係ないでしょう
(RTSについてはqvplayのREADMEも参照してください。)

DTRも常にONのようです。

QV-10をパワーオンした直後の通信速度は9600baudですが、
後述の"CB"コマンドにより通信速度を変更します。
変更された通信速度はパワーオンしなおされるか、
"CB"コマンドで再変更されるまで有効です。

基本的にQV-10を操作するためにQV-10へ送るコマンドは
以下のようなものです。

0x05 0xXX 0xXX ... 0x06
の05で始まって数バイトのコマンドを送って0x06で閉じる
という形式、最後の0x06でコマンド待機モードへ復帰。
＃実際は最初の0x05は必要ないと思います。

●コマンド一覧
  QVへ送るデータ
  ---------------------------------------
  QVの応答データ

  ２桁の数値は１６進表記、'QR'のように'でくくってあるのは
 その文字のアスキー値を送るという意味です。'QR'なら0x51 0x52
 の２バイトを送っているということです。

・リセット
  05  'QR' 06
  ------------     QV10をリセット状態にします。
    06   5c        このコマンドはいかなる状態でもうけつける
                   ようです
                   QV10からの返事5cの意味はよくわかりません。

・リセットその２
  05  'QE' 06
  ------------     QV10をリセット状態にしますが、
    06   69        QV10の画面をクリアしません。
                   QV10からの返事69の意味はよくわかりません。

・何枚の画像をもっているか？
  05  'MP' 06
  --------------   QV10に何枚の画像が記録されているかを問い合わせ
    06   62  XX    ます。
                   XXに枚数が返ります。
                   QV10からの返事62の意味はよくわかりません。

・QV10のLCDの画面を切替える
  05  'DA' XX  06
  ---------------- QV10のLCDに表示する画面をXX番目の画像に
    06       YY    切替えます。
                   QV10からの返事YYは(7a - XX)になるみたいです。

・メイン画像をJPEG形式でを取り出す
  05  'DA' XX  06 05  'MG'  06 12            06          
  ---------------------------------------------------------
    06       YY     06    ZZ     [画像データ]  [画像データ]

  06            06                  06
  ----------------------------......----------------
    [画像データ]  [画像データ]        02 00 00 03 FC
                                      エンドマーク？

  XXは画像番号を指定します。
  QV10からの返事YYは(0x7a - XX)のようです。
  QV10からの返事ZZはよくわかりません。

  画像データの詳細
  02 WW WW JJ JJ JJ JJ JJ ........ 17 SS
        
  WW WW: データサイズ(２バイト)、通常00 80(128バイト)、
      エンドマーク直前の最後のデータはそのサイズ(00 80以下)
  JJ: データサイズ分の画像データ(cam形式のJPEGもどき部分)
      詳しくは岩間さんの解析資料を参照してください。
  SS: チェックサム
      2バイト目(先頭の02の直後)からSSの直前(17)までの総和
      の１の補数

・JPEG形式の画像をQV-10へ書きこむ
  05  'MH'   06   [画像データ]  [画像データ]
  ---------------------------------------------------------
    06    YY    12            06            06
                  
    [画像データ]  [画像データ]        02 00 00 03 FC
  ----------------------------......----------------
  06            06                  06

  05  'DJ'   06 
  --------------
    06    ZZ    

  QV10からの返事YYはよくわかりません。
  QV10からの返事ZZはよくわかりません。

  画像データの詳細は前出のJPEG形式の画像取り出しで
  説明しているものと同じです。

・thumbnail画像をYCC形式で取り出す
  05  'DH' XX  06 05  'MK'  06 12            06          
  ---------------------------------------------------------
    06       YY     06    ZZ     [画像データ]  [画像データ]

  06            06                  06
  ----------------------------......----------------
    [画像データ]  [画像データ]        02 00 00 03 FC
                                      エンドマーク？

  XXは画像番号を指定します。
  QV10からの返事YYは(0x73 - XX)のようです。
  QV10からの返事ZZはよくわかりません。

  画像データの詳細
  02 WW WW TT TT TT TT TT ........ 17 SS
        
  WW WW:  データサイズ(２バイト)、通常00 80(128バイト)、
      エンドマーク直前の最後のデータはそのサイズ(00 80以下)
  TT: データサイズ分の画像データ(cam形式のthumbnail部分)
  SS: チェックサム
      2バイト目(先頭の02の直後)からSSの直前(17)までの総和
      の１の補数

  ＊cam形式のthumbnail部分は５２×３６×３＝５６１６バイト
    ありますが、これで得られるデータはその半分の２８０８
    バイトしかありません。
  ＊２８０８バイトのうち
    先頭から１８７２バイトは５２×３６ドット分の輝度(Y)情報(0〜255)、
        次の４６８バイトが２６×１８ドット分のCb情報(-128〜127)
    その次の４６８バイトが２６×１８ドット分のCr情報(-128〜127)
    です。
    Yはunsigned char、Cb、Crは符合つきcharで表現されているようです。
    RGBへの変換はppm.cを参照してください。YとCCの深みは適当に
    つけています。そのため、cam形式から抽出されるデータと完全に
    は一致しません。

・メイン画像をYCC形式でを取り出す
  05  'DA' XX  06 05  'ML'  06 12            06          
  ---------------------------------------------------------
    06       YY     06    ZZ     [画像データ]  [画像データ]

  06            06                  06
  ----------------------------......----------------
    [画像データ]  [画像データ]        02 00 00 03 FC
                                      エンドマーク？

  XXは画像番号を指定します。
  QV10からの返事YYは(0x7a - XX)のようです。
  QV10からの返事ZZはよくわかりません。

  画像データの詳細
  02 WW WW JJ JJ JJ JJ JJ ........ 17 SS
        
  WW WW: データサイズ(２バイト)、通常00 80(128バイト)、
      エンドマーク直前の最後のデータはそのサイズ(00 80以下)
  JJ: データサイズ分の画像データ(cam形式のJPEGもどき部分)
      詳しくは岩間さんの解析資料を参照してください。
  SS: チェックサム
      2バイト目(先頭の02の直後)からSSの直前(17)までの総和
      の１の補数

  ＊データ形式はthumbnail画像のYCC形式とほとんど同じですが、
    総データサイズ153600バイトのうち、
    先頭から153600バイトは480×240ドット分の輝度(Y)情報(0〜255)、
        次の19200バイトが160×120ドット分のCb情報(-128〜127)
    その次の19200バイトが160×120ドット分のCr情報(-128〜127)
    です。
    Yはunsigned char、Cb、Crは符合つきcharで表現されているようです。
    RGBへの変換はppm.cを参照してください。YとCCの深みは適当に
    つけています。そのため、jpeg形式で表現されるデータとは完全に
    は一致しません。

・YCC形式のメイン画像をQV-10へ書きこむ
  05  'MM'   06   [画像データ]  [画像データ]
  ---------------------------------------------------------
    06    XX    12            06            06
                  
    [画像データ]  [画像データ]        02 00 00 03 FC
  ----------------------------......----------------
  06            06                  06

  05  'DN'   06   05  'DJ'   06 
  -----------------------------
    06    YY        06    ZZ    

  QV10からの返事XXはよくわかりません。
  QV10からの返事YYはよくわかりません。
  QV10からの返事ZZはよくわかりません。

  [画像データ]のデータ形式はYCC形式のメイン画像書き込みで
  説明しているものとおなじです。


・QV-10に記録されている画像を削除する
  05  'DF' XX  ff  06 
  -------------------   XXは画像番号を指定します。
    06           YY     QV10からの返事YYは(0x76 - XX)のようです。

・撮影する
  05  'DR' 06 
  -------------         撮影します。
    06       YY         QV10からの返事YYはよくわかりません。

・QV-10の通信速度を変える
  05  'CB' XX  06
  ----------------      QV10の通信速度を変更します。
    06       YY         XXはQV10内部のSerialControlerに与える
                        パラメータのようです。
                        XXの値と通信速度の関係は以下のとおりです。
                           XX :   baud
                           46 :   9600
                           22 :  19200
                           11 :  38400
                            7 :  57600
                            3 : 115200
                        (115200以上は試していません。(^^;)
                        QV10からの返事YYはよくわかりません。

・QV-10に記録されている画像の順番を入れ換える
  (この機能はメモリの書き換えを伴い、かつテストが不十分です。
   最悪、FATAL ERRORになるかもしれません。)

  05  'DI' XX  06  05  'DY' 02 XX  06  05  'DF' XX ff  06  05  'Dj' VV  06
  ------------------------------------------------------------------------
    06       YY      06          ZZ      06          WW      06       UU

                                  XX：移動する元の画像の画像番号
                                  YY：(0x72 - XX) だと思います
                                  ZZ：よくわかりません。
                                  WW：(0x76 - XX) だと思います
                                  VV：移動する先の画像の画像番号
                                  UU：(0x51 - XX) だと思います
   (↑冗長な部分があるような気がします。)

   結果としてはXX番目の画像を削除した後に、頭から数えて
   VV番目に画像を挿入したような動作になります。

   例：XX = 5 VV =2
       移動前 1 2 3 4 5 6 ...
       移動後 1 5 2 3 4 6 ...

・その他細かい部分はcommand.c/command1.c/command2.cを
  参照してください。(をいをい) (^^)

●捕捉

コマンドに先だって行なわれる05送って06返事は１回だけでなく、
何回行なってもいいようです。単純に「生きとるか？」「はいな」
だと思います。

itojunさんからの指摘ですが、
16進  ASCIIコード 意味
  02  STX        転送はじめまっせ
  03  ETX        転送終わりますだ
  05  ENQ        元気？ 
  06  ACK        おっけぃ または うけとりました
  12  DC2        ？？？？？
  17  ETB        ブロックおしまい

だから、それなりに意味あるんじゃ？ とのことです。
確かにいわれてみればそれっぽいですね。
また、画像データの読みだしはxmodemのプロトコルに似ているようだ、
とのご指摘もありました。さらにそれにもとづき、qvplayの画像データ
読みだし部分のエラーリカバリ部分を実装してくださいました。
(ありがとうございます＞itojunさん)

チェックサムの算出方法、通信速度変更についてはBrahmaさんより
非常に有益な情報をいただきました。チェックサムはデータだけ
じゃなくてデータサイズと0x17も足し込むというのが盲点でした。
通信速度については115200baud以上は手持ちのI/Oカードが
対応してないので実験できませんでした。BrahmaさんのQVCOMの
ドキュメントにはover 57600はエラーが多くてだめだ、とあり
ましたが、100LXよりは体力に余裕のある？デスクトップマシン
だと115200でも大丈夫でした。

●その他
Windows版のパソコンリンクソフトの動作見ていると
何度か05を送って06を受け取るという動作が妙に多い。
無駄とも思える謎のコマンドも送出されてる。
Windows版のパソコンリンクソフトは、基本は9600baud
でコマンドを送っており、画像データの読み込みの時だけ
19200baudや38400baudに変更している。

●未解明の謎コマンド
'DI' 'DY' 'RB' 'MH' 'DK' 'DM'
