|
|
@@ -1,89 +0,0 @@
|
|
|
-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);
|
|
|
- };
|
|
|
-})();
|