summaryrefslogtreecommitdiff
path: root/docs/html_extra/examples/webusb-serial/serial.js
diff options
context:
space:
mode:
Diffstat (limited to 'docs/html_extra/examples/webusb-serial/serial.js')
-rw-r--r--docs/html_extra/examples/webusb-serial/serial.js89
1 files changed, 89 insertions, 0 deletions
diff --git a/docs/html_extra/examples/webusb-serial/serial.js b/docs/html_extra/examples/webusb-serial/serial.js
new file mode 100644
index 000000000..8e985d897
--- /dev/null
+++ b/docs/html_extra/examples/webusb-serial/serial.js
@@ -0,0 +1,89 @@
+var serial = {};
+
+(function() {
+ 'use strict';
+
+ serial.getPorts = function() {
+ return navigator.usb.getDevices().then(devices => {
+ return devices.map(device => new serial.Port(device));
+ });
+ };
+
+ serial.requestPort = function() {
+ const filters = [
+ { 'vendorId': 0x239A }, // Adafruit boards
+ { 'vendorId': 0xcafe }, // TinyUSB example
+ ];
+ return navigator.usb.requestDevice({ 'filters': filters }).then(
+ device => new serial.Port(device)
+ );
+ }
+
+ serial.Port = function(device) {
+ this.device_ = device;
+ this.interfaceNumber = 0;
+ this.endpointIn = 0;
+ this.endpointOut = 0;
+ };
+
+ serial.Port.prototype.connect = function() {
+ let readLoop = () => {
+ this.device_.transferIn(this.endpointIn, 64).then(result => {
+ this.onReceive(result.data);
+ readLoop();
+ }, error => {
+ this.onReceiveError(error);
+ });
+ };
+
+ return this.device_.open()
+ .then(() => {
+ if (this.device_.configuration === null) {
+ return this.device_.selectConfiguration(1);
+ }
+ })
+ .then(() => {
+ var interfaces = this.device_.configuration.interfaces;
+ interfaces.forEach(element => {
+ element.alternates.forEach(elementalt => {
+ if (elementalt.interfaceClass==0xFF) {
+ this.interfaceNumber = element.interfaceNumber;
+ elementalt.endpoints.forEach(elementendpoint => {
+ if (elementendpoint.direction == "out") {
+ this.endpointOut = elementendpoint.endpointNumber;
+ }
+ if (elementendpoint.direction=="in") {
+ this.endpointIn =elementendpoint.endpointNumber;
+ }
+ })
+ }
+ })
+ })
+ })
+ .then(() => this.device_.claimInterface(this.interfaceNumber))
+ .then(() => this.device_.selectAlternateInterface(this.interfaceNumber, 0))
+ .then(() => this.device_.controlTransferOut({
+ 'requestType': 'class',
+ 'recipient': 'interface',
+ 'request': 0x22,
+ 'value': 0x01,
+ 'index': this.interfaceNumber}))
+ .then(() => {
+ readLoop();
+ });
+ };
+
+ serial.Port.prototype.disconnect = function() {
+ return this.device_.controlTransferOut({
+ 'requestType': 'class',
+ 'recipient': 'interface',
+ 'request': 0x22,
+ 'value': 0x00,
+ 'index': this.interfaceNumber})
+ .then(() => this.device_.close());
+ };
+
+ serial.Port.prototype.send = function(data) {
+ return this.device_.transferOut(this.endpointOut, data);
+ };
+})();