b636ea14fbe66e38121b6cb4df9eeb169b9ddfe7
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

1) /*
Stefan Schuermans rename "FlexiPix" to "Ether...

Stefan Schuermans authored 7 years ago

2)  * EtherPix config file generator
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

3)  *
Stefan Schuermans version update

Stefan Schuermans authored 7 years ago

4)  * Copyright 2010-2017 Stefan Schuermans <stefan schuermans info>
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

5)  *
6)  * This program is free software: you can redistribute it and/or modify
7)  * it under the terms of the GNU General Public License as published by
8)  * the Free Software Foundation, version 3 of the License.
9)  *
10)  *
11)  * This program is distributed in the hope that it will be useful,
12)  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13)  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14)  * GNU General Public License for more details.
15)  *
16)  * You should have received a copy of the GNU Lesser General Public License
17)  * along with this program. If not, see <http://www.gnu.org/licenses/>.
18)  */
19) 
20) #include <algorithm>
21) #include <dime/entities/Entity.h>
22) #include <dime/Input.h>
23) #include <dime/Model.h>
24) #include <dime/State.h>
25) #include <fstream>
26) #include <iostream>
27) #include <map>
28) #include <string>
29) 
30) #include "chain.h"
31) #include "constants.h"
32) #include "distri.h"
33) #include "layer.h"
34) #include "line.h"
35) #include "pixel.h"
36) #include "point.h"
37) 
Stefan Schuermans cleanup / rework

Stefan Schuermans authored 7 years ago

38) #define SUCCESS (0) // no error
39) #define ERR_USAGE (2) // invalid command line arguments
40) #define ERR_FILE_OPEN (3) // could not open input/output file
41) #define ERR_FILE_READ (4) // could not read input file
42) #define ERR_FILE_PROC (5) // could not process input file
43) #define ERR_PROC (5) // error in processing of objects found in input file
44) 
Stefan Schuermans move config into DXF files

Stefan Schuermans authored 7 years ago

45) // layers of drawing
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

46) Layer gLayerVideo, gLayerPixel, gLayerNetwork;
47) std::map<unsigned int, Layer> gLayerCables, gLayerDistributors;
48) Layer gLayerCable;
49) 
Stefan Schuermans move config into DXF files

Stefan Schuermans authored 7 years ago

50) /**
51)  * @brief get configuration from special layer names
52)  * @param[in] model DXF drawing
53)  * @param[out] width virtual frame width in pixels
54)  * @param[out] height virtual frame height in pixels
55)  * @param[out] chains number of outputs / pixel chains per distributor
56)  * @param[out] pixels number of pixels per chain
57)  * return true for success
58)  */
59) static bool get_config(dimeModel const &model,
60)                        unsigned int &width, unsigned int &height,
61)                        unsigned int &chains, unsigned int &pixels)
62) {
63)   int layers, layer_no;
64) 
65)   width = 0;
66)   height = 0;
67)   chains = 0;
68)   pixels = 0;
69) 
70)   layers = model.getNumLayers();
71)   for (layer_no = 0; layer_no < layers; ++layer_no) {
72)     dimeLayer const *layer = model.getLayer(layer_no);
73)     std::string strLayerName = layer->getLayerName();
74) 
75)     if (strLayerName.substr(0, 10) == "cfg_width ") {
76)       if (width != 0) {
77)         std::cerr << "duplicate configuration of width" << std::endl;
78)         return false;
79)       }
80)       width = strtoul(strLayerName.substr(10).c_str(), NULL, 0);
81)       if (width == 0) {
82)         std::cerr << "invalid configuration of width" << std::endl;
83)         return false;
84)       }
85)     } else if (strLayerName.substr(0, 11) == "cfg_height ") {
86)       if (height != 0) {
87)         std::cerr << "duplicate configuration of height" << std::endl;
88)         return false;
89)       }
90)       height = strtoul(strLayerName.substr(11).c_str(), NULL, 0);
91)       if (height == 0) {
92)         std::cerr << "invalid configuration of height" << std::endl;
93)         return false;
94)       }
95)     } else if (strLayerName.substr(0, 12) == "cfg_outputs ") {
96)       if (chains != 0) {
97)         std::cerr << "duplicate configuration of number of outputs per distributor"
98)                   << std::endl;
99)         return false;
100)       }
101)       chains = strtoul(strLayerName.substr(12).c_str(), NULL, 0);
102)       if (chains == 0) {
103)         std::cerr << "invalid configuration of number of outputs per distributor"
104)                   << std::endl;
105)         return false;
106)       }
107)     } else if (strLayerName.substr(0, 11) == "cfg_pixels ") {
108)       if (pixels != 0) {
109)         std::cerr << "duplicate configuration of number of pixels per output"
110)                   << std::endl;
111)         return false;
112)       }
113)       pixels = strtoul(strLayerName.substr(11).c_str(), NULL, 0);
114)       if (pixels == 0) {
115)         std::cerr << "invalid configuration of number of pixels per output"
116)                   << std::endl;
117)         return false;
118)       }
119)     }
120) 
121)   } // for layer_no
122) 
123)   if (width == 0) {
124)     std::cerr << "missing configuration of width" << std::endl;
125)     return false;
126)   }
127)   if (height == 0) {
128)     std::cerr << "missing configuration of height" << std::endl;
129)     return false;
130)   }
131)   if (chains == 0) {
132)     std::cerr << "missing configuration of number of outputs per distributor"
133)               << std::endl;
134)     return false;
135)   }
136)   if (pixels == 0) {
137)     std::cerr << "missing configuration of number of pixels per output"
138)               << std::endl;
139)     return false;
140)   }
141) 
142)   std::cout << "configuration:" << std::endl;
143)   std::cout << "  width: " << width << std::endl;
144)   std::cout << "  height: " << height << std::endl;
145)   std::cout << "  outputs: " << chains << std::endl;
146)   std::cout << "  pixels: " << pixels << std::endl;
147) 
148)   return true;
149) }
150) 
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

151) /**
Stefan Schuermans comment typo

Stefan Schuermans authored 7 years ago

152)  * @brief enumerate a entity in the DXF file
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

153)  * @param[in] state current state of libdime
154)  * @param[in] entity pointer to entity
155)  * @param[in] vp_ctx context pointer
156)  * @return if to continue enumeration
157)  */
Stefan Schuermans make local functions static

Stefan Schuermans authored 7 years ago

158) static bool cbEntity(const class dimeState * const state,
159)                      class dimeEntity *entity, void *vp_ctx)
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

160) {
161)   (void)vp_ctx;
162) 
163)   // get layer
164)   std::string strLayerName = entity->getLayerName();
165)   Layer * pLayer;
Stefan Schuermans support decimal and hexadec...

Stefan Schuermans authored 7 years ago

166)   if (strLayerName == "video") {
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

167)     pLayer = &gLayerVideo;
Stefan Schuermans support decimal and hexadec...

Stefan Schuermans authored 7 years ago

168)   } else if (strLayerName == "pixel") {
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

169)     pLayer = &gLayerPixel;
Stefan Schuermans support decimal and hexadec...

Stefan Schuermans authored 7 years ago

170)   } else if (strLayerName == "network") {
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

171)     pLayer = &gLayerNetwork;
Stefan Schuermans support decimal and hexadec...

Stefan Schuermans authored 7 years ago

172)   } else if (strLayerName == "cable") {
173)     pLayer = &gLayerCables[0];
174)   } else if (strLayerName.substr(0, 6) == "cable ") {
175)     unsigned int no = strtoul(strLayerName.substr(6).c_str(), NULL, 0);
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

176)     pLayer = &gLayerCables[no];
177)   } else if (strLayerName.substr(0, 12) == "distributor ") {
Stefan Schuermans support decimal and hexadec...

Stefan Schuermans authored 7 years ago

178)     unsigned int no = strtoul(strLayerName.substr(12).c_str(), NULL, 0);
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

179)     pLayer = &gLayerDistributors[no];
Stefan Schuermans support decimal and hexadec...

Stefan Schuermans authored 7 years ago

180)   } else {
Stefan Schuermans move config into DXF files

Stefan Schuermans authored 7 years ago

181)     return true; // unknown layer -> ignore
Stefan Schuermans support decimal and hexadec...

Stefan Schuermans authored 7 years ago

182)   }
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

183) 
184)   // get transformation matrix
185)   dimeMatrix matrix;
186)   state->getMatrix(matrix);
187) 
188)   // get geometry data
189)   dimeArray<dimeVec3f> vertices;
190)   dimeArray<int> indices;
191)   dimeVec3f extrusionDir;
192)   dxfdouble thickness;
193)   entity->extractGeometry(vertices, indices, extrusionDir, thickness);
194) 
195)   // transform geometry data
196)   for (int i = 0; i < vertices.count(); ++i)
197)     matrix.multMatrixVec(vertices[i]);
198) 
199)   // build object from geometry data
200)   Object *pObject = new Object;
201)   for (int i = 1; i < vertices.count(); ++i) {
202)     Line *pLine = new Line(Point(vertices[i - 1].x, vertices[i - 1].y),
203)                            Point(vertices[i].x, vertices[i].y));
204)     if (pLine->length() >= EPSILON) // ignore dots
205)       pObject->add(pLine);
206)     else {
Stefan Schuermans tidy output

Stefan Schuermans authored 7 years ago

207)       std::cerr << "ignoring dot at " << pLine->mStart.mX << ","
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

208)                 << pLine->mStart.mY << std::endl;
209)       delete pLine;
210)     }
211)   }
212) 
213)   // build object into layer
214)   pLayer->build(pObject);
215) 
216)   return true;
217) }
218) 
Stefan Schuermans cleanup / rework

Stefan Schuermans authored 7 years ago

219) /**
220)  * @brief read a DXF file and process objects found in it
221)  * @param[in] strDxfFileName name of DXF file
222)  * @param[out] width width of logical video frame
223)  * @param[out] height height of logical video frame
224)  * @param[out] chains number of chains (outputs) per distributor
225)  * @param[out] pixels number of pixels in one chain
226)  *                                    (i.e. connected to one output)
227)  * @return SUCCESS on success, other value on error
228)  */
229) static int readDXF(std::string const &strDxfFileName,
230)                    unsigned int &width, unsigned int &height,
231)                    unsigned int &chains, unsigned int &pixels)
232) {
233)   // read DXF file
234)   dimeInput in;
235)   if (!in.setFile(strDxfFileName.c_str())) {
236)     std::cerr << "error opening file \"" << strDxfFileName
237)               << "\" for reading" << std::endl;
238)     return ERR_FILE_OPEN;
239)   }
240)   dimeModel model;
241)   if (!model.read(&in)) {
242)     std::cerr << "DXF read error in line " << in.getFilePosition()
243)               << " of file \"" << strDxfFileName << "\""
244)               << std::endl;
245)     return ERR_FILE_READ;
246)   }
247) 
248)   // get configuration from layers
249)   if (! get_config(model, width, height, chains, pixels)) {
250)     return ERR_FILE_PROC;
251)   }
252) 
253)   // enumerate all entities
254)   model.traverseEntities(cbEntity, NULL);
255) 
256)   // merge all cable layers
257)   std::map<unsigned int, Layer>::iterator itCable;
258)   for (itCable = gLayerCables.begin();
259)        itCable != gLayerCables.end(); ++itCable)
260)   gLayerCable.merge(&itCable->second);
261)   // gLayerCables[] is now empty and will not be used any more
262) 
263)   // output object count information
264)   std::cout << "object counts:" << std::endl;
265)   std::cout << "  video: " << gLayerVideo.mObjects.size() << std::endl;
266)   std::cout << "  pixel: " << gLayerPixel.mObjects.size() << std::endl;
267)   std::cout << "  cable: " << gLayerCable.mObjects.size() << std::endl;
268)   std::cout << "  network: " << gLayerNetwork.mObjects.size() << std::endl;
269)   std::cout << "  distributor:" << std::endl;
270)   std::map<unsigned int, Layer>::const_iterator itDistri;
271)   for (itDistri = gLayerDistributors.begin();
272)        itDistri != gLayerDistributors.end(); ++itDistri)
273)     std::cout << "    " << itDistri->first << ": "
274)               << itDistri->second.mObjects.size() << std::endl;
275) 
276)   return SUCCESS;
277) }
278) 
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

279) /**
280)  * @brief create a chain
281)  * @param[in] chain chain to create
282)  * @param[in] pObjCable cable to first pixel
Stefan Schuermans cleanup / rework

Stefan Schuermans authored 7 years ago

283)  * @return SUCCESS on success, other value on error
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

284)  */
Stefan Schuermans make local functions static

Stefan Schuermans authored 7 years ago

285) static int createChain(Chain &chain, const Object *pObjCable)
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

286) {
287)   // add all pixels
288)   const Object *pObjPixel = NULL;
289)   while (true) {
290) 
291)     // find pixels connected to cable
292)     std::vector<Layer::Intersection> intersectsPixels;
293)     gLayerPixel.getIntersections(pObjCable, intersectsPixels);
294) 
295)     // remove last pixel from results
296)     std::vector<Layer::Intersection>::iterator itPixel;
297)     for (itPixel = intersectsPixels.begin();
298)          itPixel != intersectsPixels.end(); ++itPixel) {
299)       if (itPixel->pObj == pObjPixel) {
300)         itPixel = intersectsPixels.erase(itPixel);
301)         if (itPixel == intersectsPixels.end())
302)           break;
303)       }
304)     }
305) 
306)     // end of chain
307)     if (intersectsPixels.size() < 1)
Stefan Schuermans cleanup / rework

Stefan Schuermans authored 7 years ago

308)       return SUCCESS;
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

309) 
310)     // more than one next pixel
311)     if (intersectsPixels.size() > 1) {
312)       std::cerr << "pixel cable connects multiple pixels ("
313)                 << intersectsPixels[0].pt.mX << ","
314)                 << intersectsPixels[0].pt.mY << ")" << std::endl;
Stefan Schuermans cleanup / rework

Stefan Schuermans authored 7 years ago

315)       return ERR_PROC;
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

316)     }
317) 
318)     // pixel found
319)     pObjPixel = intersectsPixels[0].pObj;
320) 
321)     // add pixel to chain
Stefan Schuermans make class members private

Stefan Schuermans authored 7 years ago

322)     chain.addPixel(Pixel(pObjPixel));
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

323) 
324)     // find cables connected to pixel
325)     std::vector<Layer::Intersection> intersectsCables;
326)     gLayerCable.getIntersections(pObjPixel, intersectsCables);
327) 
328)     // remove last cable from results
329)     std::vector<Layer::Intersection>::iterator itCable;
330)     for (itCable = intersectsCables.begin();
331)          itCable != intersectsCables.end(); ++itCable) {
332)       if (itCable->pObj == pObjCable) {
333)         itCable = intersectsCables.erase(itCable);
334)         if (itCable == intersectsCables.end())
335)           break;
336)       }
337)     }
338) 
339)     // end of chain
340)     if (intersectsCables.size() < 1)
Stefan Schuermans cleanup / rework

Stefan Schuermans authored 7 years ago

341)       return SUCCESS;
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

342) 
343)     // more than one next pixel
344)     if (intersectsCables.size() > 1) {
345)       std::cerr << "pixel connected to multiple pixel cables ("
346)                 << intersectsCables[0].pt.mX << ","
347)                 << intersectsCables[0].pt.mY << ")" << std::endl;
Stefan Schuermans cleanup / rework

Stefan Schuermans authored 7 years ago

348)       return ERR_PROC;
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

349)     }
350) 
351)     // next cable found
352)     pObjCable = intersectsCables[0].pObj;
353) 
354)   } // while (true)
355) }
356) 
357) /// sort helper for distributor/cables intersections
Stefan Schuermans make local functions static

Stefan Schuermans authored 7 years ago

358) static bool intersectsCablesSort(const Layer::Intersection& i1,
359)                                  const Layer::Intersection& i2)
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

360) {
Stefan Schuermans code formatting

Stefan Schuermans authored 7 years ago

361)   return i1.pt.abs_sq() < i2.pt.abs_sq();
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

362) }
363) 
364) /**
365)  * @brief create a distributor
366)  * @param[in] distri distributor to create
367)  * @param[in] pLayer layer containing distributor
368)  * @param[in] pixels number of pixels per chain
Stefan Schuermans cleanup / rework

Stefan Schuermans authored 7 years ago

369)  * @return SUCCESS on success, other value on error
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

370)  */
Stefan Schuermans make local functions static

Stefan Schuermans authored 7 years ago

371) static int createDistri(Distri &distri, const Layer *pLayer,
372)                         unsigned int pixels)
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

373) {
374)   // must have exactly one object
375)   if (pLayer->mObjects.size() != 1) {
Stefan Schuermans output hex numbers with 0x...

Stefan Schuermans authored 7 years ago

376)     std::cerr << "layer of distributor 0x" << std::hex << distri.getNo()
Stefan Schuermans improve error messages

Stefan Schuermans authored 7 years ago

377)               << "contains no object or multiple objects" << std::endl;
Stefan Schuermans cleanup / rework

Stefan Schuermans authored 7 years ago

378)     return ERR_PROC;
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

379)   }
380)   const Object *pObjDistri = pLayer->mObjects[0];
381) 
382)   // get location of network connection
383)   std::vector<Layer::Intersection> intersectsNet;
384)   gLayerNetwork.getIntersections(pObjDistri, intersectsNet);
385)   if (intersectsNet.size() != 1) {
Stefan Schuermans output hex numbers with 0x...

Stefan Schuermans authored 7 years ago

386)     std::cerr << "distributor 0x" << std::hex << distri.getNo()
Stefan Schuermans improve error messages

Stefan Schuermans authored 7 years ago

387)               << "has no network connection or multiple network connections"
388)               << std::endl;
Stefan Schuermans cleanup / rework

Stefan Schuermans authored 7 years ago

389)     return ERR_PROC;
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

390)   }
391)   Point ptNetwork = intersectsNet[0].pt;
392) 
393)   // get cables to pixel chains
394)   std::vector<Layer::Intersection> intersectsCables;
395)   gLayerCable.getIntersections(pObjDistri, intersectsCables);
396) 
397)   // sort cables according to distance to network
398)   std::vector<Layer::Intersection>::iterator itIntersect;
399)   for (itIntersect = intersectsCables.begin();
400)        itIntersect != intersectsCables.end(); ++itIntersect)
401)     itIntersect->pt -= ptNetwork;
402)   std::sort(intersectsCables.begin(), intersectsCables.end(),
403)             intersectsCablesSort);
404) 
405)   // create chains
406)   bool err = false;
407)   for (itIntersect = intersectsCables.begin();
408)        itIntersect != intersectsCables.end(); ++itIntersect) {
Stefan Schuermans make class members private

Stefan Schuermans authored 7 years ago

409)     distri.addChain(Chain(pixels));
410)     if (createChain(distri.accessLastChain(), itIntersect->pObj) != 0)
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

411)       err = true;
412)   }
413) 
Stefan Schuermans cleanup / rework

Stefan Schuermans authored 7 years ago

414)   return err ? ERR_PROC : SUCCESS;
415) }
416) 
417) /**
418)  * @brief make config file object from DXF layers
419)  * @param[in] width width of logical video frame
420)  * @param[in] height height of logical video frame
421)  * @param[in] chains number of chains (outputs) per distributor
422)  * @param[in] pixels number of pixels in one chain
423)  *                                    (i.e. connected to one output)
Stefan Schuermans implement simulator config...

Stefan Schuermans authored 7 years ago

424)  * @param[out] boundsVideo bounds of video screen object
Stefan Schuermans cleanup / rework

Stefan Schuermans authored 7 years ago

425)  * @param[out] distris distributor objects
426)  * @return true on success, false on error
427)  */
428) static bool makeObjects(unsigned int width, unsigned int height,
429)                         unsigned int chains, unsigned int pixels,
Stefan Schuermans implement simulator config...

Stefan Schuermans authored 7 years ago

430)                         Box &boundsVideo, std::vector<Distri> &distris)
Stefan Schuermans cleanup / rework

Stefan Schuermans authored 7 years ago

431) {
432)   // get origin and size of pixels in video
433)   gLayerVideo.getBounds(boundsVideo);
434)   Point ptPixel0(boundsVideo.mBL.mX, boundsVideo.mTR.mY);
435)   Point ptPixelSz = boundsVideo.mTR - boundsVideo.mBL;
436)   ptPixelSz.mX /= (double)width;
437)   ptPixelSz.mY /= (double)height;
438)   ptPixelSz.mY *= -1;
439)   std::cout << "video bounds: "
440)             << boundsVideo.mBL.mX << "," << boundsVideo.mBL.mY
441)             << " " << boundsVideo.mTR.mX << "," << boundsVideo.mTR.mY
442)             << std::endl;
443) 
444)   // create distributors
445)   bool ok = true;
446)   std::map<unsigned int, Layer>::const_iterator itDistri;
447)   for (itDistri = gLayerDistributors.begin();
448)        itDistri != gLayerDistributors.end(); ++itDistri) {
449)     distris.push_back(Distri(itDistri->first, chains, pixels));
450)     if (createDistri(distris.back(), &itDistri->second, pixels) != SUCCESS) {
451)       ok = false;
452)     }
453)   }
454) 
455)   // obtain pixel coordinates
456)   std::vector<Distri>::iterator itD;
457)   for (itD = distris.begin(); itD != distris.end(); ++itD)
458)     if (itD->pixCoord(ptPixel0, ptPixelSz, width, height) != 0)
459)       ok = false;
460) 
461)   // count pixels connected to distributors and compare to total pixels
462)   size_t distri_pixels = 0;
463)   for (itD = distris.begin(); itD != distris.end(); ++itD)
464)     distri_pixels += itD->countPixels();
465)   std::cout << "pixels connected to distributors: "
466)             << distri_pixels << std::endl;
467)   if (distri_pixels != gLayerPixel.mObjects.size()) {
468)     std::cerr << "number of connected pixels (" << distri_pixels
469)               << ") does not match total number of pixels ("
470)               << gLayerPixel.mObjects.size() << ")" << std::endl;
471)     ok = false;
472)   }
473) 
474)   // output extra error message if errors were detected
475)   if (! ok) {
476)     std::cerr << "ERRORs were found" << std::endl;
477)   }
478) 
479)   return ok;
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

480) }
481) 
482) /**
483)  * @brief write config file
484)  * @param[in] width width of video in pixels
485)  * @param[in] height height of video in pixels
486)  * @param[in] distris distributor objects
Stefan Schuermans implement simulator config...

Stefan Schuermans authored 7 years ago

487)  * @param[in] strCfgFileName name of config file
Stefan Schuermans cleanup / rework

Stefan Schuermans authored 7 years ago

488)  * @reutrn SUCCESS on success, other value on error
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

489)  */
Stefan Schuermans make local functions static

Stefan Schuermans authored 7 years ago

490) static int writeCfg(unsigned int width, unsigned int height,
491)                     const std::vector<Distri> &distris,
492)                     const std::string & strCfgFileName)
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

493) {
Stefan Schuermans code formatting

Stefan Schuermans authored 7 years ago

494)   // open output file
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

495)   std::ofstream strm(strCfgFileName.c_str(), std::ios::out);
496)   if (!strm.is_open()) {
497)     std::cerr << "could not open \"" << strCfgFileName
498)               << "\" for wrinting" << std::endl;
Stefan Schuermans cleanup / rework

Stefan Schuermans authored 7 years ago

499)     return ERR_FILE_OPEN;
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

500)   }
501) 
502)   // video size
503)   strm << "size = " << width << "," << height << std::endl
504)        << std::endl;
505) 
506)   // distributors
507)   std::vector<Distri>::const_iterator itD;
508)   for (itD = distris.begin(); itD != distris.end(); ++itD)
509)     itD->writeDistri(strm);
510)   strm << std::endl;
511) 
512)   // mappings
513)   for (itD = distris.begin(); itD != distris.end(); ++itD)
514)     itD->writeMapping(strm);
515)   strm << std::endl;
516) 
517)   // pixels
518)   for (itD = distris.begin(); itD != distris.end(); ++itD)
519)     itD->writePixels(strm);
520)   strm << std::endl;
521) 
522)   strm.close();
Stefan Schuermans cleanup / rework

Stefan Schuermans authored 7 years ago

523)   return SUCCESS;
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

524) }
525) 
Stefan Schuermans implement simulator config...

Stefan Schuermans authored 7 years ago

526) /**
527)  * @brief write simulator config file
528)  * @param[in] distris distributor objects
529)  * @param[in] boundsVideo bounds of video screen object
530)  * @param[in] strSimCfgFileName name of simulator config file
531)  * @reutrn SUCCESS on success, other value on error
532)  */
533) static int writeSimCfg(const std::vector<Distri> &distris,
534)                        const Box & boundsVideo,
535)                        const std::string & strSimCfgFileName)
536) {
Stefan Schuermans keep aspect ratio of simula...

Stefan Schuermans authored 7 years ago

537)   /* make video bounds quadratic
538)      in order to keep aspect ratio of simulator image */
539)   Box boundsVideoQuad = boundsVideo.expandQuadratic();
540) 
Stefan Schuermans implement simulator config...

Stefan Schuermans authored 7 years ago

541)   // open output file
542)   std::ofstream strm(strSimCfgFileName.c_str(), std::ios::out);
543)   if (!strm.is_open()) {
544)     std::cerr << "could not open \"" << strSimCfgFileName
545)               << "\" for wrinting" << std::endl;
546)     return ERR_FILE_OPEN;
547)   }
548) 
549)   // distributors
550)   std::vector<Distri>::const_iterator itD;
551)   for (itD = distris.begin(); itD != distris.end(); ++itD)
552)     itD->writeDistri(strm);
553)   strm << std::endl;
554) 
555)   // mappings
556)   for (itD = distris.begin(); itD != distris.end(); ++itD)
557)     itD->writeMapping(strm);
558)   strm << std::endl;
559) 
560)   // simulated pixels
561)   for (itD = distris.begin(); itD != distris.end(); ++itD)
Stefan Schuermans keep aspect ratio of simula...

Stefan Schuermans authored 7 years ago

562)     itD->writeSimPixels(strm, boundsVideoQuad);
Stefan Schuermans implement simulator config...

Stefan Schuermans authored 7 years ago

563)   strm << std::endl;
564) 
565)   strm.close();
566)   return SUCCESS;
567) }
568) 
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

569) /**
570)  * @brief main program
571)  * @param[in] argc number of parameters
572)  * @param[in] argv parameter values
Stefan Schuermans cleanup / rework

Stefan Schuermans authored 7 years ago

573)  * @return SUCCESS on success, other value on error
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

574)  */
575) int main(int argc, char *argv[])
576) {
577)   // get parameters
Stefan Schuermans implement simulator config...

Stefan Schuermans authored 7 years ago

578)   bool arg_err = 0, bDxfFileName = false, bCfgFileName = false,
579)                     bSimCfgFileName= false;
580)   std::string strDxfFileName, strCfgFileName, strSimCfgFileName;
581)   // old usage
582)   if (argc == 3) {
583)     std::cerr << "warning: old usage, consider using \"-d\" and \"-c\" options" << std::endl;
584)     strDxfFileName = argv[1];
585)     bDxfFileName = true;
586)     strCfgFileName = argv[2];
587)     bCfgFileName = true;
588)   } else {
589)     int argi;
590)     for (argi = 1; argi < argc; ++argi) {
591)       if (strcmp(argv[argi], "-c") == 0) {
592)         ++argi;
593)         if (argi < argc) {
594)           strCfgFileName = argv[argi];
595)           bCfgFileName = true;
596)         } else {
597)           std::cerr << "error: missing argument for \"-c\"" << std::endl;
598)         }
599)       } else if (strcmp(argv[argi], "-d") == 0) {
600)         ++argi;
601)         if (argi < argc) {
602)           strDxfFileName = argv[argi];
603)           bDxfFileName = true;
604)         } else {
605)           std::cerr << "error: missing argument for \"-d\"" << std::endl;
606)         }
607)       } else if (strcmp(argv[argi], "-s") == 0) {
608)         ++argi;
609)         if (argi < argc) {
610)           strSimCfgFileName = argv[argi];
611)           bSimCfgFileName = true;
612)         } else {
613)           std::cerr << "error: missing argument for \"-s\"" << std::endl;
614)         }
615)       } else {
616)         std::cerr << "error: unknown option \"" << argv[argi] << "\", call without arguments for usage" << std::endl;
617)         arg_err = true;
618)       }
619)     } // for argi
620)     if (! bDxfFileName) {
621)       std::cerr << "error: missing input drawing (\"-d\")" << std::endl;
622)       arg_err = true;
623)     }
624)   }
625)   // output help on error
626)   if (arg_err) {
Stefan Schuermans rename "FlexiPix" to "Ether...

Stefan Schuermans authored 7 years ago

627)     std::cerr << "EtherPix config file generator "
628)               << ETPCG_VER_MAJ << "."
629)               << ETPCG_VER_MIN << "."
630)               << ETPCG_VER_REV << std::endl
Stefan Schuermans implement simulator config...

Stefan Schuermans authored 7 years ago

631)               << "usage: " << argv[0] << " [options]" << std::endl
632)               << "options: -c <config.etp>       configuration file (output)" << std::endl
633)               << "         -d <drawing.dxf>      schematic drawing (input)" << std::endl
634)               << "         -s <sim_config.etps>  simulator configuration (output)" << std::endl
635)               << "old usage: " << argv[0] << " <schematic_drawing.dxf> <config.etp>"
Stefan Schuermans move config into DXF files

Stefan Schuermans authored 7 years ago

636)               << std::endl;
Stefan Schuermans cleanup / rework

Stefan Schuermans authored 7 years ago

637)     return ERR_USAGE;
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

638)   }
639) 
640)   // read DXF file
Stefan Schuermans move config into DXF files

Stefan Schuermans authored 7 years ago

641)   unsigned int width, height, chains, pixels;
Stefan Schuermans cleanup / rework

Stefan Schuermans authored 7 years ago

642)   int ret = readDXF(strDxfFileName, width, height, chains, pixels);
643)   if (ret != SUCCESS) {
644)     return ret;
Stefan Schuermans move config into DXF files

Stefan Schuermans authored 7 years ago

645)   }
646) 
Stefan Schuermans cleanup / rework

Stefan Schuermans authored 7 years ago

647)   // make config file objects from DXF layers
Stefan Schuermans implement simulator config...

Stefan Schuermans authored 7 years ago

648)   Box boundsVideo;
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

649)   std::vector<Distri> distris;
Stefan Schuermans implement simulator config...

Stefan Schuermans authored 7 years ago

650)   if (! makeObjects(width, height, chains, pixels, boundsVideo, distris)) {
Stefan Schuermans cleanup / rework

Stefan Schuermans authored 7 years ago

651)     return ERR_PROC;
Stefan Schuermans check number of connected p...

Stefan Schuermans authored 7 years ago

652)   }
653) 
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

654)   // write config file
Stefan Schuermans implement simulator config...

Stefan Schuermans authored 7 years ago

655)   if (bCfgFileName) {
656)     ret = writeCfg(width, height, distris, strCfgFileName);
657)     if ( ret != SUCCESS) {
658)       return ret;
659)     }
660)   }
661) 
662)   // write simulator config file
663)   if (bSimCfgFileName) {
664)     ret = writeSimCfg(distris, boundsVideo, strSimCfgFileName);
665)     if ( ret != SUCCESS) {
666)       return ret;
667)     }
Stefan Schuermans add config file generator

Stefan Schuermans authored 7 years ago

668)   }
Stefan Schuermans cleanup / rework

Stefan Schuermans authored 7 years ago

669) 
670)   return SUCCESS;