diff --git a/preload.js b/preload.js index 8464370..17267c1 100644 --- a/preload.js +++ b/preload.js @@ -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(); diff --git a/src/device.js b/src/device.js index a743c0f..c6c2c48 100644 --- a/src/device.js +++ b/src/device.js @@ -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; diff --git a/src/saveSlots.js b/src/saveSlots.js index bd9a8d0..1a95a53 100644 --- a/src/saveSlots.js +++ b/src/saveSlots.js @@ -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; diff --git a/src/search.js b/src/search.js index 9367510..356f49a 100644 --- a/src/search.js +++ b/src/search.js @@ -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' + ); }); } });