Skip to content

Commit 0fe51fa

Browse files
committed
update CDC to have instance and getInstanceCount()
1 parent 24cae73 commit 0fe51fa

File tree

4 files changed

+56
-51
lines changed

4 files changed

+56
-51
lines changed

src/Adafruit_TinyUSB.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,10 @@
2525
#ifndef ADAFRUIT_TINYUSB_H_
2626
#define ADAFRUIT_TINYUSB_H_
2727

28-
// Give warning for Core that must select TinyUSB via menu
28+
// Error message for Core that must select TinyUSB via menu
2929
#if !defined(USE_TINYUSB) && ( defined(ARDUINO_ARCH_SAMD) || \
30-
(defined(ARDUINO_ARCH_RP2040) && !defined(ARDUINO_ARCH_MBED)) )
30+
(defined(ARDUINO_ARCH_RP2040) && !defined(ARDUINO_ARCH_MBED)) || \
31+
defined(ARDUINO_ARCH_ESP32) )
3132
#error TinyUSB is not selected, please select it in "Tools->Menu->USB Stack"
3233
#endif
3334

src/arduino/Adafruit_TinyUSB_API.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,9 @@ void TinyUSB_Device_Task(void) {
4646
}
4747
#endif
4848

49-
// TODO should use getInstanceCount() API (when closed to BSP release cycle)
50-
// from Adafruit_USBD_CDC.cpp
51-
extern uint8_t _cdc_instance_count;
52-
5349
void TinyUSB_Device_FlushCDC(void) {
54-
for (uint8_t instance = 0; instance < _cdc_instance_count; instance++) {
50+
uint8_t const cdc_instance = Adafruit_USBD_CDC::getInstanceCount();
51+
for (uint8_t instance = 0; instance < cdc_instance; instance++) {
5552
tud_cdc_n_write_flush(instance);
5653
}
5754
}

src/arduino/Adafruit_USBD_CDC.cpp

Lines changed: 41 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,19 @@
3737
#define EPOUT 0x00
3838
#define EPIN 0x80
3939

40-
uint8_t _cdc_instance_count = 0;
41-
40+
// SerialTinyUSB can be macro expanding to "Serial" on supported cores
4241
Adafruit_USBD_CDC SerialTinyUSB;
4342

43+
//------------- Static member -------------//
44+
uint8_t Adafruit_USBD_CDC::_instance_count = 0;
45+
46+
uint8_t Adafruit_USBD_CDC::getInstanceCount(void)
47+
{
48+
return _instance_count;
49+
}
50+
4451
Adafruit_USBD_CDC::Adafruit_USBD_CDC(void) {
45-
_begun = false;
46-
_itf = 0;
52+
_instance = INVALID_INSTANCE;
4753
}
4854

4955
uint16_t Adafruit_USBD_CDC::getInterfaceDescriptor(uint8_t itfnum, uint8_t *buf,
@@ -65,17 +71,17 @@ uint16_t Adafruit_USBD_CDC::getInterfaceDescriptor(uint8_t itfnum, uint8_t *buf,
6571
void Adafruit_USBD_CDC::begin(uint32_t baud) {
6672
(void)baud;
6773

68-
if (_begun) {
74+
// already called begin()
75+
if (isValid()) {
6976
return;
7077
}
7178

7279
// too many instances
73-
if (!(_cdc_instance_count < CFG_TUD_CDC)) {
80+
if (!(_instance_count < CFG_TUD_CDC)) {
7481
return;
7582
}
7683

77-
_begun = true;
78-
_itf = _cdc_instance_count++;
84+
_instance = _instance_count++;
7985
this->setStringDescriptor("TinyUSB Serial");
8086
USBDevice.addInterface(*this);
8187
}
@@ -86,69 +92,69 @@ void Adafruit_USBD_CDC::begin(uint32_t baud, uint8_t config) {
8692
}
8793

8894
void Adafruit_USBD_CDC::end(void) {
89-
// Resset configuration descriptor without Serial as CDC
95+
// Reset configuration descriptor without Serial as CDC
9096
USBDevice.clearConfiguration();
91-
_cdc_instance_count = 0;
97+
_instance_count = 0;
9298
}
9399

94100
uint32_t Adafruit_USBD_CDC::baud(void) {
95-
if (!_begun) {
101+
if (!isValid()) {
96102
return 0;
97103
}
98104

99105
cdc_line_coding_t coding;
100-
tud_cdc_n_get_line_coding(_itf, &coding);
106+
tud_cdc_n_get_line_coding(_instance, &coding);
101107

102108
return coding.bit_rate;
103109
}
104110

105111
uint8_t Adafruit_USBD_CDC::stopbits(void) {
106-
if (!_begun) {
112+
if (!isValid()) {
107113
return 0;
108114
}
109115

110116
cdc_line_coding_t coding;
111-
tud_cdc_n_get_line_coding(_itf, &coding);
117+
tud_cdc_n_get_line_coding(_instance, &coding);
112118

113119
return coding.stop_bits;
114120
}
115121

116122
uint8_t Adafruit_USBD_CDC::paritytype(void) {
117-
if (!_begun) {
123+
if (!isValid()) {
118124
return 0;
119125
}
120126

121127
cdc_line_coding_t coding;
122-
tud_cdc_n_get_line_coding(_itf, &coding);
128+
tud_cdc_n_get_line_coding(_instance, &coding);
123129

124130
return coding.parity;
125131
}
126132

127133
uint8_t Adafruit_USBD_CDC::numbits(void) {
128-
if (!_begun) {
134+
if (!isValid()) {
129135
return 0;
130136
}
131137

132138
cdc_line_coding_t coding;
133-
tud_cdc_n_get_line_coding(_itf, &coding);
139+
tud_cdc_n_get_line_coding(_instance, &coding);
134140

135141
return coding.data_bits;
136142
}
137143

138144
int Adafruit_USBD_CDC::dtr(void) {
139-
if (!_begun) {
145+
if (!isValid()) {
140146
return 0;
141147
}
142148

143-
return tud_cdc_n_connected(_itf);
149+
return tud_cdc_n_connected(_instance);
144150
}
145151

146152
Adafruit_USBD_CDC::operator bool() {
147-
if (!_begun) {
153+
if (!isValid()) {
148154
return false;
149155
}
150156

151-
bool ret = tud_cdc_n_connected(_itf);
157+
bool ret = tud_cdc_n_connected(_instance);
152158

153159
// Add an yield to run usb background in case sketch block wait as follows
154160
// while( !Serial ) {}
@@ -159,11 +165,11 @@ Adafruit_USBD_CDC::operator bool() {
159165
}
160166

161167
int Adafruit_USBD_CDC::available(void) {
162-
if (!_begun) {
168+
if (!isValid()) {
163169
return 0;
164170
}
165171

166-
uint32_t count = tud_cdc_n_available(_itf);
172+
uint32_t count = tud_cdc_n_available(_instance);
167173

168174
// Add an yield to run usb background in case sketch block wait as follows
169175
// while( !Serial.available() ) {}
@@ -175,39 +181,39 @@ int Adafruit_USBD_CDC::available(void) {
175181
}
176182

177183
int Adafruit_USBD_CDC::peek(void) {
178-
if (!_begun) {
184+
if (!isValid()) {
179185
return -1;
180186
}
181187

182188
uint8_t ch;
183-
return tud_cdc_n_peek(_itf, &ch) ? (int)ch : -1;
189+
return tud_cdc_n_peek(_instance, &ch) ? (int)ch : -1;
184190
}
185191

186192
int Adafruit_USBD_CDC::read(void) {
187-
if (!_begun) {
193+
if (!isValid()) {
188194
return -1;
189195
}
190-
return (int)tud_cdc_n_read_char(_itf);
196+
return (int)tud_cdc_n_read_char(_instance);
191197
}
192198

193199
void Adafruit_USBD_CDC::flush(void) {
194-
if (!_begun) {
200+
if (!isValid()) {
195201
return;
196202
}
197203

198-
tud_cdc_n_write_flush(_itf);
204+
tud_cdc_n_write_flush(_instance);
199205
}
200206

201207
size_t Adafruit_USBD_CDC::write(uint8_t ch) { return write(&ch, 1); }
202208

203209
size_t Adafruit_USBD_CDC::write(const uint8_t *buffer, size_t size) {
204-
if (!_begun) {
210+
if (!isValid()) {
205211
return 0;
206212
}
207213

208214
size_t remain = size;
209-
while (remain && tud_cdc_n_connected(_itf)) {
210-
size_t wrcount = tud_cdc_n_write(_itf, buffer, remain);
215+
while (remain && tud_cdc_n_connected(_instance)) {
216+
size_t wrcount = tud_cdc_n_write(_instance, buffer, remain);
211217
remain -= wrcount;
212218
buffer += wrcount;
213219

@@ -221,10 +227,10 @@ size_t Adafruit_USBD_CDC::write(const uint8_t *buffer, size_t size) {
221227
}
222228

223229
int Adafruit_USBD_CDC::availableForWrite(void) {
224-
if (!_begun) {
230+
if (!isValid()) {
225231
return 0;
226232
}
227-
return tud_cdc_n_write_available(_itf);
233+
return tud_cdc_n_write_available(_instance);
228234
}
229235

230236
extern "C" {

src/arduino/Adafruit_USBD_CDC.h

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ class Adafruit_USBD_CDC : public Stream, public Adafruit_USBD_Interface {
3636
public:
3737
Adafruit_USBD_CDC(void);
3838

39+
static uint8_t getInstanceCount(void);
40+
3941
// fron Adafruit_USBD_Interface
4042
virtual uint16_t getInterfaceDescriptor(uint8_t itfnum, uint8_t *buf,
4143
uint16_t bufsize);
@@ -72,15 +74,14 @@ class Adafruit_USBD_CDC : public Stream, public Adafruit_USBD_Interface {
7274
operator bool();
7375

7476
private:
75-
bool _begun;
76-
uint8_t _itf;
77-
78-
/* TODO when closed to BSP release cycle (SAMD, nRF, rp2040)
79-
* rename _itf to _instance, _begun can be removed
80-
*
81-
* static uint8_t getInstanceCount(void);
82-
* static uint8_t _instance_count;
83-
*/
77+
enum { INVALID_INSTANCE = 0xffu };
78+
static uint8_t _instance_count;
79+
80+
uint8_t _instance;
81+
82+
bool isValid(void) {
83+
return _instance != INVALID_INSTANCE;
84+
}
8485
};
8586

8687
// "Serial" is used with TinyUSB CDC

0 commit comments

Comments
 (0)