このプロジェクトでの通信モジュールは RS-232 (USB) と Ethernet の TCP/IP を扱えるようにします。
RS-232 に USB がカッコ付きで表記されているのは RS-232 機器として認識される USB 接続のデバイスも RS-232 用のクラスで扱えることを示しています。 (USB 接続の GPS など、USB 機器によっては RS-232 と同じ実装で通信を処理できるものがあります。)
では C++ でのクラス構成を定義します。
hrk::Connection というインターフェースのクラスを定義し RS-232 実装の hrk::Serial クラスと TCP/IP 実装の hrk::Tcpip クラスがそのインターフェースを実装しています。
hrk::Connection クラスは、通信の基本的なメソッドのみを提供します。
具体的には、
などです。
データ通信を開始するときに使う open() は扱うデバイスで引数が変わる可能性があるので Connection を実装するクラスが提供することにしています。
このクラスを使って "COM1" として認識された RS-232 デバイスに対して "hello" という文字列を送信する場合のプログラムは、以下のようになります。
また Serial と Tcpip が Connection インターフェースを継承していることで Serial と Tcpip で共通になる処理を共通にできます。
以下は、"hello" という文字列を送信する処理を、Serial と Tcpip で共通にした例です。
Connection クラスを使った、より実際の運用に近い実装例として、通信の送受信データを記録しながら通信するためのクラスを考えてみます。
クラスの UML 図は、以下のようになります。このクラスには、Connection オブジェクトを登録するためのメソッドが追加されています。
また Logging_connection のメソッドは以下のように実装されるはずです。
要は、渡された Connection オブジェクトを操作しつつ得られたデータを保存する処理を行っています。
このクラスは「Serial か Tcpip のオブジェクトを Logging_connection に登録して利用する」という風に使います。
以下に、このクラスを用いて Serial の送受信データを記録するときの例を紹介します。(もちろん Tcpip の送受信データも同様に記録できます。)
このプロジェクトにおいては 動作のレコーディング & プレイバック の処理に Connection を使ったこのような実装がなされています。