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

以下に書かれている情報は林が独自に調査したものと、Brahmaさん、
Gotoさん、marioさんらが発見した情報をまとめたものです。
この情報に関して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
 の２バイトを送っているということです。
 また、QV10から戻ってくるデータのうち、チェックサムと
 思われる1バイトのデータがあります。このチェックサムの
 値は送ったコマンドとパラメータのバイト列を加算して１の
 補数をとったものになります。

・リセット
  05  'QR' 06
  ------------     QV10をリセット状態にします。
    06   5c        このコマンドはいかなる状態でもうけつける
                   ようです
                   QV10からの返事5cはチェックサムです。
                   ~('Q(51)' +  'R(52)') = 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  'DL'  06  05  'MG'  06 12            06          
  -----------------------------------------------------------------------
    06       YY     06    6f      06    6b     [画像データ]  [画像データ]

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

  XXは画像番号を指定します。
  QV10からの返事6fはチェックサムです。
  QV10からの返事YY(チェックサム)は(0x7a - XX)になります。
  QV10からの返事6bはチェックサムです。
  QV100のFine画像を取り出す場合は、'MG'の代わりに'Mg'を使います。

  画像データの詳細
  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    6a    12            06            06

    [画像データ]  [画像データ]        02 00 00 03 FC
  ----------------------------......----------------
  06            06                  06

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

  QV10からの返事6aはチェックサムです。
  QV10からの返事ZZ(06?)はよくわかりません。

  画像データの詳細は前出のJPEG形式の画像取り出しで
  説明しているものと同じです。
  ここで説明しているのはNormal画像の場合です。
  QV100のFine画像の書き込み方法は不明です。

・thumbnail画像をYCC形式で取り出す
  05  'DA' XX  06 05  'DL'  06  05  'MK'  06 12            06          
  ---------------------------------------------------------------------
    06       YY     06    6f      06    67     [画像データ]  [画像データ]

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

  XXは画像番号を指定します。
  QV10からの返事YY(チェックサム)は(0x7a - XX)になります。
  QV10からの返事6fはチェックサムです。
  QV10からの返事67はチェックサムです。

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

  ＊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  'DL'  06  05  'ML'  06 12            06          
  ---------------------------------------------------------------------
    06       YY     06    6f      06    66     [画像データ]  [画像データ]

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

  XXは画像番号を指定します。
  QV10からの返事YY(チェックサム)は(0x7a - XX)になります。
  QV10からの返事6fはチェックサムです。
  QV10からの返事66はチェックサムです。
  QV100のFine画像を取り出す場合は、'ML'の代わりに'Ml'を使います。  

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

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

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

  05  'DN'   06   05  'DJ'   06 
  -----------------------------
    06    6d        06    ZZ    

  QV10からの返事65はチェックサムです。
  QV10からの返事6dはチェックサムです。
  QV10からの返事ZZ(71?)はよくわかりません。

  [画像データ]のデータ形式はYCC形式のメイン画像の読み込みで
  説明しているものとおなじです。
  ここで説明しているのはNormal画像の場合です。
  QV100のFine画像の書き込み方法は不明です。

・QV-10に記録されている画像を削除する
  05  'DF' XX  ff  06 
  -------------------   XXは画像番号を指定します。
    06           YY     QV10からの返事YY(チェックサム)は(0x76 - XX)
                        になります。

・撮影する
  05  'DR'  06 
  -----------------     撮影します。
    06    69   ZZ       QV10からの返事69はチェックサムです。
                        QV10からの返事ZZはファンクションSWがPLAYの
                        ときは15、RECのときは06になります。

・QV-10の通信速度を変える
  05  'CB' XX  06
  ----------------      QV10の通信速度を変更します。
    06       YY         XXはQV10内部のSerialControlerに与える
                        パラメータのようです。
                        XXの値と通信速度の関係は以下のとおりです。
                                XX  :   baud
                           46(0x2e) :   9600
                           22(0x16) :  19200

                           11(0x0b) :  38400
                            7(0x07) :  57600
                            3(0x03) : 115200
                        (115200以上は試していません。(^^;)
                        QV10からの返事YYはチェックサムです。


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

  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 ...

・QV-10の電源をOFFする
  05  'QX'  06
  ----------------      QV10の電源をOFFします。
    06    56            QV10からの返事56はチェックサムです。

・QV-10の電源状態をレポートする
  05  'RB'  05  FF  FE  E6  06
  -------------------------------  QV10の電源状態を問い合わせます。
    06                    83  XX   XXに状態が返ります。
                                   QV10からの返事83はチェックサムです。
             XXを16(0x10)で割った値がだいたい電圧になります。
             新品のアルカリ電池(6.0V)では0x51という値になりました。
             値が3b以下になるとリンクソフトでは警告を出してQV-10の
             電源をOFFするようです。

・QV-10のLCDにカラーパターンを表示する。
  05  'DP'  06
  ----------------      QV10のLCDにカラーパターンを表示します。
    06    XX            QV10からの返事XXはチェックサムです。

・QV-10のスイッチ、CCDカメラ部分の状態をレポートする
  05  'DS' 02  06
  -------------------  QV10のスイッチ、CCDカメラ部分の状態を
    06       XX   YY ZZ   レポートします。

  QV10からの返事XXはチェックサムです。
  返事の１バイト目YYは絞り警告(画面に出てくる●や○マーク)
  と関連しているような気がしますが、詳細は不明です。
  返事の２バイト目ZZはREC/PLAYスイッチとCCDカメラ部分の状態
  を示します。それぞれの状態とZZの値の対応は以下のとおりです。
  REC/PLAY SW   CCDカメラ  ZZの値
  REC           通常位置   0x00
  REC           反転位置   0x80
  PLAY          通常位置   0x40
  PLAY          反転位置   0xc0

・画像にプロテクトをかける／はずす
  05  'DY'  XX  YY   06
  ---------------------   QV10の画像番号YYの画像にプロテクトを
    06            ZZ      かけたりはずしたりします。

  XXが0x01のときプロテクトをかける、00のときプロテクトをはずすす
  動作になります。
  ZZはチェックサムです。

・画像がプロテクトされているか、NormalかFineかをレポートする
  05  'DY' 02 XX  06
  ---------------------   QV10の画像番号XXの画像にプロテクトが
    06          YY  ZZ  かかっているかどうか、Normal画像か、Fine画像か
                          を問い合わせます。

  YYはチェックサムです。
  QV10からの返事ZZの値と画像の状態の対応は以下のとおりです。
  プロテクト  解像度 ZZの値
  off         Normal 0x00
  on          Normal 0x01
  off         Fine   0x02
  on          Fine   0x03

・画像データの転送ブロックサイズを変更する
  05  'PP' XX YY  06
  ---------------------   画像データとりだし、書き込みの際の転送ブロック
    06          ZZ       サイズ(デフォルト0x00 0x80の 128バイト)を変更します。

  XXは転送ブロックサイズの上位バイト、YYは下位バイトです。
  例えば、XX = 0x06、YY = 0x00 を指定した場合、転送ブロックサイズは
  0x0600 = 1536バイトになります。
  ZZはチェックサムです。

・電源ON／リセット時に表示される画像の指定
  05  'DV' XX   06
  ---------------------  電源ON、リセット時に表示される画像を指定します。
    06        YY         XXに画像番号を指定します。
                         YYはチェックサムです。

・本体バージョン？のレポート
  05  'SU'  06
  ------------------------  QV10の本体バージョン？と思われる値を
    06    XX   YY ZZ WW VV  レポートします。

  QV10からの返事XXはチェックサムです。
  返事の１バイト目YYはQV100/300の場合、0x01、QV10の場合0x00に
  なるようです。
  林が調査した範囲では、本体とこの４バイトの関係は以下のとおりです。
  機種     YYZZWWVV
  QV10   0x00531719
  QV10   0x00538b8f
  QV100  0x0103ba90
  QV300  0x01048dc0
   
・その他細かい部分は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''DK' 'DQ'

Eb Fineのこり枚数(100のみ)?
EB Normalのこり枚数(100のみ)?

MQ 画像バイト数？
Mq 画像バイト数？

DL データ転送する画像を表示されているものに指定？

DM 画像番号を表示しない

