From e5395951a55144e93d383478bb338541b2eabaae Mon Sep 17 00:00:00 2001 From: johan Date: Sat, 2 Nov 2013 19:30:19 +0100 Subject: [PATCH] Fixed endianness issue in LDP6803 device Former-commit-id: 6762890065d791f3ad5f24526f2f735822b451e1 --- config/hyperion.config.json | 756 +++++++++++++-------------- deploy/hyperion-remote | Bin 244028 -> 244044 bytes deploy/hyperiond.REMOVED.git-id | 2 +- libsrc/hyperion/LedDeviceLdp6803.cpp | 22 +- libsrc/hyperion/LedDeviceLdp6803.h | 8 +- libsrc/hyperion/LedDeviceWs2801.cpp | 7 +- libsrc/hyperion/LedSpiDevice.cpp | 15 +- libsrc/hyperion/LedSpiDevice.h | 10 +- 8 files changed, 406 insertions(+), 414 deletions(-) diff --git a/config/hyperion.config.json b/config/hyperion.config.json index 8a8f6065..68d24c70 100644 --- a/config/hyperion.config.json +++ b/config/hyperion.config.json @@ -2,390 +2,390 @@ // Generated by: HyperCon (The Hyperion deamon configuration file builder { - /// Device configuration contains the following fields: - /// * 'name' : The user friendly name of the device (only used for display purposes) - /// * 'type' : The type of the device or leds (known types for now are 'ws2801', 'test' and 'none') - /// * 'output' : The output specification depends on selected device - /// - 'ws2801' this is the device (eg '/dev/spidev0.0') - /// - 'test' this is the file used to write test output (eg '/home/pi/hyperion.out') - /// * 'rate' : The baudrate of the output to the device (only applicable for 'ws2801') - /// * 'bgr-output' : Use BGR output instead of RGB (reverse red and blue). - "device" : - { - "name" : "MyPi", - "type" : "ws2801", - "output" : "/dev/spidev0.0", - "rate" : 1000000, - "bgr-output" : false - }, + /// Device configuration contains the following fields: + /// * 'name' : The user friendly name of the device (only used for display purposes) + /// * 'type' : The type of the device or leds (known types for now are 'ws2801', 'ldp6803', 'test' and 'none') + /// * 'output' : The output specification depends on selected device + /// - 'ws2801' this is the device (eg '/dev/spidev0.0') + /// - 'test' this is the file used to write test output (eg '/home/pi/hyperion.out') + /// * 'rate' : The baudrate of the output to the device (only applicable for 'ws2801') + /// * 'bgr-output' : Use BGR output instead of RGB (reverse red and blue). + "device" : + { + "name" : "MyPi", + "type" : "ws2801", + "output" : "/dev/spidev0.0", + "rate" : 1000000, + "bgr-output" : false + }, - /// Color manipulation configuration used to tune the output colors to specific surroundings. Contains the following fields: - /// * 'hsv' : The manipulation in the Hue-Saturation-Value color domain with the following tuning parameters: - /// - 'saturationGain' The gain adjustement of the saturation - /// - 'valueGain' The gain adjustement of the value - /// * 'red'/'green'/'blue' : The manipulation in the Red-Green-Blue color domain with the following tuning parameters for each channel: - /// - 'threshold' The minimum required input value for the channel to be on (else zero) - /// - 'gamma' The gamma-curve correction factor - /// - 'blacklevel' The lowest possible value (when the channel is black) - /// - 'whitelevel' The highest possible value (when the channel is white) - /// * 'smoothing' : Smoothing of the colors in the time-domain with the following tuning parameters: - /// - 'type' The type of smoothing algorithm ('linear' or 'none') - /// - 'time_ms' The time constant for smoothing algorithm in milliseconds - /// - 'updateFrequency' The update frequency of the leds in Hz - "color" : - { - "hsv" : - { - "saturationGain" : 1.0000, - "valueGain" : 1.5000 - }, - "red" : - { - "threshold" : 0.1000, - "gamma" : 2.0000, - "blacklevel" : 0.0000, - "whitelevel" : 0.8000 - }, - "green" : - { - "threshold" : 0.1000, - "gamma" : 2.0000, - "blacklevel" : 0.0000, - "whitelevel" : 1.0000 - }, - "blue" : - { - "threshold" : 0.1000, - "gamma" : 2.0000, - "blacklevel" : 0.0000, - "whitelevel" : 1.0000 - }, - "smoothing" : - { - "type" : "none", - "time_ms" : 200, - "updateFrequency" : 20.0000 - } - }, + /// Color manipulation configuration used to tune the output colors to specific surroundings. Contains the following fields: + /// * 'hsv' : The manipulation in the Hue-Saturation-Value color domain with the following tuning parameters: + /// - 'saturationGain' The gain adjustement of the saturation + /// - 'valueGain' The gain adjustement of the value + /// * 'red'/'green'/'blue' : The manipulation in the Red-Green-Blue color domain with the following tuning parameters for each channel: + /// - 'threshold' The minimum required input value for the channel to be on (else zero) + /// - 'gamma' The gamma-curve correction factor + /// - 'blacklevel' The lowest possible value (when the channel is black) + /// - 'whitelevel' The highest possible value (when the channel is white) + /// * 'smoothing' : Smoothing of the colors in the time-domain with the following tuning parameters: + /// - 'type' The type of smoothing algorithm ('linear' or 'none') + /// - 'time_ms' The time constant for smoothing algorithm in milliseconds + /// - 'updateFrequency' The update frequency of the leds in Hz + "color" : + { + "hsv" : + { + "saturationGain" : 1.0000, + "valueGain" : 1.5000 + }, + "red" : + { + "threshold" : 0.1000, + "gamma" : 2.0000, + "blacklevel" : 0.0000, + "whitelevel" : 0.8000 + }, + "green" : + { + "threshold" : 0.1000, + "gamma" : 2.0000, + "blacklevel" : 0.0000, + "whitelevel" : 1.0000 + }, + "blue" : + { + "threshold" : 0.1000, + "gamma" : 2.0000, + "blacklevel" : 0.0000, + "whitelevel" : 1.0000 + }, + "smoothing" : + { + "type" : "none", + "time_ms" : 200, + "updateFrequency" : 20.0000 + } + }, - /// The configuration for each individual led. This contains the specification of the area - /// averaged of an input image for each led to determine its color. Each item in the list - /// contains the following fields: - /// * index: The index of the led. This determines its location in the string of leds; zero - /// being the first led. - /// * hscan: The fractional part of the image along the horizontal used for the averaging - /// (minimum and maximum inclusive) - /// * vscan: The fractional part of the image along the vertical used for the averaging - /// (minimum and maximum inclusive) - "leds" : - [ - { - "index" : 0, - "hscan" : { "minimum" : 0.4375, "maximum" : 0.5000 }, - "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } - }, - { - "index" : 1, - "hscan" : { "minimum" : 0.3750, "maximum" : 0.4375 }, - "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } - }, - { - "index" : 2, - "hscan" : { "minimum" : 0.3125, "maximum" : 0.3750 }, - "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } - }, - { - "index" : 3, - "hscan" : { "minimum" : 0.2500, "maximum" : 0.3125 }, - "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } - }, - { - "index" : 4, - "hscan" : { "minimum" : 0.1875, "maximum" : 0.2500 }, - "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } - }, - { - "index" : 5, - "hscan" : { "minimum" : 0.1250, "maximum" : 0.1875 }, - "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } - }, - { - "index" : 6, - "hscan" : { "minimum" : 0.0625, "maximum" : 0.1250 }, - "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } - }, - { - "index" : 7, - "hscan" : { "minimum" : 0.0000, "maximum" : 0.0625 }, - "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } - }, - { - "index" : 8, - "hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 }, - "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } - }, - { - "index" : 9, - "hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 }, - "vscan" : { "minimum" : 0.8571, "maximum" : 1.0000 } - }, - { - "index" : 10, - "hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 }, - "vscan" : { "minimum" : 0.7143, "maximum" : 0.8571 } - }, - { - "index" : 11, - "hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 }, - "vscan" : { "minimum" : 0.5714, "maximum" : 0.7143 } - }, - { - "index" : 12, - "hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 }, - "vscan" : { "minimum" : 0.4286, "maximum" : 0.5714 } - }, - { - "index" : 13, - "hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 }, - "vscan" : { "minimum" : 0.2857, "maximum" : 0.4286 } - }, - { - "index" : 14, - "hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 }, - "vscan" : { "minimum" : 0.1429, "maximum" : 0.2857 } - }, - { - "index" : 15, - "hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 }, - "vscan" : { "minimum" : 0.0000, "maximum" : 0.1429 } - }, - { - "index" : 16, - "hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 }, - "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } - }, - { - "index" : 17, - "hscan" : { "minimum" : 0.0000, "maximum" : 0.0625 }, - "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } - }, - { - "index" : 18, - "hscan" : { "minimum" : 0.0625, "maximum" : 0.1250 }, - "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } - }, - { - "index" : 19, - "hscan" : { "minimum" : 0.1250, "maximum" : 0.1875 }, - "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } - }, - { - "index" : 20, - "hscan" : { "minimum" : 0.1875, "maximum" : 0.2500 }, - "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } - }, - { - "index" : 21, - "hscan" : { "minimum" : 0.2500, "maximum" : 0.3125 }, - "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } - }, - { - "index" : 22, - "hscan" : { "minimum" : 0.3125, "maximum" : 0.3750 }, - "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } - }, - { - "index" : 23, - "hscan" : { "minimum" : 0.3750, "maximum" : 0.4375 }, - "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } - }, - { - "index" : 24, - "hscan" : { "minimum" : 0.4375, "maximum" : 0.5000 }, - "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } - }, - { - "index" : 25, - "hscan" : { "minimum" : 0.5000, "maximum" : 0.5625 }, - "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } - }, - { - "index" : 26, - "hscan" : { "minimum" : 0.5625, "maximum" : 0.6250 }, - "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } - }, - { - "index" : 27, - "hscan" : { "minimum" : 0.6250, "maximum" : 0.6875 }, - "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } - }, - { - "index" : 28, - "hscan" : { "minimum" : 0.6875, "maximum" : 0.7500 }, - "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } - }, - { - "index" : 29, - "hscan" : { "minimum" : 0.7500, "maximum" : 0.8125 }, - "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } - }, - { - "index" : 30, - "hscan" : { "minimum" : 0.8125, "maximum" : 0.8750 }, - "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } - }, - { - "index" : 31, - "hscan" : { "minimum" : 0.8750, "maximum" : 0.9375 }, - "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } - }, - { - "index" : 32, - "hscan" : { "minimum" : 0.9375, "maximum" : 1.0000 }, - "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } - }, - { - "index" : 33, - "hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 }, - "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } - }, - { - "index" : 34, - "hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 }, - "vscan" : { "minimum" : 0.0000, "maximum" : 0.1429 } - }, - { - "index" : 35, - "hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 }, - "vscan" : { "minimum" : 0.1429, "maximum" : 0.2857 } - }, - { - "index" : 36, - "hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 }, - "vscan" : { "minimum" : 0.2857, "maximum" : 0.4286 } - }, - { - "index" : 37, - "hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 }, - "vscan" : { "minimum" : 0.4286, "maximum" : 0.5714 } - }, - { - "index" : 38, - "hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 }, - "vscan" : { "minimum" : 0.5714, "maximum" : 0.7143 } - }, - { - "index" : 39, - "hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 }, - "vscan" : { "minimum" : 0.7143, "maximum" : 0.8571 } - }, - { - "index" : 40, - "hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 }, - "vscan" : { "minimum" : 0.8571, "maximum" : 1.0000 } - }, - { - "index" : 41, - "hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 }, - "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } - }, - { - "index" : 42, - "hscan" : { "minimum" : 0.9375, "maximum" : 1.0000 }, - "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } - }, - { - "index" : 43, - "hscan" : { "minimum" : 0.8750, "maximum" : 0.9375 }, - "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } - }, - { - "index" : 44, - "hscan" : { "minimum" : 0.8125, "maximum" : 0.8750 }, - "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } - }, - { - "index" : 45, - "hscan" : { "minimum" : 0.7500, "maximum" : 0.8125 }, - "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } - }, - { - "index" : 46, - "hscan" : { "minimum" : 0.6875, "maximum" : 0.7500 }, - "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } - }, - { - "index" : 47, - "hscan" : { "minimum" : 0.6250, "maximum" : 0.6875 }, - "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } - }, - { - "index" : 48, - "hscan" : { "minimum" : 0.5625, "maximum" : 0.6250 }, - "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } - }, - { - "index" : 49, - "hscan" : { "minimum" : 0.5000, "maximum" : 0.5625 }, - "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } - } - ], + /// The configuration for each individual led. This contains the specification of the area + /// averaged of an input image for each led to determine its color. Each item in the list + /// contains the following fields: + /// * index: The index of the led. This determines its location in the string of leds; zero + /// being the first led. + /// * hscan: The fractional part of the image along the horizontal used for the averaging + /// (minimum and maximum inclusive) + /// * vscan: The fractional part of the image along the vertical used for the averaging + /// (minimum and maximum inclusive) + "leds" : + [ + { + "index" : 0, + "hscan" : { "minimum" : 0.4375, "maximum" : 0.5000 }, + "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } + }, + { + "index" : 1, + "hscan" : { "minimum" : 0.3750, "maximum" : 0.4375 }, + "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } + }, + { + "index" : 2, + "hscan" : { "minimum" : 0.3125, "maximum" : 0.3750 }, + "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } + }, + { + "index" : 3, + "hscan" : { "minimum" : 0.2500, "maximum" : 0.3125 }, + "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } + }, + { + "index" : 4, + "hscan" : { "minimum" : 0.1875, "maximum" : 0.2500 }, + "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } + }, + { + "index" : 5, + "hscan" : { "minimum" : 0.1250, "maximum" : 0.1875 }, + "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } + }, + { + "index" : 6, + "hscan" : { "minimum" : 0.0625, "maximum" : 0.1250 }, + "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } + }, + { + "index" : 7, + "hscan" : { "minimum" : 0.0000, "maximum" : 0.0625 }, + "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } + }, + { + "index" : 8, + "hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 }, + "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } + }, + { + "index" : 9, + "hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 }, + "vscan" : { "minimum" : 0.8571, "maximum" : 1.0000 } + }, + { + "index" : 10, + "hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 }, + "vscan" : { "minimum" : 0.7143, "maximum" : 0.8571 } + }, + { + "index" : 11, + "hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 }, + "vscan" : { "minimum" : 0.5714, "maximum" : 0.7143 } + }, + { + "index" : 12, + "hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 }, + "vscan" : { "minimum" : 0.4286, "maximum" : 0.5714 } + }, + { + "index" : 13, + "hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 }, + "vscan" : { "minimum" : 0.2857, "maximum" : 0.4286 } + }, + { + "index" : 14, + "hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 }, + "vscan" : { "minimum" : 0.1429, "maximum" : 0.2857 } + }, + { + "index" : 15, + "hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 }, + "vscan" : { "minimum" : 0.0000, "maximum" : 0.1429 } + }, + { + "index" : 16, + "hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 }, + "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } + }, + { + "index" : 17, + "hscan" : { "minimum" : 0.0000, "maximum" : 0.0625 }, + "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } + }, + { + "index" : 18, + "hscan" : { "minimum" : 0.0625, "maximum" : 0.1250 }, + "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } + }, + { + "index" : 19, + "hscan" : { "minimum" : 0.1250, "maximum" : 0.1875 }, + "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } + }, + { + "index" : 20, + "hscan" : { "minimum" : 0.1875, "maximum" : 0.2500 }, + "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } + }, + { + "index" : 21, + "hscan" : { "minimum" : 0.2500, "maximum" : 0.3125 }, + "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } + }, + { + "index" : 22, + "hscan" : { "minimum" : 0.3125, "maximum" : 0.3750 }, + "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } + }, + { + "index" : 23, + "hscan" : { "minimum" : 0.3750, "maximum" : 0.4375 }, + "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } + }, + { + "index" : 24, + "hscan" : { "minimum" : 0.4375, "maximum" : 0.5000 }, + "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } + }, + { + "index" : 25, + "hscan" : { "minimum" : 0.5000, "maximum" : 0.5625 }, + "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } + }, + { + "index" : 26, + "hscan" : { "minimum" : 0.5625, "maximum" : 0.6250 }, + "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } + }, + { + "index" : 27, + "hscan" : { "minimum" : 0.6250, "maximum" : 0.6875 }, + "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } + }, + { + "index" : 28, + "hscan" : { "minimum" : 0.6875, "maximum" : 0.7500 }, + "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } + }, + { + "index" : 29, + "hscan" : { "minimum" : 0.7500, "maximum" : 0.8125 }, + "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } + }, + { + "index" : 30, + "hscan" : { "minimum" : 0.8125, "maximum" : 0.8750 }, + "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } + }, + { + "index" : 31, + "hscan" : { "minimum" : 0.8750, "maximum" : 0.9375 }, + "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } + }, + { + "index" : 32, + "hscan" : { "minimum" : 0.9375, "maximum" : 1.0000 }, + "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } + }, + { + "index" : 33, + "hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 }, + "vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 } + }, + { + "index" : 34, + "hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 }, + "vscan" : { "minimum" : 0.0000, "maximum" : 0.1429 } + }, + { + "index" : 35, + "hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 }, + "vscan" : { "minimum" : 0.1429, "maximum" : 0.2857 } + }, + { + "index" : 36, + "hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 }, + "vscan" : { "minimum" : 0.2857, "maximum" : 0.4286 } + }, + { + "index" : 37, + "hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 }, + "vscan" : { "minimum" : 0.4286, "maximum" : 0.5714 } + }, + { + "index" : 38, + "hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 }, + "vscan" : { "minimum" : 0.5714, "maximum" : 0.7143 } + }, + { + "index" : 39, + "hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 }, + "vscan" : { "minimum" : 0.7143, "maximum" : 0.8571 } + }, + { + "index" : 40, + "hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 }, + "vscan" : { "minimum" : 0.8571, "maximum" : 1.0000 } + }, + { + "index" : 41, + "hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 }, + "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } + }, + { + "index" : 42, + "hscan" : { "minimum" : 0.9375, "maximum" : 1.0000 }, + "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } + }, + { + "index" : 43, + "hscan" : { "minimum" : 0.8750, "maximum" : 0.9375 }, + "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } + }, + { + "index" : 44, + "hscan" : { "minimum" : 0.8125, "maximum" : 0.8750 }, + "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } + }, + { + "index" : 45, + "hscan" : { "minimum" : 0.7500, "maximum" : 0.8125 }, + "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } + }, + { + "index" : 46, + "hscan" : { "minimum" : 0.6875, "maximum" : 0.7500 }, + "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } + }, + { + "index" : 47, + "hscan" : { "minimum" : 0.6250, "maximum" : 0.6875 }, + "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } + }, + { + "index" : 48, + "hscan" : { "minimum" : 0.5625, "maximum" : 0.6250 }, + "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } + }, + { + "index" : 49, + "hscan" : { "minimum" : 0.5000, "maximum" : 0.5625 }, + "vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 } + } + ], - /// The black border configuration, contains the following items: - /// * enable : true if the detector should be activated - "blackborderdetector" : - { - "enable" : true - }, + /// The black border configuration, contains the following items: + /// * enable : true if the detector should be activated + "blackborderdetector" : + { + "enable" : true + }, - /// The boot-sequence configuration, contains the following items: - /// * type : The type of the boot-sequence ('rainbow', 'knight_rider', 'none') - /// * duration_ms : The length of the boot-sequence [ms] - "bootsequence" : - { - "type" : "Rainbow", - "duration_ms" : 3000 - }, + /// The boot-sequence configuration, contains the following items: + /// * type : The type of the boot-sequence ('rainbow', 'knight_rider', 'none') + /// * duration_ms : The length of the boot-sequence [ms] + "bootsequence" : + { + "type" : "Rainbow", + "duration_ms" : 3000 + }, - /// The configuration for the frame-grabber, contains the following items: - /// * width : The width of the grabbed frames [pixels] - /// * height : The height of the grabbed frames [pixels] - /// * frequency_Hz : The frequency of the frame grab [Hz] - "framegrabber" : - { - "width" : 64, - "height" : 64, - "frequency_Hz" : 10.0 - }, + /// The configuration for the frame-grabber, contains the following items: + /// * width : The width of the grabbed frames [pixels] + /// * height : The height of the grabbed frames [pixels] + /// * frequency_Hz : The frequency of the frame grab [Hz] + "framegrabber" : + { + "width" : 64, + "height" : 64, + "frequency_Hz" : 10.0 + }, - /// The configuration of the XBMC connection used to enable and disable the frame-grabber. Contains the following fields: - /// * xbmcAddress : The IP address of the XBMC-host - /// * xbmcTcpPort : The TCP-port of the XBMC-server - /// * grabVideo : Flag indicating that the frame-grabber is on(true) during video playback - /// * grabPictures : Flag indicating that the frame-grabber is on(true) during picture show - /// * grabAudio : Flag indicating that the frame-grabber is on(true) during audio playback - /// * grabMenu : Flag indicating that the frame-grabber is on(true) in the XBMC menu - "xbmcVideoChecker" : - { - "xbmcAddress" : "127.0.0.1", - "xbmcTcpPort" : 9090, - "grabVideo" : true, - "grabPictures" : true, - "grabAudio" : true, - "grabMenu" : false - }, + /// The configuration of the XBMC connection used to enable and disable the frame-grabber. Contains the following fields: + /// * xbmcAddress : The IP address of the XBMC-host + /// * xbmcTcpPort : The TCP-port of the XBMC-server + /// * grabVideo : Flag indicating that the frame-grabber is on(true) during video playback + /// * grabPictures : Flag indicating that the frame-grabber is on(true) during picture show + /// * grabAudio : Flag indicating that the frame-grabber is on(true) during audio playback + /// * grabMenu : Flag indicating that the frame-grabber is on(true) in the XBMC menu + "xbmcVideoChecker" : + { + "xbmcAddress" : "127.0.0.1", + "xbmcTcpPort" : 9090, + "grabVideo" : true, + "grabPictures" : true, + "grabAudio" : true, + "grabMenu" : false + }, - /// The configuration of the Json server which enables the json remote interface - /// * port : Port at which the json server is started - "jsonServer" : - { - "port" : 19444 - }, + /// The configuration of the Json server which enables the json remote interface + /// * port : Port at which the json server is started + "jsonServer" : + { + "port" : 19444 + }, - /// The configuration of the Proto server which enables the protobuffer remote interface - /// * port : Port at which the protobuffer server is started - "protoServer" : - { - "port" : 19445 - } + /// The configuration of the Proto server which enables the protobuffer remote interface + /// * port : Port at which the protobuffer server is started + "protoServer" : + { + "port" : 19445 + } } diff --git a/deploy/hyperion-remote b/deploy/hyperion-remote index 5d5eea631be85e9ed10f06617b1e381be40c2a27..ad1653d62f38c0283f2cf345ef53b37587bbe48d 100755 GIT binary patch delta 72387 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�Ph=qDjJ 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 delta 72357 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 &ledValues) { // Reconfigure if the current connfiguration does not match the required configuration - if (ledValues.size() != _ledBuffer.size()) + if (4 + 2*ledValues.size() != _ledBuffer.size()) { - // Initialise the buffer with all 'black' values - _ledBuffer.resize(ledValues.size() + 2, 0x80); - _ledBuffer[0] = 0; - _ledBuffer[1] = 0; + // Initialise the buffer + _ledBuffer.resize(4 + 2*ledValues.size(), 0x00); } - // Copy the colors from the RgbColor vector to the Ldp6803Rgb vector + // Copy the colors from the RgbColor vector to the Ldp6803 data vector for (unsigned iLed=0; iLed> 3); - - _ledBuffer[iLed + 2] = packedRgb; + _ledBuffer[4 + 2 * iLed] = 0x80 | ((rgb.red & 0xf8) >> 1) | (rgb.green >> 6); + _ledBuffer[5 + 2 * iLed] = ((rgb.green & 0x38) << 2) | (rgb.blue >> 3); } // Write the data - const unsigned bufCnt = _ledBuffer.size() * sizeof(short); - const char * bufPtr = reinterpret_cast(_ledBuffer.data()); - if (latch(bufCnt, bufPtr, 0) < 0) + if (writeBytes(_ledBuffer.size(), _ledBuffer.data()) < 0) { return -1; } diff --git a/libsrc/hyperion/LedDeviceLdp6803.h b/libsrc/hyperion/LedDeviceLdp6803.h index ee57e1e5..096468c2 100644 --- a/libsrc/hyperion/LedDeviceLdp6803.h +++ b/libsrc/hyperion/LedDeviceLdp6803.h @@ -6,12 +6,12 @@ /// /// Implementation of the LedDevice interface for writing to LDP6803 led device. /// -/// 00000000 00000000 00000000 00000000 1XXXXXYY YYYZZZZZ 1XXXXXYY YYYZZZZZ ... +/// 00000000 00000000 00000000 00000000 1RRRRRGG GGGBBBBB 1RRRRRGG GGGBBBBB ... /// |---------------------------------| |---------------| |---------------| /// 32 zeros to start the frame Led1 Led2 ... /// /// For each led, the first bit is always 1, and then you have 5 bits each for red, green and blue -/// (X, Y and Z in the above illustration) making 16 bits per led. Total bits = 32 + (16 x number of +/// (R, G and B in the above illustration) making 16 bits per led. Total bytes = 4 + (2 x number of /// leds) /// class LedDeviceLdp6803 : public LedSpiDevice @@ -20,7 +20,7 @@ public: /// /// Constructs the LedDevice for a string containing leds of the type LDP6803 /// - /// @param[in] outputDevice The name of the output device (eg '/etc/SpiDev.0.0') + /// @param[in] outputDevice The name of the output device (eg '/dev/spidev0.0') /// @param[in] baudrate The used baudrate for writing to the output device /// LedDeviceLdp6803(const std::string& outputDevice, const unsigned baudrate); @@ -38,5 +38,5 @@ public: private: /// The buffer containing the packed RGB values - std::vector _ledBuffer; + std::vector _ledBuffer; }; diff --git a/libsrc/hyperion/LedDeviceWs2801.cpp b/libsrc/hyperion/LedDeviceWs2801.cpp index 2c95e80e..05d06119 100644 --- a/libsrc/hyperion/LedDeviceWs2801.cpp +++ b/libsrc/hyperion/LedDeviceWs2801.cpp @@ -12,7 +12,7 @@ #include "LedDeviceWs2801.h" LedDeviceWs2801::LedDeviceWs2801(const std::string& outputDevice, const unsigned baudrate) : - LedSpiDevice(outputDevice, baudrate), + LedSpiDevice(outputDevice, baudrate, 500000), mLedCount(0) { // empty @@ -23,10 +23,9 @@ int LedDeviceWs2801::write(const std::vector &ledValues) mLedCount = ledValues.size(); const unsigned dataLen = ledValues.size() * sizeof(RgbColor); - const char * dataPtr = reinterpret_cast(ledValues.data()); + const uint8_t * dataPtr = reinterpret_cast(ledValues.data()); - const int retVal = latch(dataLen, dataPtr, 500000); - return retVal; + return writeBytes(dataLen, dataPtr); } int LedDeviceWs2801::switchOff() diff --git a/libsrc/hyperion/LedSpiDevice.cpp b/libsrc/hyperion/LedSpiDevice.cpp index 7c99b6fa..a4c7125c 100644 --- a/libsrc/hyperion/LedSpiDevice.cpp +++ b/libsrc/hyperion/LedSpiDevice.cpp @@ -12,9 +12,10 @@ #include "LedSpiDevice.h" -LedSpiDevice::LedSpiDevice(const std::string& outputDevice, const unsigned baudrate) : +LedSpiDevice::LedSpiDevice(const std::string& outputDevice, const unsigned baudrate, const int latchTime_ns) : mDeviceName(outputDevice), mBaudRate_Hz(baudrate), + mLatchTime_ns(latchTime_ns), mFid(-1) { memset(&spi, 0, sizeof(spi)); @@ -56,30 +57,28 @@ int LedSpiDevice::open() return 0; } -int LedSpiDevice::latch(const unsigned len, const char * vec, const int latchTime_ns) +int LedSpiDevice::writeBytes(const unsigned size, const uint8_t * data) { - if (mFid < 0) { return -1; } - spi.tx_buf = __u64(vec); - spi.len = __u32(len); + spi.tx_buf = __u64(data); + spi.len = __u32(size); int retVal = ioctl(mFid, SPI_IOC_MESSAGE(1), &spi); - if (retVal == 0 && latchTime_ns > 0) + if (retVal == 0 && mLatchTime_ns > 0) { // The 'latch' time for latching the shifted-value into the leds timespec latchTime; latchTime.tv_sec = 0; - latchTime.tv_nsec = latchTime_ns; + latchTime.tv_nsec = mLatchTime_ns; // Sleep to latch the leds (only if write succesfull) nanosleep(&latchTime, NULL); } return retVal; - } diff --git a/libsrc/hyperion/LedSpiDevice.h b/libsrc/hyperion/LedSpiDevice.h index bdeb9b38..51d03bfb 100644 --- a/libsrc/hyperion/LedSpiDevice.h +++ b/libsrc/hyperion/LedSpiDevice.h @@ -18,7 +18,7 @@ public: /// @param[in] outputDevice The name of the output device (eg '/etc/SpiDev.0.0') /// @param[in] baudrate The used baudrate for writing to the output device /// - LedSpiDevice(const std::string& outputDevice, const unsigned baudrate); + LedSpiDevice(const std::string& outputDevice, const unsigned baudrate, const int latchTime_ns = -1); /// /// Destructor of the LedDevice; closes the output device if it is open @@ -37,20 +37,22 @@ protected: * Writes the given bytes/bits to the SPI-device and sleeps the latch time to ensure that the * values are latched. * - * @param[in[ len The length of the data - * @param[in] vec The data + * @param[in[ size The length of the data + * @param[in] data The data * @param[in] latchTime_ns The latch-time to latch in the values across the SPI-device (negative * means no latch required) [ns] * * @return Zero on succes else negative */ - int latch(const unsigned len, const char * vec, const int latchTime_ns); + int writeBytes(const unsigned size, const uint8_t *data); private: /// The name of the output device const std::string mDeviceName; /// The used baudrate of the output device const int mBaudRate_Hz; + /// The time which the device should be untouched after a write + const int mLatchTime_ns; /// The File Identifier of the opened output device (or -1 if not opened) int mFid;