Skip to content

Commit 8402487

Browse files
committed
add stream API() for webusb, add setLineStateCallback()
example work with line state callback
1 parent 0f48a69 commit 8402487

File tree

3 files changed

+80
-17
lines changed

3 files changed

+80
-17
lines changed

examples/WebUSB/webusb_serial/webusb_serial.ino

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,17 @@ Adafruit_USBD_WebUSB usb_web;
2020
// Landing Page: scheme (0: http, 1: https), url
2121
const tusb_desc_webusb_url_t landingPage = TUD_WEBUSB_URL_DESCRIPTOR(1 /*https*/, "adafruit.github.io/Adafruit_TinyUSB_Arduino/examples/webusb-serial");
2222

23+
int led_pin = LED_BUILTIN;
24+
2325
// the setup function runs once when you press reset or power the board
2426
void setup()
2527
{
28+
pinMode(led_pin, OUTPUT);
29+
digitalWrite(led_pin, LOW);
30+
2631
usb_web.begin();
2732
usb_web.setLandingPage(&landingPage);
33+
usb_web.setLineStateCallback(line_state_callback);
2834

2935
Serial.begin(115200);
3036

@@ -36,6 +42,11 @@ void setup()
3642

3743
void loop()
3844
{
39-
delay(1000);
40-
digitalWrite(LED_BUILTIN, 1-digitalRead(LED_BUILTIN));
45+
// delay(1000);
46+
// digitalWrite(LED_BUILTIN, 1-digitalRead(LED_BUILTIN));
47+
}
48+
49+
void line_state_callback(bool connected)
50+
{
51+
digitalWrite(led_pin, connected);
4152
}

src/Adafruit_USBD_WebUSB.cpp

Lines changed: 55 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
* THE SOFTWARE.
2323
*/
2424

25+
#include "Arduino.h"
2526
#include "Adafruit_USBD_WebUSB.h"
2627

2728
#if CFG_TUD_VENDOR
@@ -118,6 +119,7 @@ Adafruit_USBD_WebUSB::Adafruit_USBD_WebUSB(void)
118119
{
119120
_connected = false;
120121
_url = NULL;
122+
_linestate_cb = NULL;
121123
}
122124

123125
bool Adafruit_USBD_WebUSB::begin(void)
@@ -137,6 +139,11 @@ bool Adafruit_USBD_WebUSB::setLandingPage(const void* url)
137139
return true;
138140
}
139141

142+
void Adafruit_USBD_WebUSB::setLineStateCallback(linestate_callback_t fp)
143+
{
144+
_linestate_cb = fp;
145+
}
146+
140147
uint16_t Adafruit_USBD_WebUSB::getDescriptor(uint8_t itfnum, uint8_t* buf, uint16_t bufsize)
141148
{
142149
// usb core will automatically update endpoint number
@@ -153,24 +160,62 @@ uint16_t Adafruit_USBD_WebUSB::getDescriptor(uint8_t itfnum, uint8_t* buf, uint1
153160
return len;
154161
}
155162

163+
bool Adafruit_USBD_WebUSB::connected(void)
164+
{
165+
return tud_vendor_mounted() && _connected;
166+
}
167+
168+
Adafruit_USBD_WebUSB::operator bool()
169+
{
170+
// Add an yield to run usb background in case sketch block wait as follows
171+
// while( !webusb ) {}
172+
if ( !connected() ) yield();
173+
174+
return connected();
175+
}
176+
177+
int Adafruit_USBD_WebUSB::available (void)
178+
{
179+
uint32_t count = tud_vendor_available();
180+
181+
// Add an yield to run usb background in case sketch block wait as follows
182+
// while( !webusb.available() ) {}
183+
if (!count) yield();
184+
185+
return count;
186+
}
187+
156188
int Adafruit_USBD_WebUSB::read (void)
157189
{
158-
return -1;
190+
uint8_t ch;
191+
return tud_vendor_read(&ch, 1) ? (int) ch : -1;
159192
}
160193

161194
size_t Adafruit_USBD_WebUSB::write (uint8_t b)
162195
{
163-
return 0;
196+
return this->write(&b, 1);
164197
}
165198

166-
int Adafruit_USBD_WebUSB::available (void)
199+
size_t Adafruit_USBD_WebUSB::write(const uint8_t *buffer, size_t size)
167200
{
168-
return 0;
201+
size_t remain = size;
202+
while ( remain && _connected )
203+
{
204+
size_t wrcount = tud_vendor_write(buffer, remain);
205+
remain -= wrcount;
206+
buffer += wrcount;
207+
208+
// Write FIFO is full, run usb background to flush
209+
if ( remain ) yield();
210+
}
211+
212+
return size - remain;
169213
}
170214

171215
int Adafruit_USBD_WebUSB::peek (void)
172216
{
173-
return -1;
217+
uint8_t ch;
218+
return tud_vendor_peek(0, &ch) ? (int) ch : -1;
174219
}
175220

176221
void Adafruit_USBD_WebUSB::flush (void)
@@ -212,17 +257,13 @@ bool tud_vendor_control_request_cb(uint8_t rhport, tusb_control_request_t const
212257
// connect and disconnect.
213258
_webusb_dev->_connected = (request->wValue != 0);
214259

215-
// Always lit LED if connected
216-
if ( request->wValue )
217-
{
218-
219-
}else
220-
{
260+
// response with status OK
261+
tud_control_status(rhport, request);
221262

222-
}
263+
// invoked callback if any
264+
if (_webusb_dev->_linestate_cb) _webusb_dev->_linestate_cb(_webusb_dev->_connected);
223265

224-
// response with status OK
225-
return tud_control_status(rhport, request);
266+
return true;;
226267

227268
default:
228269
// stall unknown request

src/Adafruit_USBD_WebUSB.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,25 +30,36 @@
3030
class Adafruit_USBD_WebUSB : public Stream, Adafruit_USBD_Interface
3131
{
3232
public:
33+
typedef void (*linestate_callback_t)(bool connected);
3334
Adafruit_USBD_WebUSB(void);
3435

3536
bool begin(void);
3637

3738
bool setLandingPage(const void* url);
39+
void setLineStateCallback(linestate_callback_t fp);
3840

3941
// Stream interface to use with MIDI Library
4042
virtual int read ( void );
41-
virtual size_t write ( uint8_t b );
4243
virtual int available ( void );
4344
virtual int peek ( void );
4445
virtual void flush ( void );
46+
virtual size_t write ( uint8_t b );
47+
48+
virtual size_t write(const uint8_t *buffer, size_t size);
49+
size_t write(const char *buffer, size_t size) {
50+
return write((const uint8_t *)buffer, size);
51+
}
52+
53+
bool connected(void);
54+
operator bool();
4555

4656
// from Adafruit_USBD_Interface
4757
virtual uint16_t getDescriptor(uint8_t itfnum, uint8_t* buf, uint16_t bufsize);
4858

4959
private:
5060
bool _connected;
5161
const uint8_t* _url;
62+
linestate_callback_t _linestate_cb;
5263

5364
// Make all tinyusb callback friend to access private data
5465
friend bool tud_vendor_control_request_cb(uint8_t rhport, tusb_control_request_t const * request);

0 commit comments

Comments
 (0)