diff --git a/package-lock.json b/package-lock.json index aaa32d8..9c89545 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.1", "license": "CC BY-SA 4.0", "dependencies": { + "@jwetzell/posistagenet": "^0.0.1", "atem-connection": "^3.3.0", "bonjour": "^3.5.0", "electron-updater": "^6.1.1", @@ -307,6 +308,14 @@ "node": ">=14.15" } }, + "node_modules/@jwetzell/posistagenet": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@jwetzell/posistagenet/-/posistagenet-0.0.1.tgz", + "integrity": "sha512-fYghe5oNVZo1cXcH4ifvsUV56YCiEcxNWYTOna+1rs9HN5xEiqzFLZWnVKhJ9FQFxIHNsdiiZoD7G4oZ61DrGg==", + "dependencies": { + "binary-parser": "^2.2.1" + } + }, "node_modules/@malept/cross-spawn-promise": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", @@ -1129,6 +1138,14 @@ } ] }, + "node_modules/binary-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/binary-parser/-/binary-parser-2.2.1.tgz", + "integrity": "sha512-5ATpz/uPDgq5GgEDxTB4ouXCde7q2lqAQlSdBRQVl/AJnxmQmhIfyxJx+0MGu//D5rHQifkfGbWWlaysG0o9NA==", + "engines": { + "node": ">=12" + } + }, "node_modules/bitdepth": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/bitdepth/-/bitdepth-7.0.2.tgz", @@ -5348,6 +5365,14 @@ "pkg-prebuilds": "^0.2.1" } }, + "@jwetzell/posistagenet": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@jwetzell/posistagenet/-/posistagenet-0.0.1.tgz", + "integrity": "sha512-fYghe5oNVZo1cXcH4ifvsUV56YCiEcxNWYTOna+1rs9HN5xEiqzFLZWnVKhJ9FQFxIHNsdiiZoD7G4oZ61DrGg==", + "requires": { + "binary-parser": "^2.2.1" + } + }, "@malept/cross-spawn-promise": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", @@ -5943,6 +5968,11 @@ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, + "binary-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/binary-parser/-/binary-parser-2.2.1.tgz", + "integrity": "sha512-5ATpz/uPDgq5GgEDxTB4ouXCde7q2lqAQlSdBRQVl/AJnxmQmhIfyxJx+0MGu//D5rHQifkfGbWWlaysG0o9NA==" + }, "bitdepth": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/bitdepth/-/bitdepth-7.0.2.tgz", diff --git a/package.json b/package.json index 793e742..e716a30 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "prettier": "^3.0.2" }, "dependencies": { + "@jwetzell/posistagenet": "^0.0.1", "atem-connection": "^3.3.0", "bonjour": "^3.5.0", "electron-updater": "^6.1.1", diff --git a/plugins/posistagenet/icon.png b/plugins/posistagenet/icon.png new file mode 100644 index 0000000..6b45f09 Binary files /dev/null and b/plugins/posistagenet/icon.png differ diff --git a/plugins/posistagenet/info.html b/plugins/posistagenet/info.html new file mode 100644 index 0000000..40798ac --- /dev/null +++ b/plugins/posistagenet/info.html @@ -0,0 +1 @@ +

PosiStageNet requires no configuration.

diff --git a/plugins/posistagenet/main.js b/plugins/posistagenet/main.js new file mode 100644 index 0000000..7c55407 --- /dev/null +++ b/plugins/posistagenet/main.js @@ -0,0 +1,51 @@ +const { Decoder } = require('@jwetzell/posistagenet'); + +exports.config = { + defaultName: 'PosiStageNet', + connectionType: 'multicast', + port: 56565, + remotePort: 56565, + mayChangePorts: false, + heartbeatInterval: 5000, + heartbeatTimeout: 15000, + searchOptions: { + type: 'multicast', + address: getMulticastGroup(1), + port: 56565, + validateResponse(msg, info) { + return true; + }, + }, +}; + +exports.ready = function ready(_device) { + console.log('posistagenet is ready'); + const device = _device; + device.psn = new Decoder(); + + const networkInterfaces = device.getNetworkInterfaces(); + + Object.keys(networkInterfaces).forEach((networkInterfaceID) => { + const networkInterface = networkInterfaces[networkInterfaceID]; + device.connection.addMembership(getMulticastGroup(1), networkInterface[0].address); + }); +}; + +exports.data = function data(_device, buf) { + const device = _device; + if (device.psn) { + device.psn.decode(buf); + device.data = { + data: device.psn.data, + info: device.psn.info, + }; + } +}; + +exports.heartbeat = function heartbeat(device) {}; + +exports.update = function update(_device, doc, updateType, updateData) {}; + +function getMulticastGroup(universe) { + return `236.10.10.10`; +} diff --git a/plugins/posistagenet/styles.css b/plugins/posistagenet/styles.css new file mode 100644 index 0000000..60ef375 --- /dev/null +++ b/plugins/posistagenet/styles.css @@ -0,0 +1,3 @@ +[id^='tracker-'] { + color: white; +} diff --git a/plugins/posistagenet/template.ejs b/plugins/posistagenet/template.ejs new file mode 100644 index 0000000..0e8684e --- /dev/null +++ b/plugins/posistagenet/template.ejs @@ -0,0 +1,16 @@ +
+

<%= data.info.system_name ? data.info.system_name : '' %> PosiStageNet

+
+ +
+

Tracker Count: <%= Object.keys(data.data.trackers).length %>

+ <% Object.entries(data.info.trackers).forEach(([trackerId,trackerInfo]) => { + + %> + +
+ <%= trackerInfo.name %> +
+ + <% }); %> +
\ No newline at end of file