@@ -35,20 +35,60 @@ class MF_I2C {
3535 return requestFrom (address, len, true );
3636 }
3737
38- // non "Arduino standard" extension
39- uint32_t transceive (uint8_t address, uint8_t * wbuf, uint32_t wlen, uint8_t * rbuf, uint32_t rlen) {
40- beginTransmission (address);
41- write (wbuf, wlen);
42- endTransmission (false );
43- requestFrom (address, rlen);
44- return read (rbuf, rlen);
45- }
46-
4738 // virtual void begin(uint8_t address) = 0;
4839 // virtual void onReceive(void(*)(int)) = 0;
4940 // virtual void onRequest(void(*)(void)) = 0;
5041};
5142
43+
44+ class MF_I2CDevice {
45+ public:
46+ MF_I2C *i2c;
47+ uint8_t adr;
48+
49+ MF_I2CDevice (MF_I2C *i2c, uint8_t adr) {
50+ this ->i2c = i2c;
51+ this ->adr = adr;
52+ }
53+
54+ uint32_t write (uint8_t reg, uint8_t *data, uint32_t len) {
55+ i2c->beginTransmission (adr);
56+ uint32_t rv = i2c->write (®, 1 );
57+ if (len > 0 ) {
58+ rv += i2c->write (data, len);
59+ }
60+ return rv;
61+ }
62+
63+ uint32_t write (uint8_t reg, uint8_t data) {
64+ return write (reg, &data, 1 );
65+ }
66+
67+ uint32_t read (uint8_t reg, uint8_t *data, uint32_t len) {
68+ uint32_t rv = 0 ;
69+ i2c->beginTransmission (adr);
70+ i2c->write (®, 1 );
71+ if (len > 0 ) {
72+ i2c->endTransmission (false );
73+ i2c->requestFrom (adr, len);
74+ rv = i2c->read (data, len);
75+ }
76+ return rv;
77+ }
78+
79+ uint32_t transceive (uint8_t * wbuf, uint32_t wlen, uint8_t * rbuf, uint32_t rlen) {
80+ uint32_t rv = 0 ;
81+ i2c->beginTransmission (adr);
82+ if (wlen > 0 ) rv = i2c->write (wbuf, wlen);
83+ if (wlen > 0 && rlen > 0 ) i2c->endTransmission (false );
84+ if (rlen > 0 ) {
85+ i2c->requestFrom (adr, rlen);
86+ rv = i2c->read (rbuf, rlen);
87+ }
88+ return rv;
89+ }
90+ };
91+
5292// Wrapper around an arduino TwoWire-like pointer T
5393template <class T >
5494class MF_I2CPtrWrapper : public MF_I2C {
0 commit comments