22
33bool MODULE_2RELAY::begin (TwoWire *wire, uint8_t sda, uint8_t scl,
44 uint8_t addr) {
5+ if (wire == nullptr ) {
6+ return false ;
7+ }
8+
59 _wire = wire;
10+ #if defined(MODULE_2RELAY_HAS_M5_I2C)
11+ _m5_i2c = nullptr ;
12+ #endif
613 _addr = addr;
714 _sda = sda;
815 _scl = scl;
9- _wire->begin ((int )_sda, (int )_scl);
16+ if (!_wire->begin ((int )_sda, (int )_scl)) {
17+ return false ;
18+ }
1019 delay (10 );
1120 _wire->beginTransmission (_addr);
12- uint8_t error = _wire->endTransmission ();
13- if (error == 0 ) {
14- return true ;
15- } else {
21+ return _wire->endTransmission () == 0 ;
22+ }
23+
24+ #if defined(MODULE_2RELAY_HAS_M5_I2C)
25+ bool MODULE_2RELAY::begin (m5::I2C_Class* i2c, uint8_t addr,
26+ uint32_t speed) {
27+ if (i2c == nullptr || !i2c->isEnabled ()) {
1628 return false ;
1729 }
30+
31+ _m5_i2c = i2c;
32+ _wire = nullptr ;
33+ _addr = addr;
34+ _speed = speed;
35+ return _m5_i2c->scanID (_addr, _speed);
1836}
37+ #endif
1938
20- bool MODULE_2RELAY::writeBytes (uint8_t addr, uint8_t reg, uint8_t *buffer,
39+ bool MODULE_2RELAY::writeBytes (uint8_t addr, uint8_t reg,
40+ const uint8_t *buffer,
2141 uint8_t length) {
42+ if (buffer == nullptr || length == 0 ) {
43+ return false ;
44+ }
45+
46+ #if defined(MODULE_2RELAY_HAS_M5_I2C)
47+ if (_m5_i2c != nullptr ) {
48+ bool success = _m5_i2c->start (addr, false , _speed);
49+ if (success) {
50+ success = _m5_i2c->write (reg);
51+ }
52+ if (success) {
53+ success = _m5_i2c->write (buffer, length);
54+ }
55+ const bool stopped = _m5_i2c->stop ();
56+ return success && stopped;
57+ }
58+ #endif
59+ if (_wire == nullptr ) {
60+ return false ;
61+ }
62+
2263 _wire->beginTransmission (addr);
23- _wire->write (reg);
24- _wire->write (buffer, length);
25- if (_wire->endTransmission () == 0 ) return true ;
26- return false ;
64+ if (_wire->write (reg) != 1 || _wire->write (buffer, length) != length) {
65+ _wire->endTransmission ();
66+ return false ;
67+ }
68+ return _wire->endTransmission () == 0 ;
2769}
2870
2971bool MODULE_2RELAY::readBytes (uint8_t addr, uint8_t reg, uint8_t *buffer,
3072 uint8_t length) {
31- uint8_t index = 0 ;
73+ if (buffer == nullptr || length == 0 ) {
74+ return false ;
75+ }
76+
77+ #if defined(MODULE_2RELAY_HAS_M5_I2C)
78+ if (_m5_i2c != nullptr ) {
79+ bool success = _m5_i2c->start (addr, false , _speed);
80+ if (success) {
81+ success = _m5_i2c->write (reg);
82+ }
83+ const bool writeStopped = _m5_i2c->stop ();
84+ if (!success || !writeStopped) {
85+ return false ;
86+ }
87+
88+ success = _m5_i2c->start (addr, true , _speed);
89+ if (success) {
90+ success = _m5_i2c->read (buffer, length, true );
91+ }
92+ const bool readStopped = _m5_i2c->stop ();
93+ return success && readStopped;
94+ }
95+ #endif
96+ if (_wire == nullptr ) {
97+ return false ;
98+ }
99+
32100 _wire->beginTransmission (addr);
33- _wire->write (reg);
34- _wire->endTransmission ();
35- if (_wire->requestFrom (addr, length)) {
36- for (uint8_t i = 0 ; i < length; i++) {
37- buffer[index++] = _wire->read ();
101+ if (_wire->write (reg) != 1 || _wire->endTransmission () != 0 ) {
102+ return false ;
103+ }
104+
105+ const size_t received = _wire->requestFrom (addr, (size_t )length);
106+ if (received != length) {
107+ while (_wire->available ()) {
108+ _wire->read ();
38109 }
39- return true ;
110+ return false ;
40111 }
41- return false ;
112+
113+ for (uint8_t i = 0 ; i < length; i++) {
114+ if (!_wire->available ()) {
115+ return false ;
116+ }
117+ const int value = _wire->read ();
118+ if (value < 0 ) {
119+ return false ;
120+ }
121+ buffer[i] = (uint8_t )value;
122+ }
123+ return true ;
42124}
43125
44126bool MODULE_2RELAY::getRelayState (uint8_t index) {
127+ if (index >= 2 ) {
128+ return false ;
129+ }
130+
45131 uint8_t data = 0 ;
46132 if (readBytes (_addr, MODULE_2RELAY_REG + index, &data, 1 )) {
47133 return data ? true : false ;
@@ -50,35 +136,31 @@ bool MODULE_2RELAY::getRelayState(uint8_t index) {
50136}
51137
52138bool MODULE_2RELAY::setRelay (uint8_t index, bool state) {
53- uint8_t data = state ? 0xff : 0x00 ;
54- if (writeBytes (_addr, MODULE_2RELAY_REG + index, &data, 1 )) {
55- return data ? true : false ;
139+ if (index >= 2 ) {
140+ return false ;
56141 }
57- return false ;
142+
143+ uint8_t data = state ? 0xff : 0x00 ;
144+ return writeBytes (_addr, MODULE_2RELAY_REG + index, &data, 1 );
58145}
59146
60147bool MODULE_2RELAY::setAllRelay (bool state) {
61148 uint8_t data[2 ] = {0 };
62149 if (state) {
63150 memset (data, 0xff , 2 );
64151 }
65- if (writeBytes (_addr, MODULE_2RELAY_REG , data, 2 )) {
66- return true ;
67- }
68- return false ;
152+ return writeBytes (_addr, MODULE_2RELAY_REG , data, 2 );
69153}
70154
71155bool MODULE_2RELAY::reverseRelay () {
72156 uint8_t data[2 ] = {0 };
73- if (readBytes (_addr, MODULE_2RELAY_REG , data, 2 )) {
74- for (uint8_t i = 0 ; i < 2 ; i++) {
75- data[i] = ~data[i];
76- }
77- if (writeBytes (_addr, MODULE_2RELAY_REG , data, 2 )) {
78- return true ;
157+ for (uint8_t i = 0 ; i < 2 ; i++) {
158+ if (!readBytes (_addr, MODULE_2RELAY_REG + i, &data[i], 1 )) {
159+ return false ;
79160 }
161+ data[i] = ~data[i];
80162 }
81- return false ;
163+ return writeBytes (_addr, MODULE_2RELAY_REG , data, 2 ) ;
82164}
83165
84166uint8_t MODULE_2RELAY::getVersion () {
0 commit comments