Stefan Schuermans commited on 2011-09-11 10:46:13
Showing 4 changed files, with 119 additions and 32 deletions.
... | ... |
@@ -33,7 +33,7 @@ PKG_PATH=org/blinkenarea/JFlexiPix |
33 | 33 |
PKG_PATH_EX=$(PKG_PATH)/examples |
34 | 34 |
|
35 | 35 |
CLASSES=AddrParser Config Constants Display Distri \ |
36 |
- Mapping MessageIf MsgType Pixel PixelParser |
|
36 |
+ Mapping MessageIf MsgType Pixel PixelParser Version |
|
37 | 37 |
CLASSES_EX=Blink Msg |
38 | 38 |
CLASS_FILES=$(addprefix $(PKG_PATH)/,$(addsuffix .class,$(CLASSES))) |
39 | 39 |
CLASS_FILES_EX=$(addprefix $(PKG_PATH_EX)/,$(addsuffix .class,$(CLASSES_EX))) |
... | ... |
@@ -72,33 +72,33 @@ 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 |
+ errorExc("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 |
+ errorExc("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) |
85 |
- error(String.format("invalid number of outputs \"%d\"" + |
|
85 |
+ errorExc(String.format("invalid number of outputs \"%d\"" + |
|
86 | 86 |
" in line %d of config file", out, m_lineNo)); |
87 | 87 |
pix = px.m_y; |
88 | 88 |
if (pix >= Constants.pixelMaxCnt) |
89 |
- error(String.format("invalid number of pixels \"%d\"" + |
|
89 |
+ errorExc(String.format("invalid number of pixels \"%d\"" + |
|
90 | 90 |
" in line %d of config file", pix, m_lineNo)); |
91 | 91 |
|
92 | 92 |
// check if distributor is already present |
93 | 93 |
if (m_display.m_distris[dist] != null) |
94 |
- error(String.format("duplicate definition of distributor \"%d\"" + |
|
94 |
+ errorExc(String.format("duplicate definition of distributor \"%d\"" + |
|
95 | 95 |
" in line %d of config file", dist, m_lineNo)); |
96 | 96 |
|
97 | 97 |
// create new distributor |
98 | 98 |
m_display.m_distris[dist] = new Distri(dist, out, pix); |
99 | 99 |
|
100 | 100 |
// count distributors |
101 |
- ++m_display.m_distriCnt; |
|
101 |
+ m_display.m_distriCnt++; |
|
102 | 102 |
} |
103 | 103 |
|
104 | 104 |
/** |
... | ... |
@@ -122,7 +122,7 @@ class Config |
122 | 122 |
pattern = Pattern.compile("^([0-9]+) +([a-z]+)$"); |
123 | 123 |
matcher = pattern.matcher(settingPart2); |
124 | 124 |
if (!matcher.find()) |
125 |
- error("invalid mapping specifier \"" + settingPart2 + "\"" + |
|
125 |
+ errorExc("invalid mapping specifier \"" + settingPart2 + "\"" + |
|
126 | 126 |
String.format(" in line %d of config file", m_lineNo)); |
127 | 127 |
strDistri = matcher.group(1); |
128 | 128 |
strChannel = matcher.group(2); |
... | ... |
@@ -134,13 +134,13 @@ class Config |
134 | 134 |
dist = Constants.distriMaxCnt; // force error in next line |
135 | 135 |
} |
136 | 136 |
if (dist >= Constants.distriMaxCnt) |
137 |
- error("invalid distributor number \"" + strDistri + "\"" + |
|
137 |
+ errorExc("invalid distributor number \"" + strDistri + "\"" + |
|
138 | 138 |
String.format(" in line %d of config file", m_lineNo)); |
139 | 139 |
|
140 | 140 |
// get distributor |
141 | 141 |
distri = m_display.m_distris[dist]; |
142 | 142 |
if (distri == null) |
143 |
- error(String.format("no distributor with number \"%d\"" + |
|
143 |
+ errorExc(String.format("no distributor with number \"%d\"" + |
|
144 | 144 |
" in line %d of config file", dist, m_lineNo)); |
145 | 145 |
|
146 | 146 |
// get channel |
... | ... |
@@ -151,14 +151,14 @@ class Config |
151 | 151 |
else if (strChannel.equals("blue")) |
152 | 152 |
mapping = distri.m_mapBlue; |
153 | 153 |
else |
154 |
- error("invalid channel \"" + strChannel + "\"" + |
|
154 |
+ errorExc("invalid channel \"" + strChannel + "\"" + |
|
155 | 155 |
String.format(" in line %d of config file", m_lineNo)); |
156 | 156 |
|
157 | 157 |
// split mapping parameters |
158 | 158 |
pattern = Pattern.compile("^([-+.eE0-9]+) +([-+.eE0-9]+) +([-+.eE0-9]+)$"); |
159 | 159 |
matcher = pattern.matcher(value); |
160 | 160 |
if (!matcher.find()) |
161 |
- error("invalid mapping parameters \"" + value + "\"" + |
|
161 |
+ errorExc("invalid mapping parameters \"" + value + "\"" + |
|
162 | 162 |
String.format(" in line %d of config file", m_lineNo)); |
163 | 163 |
strBase = matcher.group(1); |
164 | 164 |
strFactor = matcher.group(2); |
... | ... |
@@ -170,11 +170,11 @@ class Config |
170 | 170 |
factor = Double.parseDouble(strFactor); |
171 | 171 |
gamma = Double.parseDouble(strGamma); |
172 | 172 |
} catch (NumberFormatException e) { |
173 |
- error("invalid mapping parameters \"" + value + "\"" + |
|
173 |
+ errorExc("invalid mapping parameters \"" + value + "\"" + |
|
174 | 174 |
String.format(" in line %d of config file", m_lineNo), e); |
175 | 175 |
} |
176 | 176 |
if (gamma <= 0.0) |
177 |
- error(String.format("invalid gamma value \"%f\"" + |
|
177 |
+ errorExc(String.format("invalid gamma value \"%f\"" + |
|
178 | 178 |
" in line %d of config file", gamma, m_lineNo)); |
179 | 179 |
|
180 | 180 |
// update mapping parameters |
... | ... |
@@ -185,14 +185,51 @@ class Config |
185 | 185 |
* @brief process pixel from config file |
186 | 186 |
* |
187 | 187 |
* @param[in] txtPixel text of pixel to process |
188 |
+ * @param[in] distri distributor |
|
188 | 189 |
* @param[in] dist number of distributor |
189 | 190 |
* @param[in] out number of output |
190 | 191 |
* @param[in] pix number of pixel |
192 |
+ * @param return if parsing was successful |
|
191 | 193 |
*/ |
192 |
- void procPixel(String txtPixel, int dist, int out, int pix) |
|
193 |
- throws Exception |
|
194 |
+ boolean procPixel(String txtPixel, Distri distri, int dist, int out, int pix) |
|
194 | 195 |
{ |
195 |
- // TODO |
|
196 |
+ Pixel pixel; |
|
197 |
+ int idx; |
|
198 |
+ |
|
199 |
+ // get coordinates of pixel |
|
200 |
+ pixel = PixelParser.parsePixel(txtPixel); |
|
201 |
+ if (pixel == null) { |
|
202 |
+ error("invalid pixel \"" + txtPixel + "\"" + |
|
203 |
+ String.format(" in line %d of config file", m_lineNo)); |
|
204 |
+ return false; |
|
205 |
+ } |
|
206 |
+ |
|
207 |
+ // check pixel number |
|
208 |
+ if (pix >= Constants.pixelMaxCnt || pix >= distri.m_pixelCnt) { |
|
209 |
+ error(String.format("too many pixels (more than %d)" + |
|
210 |
+ " in line %d of config file", |
|
211 |
+ distri.m_pixelCnt, m_lineNo)); |
|
212 |
+ return false; |
|
213 |
+ } |
|
214 |
+ |
|
215 |
+ // check that pixel is not yet set |
|
216 |
+ idx = out * distri.m_pixelCnt + pix; |
|
217 |
+ if (distri.m_pixels[idx] != null) { |
|
218 |
+ error(String.format("pixel %d of output %d of distributor %d" + |
|
219 |
+ " already set to pixel %d,%d" + |
|
220 |
+ " in line %d of config file", |
|
221 |
+ pix, out, dist, distri.m_pixels[idx].m_x, |
|
222 |
+ distri.m_pixels[idx].m_y, m_lineNo)); |
|
223 |
+ return false; |
|
224 |
+ } |
|
225 |
+ |
|
226 |
+ // create pixel |
|
227 |
+ distri.m_pixels[idx] = pixel; |
|
228 |
+ |
|
229 |
+ // count pixels in total |
|
230 |
+ m_display.m_pixelCnt++; |
|
231 |
+ |
|
232 |
+ return true; |
|
196 | 233 |
} |
197 | 234 |
|
198 | 235 |
/** |
... | ... |
@@ -204,7 +241,49 @@ class Config |
204 | 241 |
void procOutput(String settingPart2, String value) |
205 | 242 |
throws Exception |
206 | 243 |
{ |
207 |
- // TODO |
|
244 |
+ Pixel px; |
|
245 |
+ int dist, out, pix; |
|
246 |
+ Distri distri; |
|
247 |
+ String [] pixels; |
|
248 |
+ boolean err; |
|
249 |
+ |
|
250 |
+ // get number of distributor and output |
|
251 |
+ px = PixelParser.parsePixel(settingPart2); // abuse for "dist,out" |
|
252 |
+ if (px == null) |
|
253 |
+ errorExc("invalid output specifier \"" + settingPart2 + "\"" + |
|
254 |
+ String.format(" in line %d of config file", m_lineNo)); |
|
255 |
+ dist = px.m_x; |
|
256 |
+ if (dist >= Constants.distriMaxCnt) |
|
257 |
+ errorExc(String.format("invalid distributor number \"%d\"" + |
|
258 |
+ " in line %d of config file", dist, m_lineNo)); |
|
259 |
+ out = px.m_y; |
|
260 |
+ if (out >= Constants.outputMaxCnt) |
|
261 |
+ errorExc(String.format("invalid output number \"%d\"" + |
|
262 |
+ " in line %d of config file", out, m_lineNo)); |
|
263 |
+ |
|
264 |
+ // get distributor |
|
265 |
+ distri = m_display.m_distris[dist]; |
|
266 |
+ if (distri == null) |
|
267 |
+ errorExc(String.format("no distributor with number \"%d\"" + |
|
268 |
+ " in line %d of config file", dist, m_lineNo)); |
|
269 |
+ |
|
270 |
+ // check output number |
|
271 |
+ if (out >= distri.m_outputCnt) |
|
272 |
+ errorExc(String.format("no output with output number \"%d\"" + |
|
273 |
+ " in line %d of config file", out, m_lineNo)); |
|
274 |
+ |
|
275 |
+ // count outputs |
|
276 |
+ m_display.m_outputCnt++; |
|
277 |
+ |
|
278 |
+ // process pixels |
|
279 |
+ pixels = value.split("\\s+"); |
|
280 |
+ err = false; |
|
281 |
+ for (pix = 0; pix < pixels.length; ++pix) |
|
282 |
+ if (!procPixel(pixels[pix], distri, dist, out, pix)) |
|
283 |
+ err = true; |
|
284 |
+ if (err) |
|
285 |
+ errorExc(String.format("invalid pixels in line %d of config file", |
|
286 |
+ m_lineNo)); |
|
208 | 287 |
} |
209 | 288 |
|
210 | 289 |
/** |
... | ... |
@@ -227,7 +306,7 @@ class Config |
227 | 306 |
if (setting.equals("bindAddr")) { |
228 | 307 |
addr = AddrParser.parseAddr(value); |
229 | 308 |
if (addr == null) { |
230 |
- error("invalid addess \"" + value + "\" for \"" + setting + |
|
309 |
+ errorExc("invalid addess \"" + value + "\" for \"" + setting + |
|
231 | 310 |
String.format(" in line %d of config file", m_lineNo)); |
232 | 311 |
} |
233 | 312 |
info("bind address: " + addr.toString()); |
... | ... |
@@ -239,7 +318,7 @@ class Config |
239 | 318 |
if (setting.equals("size")) { |
240 | 319 |
pix = PixelParser.parsePixel(value); |
241 | 320 |
if (pix == null || pix.m_x <= 0 || pix.m_y <= 0) { |
242 |
- error("invalid value \"" + value + "\" for \"" + setting + |
|
321 |
+ errorExc("invalid value \"" + value + "\" for \"" + setting + |
|
243 | 322 |
String.format(" in line %d of config file", m_lineNo)); |
244 | 323 |
} |
245 | 324 |
m_display.m_size = pix; |
... | ... |
@@ -317,7 +396,7 @@ class Config |
317 | 396 |
|
318 | 397 |
// check file name |
319 | 398 |
if (configFileName.length() == 0) |
320 |
- error("no config file specified"); |
|
399 |
+ errorExc("no config file specified"); |
|
321 | 400 |
|
322 | 401 |
info("using config file \"" + configFileName + "\""); |
323 | 402 |
|
... | ... |
@@ -326,7 +405,7 @@ class Config |
326 | 405 |
fr = new FileReader(configFileName); |
327 | 406 |
br = new BufferedReader(fr); |
328 | 407 |
} catch (FileNotFoundException e) { |
329 |
- error("cannot open config file \"" + configFileName + |
|
408 |
+ errorExc("cannot open config file \"" + configFileName + |
|
330 | 409 |
"\" for reading", e); |
331 | 410 |
} |
332 | 411 |
|
... | ... |
@@ -345,19 +424,27 @@ class Config |
345 | 424 |
m_display.m_size.m_y) + |
346 | 425 |
String.format("%d distributors, ", m_display.m_distriCnt ) + |
347 | 426 |
String.format("%d outputs, ", m_display.m_outputCnt ) + |
348 |
- String.format("%d pixels, ", m_display.m_pixelCnt) + |
|
349 |
- "\n"); |
|
427 |
+ String.format("%d pixels\n", m_display.m_pixelCnt)); |
|
350 | 428 |
} |
351 | 429 |
|
352 | 430 |
/** |
353 |
- * @brief report error message and throw exception |
|
431 |
+ * @brief report error message |
|
354 | 432 |
* @param[in] txt error text |
355 | 433 |
*/ |
356 | 434 |
private void error(String txt) |
357 |
- throws Exception |
|
358 | 435 |
{ |
359 | 436 |
if (m_messageIf != null) |
360 | 437 |
m_messageIf.message(MsgType.Err, txt + "\n"); |
438 |
+ } |
|
439 |
+ |
|
440 |
+ /** |
|
441 |
+ * @brief report error message and throw exception |
|
442 |
+ * @param[in] txt error text |
|
443 |
+ */ |
|
444 |
+ private void errorExc(String txt) |
|
445 |
+ throws Exception |
|
446 |
+ { |
|
447 |
+ error(txt); |
|
361 | 448 |
throw new Exception(txt); |
362 | 449 |
} |
363 | 450 |
|
... | ... |
@@ -366,11 +453,10 @@ class Config |
366 | 453 |
* @param[in] txt error text |
367 | 454 |
* @param[in] e reason for error |
368 | 455 |
*/ |
369 |
- private void error(String txt, Exception e) |
|
456 |
+ private void errorExc(String txt, Exception e) |
|
370 | 457 |
throws Exception |
371 | 458 |
{ |
372 |
- if (m_messageIf != null) |
|
373 |
- m_messageIf.message(MsgType.Err, txt + ": " + e.getMessage() + "\n"); |
|
459 |
+ error(txt + ": " + e.getMessage()); |
|
374 | 460 |
throw new Exception(txt, e); |
375 | 461 |
} |
376 | 462 |
|
... | ... |
@@ -142,9 +142,9 @@ public class Display |
142 | 142 |
if (rx >= 0 && rx < width && ry >= 0 && ry < height) { |
143 | 143 |
// get pixel data and map it |
144 | 144 |
src = rx * strideX + ry * strideY; |
145 |
- distri.m_msgBuf[dest+0] = distri.m_mapRed.m_table[data[src+0]]; |
|
146 |
- distri.m_msgBuf[dest+1] = distri.m_mapGreen.m_table[data[src+1]]; |
|
147 |
- distri.m_msgBuf[dest+2] = distri.m_mapBlue.m_table[data[src+2]]; |
|
145 |
+ distri.m_msgBuf[dest+0] = distri.m_mapRed.m_table[data[src+0] & 0xFF]; |
|
146 |
+ distri.m_msgBuf[dest+1] = distri.m_mapGreen.m_table[data[src+1] & 0xFF]; |
|
147 |
+ distri.m_msgBuf[dest+2] = distri.m_mapBlue.m_table[data[src+2] & 0xFF]; |
|
148 | 148 |
} |
149 | 149 |
|
150 | 150 |
} // if pixel |
151 | 151 |