Wire (ヘルパークラス版)
ヘルパークラス版はより抽象度が高い実装です。読み書きに対応するオブジェクト reader, writer を生成することがバスの利用開始となり、オブジェクトを破棄するとバス利用の終了手続きを行います。
if文の判定式内でオブジェクトの生成を行うことで、オブジェクトの有効期間はif節内のスコープに限定され、if節を抜けた時点でオブジェクトは破棄され、その時点でバスの利用終了の手続きを行います。
if (auto&& wrt = Wire.get_writer(...)) { // オブジェクトの生成とデバイスの通信判定
// このスコープ(波かっこ)内が wrt の有効期間。
wrt << 0x00; // 0x00 を mwx::stream インタフェースで書き出し
}
// if 節を抜けるところで wrt は破棄され、バスの利用終了また読み書きオブジェクトはmwx::streamインタフェースを実装しているため<<演算子などを利用することができます。
バスの利用開始と終了をオブジェクトの有効期間と一致させることで、ソースコードの見通しを良くし、また終了手続きの記述漏れなどを防ぐ
mwx::streamインタフェースによる読み書き手続きの統一
読み込み
読み込み処理とその終了手続きをスコープ内 if() { ... } で行うためのヘルパークラスを用いた読み込み方法です。
const uint8_t DEV_ADDR = 0x70;
uint8_t au8data[6];
if (auto&& rdr = Wire.get_reader(DEV_ADDR, 6)) {
for (auto&& c: au8data) {
c = rdr();
}
}
// same above
uint16_t u16temp, u16humd;
uint8_t u8temp_csum, u8humd_csum;
if (auto&& rdr = Wire.get_reader(SHTC3_ADDRESS, 6)) {
rdr >> u16temp;
rdr >> u8temp_csum;
rdr >> u16humd;
rdr >> u8humd_csum;
}上記では 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 読み出しに用いるワーカーオブジェクトを取得します。
パラメータ
解説
addr
読み込み用のI2Cアドレス
read_count
読み出しバイト数(この値を指定すると最後の転送で 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書き出しに用いるワーカーオブジェクトを取得します。
パラメータ
解説
addr
書き出し用のI2Cアドレス
ワーカーオブジェクト (writer)
<<演算子
int型,uint8_t型は8bitの転送を行います。
()演算子
1バイト書き出す。
ワーカーオブジェクト (reader)
>>演算子
それぞれのデータ型のサイズ分だけ読み出します。
()演算子
1バイト読み出します。エラーがある場合は-1を戻し、正常時は読み出したバイト値を戻します。
b_stopをtrueにすると、その読み出しにおいてSTOPビットを発行します。
例
以下の例は、環境センサーパルの温湿度センサーSHTC3の計測例です。
最終更新