mirror of
				https://github.com/hyperion-project/hyperion.ng.git
				synced 2025-03-01 10:33:28 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			114 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
 | |
| // Syslog include
 | |
| #include <syslog.h>
 | |
| 
 | |
| // JsonSchema include
 | |
| #include <utils/jsonschema/JsonFactory.h>
 | |
| 
 | |
| // hyperion include
 | |
| #include <hyperion/Hyperion.h>
 | |
| #include <hyperion/LedDevice.h>
 | |
| 
 | |
| #include "LedDeviceWs2801.h"
 | |
| #include "ColorTransform.h"
 | |
| 
 | |
| using namespace hyperion;
 | |
| 
 | |
| LedDevice* constructDevice(const Json::Value& deviceConfig)
 | |
| {
 | |
| 	std::cout << "Device configuration: " << deviceConfig << std::endl;
 | |
| 	LedDevice* device = nullptr;
 | |
| 	if (deviceConfig["type"].asString() == "ws2801")
 | |
| 	{
 | |
| 		const std::string name = "WS-2801";
 | |
| 		const std::string output = deviceConfig["output"].asString();
 | |
| 		const unsigned interval  = deviceConfig["interval"].asInt();
 | |
| 		const unsigned rate      = deviceConfig["rate"].asInt();
 | |
| 
 | |
| 		LedDeviceWs2801* deviceWs2801 = new LedDeviceWs2801(name, output, interval, rate);
 | |
| 		deviceWs2801->open();
 | |
| 
 | |
| 		device = deviceWs2801;
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 		// Unknown / Unimplemented device
 | |
| 	}
 | |
| 	return device;
 | |
| }
 | |
| 
 | |
| ColorTransform* createColorTransform(const Json::Value& colorConfig)
 | |
| {
 | |
| 	const double threshold  = colorConfig["threshold"].asDouble();
 | |
| 	const double gamma      = colorConfig["gamma"].asDouble();
 | |
| 	const double blacklevel = colorConfig["blacklevel"].asDouble();
 | |
| 	const double whitelevel = colorConfig["whitelevel"].asDouble();
 | |
| 
 | |
| 	ColorTransform* transform = new ColorTransform(threshold, gamma, blacklevel, whitelevel);
 | |
| 	return transform;
 | |
| }
 | |
| LedString createLedString(const Json::Value& ledsConfig)
 | |
| {
 | |
| 	LedString ledString;
 | |
| 
 | |
| 	for (const Json::Value& ledConfig : ledsConfig)
 | |
| 	{
 | |
| 		Led led;
 | |
| 		led.index = ledConfig["index"].asInt();
 | |
| 		const Json::Value& hscanConfig = ledConfig["hscan"];
 | |
| 		const Json::Value& vscanConfig = ledConfig["vscan"];
 | |
| 		led.minX_frac = std::max(0.0, std::min(100.0, hscanConfig["minimum"].asDouble()))/100.0;
 | |
| 		led.maxX_frac = std::max(0.0, std::min(100.0, hscanConfig["maximum"].asDouble()))/100.0;
 | |
| 		led.minY_frac = 1.0 - std::max(0.0, std::min(100.0, vscanConfig["maximum"].asDouble()))/100.0;
 | |
| 		led.maxY_frac = 1.0 - std::max(0.0, std::min(100.0, vscanConfig["minimum"].asDouble()))/100.0;
 | |
| 
 | |
| 		ledString.leds().push_back(led);
 | |
| 	}
 | |
| 	return ledString;
 | |
| }
 | |
| 
 | |
| Hyperion::Hyperion(const Json::Value &jsonConfig) :
 | |
| 	mLedString(createLedString(jsonConfig["leds"])),
 | |
| 	mRedTransform(  createColorTransform(jsonConfig["color"]["red"])),
 | |
| 	mGreenTransform(createColorTransform(jsonConfig["color"]["green"])),
 | |
| 	mBlueTransform( createColorTransform(jsonConfig["color"]["blue"])),
 | |
| 	mDevice(constructDevice(jsonConfig["device"]))
 | |
| {
 | |
| 	// empty
 | |
| }
 | |
| 
 | |
| 
 | |
| Hyperion::~Hyperion()
 | |
| {
 | |
| 	// Delete the Led-String
 | |
| 	delete mDevice;
 | |
| 
 | |
| 	// Delete the color-transform
 | |
| 	delete mBlueTransform;
 | |
| 	delete mGreenTransform;
 | |
| 	delete mRedTransform;
 | |
| }
 | |
| 
 | |
| unsigned Hyperion::getLedCount() const
 | |
| {
 | |
| 	return mLedString.leds().size();
 | |
| }
 | |
| 
 | |
| void Hyperion::setValue(int priority, std::vector<RgbColor>& ledColors, const int timeout_ms)
 | |
| {
 | |
| 	// Apply the transform to each led and color-channel
 | |
| 	for (RgbColor& color : ledColors)
 | |
| 	{
 | |
| 		color.red   = mRedTransform->transform(color.red);
 | |
| 		color.green = mGreenTransform->transform(color.green);
 | |
| 		color.blue  = mBlueTransform->transform(color.blue);
 | |
| 	}
 | |
| 
 | |
| 	mMuxer.setInput(priority, ledColors);
 | |
| 
 | |
| 	if (priority == mMuxer.getCurrentPriority())
 | |
| 	{
 | |
| 		mDevice->write(ledColors);
 | |
| 	}
 | |
| }
 |