mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2023-10-10 13:36:59 +02:00
Merge remote-tracking branch 'remotes/origin/master'
Conflicts: src/config-tool/ConfigTool/src/org/hyperion/hypercon/gui/ConfigPanel.java src/config-tool/ConfigTool/src/org/hyperion/hypercon/gui/LedFramePanel.java src/config-tool/ConfigTool/src/org/hyperion/hypercon/spec/DeviceConfig.java Former-commit-id: 18ef539aef815aaf80e0954b27647d29acb0be6c
This commit is contained in:
commit
8e978047a1
@ -2,390 +2,390 @@
|
|||||||
// Generated by: HyperCon (The Hyperion deamon configuration file builder
|
// Generated by: HyperCon (The Hyperion deamon configuration file builder
|
||||||
|
|
||||||
{
|
{
|
||||||
/// Device configuration contains the following fields:
|
/// Device configuration contains the following fields:
|
||||||
/// * 'name' : The user friendly name of the device (only used for display purposes)
|
/// * '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')
|
/// * '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
|
/// * 'output' : The output specification depends on selected device
|
||||||
/// - 'ws2801' this is the device (eg '/dev/spidev0.0')
|
/// - 'ws2801' this is the device (eg '/dev/spidev0.0')
|
||||||
/// - 'test' this is the file used to write test output (eg '/home/pi/hyperion.out')
|
/// - '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')
|
/// * '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).
|
/// * 'colorOrder' : The order of the color bytes ('rgb', 'rbg', 'bgr', etc.).
|
||||||
"device" :
|
"device" :
|
||||||
{
|
{
|
||||||
"name" : "MyPi",
|
"name" : "MyPi",
|
||||||
"type" : "ws2801",
|
"type" : "ws2801",
|
||||||
"output" : "/dev/spidev0.0",
|
"output" : "/dev/spidev0.0",
|
||||||
"rate" : 1000000,
|
"rate" : 1000000,
|
||||||
"bgr-output" : false
|
"colorOrder" : "rgb"
|
||||||
},
|
},
|
||||||
|
|
||||||
/// Color manipulation configuration used to tune the output colors to specific surroundings. Contains the following fields:
|
/// 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:
|
/// * 'hsv' : The manipulation in the Hue-Saturation-Value color domain with the following tuning parameters:
|
||||||
/// - 'saturationGain' The gain adjustement of the saturation
|
/// - 'saturationGain' The gain adjustement of the saturation
|
||||||
/// - 'valueGain' The gain adjustement of the value
|
/// - '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:
|
/// * '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)
|
/// - 'threshold' The minimum required input value for the channel to be on (else zero)
|
||||||
/// - 'gamma' The gamma-curve correction factor
|
/// - 'gamma' The gamma-curve correction factor
|
||||||
/// - 'blacklevel' The lowest possible value (when the channel is black)
|
/// - 'blacklevel' The lowest possible value (when the channel is black)
|
||||||
/// - 'whitelevel' The highest possible value (when the channel is white)
|
/// - 'whitelevel' The highest possible value (when the channel is white)
|
||||||
/// * 'smoothing' : Smoothing of the colors in the time-domain with the following tuning parameters:
|
/// * 'smoothing' : Smoothing of the colors in the time-domain with the following tuning parameters:
|
||||||
/// - 'type' The type of smoothing algorithm ('linear' or 'none')
|
/// - 'type' The type of smoothing algorithm ('linear' or 'none')
|
||||||
/// - 'time_ms' The time constant for smoothing algorithm in milliseconds
|
/// - 'time_ms' The time constant for smoothing algorithm in milliseconds
|
||||||
/// - 'updateFrequency' The update frequency of the leds in Hz
|
/// - 'updateFrequency' The update frequency of the leds in Hz
|
||||||
"color" :
|
"color" :
|
||||||
{
|
{
|
||||||
"hsv" :
|
"hsv" :
|
||||||
{
|
{
|
||||||
"saturationGain" : 1.0000,
|
"saturationGain" : 1.0000,
|
||||||
"valueGain" : 1.5000
|
"valueGain" : 1.5000
|
||||||
},
|
},
|
||||||
"red" :
|
"red" :
|
||||||
{
|
{
|
||||||
"threshold" : 0.1000,
|
"threshold" : 0.1000,
|
||||||
"gamma" : 2.0000,
|
"gamma" : 2.0000,
|
||||||
"blacklevel" : 0.0000,
|
"blacklevel" : 0.0000,
|
||||||
"whitelevel" : 0.8000
|
"whitelevel" : 0.8000
|
||||||
},
|
},
|
||||||
"green" :
|
"green" :
|
||||||
{
|
{
|
||||||
"threshold" : 0.1000,
|
"threshold" : 0.1000,
|
||||||
"gamma" : 2.0000,
|
"gamma" : 2.0000,
|
||||||
"blacklevel" : 0.0000,
|
"blacklevel" : 0.0000,
|
||||||
"whitelevel" : 1.0000
|
"whitelevel" : 1.0000
|
||||||
},
|
},
|
||||||
"blue" :
|
"blue" :
|
||||||
{
|
{
|
||||||
"threshold" : 0.1000,
|
"threshold" : 0.1000,
|
||||||
"gamma" : 2.0000,
|
"gamma" : 2.0000,
|
||||||
"blacklevel" : 0.0000,
|
"blacklevel" : 0.0000,
|
||||||
"whitelevel" : 1.0000
|
"whitelevel" : 1.0000
|
||||||
},
|
},
|
||||||
"smoothing" :
|
"smoothing" :
|
||||||
{
|
{
|
||||||
"type" : "none",
|
"type" : "none",
|
||||||
"time_ms" : 200,
|
"time_ms" : 200,
|
||||||
"updateFrequency" : 20.0000
|
"updateFrequency" : 20.0000
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
/// The configuration for each individual led. This contains the specification of the area
|
/// 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
|
/// averaged of an input image for each led to determine its color. Each item in the list
|
||||||
/// contains the following fields:
|
/// contains the following fields:
|
||||||
/// * index: The index of the led. This determines its location in the string of leds; zero
|
/// * index: The index of the led. This determines its location in the string of leds; zero
|
||||||
/// being the first led.
|
/// being the first led.
|
||||||
/// * hscan: The fractional part of the image along the horizontal used for the averaging
|
/// * hscan: The fractional part of the image along the horizontal used for the averaging
|
||||||
/// (minimum and maximum inclusive)
|
/// (minimum and maximum inclusive)
|
||||||
/// * vscan: The fractional part of the image along the vertical used for the averaging
|
/// * vscan: The fractional part of the image along the vertical used for the averaging
|
||||||
/// (minimum and maximum inclusive)
|
/// (minimum and maximum inclusive)
|
||||||
"leds" :
|
"leds" :
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
"index" : 0,
|
"index" : 0,
|
||||||
"hscan" : { "minimum" : 0.4375, "maximum" : 0.5000 },
|
"hscan" : { "minimum" : 0.4375, "maximum" : 0.5000 },
|
||||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 1,
|
"index" : 1,
|
||||||
"hscan" : { "minimum" : 0.3750, "maximum" : 0.4375 },
|
"hscan" : { "minimum" : 0.3750, "maximum" : 0.4375 },
|
||||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 2,
|
"index" : 2,
|
||||||
"hscan" : { "minimum" : 0.3125, "maximum" : 0.3750 },
|
"hscan" : { "minimum" : 0.3125, "maximum" : 0.3750 },
|
||||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 3,
|
"index" : 3,
|
||||||
"hscan" : { "minimum" : 0.2500, "maximum" : 0.3125 },
|
"hscan" : { "minimum" : 0.2500, "maximum" : 0.3125 },
|
||||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 4,
|
"index" : 4,
|
||||||
"hscan" : { "minimum" : 0.1875, "maximum" : 0.2500 },
|
"hscan" : { "minimum" : 0.1875, "maximum" : 0.2500 },
|
||||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 5,
|
"index" : 5,
|
||||||
"hscan" : { "minimum" : 0.1250, "maximum" : 0.1875 },
|
"hscan" : { "minimum" : 0.1250, "maximum" : 0.1875 },
|
||||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 6,
|
"index" : 6,
|
||||||
"hscan" : { "minimum" : 0.0625, "maximum" : 0.1250 },
|
"hscan" : { "minimum" : 0.0625, "maximum" : 0.1250 },
|
||||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 7,
|
"index" : 7,
|
||||||
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0625 },
|
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0625 },
|
||||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 8,
|
"index" : 8,
|
||||||
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
||||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 9,
|
"index" : 9,
|
||||||
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
||||||
"vscan" : { "minimum" : 0.8571, "maximum" : 1.0000 }
|
"vscan" : { "minimum" : 0.8571, "maximum" : 1.0000 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 10,
|
"index" : 10,
|
||||||
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
||||||
"vscan" : { "minimum" : 0.7143, "maximum" : 0.8571 }
|
"vscan" : { "minimum" : 0.7143, "maximum" : 0.8571 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 11,
|
"index" : 11,
|
||||||
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
||||||
"vscan" : { "minimum" : 0.5714, "maximum" : 0.7143 }
|
"vscan" : { "minimum" : 0.5714, "maximum" : 0.7143 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 12,
|
"index" : 12,
|
||||||
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
||||||
"vscan" : { "minimum" : 0.4286, "maximum" : 0.5714 }
|
"vscan" : { "minimum" : 0.4286, "maximum" : 0.5714 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 13,
|
"index" : 13,
|
||||||
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
||||||
"vscan" : { "minimum" : 0.2857, "maximum" : 0.4286 }
|
"vscan" : { "minimum" : 0.2857, "maximum" : 0.4286 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 14,
|
"index" : 14,
|
||||||
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
||||||
"vscan" : { "minimum" : 0.1429, "maximum" : 0.2857 }
|
"vscan" : { "minimum" : 0.1429, "maximum" : 0.2857 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 15,
|
"index" : 15,
|
||||||
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
||||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.1429 }
|
"vscan" : { "minimum" : 0.0000, "maximum" : 0.1429 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 16,
|
"index" : 16,
|
||||||
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
||||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 17,
|
"index" : 17,
|
||||||
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0625 },
|
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0625 },
|
||||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 18,
|
"index" : 18,
|
||||||
"hscan" : { "minimum" : 0.0625, "maximum" : 0.1250 },
|
"hscan" : { "minimum" : 0.0625, "maximum" : 0.1250 },
|
||||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 19,
|
"index" : 19,
|
||||||
"hscan" : { "minimum" : 0.1250, "maximum" : 0.1875 },
|
"hscan" : { "minimum" : 0.1250, "maximum" : 0.1875 },
|
||||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 20,
|
"index" : 20,
|
||||||
"hscan" : { "minimum" : 0.1875, "maximum" : 0.2500 },
|
"hscan" : { "minimum" : 0.1875, "maximum" : 0.2500 },
|
||||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 21,
|
"index" : 21,
|
||||||
"hscan" : { "minimum" : 0.2500, "maximum" : 0.3125 },
|
"hscan" : { "minimum" : 0.2500, "maximum" : 0.3125 },
|
||||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 22,
|
"index" : 22,
|
||||||
"hscan" : { "minimum" : 0.3125, "maximum" : 0.3750 },
|
"hscan" : { "minimum" : 0.3125, "maximum" : 0.3750 },
|
||||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 23,
|
"index" : 23,
|
||||||
"hscan" : { "minimum" : 0.3750, "maximum" : 0.4375 },
|
"hscan" : { "minimum" : 0.3750, "maximum" : 0.4375 },
|
||||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 24,
|
"index" : 24,
|
||||||
"hscan" : { "minimum" : 0.4375, "maximum" : 0.5000 },
|
"hscan" : { "minimum" : 0.4375, "maximum" : 0.5000 },
|
||||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 25,
|
"index" : 25,
|
||||||
"hscan" : { "minimum" : 0.5000, "maximum" : 0.5625 },
|
"hscan" : { "minimum" : 0.5000, "maximum" : 0.5625 },
|
||||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 26,
|
"index" : 26,
|
||||||
"hscan" : { "minimum" : 0.5625, "maximum" : 0.6250 },
|
"hscan" : { "minimum" : 0.5625, "maximum" : 0.6250 },
|
||||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 27,
|
"index" : 27,
|
||||||
"hscan" : { "minimum" : 0.6250, "maximum" : 0.6875 },
|
"hscan" : { "minimum" : 0.6250, "maximum" : 0.6875 },
|
||||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 28,
|
"index" : 28,
|
||||||
"hscan" : { "minimum" : 0.6875, "maximum" : 0.7500 },
|
"hscan" : { "minimum" : 0.6875, "maximum" : 0.7500 },
|
||||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 29,
|
"index" : 29,
|
||||||
"hscan" : { "minimum" : 0.7500, "maximum" : 0.8125 },
|
"hscan" : { "minimum" : 0.7500, "maximum" : 0.8125 },
|
||||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 30,
|
"index" : 30,
|
||||||
"hscan" : { "minimum" : 0.8125, "maximum" : 0.8750 },
|
"hscan" : { "minimum" : 0.8125, "maximum" : 0.8750 },
|
||||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 31,
|
"index" : 31,
|
||||||
"hscan" : { "minimum" : 0.8750, "maximum" : 0.9375 },
|
"hscan" : { "minimum" : 0.8750, "maximum" : 0.9375 },
|
||||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 32,
|
"index" : 32,
|
||||||
"hscan" : { "minimum" : 0.9375, "maximum" : 1.0000 },
|
"hscan" : { "minimum" : 0.9375, "maximum" : 1.0000 },
|
||||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 33,
|
"index" : 33,
|
||||||
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
||||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 34,
|
"index" : 34,
|
||||||
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
||||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.1429 }
|
"vscan" : { "minimum" : 0.0000, "maximum" : 0.1429 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 35,
|
"index" : 35,
|
||||||
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
||||||
"vscan" : { "minimum" : 0.1429, "maximum" : 0.2857 }
|
"vscan" : { "minimum" : 0.1429, "maximum" : 0.2857 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 36,
|
"index" : 36,
|
||||||
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
||||||
"vscan" : { "minimum" : 0.2857, "maximum" : 0.4286 }
|
"vscan" : { "minimum" : 0.2857, "maximum" : 0.4286 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 37,
|
"index" : 37,
|
||||||
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
||||||
"vscan" : { "minimum" : 0.4286, "maximum" : 0.5714 }
|
"vscan" : { "minimum" : 0.4286, "maximum" : 0.5714 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 38,
|
"index" : 38,
|
||||||
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
||||||
"vscan" : { "minimum" : 0.5714, "maximum" : 0.7143 }
|
"vscan" : { "minimum" : 0.5714, "maximum" : 0.7143 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 39,
|
"index" : 39,
|
||||||
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
||||||
"vscan" : { "minimum" : 0.7143, "maximum" : 0.8571 }
|
"vscan" : { "minimum" : 0.7143, "maximum" : 0.8571 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 40,
|
"index" : 40,
|
||||||
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
||||||
"vscan" : { "minimum" : 0.8571, "maximum" : 1.0000 }
|
"vscan" : { "minimum" : 0.8571, "maximum" : 1.0000 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 41,
|
"index" : 41,
|
||||||
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
||||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 42,
|
"index" : 42,
|
||||||
"hscan" : { "minimum" : 0.9375, "maximum" : 1.0000 },
|
"hscan" : { "minimum" : 0.9375, "maximum" : 1.0000 },
|
||||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 43,
|
"index" : 43,
|
||||||
"hscan" : { "minimum" : 0.8750, "maximum" : 0.9375 },
|
"hscan" : { "minimum" : 0.8750, "maximum" : 0.9375 },
|
||||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 44,
|
"index" : 44,
|
||||||
"hscan" : { "minimum" : 0.8125, "maximum" : 0.8750 },
|
"hscan" : { "minimum" : 0.8125, "maximum" : 0.8750 },
|
||||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 45,
|
"index" : 45,
|
||||||
"hscan" : { "minimum" : 0.7500, "maximum" : 0.8125 },
|
"hscan" : { "minimum" : 0.7500, "maximum" : 0.8125 },
|
||||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 46,
|
"index" : 46,
|
||||||
"hscan" : { "minimum" : 0.6875, "maximum" : 0.7500 },
|
"hscan" : { "minimum" : 0.6875, "maximum" : 0.7500 },
|
||||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 47,
|
"index" : 47,
|
||||||
"hscan" : { "minimum" : 0.6250, "maximum" : 0.6875 },
|
"hscan" : { "minimum" : 0.6250, "maximum" : 0.6875 },
|
||||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 48,
|
"index" : 48,
|
||||||
"hscan" : { "minimum" : 0.5625, "maximum" : 0.6250 },
|
"hscan" : { "minimum" : 0.5625, "maximum" : 0.6250 },
|
||||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index" : 49,
|
"index" : 49,
|
||||||
"hscan" : { "minimum" : 0.5000, "maximum" : 0.5625 },
|
"hscan" : { "minimum" : 0.5000, "maximum" : 0.5625 },
|
||||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
||||||
/// The black border configuration, contains the following items:
|
/// The black border configuration, contains the following items:
|
||||||
/// * enable : true if the detector should be activated
|
/// * enable : true if the detector should be activated
|
||||||
"blackborderdetector" :
|
"blackborderdetector" :
|
||||||
{
|
{
|
||||||
"enable" : true
|
"enable" : true
|
||||||
},
|
},
|
||||||
|
|
||||||
/// The boot-sequence configuration, contains the following items:
|
/// The boot-sequence configuration, contains the following items:
|
||||||
/// * type : The type of the boot-sequence ('rainbow', 'knight_rider', 'none')
|
/// * type : The type of the boot-sequence ('rainbow', 'knight_rider', 'none')
|
||||||
/// * duration_ms : The length of the boot-sequence [ms]
|
/// * duration_ms : The length of the boot-sequence [ms]
|
||||||
"bootsequence" :
|
"bootsequence" :
|
||||||
{
|
{
|
||||||
"type" : "Rainbow",
|
"type" : "Rainbow",
|
||||||
"duration_ms" : 3000
|
"duration_ms" : 3000
|
||||||
},
|
},
|
||||||
|
|
||||||
/// The configuration for the frame-grabber, contains the following items:
|
/// The configuration for the frame-grabber, contains the following items:
|
||||||
/// * width : The width of the grabbed frames [pixels]
|
/// * width : The width of the grabbed frames [pixels]
|
||||||
/// * height : The height of the grabbed frames [pixels]
|
/// * height : The height of the grabbed frames [pixels]
|
||||||
/// * frequency_Hz : The frequency of the frame grab [Hz]
|
/// * frequency_Hz : The frequency of the frame grab [Hz]
|
||||||
"framegrabber" :
|
"framegrabber" :
|
||||||
{
|
{
|
||||||
"width" : 64,
|
"width" : 64,
|
||||||
"height" : 64,
|
"height" : 64,
|
||||||
"frequency_Hz" : 10.0
|
"frequency_Hz" : 10.0
|
||||||
},
|
},
|
||||||
|
|
||||||
/// The configuration of the XBMC connection used to enable and disable the frame-grabber. Contains the following fields:
|
/// 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
|
/// * xbmcAddress : The IP address of the XBMC-host
|
||||||
/// * xbmcTcpPort : The TCP-port of the XBMC-server
|
/// * xbmcTcpPort : The TCP-port of the XBMC-server
|
||||||
/// * grabVideo : Flag indicating that the frame-grabber is on(true) during video playback
|
/// * 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
|
/// * 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
|
/// * 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
|
/// * grabMenu : Flag indicating that the frame-grabber is on(true) in the XBMC menu
|
||||||
"xbmcVideoChecker" :
|
"xbmcVideoChecker" :
|
||||||
{
|
{
|
||||||
"xbmcAddress" : "127.0.0.1",
|
"xbmcAddress" : "127.0.0.1",
|
||||||
"xbmcTcpPort" : 9090,
|
"xbmcTcpPort" : 9090,
|
||||||
"grabVideo" : true,
|
"grabVideo" : true,
|
||||||
"grabPictures" : true,
|
"grabPictures" : true,
|
||||||
"grabAudio" : true,
|
"grabAudio" : true,
|
||||||
"grabMenu" : false
|
"grabMenu" : false
|
||||||
},
|
},
|
||||||
|
|
||||||
/// The configuration of the Json server which enables the json remote interface
|
/// The configuration of the Json server which enables the json remote interface
|
||||||
/// * port : Port at which the json server is started
|
/// * port : Port at which the json server is started
|
||||||
"jsonServer" :
|
"jsonServer" :
|
||||||
{
|
{
|
||||||
"port" : 19444
|
"port" : 19444
|
||||||
},
|
},
|
||||||
|
|
||||||
/// The configuration of the Proto server which enables the protobuffer remote interface
|
/// The configuration of the Proto server which enables the protobuffer remote interface
|
||||||
/// * port : Port at which the protobuffer server is started
|
/// * port : Port at which the protobuffer server is started
|
||||||
"protoServer" :
|
"protoServer" :
|
||||||
{
|
{
|
||||||
"port" : 19445
|
"port" : 19445
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1 +1 @@
|
|||||||
6f2aab422e3d1b03080de92c3e3aea9b270a3e9b
|
5a45be79a986ebe2dde72420862801608de41fa2
|
Binary file not shown.
@ -1 +1 @@
|
|||||||
e027a9a48c14dcffacb9539ede8ddca32cba2171
|
632c368d0a5ce42aff067c6ba5f63dbe108dddc9
|
@ -46,6 +46,12 @@ public:
|
|||||||
SATURATION_GAIN, VALUE_GAIN, THRESHOLD, GAMMA, BLACKLEVEL, WHITELEVEL
|
SATURATION_GAIN, VALUE_GAIN, THRESHOLD, GAMMA, BLACKLEVEL, WHITELEVEL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// Enumeration containing the possible orders of device color byte data
|
||||||
|
enum ColorOrder
|
||||||
|
{
|
||||||
|
ORDER_RGB, ORDER_RBG, ORDER_GRB, ORDER_BRG, ORDER_GBR, ORDER_BGR
|
||||||
|
};
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Constructs the Hyperion instance based on the given Json configuration
|
/// Constructs the Hyperion instance based on the given Json configuration
|
||||||
///
|
///
|
||||||
@ -136,6 +142,7 @@ public:
|
|||||||
const InputInfo& getPriorityInfo(const int priority) const;
|
const InputInfo& getPriorityInfo(const int priority) const;
|
||||||
|
|
||||||
static LedDevice * createDevice(const Json::Value & deviceConfig);
|
static LedDevice * createDevice(const Json::Value & deviceConfig);
|
||||||
|
static ColorOrder createColorOrder(const Json::Value & deviceConfig);
|
||||||
static LedString createLedString(const Json::Value & ledsConfig);
|
static LedString createLedString(const Json::Value & ledsConfig);
|
||||||
static HsvTransform * createHsvTransform(const Json::Value & hsvConfig);
|
static HsvTransform * createHsvTransform(const Json::Value & hsvConfig);
|
||||||
static ColorTransform * createColorTransform(const Json::Value & colorConfig);
|
static ColorTransform * createColorTransform(const Json::Value & colorConfig);
|
||||||
@ -172,8 +179,8 @@ private:
|
|||||||
/// The BLUE-Channel (RGB) transform
|
/// The BLUE-Channel (RGB) transform
|
||||||
ColorTransform * _blueTransform;
|
ColorTransform * _blueTransform;
|
||||||
|
|
||||||
/// Flag indicating if the output should be BGR (red and blue reversed)
|
/// Value with the desired color byte order
|
||||||
bool _haveBgrOutput;
|
ColorOrder _colorOrder;
|
||||||
|
|
||||||
/// The actual LedDevice
|
/// The actual LedDevice
|
||||||
LedDevice * _device;
|
LedDevice * _device;
|
||||||
|
@ -60,6 +60,47 @@ LedDevice* Hyperion::createDevice(const Json::Value& deviceConfig)
|
|||||||
return device;
|
return device;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Hyperion::ColorOrder Hyperion::createColorOrder(const Json::Value &deviceConfig)
|
||||||
|
{
|
||||||
|
// deprecated: force BGR when the deprecated flag is present and set to true
|
||||||
|
if (deviceConfig.get("bgr-output", false).asBool())
|
||||||
|
{
|
||||||
|
return ORDER_BGR;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string order = deviceConfig.get("colorOrder", "rgb").asString();
|
||||||
|
if (order == "rgb")
|
||||||
|
{
|
||||||
|
return ORDER_RGB;
|
||||||
|
}
|
||||||
|
else if (order == "bgr")
|
||||||
|
{
|
||||||
|
return ORDER_BGR;
|
||||||
|
}
|
||||||
|
else if (order == "rbg")
|
||||||
|
{
|
||||||
|
return ORDER_RBG;
|
||||||
|
}
|
||||||
|
else if (order == "brg")
|
||||||
|
{
|
||||||
|
return ORDER_BRG;
|
||||||
|
}
|
||||||
|
else if (order == "gbr")
|
||||||
|
{
|
||||||
|
return ORDER_GBR;
|
||||||
|
}
|
||||||
|
else if (order == "grb")
|
||||||
|
{
|
||||||
|
return ORDER_GRB;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cout << "Unknown color order defined (" << order << "). Using RGB." << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ORDER_RGB;
|
||||||
|
}
|
||||||
|
|
||||||
HsvTransform * Hyperion::createHsvTransform(const Json::Value & hsvConfig)
|
HsvTransform * Hyperion::createHsvTransform(const Json::Value & hsvConfig)
|
||||||
{
|
{
|
||||||
const double saturationGain = hsvConfig.get("saturationGain", 1.0).asDouble();
|
const double saturationGain = hsvConfig.get("saturationGain", 1.0).asDouble();
|
||||||
@ -143,6 +184,7 @@ LedDevice * Hyperion::createColorSmoothing(const Json::Value & smoothingConfig,
|
|||||||
return ledDevice;
|
return ledDevice;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Hyperion::Hyperion(const Json::Value &jsonConfig) :
|
Hyperion::Hyperion(const Json::Value &jsonConfig) :
|
||||||
_ledString(createLedString(jsonConfig["leds"])),
|
_ledString(createLedString(jsonConfig["leds"])),
|
||||||
_muxer(_ledString.leds().size()),
|
_muxer(_ledString.leds().size()),
|
||||||
@ -150,7 +192,7 @@ Hyperion::Hyperion(const Json::Value &jsonConfig) :
|
|||||||
_redTransform(createColorTransform(jsonConfig["color"]["red"])),
|
_redTransform(createColorTransform(jsonConfig["color"]["red"])),
|
||||||
_greenTransform(createColorTransform(jsonConfig["color"]["green"])),
|
_greenTransform(createColorTransform(jsonConfig["color"]["green"])),
|
||||||
_blueTransform(createColorTransform(jsonConfig["color"]["blue"])),
|
_blueTransform(createColorTransform(jsonConfig["color"]["blue"])),
|
||||||
_haveBgrOutput(jsonConfig["device"].get("bgr-output", false).asBool()),
|
_colorOrder(createColorOrder(jsonConfig["device"])),
|
||||||
_device(createDevice(jsonConfig["device"])),
|
_device(createDevice(jsonConfig["device"])),
|
||||||
_timer()
|
_timer()
|
||||||
{
|
{
|
||||||
@ -366,9 +408,37 @@ void Hyperion::update()
|
|||||||
color.green = _greenTransform->transform(color.green);
|
color.green = _greenTransform->transform(color.green);
|
||||||
color.blue = _blueTransform->transform(color.blue);
|
color.blue = _blueTransform->transform(color.blue);
|
||||||
|
|
||||||
if (_haveBgrOutput)
|
// correct the color byte order
|
||||||
|
switch (_colorOrder)
|
||||||
{
|
{
|
||||||
|
case ORDER_RGB:
|
||||||
|
// leave as it is
|
||||||
|
break;
|
||||||
|
case ORDER_BGR:
|
||||||
std::swap(color.red, color.blue);
|
std::swap(color.red, color.blue);
|
||||||
|
break;
|
||||||
|
case ORDER_RBG:
|
||||||
|
std::swap(color.green, color.blue);
|
||||||
|
break;
|
||||||
|
case ORDER_GRB:
|
||||||
|
std::swap(color.red, color.green);
|
||||||
|
break;
|
||||||
|
case ORDER_GBR:
|
||||||
|
{
|
||||||
|
uint8_t temp = color.red;
|
||||||
|
color.red = color.green;
|
||||||
|
color.green = color.blue;
|
||||||
|
color.blue = temp;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ORDER_BRG:
|
||||||
|
{
|
||||||
|
uint8_t temp = color.red;
|
||||||
|
color.red = color.blue;
|
||||||
|
color.blue = color.green;
|
||||||
|
color.green = temp;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,31 +20,23 @@ LedDeviceLdp6803::LedDeviceLdp6803(const std::string& outputDevice, const unsign
|
|||||||
int LedDeviceLdp6803::write(const std::vector<RgbColor> &ledValues)
|
int LedDeviceLdp6803::write(const std::vector<RgbColor> &ledValues)
|
||||||
{
|
{
|
||||||
// Reconfigure if the current connfiguration does not match the required configuration
|
// 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
|
// Initialise the buffer
|
||||||
_ledBuffer.resize(ledValues.size() + 2, 0x80);
|
_ledBuffer.resize(4 + 2*ledValues.size(), 0x00);
|
||||||
_ledBuffer[0] = 0;
|
|
||||||
_ledBuffer[1] = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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<ledValues.size(); ++iLed)
|
for (unsigned iLed=0; iLed<ledValues.size(); ++iLed)
|
||||||
{
|
{
|
||||||
const RgbColor& rgb = ledValues[iLed];
|
const RgbColor& rgb = ledValues[iLed];
|
||||||
|
|
||||||
const char packedRed = rgb.red & 0xf8;
|
_ledBuffer[4 + 2 * iLed] = 0x80 | ((rgb.red & 0xf8) >> 1) | (rgb.green >> 6);
|
||||||
const char packedGreen = rgb.green & 0xf8;
|
_ledBuffer[5 + 2 * iLed] = ((rgb.green & 0x38) << 2) | (rgb.blue >> 3);
|
||||||
const char packedBlue = rgb.blue & 0xf8;
|
|
||||||
const unsigned short packedRgb = 0x80 | (packedRed << 7) | (packedGreen << 2) | (packedBlue >> 3);
|
|
||||||
|
|
||||||
_ledBuffer[iLed + 2] = packedRgb;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write the data
|
// Write the data
|
||||||
const unsigned bufCnt = _ledBuffer.size() * sizeof(short);
|
if (writeBytes(_ledBuffer.size(), _ledBuffer.data()) < 0)
|
||||||
const char * bufPtr = reinterpret_cast<const char *>(_ledBuffer.data());
|
|
||||||
if (latch(bufCnt, bufPtr, 0) < 0)
|
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -6,12 +6,12 @@
|
|||||||
///
|
///
|
||||||
/// Implementation of the LedDevice interface for writing to LDP6803 led device.
|
/// 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 ...
|
/// 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
|
/// 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)
|
/// leds)
|
||||||
///
|
///
|
||||||
class LedDeviceLdp6803 : public LedSpiDevice
|
class LedDeviceLdp6803 : public LedSpiDevice
|
||||||
@ -20,7 +20,7 @@ public:
|
|||||||
///
|
///
|
||||||
/// Constructs the LedDevice for a string containing leds of the type LDP6803
|
/// 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
|
/// @param[in] baudrate The used baudrate for writing to the output device
|
||||||
///
|
///
|
||||||
LedDeviceLdp6803(const std::string& outputDevice, const unsigned baudrate);
|
LedDeviceLdp6803(const std::string& outputDevice, const unsigned baudrate);
|
||||||
@ -38,5 +38,5 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
/// The buffer containing the packed RGB values
|
/// The buffer containing the packed RGB values
|
||||||
std::vector<unsigned short> _ledBuffer;
|
std::vector<uint8_t> _ledBuffer;
|
||||||
};
|
};
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#include "LedDeviceWs2801.h"
|
#include "LedDeviceWs2801.h"
|
||||||
|
|
||||||
LedDeviceWs2801::LedDeviceWs2801(const std::string& outputDevice, const unsigned baudrate) :
|
LedDeviceWs2801::LedDeviceWs2801(const std::string& outputDevice, const unsigned baudrate) :
|
||||||
LedSpiDevice(outputDevice, baudrate),
|
LedSpiDevice(outputDevice, baudrate, 500000),
|
||||||
mLedCount(0)
|
mLedCount(0)
|
||||||
{
|
{
|
||||||
// empty
|
// empty
|
||||||
@ -23,10 +23,9 @@ int LedDeviceWs2801::write(const std::vector<RgbColor> &ledValues)
|
|||||||
mLedCount = ledValues.size();
|
mLedCount = ledValues.size();
|
||||||
|
|
||||||
const unsigned dataLen = ledValues.size() * sizeof(RgbColor);
|
const unsigned dataLen = ledValues.size() * sizeof(RgbColor);
|
||||||
const char * dataPtr = reinterpret_cast<const char *>(ledValues.data());
|
const uint8_t * dataPtr = reinterpret_cast<const uint8_t *>(ledValues.data());
|
||||||
|
|
||||||
const int retVal = latch(dataLen, dataPtr, 500000);
|
return writeBytes(dataLen, dataPtr);
|
||||||
return retVal;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int LedDeviceWs2801::switchOff()
|
int LedDeviceWs2801::switchOff()
|
||||||
|
@ -12,9 +12,10 @@
|
|||||||
#include "LedSpiDevice.h"
|
#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),
|
mDeviceName(outputDevice),
|
||||||
mBaudRate_Hz(baudrate),
|
mBaudRate_Hz(baudrate),
|
||||||
|
mLatchTime_ns(latchTime_ns),
|
||||||
mFid(-1)
|
mFid(-1)
|
||||||
{
|
{
|
||||||
memset(&spi, 0, sizeof(spi));
|
memset(&spi, 0, sizeof(spi));
|
||||||
@ -56,30 +57,28 @@ int LedSpiDevice::open()
|
|||||||
return 0;
|
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)
|
if (mFid < 0)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
spi.tx_buf = __u64(vec);
|
spi.tx_buf = __u64(data);
|
||||||
spi.len = __u32(len);
|
spi.len = __u32(size);
|
||||||
|
|
||||||
int retVal = ioctl(mFid, SPI_IOC_MESSAGE(1), &spi);
|
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
|
// The 'latch' time for latching the shifted-value into the leds
|
||||||
timespec latchTime;
|
timespec latchTime;
|
||||||
latchTime.tv_sec = 0;
|
latchTime.tv_sec = 0;
|
||||||
latchTime.tv_nsec = latchTime_ns;
|
latchTime.tv_nsec = mLatchTime_ns;
|
||||||
|
|
||||||
// Sleep to latch the leds (only if write succesfull)
|
// Sleep to latch the leds (only if write succesfull)
|
||||||
nanosleep(&latchTime, NULL);
|
nanosleep(&latchTime, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
return retVal;
|
return retVal;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@ public:
|
|||||||
/// @param[in] outputDevice The name of the output device (eg '/etc/SpiDev.0.0')
|
/// @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
|
/// @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
|
/// 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
|
* Writes the given bytes/bits to the SPI-device and sleeps the latch time to ensure that the
|
||||||
* values are latched.
|
* values are latched.
|
||||||
*
|
*
|
||||||
* @param[in[ len The length of the data
|
* @param[in[ size The length of the data
|
||||||
* @param[in] vec The data
|
* @param[in] data The data
|
||||||
* @param[in] latchTime_ns The latch-time to latch in the values across the SPI-device (negative
|
* @param[in] latchTime_ns The latch-time to latch in the values across the SPI-device (negative
|
||||||
* means no latch required) [ns]
|
* means no latch required) [ns]
|
||||||
*
|
*
|
||||||
* @return Zero on succes else negative
|
* @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:
|
private:
|
||||||
/// The name of the output device
|
/// The name of the output device
|
||||||
const std::string mDeviceName;
|
const std::string mDeviceName;
|
||||||
/// The used baudrate of the output device
|
/// The used baudrate of the output device
|
||||||
const int mBaudRate_Hz;
|
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)
|
/// The File Identifier of the opened output device (or -1 if not opened)
|
||||||
int mFid;
|
int mFid;
|
||||||
|
@ -23,7 +23,11 @@
|
|||||||
"required" : true,
|
"required" : true,
|
||||||
"minimum" : 0
|
"minimum" : 0
|
||||||
},
|
},
|
||||||
"bgr-output" : {
|
"colorOrder" : {
|
||||||
|
"type" : "string",
|
||||||
|
"required" : false
|
||||||
|
},
|
||||||
|
"bgr-output" : { // deprecated
|
||||||
"type" : "boolean",
|
"type" : "boolean",
|
||||||
"required" : false
|
"required" : false
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,7 @@ public class LedString {
|
|||||||
|
|
||||||
/** THe configuration of the 'physical' led frame */
|
/** THe configuration of the 'physical' led frame */
|
||||||
public LedFrameConstruction mLedFrameConfig = new LedFrameConstruction();
|
public LedFrameConstruction mLedFrameConfig = new LedFrameConstruction();
|
||||||
|
|
||||||
/** The configuration of the image processing */
|
/** The configuration of the image processing */
|
||||||
public ImageProcessConfig mProcessConfig = new ImageProcessConfig();
|
public ImageProcessConfig mProcessConfig = new ImageProcessConfig();
|
||||||
|
|
||||||
|
@ -7,8 +7,8 @@ import javax.swing.JComboBox;
|
|||||||
import javax.swing.JLabel;
|
import javax.swing.JLabel;
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
|
|
||||||
|
import org.hyperion.hypercon.spec.ColorByteOrder;
|
||||||
import org.hyperion.hypercon.spec.DeviceConfig;
|
import org.hyperion.hypercon.spec.DeviceConfig;
|
||||||
import org.hyperion.hypercon.spec.RgbByteOrder;
|
|
||||||
|
|
||||||
public class DevicePanel extends JPanel {
|
public class DevicePanel extends JPanel {
|
||||||
|
|
||||||
@ -21,7 +21,7 @@ public class DevicePanel extends JPanel {
|
|||||||
private JComboBox<Integer> mBaudrateCombo;
|
private JComboBox<Integer> mBaudrateCombo;
|
||||||
|
|
||||||
private JLabel mRgbLabel;
|
private JLabel mRgbLabel;
|
||||||
private JComboBox<RgbByteOrder> mRgbCombo;
|
private JComboBox<ColorByteOrder> mRgbCombo;
|
||||||
|
|
||||||
public DevicePanel(DeviceConfig pDeviceConfig) {
|
public DevicePanel(DeviceConfig pDeviceConfig) {
|
||||||
super();
|
super();
|
||||||
@ -52,8 +52,8 @@ public class DevicePanel extends JPanel {
|
|||||||
mRgbLabel = new JLabel("RGB Byte Order");
|
mRgbLabel = new JLabel("RGB Byte Order");
|
||||||
add(mRgbLabel);
|
add(mRgbLabel);
|
||||||
|
|
||||||
mRgbCombo = new JComboBox<>(RgbByteOrder.values());
|
mRgbCombo = new JComboBox<>(ColorByteOrder.values());
|
||||||
mRgbCombo.setSelectedItem(mDeviceConfig.mRgbByteOrder);
|
mRgbCombo.setSelectedItem(mDeviceConfig.mColorByteOrder);
|
||||||
mRgbCombo.addActionListener(mActionListener);
|
mRgbCombo.addActionListener(mActionListener);
|
||||||
add(mRgbCombo);
|
add(mRgbCombo);
|
||||||
}
|
}
|
||||||
@ -63,7 +63,7 @@ public class DevicePanel extends JPanel {
|
|||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
mDeviceConfig.mOutput = (String)mOutputCombo.getSelectedItem();
|
mDeviceConfig.mOutput = (String)mOutputCombo.getSelectedItem();
|
||||||
mDeviceConfig.mBaudrate = (Integer)mBaudrateCombo.getSelectedItem();
|
mDeviceConfig.mBaudrate = (Integer)mBaudrateCombo.getSelectedItem();
|
||||||
mDeviceConfig.mRgbByteOrder = (RgbByteOrder)mRgbCombo.getSelectedItem();
|
mDeviceConfig.mColorByteOrder = (ColorByteOrder)mRgbCombo.getSelectedItem();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,5 @@
|
|||||||
|
package org.hyperion.hypercon.spec;
|
||||||
|
|
||||||
|
public enum ColorByteOrder {
|
||||||
|
RGB, RBG, BRG, BGR, GRB, GBR
|
||||||
|
}
|
@ -1,21 +1,20 @@
|
|||||||
package org.hyperion.hypercon.spec;
|
package org.hyperion.hypercon.spec;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The device specific configuration
|
* The device specific configuration
|
||||||
*/
|
*/
|
||||||
public class DeviceConfig {
|
public class DeviceConfig {
|
||||||
|
|
||||||
/** The name of the device */
|
/** The name of the device */
|
||||||
public String mName = "MyPi";
|
public String mName = "MyPi";
|
||||||
/** The type specification of the device */
|
/** The type specification of the device */
|
||||||
public DeviceType mType = DeviceType.ws2801;
|
public DeviceType mType = DeviceType.ws2801;
|
||||||
/** The device 'file' name */
|
/** The device 'file' name */
|
||||||
public String mOutput = "/dev/spidev0.0";
|
public String mOutput = "/dev/spidev0.0";
|
||||||
/** The baudrate of the device */
|
/** The baudrate of the device */
|
||||||
public int mBaudrate = 1000000;
|
public int mBaudrate = 1000000;
|
||||||
/** Ordering of the rgb-color channels */
|
/** The order of the color bytes */
|
||||||
public RgbByteOrder mRgbByteOrder = RgbByteOrder.rbg;
|
public ColorByteOrder mColorByteOrder = ColorByteOrder.RGB;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates the JSON string of the configuration as used in the Hyperion daemon configfile
|
* Creates the JSON string of the configuration as used in the Hyperion daemon configfile
|
||||||
@ -32,7 +31,7 @@ public class DeviceConfig {
|
|||||||
strBuf.append("\t/// - 'ws2801' this is the device (eg '/dev/spidev0.0')\n");
|
strBuf.append("\t/// - 'ws2801' this is the device (eg '/dev/spidev0.0')\n");
|
||||||
strBuf.append("\t/// - 'test' this is the file used to write test output (eg '/home/pi/hyperion.out')\n");
|
strBuf.append("\t/// - 'test' this is the file used to write test output (eg '/home/pi/hyperion.out')\n");
|
||||||
strBuf.append("\t/// * 'rate' : The baudrate of the output to the device (only applicable for 'ws2801')\n");
|
strBuf.append("\t/// * 'rate' : The baudrate of the output to the device (only applicable for 'ws2801')\n");
|
||||||
strBuf.append("\t/// * 'colorOrder' : The order of the byte color channel (rgb, rbg, bgr, brg, gbr, grb).\n");
|
strBuf.append("\t/// * 'colorOrder' : The order of the color bytes ('rgb', 'rbg', 'bgr', etc.).\n");
|
||||||
|
|
||||||
strBuf.append("\t\"device\" :\n");
|
strBuf.append("\t\"device\" :\n");
|
||||||
strBuf.append("\t{\n");
|
strBuf.append("\t{\n");
|
||||||
@ -41,11 +40,10 @@ public class DeviceConfig {
|
|||||||
strBuf.append("\t\t\"type\" : \"").append(mType.name()).append("\",\n");
|
strBuf.append("\t\t\"type\" : \"").append(mType.name()).append("\",\n");
|
||||||
strBuf.append("\t\t\"output\" : \"").append(mOutput).append("\",\n");
|
strBuf.append("\t\t\"output\" : \"").append(mOutput).append("\",\n");
|
||||||
strBuf.append("\t\t\"rate\" : ").append(mBaudrate).append(",\n");
|
strBuf.append("\t\t\"rate\" : ").append(mBaudrate).append(",\n");
|
||||||
strBuf.append("\t\t\"colorOrder\" : ").append(mRgbByteOrder.name()).append("\n");
|
strBuf.append("\t\t\"colorOrder\" : \"").append(mColorByteOrder.name().toLowerCase()).append("\"\n");
|
||||||
|
|
||||||
strBuf.append("\t}");
|
strBuf.append("\t}");
|
||||||
|
|
||||||
return strBuf.toString();
|
return strBuf.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,11 +0,0 @@
|
|||||||
package org.hyperion.hypercon.spec;
|
|
||||||
|
|
||||||
public enum RgbByteOrder {
|
|
||||||
rgb,
|
|
||||||
rbg,
|
|
||||||
grb,
|
|
||||||
gbr,
|
|
||||||
brg,
|
|
||||||
bgr;
|
|
||||||
|
|
||||||
}
|
|
@ -1,13 +1,13 @@
|
|||||||
package org.hyperion.hypercon.test;
|
package org.hyperion.hypercon.test;
|
||||||
|
|
||||||
import org.hyperion.hypercon.ConfigurationFile;
|
import org.hyperion.hypercon.ConfigurationFile;
|
||||||
|
import org.hyperion.hypercon.spec.ColorByteOrder;
|
||||||
import org.hyperion.hypercon.spec.ColorConfig;
|
import org.hyperion.hypercon.spec.ColorConfig;
|
||||||
import org.hyperion.hypercon.spec.DeviceConfig;
|
import org.hyperion.hypercon.spec.DeviceConfig;
|
||||||
import org.hyperion.hypercon.spec.DeviceType;
|
import org.hyperion.hypercon.spec.DeviceType;
|
||||||
import org.hyperion.hypercon.spec.ImageProcessConfig;
|
import org.hyperion.hypercon.spec.ImageProcessConfig;
|
||||||
import org.hyperion.hypercon.spec.LedFrameConstruction;
|
import org.hyperion.hypercon.spec.LedFrameConstruction;
|
||||||
import org.hyperion.hypercon.spec.MiscConfig;
|
import org.hyperion.hypercon.spec.MiscConfig;
|
||||||
import org.hyperion.hypercon.spec.RgbByteOrder;
|
|
||||||
|
|
||||||
public class TesConfigWriter {
|
public class TesConfigWriter {
|
||||||
|
|
||||||
@ -19,7 +19,7 @@ public class TesConfigWriter {
|
|||||||
MiscConfig miscConfig = new MiscConfig();
|
MiscConfig miscConfig = new MiscConfig();
|
||||||
|
|
||||||
deviceConfig.mBaudrate = 4800;
|
deviceConfig.mBaudrate = 4800;
|
||||||
deviceConfig.mRgbByteOrder = RgbByteOrder.bgr;
|
deviceConfig.mColorByteOrder = ColorByteOrder.BGR;
|
||||||
deviceConfig.mName = "DAG";
|
deviceConfig.mName = "DAG";
|
||||||
deviceConfig.mOutput = "/dev/null";
|
deviceConfig.mOutput = "/dev/null";
|
||||||
deviceConfig.mType = DeviceType.ldp6803;
|
deviceConfig.mType = DeviceType.ldp6803;
|
||||||
|
Loading…
Reference in New Issue
Block a user