mirror of
				https://github.com/hyperion-project/hyperion.ng.git
				synced 2025-03-01 10:33:28 +00:00 
			
		
		
		
	Merge remote-tracking branch 'refs/remotes/origin/test'
Former-commit-id: 009da18a860ea64f2921d4c34229749539d1e990
This commit is contained in:
		| @@ -42,6 +42,32 @@ | |||||||
| 	///            - 'updateDelay'     The delay of the output to leds (in periods of smoothing) | 	///            - 'updateDelay'     The delay of the output to leds (in periods of smoothing) | ||||||
| 	"color" : | 	"color" : | ||||||
| 	{ | 	{ | ||||||
|  | 		"correction" : | ||||||
|  | 		[ | ||||||
|  | 			{ | ||||||
|  | 				"id"   : "default", | ||||||
|  | 				"leds" : "*", | ||||||
|  | 				"correctionValues" : | ||||||
|  | 				{ | ||||||
|  | 					"red"   : 255, | ||||||
|  | 					"green" : 255, | ||||||
|  | 					"blue"  : 255 | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		], | ||||||
|  | 		"temperature" : | ||||||
|  | 		[ | ||||||
|  | 			{ | ||||||
|  | 				"id"   : "default", | ||||||
|  | 				"leds" : "*", | ||||||
|  | 				"correctionValues" : | ||||||
|  | 				{ | ||||||
|  | 					"red"   : 255, | ||||||
|  | 					"green" : 255, | ||||||
|  | 					"blue"  : 255 | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		], | ||||||
| 		"transform" : | 		"transform" : | ||||||
| 		[ | 		[ | ||||||
| 			{ | 			{ | ||||||
| @@ -52,6 +78,11 @@ | |||||||
| 					"saturationGain" : 1.0000, | 					"saturationGain" : 1.0000, | ||||||
| 					"valueGain"      : 1.0000 | 					"valueGain"      : 1.0000 | ||||||
| 				}, | 				}, | ||||||
|  | 				"hsl" : | ||||||
|  | 				{ | ||||||
|  | 					"saturationGain" : 1.0000, | ||||||
|  | 					"luminanceGain"  : 1.0000 | ||||||
|  | 				},` | ||||||
| 				"red" : | 				"red" : | ||||||
| 				{ | 				{ | ||||||
| 					"threshold"  : 0.0000, | 					"threshold"  : 0.0000, | ||||||
|   | |||||||
| @@ -38,7 +38,7 @@ | |||||||
|             "type":"object", |             "type":"object", | ||||||
|             "required":false, |             "required":false, | ||||||
|             "properties": { |             "properties": { | ||||||
|                 "hsv" : { | 				"hsv" : { | ||||||
|                     "type" : "object", |                     "type" : "object", | ||||||
|                     "required" : false, |                     "required" : false, | ||||||
|                     "properties" : { |                     "properties" : { | ||||||
| @@ -54,6 +54,23 @@ | |||||||
|                         } |                         } | ||||||
|                     }, |                     }, | ||||||
|                     "additionalProperties" : false |                     "additionalProperties" : false | ||||||
|  |                 }, | ||||||
|  | 				"hsl" : { | ||||||
|  |                     "type" : "object", | ||||||
|  |                     "required" : false, | ||||||
|  |                     "properties" : { | ||||||
|  |                         "saturationGain" : { | ||||||
|  |                             "type" : "number", | ||||||
|  |                             "required" : false, | ||||||
|  |                             "minimum" : 0.0 | ||||||
|  |                         }, | ||||||
|  |                         "luminanceGain" : { | ||||||
|  |                             "type" : "number", | ||||||
|  |                             "required" : false, | ||||||
|  |                             "minimum" : 0.0 | ||||||
|  |                         } | ||||||
|  |                     }, | ||||||
|  |                     "additionalProperties" : false | ||||||
|                 }, |                 }, | ||||||
|                 "red": { |                 "red": { | ||||||
|                     "type":"object", |                     "type":"object", | ||||||
|   | |||||||
| @@ -18,6 +18,7 @@ | |||||||
| #include <hyperion/ImageProcessor.h> | #include <hyperion/ImageProcessor.h> | ||||||
| #include <hyperion/MessageForwarder.h> | #include <hyperion/MessageForwarder.h> | ||||||
| #include <hyperion/ColorTransform.h> | #include <hyperion/ColorTransform.h> | ||||||
|  | #include <hyperion/ColorCorrection.h> | ||||||
| #include <utils/ColorRgb.h> | #include <utils/ColorRgb.h> | ||||||
|  |  | ||||||
| // project includes | // project includes | ||||||
| @@ -231,7 +232,7 @@ void JsonClientConnection::handleMessage(const std::string &messageString) | |||||||
| 		sendErrorReply("Error while validating json: " + errors); | 		sendErrorReply("Error while validating json: " + errors); | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
|  | 	 | ||||||
| 	// switch over all possible commands and handle them | 	// switch over all possible commands and handle them | ||||||
| 	if (command == "color") | 	if (command == "color") | ||||||
| 		handleColorCommand(message); | 		handleColorCommand(message); | ||||||
| @@ -247,6 +248,10 @@ void JsonClientConnection::handleMessage(const std::string &messageString) | |||||||
| 		handleClearallCommand(message); | 		handleClearallCommand(message); | ||||||
| 	else if (command == "transform") | 	else if (command == "transform") | ||||||
| 		handleTransformCommand(message); | 		handleTransformCommand(message); | ||||||
|  | 	else if (command == "correction") | ||||||
|  | 		handleCorrectionCommand(message); | ||||||
|  | 	else if (command == "temperature") | ||||||
|  | 		handleTemperatureCommand(message); | ||||||
| 	else | 	else | ||||||
| 		handleNotImplemented(); | 		handleNotImplemented(); | ||||||
| } | } | ||||||
| @@ -404,6 +409,8 @@ void JsonClientConnection::handleServerInfoCommand(const Json::Value &) | |||||||
|  |  | ||||||
| 		transform["saturationGain"] = colorTransform->_hsvTransform.getSaturationGain(); | 		transform["saturationGain"] = colorTransform->_hsvTransform.getSaturationGain(); | ||||||
| 		transform["valueGain"]      = colorTransform->_hsvTransform.getValueGain(); | 		transform["valueGain"]      = colorTransform->_hsvTransform.getValueGain(); | ||||||
|  | 		transform["saturationLGain"] = colorTransform->_hslTransform.getSaturationGain(); | ||||||
|  | 		transform["luminanceGain"]   = colorTransform->_hslTransform.getLuminanceGain(); | ||||||
|  |  | ||||||
| 		Json::Value & threshold = transform["threshold"]; | 		Json::Value & threshold = transform["threshold"]; | ||||||
| 		threshold.append(colorTransform->_rgbRedTransform.getThreshold()); | 		threshold.append(colorTransform->_rgbRedTransform.getThreshold()); | ||||||
| @@ -476,7 +483,7 @@ void JsonClientConnection::handleTransformCommand(const Json::Value &message) | |||||||
| 		//sendErrorReply(std::string("Incorrect transform identifier: ") + transformId); | 		//sendErrorReply(std::string("Incorrect transform identifier: ") + transformId); | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
|  | 		 | ||||||
| 	if (transform.isMember("saturationGain")) | 	if (transform.isMember("saturationGain")) | ||||||
| 	{ | 	{ | ||||||
| 		colorTransform->_hsvTransform.setSaturationGain(transform["saturationGain"].asDouble()); | 		colorTransform->_hsvTransform.setSaturationGain(transform["saturationGain"].asDouble()); | ||||||
| @@ -486,6 +493,16 @@ void JsonClientConnection::handleTransformCommand(const Json::Value &message) | |||||||
| 	{ | 	{ | ||||||
| 		colorTransform->_hsvTransform.setValueGain(transform["valueGain"].asDouble()); | 		colorTransform->_hsvTransform.setValueGain(transform["valueGain"].asDouble()); | ||||||
| 	} | 	} | ||||||
|  | 	 | ||||||
|  | 	if (transform.isMember("saturationLGain")) | ||||||
|  | 	{ | ||||||
|  | 		colorTransform->_hslTransform.setSaturationGain(transform["saturationLGain"].asDouble()); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (transform.isMember("luminanceGain")) | ||||||
|  | 	{ | ||||||
|  | 		colorTransform->_hslTransform.setLuminanceGain(transform["luminanceGain"].asDouble()); | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	if (transform.isMember("threshold")) | 	if (transform.isMember("threshold")) | ||||||
| 	{ | 	{ | ||||||
| @@ -518,13 +535,79 @@ void JsonClientConnection::handleTransformCommand(const Json::Value &message) | |||||||
| 		colorTransform->_rgbGreenTransform.setWhitelevel(values[1u].asDouble()); | 		colorTransform->_rgbGreenTransform.setWhitelevel(values[1u].asDouble()); | ||||||
| 		colorTransform->_rgbBlueTransform .setWhitelevel(values[2u].asDouble()); | 		colorTransform->_rgbBlueTransform .setWhitelevel(values[2u].asDouble()); | ||||||
| 	} | 	} | ||||||
|  | 	 | ||||||
| 	// commit the changes | 	// commit the changes | ||||||
| 	_hyperion->transformsUpdated(); | 	_hyperion->transformsUpdated(); | ||||||
|  |  | ||||||
| 	sendSuccessReply(); | 	sendSuccessReply(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void JsonClientConnection::handleCorrectionCommand(const Json::Value &message) | ||||||
|  | { | ||||||
|  | 	const Json::Value & correction = message["correction"]; | ||||||
|  |  | ||||||
|  | 	const std::string correctionId = correction.get("id", _hyperion->getCorrectionIds().front()).asString(); | ||||||
|  | 	ColorCorrection * colorCorrection = _hyperion->getCorrection(correctionId); | ||||||
|  | 	if (colorCorrection == nullptr) | ||||||
|  | 	{ | ||||||
|  | 		//sendErrorReply(std::string("Incorrect correction identifier: ") + correctionId); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (correction.isMember("red")) | ||||||
|  | 	{ | ||||||
|  | 		colorCorrection->_rgbCorrection.setcorrectionR(correction["red"].asInt()); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (correction.isMember("green")) | ||||||
|  | 	{ | ||||||
|  | 		colorCorrection->_rgbCorrection.setcorrectionG(correction["green"].asInt()); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	if (correction.isMember("blue")) | ||||||
|  | 	{ | ||||||
|  | 		colorCorrection->_rgbCorrection.setcorrectionB(correction["blue"].asInt()); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	// commit the changes | ||||||
|  | 	_hyperion->correctionsUpdated(); | ||||||
|  |  | ||||||
|  | 	sendSuccessReply(); | ||||||
|  | } | ||||||
|  | 	 | ||||||
|  | void JsonClientConnection::handleTemperatureCommand(const Json::Value &message) | ||||||
|  | { | ||||||
|  | 	const Json::Value & temperature = message["temperature"]; | ||||||
|  |  | ||||||
|  | 	const std::string tempId = temperature.get("id", _hyperion->getTemperatureIds().front()).asString(); | ||||||
|  | 	ColorCorrection * colorTemperature = _hyperion->getTemperature(tempId); | ||||||
|  | 	if (colorTemperature == nullptr) | ||||||
|  | 	{ | ||||||
|  | 		//sendErrorReply(std::string("Incorrect temperature identifier: ") + tempId); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (temperature.isMember("red")) | ||||||
|  | 	{ | ||||||
|  | 		colorTemperature->_rgbCorrection.setcorrectionR(temperature["red"].asInt()); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (temperature.isMember("green")) | ||||||
|  | 	{ | ||||||
|  | 		colorTemperature->_rgbCorrection.setcorrectionG(temperature["green"].asInt()); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	if (temperature.isMember("blue")) | ||||||
|  | 	{ | ||||||
|  | 		colorTemperature->_rgbCorrection.setcorrectionB(temperature["blue"].asInt()); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	// commit the changes | ||||||
|  | 	_hyperion->temperaturesUpdated(); | ||||||
|  |  | ||||||
|  | 	sendSuccessReply(); | ||||||
|  | } | ||||||
|  | 	 | ||||||
| void JsonClientConnection::handleNotImplemented() | void JsonClientConnection::handleNotImplemented() | ||||||
| { | { | ||||||
| 	sendErrorReply("Command not implemented"); | 	sendErrorReply("Command not implemented"); | ||||||
|   | |||||||
| @@ -112,6 +112,20 @@ private: | |||||||
| 	/// @param message the incoming message | 	/// @param message the incoming message | ||||||
| 	/// | 	/// | ||||||
| 	void handleTransformCommand(const Json::Value & message); | 	void handleTransformCommand(const Json::Value & message); | ||||||
|  | 	 | ||||||
|  | 	/// | ||||||
|  | 	/// Handle an incoming JSON Correction message | ||||||
|  | 	/// | ||||||
|  | 	/// @param message the incoming message | ||||||
|  | 	/// | ||||||
|  | 	void handleCorrectionCommand(const Json::Value & message); | ||||||
|  | 	 | ||||||
|  | 	/// | ||||||
|  | 	/// Handle an incoming JSON Temperature message | ||||||
|  | 	/// | ||||||
|  | 	/// @param message the incoming message | ||||||
|  | 	/// | ||||||
|  | 	void handleTemperatureCommand(const Json::Value & message); | ||||||
|  |  | ||||||
| 	/// | 	/// | ||||||
| 	/// Handle an incoming JSON message of unknown type | 	/// Handle an incoming JSON message of unknown type | ||||||
|   | |||||||
| @@ -7,6 +7,8 @@ | |||||||
|         <file alias="schema-clear">schema/schema-clear.json</file> |         <file alias="schema-clear">schema/schema-clear.json</file> | ||||||
|         <file alias="schema-clearall">schema/schema-clearall.json</file> |         <file alias="schema-clearall">schema/schema-clearall.json</file> | ||||||
|         <file alias="schema-transform">schema/schema-transform.json</file> |         <file alias="schema-transform">schema/schema-transform.json</file> | ||||||
|  |         <file alias="schema-correction">schema/schema-correction.json</file> | ||||||
|  |         <file alias="schema-temperature">schema/schema-temperature.json</file> | ||||||
|         <file alias="schema-effect">schema/schema-effect.json</file> |         <file alias="schema-effect">schema/schema-effect.json</file> | ||||||
|     </qresource> |     </qresource> | ||||||
| </RCC> | </RCC> | ||||||
|   | |||||||
							
								
								
									
										41
									
								
								libsrc/jsonserver/schema/schema-correction.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								libsrc/jsonserver/schema/schema-correction.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | |||||||
|  | { | ||||||
|  | 	"type":"object", | ||||||
|  | 	"required":true, | ||||||
|  | 	"properties":{ | ||||||
|  | 		"command": { | ||||||
|  | 			"type" : "string", | ||||||
|  | 			"required" : true, | ||||||
|  | 			"enum" : ["correction"] | ||||||
|  | 		}, | ||||||
|  | 		"correction": { | ||||||
|  | 			"type": "object", | ||||||
|  | 			"required": true, | ||||||
|  | 			"properties": { | ||||||
|  | 				"id" : { | ||||||
|  | 					"type" : "string", | ||||||
|  | 					"required" : false | ||||||
|  | 				}, | ||||||
|  | 				"red" : { | ||||||
|  | 					"type" : "integer", | ||||||
|  | 					"required" : false, | ||||||
|  | 					"minimum": 0, | ||||||
|  | 					"maximum": 255 | ||||||
|  | 				}, | ||||||
|  | 				"green" : { | ||||||
|  | 					"type" : "integer", | ||||||
|  | 					"required" : false, | ||||||
|  | 					"minimum": 0, | ||||||
|  | 					"maximum": 255 | ||||||
|  | 				}, | ||||||
|  | 				"blue" : { | ||||||
|  | 					"type" : "integer", | ||||||
|  | 					"required" : false, | ||||||
|  | 					"minimum": 0, | ||||||
|  | 					"maximum": 255 | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 			"additionalProperties": false | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  | 	"additionalProperties": false | ||||||
|  | } | ||||||
							
								
								
									
										41
									
								
								libsrc/jsonserver/schema/schema-temperature.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								libsrc/jsonserver/schema/schema-temperature.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | |||||||
|  | { | ||||||
|  | 	"type":"object", | ||||||
|  | 	"required":true, | ||||||
|  | 	"properties":{ | ||||||
|  | 		"command": { | ||||||
|  | 			"type" : "string", | ||||||
|  | 			"required" : true, | ||||||
|  | 			"enum" : ["temperature"] | ||||||
|  | 		}, | ||||||
|  | 		"temperature": { | ||||||
|  | 			"type": "object", | ||||||
|  | 			"required": true, | ||||||
|  | 			"properties": { | ||||||
|  | 				"id" : { | ||||||
|  | 					"type" : "string", | ||||||
|  | 					"required" : false | ||||||
|  | 				}, | ||||||
|  | 				"red" : { | ||||||
|  | 					"type" : "integer", | ||||||
|  | 					"required" : false, | ||||||
|  | 					"minimum": 0, | ||||||
|  | 					"maximum": 255 | ||||||
|  | 				}, | ||||||
|  | 				"green" : { | ||||||
|  | 					"type" : "integer", | ||||||
|  | 					"required" : false, | ||||||
|  | 					"minimum": 0, | ||||||
|  | 					"maximum": 255 | ||||||
|  | 				}, | ||||||
|  | 				"blue" : { | ||||||
|  | 					"type" : "integer", | ||||||
|  | 					"required" : false, | ||||||
|  | 					"minimum": 0, | ||||||
|  | 					"maximum": 255 | ||||||
|  | 				} | ||||||
|  | 			}, | ||||||
|  | 			"additionalProperties": false | ||||||
|  | 		} | ||||||
|  | 	}, | ||||||
|  | 	"additionalProperties": false | ||||||
|  | } | ||||||
| @@ -25,6 +25,16 @@ | |||||||
| 					"required" : false, | 					"required" : false, | ||||||
| 					"minimum" : 0.0 | 					"minimum" : 0.0 | ||||||
| 				}, | 				}, | ||||||
|  | 				"saturationLGain" : { | ||||||
|  | 					"type" : "number", | ||||||
|  | 					"required" : false, | ||||||
|  | 					"minimum" : 0.0 | ||||||
|  | 				}, | ||||||
|  | 				"luminanceGain" : { | ||||||
|  | 					"type" : "number", | ||||||
|  | 					"required" : false, | ||||||
|  | 					"minimum" : 0.0 | ||||||
|  | 				}, | ||||||
| 				"threshold": { | 				"threshold": { | ||||||
| 					"type": "array", | 					"type": "array", | ||||||
| 					"required": false, | 					"required": false, | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ | |||||||
|         "command": { |         "command": { | ||||||
|             "type" : "string", |             "type" : "string", | ||||||
|             "required" : true, |             "required" : true, | ||||||
|             "enum" : ["color", "image", "effect", "serverinfo", "clear", "clearall", "transform"] |             "enum" : ["color", "image", "effect", "serverinfo", "clear", "clearall", "transform", "correction", "temperature"] | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -192,7 +192,7 @@ void JsonConnection::clearAll() | |||||||
| 	parseReply(reply); | 	parseReply(reply); | ||||||
| } | } | ||||||
|  |  | ||||||
| void JsonConnection::setTransform(std::string * transformId, double * saturation, double * value, ColorTransformValues *threshold, ColorTransformValues *gamma, ColorTransformValues *blacklevel, ColorTransformValues *whitelevel) | void JsonConnection::setTransform(std::string * transformId, double * saturation, double * value, double * saturationL, double * luminance, ColorTransformValues *threshold, ColorTransformValues *gamma, ColorTransformValues *blacklevel, ColorTransformValues *whitelevel) | ||||||
| { | { | ||||||
| 	std::cout << "Set color transforms" << std::endl; | 	std::cout << "Set color transforms" << std::endl; | ||||||
|  |  | ||||||
| @@ -215,7 +215,16 @@ void JsonConnection::setTransform(std::string * transformId, double * saturation | |||||||
| 	{ | 	{ | ||||||
| 		transform["valueGain"] = *value; | 		transform["valueGain"] = *value; | ||||||
| 	} | 	} | ||||||
|  | 	 | ||||||
|  | 	if (saturationL != nullptr) | ||||||
|  | 	{ | ||||||
|  | 		transform["saturationLGain"] = *saturationL; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (luminance != nullptr) | ||||||
|  | 	{ | ||||||
|  | 		transform["luminanceGain"] = *luminance; | ||||||
|  | 	} | ||||||
| 	if (threshold != nullptr) | 	if (threshold != nullptr) | ||||||
| 	{ | 	{ | ||||||
| 		Json::Value & v = transform["threshold"]; | 		Json::Value & v = transform["threshold"]; | ||||||
| @@ -255,6 +264,78 @@ void JsonConnection::setTransform(std::string * transformId, double * saturation | |||||||
| 	parseReply(reply); | 	parseReply(reply); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void JsonConnection::setCorrection(std::string * correctionId, int * red, int * green, int * blue) | ||||||
|  | { | ||||||
|  | 	std::cout << "Set color corrections" << std::endl; | ||||||
|  |  | ||||||
|  | 	// create command | ||||||
|  | 	Json::Value command; | ||||||
|  | 	command["command"] = "correction"; | ||||||
|  | 	Json::Value & correction = command["correction"]; | ||||||
|  |  | ||||||
|  | 	if (correctionId != nullptr) | ||||||
|  | 	{ | ||||||
|  | 		correction["id"] = *correctionId; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (red != nullptr) | ||||||
|  | 	{ | ||||||
|  | 		correction["red"] = *red; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (green != nullptr) | ||||||
|  | 	{ | ||||||
|  | 		correction["green"] = *green; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	if (blue != nullptr) | ||||||
|  | 	{ | ||||||
|  | 		correction["blue"] = *blue; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// send command message | ||||||
|  | 	Json::Value reply = sendMessage(command); | ||||||
|  |  | ||||||
|  | 	// parse reply message | ||||||
|  | 	parseReply(reply); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void JsonConnection::setTemperature(std::string * temperatureId, int * red, int * green, int * blue) | ||||||
|  | { | ||||||
|  | 	std::cout << "Set color temperature corrections" << std::endl; | ||||||
|  |  | ||||||
|  | 	// create command | ||||||
|  | 	Json::Value command; | ||||||
|  | 	command["command"] = "temperature"; | ||||||
|  | 	Json::Value & temperature = command["temperature"]; | ||||||
|  |  | ||||||
|  | 	if (temperatureId != nullptr) | ||||||
|  | 	{ | ||||||
|  | 		temperature["id"] = *temperatureId; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (red != nullptr) | ||||||
|  | 	{ | ||||||
|  | 		temperature["red"] = *red; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (green != nullptr) | ||||||
|  | 	{ | ||||||
|  | 		temperature["green"] = *green; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	if (blue != nullptr) | ||||||
|  | 	{ | ||||||
|  | 		temperature["blue"] = *blue; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// send command message | ||||||
|  | 	Json::Value reply = sendMessage(command); | ||||||
|  |  | ||||||
|  | 	// parse reply message | ||||||
|  | 	parseReply(reply); | ||||||
|  | } | ||||||
|  |  | ||||||
| Json::Value JsonConnection::sendMessage(const Json::Value & message) | Json::Value JsonConnection::sendMessage(const Json::Value & message) | ||||||
| { | { | ||||||
| 	// serialize message (FastWriter already appends a newline) | 	// serialize message (FastWriter already appends a newline) | ||||||
|   | |||||||
| @@ -89,6 +89,8 @@ public: | |||||||
| 	/// @param transformId The identifier of the transform to set | 	/// @param transformId The identifier of the transform to set | ||||||
| 	/// @param saturation The HSV saturation gain | 	/// @param saturation The HSV saturation gain | ||||||
| 	/// @param value The HSV value gain | 	/// @param value The HSV value gain | ||||||
|  | 	/// @param saturationL The HSL saturation gain | ||||||
|  | 	/// @param luminance The HSL luminance gain | ||||||
| 	/// @param threshold The threshold | 	/// @param threshold The threshold | ||||||
| 	/// @param gamma The gamma value | 	/// @param gamma The gamma value | ||||||
| 	/// @param blacklevel The blacklevel | 	/// @param blacklevel The blacklevel | ||||||
| @@ -98,10 +100,42 @@ public: | |||||||
| 			std::string * transformId, | 			std::string * transformId, | ||||||
| 			double * saturation, | 			double * saturation, | ||||||
| 			double * value, | 			double * value, | ||||||
|  | 			double * saturationL, | ||||||
|  | 			double * luminance, | ||||||
| 			ColorTransformValues * threshold, | 			ColorTransformValues * threshold, | ||||||
| 			ColorTransformValues * gamma, | 			ColorTransformValues * gamma, | ||||||
| 			ColorTransformValues * blacklevel, | 			ColorTransformValues * blacklevel, | ||||||
| 			ColorTransformValues * whitelevel); | 			ColorTransformValues * whitelevel); | ||||||
|  | 	 | ||||||
|  | 	/// | ||||||
|  | 	/// Set the color correction of the leds | ||||||
|  | 	/// | ||||||
|  | 	/// @note Note that providing a NULL will leave the settings on the server unchanged | ||||||
|  | 	/// | ||||||
|  | 	/// @param correctionId The identifier of the correction to set | ||||||
|  | 	/// @param red The red correction value | ||||||
|  | 	/// @param green The green correction value | ||||||
|  | 	/// @param blue The blue correction value | ||||||
|  | 	void setCorrection( | ||||||
|  | 			std::string * correctionId, | ||||||
|  | 			int * red, | ||||||
|  | 			int * green, | ||||||
|  | 			int * blue); | ||||||
|  |  | ||||||
|  | 	/// | ||||||
|  | 	/// Set the color temperature of the leds | ||||||
|  | 	/// | ||||||
|  | 	/// @note Note that providing a NULL will leave the settings on the server unchanged | ||||||
|  | 	/// | ||||||
|  | 	/// @param temperatureId The identifier of the correction to set | ||||||
|  | 	/// @param red The red temperature value | ||||||
|  | 	/// @param green The green temperature value | ||||||
|  | 	/// @param blue The blue temperature value | ||||||
|  | 	void setTemperature( | ||||||
|  | 			std::string * temperatureId, | ||||||
|  | 			int * red, | ||||||
|  | 			int * green, | ||||||
|  | 			int * blue); | ||||||
|  |  | ||||||
| private: | private: | ||||||
| 	/// | 	/// | ||||||
|   | |||||||
| @@ -53,20 +53,30 @@ int main(int argc, char * argv[]) | |||||||
| 		IntParameter       & argDuration   = parameters.add<IntParameter>      ('d', "duration"  , "Specify how long the leds should be switched on in millseconds [default: infinity]"); | 		IntParameter       & argDuration   = parameters.add<IntParameter>      ('d', "duration"  , "Specify how long the leds should be switched on in millseconds [default: infinity]"); | ||||||
| 		ColorParameter     & argColor      = parameters.add<ColorParameter>    ('c', "color"     , "Set all leds to a constant color (either RRGGBB hex value or a color name. The color may be repeated multiple time like: RRGGBBRRGGBB)"); | 		ColorParameter     & argColor      = parameters.add<ColorParameter>    ('c', "color"     , "Set all leds to a constant color (either RRGGBB hex value or a color name. The color may be repeated multiple time like: RRGGBBRRGGBB)"); | ||||||
| 		ImageParameter     & argImage      = parameters.add<ImageParameter>    ('i', "image"     , "Set the leds to the colors according to the given image file"); | 		ImageParameter     & argImage      = parameters.add<ImageParameter>    ('i', "image"     , "Set the leds to the colors according to the given image file"); | ||||||
|         StringParameter    & argEffect     = parameters.add<StringParameter>   ('e', "effect"    , "Enable the effect with the given name"); |         	StringParameter    & argEffect     = parameters.add<StringParameter>   ('e', "effect"    , "Enable the effect with the given name"); | ||||||
|         StringParameter    & argEffectArgs = parameters.add<StringParameter>   (0x0, "effectArgs", "Arguments to use in combination with the specified effect. Should be a Json object string."); | 		StringParameter    & argEffectArgs = parameters.add<StringParameter>   (0x0, "effectArgs", "Arguments to use in combination with the specified effect. Should be a Json object string."); | ||||||
| 		SwitchParameter<>  & argServerInfo = parameters.add<SwitchParameter<> >('l', "list"      , "List server info"); | 		SwitchParameter<>  & argServerInfo = parameters.add<SwitchParameter<> >('l', "list"      , "List server info"); | ||||||
| 		SwitchParameter<>  & argClear      = parameters.add<SwitchParameter<> >('x', "clear"     , "Clear data for the priority channel provided by the -p option"); | 		SwitchParameter<>  & argClear      = parameters.add<SwitchParameter<> >('x', "clear"     , "Clear data for the priority channel provided by the -p option"); | ||||||
| 		SwitchParameter<>  & argClearAll   = parameters.add<SwitchParameter<> >(0x0, "clearall"  , "Clear data for all active priority channels"); | 		SwitchParameter<>  & argClearAll   = parameters.add<SwitchParameter<> >(0x0, "clearall"  , "Clear data for all active priority channels"); | ||||||
| 		StringParameter    & argId         = parameters.add<StringParameter>   ('q', "qualifier" , "Identifier(qualifier) of the transform to set"); | 		StringParameter    & argId         = parameters.add<StringParameter>   ('q', "qualifier" , "Identifier(qualifier) of the transform to set"); | ||||||
| 		DoubleParameter    & argSaturation = parameters.add<DoubleParameter>   ('s', "saturation", "Set the HSV saturation gain of the leds"); | 		DoubleParameter    & argSaturation = parameters.add<DoubleParameter>   ('s', "saturation", "Set the HSV saturation gain of the leds"); | ||||||
| 		DoubleParameter    & argValue      = parameters.add<DoubleParameter>   ('v', "value"     , "Set the HSV value gain of the leds"); | 		DoubleParameter    & argValue      = parameters.add<DoubleParameter>   ('v', "value"     , "Set the HSV value gain of the leds"); | ||||||
|  | 		DoubleParameter    & argSaturationL = parameters.add<DoubleParameter>  ('u', "saturationL", "Set the HSL saturation gain of the leds"); | ||||||
|  | 		DoubleParameter    & argLuminance  = parameters.add<DoubleParameter>   ('m', "luminance" , "Set the HSL luminance gain of the leds"); | ||||||
| 		TransformParameter & argGamma      = parameters.add<TransformParameter>('g', "gamma"     , "Set the gamma of the leds (requires 3 space seperated values)"); | 		TransformParameter & argGamma      = parameters.add<TransformParameter>('g', "gamma"     , "Set the gamma of the leds (requires 3 space seperated values)"); | ||||||
| 		TransformParameter & argThreshold  = parameters.add<TransformParameter>('t', "threshold" , "Set the threshold of the leds (requires 3 space seperated values between 0.0 and 1.0)"); | 		TransformParameter & argThreshold  = parameters.add<TransformParameter>('t', "threshold" , "Set the threshold of the leds (requires 3 space seperated values between 0.0 and 1.0)"); | ||||||
| 		TransformParameter & argBlacklevel = parameters.add<TransformParameter>('b', "blacklevel", "Set the blacklevel of the leds (requires 3 space seperated values which are normally between 0.0 and 1.0)"); | 		TransformParameter & argBlacklevel = parameters.add<TransformParameter>('b', "blacklevel", "Set the blacklevel of the leds (requires 3 space seperated values which are normally between 0.0 and 1.0)"); | ||||||
| 		TransformParameter & argWhitelevel = parameters.add<TransformParameter>('w', "whitelevel", "Set the whitelevel of the leds (requires 3 space seperated values which are normally between 0.0 and 1.0)"); | 		TransformParameter & argWhitelevel = parameters.add<TransformParameter>('w', "whitelevel", "Set the whitelevel of the leds (requires 3 space seperated values which are normally between 0.0 and 1.0)"); | ||||||
| 		SwitchParameter<>  & argPrint      = parameters.add<SwitchParameter<> >(0x0, "print"     , "Print the json input and output messages on stdout"); | 		SwitchParameter<>  & argPrint      = parameters.add<SwitchParameter<> >(0x0, "print"     , "Print the json input and output messages on stdout"); | ||||||
| 		SwitchParameter<>  & argHelp       = parameters.add<SwitchParameter<> >('h', "help"      , "Show this help message and exit"); | 		SwitchParameter<>  & argHelp       = parameters.add<SwitchParameter<> >('h', "help"      , "Show this help message and exit"); | ||||||
|  | 		StringParameter    & argIdC        = parameters.add<StringParameter>   ('y', "qualifier" , "Identifier(qualifier) of the correction to set"); | ||||||
|  | 		IntParameter       & argCorrR      = parameters.add<IntParameter>      ('1', "correctionR"  , "Specify the red channel correction"); | ||||||
|  | 		IntParameter       & argCorrG      = parameters.add<IntParameter>      ('2', "correctionG"  , "Specify the green channel correction"); | ||||||
|  | 		IntParameter       & argCorrB      = parameters.add<IntParameter>      ('3', "correctionB"  , "Specify the blue channel correction"); | ||||||
|  | 		StringParameter    & argIdT        = parameters.add<StringParameter>   ('z', "qualifier" , "Identifier(qualifier) of the temperature to set"); | ||||||
|  | 		IntParameter       & argTempR      = parameters.add<IntParameter>      ('4', "tempR"  , "Specify the red channel temperature correction"); | ||||||
|  | 		IntParameter       & argTempG      = parameters.add<IntParameter>      ('5', "tempG"  , "Specify the red channel temperature correction"); | ||||||
|  | 		IntParameter       & argTempB      = parameters.add<IntParameter>      ('6', "tempB"  , "Specify the red channel temperature correction"); | ||||||
|  |  | ||||||
| 		// set the default values | 		// set the default values | ||||||
| 		argAddress.setDefault(defaultServerAddress.toStdString()); | 		argAddress.setDefault(defaultServerAddress.toStdString()); | ||||||
| @@ -85,10 +95,12 @@ int main(int argc, char * argv[]) | |||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		// check if at least one of the available color transforms is set | 		// check if at least one of the available color transforms is set | ||||||
| 		bool colorTransform = argSaturation.isSet() || argValue.isSet() || argThreshold.isSet() || argGamma.isSet() || argBlacklevel.isSet() || argWhitelevel.isSet(); | 		bool colorTransform = argSaturation.isSet() || argValue.isSet() || argSaturationL.isSet() || argLuminance.isSet() || argThreshold.isSet() || argGamma.isSet() || argBlacklevel.isSet() || argWhitelevel.isSet(); | ||||||
|  | 		bool colorCorrection = argCorrR.isSet() || argCorrG.isSet() || argCorrB.isSet(); | ||||||
|  | 		bool colorTemp = argTempR.isSet() || argTempG.isSet() || argTempB.isSet(); | ||||||
|  |  | ||||||
| 		// check that exactly one command was given | 		// check that exactly one command was given | ||||||
|         int commandCount = count({argColor.isSet(), argImage.isSet(), argEffect.isSet(), argServerInfo.isSet(), argClear.isSet(), argClearAll.isSet(), colorTransform}); |         int commandCount = count({argColor.isSet(), argImage.isSet(), argEffect.isSet(), argServerInfo.isSet(), argClear.isSet(), argClearAll.isSet(), colorTransform, colorCorrection, colorTemp}); | ||||||
| 		if (commandCount != 1) | 		if (commandCount != 1) | ||||||
| 		{ | 		{ | ||||||
| 			std::cerr << (commandCount == 0 ? "No command found." : "Multiple commands found.") << " Provide exactly one of the following options:" << std::endl; | 			std::cerr << (commandCount == 0 ? "No command found." : "Multiple commands found.") << " Provide exactly one of the following options:" << std::endl; | ||||||
| @@ -98,14 +110,26 @@ int main(int argc, char * argv[]) | |||||||
| 			std::cerr << "  " << argServerInfo.usageLine() << std::endl; | 			std::cerr << "  " << argServerInfo.usageLine() << std::endl; | ||||||
| 			std::cerr << "  " << argClear.usageLine() << std::endl; | 			std::cerr << "  " << argClear.usageLine() << std::endl; | ||||||
| 			std::cerr << "  " << argClearAll.usageLine() << std::endl; | 			std::cerr << "  " << argClearAll.usageLine() << std::endl; | ||||||
| 			std::cerr << "or one or more of the available color transformations:" << std::endl; | 			std::cerr << "one or more of the available color transformations:" << std::endl; | ||||||
| 			std::cerr << "  " << argId.usageLine() << std::endl; | 			std::cerr << "  " << argId.usageLine() << std::endl; | ||||||
| 			std::cerr << "  " << argSaturation.usageLine() << std::endl; | 			std::cerr << "  " << argSaturation.usageLine() << std::endl; | ||||||
| 			std::cerr << "  " << argValue.usageLine() << std::endl; | 			std::cerr << "  " << argValue.usageLine() << std::endl; | ||||||
|  | 			std::cerr << "  " << argSaturationL.usageLine() << std::endl; | ||||||
|  | 			std::cerr << "  " << argLuminance.usageLine() << std::endl; | ||||||
| 			std::cerr << "  " << argThreshold.usageLine() << std::endl; | 			std::cerr << "  " << argThreshold.usageLine() << std::endl; | ||||||
| 			std::cerr << "  " << argGamma.usageLine() << std::endl; | 			std::cerr << "  " << argGamma.usageLine() << std::endl; | ||||||
| 			std::cerr << "  " << argBlacklevel.usageLine() << std::endl; | 			std::cerr << "  " << argBlacklevel.usageLine() << std::endl; | ||||||
| 			std::cerr << "  " << argWhitelevel.usageLine() << std::endl; | 			std::cerr << "  " << argWhitelevel.usageLine() << std::endl; | ||||||
|  | 			std::cerr << "one or more of the available color corrections:" << std::endl; | ||||||
|  | 			std::cerr << "  " << argIdC.usageLine() << std::endl; | ||||||
|  | 			std::cerr << "  " << argCorrR.usageLine() << std::endl; | ||||||
|  | 			std::cerr << "  " << argCorrG.usageLine() << std::endl; | ||||||
|  | 			std::cerr << "  " << argCorrB.usageLine() << std::endl; | ||||||
|  | 			std::cerr << "or one or more of the available color temperature adjustment:" << std::endl; | ||||||
|  | 			std::cerr << "  " << argIdT.usageLine() << std::endl; | ||||||
|  | 			std::cerr << "  " << argTempR.usageLine() << std::endl; | ||||||
|  | 			std::cerr << "  " << argTempG.usageLine() << std::endl; | ||||||
|  | 			std::cerr << "  " << argTempB.usageLine() << std::endl; | ||||||
| 			return 1; | 			return 1; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| @@ -121,11 +145,11 @@ int main(int argc, char * argv[]) | |||||||
| 		{ | 		{ | ||||||
| 			connection.setImage(argImage.getValue(), argPriority.getValue(), argDuration.getValue()); | 			connection.setImage(argImage.getValue(), argPriority.getValue(), argDuration.getValue()); | ||||||
| 		} | 		} | ||||||
|         else if (argEffect.isSet()) |         	else if (argEffect.isSet()) | ||||||
|         { |         	{ | ||||||
|             connection.setEffect(argEffect.getValue(), argEffectArgs.getValue(), argPriority.getValue(), argDuration.getValue()); |         	 	connection.setEffect(argEffect.getValue(), argEffectArgs.getValue(), argPriority.getValue(), argDuration.getValue()); | ||||||
|         } |         	} | ||||||
|         else if (argServerInfo.isSet()) |         	else if (argServerInfo.isSet()) | ||||||
| 		{ | 		{ | ||||||
| 			QString info = connection.getServerInfo(); | 			QString info = connection.getServerInfo(); | ||||||
| 			std::cout << "Server info:\n" << info.toStdString() << std::endl; | 			std::cout << "Server info:\n" << info.toStdString() << std::endl; | ||||||
| @@ -141,26 +165,62 @@ int main(int argc, char * argv[]) | |||||||
| 		else if (colorTransform) | 		else if (colorTransform) | ||||||
| 		{ | 		{ | ||||||
| 			std::string transId; | 			std::string transId; | ||||||
| 			double saturation, value; | 			double saturation, value, saturationL, luminance; | ||||||
| 			ColorTransformValues threshold, gamma, blacklevel, whitelevel; | 			ColorTransformValues threshold, gamma, blacklevel, whitelevel; | ||||||
|  |  | ||||||
| 			if (argId.isSet())         transId    = argId.getValue(); | 			if (argId.isSet())         transId    = argId.getValue(); | ||||||
| 			if (argSaturation.isSet()) saturation = argSaturation.getValue(); | 			if (argSaturation.isSet()) saturation = argSaturation.getValue(); | ||||||
| 			if (argValue.isSet())      value      = argValue.getValue(); | 			if (argValue.isSet())      value      = argValue.getValue(); | ||||||
|  | 			if (argSaturationL.isSet()) saturationL = argSaturationL.getValue(); | ||||||
|  | 			if (argLuminance.isSet())  luminance      = argLuminance.getValue(); | ||||||
| 			if (argThreshold.isSet())  threshold  = argThreshold.getValue(); | 			if (argThreshold.isSet())  threshold  = argThreshold.getValue(); | ||||||
| 			if (argGamma.isSet())      gamma      = argGamma.getValue(); | 			if (argGamma.isSet())      gamma      = argGamma.getValue(); | ||||||
| 			if (argBlacklevel.isSet()) blacklevel = argBlacklevel.getValue(); | 			if (argBlacklevel.isSet()) blacklevel = argBlacklevel.getValue(); | ||||||
| 			if (argWhitelevel.isSet()) whitelevel = argWhitelevel.getValue(); | 			if (argWhitelevel.isSet()) whitelevel = argWhitelevel.getValue(); | ||||||
|  | 			 | ||||||
| 			connection.setTransform( | 			connection.setTransform( | ||||||
| 						argId.isSet()         ? &transId    : nullptr, | 						argId.isSet()         ? &transId    : nullptr, | ||||||
| 						argSaturation.isSet() ? &saturation : nullptr, | 						argSaturation.isSet() ? &saturation : nullptr, | ||||||
| 						argValue.isSet()      ? &value      : nullptr, | 						argValue.isSet()      ? &value      : nullptr, | ||||||
|  | 						argSaturationL.isSet() ? &saturationL : nullptr, | ||||||
|  | 						argLuminance.isSet()  ? &luminance      : nullptr, | ||||||
| 						argThreshold.isSet()  ? &threshold  : nullptr, | 						argThreshold.isSet()  ? &threshold  : nullptr, | ||||||
| 						argGamma.isSet()      ? &gamma      : nullptr, | 						argGamma.isSet()      ? &gamma      : nullptr, | ||||||
| 						argBlacklevel.isSet() ? &blacklevel : nullptr, | 						argBlacklevel.isSet() ? &blacklevel : nullptr, | ||||||
| 						argWhitelevel.isSet() ? &whitelevel : nullptr); | 						argWhitelevel.isSet() ? &whitelevel : nullptr); | ||||||
| 		} | 		} | ||||||
|  | 		else if (colorCorrection) | ||||||
|  | 		{ | ||||||
|  | 			std::string transId; | ||||||
|  | 			int red, green, blue; | ||||||
|  |  | ||||||
|  | 			if (argIdC.isSet())	transId    = argId.getValue(); | ||||||
|  | 			if (argCorrR.isSet())	red = argCorrR.getValue(); | ||||||
|  | 			if (argCorrG.isSet())	green = argCorrG.getValue(); | ||||||
|  | 			if (argCorrB.isSet())	blue = argCorrB.getValue(); | ||||||
|  | 			 | ||||||
|  | 			connection.setCorrection( | ||||||
|  | 						argIdC.isSet()		? &transId : nullptr, | ||||||
|  | 						argCorrR.isSet() 	? &red : nullptr, | ||||||
|  | 						argCorrG.isSet() 	? &green : nullptr, | ||||||
|  | 						argCorrB.isSet() 	? &blue : nullptr); | ||||||
|  | 		} | ||||||
|  | 		else if (colorTemp) | ||||||
|  | 		{ | ||||||
|  | 			std::string transId; | ||||||
|  | 			int red, green, blue; | ||||||
|  |  | ||||||
|  | 			if (argIdT.isSet())	transId    = argId.getValue(); | ||||||
|  | 			if (argTempR.isSet())	red = argTempR.getValue(); | ||||||
|  | 			if (argTempG.isSet())	green = argTempG.getValue(); | ||||||
|  | 			if (argTempB.isSet())	blue = argTempB.getValue(); | ||||||
|  | 			 | ||||||
|  | 			connection.setCorrection( | ||||||
|  | 						argIdC.isSet()		? &transId : nullptr, | ||||||
|  | 						argTempR.isSet() 	? &red : nullptr, | ||||||
|  | 						argTempG.isSet() 	? &green : nullptr, | ||||||
|  | 						argTempB.isSet() 	? &blue : nullptr); | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 	catch (const std::runtime_error & e) | 	catch (const std::runtime_error & e) | ||||||
| 	{ | 	{ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user