Skip to content

Commit 5a3c4c0

Browse files
committed
Add support for ModulinoHub
1 parent bcf0745 commit 5a3c4c0

File tree

2 files changed

+108
-17
lines changed

2 files changed

+108
-17
lines changed

src/Modulino.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,11 @@ void __increaseI2CPriority() {
2929
}
3030
#else
3131
void __increaseI2CPriority() {}
32-
#endif
32+
#endif
33+
34+
int ModulinoHubPort::select() {
35+
return _hub->select(_port);
36+
}
37+
int ModulinoHubPort::clear() {
38+
return _hub->clear();
39+
}

src/Modulino.h

Lines changed: 100 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,53 @@ class ModulinoClass {
6161
friend class Module;
6262
protected:
6363
HardwareI2C* _wire;
64+
friend class ModulinoHub;
65+
friend class ModulinoHubPort;
6466
};
6567

6668
extern ModulinoClass Modulino;
6769

70+
// Forward declaration of ModulinoHub
71+
class ModulinoHub;
72+
73+
class ModulinoHubPort {
74+
public:
75+
ModulinoHubPort(int port, ModulinoHub* hub) : _port(port), _hub(hub) {}
76+
int select();
77+
int clear();
78+
private:
79+
int _port;
80+
ModulinoHub* _hub;
81+
};
82+
83+
class ModulinoHub {
84+
public:
85+
ModulinoHub(int address = 0x70) : _address(address){ }
86+
ModulinoHubPort* port(int _port) {
87+
return new ModulinoHubPort(_port, this);
88+
}
89+
int select(int port) {
90+
Modulino._wire->beginTransmission(_address);
91+
Modulino._wire->write(1 << port);
92+
return Modulino._wire->endTransmission();
93+
}
94+
int clear() {
95+
Modulino._wire->beginTransmission(_address);
96+
Modulino._wire->write((uint8_t)0);
97+
return Modulino._wire->endTransmission();
98+
}
99+
100+
int address() {
101+
return _address;
102+
}
103+
private:
104+
int _address;
105+
};
106+
68107
class Module : public Printable {
69108
public:
70-
Module(uint8_t address = 0xFF, const char* name = "")
71-
: address(address), name((char *)name) {}
109+
Module(uint8_t address = 0xFF, const char* name = "", ModulinoHubPort* hubPort = nullptr)
110+
: address(address), name((char *)name), hubPort(hubPort) {}
72111
virtual ~Module() {}
73112
bool begin() {
74113
if (address >= 0x7F) {
@@ -89,6 +128,9 @@ class Module : public Printable {
89128
if (address >= 0x7F) {
90129
return false;
91130
}
131+
if (hubPort != nullptr) {
132+
hubPort->select();
133+
}
92134
Modulino._wire->requestFrom(address, howmany + 1);
93135
auto start = millis();
94136
while ((Modulino._wire->available() == 0) && (millis() - start < 100)) {
@@ -104,17 +146,26 @@ class Module : public Printable {
104146
while (Modulino._wire->available()) {
105147
Modulino._wire->read();
106148
}
149+
if (hubPort != nullptr) {
150+
hubPort->clear();
151+
}
107152
return true;
108153
}
109154
bool write(uint8_t* buf, int howmany) {
110155
if (address >= 0x7F) {
111156
return false;
112157
}
158+
if (hubPort != nullptr) {
159+
hubPort->select();
160+
}
113161
Modulino._wire->beginTransmission(address);
114162
for (int i = 0; i < howmany; i++) {
115163
Modulino._wire->write(buf[i]);
116164
}
117165
Modulino._wire->endTransmission();
166+
if (hubPort != nullptr) {
167+
hubPort->clear();
168+
}
118169
return true;
119170
}
120171
bool nonDefaultAddress() {
@@ -124,8 +175,14 @@ class Module : public Printable {
124175
return p.print(name);
125176
}
126177
bool scan(uint8_t addr) {
178+
if (hubPort != nullptr) {
179+
hubPort->select();
180+
}
127181
Modulino._wire->beginTransmission(addr / 2); // multply by 2 to match address in fw main.c
128182
auto ret = Modulino._wire->endTransmission();
183+
if (hubPort != nullptr) {
184+
hubPort->clear();
185+
}
129186
if (ret == 0) {
130187
// could also ask for 1 byte and check if it's truely a modulino of that kind
131188
return true;
@@ -136,12 +193,15 @@ class Module : public Printable {
136193
uint8_t address;
137194
uint8_t pinstrap_address;
138195
char* name;
196+
ModulinoHubPort* hubPort = nullptr;
139197
};
140198

141199
class ModulinoButtons : public Module {
142200
public:
143-
ModulinoButtons(uint8_t address = 0xFF)
144-
: Module(address, "BUTTONS") {}
201+
ModulinoButtons(uint8_t address = 0xFF, ModulinoHubPort* hubPort = nullptr)
202+
: Module(address, "BUTTONS", hubPort) {}
203+
ModulinoButtons(ModulinoHubPort* hubPort, uint8_t address = 0xFF)
204+
: Module(address, "BUTTONS", hubPort) {}
145205
PinStatus isPressed(int index) {
146206
return last_status[index] ? HIGH : LOW;
147207
}
@@ -197,8 +257,10 @@ class ModulinoButtons : public Module {
197257

198258
class ModulinoJoystick : public Module {
199259
public:
200-
ModulinoJoystick(uint8_t address = 0xFF)
201-
: Module(address, "JOYSTICK") {}
260+
ModulinoJoystick(uint8_t address = 0xFF, ModulinoHubPort* hubPort = nullptr)
261+
: Module(address, "JOYSTICK", hubPort) {}
262+
ModulinoJoystick(ModulinoHubPort* hubPort, uint8_t address = 0xFF)
263+
: Module(address, "JOYSTICK", hubPort) {}
202264
bool update() {
203265
uint8_t buf[3];
204266
auto res = read((uint8_t*)buf, 3);
@@ -249,8 +311,10 @@ class ModulinoJoystick : public Module {
249311

250312
class ModulinoBuzzer : public Module {
251313
public:
252-
ModulinoBuzzer(uint8_t address = 0xFF)
253-
: Module(address, "BUZZER") {}
314+
ModulinoBuzzer(uint8_t address = 0xFF, ModulinoHubPort* hubPort = nullptr)
315+
: Module(address, "BUZZER", hubPort) {}
316+
ModulinoBuzzer(ModulinoHubPort* hubPort, uint8_t address = 0xFF)
317+
: Module(address, "BUZZER", hubPort) {}
254318
void (tone)(size_t freq, size_t len_ms) {
255319
uint8_t buf[8];
256320
memcpy(&buf[0], &freq, 4);
@@ -276,8 +340,10 @@ class ModulinoBuzzer : public Module {
276340

277341
class ModulinoVibro : public Module {
278342
public:
279-
ModulinoVibro(uint8_t address = 0xFF)
280-
: Module(address, "VIBRO") {}
343+
ModulinoVibro(uint8_t address = 0xFF, ModulinoHubPort* hubPort = nullptr)
344+
: Module(address, "VIBRO", hubPort) {}
345+
ModulinoVibro(ModulinoHubPort* hubPort, uint8_t address = 0xFF)
346+
: Module(address, "VIBRO", hubPort) {}
281347
void on(size_t len_ms, bool block, int power = MAXIMUM ) {
282348
uint8_t buf[12];
283349
uint32_t freq = 1000;
@@ -326,8 +392,12 @@ class ModulinoColor {
326392

327393
class ModulinoPixels : public Module {
328394
public:
329-
ModulinoPixels(uint8_t address = 0xFF)
330-
: Module(address, "LEDS") {
395+
ModulinoPixels(uint8_t address = 0xFF, ModulinoHubPort* hubPort = nullptr)
396+
: Module(address, "LEDS", hubPort) {
397+
memset((uint8_t*)data, 0xE0, NUMLEDS * 4);
398+
}
399+
ModulinoPixels(ModulinoHubPort* hubPort, uint8_t address = 0xFF)
400+
: Module(address, "LEDS", hubPort) {
331401
memset((uint8_t*)data, 0xE0, NUMLEDS * 4);
332402
}
333403
void set(int idx, ModulinoColor rgb, uint8_t brightness = 25) {
@@ -366,9 +436,11 @@ class ModulinoPixels : public Module {
366436

367437
class ModulinoKnob : public Module {
368438
public:
369-
ModulinoKnob(uint8_t address = 0xFF)
370-
: Module(address, "ENCODER") {}
371-
bool begin() {
439+
ModulinoKnob(uint8_t address = 0xFF, ModulinoHubPort* hubPort = nullptr)
440+
: Module(address, "ENCODER", hubPort) {}
441+
ModulinoKnob(ModulinoHubPort* hubPort, uint8_t address = 0xFF)
442+
: Module(address, "ENCODER", hubPort) {}
443+
bool begin() {
372444
auto ret = Module::begin();
373445
if (ret) {
374446
auto _val = get();
@@ -453,6 +525,8 @@ extern ModulinoColor WHITE;
453525

454526
class ModulinoMovement : public Module {
455527
public:
528+
ModulinoMovement(ModulinoHubPort* hubPort = nullptr)
529+
: Module(0xFF, "MOVEMENT", hubPort) {}
456530
bool begin() {
457531
if (_imu == nullptr) {
458532
_imu = new LSM6DSOXClass(*((TwoWire*)getWire()), 0x6A);
@@ -505,6 +579,8 @@ class ModulinoMovement : public Module {
505579

506580
class ModulinoThermo: public Module {
507581
public:
582+
ModulinoThermo(ModulinoHubPort* hubPort = nullptr)
583+
: Module(0xFF, "THERMO", hubPort) {}
508584
bool begin() {
509585
if (_sensor == nullptr) {
510586
_sensor = new HS300xClass(*((TwoWire*)getWire()));
@@ -535,6 +611,8 @@ class ModulinoThermo: public Module {
535611

536612
class ModulinoPressure : public Module {
537613
public:
614+
ModulinoPressure(ModulinoHubPort* hubPort = nullptr)
615+
: Module(0xFF, "PRESSURE", hubPort) {}
538616
bool begin() {
539617
if (_barometer == nullptr) {
540618
_barometer = new LPS22HBClass(*((TwoWire*)getWire()));
@@ -569,6 +647,8 @@ class ModulinoPressure : public Module {
569647

570648
class ModulinoLight : public Module {
571649
public:
650+
ModulinoLight(ModulinoHubPort* hubPort = nullptr)
651+
: Module(0xFF, "LIGHT", hubPort) {}
572652
bool begin() {
573653
if (_light == nullptr) {
574654
_light = new LTR381RGBClass(*((TwoWire*)getWire()), 0x53);
@@ -723,6 +803,8 @@ class _distance_api {
723803

724804
class ModulinoDistance : public Module {
725805
public:
806+
ModulinoDistance(ModulinoHubPort* hubPort = nullptr)
807+
: Module(0xFF, "DISTANCE", hubPort) {}
726808
bool begin() {
727809
// try scanning for 0x29 since the library contains a while(true) on begin()
728810
getWire()->beginTransmission(0x29);
@@ -787,7 +869,9 @@ class ModulinoDistance : public Module {
787869

788870
class ModulinoRelay : public Module {
789871
public:
790-
ModulinoRelay(uint8_t address = 0xFF)
872+
ModulinoRelay(uint8_t address = 0xFF, ModulinoHubPort* hubPort = nullptr)
873+
: Module(address, "RELAY", hubPort) {}
874+
ModulinoRelay(ModulinoHubPort* hubPort, uint8_t address = 0xFF)
791875
: Module(address, "RELAY") {}
792876
bool update() {
793877
uint8_t buf[3];

0 commit comments

Comments
 (0)