Skip to content

Commit 9e75649

Browse files
committed
0.2.0 Multiplex
1 parent c16d93c commit 9e75649

File tree

8 files changed

+179
-29
lines changed

8 files changed

+179
-29
lines changed

libraries/Multiplex/Multiplex.cpp

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
//
22
// FILE: Multiplex.cpp
33
// AUTHOR: Rob Tillaart
4-
// VERSION: 0.1.0
4+
// VERSION: 0.2.0
55
// PURPOSE: Arduino library to multiplex streams
66
// DATE: 2021-01-09
77
// URL: https://github.com/RobTillaart/Multiplex
88
//
99
// HISTORY:
1010
// 0.1.0 2021-01-09 initial version
11+
// 0.2.0 2021-08-09 See issues #2 and #3
1112

1213

1314
#include "Multiplex.h"
@@ -29,6 +30,7 @@ void Multiplex::reset()
2930

3031
bool Multiplex::add(Print * stream)
3132
{
33+
if (index(stream) != 0xFF) return false;
3234
if (_count >= _size) return false;
3335
_enabled[_count] = true;
3436
_stream[_count++] = stream;
@@ -53,23 +55,61 @@ size_t Multiplex::write(uint8_t c)
5355
return n;
5456
}
5557

58+
size_t Multiplex::write(const uint8_t *buffer, size_t size) {
59+
uint8_t n = 0;
60+
for (uint8_t i = 0; i < _count; i++)
61+
{
62+
if (_enabled[i])
63+
{
64+
n += _stream[i]->write(buffer, size);
65+
}
66+
}
67+
return n;
68+
}
69+
70+
// private
71+
uint8_t Multiplex::index(Print *stream)
72+
{
73+
uint8_t i = 0;
74+
for (; i < _count; i++)
75+
{
76+
if (stream == _stream[i])
77+
{
78+
return i;
79+
}
80+
}
81+
return 0xFF;
82+
}
5683

5784
void Multiplex::enable(uint8_t n)
5885
{
59-
if (n < _count) _enabled[n] = true;
86+
if (n < _count && n != 0xFF) _enabled[n] = true;
6087
}
6188

89+
void Multiplex::enableStream(Print *stream)
90+
{
91+
return enable(index(stream));
92+
}
6293

6394
void Multiplex::disable(uint8_t n)
6495
{
65-
if (n < _count) _enabled[n] = false;
96+
if (n != 0xFF && n < _count) _enabled[n] = false;
6697
}
6798

99+
void Multiplex::disableStream(Print *stream)
100+
{
101+
return disable(index(stream));
102+
}
68103

69104
bool Multiplex::isEnabled(uint8_t n)
70105
{
71-
if (n >= _count) return false;
106+
if (n != 0xFF && n >= _count) return false;
72107
return _enabled[n];
73108
}
74109

110+
bool Multiplex::isEnabledStream(Print *stream)
111+
{
112+
return isEnabled(index(stream));
113+
}
114+
75115
// -- END OF FILE --

libraries/Multiplex/Multiplex.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@
22
//
33
// FILE: Multiplex.h
44
// AUTHOR: Rob Tillaart
5-
// VERSION: 0.1.0
5+
// VERSION: 0.2.0
66
// PURPOSE: Arduino library to multiplex streams
77
// DATE: 2021-01-09
88
// URL: https://github.com/RobTillaart/Multiplex
99

1010

1111
#include "Arduino.h"
12-
#include "Print.h"
12+
//#include "Print.h"
1313

1414

15-
#define MULTIPLEX_LIB_VERSION (F("0.1.0"))
15+
#define MULTIPLEX_LIB_VERSION (F("0.2.0"))
1616

1717

1818
const uint8_t MAX_MULTIPLEX = 4;
@@ -24,22 +24,27 @@ class Multiplex: public Print
2424
Multiplex();
2525

2626
// CORE
27-
size_t write(uint8_t c);
27+
virtual size_t write(uint8_t c) override;
28+
virtual size_t write(const uint8_t *buffer, size_t size) override;
2829
bool add(Print * stream); // returns true on success
2930
void reset();
3031

3132
// CONTROL
3233
uint8_t count() { return _count; };
3334
uint8_t size() { return _size; };
3435
void enable(uint8_t index);
36+
void enableStream(Print * stream);
3537
void disable(uint8_t index);
38+
void disableStream(Print * stream);
3639
bool isEnabled(uint8_t index);
40+
bool isEnabledStream(Print * stream);
3741

3842
private:
3943
Print * _stream[MAX_MULTIPLEX];
4044
bool _enabled[MAX_MULTIPLEX]; // bitmask max 4 ...
4145
uint8_t _count;
4246
uint8_t _size;
47+
uint8_t index(Print *stream);
4348
};
4449

4550
// -- END OF FILE --

libraries/Multiplex/README.md

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,26 @@
33
[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/RobTillaart/Multiplex/blob/master/LICENSE)
44
[![GitHub release](https://img.shields.io/github/release/RobTillaart/Multiplex.svg?maxAge=3600)](https://github.com/RobTillaart/Multiplex/releases)
55

6-
76
# Multiplex
87

98
Arduino Library implementing a stream multiplexer.
109

11-
1210
## Description
1311

1412
Multiplex is a library in which one can add multiple Print streams.
13+
1514
If one prints to the multiplexer it is sent to all the streams that were added.
16-
The maximum nr of streams to add is 4 .
15+
16+
The maximum nr of streams to add is 4.
17+
1718
It is possible to disable individual streams.
1819

20+
Streams can be enabled or disabled by calling `enable()/disable()` passing either an index (based on the order
21+
in whicbh `add` was called; 0 is first) or a pointer to the `Print`
22+
object that was passed to `add(Print *)`;
1923

2024
## Interface
2125

22-
2326
### Constructor
2427

2528
- **Multiplex()** constructor
@@ -37,8 +40,11 @@ Returns false if no space left.
3740
- **uint8_t count()** returns # streams, MAX 4 in initial release
3841
- **uint8_t size()** returns size which is 4 in the current release.
3942
- **void enable(uint8_t index)** enable the stream at index.
43+
- **void enableStream(Stream * stream)** enable the stream.
4044
- **void disable(uint8_t index)** disable the stream at index.
45+
- **void disableStream(Stream * stream)** disable the stream.
4146
- **bool isEnabled(uint8_t index)** checks if the stream at index is enabled.
47+
- **bool isEnabledStream(Stream * stream)** checks if the stream is enabled.
4248

4349

4450
## Future

libraries/Multiplex/examples/Multiplex_softwareSerial/Multiplex_softwareSerial.ino

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
// DATE: 2021-01-17
77

88
#include "Multiplex.h"
9-
#include "SoftwareSerial.h"
9+
#include <SoftwareSerial.h>
1010

1111
// one multiplexer
1212
Multiplex mp;
@@ -41,7 +41,19 @@ void setup()
4141
Serial.print("count: ");
4242
Serial.println(n);
4343

44-
mp.println("\n Done...\n");
44+
mp.disable(&Serial_B);
45+
46+
for (int i = 0; i < mp.count(); i++)
47+
{
48+
Serial.print("isEnabled ");
49+
Serial.print(i);
50+
Serial.print(":\t");
51+
Serial.println(mp.isEnabled(i));
52+
}
53+
54+
mp.println("\nThis should only print on Serial_A and Serial_C\n");
55+
56+
mp.println("Done...\n");
4557

4658
}
4759

libraries/Multiplex/examples/Multiplex_test/Multiplex_test.ino

Lines changed: 53 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,53 @@
11
//
22
// FILE: Multiplex_test.ino
33
// AUTHOR: Rob Tillaart
4-
// VERSION: 0.1.0
4+
// VERSION: 0.2.0
55
// PURPOSE: demo
66
// DATE: 2021-01-09
77

88
#include "Multiplex.h"
99

1010
Multiplex mp;
1111

12+
class FakeStream : public Print
13+
{
14+
public:
15+
FakeStream(uint8_t id) : _id(id) { _id = id; };
16+
17+
virtual size_t write(uint8_t c) override
18+
{
19+
return Serial.write(c);
20+
};
21+
22+
virtual size_t write(const uint8_t *buffer, size_t size)
23+
{
24+
size_t n = 0;
25+
n += Serial.print("stream");
26+
n += Serial.print(_id, DEC);
27+
n += Serial.print(':');
28+
29+
for (uint8_t i = 0 ; i < size ; i++)
30+
{
31+
n += write(buffer[i]);
32+
}
33+
return n;
34+
}
35+
private:
36+
uint8_t _id = 0;
37+
};
38+
1239
void setup()
1340
{
1441
Serial.begin(115200);
1542
Serial.println(__FILE__);
1643

17-
mp.add(&Serial);
18-
mp.println("one");
19-
mp.add(&Serial);
20-
mp.println("two");
44+
FakeStream stream1(1);
45+
FakeStream stream2(2);
46+
47+
mp.add(&stream1);
48+
mp.print("one\n");
49+
mp.add(&stream2);
50+
mp.print("two\n");
2151

2252
for (int i = 0; i < mp.count(); i++)
2353
{
@@ -28,7 +58,7 @@ void setup()
2858
}
2959

3060
mp.disable(1);
31-
mp.println("three");
61+
mp.print("three\n");
3262

3363
for (int i = 0; i < mp.count(); i++)
3464
{
@@ -39,7 +69,7 @@ void setup()
3969
}
4070

4171
mp.disable(0);
42-
mp.println("four");
72+
mp.print("four\n");
4373

4474
for (int i = 0; i < mp.count(); i++)
4575
{
@@ -50,7 +80,22 @@ void setup()
5080
}
5181

5282
mp.enable(0);
53-
mp.println("\n Done...\n");
83+
mp.enable(1);
84+
mp.print("five\n");
85+
86+
mp.disableStream(&stream1);
87+
mp.print("six\n");
88+
89+
mp.enableStream(&stream1);
90+
for (int i = 0; i < mp.count(); i++)
91+
{
92+
Serial.print("isEnabled ");
93+
Serial.print(i);
94+
Serial.print(":\t");
95+
Serial.println(mp.isEnabled(i));
96+
}
97+
98+
mp.print("Done...\n");
5499

55100
}
56101

libraries/Multiplex/library.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"type": "git",
1616
"url": "https://github.com/RobTillaart/Multiplex"
1717
},
18-
"version": "0.1.0",
18+
"version": "0.2.0",
1919
"license": "MIT",
2020
"frameworks": "arduino",
2121
"platforms": "*"

libraries/Multiplex/library.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name=Multiplex
2-
version=0.1.0
2+
version=0.2.0
33
author=Rob Tillaart <[email protected]>
44
maintainer=Rob Tillaart <[email protected]>
55
sentence=Arduino Library implementing a stream multiplexer

0 commit comments

Comments
 (0)