試験的にTAPIによる[ダイアル]ボタンを実装した。 米MicrosoftのホームページにあったTAPIクラスのサンプルを そのまま使ったけど大丈夫なのかな? 問題あるなら取りやめるけど。。。。
生年月日のデータから現在の満年齢を表示するようにした。 最初はCTimeクラスを使って生年月日を管理しようとしたが、 1970年以前の場合にアサートが出まくる。 調べてみたら仕様上そういうものらしい。 ヘルプには1900年以降の日付が扱えるって書いてあったのにな。
右クリックでポップアップメニューが出るようにした。 良く調べてみると、コンポーネントギャラリーにポップアップメニュー サポートのコンポーネント(?)があるではないかぁ! 先に調べておけば楽できたのに。
ファイル読み込み時のエラーチェックを強化する。 今までは、例えコンパイルしたオブジェクトファイルでも読み込んだふりをしていたので、 「駄目なものは駄目」とはっきりと表示するようにした。
手書きメモを一覧表示する時の表示方法を変更した。 これまでは、通信用にエンコードした文字列をだらだらと表示していたが、 バイト数だけを表示するようにした。 これで表示がちょっと速くなったかな。
受信中の「受信バイト数」を表示するようにした。 受信時には全体のサイズが分からないので、パーセント表示はできないっす。
ステータスバーにデータの型とレコード数を表示するようにした。 MFC3.0のときと仕様が変わってるようで、ちょっと戸惑ってしまった。
その他は細かい不具合の修正。 受信後に再度受信すると、先に受信したデータが消えるとか、 そういうしょーもないバグをかなりたくさん直した(^^;
そろそろβ公開でもしようかな。。。
今まで手を抜いてた部分を手直し。 新規手書きメモの処理とか、 結構いいかげんに作ってたのでエラー処理を強化しといた。 今まで作った部分の安定性は少しは良くなったかな。
オートダイアラを作ろうとして、TAPIの資料を探し出す。 見つかったけど、NT3.51では動作確認が出来ないなぁ。 確認するためだけにWin95を立ち上げるのも嫌だし。 この部分はNT4.0が出てからにしようかな。
送信部分をスレッド化。これで送信中に他の仕事ができるようになった。 と言っても、送信自体それほど時間はかからないけど。 後は受信中に「受信済バイト数」でも表示させようかな。
レコードのコピー&ペースト機能も追加。 まだ1レコード単位でしか出来ないけど、無いよりまし(^^;
レコードの編集機能を付ける。 と言っても今のところは追加と削除、編集だけ。 ついでに右クリックにも対応させてみたが、WM_CONTEXTMENUは「右ダブルクリック」 にしか反応しないのかな? 一応「右クリック」と説明には書いてあるんだけど。 まぁいいですけど。
手書きメモのエンコード部分を作った。 ちゃんと圧縮形式2に対応したので、転送するデータも小さくなった。
最初ラインをまたいだ圧縮をしていたけど、ザウルスに転送すると、 終了後にリセットがかかる。 パソコン側ではちゃんと表示できるから、 仕方なく1ライン単位で圧縮するように変更。 圧縮率は落ちたけど、無事転送できた。
手書きメモを表示するだけではしょうがないので、クリップボード対応に してみる。 内部ではDIB形式で作成していたので、そのまま(CF_DIB)でコピーしてみるが、 ちょっと変。 ペイントブラシでは正しくペースト出来るが、 NTのクリップブックには何も表示されない。 おまけにPaintshop Proでもペースト出来ない。
「DIBのフォーマットでも間違えたか」と思って、 色々とBITMAPINFO構造体をいじって試しても変化無し。 VC++4.0のサンプルにあったDIBLOOK.EXEに試しにペーストしてみると、 「でかすぎる」との事。 ソースを見てどこがそういう文句を言ってるか調べてみると、 ビットマップの高さが引っ掛かってるようだ。
ザウルスのフォーマットの関係でトップダウンDIBとして作っていたのだが、 アプリケーションによってはボトムアップDIBしかサポートしないようだ。 (トップダウンDIBでは高さの値が負になるため、 ボトムアップにしか対応しないアプリでは「でかすぎる」と言われる) 仕方ないので、クリップボードへはボトムアップDIBでコピーする事に。 あー、面倒くさい。
ペイントブラシは律義にトップダウンにも対応してくれてたわけか。 ちょっと見直した。
開発を再開する。 bitmapの表示そのものはうまくいっているようなので、展開方法を疑ってみる。 「ZAURUS Super Tools」の資料には、大体次のように書いてあった。
- 0x00~0x7fの場合は、そのバイト数のビットデータが後に続く。
- 0x80~0xfeの場合は、この値を0x101から引いた回数だけ、 後続の1バイトのデータを続ける。
最初は素直にこの通り組んでたけど、何かおかしい。
大体、サンプルのデータをこの通りに手で展開していくと、
未定義のはずの0xffなんかが至るところに出てくる。
仕方ないから0xffはそのままベタで出力するように変更するが、
相変わらずグチャグチャな画像。
しかも今度は0x00が出てくる。資料の定義によれば
「後続の0バイトのビットデータを使う」ということになるが、
後続の0バイトのビットデータって結局なに?
「後続0バイト」=「後続なし」と勝手に解釈して、0x00のコードを無視する。
が、これも失敗。
もう、やけになって0x00の時は後続1バイト、0x01の時は後続2バイト、、、
のようにちょっとヘソ曲がりな展開方法を試してみると、うまく展開できた。
結局、資料の誤植?それとも私の日本語読解力が足りない?
手書きメモの処理部分を作成した。 資料を元に圧縮されたデータを展開するが展開後のサイズが198x128にならず、 30%も大きくなってしまう。 展開の方法がおかしいのか、それとも何か勘違いしているのだろうか。。。
データの編集部分を作成した。 電話帳と名刺管理の編集ダイアログは出来たが、 その他のデータについては面倒なので今は作らない。
今まで内部データを全てCStringで持っていたが、 入力時に面倒なので専用のCFieldクラスを用意し、 そこから各種に派生させることにした。 これまでのコードをだいぶいじったが、何とか移行完了。 これで管理も楽になった。
勢いで新規入力部分も作ってしまう。 とりあえずは電話帳と名刺管理の入力は出来るようになった。 後はこれまでのデータの編集部分を作らねば。
残りの課題は以下の通り。
入力画面は面倒なので、先に環境設定ダイアログを作ってしまう。 見た目がいいようにCPropertySheetとCPropertyPageを使って作ることにする。 一応うまく出来たが、 デバッグアウトプットウィンドウに何やら例外発生のメッセージが。。。 どうもCOMCTL32.DLLの中で発生しているようだ。 画面に障害が出たり、落ちたりといったことはないので実害は無いのだが、 とにかく気持ち悪い。 どこも悪そうなところはないのだが、何が原因なのかなぁ。。。
しばらく開発が停止してたけど、ようやく復活。 内部処理用のクラスと通信フォーマットの相互変換部分が完成した。 まだ手書きメモには対応していないが、 それほど重要度は高くないので後回し。
入力ダイアログはやっぱりザウルス専用にしようかな。 汎用度を上げるとウィズにもそのまま対応できるけど、入力しにくい。 逆に機種に依存させると、入力し易いけどウィズにはそのままでは対応できない。 機種依存部分だけDLL化して、そこだけ差し替えればいいようにしようかな。
うまくいかなかったCListViewによる表示問題が解決。 どうやらレポートビューでは最初にInsertItemして、 それからSetItemTextすると良いらしい。 MFCの解説書でも買わなあかんかな。。。
一応見た目はそれっぽくなってきた。 あとは新規入力とかの部分を作らねば。
今まで通信フォーマットのままディスクに記録していたので、 内部処理用のクラスを作って、そちらで管理するようにした。
内容をCListViewで表示しようと思ったが、なんかうまく表示できない。
PCからザウルスへの転送に成功。山を越したら結構簡単。
学校帰りの地下鉄の中でひらめく。 「あのENQはCE-IR2がエコーバックしたものかも」 そう考えると色々と辻褄が合う。 ENQ後のSYNが通っていないと思っていたのも、本当はSYNは出力されていて、 PC側がデータパケットと思っていたものが実はSYNのエコーだったのかもしれない。 送信時に受け取っていたENQは、PC側が送っていたENQのエコーだったのだろう。 うん、間違いない。
帰宅後、こちらが送ったパケットのエコーを無視するように変更する。 実験すると、エラーの場所がブロック番号の所に変わっている。 よし。ちょっと進んだ。
結局このエラーは最終ブロック番号が0xffffになるのを忘れていたためで、 すぐに修正完了。転送結果のログファイルを見ると、CSVらしき物が出来ていたので、 一応は成功したようだ。転送実験の第一段階は終了した。
昨夜寝る際に「CTS/RTS制御をオフにしていなかった」ことを思い出す。 CE-IR2は一切フロー制御をしていないので、 もしかすると送信時にフロー制御がかかりっぱなしになっていて、 出て行かなかったのではないか。。。と推測する。 DCB構造体をそのように設定し、SetCommState()をやり直す。結果は×。 昨日と同じで、ザウルスからは延々とENQパケットが到着する。 こちらがSYNを送ってもちっとも進まない。困った。。。
気分転換にPC→ザウルスの転送部分を作ってみる。 パケットの送信がうまく行っているかどうかは、ここで分かるだろう。 コーディング終了後、試験。デバッグログを見てみると、 ザウルスからENQが送られてきている。「こらー!お前が送るんはSYNやろーが!」 なぜか来るはずもないENQが送られている。 うー、わけ判らん。
試験的にザウルス→PCの転送部分を作ることにする。 開発環境はMicrosoft Visual C++ 4.0。 オーバラップトI/Oは使わずに、「動けばいいや」のプログラミング。 夕方には基本となるクラスなどが出来上がり、転送実験を開始する。 が、予想通り(?)失敗する。 プロトコルアナライザなどはもちろん持っていないので、 要所要所にOutputDebugString()を挿入し、地道なデバッグ作業開始。
数時間後、原因が「ENQパケット受信後のSYN応答が通っていない」 ということが判明する。 しかし久しぶりのC++プログラミングで疲れたので、 デバッグは明日に持ち越すことにする。
京都四条のジュンク堂で「ZAURUS Super Tools」(ソフトバンク、2900円)購入。 付属CD-ROMに光通信の詳細があると聞いたので。
nunome2anike.eonet.ne.jp