mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2025-03-01 10:33:28 +00:00
integrated webserver ... (#697)
* initial commit of webconfig * update example config with webconfig and fix format of file update debian postinst script for install example config
This commit is contained in:
534
assets/webconfig/js/app/controllers/AppController.js
Normal file
534
assets/webconfig/js/app/controllers/AppController.js
Normal file
@@ -0,0 +1,534 @@
|
||||
/*global define */
|
||||
define([
|
||||
'lib/stapes', 'views/MainView', 'models/Settings', 'views/SettingsView', 'views/EffectsView', 'views/TransformView', 'data/ServerControl', 'api/Socket', 'api/Network'
|
||||
], function (Stapes, MainView, Settings, SettingsView, EffectsView, TransformView, ServerControl, Socket, Network) {
|
||||
'use strict';
|
||||
var network = new Network();
|
||||
|
||||
return Stapes.subclass(/** @lends AppController.prototype */{
|
||||
/**
|
||||
* @type MainView
|
||||
*/
|
||||
mainView: null,
|
||||
/**
|
||||
* @type SettingsView
|
||||
*/
|
||||
settingsView: null,
|
||||
/**
|
||||
* @type EffectsView
|
||||
*/
|
||||
effectsView: null,
|
||||
/**
|
||||
* @type TransformView
|
||||
*/
|
||||
transformView: null,
|
||||
/**
|
||||
* @type Settings
|
||||
*/
|
||||
settings: null,
|
||||
/**
|
||||
* @type ServerControl
|
||||
*/
|
||||
serverControl: null,
|
||||
color: {
|
||||
r: 25,
|
||||
g: 25,
|
||||
b: 25
|
||||
},
|
||||
effects: [],
|
||||
transform: {},
|
||||
selectedServer: null,
|
||||
|
||||
/**
|
||||
* @class AppController
|
||||
* @constructs
|
||||
*/
|
||||
constructor: function () {
|
||||
this.mainView = new MainView();
|
||||
this.settingsView = new SettingsView();
|
||||
this.effectsView = new EffectsView();
|
||||
this.transformView = new TransformView();
|
||||
|
||||
this.settings = new Settings();
|
||||
|
||||
this.bindEventHandlers();
|
||||
this.mainView.setColor(this.color);
|
||||
|
||||
if (!network.canDetectLocalAddress()) {
|
||||
this.settingsView.enableDetectButton(false);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Do initialization
|
||||
*/
|
||||
init: function () {
|
||||
this.settings.load();
|
||||
},
|
||||
|
||||
/**
|
||||
* @private
|
||||
*/
|
||||
bindEventHandlers: function () {
|
||||
this.settings.on({
|
||||
'loaded': function () {
|
||||
var i;
|
||||
|
||||
for (i = 0; i < this.settings.servers.length; i++) {
|
||||
if (this.settings.servers[i].selected) {
|
||||
this.selectedServer = this.settings.servers[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
this.settingsView.fillServerList(this.settings.servers);
|
||||
|
||||
if (!this.selectedServer) {
|
||||
this.gotoArea('settings');
|
||||
} else {
|
||||
this.connectToServer(this.selectedServer);
|
||||
}
|
||||
},
|
||||
'error': function (message) {
|
||||
this.showError(message);
|
||||
},
|
||||
'serverAdded': function (server) {
|
||||
var i;
|
||||
for (i = 0; i < this.settings.servers.length; i++) {
|
||||
if (this.settings.servers[i].selected) {
|
||||
this.selectedServer = this.settings.servers[i];
|
||||
this.connectToServer(server);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
this.settingsView.fillServerList(this.settings.servers);
|
||||
},
|
||||
'serverChanged': function (server) {
|
||||
var i;
|
||||
for (i = 0; i < this.settings.servers.length; i++) {
|
||||
if (this.settings.servers[i].selected) {
|
||||
this.selectedServer = this.settings.servers[i];
|
||||
this.connectToServer(server);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
this.settingsView.fillServerList(this.settings.servers);
|
||||
this.connectToServer(server);
|
||||
},
|
||||
'serverRemoved': function () {
|
||||
var i, removedSelected = true;
|
||||
this.settingsView.fillServerList(this.settings.servers);
|
||||
|
||||
for (i = 0; i < this.settings.servers.length; i++) {
|
||||
if (this.settings.servers[i].selected) {
|
||||
removedSelected = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (removedSelected) {
|
||||
this.selectedServer = null;
|
||||
if (this.serverControl) {
|
||||
this.serverControl.disconnect();
|
||||
}
|
||||
this.effectsView.clear();
|
||||
this.transformView.clear();
|
||||
}
|
||||
}
|
||||
}, this);
|
||||
|
||||
this.mainView.on({
|
||||
'barClick': function (id) {
|
||||
if (id !== 'settings') {
|
||||
if (!this.selectedServer) {
|
||||
this.showError('No server selected');
|
||||
} else if (!this.serverControl) {
|
||||
this.connectToServer(this.selectedServer);
|
||||
}
|
||||
}
|
||||
this.gotoArea(id);
|
||||
},
|
||||
'colorChange': function (color) {
|
||||
this.color = color;
|
||||
|
||||
if (!this.selectedServer) {
|
||||
this.showError('No server selected');
|
||||
} else if (!this.serverControl) {
|
||||
this.connectToServer(this.selectedServer, function () {
|
||||
this.serverControl.setColor(color, this.selectedServer.duration);
|
||||
}.bind(this));
|
||||
} else {
|
||||
this.serverControl.setColor(color, this.selectedServer.duration);
|
||||
}
|
||||
},
|
||||
'clear': function () {
|
||||
if (!this.selectedServer) {
|
||||
this.showError('No server selected');
|
||||
} else if (!this.serverControl) {
|
||||
this.connectToServer(this.selectedServer, function () {
|
||||
this.serverControl.clear();
|
||||
}.bind(this));
|
||||
} else {
|
||||
this.serverControl.clear();
|
||||
}
|
||||
},
|
||||
'clearall': function () {
|
||||
if (!this.selectedServer) {
|
||||
this.showError('No server selected');
|
||||
} else if (!this.serverControl) {
|
||||
this.connectToServer(this.selectedServer, function () {
|
||||
this.serverControl.clearall();
|
||||
this.mainView.setColor({r: 0, g: 0, b: 0});
|
||||
}.bind(this));
|
||||
} else {
|
||||
this.serverControl.clearall();
|
||||
this.mainView.setColor({r: 0, g: 0, b: 0});
|
||||
}
|
||||
}
|
||||
}, this);
|
||||
|
||||
this.settingsView.on({
|
||||
'serverAdded': function (server) {
|
||||
if (server.address && server.port) {
|
||||
server.priority = server.priority || 50;
|
||||
this.settings.addServer(server);
|
||||
this.lockSettingsView(false);
|
||||
} else {
|
||||
this.showError('Invalid server data');
|
||||
}
|
||||
},
|
||||
'serverAddCanceled': function () {
|
||||
this.lockSettingsView(false);
|
||||
this.settingsView.fillServerList(this.settings.servers);
|
||||
},
|
||||
'serverEditCanceled': function () {
|
||||
this.lockSettingsView(false);
|
||||
this.settingsView.fillServerList(this.settings.servers);
|
||||
},
|
||||
'serverSelected': function (index) {
|
||||
this.lockSettingsView(false);
|
||||
this.settings.setSelectedServer(index);
|
||||
},
|
||||
'serverRemoved': function (index) {
|
||||
this.settings.removeServer(index);
|
||||
},
|
||||
'serverChanged': function (data) {
|
||||
if (data.server.address && data.server.port) {
|
||||
data.server.priority = data.server.priority || 50;
|
||||
this.settings.updateServer(data.index, data.server);
|
||||
this.lockSettingsView(false);
|
||||
} else {
|
||||
this.showError('Invalid server data');
|
||||
}
|
||||
},
|
||||
'editServer': function (index) {
|
||||
var server = this.settings.servers[index];
|
||||
this.settingsView.editServer({index: index, server: server});
|
||||
},
|
||||
'durationChanged': function (value) {
|
||||
this.settings.duration = value;
|
||||
this.settings.save();
|
||||
},
|
||||
'detect': function () {
|
||||
this.lockSettingsView(true);
|
||||
this.settingsView.showWaiting(true);
|
||||
this.searchForServer(function (server) {
|
||||
this.settings.addServer(server);
|
||||
}.bind(this), function () {
|
||||
this.lockSettingsView(false);
|
||||
this.settingsView.showWaiting(false);
|
||||
}.bind(this));
|
||||
}
|
||||
}, this);
|
||||
|
||||
this.effectsView.on({
|
||||
'effectSelected': function (effectId) {
|
||||
if (!this.serverControl) {
|
||||
this.connectToServer(this.selectedServer, function () {
|
||||
this.serverControl.runEffect(this.effects[parseInt(effectId)]);
|
||||
}.bind(this));
|
||||
} else {
|
||||
this.serverControl.runEffect(this.effects[parseInt(effectId)]);
|
||||
}
|
||||
}
|
||||
}, this);
|
||||
|
||||
this.transformView.on({
|
||||
'gamma': function (data) {
|
||||
if (data.r) {
|
||||
this.transform.gamma[0] = data.r;
|
||||
} else if (data.g) {
|
||||
this.transform.gamma[1] = data.g;
|
||||
} else if (data.b) {
|
||||
this.transform.gamma[2] = data.b;
|
||||
}
|
||||
|
||||
if (this.serverControl) {
|
||||
this.serverControl.setTransform(this.transform);
|
||||
}
|
||||
},
|
||||
'whitelevel': function (data) {
|
||||
if (data.r) {
|
||||
this.transform.whitelevel[0] = data.r;
|
||||
} else if (data.g) {
|
||||
this.transform.whitelevel[1] = data.g;
|
||||
} else if (data.b) {
|
||||
this.transform.whitelevel[2] = data.b;
|
||||
}
|
||||
|
||||
if (this.serverControl) {
|
||||
this.serverControl.setTransform(this.transform);
|
||||
}
|
||||
},
|
||||
'blacklevel': function (data) {
|
||||
if (data.r) {
|
||||
this.transform.blacklevel[0] = data.r;
|
||||
} else if (data.g) {
|
||||
this.transform.blacklevel[1] = data.g;
|
||||
} else if (data.b) {
|
||||
this.transform.blacklevel[2] = data.b;
|
||||
}
|
||||
|
||||
if (this.serverControl) {
|
||||
this.serverControl.setTransform(this.transform);
|
||||
}
|
||||
},
|
||||
'threshold': function (data) {
|
||||
if (data.r) {
|
||||
this.transform.threshold[0] = data.r;
|
||||
} else if (data.g) {
|
||||
this.transform.threshold[1] = data.g;
|
||||
} else if (data.b) {
|
||||
this.transform.threshold[2] = data.b;
|
||||
}
|
||||
|
||||
if (this.serverControl) {
|
||||
this.serverControl.setTransform(this.transform);
|
||||
}
|
||||
},
|
||||
'hsv': function (data) {
|
||||
if (data.valueGain) {
|
||||
this.transform.valueGain = data.valueGain;
|
||||
} else if (data.saturationGain) {
|
||||
this.transform.saturationGain = data.saturationGain;
|
||||
}
|
||||
|
||||
if (this.serverControl) {
|
||||
this.serverControl.setTransform(this.transform);
|
||||
}
|
||||
}
|
||||
}, this);
|
||||
},
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @param id
|
||||
*/
|
||||
gotoArea: function (id) {
|
||||
this.mainView.scrollToArea(id);
|
||||
},
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @param server
|
||||
*/
|
||||
connectToServer: function (server, onConnected) {
|
||||
if (this.serverControl) {
|
||||
if (this.serverControl.isConnecting()) {
|
||||
return;
|
||||
}
|
||||
this.serverControl.off();
|
||||
this.serverControl.disconnect();
|
||||
this.transformView.clear();
|
||||
this.effectsView.clear();
|
||||
}
|
||||
|
||||
this.serverControl = new ServerControl(server, Socket);
|
||||
this.serverControl.on({
|
||||
connected: function () {
|
||||
this.serverControl.getServerInfo();
|
||||
},
|
||||
serverInfo: function (info) {
|
||||
var index;
|
||||
if (!this.selectedServer.name || this.selectedServer.name.length === 0) {
|
||||
this.selectedServer.name = info.hostname;
|
||||
index = this.settings.indexOfServer(this.selectedServer);
|
||||
this.settings.updateServer(index, this.selectedServer);
|
||||
this.settingsView.fillServerList(this.settings.servers);
|
||||
}
|
||||
this.effects = info.effects;
|
||||
this.transform = info.transform[0];
|
||||
this.updateView();
|
||||
this.showStatus('Connected to ' + this.selectedServer.name);
|
||||
if (onConnected) {
|
||||
onConnected();
|
||||
}
|
||||
},
|
||||
error: function (message) {
|
||||
this.serverControl = null;
|
||||
this.showError(message);
|
||||
}
|
||||
}, this);
|
||||
this.serverControl.connect();
|
||||
},
|
||||
|
||||
/**
|
||||
* @private
|
||||
*/
|
||||
updateView: function () {
|
||||
var i, effects = [];
|
||||
if (this.effects) {
|
||||
for (i = 0; i < this.effects.length; i++) {
|
||||
effects.push({id: i, name: this.effects[i].name});
|
||||
}
|
||||
}
|
||||
|
||||
this.effectsView.clear();
|
||||
this.effectsView.fillList(effects);
|
||||
|
||||
this.transformView.clear();
|
||||
this.transformView.fillList(this.transform);
|
||||
},
|
||||
|
||||
/**
|
||||
* Shows the error text
|
||||
* @param {string} error - Error message
|
||||
*/
|
||||
showError: function (error) {
|
||||
this.mainView.showError(error);
|
||||
},
|
||||
|
||||
/**
|
||||
* Shows a message
|
||||
* @param {string} message - Text to show
|
||||
*/
|
||||
showStatus: function (message) {
|
||||
this.mainView.showStatus(message);
|
||||
},
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @param lock
|
||||
*/
|
||||
lockSettingsView: function (lock) {
|
||||
if (network.canDetectLocalAddress()) {
|
||||
this.settingsView.enableDetectButton(!lock);
|
||||
}
|
||||
this.settingsView.lockList(lock);
|
||||
},
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @param onFound
|
||||
* @param onEnd
|
||||
*/
|
||||
searchForServer: function (onFound, onEnd) {
|
||||
network.getLocalInterfaces(function (ips) {
|
||||
if (ips.length === 0) {
|
||||
onEnd();
|
||||
return;
|
||||
}
|
||||
|
||||
function checkInterface (localInterfaceAddress, ciOnFinished) {
|
||||
var index, ipParts, addr;
|
||||
|
||||
index = 1;
|
||||
ipParts = localInterfaceAddress.split('.');
|
||||
ipParts[3] = index;
|
||||
addr = ipParts.join('.');
|
||||
|
||||
function checkAddressRange (startAddress, count, carOnFinished) {
|
||||
var ipParts, i, addr, cbCounter = 0, last;
|
||||
|
||||
function checkAddress (address, port, caOnFinished) {
|
||||
var server = new ServerControl({'address': address, 'port': port}, Socket);
|
||||
server.on({
|
||||
'error': function () {
|
||||
server.disconnect();
|
||||
caOnFinished();
|
||||
},
|
||||
'connected': function () {
|
||||
server.getServerInfo();
|
||||
},
|
||||
'serverInfo': function (result) {
|
||||
var serverInfo = {
|
||||
'address': address,
|
||||
'port': port,
|
||||
'priority': 50
|
||||
};
|
||||
server.disconnect();
|
||||
|
||||
if (result.hostname) {
|
||||
serverInfo.name = result.hostname;
|
||||
}
|
||||
|
||||
caOnFinished(serverInfo);
|
||||
}
|
||||
});
|
||||
server.connect();
|
||||
}
|
||||
|
||||
function checkAddressDoneCb (serverInfo) {
|
||||
var ipParts, nextAddr;
|
||||
|
||||
if (serverInfo && onFound) {
|
||||
onFound(serverInfo);
|
||||
}
|
||||
|
||||
cbCounter++;
|
||||
if (cbCounter === count) {
|
||||
ipParts = startAddress.split('.');
|
||||
ipParts[3] = parseInt(ipParts[3]) + count;
|
||||
nextAddr = ipParts.join('.');
|
||||
carOnFinished(nextAddr);
|
||||
}
|
||||
}
|
||||
|
||||
ipParts = startAddress.split('.');
|
||||
last = parseInt(ipParts[3]);
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
ipParts[3] = last + i;
|
||||
addr = ipParts.join('.');
|
||||
|
||||
checkAddress(addr, 19444, checkAddressDoneCb);
|
||||
}
|
||||
}
|
||||
|
||||
function checkAddressRangeCb (nextAddr) {
|
||||
var ipParts, count = 64, lastPart;
|
||||
|
||||
ipParts = nextAddr.split('.');
|
||||
lastPart = parseInt(ipParts[3]);
|
||||
if (lastPart === 255) {
|
||||
ciOnFinished();
|
||||
return;
|
||||
} else if (lastPart + 64 > 254) {
|
||||
count = 255 - lastPart;
|
||||
}
|
||||
|
||||
checkAddressRange(nextAddr, count, checkAddressRangeCb);
|
||||
}
|
||||
|
||||
// do search in chunks because the dispatcher used in the ios socket plugin can handle only 64 threads
|
||||
checkAddressRange(addr, 64, checkAddressRangeCb);
|
||||
}
|
||||
|
||||
function checkInterfaceCb () {
|
||||
if (ips.length === 0) {
|
||||
onEnd();
|
||||
} else {
|
||||
checkInterface(ips.pop(), checkInterfaceCb);
|
||||
}
|
||||
}
|
||||
|
||||
checkInterface(ips.pop(), checkInterfaceCb);
|
||||
|
||||
}.bind(this), function (error) {
|
||||
this.showError(error);
|
||||
}.bind(this));
|
||||
}
|
||||
});
|
||||
});
|
Reference in New Issue
Block a user