Skip to content

Commit a1091a8

Browse files
committed
Upgrade MODULE_2RELAY and add M5.In_I2C begin
1 parent 0c7bffe commit a1091a8

2 files changed

Lines changed: 134 additions & 39 deletions

File tree

src/MODULE_2RELAY.cpp

Lines changed: 115 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,46 +2,132 @@
22

33
bool 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

2971
bool 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

44126
bool 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

52138
bool 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

60147
bool 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

71155
bool 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

84166
uint8_t MODULE_2RELAY::getVersion() {

src/MODULE_2RELAY.h

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,37 @@
55
#include "Wire.h"
66
#include "pins_arduino.h"
77

8+
#if __has_include(<M5Unified.h>)
9+
#include <M5Unified.h>
10+
#define MODULE_2RELAY_HAS_M5_I2C 1
11+
#endif
12+
813
#define MODULE_2RELAY_ADDR 0x25
914
#define MODULE_2RELAY_REG 0x00
1015
#define MODULE_2RELAY_VERSION_REG 0xFE
1116
#define MODULE_2RELAY_ADDR_CONFIG_REG 0xFF
1217

1318
class MODULE_2RELAY {
1419
private:
15-
uint8_t _addr;
16-
TwoWire* _wire;
17-
uint8_t _scl;
18-
uint8_t _sda;
19-
uint8_t _speed;
20-
bool writeBytes(uint8_t addr, uint8_t reg, uint8_t* buffer, uint8_t length);
20+
uint8_t _addr = MODULE_2RELAY_ADDR;
21+
TwoWire* _wire = nullptr;
22+
uint8_t _scl = SCL;
23+
uint8_t _sda = SDA;
24+
#if defined(MODULE_2RELAY_HAS_M5_I2C)
25+
m5::I2C_Class* _m5_i2c = nullptr;
26+
uint32_t _speed = 100000;
27+
#endif
28+
bool writeBytes(uint8_t addr, uint8_t reg, const uint8_t* buffer,
29+
uint8_t length);
2130
bool readBytes(uint8_t addr, uint8_t reg, uint8_t* buffer, uint8_t length);
2231

2332
public:
2433
bool begin(TwoWire* wire = &Wire, uint8_t sda = SDA, uint8_t scl = SCL,
2534
uint8_t addr = MODULE_2RELAY_ADDR);
35+
#if defined(MODULE_2RELAY_HAS_M5_I2C)
36+
bool begin(m5::I2C_Class* i2c, uint8_t addr = MODULE_2RELAY_ADDR,
37+
uint32_t speed = 100000);
38+
#endif
2639
bool setRelay(uint8_t index, bool state);
2740
bool setAllRelay(bool state);
2841
bool getRelayState(uint8_t index);

0 commit comments

Comments
 (0)