Wire (ヘルパークラス版)
Wire (ヘルパークラス版)
ヘルパークラス版はより抽象度が高い実装です。読み書きに対応するオブジェクト reader, writer
を生成することがバスの利用開始となり、オブジェクトを破棄するとバス利用の終了手続きを行います。
if文の判定式内でオブジェクトの生成を行うことで、オブジェクトの有効期間はif節内のスコープに限定され、if節を抜けた時点でオブジェクトは破棄され、その時点でバスの利用終了の手続きを行います。
また読み書きオブジェクトはmwx::stream
インタフェースを実装しているため<<
演算子などを利用することができます。
バスの利用開始と終了をオブジェクトの有効期間と一致させることで、ソースコードの見通しを良くし、また終了手続きの記述漏れなどを防ぐ
mwx::stream
インタフェースによる読み書き手続きの統一
読み込み
読み込み処理とその終了手続きをスコープ内 if() { ... }
で行うためのヘルパークラスを用いた読み込み方法です。
上記では get_readr()
メソッドにより生成された rdr
オブジェクトを用いて1バイトずつ読み出しします。 メソッドのパラメータには読み込みたい二線シリアル ID を指定します。
if(...)
内でrdr
オブジェクトを生成。(型は、型推論によるユニバーサル参照auto&&
で解決しています。)生成した
rdr
オブジェクトにはoperator bool ()
が定義されており、判定式の評価として利用される。指定された ID により通信が可能であればtrue
となる。rdr
オブジェクトにはint operator () (void)
演算子が定義されていて、これを呼び出すことで2線シリアルバスから1バイトのデータを読み出す。読み込みに失敗したときは-1
が戻り、成功した場合は読み込んだバイト値が戻る。if() { ... }
スコープの末尾でrdr
のデストラクタが呼び出され、二線シリアルバスのSTOP
を行う。
get_reader(addr, read_count=0)
I2C 読み出しに用いるワーカーオブジェクトを取得します。
パラメータ | 解説 |
---|---|
| 読み込み用のI2Cアドレス |
| 読み出しバイト数(この値を指定すると最後の転送で STOP ビットを発行する)。0を指定した場合は STOP ビットなしとなる(デバイスによっては動作するものもあります) |
書き出し (writer)
書き出し処理とその終了手続きをスコープ内 if() { ... }
で行うためのヘルパークラスを用いた読み込み方法です。
上記では get_writer()
メソッドにより生成された wrt
オブジェクトを用いて1バイトずつ書き出す。 メソッドのパラメータには読み出したい二線シリアル ID を指定します。
if(...)
内でwrt
オブジェクトを生成する。(型名は長くなるため auto で解決)生成した
wrt
オブジェクトにはoperator bool ()
が定義されており、判定式の評価として利用される。指定された ID により通信が可能であればtrue
となる。wrt
オブジェクトにはint operator () (void)
演算子が定義されていて、これを呼び出すことで2線シリアルバスに1バイトのデータを書き出しす。失敗したときは-1
が戻り、成功した場合は書き込んだバイト値が戻る。if() { ... }
スコープの末尾でwrt
のデストラクタが呼び出され、二線シリアルバスのSTOP
を行う。
get_writer()
I2C書き出しに用いるワーカーオブジェクトを取得します。
パラメータ | 解説 |
---|---|
| 書き出し用のI2Cアドレス |
ワーカーオブジェクト (writer)
<<演算子
int
型,uint8_t
型は8bitの転送を行います。データ並び順はビッグエンディアン形式(上位バイトが先に転送される)です。
()演算子
1バイト書き出す。
ワーカーオブジェクト (reader)
>>演算子
それぞれのデータ型のサイズ分だけ読み出します。データ並び順はビッグエンディアン形式(先に転送されたほうが上位バイトに格納される)です。
()演算子
1バイト読み出します。エラーがある場合は-1を戻し、正常時は読み出したバイト値を戻します。
b_stop
をtrue
にすると、その読み出しにおいてSTOPビットを発行します。
例
以下の例は、環境センサーパルの温湿度センサーSHTC3の計測例です。
最終更新