implemened mapping parsing
Stefan Schuermans

Stefan Schuermans commited on 2011-09-11 09:49:29
Showing 3 changed files, with 78 additions and 5 deletions.

... ...
@@ -72,13 +72,13 @@ class Config
72 72
       dist = Constants.distriMaxCnt; // force error in next line
73 73
     }
74 74
     if (dist >= Constants.distriMaxCnt)
75
-      error("invalid distributor number \"" + settingPart2 +
75
+      error("invalid distributor number \"" + settingPart2 + "\"" +
76 76
             String.format(" in line %d of config file", m_lineNo));
77 77
 
78 78
     // get number of outputs and pixels
79 79
     px = PixelParser.parsePixel(value); // abuse for "outputs,pixels"
80 80
     if (px == null)
81
-      error("invalid distributor size \"" + value +
81
+      error("invalid distributor size \"" + value + "\"" +
82 82
             String.format(" in line %d of config file", m_lineNo));
83 83
     out = px.m_x;
84 84
     if (out >= Constants.outputMaxCnt)
... ...
@@ -110,7 +110,75 @@ class Config
110 110
   void procMapping(String settingPart2, String value)
111 111
     throws Exception
112 112
   {
113
-    // TODO
113
+    Pattern pattern;
114
+    Matcher matcher;
115
+    String strDistri, strChannel, strBase, strFactor, strGamma;
116
+    int dist;
117
+    Distri distri;
118
+    Mapping mapping = null;
119
+    double base = 0.0, factor = 1.0, gamma = 1.0;
120
+
121
+    // split setting part 2 into distributor and channel
122
+    pattern = Pattern.compile("^([0-9]+) +([a-z]+)$");
123
+    matcher = pattern.matcher(settingPart2);
124
+    if (!matcher.find())
125
+      error("invalid mapping specifier \"" + settingPart2 + "\"" +
126
+            String.format(" in line %d of config file", m_lineNo));
127
+    strDistri  = matcher.group(1);
128
+    strChannel = matcher.group(2);
129
+
130
+    // get distributor number
131
+    try {
132
+      dist = Integer.parseInt(strDistri);
133
+    } catch (NumberFormatException e) {
134
+      dist = Constants.distriMaxCnt; // force error in next line
135
+    }
136
+    if (dist >= Constants.distriMaxCnt)
137
+      error("invalid distributor number \"" + strDistri + "\"" +
138
+            String.format(" in line %d of config file", m_lineNo));
139
+
140
+    // get distributor
141
+    distri = m_display.m_distris[dist];
142
+    if (distri == null)
143
+      error(String.format("no distributor with number \"%d\"" +
144
+                          " in line %d of config file", dist, m_lineNo));
145
+
146
+    // get channel
147
+    if (strChannel.equals("red"))
148
+      mapping = distri.m_mapRed;
149
+    else if (strChannel.equals("green"))
150
+      mapping = distri.m_mapGreen;
151
+    else if (strChannel.equals("blue"))
152
+      mapping = distri.m_mapBlue;
153
+    else
154
+      error("invalid channel \"" + strChannel + "\"" +
155
+            String.format(" in line %d of config file", m_lineNo));
156
+
157
+    // split mapping parameters
158
+    pattern = Pattern.compile("^([-+.eE0-9]+) +([-+.eE0-9]+) +([-+.eE0-9]+)$");
159
+    matcher = pattern.matcher(value);
160
+    if (!matcher.find())
161
+      error("invalid mapping parameters \"" + value + "\"" +
162
+            String.format(" in line %d of config file", m_lineNo));
163
+    strBase   = matcher.group(1);
164
+    strFactor = matcher.group(2);
165
+    strGamma  = matcher.group(3);
166
+
167
+    // parse mapping parameters
168
+    try {
169
+      base   = Double.parseDouble(strBase);
170
+      factor = Double.parseDouble(strFactor);
171
+      gamma  = Double.parseDouble(strGamma);
172
+    } catch (NumberFormatException e) {
173
+      error("invalid mapping parameters \"" + value + "\"" +
174
+            String.format(" in line %d of config file", m_lineNo), e);
175
+    }
176
+    if (gamma <= 0.0)
177
+      error(String.format("invalid gamma value \"%f\"" +
178
+                          " in line %d of config file", gamma, m_lineNo));
179
+
180
+    // update mapping parameters
181
+    mapping.set(base, factor, gamma);
114 182
   }
115 183
 
116 184
   /**
... ...
@@ -197,7 +265,7 @@ class Config
197 265
     }
198 266
 
199 267
     // unknown setting
200
-    warning("unknown setting \"" + setting +
268
+    warning("unknown setting \"" + setting + "\"" +
201 269
             String.format(" in line %d of config file", m_lineNo) +
202 270
             ", ignored");
203 271
   }
... ...
@@ -36,6 +36,11 @@ class Distri
36 36
     m_outputCnt = outputCnt;
37 37
     m_pixelCnt  = pixelCnt;
38 38
 
39
+    // allocate default mappings
40
+    m_mapRed   = new Mapping();
41
+    m_mapGreen = new Mapping();
42
+    m_mapBlue  = new Mapping();
43
+
39 44
     // allocate pixel array (no pixels configured yet)
40 45
     m_pixels = new Pixel [m_outputCnt * m_pixelCnt];
41 46
 
... ...
@@ -27,7 +27,7 @@ package org.blinkenarea.JFlexiPix;
27 27
 class Mapping
28 28
 {
29 29
   /// constructor
30
-  Mapping(double base, double facor, double gamma)
30
+  Mapping()
31 31
   {
32 32
     // default mapping information
33 33
     set(0.0, 1.0, 1.0);
34 34