mrubyのデバイスアクセスメソッドの標準化ができたようです。
i2cを見てみます。
2023/10/9現在の私の作ったものの仕様です。
mruby on FreeBSD(ZRouter.org)
struct RClass *bsdiic;
bsdiic = mrb_define_class(mrb, "BsdIic", mrb->object_class);
mrb_define_method(mrb, bsdiic, "initialize", mrb_bsdiic_init, MRB_ARGS_REQ(1));
mrb_define_method(mrb, bsdiic, "read", mrb_bsdiic_read, MRB_ARGS_REQ(2));
mrb_define_method(mrb, bsdiic, "write", mrb_bsdiic_write, MRB_ARGS_REQ(3));
mrb_define_method(mrb, bsdiic, "writes", mrb_bsdiic_writes, MRB_ARGS_REQ(2));
mruby on YABM
mrb_define_method(mrb, yabm, "i2cinit", mrb_yabm_i2cinit, MRB_ARGS_REQ(3));
mrb_define_method(mrb, yabm, "i2cchk", mrb_yabm_i2cchk, MRB_ARGS_REQ(1));
mrb_define_method(mrb, yabm, "i2cread", mrb_yabm_i2cread, MRB_ARGS_REQ(2));
mrb_define_method(mrb, yabm, "i2cwrite", mrb_yabm_i2cwrite, MRB_ARGS_REQ(3));
mrb_define_method(mrb, yabm, "i2cwrites", mrb_yabm_i2cwrites, MRB_ARGS_REQ(3));
mrb_define_method(mrb, yabm, "i2creads", mrb_yabm_i2creads, MRB_ARGS_REQ(2));
これらはYABMクラスに他のデバイスメソッドといっしょに入っています。
完全に合わせることは出来ませんが、ちょっと寄せる方法を考えてみます。
I2Cモジュールのような低速のデバイスをFreeBSDで処理するのはCPUの無駄になるので、センサーからデータを拾うような処理はYABMの方が向いています。
おうちの気温などはbcmbm-mruby(YABM)で拾って、FreeBSDなモジュールにHTTPで渡しています。
I2Cはいろいろな仕様がありますが、センサーなど多くは1バイトのアドレスと1バイトのデータの読み書きする仕様です。
一回の処理で行われるのか以下のケースがあります
- 書き込みのみ
- 読み込みのみ
- 書き込みした後に読み込み(逆は無い)
BsdIicのwritesの機能をwriteに入れてwritesを消しました。(2023/10/10)
BsdIicのreadの仕様を変更しました。read,writeでエラーを返すようにしました。(2023/10/22)
BsdIicのreadのもともとあったバイトオペレーションを戻しました。(2023/10/24)
BsdIicのreadの返り値を読み込みサイズが1の時はintが返り、それ以外の場合はArrayが返るようにしました。(2023/10/28)
YABMの仕様をBsdIicに合わせました。(2023/11/20)