Skip to content

Commit aae8e6d

Browse files
committed
Add support for ModulinoHub
1 parent 8bc736e commit aae8e6d

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
@@ -56,14 +56,53 @@ class ModulinoClass {
5656
friend class Module;
5757
protected:
5858
HardwareI2C* _wire;
59+
friend class ModulinoHub;
60+
friend class ModulinoHubPort;
5961
};
6062

6163
extern ModulinoClass Modulino;
6264

65+
// Forward declaration of ModulinoHub
66+
class ModulinoHub;
67+
68+
class ModulinoHubPort {
69+
public:
70+
ModulinoHubPort(int port, ModulinoHub* hub) : _port(port), _hub(hub) {}
71+
int select();
72+
int clear();
73+
private:
74+
int _port;
75+
ModulinoHub* _hub;
76+
};
77+
78+
class ModulinoHub {
79+
public:
80+
ModulinoHub(int address = 0x70) : _address(address){ }
81+
ModulinoHubPort* port(int _port) {
82+
return new ModulinoHubPort(_port, this);
83+
}
84+
int select(int port) {
85+
Modulino._wire->beginTransmission(_address);
86+
Modulino._wire->write(1 << port);
87+
return Modulino._wire->endTransmission();
88+
}
89+
int clear() {
90+
Modulino._wire->beginTransmission(_address);
91+
Modulino._wire->write((uint8_t)0);
92+
return Modulino._wire->endTransmission();
93+
}
94+
95+
int address() {
96+
return _address;
97+
}
98+
private:
99+
int _address;
100+
};
101+
63102
class Module : public Printable {
64103
public:
65-
Module(uint8_t address = 0xFF, const char* name = "")
66-
: address(address), name((char *)name) {}
104+
Module(uint8_t address = 0xFF, const char* name = "", ModulinoHubPort* hubPort = nullptr)
105+
: address(address), name((char *)name), hubPort(hubPort) {}
67106
virtual ~Module() {}
68107
bool begin() {
69108
if (address >= 0x7F) {
@@ -84,6 +123,9 @@ class Module : public Printable {
84123
if (address >= 0x7F) {
85124
return false;
86125
}
126+
if (hubPort != nullptr) {
127+
hubPort->select();
128+
}
87129
Modulino._wire->requestFrom(address, howmany + 1);
88130
auto start = millis();
89131
while ((Modulino._wire->available() == 0) && (millis() - start < 100)) {
@@ -99,17 +141,26 @@ class Module : public Printable {
99141
while (Modulino._wire->available()) {
100142
Modulino._wire->read();
101143
}
144+
if (hubPort != nullptr) {
145+
hubPort->clear();
146+
}
102147
return true;
103148
}
104149
bool write(uint8_t* buf, int howmany) {
105150
if (address >= 0x7F) {
106151
return false;
107152
}
153+
if (hubPort != nullptr) {
154+
hubPort->select();
155+
}
108156
Modulino._wire->beginTransmission(address);
109157
for (int i = 0; i < howmany; i++) {
110158
Modulino._wire->write(buf[i]);
111159
}
112160
Modulino._wire->endTransmission();
161+
if (hubPort != nullptr) {
162+
hubPort->clear();
163+
}
113164
return true;
114165
}
115166
bool nonDefaultAddress() {
@@ -119,8 +170,14 @@ class Module : public Printable {
119170
return p.print(name);
120171
}
121172
bool scan(uint8_t addr) {
173+
if (hubPort != nullptr) {
174+
hubPort->select();
175+
}
122176
Modulino._wire->beginTransmission(addr / 2); // multply by 2 to match address in fw main.c
123177
auto ret = Modulino._wire->endTransmission();
178+
if (hubPort != nullptr) {
179+
hubPort->clear();
180+
}
124181
if (ret == 0) {
125182
// could also ask for 1 byte and check if it's truely a modulino of that kind
126183
return true;
@@ -131,12 +188,15 @@ class Module : public Printable {
131188
uint8_t address;
132189
uint8_t pinstrap_address;
133190
char* name;
191+
ModulinoHubPort* hubPort = nullptr;
134192
};
135193

136194
class ModulinoButtons : public Module {
137195
public:
138-
ModulinoButtons(uint8_t address = 0xFF)
139-
: Module(address, "BUTTONS") {}
196+
ModulinoButtons(uint8_t address = 0xFF, ModulinoHubPort* hubPort = nullptr)
197+
: Module(address, "BUTTONS", hubPort) {}
198+
ModulinoButtons(ModulinoHubPort* hubPort, uint8_t address = 0xFF)
199+
: Module(address, "BUTTONS", hubPort) {}
140200
PinStatus isPressed(int index) {
141201
return last_status[index] ? HIGH : LOW;
142202
}
@@ -173,8 +233,10 @@ class ModulinoButtons : public Module {
173233

174234
class ModulinoJoystick : public Module {
175235
public:
176-
ModulinoJoystick(uint8_t address = 0xFF)
177-
: Module(address, "JOYSTICK") {}
236+
ModulinoJoystick(uint8_t address = 0xFF, ModulinoHubPort* hubPort = nullptr)
237+
: Module(address, "JOYSTICK", hubPort) {}
238+
ModulinoJoystick(ModulinoHubPort* hubPort, uint8_t address = 0xFF)
239+
: Module(address, "JOYSTICK", hubPort) {}
178240
bool update() {
179241
uint8_t buf[3];
180242
auto res = read((uint8_t*)buf, 3);
@@ -225,8 +287,10 @@ class ModulinoJoystick : public Module {
225287

226288
class ModulinoBuzzer : public Module {
227289
public:
228-
ModulinoBuzzer(uint8_t address = 0xFF)
229-
: Module(address, "BUZZER") {}
290+
ModulinoBuzzer(uint8_t address = 0xFF, ModulinoHubPort* hubPort = nullptr)
291+
: Module(address, "BUZZER", hubPort) {}
292+
ModulinoBuzzer(ModulinoHubPort* hubPort, uint8_t address = 0xFF)
293+
: Module(address, "BUZZER", hubPort) {}
230294
void (tone)(size_t freq, size_t len_ms) {
231295
uint8_t buf[8];
232296
memcpy(&buf[0], &freq, 4);
@@ -252,8 +316,10 @@ class ModulinoBuzzer : public Module {
252316

253317
class ModulinoVibro : public Module {
254318
public:
255-
ModulinoVibro(uint8_t address = 0xFF)
256-
: Module(address, "VIBRO") {}
319+
ModulinoVibro(uint8_t address = 0xFF, ModulinoHubPort* hubPort = nullptr)
320+
: Module(address, "VIBRO", hubPort) {}
321+
ModulinoVibro(ModulinoHubPort* hubPort, uint8_t address = 0xFF)
322+
: Module(address, "VIBRO", hubPort) {}
257323
void on(size_t len_ms, bool block, int power = MAXIMUM ) {
258324
uint8_t buf[12];
259325
uint32_t freq = 1000;
@@ -302,8 +368,12 @@ class ModulinoColor {
302368

303369
class ModulinoPixels : public Module {
304370
public:
305-
ModulinoPixels(uint8_t address = 0xFF)
306-
: Module(address, "LEDS") {
371+
ModulinoPixels(uint8_t address = 0xFF, ModulinoHubPort* hubPort = nullptr)
372+
: Module(address, "LEDS", hubPort) {
373+
memset((uint8_t*)data, 0xE0, NUMLEDS * 4);
374+
}
375+
ModulinoPixels(ModulinoHubPort* hubPort, uint8_t address = 0xFF)
376+
: Module(address, "LEDS", hubPort) {
307377
memset((uint8_t*)data, 0xE0, NUMLEDS * 4);
308378
}
309379
void set(int idx, ModulinoColor rgb, uint8_t brightness = 25) {
@@ -342,9 +412,11 @@ class ModulinoPixels : public Module {
342412

343413
class ModulinoKnob : public Module {
344414
public:
345-
ModulinoKnob(uint8_t address = 0xFF)
346-
: Module(address, "ENCODER") {}
347-
bool begin() {
415+
ModulinoKnob(uint8_t address = 0xFF, ModulinoHubPort* hubPort = nullptr)
416+
: Module(address, "ENCODER", hubPort) {}
417+
ModulinoKnob(ModulinoHubPort* hubPort, uint8_t address = 0xFF)
418+
: Module(address, "ENCODER", hubPort) {}
419+
bool begin() {
348420
auto ret = Module::begin();
349421
if (ret) {
350422
// check for set() bug
@@ -407,6 +479,8 @@ extern ModulinoColor WHITE;
407479

408480
class ModulinoMovement : public Module {
409481
public:
482+
ModulinoMovement(ModulinoHubPort* hubPort = nullptr)
483+
: Module(0xFF, "MOVEMENT", hubPort) {}
410484
bool begin() {
411485
if (_imu == nullptr) {
412486
_imu = new LSM6DSOXClass(*((TwoWire*)getWire()), 0x6A);
@@ -447,6 +521,8 @@ class ModulinoMovement : public Module {
447521

448522
class ModulinoThermo: public Module {
449523
public:
524+
ModulinoThermo(ModulinoHubPort* hubPort = nullptr)
525+
: Module(0xFF, "THERMO", hubPort) {}
450526
bool begin() {
451527
if (_sensor == nullptr) {
452528
_sensor = new HS300xClass(*((TwoWire*)getWire()));
@@ -477,6 +553,8 @@ class ModulinoThermo: public Module {
477553

478554
class ModulinoPressure : public Module {
479555
public:
556+
ModulinoPressure(ModulinoHubPort* hubPort = nullptr)
557+
: Module(0xFF, "PRESSURE", hubPort) {}
480558
bool begin() {
481559
if (_barometer == nullptr) {
482560
_barometer = new LPS22HBClass(*((TwoWire*)getWire()));
@@ -511,6 +589,8 @@ class ModulinoPressure : public Module {
511589

512590
class ModulinoLight : public Module {
513591
public:
592+
ModulinoLight(ModulinoHubPort* hubPort = nullptr)
593+
: Module(0xFF, "LIGHT", hubPort) {}
514594
bool begin() {
515595
if (_light == nullptr) {
516596
_light = new LTR381RGBClass(*((TwoWire*)getWire()), 0x53);
@@ -665,6 +745,8 @@ class _distance_api {
665745

666746
class ModulinoDistance : public Module {
667747
public:
748+
ModulinoDistance(ModulinoHubPort* hubPort = nullptr)
749+
: Module(0xFF, "DISTANCE", hubPort) {}
668750
bool begin() {
669751
// try scanning for 0x29 since the library contains a while(true) on begin()
670752
getWire()->beginTransmission(0x29);
@@ -729,7 +811,9 @@ class ModulinoDistance : public Module {
729811

730812
class ModulinoRelay : public Module {
731813
public:
732-
ModulinoRelay(uint8_t address = 0xFF)
814+
ModulinoRelay(uint8_t address = 0xFF, ModulinoHubPort* hubPort = nullptr)
815+
: Module(address, "RELAY", hubPort) {}
816+
ModulinoRelay(ModulinoHubPort* hubPort, uint8_t address = 0xFF)
733817
: Module(address, "RELAY") {}
734818
bool update() {
735819
uint8_t buf[3];

0 commit comments

Comments
 (0)