diff --git a/plugins/digico/fader.ejs b/plugins/digico/fader.ejs new file mode 100644 index 0000000..3cc3979 --- /dev/null +++ b/plugins/digico/fader.ejs @@ -0,0 +1,36 @@ + + <%=index%> + + <% if(type=="Control_Groups"){ %> + + <%= fader ? fader.name : "-" %> + + <% }else if(type=="Input_Channels"){ %> + + <%= fader ? (fader.Channel_Input ? fader.Channel_Input.name: "") : "" %> + + <% }else if(type=="Group_Outputs"){ %> + + <%= fader ? (fader.Buss_Trim ? fader.Buss_Trim.name: "") : "" %> + + <% }else if(type=="Aux_Outputs"){ %> + + <%= fader ? (fader.Buss_Trim ? fader.Buss_Trim.name: "") : "" %> + + <% } %> + + + + <% if(fader){ %> + <% let percent = (fader.fader-10)*1.5+100 %> + + <% if(fader.fader>-100){ %> + <%= fader ? Math.round(fader.fader*10.0)/10.0 : '-' %>db + <% } %> + + <% }else{ %> + - + <% } %> + + + \ No newline at end of file diff --git a/plugins/digico/main.js b/plugins/digico/main.js index 6d59ad5..d7f153a 100644 --- a/plugins/digico/main.js +++ b/plugins/digico/main.js @@ -1,9 +1,13 @@ +const _ = require('lodash'); +const fs = require('fs'); +const path = require('path'); + exports.config = { defaultName: 'DiGiCo', connectionType: 'osc-udp', - defaultPort: 9000, - mayChangePort: false, - heartbeatInterval: 9000, + defaultPort: 8000, + mayChangePort: true, + heartbeatInterval: 2000, heartbeatTimeout: 11000, searchOptions: { type: 'UDPsocket', @@ -11,8 +15,8 @@ exports.config = { searchBuffer: Buffer.from([ 0x2f, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x4e, 0x61, 0x6d, 0x65, 0x2f, 0x3f, ]), - devicePort: 9000, - listenPort: 8000, + devicePort: 8000, + listenPort: 9000, validateResponse(msg, info) { console.log(msg); console.log(msg.toString()); @@ -28,18 +32,18 @@ exports.ready = function ready(_device) { device.send('/Console/Name/?'); device.send('/Console/Session/Filename/?'); device.send('/Console/Channels/?'); - device.send('/Console/Input_Channels/modes/?'); - device.send('/Console/Group_Outputs/modes/?'); - device.send('/Console/Aux_Outputs/modes/?'); - device.send('/Console/Multis/?'); - - device.send('/Snapshots/Surface_Snapshot/?'); + // device.send('/Console/Input_Channels/modes/?'); + // device.send('/Console/Group_Outputs/modes/?'); + // device.send('/Console/Aux_Outputs/modes/?'); + // device.send('/Console/Multis/?'); device.send('/Snapshots/Current_Snapshot/?'); - device.send('/Input_Channels/?'); + // device.send('/Input_Channels/?'); // no response - device.send('/Layout/Layout/Banks/?'); + // device.send('/Layout/Layout/Banks/?'); + + // console.log(device); // These are also sent by the iPad app but aren't queries (?) so may potentially write to console? // device.send('/Meters/clear'); @@ -49,12 +53,81 @@ exports.data = function data(_device, oscData) { const device = _device; this.deviceInfoUpdate(device, 'status', 'ok'); - console.log(oscData); - setObjectProperty(device.data, oscData.address, oscData.args); - console.log(device.data); + const properties = oscData.address.split('/'); + properties.shift(); + setObjectProperty(device.data, properties, oscData.args); + + // console.log(Object.keys(device.data.Control_Groups).length); + + // console.log(properties); + if (properties[1] === 'Control_Groups') { + for (let i = 1; i <= device.data.Console.Control_Groups; i++) { + device.send(`/Control_Groups/${i}/?`); + } + console.log('draw'); + device.draw(); + } else if (properties[0] === 'Control_Groups') { + device.update('updateFader', { + type: 'Control_Groups', + channel: properties[1], + }); + } else if (properties[0] === 'Console' && properties[1] === 'Input_Channels') { + // console.log(properties); + // console.log(device.data); + // device.send(`/Input_Channels/1/?`); + // device.send(`/Input_Channels/2/?`); + for (let i = 1; i <= device.data.Console.Input_Channels; i++) { + device.send(`/Input_Channels/${i}/Channel_Input/name`); + device.send(`/Input_Channels/${i}/mute/?`); + device.send(`/Input_Channels/${i}/solo/?`); + device.send(`/Input_Channels/${i}/fader/?`); + } + device.draw(); + } else if (properties[0] === 'Input_Channels') { + device.update('updateFader', { + type: 'Input_Channels', + channel: properties[1], + }); + } else if (properties[0] === 'Console' && properties[1] === 'Group_Outputs') { + for (let i = 1; i <= device.data.Console.Group_Outputs; i++) { + device.send(`/Group_Outputs/${i}/mute/?`); + device.send(`/Group_Outputs/${i}/solo/?`); + device.send(`/Group_Outputs/${i}/fader/?`); + device.send(`/Group_Outputs/${i}/Buss_Trim/name/?`); + } + device.draw(); + } else if (properties[0] === 'Group_Outputs') { + device.update('updateFader', { + type: 'Group_Outputs', + channel: properties[1], + }); + } else if (properties[0] === 'Console' && properties[1] === 'Aux_Outputs') { + for (let i = 1; i <= device.data.Console.Aux_Outputs; i++) { + device.send(`/Aux_Outputs/${i}/mute/?`); + device.send(`/Aux_Outputs/${i}/solo/?`); + device.send(`/Aux_Outputs/${i}/fader/?`); + device.send(`/Aux_Outputs/${i}/Buss_Trim/name/?`); + } + device.draw(); + } else if (properties[0] === 'Aux_Outputs') { + device.update('updateFader', { + type: 'Aux_Outputs', + channel: properties[1], + }); + } else if (properties[0] === 'Console' && properties[1] === 'Name') { + this.deviceInfoUpdate(device, 'defaultName', device.data.Console.Name); + } else if (properties[0] === 'Snapshots') { + device.update('updateSnapshot', { + snapshots: device.data.Snapshots, + }); + } }; -exports.heartbeat = function heartbeat(device) {}; +exports.heartbeat = function heartbeat(device) { + device.send('/Console/Name/?'); + // device.draw(); + console.log(device.data); +}; class DiGiCo { constructor() { @@ -80,10 +153,10 @@ class DiGiCo { } */ -function setObjectProperty(_object, path, value) { +function setObjectProperty(_object, _properties, value) { let object = _object; - const properties = path.split('/'); - properties.shift(); + const properties = _properties; + for (let i = 0; i < properties.length - 1; i++) { const property = properties[i]; if (object[property] === undefined) { @@ -101,3 +174,18 @@ function setObjectProperty(_object, path, value) { } object[property] = value; } + +const faderTemplate = _.template(fs.readFileSync(path.join(__dirname, `/fader.ejs`))); +exports.update = function update(device, doc, updateType, data) { + if (updateType === 'updateFader') { + const $elem = doc.getElementById(`${data.type}-${data.channel}`); + $elem.outerHTML = faderTemplate({ + type: data.type, + fader: device.data[data.type][data.channel], + index: data.channel, + }); + } else if (updateType === 'updateSnapshot') { + const $elem = doc.getElementById(`snapshot`); + $elem.textContent = `${data.snapshots.Current_Snapshot}`; + } +}; diff --git a/plugins/digico/styles.css b/plugins/digico/styles.css index e69de29..373e762 100644 --- a/plugins/digico/styles.css +++ b/plugins/digico/styles.css @@ -0,0 +1,76 @@ +.column { + float: left; + margin: 5px; +} +.section { + border: #333 3px solid; + border-bottom: none; + border-top-left-radius: 10px; + border-top-right-radius: 10px; + padding: 10px; + margin-bottom: 30px; +} +.section h3 { + font-weight: 300; + margin-top: 0px; + color: #aaa !important; +} +table { + border-collapse: collapse; + display: block; +} +.fader:nth-child(even) { + background: #1a1a1a; +} +.fader:nth-child(odd) { + background: #1f1f1f; +} +.fader td { + text-align: center; + width: 30px; + height: 20px; + border: black 1px solid; +} +.fader .fader-channel { + color: #444; + font-size: 10px; +} +.fader .fader-name { + width: 80px; + color: black; + font-family: monospace; +} +.fader .lcd-control-group { + background-color: rgb(66, 132, 255); +} +.fader .lcd-channel-input { + background-color: rgb(135, 175, 235); +} +.fader .lcd-group-output { + background-color: rgb(241, 71, 48); +} +.fader .lcd-aux-output { + background-color: rgb(197, 0, 187); +} +.fader .fader-name.state-1 { + background-color: rgb(0, 185, 0); +} +.fader .fader-mute { + width: 10px; + background-color: #444; +} +.fader .fader-mute.state-1 { + background-color: red; +} +.fader .fader-fader { + text-align: left; + width: 70px; + padding: 0px 10px; + color: rgb(68, 68, 68); +} + +#snapshot { + font-size: 36px; + font-weight: bold; + font-family: 'Arial Black', 'Impact'; +} diff --git a/plugins/digico/template.ejs b/plugins/digico/template.ejs index 9cbb3ae..25667c2 100644 --- a/plugins/digico/template.ejs +++ b/plugins/digico/template.ejs @@ -2,3 +2,55 @@

<%= listName %>

<%= data.Console.Session.Filename %>

+ +<% +const fs = require('fs'); +let _ = require('lodash'); +const path = require('path'); + + let faderTemplate = _.template(fs.readFileSync(path.join(__dirname, `/plugins/digico/fader.ejs`))); +%> + +
+
+

snapshot

+
+ +
+

control groups

+ + <% for(let i=1; i<=data.Console.Control_Groups; i++){ %> + <%= faderTemplate({type: "Control_Groups", fader: data.Control_Groups[i], index: i}) %> + <% } %> +
+
+ +
+

group outputs

+ + <% for(let i=1; i<=data.Console.Group_Outputs; i++){ %> + <%= faderTemplate({type: "Group_Outputs", fader: data.Group_Outputs[i], index: i}) %> + <% } %> +
+
+ +
+

aux outputs

+ + <% for(let i=1; i<=data.Console.Aux_Outputs; i++){ %> + <%= faderTemplate({type: "Aux_Outputs", fader: data.Aux_Outputs[i], index: i}) %> + <% } %> +
+
+
+ +
+

input channels

+ + <% for(let i=1; i<=data.Console.Input_Channels; i++){ %> + <%= faderTemplate({type: "Input_Channels", fader: data.Input_Channels[i], index: i}) %> + <% } %> +
+
+ + diff --git a/src/device.js b/src/device.js index 9b51a29..91923bd 100644 --- a/src/device.js +++ b/src/device.js @@ -100,6 +100,7 @@ function initDeviceConnection(id) { if (plugins[type].config.connectionType.includes('udp')) { device.connection = new osc.UDPPort({ localAddress: '0.0.0.0', + localPort: 8001, // added this line remoteAddress: device.addresses[0], remotePort: device.port, });