webui: initial support for leddevice options (#232)

* initial support for leddevice options

* fix schema and editor init

* fix led editor labels and schema

* add some led schemas

* led config: insert current values. not yet perfect, but it works
This commit is contained in:
redPanther 2016-09-10 19:08:08 +02:00 committed by GitHub
parent 678624c959
commit 2d88cdc2d3
16 changed files with 191 additions and 22 deletions

View File

@ -10,7 +10,7 @@
<div class="col-lg-12"> <div class="col-lg-12">
<!-- <form id="grabberConfForm"></form>--> <!-- <form id="grabberConfForm"></form>-->
<div id='editor_container'/> <div id='editor_container'/>
<button id='submit'>Submit (console.log)</button> <button id='btn_submit'>Submit (console.log)</button>
</div> </div>
</div> </div>
</div> </div>

View File

@ -49,7 +49,10 @@
<select id="leddevices" class="form-control" style="color:black;width:auto;margin-left:10px;display:inline-block" /> <select id="leddevices" class="form-control" style="color:black;width:auto;margin-left:10px;display:inline-block" />
</div> </div>
<div class="panel-body"> <div class="panel-body">
... device specific options ... we need some cpp code extension to get schema for all leds <div id="ledDeviceOptions">
<div id='editor_container'></div>
<button id='btn_submit'>Submit (console.log)</button>
</div>
<div id="huebridge" class="container-fluid" style="display:none"> <div id="huebridge" class="container-fluid" style="display:none">

View File

@ -49,7 +49,7 @@ $(hyperion).one("cmd-config-getschema", function(event) {
$(document).ready( function() { $(document).ready( function() {
requestServerConfigSchema(); requestServerConfigSchema();
document.getElementById('submit').addEventListener('click',function() { document.getElementById('btn_submit').addEventListener('click',function() {
// Get the value from the editor // Get the value from the editor
//console.log(general_conf_editor.getValue()); //console.log(general_conf_editor.getValue());
}); });

View File

@ -15,10 +15,6 @@ $(document).ready( function() {
//Change all Checkboxes to Switches //Change all Checkboxes to Switches
$("[type='checkbox']").bootstrapSwitch(); $("[type='checkbox']").bootstrapSwitch();
$(hyperion).on("open",function(event){
requestServerInfo();
});
$(hyperion).on("cmd-serverinfo",function(event){ $(hyperion).on("cmd-serverinfo",function(event){
parsedServerInfoJSON = event.response; parsedServerInfoJSON = event.response;
currentVersion = parsedServerInfoJSON.info.hyperion[0].version; currentVersion = parsedServerInfoJSON.info.hyperion[0].version;
@ -57,9 +53,20 @@ $(document).ready( function() {
}); });
}); // end cmd-serverinfo }); // end cmd-serverinfo
$(hyperion).one("cmd-config-getschema", function(event) {
parsedConfSchemaJSON = event.response.result;
});
$(hyperion).on("error",function(event){ $(hyperion).on("error",function(event){
showErrorDialog("error", event.reason); showErrorDialog("error", event.reason);
}); });
$(hyperion).on("open",function(event){
requestServerConfigSchema();
requestServerInfo();
});
}); });
$(function(){ $(function(){

View File

@ -41,6 +41,7 @@ $(document).ready(function() {
} }
$("#leddevices").html(ledDevicesHtml); $("#leddevices").html(ledDevicesHtml);
$("#leddevices").val(server.info.ledDevices.active); $("#leddevices").val(server.info.ledDevices.active);
$("#leddevices").trigger("change");
}); });
// ------------------------------------------------------------------ // ------------------------------------------------------------------
@ -120,6 +121,48 @@ $(document).ready(function() {
}); });
$("#leddevices").off().on("change", function(event) { $("#leddevices").off().on("change", function(event) {
generalOptions = parsedConfSchemaJSON.properties.device;
specificOptions = parsedConfSchemaJSON.properties.alldevices[$(this).val()];
//$('#ledDeviceOptions').html(JSON.stringify(generalOptions)+"<br>"+JSON.stringify(specificOptions));
$('#editor_container').off();
$('#editor_container').html("");
var element = document.getElementById('editor_container');
var grabber_conf_editor = new JSONEditor(element,{
theme: 'bootstrap3',
disable_collapse: 'true',
form_name_root: 'sa',
disable_edit_json: 'true',
disable_properties: 'true',
no_additional_properties: 'true',
schema: {
title:' ',
properties: {
generalOptions,
specificOptions,
}
}
});
values_general = {};
values_specific = {};
isCurrentDevice = (server.info.ledDevices.active == parsedConfJSON.device.type);
for(var key in parsedConfJSON.device){
if (key in generalOptions.properties)
values_general[key] = parsedConfJSON.device[key];
};
grabber_conf_editor.setValue( { "generalOptions" : values_general, "specificOptions" : specificOptions });
if (isCurrentDevice)
{
for(var key in parsedConfJSON.device){
if (key in specificOptions.properties)
values_specific[key] = parsedConfJSON.device[key];
};
grabber_conf_editor.setValue( { "generalOptions" : values_general, "specificOptions" : values_specific });
};
if ($(this).val() == "philipshue") if ($(this).val() == "philipshue")
{ {
$("#huebridge").show(); $("#huebridge").show();

View File

@ -55,6 +55,8 @@ public:
static const LedDeviceRegistry& getDeviceMap(); static const LedDeviceRegistry& getDeviceMap();
static void setActiveDevice(std::string dev); static void setActiveDevice(std::string dev);
static std::string activeDevice() { return _activeDevice; }; static std::string activeDevice() { return _activeDevice; };
static Json::Value getLedDeviceSchemas();
protected: protected:
/// The common Logger instance for all LedDevices /// The common Logger instance for all LedDevices
Logger * _log; Logger * _log;

View File

@ -23,33 +23,34 @@
"device" : "device" :
{ {
"type" : "object", "type" : "object",
"title" : "LED Device", "title" : "LED Device General",
"required" : true, "required" : true,
"defaultProperties": ["name","ledCount","colorOrder"],
"properties" : "properties" :
{ {
"name" : "name" :
{ {
"type" : "string", "type" : "string",
"required" : true "required" : true,
"propertyOrder" : 1
}, },
"type" : "type" :
{ {
"type" : "string", "type" : "string",
"required" : true "required" : true
}, },
"output" : "ledCount" :
{
"type" : "string"
},
"rate" :
{ {
"type" : "integer", "type" : "integer",
"minimum" : 0 "minimum" : 0,
"title" : "Count of all hardware LEDs",
"propertyOrder" : 2
}, },
"colorOrder" : "colorOrder" :
{ {
"type" : "string", "type" : "string",
"enum" : ["rgb", "bgr", "rbg", "brg", "gbr", "grb"] "enum" : ["rgb", "bgr", "rbg", "brg", "gbr", "grb"],
"propertyOrder" : 3
} }
}, },
"additionalProperties" : true "additionalProperties" : true

View File

@ -911,6 +911,8 @@ void JsonClientConnection::handleSchemaGetCommand(const Json::Value & message, c
result["tan"] = tan; result["tan"] = tan;
Json::Value & schemaJson = result["result"]; Json::Value & schemaJson = result["result"];
// make sure the resources are loaded (they may be left out after static linking) // make sure the resources are loaded (they may be left out after static linking)
Q_INIT_RESOURCE(resource); Q_INIT_RESOURCE(resource);
@ -923,6 +925,7 @@ void JsonClientConnection::handleSchemaGetCommand(const Json::Value & message, c
{ {
throw std::runtime_error("ERROR: Json schema wrong: " + jsonReader.getFormattedErrorMessages()) ; throw std::runtime_error("ERROR: Json schema wrong: " + jsonReader.getFormattedErrorMessages()) ;
} }
result["result"]["properties"]["alldevices"] = LedDevice::getLedDeviceSchemas();
// send the result // send the result
sendMessage(result); sendMessage(result);

View File

@ -1,5 +1,10 @@
#include <leddevice/LedDevice.h> #include <leddevice/LedDevice.h>
#include <QResource>
#include <QStringList>
#include <QDir>
#include <json/json.h>
LedDeviceRegistry LedDevice::_ledDeviceMap = LedDeviceRegistry(); LedDeviceRegistry LedDevice::_ledDeviceMap = LedDeviceRegistry();
std::string LedDevice::_activeDevice = ""; std::string LedDevice::_activeDevice = "";
@ -10,6 +15,7 @@ LedDevice::LedDevice()
, _ledBuffer(0) , _ledBuffer(0)
{ {
LedDevice::getLedDeviceSchemas();
} }
// dummy implemention // dummy implemention
@ -32,4 +38,32 @@ const LedDeviceRegistry& LedDevice::getDeviceMap()
void LedDevice::setActiveDevice(std::string dev) void LedDevice::setActiveDevice(std::string dev)
{ {
_activeDevice = dev; _activeDevice = dev;
} }
Json::Value LedDevice::getLedDeviceSchemas()
{
// make sure the resources are loaded (they may be left out after static linking)
Q_INIT_RESOURCE(LedDeviceSchemas);
// read the json schema from the resource
QDir d(":/leddevices/");
QStringList l = d.entryList();
Json::Value result;
for(QString &item : l)
{
QResource schemaData(QString(":/leddevices/")+item);
std::string devName = item.remove("schema-").toStdString();
Json::Value & schemaJson = result[devName];
Json::Reader jsonReader;
if (!jsonReader.parse(reinterpret_cast<const char *>(schemaData.data()), reinterpret_cast<const char *>(schemaData.data()) + schemaData.size(), schemaJson, false))
{
Error(Logger::getInstance("LedDevice"), "LedDevice JSON schema error in %s (%s)", item.toUtf8().constData(), jsonReader.getFormattedErrorMessages().c_str() );
throw std::runtime_error("ERROR: Json schema wrong: " + jsonReader.getFormattedErrorMessages()) ;
}
schemaJson["title"] = "LED Device Specific";
}
return result;
}

View File

@ -1,5 +1,5 @@
<RCC> <RCC>
<qresource prefix="/"> <qresource prefix="/leddevices/">
<file alias="schema-adalightapa102">schemas/schema-adalightapa102.json</file> <file alias="schema-adalightapa102">schemas/schema-adalightapa102.json</file>
<file alias="schema-adalight">schemas/schema-adalight.json</file> <file alias="schema-adalight">schemas/schema-adalight.json</file>
<file alias="schema-apa102">schemas/schema-apa102.json</file> <file alias="schema-apa102">schemas/schema-apa102.json</file>

View File

@ -34,7 +34,7 @@ bool LedDeviceSk6812SPI::setConfig(const Json::Value &deviceConfig)
{ {
ProviderSpi::setConfig(deviceConfig); ProviderSpi::setConfig(deviceConfig);
_baudRate_Hz = deviceConfig.get("rate",3000000).asInt(); _baudRate_Hz = deviceConfig.get("rate",3000000).asInt();
if ( (_baudRate_Hz < 2050000) || (_baudRate_Hz > 4000000) ) if ( (_baudRate_Hz < 2050000) || (_baudRate_Hz > 4000000) )
{ {
Warning(_log, "SPI rate %d outside recommended range (2050000 -> 4000000)", _baudRate_Hz); Warning(_log, "SPI rate %d outside recommended range (2050000 -> 4000000)", _baudRate_Hz);

View File

@ -2,6 +2,15 @@
"type":"object", "type":"object",
"required":true, "required":true,
"properties":{ "properties":{
"host" : {
"type": "string",
"title":"Target IP"
},
"port" : {
"type": "integer",
"title":"Port",
"default": 5568
},
"universe": { "universe": {
"type": "integer", "type": "integer",
"title":"Universe", "title":"Universe",
@ -14,7 +23,7 @@
}, },
"cid": { "cid": {
"type": "string", "type": "string",
"title":"CID", "title":"CID"
} }
}, },
"additionalProperties": true "additionalProperties": true

View File

@ -2,6 +2,64 @@
"type":"object", "type":"object",
"required":true, "required":true,
"properties":{ "properties":{
"output" : {
"type": "string",
"title":"Target IP",
"propertyOrder" : 1
},
"port" : {
"type": "integer",
"title":"Port",
"default": 7890,
"propertyOrder" : 2
},
"setFcConfig": {
"type": "boolean",
"title":"Set fadecandy Configuration",
"default": false,
"propertyOrder" : 3
},
"manualLed": {
"type": "boolean",
"title":"Manual control of fadecandy LED",
"default": false,
"propertyOrder" : 4
},
"ledOn": {
"type": "boolean",
"title":"Fadecandy LED set to on",
"default": false,
"propertyOrder" : 5
},
"interpolation": {
"type": "boolean",
"title":"Interpolation",
"default": false,
"propertyOrder" : 6
},
"dither": {
"type": "boolean",
"title":"Dithering",
"default": false,
"propertyOrder" : 7
},
"gamma" : {
"type" : "number",
"minimum" : 0.0,
"maximum": 100.0,
"propertyOrder" : 8
},
"whitepoint" : {
"type" : "array",
"propertyOrder" : 9,
"items" : {
"type" : "number",
"minimum" : 0.0,
"maximum": 1.0,
"default" : 1.0
}
}
}, },
"additionalProperties": true "additionalProperties": true
} }

View File

@ -5,7 +5,7 @@
"output": { "output": {
"type": "string", "type": "string",
"title":"Output", "title":"Output",
"default" : "/dev/null", "default" : "/dev/null"
} }
}, },
"additionalProperties": true "additionalProperties": true

View File

@ -18,7 +18,7 @@
"transitiontime": { "transitiontime": {
"type": "integer", "type": "integer",
"title":"Transistion time (x100ms)", "title":"Transistion time (x100ms)",
"default" : 1, "default" : 1
}, },
"switchOffOnBlack": { "switchOffOnBlack": {
"type": "boolean", "type": "boolean",

View File

@ -2,6 +2,15 @@
"type":"object", "type":"object",
"required":true, "required":true,
"properties":{ "properties":{
"host" : {
"type": "string",
"title":"Target IP"
},
"port" : {
"type": "integer",
"title":"Port",
"default": 5568
}
}, },
"additionalProperties": true "additionalProperties": true
} }