mirror of
				https://github.com/hyperion-project/hyperion.ng.git
				synced 2025-03-01 10:33:28 +00:00 
			
		
		
		
	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:
		| @@ -10,7 +10,7 @@ | ||||
| 			<div class="col-lg-12"> | ||||
| <!--				<form id="grabberConfForm"></form>--> | ||||
| 				<div id='editor_container'/> | ||||
| 				<button id='submit'>Submit (console.log)</button> | ||||
| 				<button id='btn_submit'>Submit (console.log)</button> | ||||
| 			</div> | ||||
| 		</div> | ||||
| 	</div> | ||||
|   | ||||
| @@ -49,7 +49,10 @@ | ||||
| 						<select id="leddevices" class="form-control" style="color:black;width:auto;margin-left:10px;display:inline-block" /> | ||||
| 					</div> | ||||
| 					<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"> | ||||
|   | ||||
| @@ -49,7 +49,7 @@ $(hyperion).one("cmd-config-getschema", function(event) { | ||||
| $(document).ready( function() { | ||||
| 	requestServerConfigSchema(); | ||||
|  | ||||
| 	document.getElementById('submit').addEventListener('click',function() { | ||||
| 	document.getElementById('btn_submit').addEventListener('click',function() { | ||||
| 		// Get the value from the editor | ||||
| 		//console.log(general_conf_editor.getValue()); | ||||
| 	}); | ||||
|   | ||||
| @@ -15,10 +15,6 @@ $(document).ready( function() { | ||||
| 	//Change all Checkboxes to Switches | ||||
| 	$("[type='checkbox']").bootstrapSwitch(); | ||||
|  | ||||
| 	$(hyperion).on("open",function(event){ | ||||
| 		requestServerInfo(); | ||||
| 	}); | ||||
|  | ||||
| 	$(hyperion).on("cmd-serverinfo",function(event){ | ||||
| 		parsedServerInfoJSON = event.response; | ||||
| 		currentVersion = parsedServerInfoJSON.info.hyperion[0].version; | ||||
| @@ -57,9 +53,20 @@ $(document).ready( function() { | ||||
| 		}); | ||||
| 	}); // end cmd-serverinfo | ||||
|  | ||||
| 	$(hyperion).one("cmd-config-getschema", function(event) { | ||||
| 		parsedConfSchemaJSON = event.response.result; | ||||
| 	}); | ||||
|  | ||||
| 	 | ||||
| 	$(hyperion).on("error",function(event){ | ||||
| 		showErrorDialog("error", event.reason); | ||||
| 	}); | ||||
|  | ||||
| 	$(hyperion).on("open",function(event){ | ||||
| 		requestServerConfigSchema(); | ||||
| 		requestServerInfo(); | ||||
| 	}); | ||||
|  | ||||
| }); | ||||
|  | ||||
| $(function(){ | ||||
|   | ||||
| @@ -41,6 +41,7 @@ $(document).ready(function() { | ||||
| 		} | ||||
| 		$("#leddevices").html(ledDevicesHtml); | ||||
| 		$("#leddevices").val(server.info.ledDevices.active); | ||||
| 		$("#leddevices").trigger("change"); | ||||
| 	}); | ||||
|  | ||||
| 	// ------------------------------------------------------------------ | ||||
| @@ -120,6 +121,48 @@ $(document).ready(function() { | ||||
| 	}); | ||||
|  | ||||
| 	$("#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") | ||||
| 		{ | ||||
| 			$("#huebridge").show(); | ||||
|   | ||||
| @@ -55,6 +55,8 @@ public: | ||||
| 	static const LedDeviceRegistry& getDeviceMap(); | ||||
| 	static void setActiveDevice(std::string dev); | ||||
| 	static std::string activeDevice() { return _activeDevice; }; | ||||
| 	static Json::Value getLedDeviceSchemas(); | ||||
| 	 | ||||
| protected: | ||||
| 	/// The common Logger instance for all LedDevices | ||||
| 	Logger * _log; | ||||
|   | ||||
| @@ -23,33 +23,34 @@ | ||||
| 		"device" : | ||||
| 		{ | ||||
| 			"type" : "object", | ||||
| 			"title" : "LED Device", | ||||
| 			"title" : "LED Device General", | ||||
| 			"required" : true, | ||||
| 			"defaultProperties": ["name","ledCount","colorOrder"], | ||||
| 			"properties" : | ||||
| 			{ | ||||
| 				"name" : | ||||
| 				{ | ||||
| 					"type" : "string", | ||||
| 					"required" : true | ||||
| 					"required" : true, | ||||
| 					"propertyOrder" : 1 | ||||
| 				}, | ||||
| 				"type" : | ||||
| 				{ | ||||
| 					"type" : "string", | ||||
| 					"required" : true | ||||
| 				}, | ||||
| 				"output" : | ||||
| 				{ | ||||
| 					"type" : "string" | ||||
| 				}, | ||||
| 				"rate" : | ||||
| 				"ledCount" : | ||||
| 				{ | ||||
| 					"type" : "integer", | ||||
| 					"minimum" : 0 | ||||
| 					"minimum" : 0, | ||||
| 					"title" : "Count of all hardware LEDs", | ||||
| 					"propertyOrder" : 2 | ||||
| 				}, | ||||
| 				"colorOrder" : | ||||
| 				{ | ||||
| 					"type" : "string", | ||||
| 					"enum" : ["rgb", "bgr", "rbg", "brg", "gbr", "grb"] | ||||
| 					"enum" : ["rgb", "bgr", "rbg", "brg", "gbr", "grb"], | ||||
| 					"propertyOrder" : 3 | ||||
| 				} | ||||
| 			}, | ||||
| 			"additionalProperties" : true | ||||
|   | ||||
| @@ -911,6 +911,8 @@ void JsonClientConnection::handleSchemaGetCommand(const Json::Value & message, c | ||||
| 	result["tan"] = tan; | ||||
| 	Json::Value & schemaJson = result["result"]; | ||||
| 	 | ||||
| 	 | ||||
| 	 | ||||
| 	// make sure the resources are loaded (they may be left out after static linking) | ||||
| 	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())	; | ||||
| 	} | ||||
| 	result["result"]["properties"]["alldevices"] = LedDevice::getLedDeviceSchemas(); | ||||
|  | ||||
| 	// send the result | ||||
| 	sendMessage(result); | ||||
|   | ||||
| @@ -1,5 +1,10 @@ | ||||
| #include <leddevice/LedDevice.h> | ||||
|  | ||||
| #include <QResource> | ||||
| #include <QStringList> | ||||
| #include <QDir> | ||||
| #include <json/json.h> | ||||
|  | ||||
| LedDeviceRegistry LedDevice::_ledDeviceMap = LedDeviceRegistry(); | ||||
| std::string LedDevice::_activeDevice = ""; | ||||
|  | ||||
| @@ -10,6 +15,7 @@ LedDevice::LedDevice() | ||||
| 	, _ledBuffer(0) | ||||
|  | ||||
| { | ||||
| 	LedDevice::getLedDeviceSchemas(); | ||||
| } | ||||
|  | ||||
| // dummy implemention | ||||
| @@ -32,4 +38,32 @@ const LedDeviceRegistry& LedDevice::getDeviceMap() | ||||
| void LedDevice::setActiveDevice(std::string 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; | ||||
| } | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <RCC> | ||||
| 	<qresource prefix="/"> | ||||
| 	<qresource prefix="/leddevices/"> | ||||
| 		<file alias="schema-adalightapa102">schemas/schema-adalightapa102.json</file> | ||||
| 		<file alias="schema-adalight">schemas/schema-adalight.json</file> | ||||
| 		<file alias="schema-apa102">schemas/schema-apa102.json</file> | ||||
|   | ||||
| @@ -34,7 +34,7 @@ bool LedDeviceSk6812SPI::setConfig(const Json::Value &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) ) | ||||
| 	{ | ||||
| 		Warning(_log, "SPI rate %d outside recommended range (2050000 -> 4000000)", _baudRate_Hz); | ||||
|   | ||||
| @@ -2,6 +2,15 @@ | ||||
| 	"type":"object", | ||||
| 	"required":true, | ||||
| 	"properties":{ | ||||
| 		"host" : { | ||||
| 			"type": "string", | ||||
| 			"title":"Target IP" | ||||
| 		}, | ||||
| 		"port" : { | ||||
| 			"type": "integer", | ||||
| 			"title":"Port", | ||||
| 			"default": 5568 | ||||
| 		}, | ||||
| 		"universe": { | ||||
| 			"type": "integer", | ||||
| 			"title":"Universe", | ||||
| @@ -14,7 +23,7 @@ | ||||
| 		}, | ||||
| 		"cid": { | ||||
| 			"type": "string", | ||||
| 			"title":"CID", | ||||
| 			"title":"CID" | ||||
| 		} | ||||
| 	}, | ||||
| 	"additionalProperties": true | ||||
|   | ||||
| @@ -2,6 +2,64 @@ | ||||
| 	"type":"object", | ||||
| 	"required":true, | ||||
| 	"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 | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
| 		"output": { | ||||
| 			"type": "string", | ||||
| 			"title":"Output", | ||||
| 			"default" : "/dev/null", | ||||
| 			"default" : "/dev/null" | ||||
| 		} | ||||
| 	}, | ||||
| 	"additionalProperties": true | ||||
|   | ||||
| @@ -18,7 +18,7 @@ | ||||
| 		"transitiontime": { | ||||
| 			"type": "integer", | ||||
| 			"title":"Transistion time (x100ms)", | ||||
| 			"default" : 1, | ||||
| 			"default" : 1 | ||||
| 		}, | ||||
| 		"switchOffOnBlack": { | ||||
| 			"type": "boolean", | ||||
|   | ||||
| @@ -2,6 +2,15 @@ | ||||
| 	"type":"object", | ||||
| 	"required":true, | ||||
| 	"properties":{ | ||||
| 		"host" : { | ||||
| 			"type": "string", | ||||
| 			"title":"Target IP" | ||||
| 		}, | ||||
| 		"port" : { | ||||
| 			"type": "integer", | ||||
| 			"title":"Port", | ||||
| 			"default": 5568 | ||||
| 		} | ||||
| 	}, | ||||
| 	"additionalProperties": true | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user