Adventurer3-ファーム1.3.1でのWi-Fi接続で問題となっていた部分について、Adventurer3コントローラーも対応した。
対応方法
Adventurer3のファームが旧バージョン、新バージョンのどちらでも転送が可能なように対応した。
変更ソースは、AControler\Adventurer3.csとPrintControler\Adventurer3Controler.csの2つ。
Adventurer3.csは、ファイルの転送処理をAdventurer3のクラスから分離しISenderというインターフェース経由で行うように変更。
ISenderは旧バージョン用(V1Sender)、新バージョン用(V2Sender)のクラスを用意し、M601コマンドの返却文字列にV2.1が入っているかどうかで、使用するクラスを切り替えるように変更した。
旧バージョンの転送処理は、もともとあったAdeventurer3クラス内の送信処理をそのまま利用すればいいのだが、新バージョンの送信処理については、以下2点問題点があった。
- 4096の固定長でパケットを作成して送信する必要があった。
- ファイル転送時の途中キャンセル処理。
Adventurer3Controler.csはファイル転送キャンセル処理に係るちょっとした修正を入れてある。
4096の固定長での送信
本来、固定長で送信する必要はないはずだと思ってはいたのだが、送信途中のキャンセル処理を実装するため、内部的には4096バイトでsend APIを呼んでいた。
この状態でネットワークプロトコルを見てみたところ、適当な長さ、たぶんTcpClientに設定されているSendBufferSize以内でsendとsendの間で少し時間が空いた単位での分割何だろうけど、で送信されていた。
ファイルサイズが小さいものは問題なかったのだが、長いものの場合、正しく送信できず、Adventurer3との接続が解除されてしまうという問題発生した。
そのため、SendBufferSizeを4096に設定して送信するような対応を行ったところ、問題なくデータが送信できた。
一応ネットワークプロトコルを見たところ、4096バイト単位で送信されていることは確認できた。
ファイル転送時の途中キャンセル処理
旧バージョンでは、1パケット毎に、Adventurer3が受け取ったかどうかの確認があり、また途中キャンセルのコマンドを送付した時点で、機器のパネルで転送が止まった旨の確認ダイアログが表示されるような形になっていた。
ちなみに旧バージョンは、ダイアログが表示されている間も機器との通信ができるので、確認ダイアログでOKを選択しなくても、Adventurer3コントローラーからの制御は可能である。
新バージョンでは、ファイルは転送しっぱなしなので、途中キャンセルした場合、Adventurer3が転送失敗のタイムアウトから抜け出すまで待つ必要があり、その間Adventurer3コントローラーからの制御は受け付けないような形になる。
このタイムアウトの時間を実測で調べたところ15秒がちょうどよかった。
コメント