mirror of
https://github.com/Architeuthis-Flux/Jumperless.git
synced 2024-12-23 20:54:50 +01:00
93 lines
2.8 KiB
JavaScript
93 lines
2.8 KiB
JavaScript
|
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': 0xcafe }, // TinyUSB
|
||
|
{ 'vendorId': 0x239a }, // Adafruit
|
||
|
{ 'vendorId': 0x2e8a }, // Raspberry Pi
|
||
|
{ 'vendorId': 0x303a }, // Espressif
|
||
|
{ 'vendorId': 0x2341 }, // Arduino
|
||
|
];
|
||
|
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);
|
||
|
};
|
||
|
})();
|