1 package kaka.cakelight;
3 import org.opencv.imgproc.Imgproc;
5 import java.io.FileInputStream;
6 import java.io.IOException;
7 import java.io.InputStream;
9 import java.util.stream.Collectors;
11 public class Configuration {
12 private List<Map.Entry<String, String>> settings = new ArrayList<>();
13 public VideoConfiguration video;
14 public LedConfiguration leds;
17 private Configuration(Properties prop) {
18 video = new VideoConfiguration(prop);
19 leds = new LedConfiguration(prop);
20 gamma = Double.parseDouble(get(prop,"gamma", "1"));
23 public static Configuration from(String propertiesFile) {
24 Properties prop = new Properties();
25 try (InputStream input = new FileInputStream(propertiesFile)) {
27 } catch (IOException ex) {
30 return new Configuration(prop);
33 private String get(Properties prop, String name) {
34 return addSetting(name, prop.getProperty(name));
37 private String get(Properties prop, String name, String dflt) {
38 return addSetting(name, prop.getProperty(name, dflt));
41 private String addSetting(String name, String value) {
42 settings.add(new AbstractMap.SimpleEntry<>(name, value));
47 public String toString() {
48 return settings.stream().map(entry -> entry.getKey() + "=" + entry.getValue()).collect(Collectors.joining("\n"));
51 public class VideoConfiguration {
56 public double saturation;
57 public CropConfiguration crop;
58 public ListConfiguration list;
60 private VideoConfiguration(Properties prop) {
61 width = Integer.parseInt(get(prop, "video.width", "720"));
62 height = Integer.parseInt(get(prop, "video.height", "576"));
63 bpp = Integer.parseInt(get(prop, "video.bpp", "2"));
64 switch (get(prop, "video.format", "").toUpperCase()) {
66 format = Imgproc.COLOR_YUV2BGR_YUYV;
69 format = Imgproc.COLOR_YUV2BGR_YVYU;
72 format = Imgproc.COLOR_YUV2BGR_UYVY;
74 saturation = inRange(Double.parseDouble(get(prop, "video.saturation", "0.5")), 0, 1);
75 crop = new CropConfiguration(prop);
76 list = new ListConfiguration(prop);
79 public class CropConfiguration {
80 public int left, right, top, bottom;
82 private CropConfiguration(Properties prop) {
83 left = Integer.parseInt(get(prop, "video.crop.left", "0"));
84 right = Integer.parseInt(get(prop, "video.crop.right", "0"));
85 top = Integer.parseInt(get(prop, "video.crop.top", "0"));
86 bottom = Integer.parseInt(get(prop, "video.crop.bottom", "0"));
90 public class ListConfiguration {
91 public boolean top, bottom, left, right;
93 private ListConfiguration(Properties prop) {
94 top = get(prop, "video.list.top", "on").equals("on");
95 bottom = get(prop, "video.list.bottom", "on").equals("on");
96 left = get(prop, "video.list.left", "on").equals("on");
97 right = get(prop, "video.list.right", "on").equals("on");
102 public class LedConfiguration {
105 public int brightness;
108 private LedConfiguration(Properties prop) {
109 cols = Integer.parseInt(get(prop, "leds.cols"));
110 rows = Integer.parseInt(get(prop, "leds.rows"));
111 brightness = (int) inRange(Integer.parseInt(get(prop, "leds.brightness", "31")), 1, 31);
112 switch (get(prop, "leds.type", "").toUpperCase()) {
114 type = LedType.WS2801;
118 type = LedType.APA102;
122 public int getCount() {
123 return cols * 2 + rows * 2;
127 public enum LedType {
131 private double inRange(double value, double lower, double upper) {
132 return value < lower ? lower
133 : value > upper ? upper