new universal plugin configuration object

This commit is contained in:
sparks-alec
2022-12-10 06:53:56 -05:00
parent 93225fc00e
commit 5e21544a81
12 changed files with 204 additions and 118 deletions
+13 -11
View File
@@ -1,16 +1,18 @@
const _ = require('lodash');
exports.defaultName = "Art-Net";
exports.connectionType = 'UDPsocket';
exports.heartbeatInterval = 10000;
exports.searchOptions = {
type: 'UDPsocket',
searchBuffer: Buffer.from([0x00]),
devicePort: 6454,
listenPort: 6454,
validateResponse (msg, info, devices) {
return msg.toString('utf8', 0, 7) === "Art-Net";
exports.config = {
defaultName: "Art-Net",
connectionType: "UDPsocket",
heartbeatInterval: 10000,
searchOptions: {
type: 'UDPsocket',
searchBuffer: Buffer.from([0x00]),
devicePort: 6454,
listenPort: 6454,
mayChangePort: false,
validateResponse (msg, info, devices) {
return msg.toString('utf8', 0, 7) === "Art-Net";
}
}
};
+17 -14
View File
@@ -3,20 +3,23 @@ const fs = require('fs');
const path = require('path');
const Cue = require('./cue');
exports.defaultName = 'ETC Eos';
exports.connectionType = 'osc';
exports.searchOptions = {
type: 'TCPport',
searchBuffer: Buffer.from(
'\xc0/eos/ping\x00\x00\x2c\x00\x00\x00\xc0',
'ascii'
),
testPort: 3032,
validateResponse(msg, info) {
return msg.toString().indexOf('/eos/out');
},
};
exports.defaultPort = 3032;
exports.config = {
defaultName: "ETC Eos",
connectionType: "osc",
defaultPort: 3032,
mayChangePort: false,
searchOptions: {
type: 'TCPport',
searchBuffer: Buffer.from(
'\xc0/eos/ping\x00\x00\x2c\x00\x00\x00\xc0',
'ascii'
),
testPort: 3032,
validateResponse(msg, info) {
return msg.toString().indexOf('/eos/out');
}
}
}
exports.ready = function ready(_device) {
const device = _device;
+17 -14
View File
@@ -1,19 +1,22 @@
const md5 = require('md5');
exports.defaultName = 'PJLink Projector';
exports.connectionType = 'TCPsocket';
exports.heartbeatInterval = 5000;
exports.heartbeatTimeout = 15000;
exports.searchOptions = {
type: 'UDPsocket',
searchBuffer: Buffer.from([0x25, 0x32, 0x53, 0x52, 0x43, 0x48, 0x0d]),
devicePort: 4352,
listenPort: 4352,
validateResponse (msg, info) {
return msg.toString().indexOf('%2ACKN=') >= 0;
},
};
exports.defaultPort = 4352;
exports.config = {
defaultName: 'PJLink Projector',
connectionType: "TCPsocket",
heartbeatInterval: 5000,
heartbeatTimeout: 15000,
defaultPort: 4352,
mayChangePort: false,
searchOptions: {
type: 'UDPsocket',
searchBuffer: Buffer.from([0x25, 0x32, 0x53, 0x52, 0x43, 0x48, 0x0d]),
devicePort: 4352,
listenPort: 4352,
validateResponse (msg, info) {
return msg.toString().indexOf('%2ACKN=') >= 0;
}
}
}
exports.ready = function ready(device) {
// Power status query
+22 -9
View File
@@ -2,6 +2,27 @@ const _ = require('lodash');
const fs = require('fs');
const path = require('path');
exports.config = {
defaultName: "QLab",
connectionType: "osc",
heartbeatInterval: 50,
heartbeatTimeout: 2000,
mayChangePort: true,
searchOptions: {
type: 'Bonjour',
bonjourName: 'qlab',
},
fields: [{
key: "passcode",
label: "Pass",
type: "textinput",
value: "5353",
action: function(device){
device.send('/workspaces');
}
}]
}
let lastElapsedUpdate = Date.now();
let interval = 5;
let heartbeatCount = 0;
@@ -16,14 +37,6 @@ const cueTemplate = _.template(fs.readFileSync(path.join(__dirname, `cue.ejs`)))
const tileTemplate = _.template(fs.readFileSync(path.join(__dirname, `tile.ejs`)));
const cartTemplate = _.template(fs.readFileSync(path.join(__dirname, `cart.ejs`)));
exports.defaultName = 'QLab';
exports.connectionType = 'osc';
exports.heartbeatInterval = 50;
exports.heartbeatTimeout = 2000;
exports.searchOptions = {
type: 'Bonjour',
bonjourName: 'qlab',
};
exports.ready = function ready(device) {
device.send(`/version`);
@@ -54,7 +67,7 @@ exports.data = function data(_device, oscData) {
cueLists: {},
cues: {}
}
device.send(`/workspace/${wksp.uniqueID}/connect`);
device.send(`/workspace/${wksp.uniqueID}/connect`, device.fields.passcode);
});
}else if(match(oscAddressParts, ["reply", "workspace", "*", "connect"])){
+16 -13
View File
@@ -1,18 +1,21 @@
const _ = require('lodash');
exports.defaultName = 'sACN';
exports.connectionType = 'multicast';
exports.defaultPort = 5568;
exports.heartbeatInterval = 5000;
exports.searchOptions = {
type: "multicast",
address: getMulticastGroup(1),
port: 5568,
validateResponse (msg, info) {
return msg.toString('utf8', 4, 13) === "ASC-E1.17";
},
};
exports.defaultPort = 5568;
exports.config = {
defaultName: "sACN",
connectionType: "multicast",
defaultPort: 5568,
heartbeatInterval: 5000,
defaultPort: 5568,
mayChangePort: false,
searchOptions: {
type: "multicast",
address: getMulticastGroup(1),
port: 5568,
validateResponse (msg, info) {
return msg.toString('utf8', 4, 13) === "ASC-E1.17";
}
}
}
exports.ready = function ready(device) {
+15 -12
View File
@@ -1,15 +1,18 @@
exports.defaultName = 'Dataton Watchout';
exports.connectionType = 'TCPsocket';
exports.heartbeatInterval = 500;
exports.searchOptions = {
type: 'TCPport',
searchBuffer: Buffer.from('authenticate 1\n', 'ascii'),
testPort: 3040,
validateResponse (msg, info) {
return msg.toString().substring(0, 5) === 'Ready';
},
};
exports.defaultPort = 3040;
exports.config = {
defaultName: "Dataton Watchout",
connectionType: "TCPsocket",
heartbeatInterval: 500,
defaultPort: 3040,
mayChangePort: false,
searchOptions: {
type: 'TCPport',
searchBuffer: Buffer.from('authenticate 1\n', 'ascii'),
testPort: 3040,
validateResponse (msg, info) {
return msg.toString().substring(0, 5) === 'Ready';
}
}
}
exports.ready = function ready(device) {
device.send('authenticate 1\n');
+16 -13
View File
@@ -1,16 +1,19 @@
exports.defaultName = 'X32 Mixer';
exports.connectionType = 'osc-udp';
exports.heartbeatInterval = 9000;
exports.searchOptions = {
type: 'UDPsocket',
searchBuffer: Buffer.from([0x2f, 0x78, 0x69, 0x6e, 0x66, 0x6f]),
devicePort: 10023,
listenPort: 0,
validateResponse(msg, info) {
return msg.toString().indexOf('/xinfo') === 0;
},
};
exports.defaultPort = 10023;
exports.config = {
defaultName: "X32 Mixer",
connectionType: "osc-udp",
heartbeatInterval: 9000,
defaultPort: 10023,
mayChangePort: false,
searchOptions: {
type: 'UDPsocket',
searchBuffer: Buffer.from([0x2f, 0x78, 0x69, 0x6e, 0x66, 0x6f]),
devicePort: 10023,
listenPort: 0,
validateResponse(msg, info) {
return msg.toString().indexOf('/xinfo') === 0;
}
}
}
exports.ready = function ready(device) {
const d = device;
+16 -13
View File
@@ -1,16 +1,19 @@
exports.defaultName = 'X Air Mixer';
exports.connectionType = 'UDPsocket';
exports.heartbeatInterval = 10000;
exports.searchOptions = {
type: 'UDPsocket',
searchBuffer: Buffer.from([0x2f, 0x78, 0x69, 0x6e, 0x66, 0x6f]),
devicePort: 10024,
listenPort: 0,
validateResponse(msg, info) {
return msg.toString().indexOf('/xinfo') === 0;
},
};
exports.defaultPort = 10024;
exports.config = {
defaultName: "X Air Mixer",
connectionType: "UDPsocket",
heartbeatInterval: 10000,
defaultPort: 10024,
mayChangePort: false,
searchOptions: {
type: 'UDPsocket',
searchBuffer: Buffer.from([0x2f, 0x78, 0x69, 0x6e, 0x66, 0x6f]),
devicePort: 10024,
listenPort: 0,
validateResponse(msg, info) {
return msg.toString().indexOf('/xinfo') === 0;
}
}
}
exports.ready = function ready(device) {
const d = device;
+13 -5
View File
@@ -49,6 +49,7 @@ function registerDevice(newDevice) {
port: newDevice.port,
addresses: newDevice.addresses,
data: {},
fields: {},
pinIndex: false,
lastDrawn: 0,
lastHeartbeat: 0,
@@ -65,6 +66,13 @@ function registerDevice(newDevice) {
},
};
if(PLUGINS.all[newDevice.type].config.fields){
PLUGINS.all[newDevice.type].config.fields.forEach(field => {
devices[id].fields[field.key] = field.value;
});
}
VIEW.addDeviceToList(devices[id]);
initDeviceConnection(id);
return true;
@@ -89,8 +97,8 @@ function initDeviceConnection(id) {
const { type } = devices[id];
const plugins = PLUGINS.all;
if (plugins[type].connectionType.includes('osc')) {
if (plugins[type].connectionType.includes('udp')) {
if (plugins[type].config.connectionType.includes('osc')) {
if (plugins[type].config.connectionType.includes('udp')) {
device.connection = new osc.UDPPort({
localAddress: '0.0.0.0',
remoteAddress: device.addresses[0],
@@ -125,7 +133,7 @@ function initDeviceConnection(id) {
device.connection.send({ address, args });
};
device.plugin = plugins[type];
} else if (plugins[type].connectionType === 'TCPsocket') {
} else if (plugins[type].config.connectionType === 'TCPsocket') {
device.connection = new net.Socket();
device.connection.connect(
@@ -155,7 +163,7 @@ function initDeviceConnection(id) {
// log("SOCK OUT", data);
device.connection.write(data);
};
} else if (plugins[type].connectionType === 'UDPsocket') {
} else if (plugins[type].config.connectionType === 'UDPsocket') {
device.connection = udp.createSocket('udp4');
device.connection.bind({ port: plugins[type].defaultPort }, () => {
@@ -177,7 +185,7 @@ function initDeviceConnection(id) {
}
);
};
} else if (plugins[type].connectionType === 'multicast') {
} else if (plugins[type].config.connectionType === 'multicast') {
device.connection = udp.createSocket('udp4');
device.connection.bind(device.port, () => {
+23 -7
View File
@@ -47,17 +47,33 @@ module.exports.init = function init(callback) {
);
if (p.heartbeatTimeout === undefined || p.heartbeatTimeout < 50) {
if(p.heartbeatInterval){
p.heartbeatTimeout = p.heartbeatInterval * 1.5;
//if (p.heartbeatTimeout === undefined || p.heartbeatTimeout < 50) {
if(p.config.heartbeatTimeout){
p.heartbeatTimeout = p.config.heartbeatInterval * 1.5;
}else{
p.heartbeatTimeout = 10000;
}
}
//}
if (p.heartbeatInterval === undefined || p.heartbeatInterval < 50) {
p.heartbeatInterval = 5000;
}
if(p.config.heartbeatInterval){
p.heartbeatInterval = Math.max(50, p.config.heartbeatInterval);
}else{
p.heartbeatInterval = 5000;
}
// p.fields = {};
// if(p.config.fields){
// p.config.fields.forEach(field => {
// p.fields[field.key] = field.value;
// });
// }
// if (p.heartbeatInterval === undefined || p.heartbeatInterval < 50) {
// p.heartbeatInterval = 5000;
// }
}
});
+5 -5
View File
@@ -60,21 +60,21 @@ function searchAll() {
const plugin = PLUGINS.all[p];
try {
const t = plugin.searchOptions.type;
const t = plugin.config.searchOptions.type;
if(t === 'TCPport'){
if (TCPFlag) {
searchTCP(p, plugin);
searchTCP(p, plugin.config);
}
}else if(t === 'Bonjour'){
searchBonjour(p, plugin);
searchBonjour(p, plugin.config);
}else if(t === 'UDPsocket'){
searchUDP(p, plugin);
searchUDP(p, plugin.config);
}else if(t === 'multicast'){
searchMulticast(p, plugin);
searchMulticast(p, plugin.config);
}
+31 -2
View File
@@ -197,6 +197,35 @@ function switchDevice(id) {
document.getElementById('device-settings-port').value = activeDevice.port || '';
document.getElementById('device-settings-pin').checked = activeDevice.pinIndex;
if(activeDevice.plugin.config.mayChangePort){
document.getElementById('device-settings-port').disabled = false;
}else{
document.getElementById('device-settings-port').disabled = true;
}
document.getElementById('device-settings-fields').innerHTML = "";
if(activeDevice.plugin.config.fields){
let fields = activeDevice.plugin.config.fields;
fields.forEach(field => {
let $elem = document.createElement("input");
$elem.type = "text";
$elem.value = activeDevice.fields[field.key] || field.value;
$elem.name = field.key;
$elem.onchange = function(e){
activeDevice.fields[field.key] = $elem.value;
field.action(activeDevice);
}
if(field.type=="textinput"){
let rowHTML =`<tr><th>${field.label}:</th><td colspan="3" id="${field.key}"></td></tr>`;
document.getElementById('device-settings-fields').insertAdjacentHTML("beforeend", rowHTML);
document.getElementById(field.key).appendChild($elem);
}
});
}
ipcRenderer.send('enableDeviceDropdown', '');
ipcRenderer.send('setDevicePin', !DEVICE.all[id].pinIndex === false);
};
@@ -303,8 +332,8 @@ function populatePluginLists() {
Object.keys(PLUGINS.all).forEach((pluginType) => {
const plugin = PLUGINS.all[pluginType];
addSelect += `<option value='${pluginType}'>${plugin.defaultName}</option>`;
typeSelect += `<option value='${pluginType}'>${plugin.defaultName}</option>`;
addSelect += `<option value='${pluginType}'>${plugin.config.defaultName}</option>`;
typeSelect += `<option value='${pluginType}'>${plugin.config.defaultName}</option>`;
});
document.getElementById('device-settings-plugin-dropdown').innerHTML = typeSelect;