fix: init local device handlers even when connected to Socket Server
This commit is contained in:
@@ -1,186 +1,174 @@
|
||||
goog.loadJs('web', () => {
|
||||
|
||||
goog.require('path');
|
||||
goog.require('Mixly.Config');
|
||||
goog.require('Mixly.Env');
|
||||
goog.require('Mixly.Msg');
|
||||
goog.require('Mixly.Registry');
|
||||
goog.require('Mixly.Serial');
|
||||
goog.require('Mixly.LayerExt');
|
||||
goog.require('Mixly.HTMLTemplate');
|
||||
goog.require('Mixly.Web.SerialPort');
|
||||
goog.require('Mixly.Web.USB');
|
||||
goog.require('Mixly.Web.USBMini');
|
||||
goog.require('Mixly.Web.HID');
|
||||
goog.provide('Mixly.Web.Serial');
|
||||
goog.require('path');
|
||||
goog.require('Mixly.Config');
|
||||
goog.require('Mixly.Env');
|
||||
goog.require('Mixly.Msg');
|
||||
goog.require('Mixly.Registry');
|
||||
goog.require('Mixly.Serial');
|
||||
goog.require('Mixly.LayerExt');
|
||||
goog.require('Mixly.HTMLTemplate');
|
||||
goog.require('Mixly.Web.SerialPort');
|
||||
goog.require('Mixly.Web.USB');
|
||||
goog.require('Mixly.Web.USBMini');
|
||||
goog.require('Mixly.Web.HID');
|
||||
goog.provide('Mixly.Web.Serial');
|
||||
|
||||
const {
|
||||
Config,
|
||||
Env,
|
||||
Msg,
|
||||
Registry,
|
||||
Serial,
|
||||
LayerExt,
|
||||
HTMLTemplate,
|
||||
Web
|
||||
} = Mixly;
|
||||
const {
|
||||
Config,
|
||||
Env,
|
||||
Msg,
|
||||
Registry,
|
||||
Serial,
|
||||
LayerExt,
|
||||
HTMLTemplate,
|
||||
Web
|
||||
} = Mixly;
|
||||
|
||||
const {
|
||||
SerialPort,
|
||||
USB,
|
||||
USBMini,
|
||||
HID
|
||||
} = Web;
|
||||
const {
|
||||
SerialPort,
|
||||
USB,
|
||||
USBMini,
|
||||
HID
|
||||
} = Web;
|
||||
|
||||
const { BOARD } = Config;
|
||||
const { BOARD } = Config;
|
||||
|
||||
const platform = goog.platform();
|
||||
const fullPlatform = goog.fullPlatform();
|
||||
const platform = goog.platform();
|
||||
const fullPlatform = goog.fullPlatform();
|
||||
|
||||
|
||||
class WebSerial extends Serial {
|
||||
static {
|
||||
this.devicesRegistry = new Registry();
|
||||
this.type = Serial.type;
|
||||
this.DEVICES_SELECT_LAYER = new HTMLTemplate(
|
||||
goog.readFileSync(path.join(Env.templatePath, 'html/devices-select-layer.html'))
|
||||
);
|
||||
class WebSerial extends Serial {
|
||||
static {
|
||||
this.devicesRegistry = new Registry();
|
||||
this.type = Serial.type;
|
||||
this.DEVICES_SELECT_LAYER = new HTMLTemplate(
|
||||
goog.readFileSync(path.join(Env.templatePath, 'html/devices-select-layer.html'))
|
||||
);
|
||||
|
||||
this.getConfig = function () {
|
||||
return Serial.getConfig();
|
||||
}
|
||||
|
||||
this.getSelectedPortName = function () {
|
||||
return Serial.getSelectedPortName();
|
||||
}
|
||||
|
||||
this.getCurrentPortsName = function () {
|
||||
return Serial.getCurrentPortsName();
|
||||
}
|
||||
|
||||
this.refreshPorts = function () {
|
||||
Serial.refreshPorts();
|
||||
}
|
||||
|
||||
this.requestPort = function () {
|
||||
if (this.devicesRegistry.length() < 1) {
|
||||
throw Error('can not find any device handler');
|
||||
} else if (this.devicesRegistry.length() === 1) {
|
||||
const keys = this.devicesRegistry.keys();
|
||||
return this.devicesRegistry.getItem(keys[0]).requestPort();
|
||||
this.getConfig = function () {
|
||||
return Serial.getConfig();
|
||||
}
|
||||
const msg = {
|
||||
serialMsg: Msg.Lang['layer.devices.serial'],
|
||||
serialStatus: this.devicesRegistry.hasKey('serial') ? '' : 'disabled',
|
||||
hidMsg: Msg.Lang['layer.devices.hid'],
|
||||
hidStatus: this.devicesRegistry.hasKey('hid') ? '' : 'disabled',
|
||||
usbMsg: Msg.Lang['layer.devices.usb'],
|
||||
usbStatus: (
|
||||
this.devicesRegistry.hasKey('usb') || this.devicesRegistry.hasKey('usbmini')
|
||||
) ? '' : 'disabled'
|
||||
};
|
||||
return new Promise((resolve, reject) => {
|
||||
let selected = false;
|
||||
const layerNum = LayerExt.open({
|
||||
title: [Msg.Lang['layer.devices.select'], '36px'],
|
||||
area: ['400px', '150px'],
|
||||
max: false,
|
||||
min: false,
|
||||
content: this.DEVICES_SELECT_LAYER.render(msg),
|
||||
shade: LayerExt.SHADE_ALL,
|
||||
resize: false,
|
||||
success: function (layero, index) {
|
||||
$(layero).on('click', 'button', (event) => {
|
||||
selected = true;
|
||||
layer.close(layerNum);
|
||||
const $btn = $(event.currentTarget);
|
||||
let mId = $btn.attr('m-id');
|
||||
if (mId === 'usb' && WebSerial.devicesRegistry.hasKey('usbmini')) {
|
||||
mId = 'usbmini';
|
||||
|
||||
this.getSelectedPortName = function () {
|
||||
return Serial.getSelectedPortName();
|
||||
}
|
||||
|
||||
this.getCurrentPortsName = function () {
|
||||
return Serial.getCurrentPortsName();
|
||||
}
|
||||
|
||||
this.refreshPorts = function () {
|
||||
Serial.refreshPorts();
|
||||
}
|
||||
|
||||
this.requestPort = function () {
|
||||
if (this.devicesRegistry.length() < 1) {
|
||||
throw Error('can not find any device handler');
|
||||
} else if (this.devicesRegistry.length() === 1) {
|
||||
const keys = this.devicesRegistry.keys();
|
||||
return this.devicesRegistry.getItem(keys[0]).requestPort();
|
||||
}
|
||||
const msg = {
|
||||
serialMsg: Msg.Lang['layer.devices.serial'],
|
||||
serialStatus: this.devicesRegistry.hasKey('serial') ? '' : 'disabled',
|
||||
hidMsg: Msg.Lang['layer.devices.hid'],
|
||||
hidStatus: this.devicesRegistry.hasKey('hid') ? '' : 'disabled',
|
||||
usbMsg: Msg.Lang['layer.devices.usb'],
|
||||
usbStatus: (
|
||||
this.devicesRegistry.hasKey('usb') || this.devicesRegistry.hasKey('usbmini')
|
||||
) ? '' : 'disabled'
|
||||
};
|
||||
return new Promise((resolve, reject) => {
|
||||
let selected = false;
|
||||
const layerNum = LayerExt.open({
|
||||
title: [Msg.Lang['layer.devices.select'], '36px'],
|
||||
area: ['400px', '150px'],
|
||||
max: false,
|
||||
min: false,
|
||||
content: this.DEVICES_SELECT_LAYER.render(msg),
|
||||
shade: LayerExt.SHADE_ALL,
|
||||
resize: false,
|
||||
success: function (layero, index) {
|
||||
$(layero).on('click', 'button', (event) => {
|
||||
selected = true;
|
||||
layer.close(layerNum);
|
||||
const $btn = $(event.currentTarget);
|
||||
let mId = $btn.attr('m-id');
|
||||
if (mId === 'usb' && WebSerial.devicesRegistry.hasKey('usbmini')) {
|
||||
mId = 'usbmini';
|
||||
}
|
||||
const Device = WebSerial.devicesRegistry.getItem(mId);
|
||||
Device.requestPort().then(resolve).catch(reject);
|
||||
});
|
||||
},
|
||||
end: function () {
|
||||
if (!selected) {
|
||||
reject('user not select any device');
|
||||
}
|
||||
const Device = WebSerial.devicesRegistry.getItem(mId);
|
||||
Device.requestPort().then(resolve).catch(reject);
|
||||
});
|
||||
},
|
||||
end: function () {
|
||||
if (!selected) {
|
||||
reject('user not select any device');
|
||||
$(`#layui-layer-shade${layerNum}`).remove();
|
||||
}
|
||||
$(`#layui-layer-shade${layerNum}`).remove();
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
this.getHandler = function (device) {
|
||||
if (device.constructor.name === 'SerialPort') {
|
||||
return SerialPort;
|
||||
} else if (device.constructor.name === 'HIDDevice') {
|
||||
return HID;
|
||||
} else if (device.constructor.name === 'USBDevice') {
|
||||
if (this.devicesRegistry.hasKey('usbmini')) {
|
||||
return USBMini;
|
||||
} else {
|
||||
return USB;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
this.getPort = function (name) {
|
||||
return Serial.nameToPortRegistry.getItem(name);
|
||||
}
|
||||
|
||||
this.addPort = function (device) {
|
||||
const handler = this.getHandler(device);
|
||||
if (!handler) {
|
||||
return;
|
||||
}
|
||||
handler.addPort(device);
|
||||
}
|
||||
|
||||
this.removePort = function (device) {
|
||||
const handler = this.getHandler(device);
|
||||
if (!handler) {
|
||||
return;
|
||||
}
|
||||
handler.removePort(device);
|
||||
}
|
||||
|
||||
this.addEventsListener = function () {}
|
||||
|
||||
this.init = function () {
|
||||
if (Env.hasSocketServer) {
|
||||
return;
|
||||
}
|
||||
if (platform === 'win32' && fullPlatform !== 'win10') {
|
||||
if (BOARD?.web?.devices?.hid) {
|
||||
this.devicesRegistry.register('hid', HID);
|
||||
HID.init();
|
||||
}
|
||||
if (BOARD?.web?.devices?.serial) {
|
||||
this.devicesRegistry.register('serial', SerialPort);
|
||||
SerialPort.init();
|
||||
}
|
||||
if (BOARD?.web?.devices?.usb) {
|
||||
if (['BBC micro:bit', 'Mithon CC'].includes(BOARD.boardType)) {
|
||||
this.devicesRegistry.register('usb', USB);
|
||||
USB.init();
|
||||
this.getHandler = function (device) {
|
||||
if (device.constructor.name === 'SerialPort') {
|
||||
return SerialPort;
|
||||
} else if (device.constructor.name === 'HIDDevice') {
|
||||
return HID;
|
||||
} else if (device.constructor.name === 'USBDevice') {
|
||||
if (this.devicesRegistry.hasKey('usbmini')) {
|
||||
return USBMini;
|
||||
} else {
|
||||
return USB;
|
||||
}
|
||||
}
|
||||
} else if (platform === 'mobile') {
|
||||
if (['BBC micro:bit', 'Mithon CC'].includes(BOARD.boardType)) {
|
||||
this.devicesRegistry.register('usb', USB);
|
||||
USB.init();
|
||||
} else {
|
||||
this.devicesRegistry.register('usbmini', USBMini);
|
||||
USBMini.init();
|
||||
return null;
|
||||
}
|
||||
|
||||
this.getPort = function (name) {
|
||||
return Serial.nameToPortRegistry.getItem(name);
|
||||
}
|
||||
|
||||
this.addPort = function (device) {
|
||||
const handler = this.getHandler(device);
|
||||
if (!handler) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (BOARD?.web?.devices?.serial) {
|
||||
this.devicesRegistry.register('serial', SerialPort);
|
||||
SerialPort.init();
|
||||
} else if (BOARD?.web?.devices?.usb) {
|
||||
handler.addPort(device);
|
||||
}
|
||||
|
||||
this.removePort = function (device) {
|
||||
const handler = this.getHandler(device);
|
||||
if (!handler) {
|
||||
return;
|
||||
}
|
||||
handler.removePort(device);
|
||||
}
|
||||
|
||||
this.addEventsListener = function () { }
|
||||
|
||||
this.init = function () {
|
||||
// if (Env.hasSocketServer) {
|
||||
// return;
|
||||
// }
|
||||
if (platform === 'win32' && fullPlatform !== 'win10') {
|
||||
if (BOARD?.web?.devices?.hid) {
|
||||
this.devicesRegistry.register('hid', HID);
|
||||
HID.init();
|
||||
}
|
||||
if (BOARD?.web?.devices?.serial) {
|
||||
this.devicesRegistry.register('serial', SerialPort);
|
||||
SerialPort.init();
|
||||
}
|
||||
if (BOARD?.web?.devices?.usb) {
|
||||
if (['BBC micro:bit', 'Mithon CC'].includes(BOARD.boardType)) {
|
||||
this.devicesRegistry.register('usb', USB);
|
||||
USB.init();
|
||||
}
|
||||
}
|
||||
} else if (platform === 'mobile') {
|
||||
if (['BBC micro:bit', 'Mithon CC'].includes(BOARD.boardType)) {
|
||||
this.devicesRegistry.register('usb', USB);
|
||||
USB.init();
|
||||
@@ -188,28 +176,40 @@ class WebSerial extends Serial {
|
||||
this.devicesRegistry.register('usbmini', USBMini);
|
||||
USBMini.init();
|
||||
}
|
||||
} else if (BOARD?.web?.devices?.hid) {
|
||||
this.devicesRegistry.register('hid', HID);
|
||||
HID.init();
|
||||
} else {
|
||||
if (BOARD?.web?.devices?.serial) {
|
||||
this.devicesRegistry.register('serial', SerialPort);
|
||||
SerialPort.init();
|
||||
} else if (BOARD?.web?.devices?.usb) {
|
||||
if (['BBC micro:bit', 'Mithon CC'].includes(BOARD.boardType)) {
|
||||
this.devicesRegistry.register('usb', USB);
|
||||
USB.init();
|
||||
} else {
|
||||
this.devicesRegistry.register('usbmini', USBMini);
|
||||
USBMini.init();
|
||||
}
|
||||
} else if (BOARD?.web?.devices?.hid) {
|
||||
this.devicesRegistry.register('hid', HID);
|
||||
HID.init();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.init();
|
||||
}
|
||||
|
||||
this.init();
|
||||
}
|
||||
|
||||
constructor(port) {
|
||||
super(port);
|
||||
const device = WebSerial.getPort(port);
|
||||
const handler = WebSerial.getHandler(device);
|
||||
if (!handler) {
|
||||
return;
|
||||
constructor(port) {
|
||||
super(port);
|
||||
const device = WebSerial.getPort(port);
|
||||
const handler = WebSerial.getHandler(device);
|
||||
if (!handler) {
|
||||
return;
|
||||
}
|
||||
return new handler(port);
|
||||
}
|
||||
return new handler(port);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Web.Serial = WebSerial;
|
||||
Web.Serial = WebSerial;
|
||||
|
||||
});
|
||||
Reference in New Issue
Block a user