22
22
* THE SOFTWARE.
23
23
*/
24
24
25
+ #include " Arduino.h"
25
26
#include " Adafruit_USBD_WebUSB.h"
26
27
27
28
#if CFG_TUD_VENDOR
@@ -118,6 +119,7 @@ Adafruit_USBD_WebUSB::Adafruit_USBD_WebUSB(void)
118
119
{
119
120
_connected = false ;
120
121
_url = NULL ;
122
+ _linestate_cb = NULL ;
121
123
}
122
124
123
125
bool Adafruit_USBD_WebUSB::begin (void )
@@ -137,6 +139,11 @@ bool Adafruit_USBD_WebUSB::setLandingPage(const void* url)
137
139
return true ;
138
140
}
139
141
142
+ void Adafruit_USBD_WebUSB::setLineStateCallback (linestate_callback_t fp)
143
+ {
144
+ _linestate_cb = fp;
145
+ }
146
+
140
147
uint16_t Adafruit_USBD_WebUSB::getDescriptor (uint8_t itfnum, uint8_t * buf, uint16_t bufsize)
141
148
{
142
149
// usb core will automatically update endpoint number
@@ -153,24 +160,62 @@ uint16_t Adafruit_USBD_WebUSB::getDescriptor(uint8_t itfnum, uint8_t* buf, uint1
153
160
return len;
154
161
}
155
162
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
+
156
188
int Adafruit_USBD_WebUSB::read (void )
157
189
{
158
- return -1 ;
190
+ uint8_t ch;
191
+ return tud_vendor_read (&ch, 1 ) ? (int ) ch : -1 ;
159
192
}
160
193
161
194
size_t Adafruit_USBD_WebUSB::write (uint8_t b)
162
195
{
163
- return 0 ;
196
+ return this -> write (&b, 1 ) ;
164
197
}
165
198
166
- int Adafruit_USBD_WebUSB::available ( void )
199
+ size_t Adafruit_USBD_WebUSB::write ( const uint8_t *buffer, size_t size )
167
200
{
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;
169
213
}
170
214
171
215
int Adafruit_USBD_WebUSB::peek (void )
172
216
{
173
- return -1 ;
217
+ uint8_t ch;
218
+ return tud_vendor_peek (0 , &ch) ? (int ) ch : -1 ;
174
219
}
175
220
176
221
void Adafruit_USBD_WebUSB::flush (void )
@@ -212,17 +257,13 @@ bool tud_vendor_control_request_cb(uint8_t rhport, tusb_control_request_t const
212
257
// connect and disconnect.
213
258
_webusb_dev->_connected = (request->wValue != 0 );
214
259
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);
221
262
222
- }
263
+ // invoked callback if any
264
+ if (_webusb_dev->_linestate_cb ) _webusb_dev->_linestate_cb (_webusb_dev->_connected );
223
265
224
- // response with status OK
225
- return tud_control_status (rhport, request);
266
+ return true ;;
226
267
227
268
default :
228
269
// stall unknown request
0 commit comments