bugfix #46 dupe device loading

This commit is contained in:
sparks-alec
2023-01-08 21:47:15 -05:00
parent a54298dc88
commit e5cba677db
4 changed files with 84 additions and 54 deletions
+9 -6
View File
@@ -95,12 +95,15 @@ window.init = function init() {
};
document.getElementById('add-device-button').onchange = function addDeviceClick(e) {
DEVICE.registerDevice({
type: e.target.value,
defaultName: 'New Device',
port: undefined,
addresses: [],
});
DEVICE.registerDevice(
{
type: e.target.value,
defaultName: 'New Device',
port: undefined,
addresses: [],
},
'fromAddButton'
);
e.target.selectedIndex = 0;
SAVESLOTS.saveAll();
+25 -12
View File
@@ -12,7 +12,7 @@ const SEARCH = require('./search.js');
const devices = {};
module.exports.all = devices;
function registerDevice(newDevice) {
function registerDevice(newDevice, discoveryMethod) {
if (PLUGINS.all[newDevice.type] === undefined) {
console.error(`Plugin for device ${newDevice.type} does not exist.`);
return true;
@@ -23,17 +23,9 @@ function registerDevice(newDevice) {
initElements[i].style.display = 'none';
}
// only register device if it hasn't already been added
if (newDevice.addresses.length > 0) {
const existing = _.find(devices, (e) => {
const typeMatch = e.type === newDevice.type;
const addressMatch = JSON.stringify(e.addresses) === JSON.stringify(newDevice.addresses);
return typeMatch && addressMatch;
});
if (existing) {
return false;
}
// prevent duplicate devices from being added via search
if (isDeviceAlreadyAdded(newDevice) && discoveryMethod === 'fromSearch') {
return false;
}
// console.log("Registered new "+newDevice.type)
@@ -331,3 +323,24 @@ function heartbeat() {
// }
}
setInterval(heartbeat, 100);
function isDeviceAlreadyAdded(newDevice) {
let deviceAlreadyAdded = false;
if (newDevice.addresses.length === 0) {
return false;
}
for (let i = 0; i < Object.keys(devices).length; i++) {
const device = devices[Object.keys(devices)[i]];
const typeMatch = device.type === newDevice.type;
const addressMatch = JSON.stringify(device.addresses) === JSON.stringify(newDevice.addresses);
const idMatch = device.id === newDevice.id;
if (typeMatch && addressMatch && !idMatch) {
deviceAlreadyAdded = true;
break;
}
}
return deviceAlreadyAdded;
}
module.exports.isDeviceAlreadyAdded = isDeviceAlreadyAdded;
+14 -12
View File
@@ -25,6 +25,7 @@ if (storedDevices) {
function loadSlot(slotIndex) {
VIEW.toggleSlotButtons(slotIndex);
activeSlot = slotIndex;
console.log(DEVICE.all);
Object.keys(DEVICE.all).forEach((d) => {
DEVICE.changePinIndex(DEVICE.all[d], false);
@@ -57,15 +58,18 @@ module.exports.loadDevices = function loadDevices() {
console.log(`Loading ${savedDevices.length} saved devices...`);
for (let i = 0; i < savedDevices.length; i++) {
DEVICE.registerDevice({
type: savedDevices[i].type,
displayName: savedDevices[i].displayName,
defaultName: savedDevices[i].defaultName,
port: savedDevices[i].port,
addresses: savedDevices[i].addresses,
id: savedDevices[i].id,
fields: savedDevices[i].fields,
});
DEVICE.registerDevice(
{
type: savedDevices[i].type,
displayName: savedDevices[i].displayName,
defaultName: savedDevices[i].defaultName,
port: savedDevices[i].port,
addresses: savedDevices[i].addresses,
id: savedDevices[i].id,
fields: savedDevices[i].fields,
},
'fromSave'
);
}
};
@@ -96,9 +100,7 @@ module.exports.saveAll = function saveAll() {
});
localStorage.setItem('savedSlots', JSON.stringify(savedSlots));
console.log(
`Saved ${currentPins.length} pinned devices to slot ${activeSlot}!`
);
console.log(`Saved ${currentPins.length} pinned devices to slot ${activeSlot}!`);
savedDevices = [];
let i = 0;
+36 -24
View File
@@ -123,12 +123,15 @@ function searchBonjour(pluginType, pluginConfig) {
}
});
DEVICE.registerDevice({
type: pluginType,
defaultName: e.name,
port: e.port,
addresses: validAddresses,
});
DEVICE.registerDevice(
{
type: pluginType,
defaultName: e.name,
port: e.port,
addresses: validAddresses,
},
'fromSearch'
);
});
}
@@ -147,12 +150,15 @@ function TCPtest(ipAddr, pluginType, pluginConfig) {
client.end(
'',
'utf8',
DEVICE.registerDevice({
type: pluginType,
defaultName: pluginConfig.defaultName,
port: pluginConfig.defaultPort,
addresses: [ipAddr],
})
DEVICE.registerDevice(
{
type: pluginType,
defaultName: pluginConfig.defaultName,
port: pluginConfig.defaultPort,
addresses: [ipAddr],
},
'fromSearch'
)
);
}
});
@@ -172,12 +178,15 @@ function searchUDP(pluginType, pluginConfig) {
searchSockets[j].on('message', (msg, info) => {
if (pluginConfig.searchOptions.validateResponse(msg, info, DEVICE.all)) {
searchSockets[j].close();
DEVICE.registerDevice({
type: pluginType,
defaultName: pluginConfig.defaultName,
port: pluginConfig.defaultPort,
addresses: [info.address],
});
DEVICE.registerDevice(
{
type: pluginType,
defaultName: pluginConfig.defaultName,
port: pluginConfig.defaultPort,
addresses: [info.address],
},
'fromSearch'
);
}
});
});
@@ -201,12 +210,15 @@ function searchMulticast(pluginType, pluginConfig) {
socket.on('message', (msg, info) => {
if (pluginConfig.searchOptions.validateResponse(msg, info)) {
socket.close(() => {
DEVICE.registerDevice({
type: pluginType,
defaultName: pluginConfig.defaultName,
port: pluginConfig.defaultPort,
addresses: [info.address],
});
DEVICE.registerDevice(
{
type: pluginType,
defaultName: pluginConfig.defaultName,
port: pluginConfig.defaultPort,
addresses: [info.address],
},
'fromSearch'
);
});
}
});