@@ -56,14 +56,53 @@ class ModulinoClass {
5656 friend class Module ;
5757protected:
5858 HardwareI2C* _wire;
59+ friend class ModulinoHub ;
60+ friend class ModulinoHubPort ;
5961};
6062
6163extern 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+
63102class Module : public Printable {
64103public:
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
136194class ModulinoButtons : public Module {
137195public:
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
174234class ModulinoJoystick : public Module {
175235public:
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
226288class ModulinoBuzzer : public Module {
227289public:
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
253317class ModulinoVibro : public Module {
254318public:
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
303369class ModulinoPixels : public Module {
304370public:
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
343413class ModulinoKnob : public Module {
344414public:
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
408480class ModulinoMovement : public Module {
409481public:
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
448522class ModulinoThermo : public Module {
449523public:
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
478554class ModulinoPressure : public Module {
479555public:
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
512590class ModulinoLight : public Module {
513591public:
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
666746class ModulinoDistance : public Module {
667747public:
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
730812class ModulinoRelay : public Module {
731813public:
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