Stefan Schuermans commited on 2011-12-14 22:02:48
Showing 11 changed files, with 385 additions and 7 deletions.
... | ... |
@@ -0,0 +1,33 @@ |
1 |
+<html> |
|
2 |
+ <head> |
|
3 |
+ <title>Blinker - FlexiPix</title> |
|
4 |
+ </head> |
|
5 |
+ <body> |
|
6 |
+ <h1>Blinker - FlexiPix</h1> |
|
7 |
+ <p> |
|
8 |
+ The <a href="http://www.fleixpix.de">FlexiPix</a> module is used |
|
9 |
+ to output a stream to a FlexiPix display. |
|
10 |
+ It is only functional if Blinker has been compiled against |
|
11 |
+ <a href="http://git.blinkenarea.org/?p=libflexipix">libflexipix</a>. |
|
12 |
+ </p> |
|
13 |
+ <h2>Configuration</h2> |
|
14 |
+ <p> |
|
15 |
+ The configuration of the FlexiPix module with name <code>NAME</code> |
|
16 |
+ is located in the <code>flexipixes/NAME</code> subdirectory. |
|
17 |
+ </p> |
|
18 |
+ <h3>Input Stream</h3> |
|
19 |
+ <p> |
|
20 |
+ The file <code>instream</code> contains the name of the stream to |
|
21 |
+ read. |
|
22 |
+ The frames received from this stream are send to the FlexiPix display. |
|
23 |
+ </p> |
|
24 |
+ <h3>FlexiPix Configuration File</h3> |
|
25 |
+ <p> |
|
26 |
+ The file <code>flexipix.flp</code> is the FlexiPix configuration |
|
27 |
+ file used to access the FlexiPix display. |
|
28 |
+ It is a standard FlexiPix configuration file as it is expected |
|
29 |
+ by libflexipix. |
|
30 |
+ </p> |
|
31 |
+ </body> |
|
32 |
+</html> |
|
33 |
+ |
... | ... |
@@ -85,6 +85,7 @@ |
85 | 85 |
The following module types are available for instantiation: |
86 | 86 |
<ul> |
87 | 87 |
<li><a href="canvas.html">Canvas</a></li> |
88 |
+ <li><a href="flexipix.html">FlexiPix</a></li> |
|
88 | 89 |
<li><a href="output.html">Output</a></li> |
89 | 90 |
<li><a href="player.html">Player</a></li> |
90 | 91 |
<li><a href="printer.html">Printer</a></li> |
... | ... |
@@ -0,0 +1,32 @@ |
1 |
+# FlexiPix configuration file |
|
2 |
+ |
|
3 |
+# the address to bind the local socket to |
|
4 |
+# - the FlexiPix network 10.70.80.0/16 must be reachable from this address |
|
5 |
+bindAddr = 0.0.0.0:0 |
|
6 |
+ |
|
7 |
+# the size of the display |
|
8 |
+# - <width>,<height> in pixels |
|
9 |
+size = 18,8 |
|
10 |
+ |
|
11 |
+# this line adds a new distributor |
|
12 |
+# - the general format is: distributor <distributor number> = <number of outputs>,<number of pixel per output> |
|
13 |
+distributor 0 = 6,64 |
|
14 |
+ |
|
15 |
+# those lines introduce a mapping between the channel values in the video and the values transmitted to the display |
|
16 |
+# - mapping is done per distributor and applies to all pixels connected to it |
|
17 |
+# - the general format is: mapping <distributor number> (red|green|blue) = <base> <factor> <gamma> |
|
18 |
+# - the mapping formula is: <display value> := <base> + <factor> * <original value> ^ (1 / <gamma>) |
|
19 |
+mapping 0 red = 0.0 1.0 1.0 |
|
20 |
+mapping 0 green = 0.0 1.0 1.0 |
|
21 |
+mapping 0 blue = 0.0 1.0 1.0 |
|
22 |
+ |
|
23 |
+# these lines specify the logical positions of the pixels at an output in movie coordinates |
|
24 |
+# - the general format is: output <distributor number>,<output number> = <pixel x>,<pixel y> ... |
|
25 |
+# - the order of the pixels is the order they are connected in the chain |
|
26 |
+output 0,0 = 1,0 1,1 1,2 1,3 1,4 1,5 1,6 1,7 0,7 0,6 0,5 0,4 0,3 0,2 0,1 0,0 |
|
27 |
+output 0,1 = |
|
28 |
+output 0,2 = 2,0 2,1 2,2 2,3 2,4 2,5 2,6 2,7 3,7 3,6 3,5 3,4 3,3 3,2 3,1 3,0 4,0 4,1 4,2 4,3 4,4 4,5 4,6 4,7 5,7 5,6 5,5 5,4 5,3 5,2 5,1 5,0 6,0 6,1 6,2 6,3 6,4 6,5 6,6 6,7 7,7 7,6 7,5 7,4 7,3 7,2 7,1 7,0 8,0 8,1 8,2 8,3 8,4 8,5 8,6 8,7 9,7 9,6 9,5 9,4 9,3 9,2 9,1 9,0 |
|
29 |
+output 0,3 = |
|
30 |
+output 0,4 = 10,0 10,1 10,2 10,3 10,4 10,5 10,6 10,7 11,7 11,6 11,5 11,4 11,3 11,2 11,1 11,0 12,0 12,1 12,2 12,3 12,4 12,5 12,6 12,7 13,7 13,6 13,5 13,4 13,3 13,2 13,1 13,0 14,0 14,1 14,2 14,3 14,4 14,5 14,6 14,7 15,7 15,6 15,5 15,4 15,3 15,2 15,1 15,0 16,0 16,1 16,2 16,3 16,4 16,5 16,6 16,7 17,7 17,6 17,5 17,4 17,3 17,2 17,1 17,0 |
|
31 |
+output 0,5 = |
|
32 |
+ |
... | ... |
@@ -0,0 +1 @@ |
1 |
+any |
... | ... |
@@ -1,35 +1,49 @@ |
1 |
+CFGS=$(wildcard config/*.cfg.sh) |
|
1 | 2 |
SRCS=$(wildcard noarch/*.cpp) $(wildcard linux/*.cpp) |
2 | 3 |
TARGET=Blinker |
3 | 4 |
|
4 | 5 |
CPP=g++ |
6 |
+CONFIG= |
|
7 |
+DEFINE=-DBLINKER_CONFIG="\"$(CONFIG)\"" |
|
5 | 8 |
INCLUDE=-Inoarch -Ilinux |
6 | 9 |
CFLAGS=-Wall -Wextra -g2 |
7 | 10 |
LDFLAGS= |
8 | 11 |
LIBS=-lBlinkenLib |
9 | 12 |
|
13 |
+CFGS_BASE=$(patsubst %.cfg.sh,%,$(CFGS)) |
|
14 |
+CFGS_MK=$(addsuffix .cfg.mk,$(CFGS_BASE)) |
|
10 | 15 |
SRCS_BASE=$(patsubst %.cpp,%,$(SRCS)) |
11 | 16 |
DEPS=$(addsuffix .d,$(SRCS_BASE)) |
12 | 17 |
OBJS=$(addsuffix .o,$(SRCS_BASE)) |
13 | 18 |
|
14 |
-.PHONY: all clean |
|
19 |
+.PHONY: all clean distclean |
|
15 | 20 |
.SUFFIXES: |
16 | 21 |
.SECONDARY: |
17 | 22 |
|
18 |
-all: deps $(TARGET) |
|
23 |
+all: $(TARGET) |
|
19 | 24 |
|
20 | 25 |
ifneq ($(MAKECMDGOALS),clean) |
26 |
+ ifneq ($(MAKECMDGOALS),distclean) |
|
27 |
+ include config.mk |
|
21 | 28 |
include deps |
22 | 29 |
endif |
30 |
+endif |
|
31 |
+ |
|
32 |
+config.mk: $(CFGS_MK) |
|
33 |
+ cat /dev/null $^ >$@ |
|
34 |
+ |
|
35 |
+%.cfg.mk: %.cfg.sh |
|
36 |
+ sh $< >$@ |
|
23 | 37 |
|
24 | 38 |
deps: $(DEPS) |
25 |
- cat /dev/null $+ >$@ |
|
39 |
+ cat /dev/null $^ >$@ |
|
26 | 40 |
|
27 |
-%.d: %.cpp Makefile |
|
28 |
- $(CPP) $(INCLUDE) $(CFLAGS) -M -o $@ $< |
|
41 |
+%.d: %.cpp Makefile config.mk |
|
42 |
+ $(CPP) $(DEFINE) $(INCLUDE) $(CFLAGS) -M -o $@ $< |
|
29 | 43 |
sed -i 1s!^!$(dir $<)! $@ |
30 | 44 |
|
31 | 45 |
%.o: %.cpp Makefile |
32 |
- $(CPP) $(INCLUDE) $(CFLAGS) -c -o $@ $< |
|
46 |
+ $(CPP) $(DEFINE) $(INCLUDE) $(CFLAGS) -c -o $@ $< |
|
33 | 47 |
|
34 | 48 |
$(TARGET): $(OBJS) |
35 | 49 |
$(CPP) $(LDFLAGS) -o $@ $+ $(LIBS) |
... | ... |
@@ -37,3 +51,6 @@ $(TARGET): $(OBJS) |
37 | 51 |
clean: |
38 | 52 |
rm -f deps $(DEPS) $(OBJS) $(TARGET) |
39 | 53 |
|
54 |
+distclean: clean |
|
55 |
+ rm -f config.mk $(CFGS_MK) |
|
56 |
+ |
... | ... |
@@ -0,0 +1 @@ |
1 |
+*.cfg.mk |
... | ... |
@@ -0,0 +1,193 @@ |
1 |
+/* Blinker |
|
2 |
+ Copyright 2011 Stefan Schuermans <stefan@blinkenarea.org> |
|
3 |
+ Copyleft GNU public license - http://www.gnu.org/copyleft/gpl.html |
|
4 |
+ a blinkenarea.org project */ |
|
5 |
+ |
|
6 |
+#include <iostream> |
|
7 |
+#include <stdlib.h> |
|
8 |
+#include <string> |
|
9 |
+#include <string.h> |
|
10 |
+ |
|
11 |
+#include <BlinkenLib/BlinkenFrame.h> |
|
12 |
+#include <BlinkenLib/BlinkenProto.h> |
|
13 |
+ |
|
14 |
+#ifdef BLINKER_CFG_FLEXIPIX |
|
15 |
+extern "C" { |
|
16 |
+#include <flexipix/flexipix.h> |
|
17 |
+} // extern "C" |
|
18 |
+#endif // #ifdef BLINKER_CFG_FLEIXPIX |
|
19 |
+ |
|
20 |
+#include "CallMgr.h" |
|
21 |
+#include "Directory.h" |
|
22 |
+#include "File.h" |
|
23 |
+#include "FlexiPix.h" |
|
24 |
+#include "InStreamFile.h" |
|
25 |
+#include "Module.h" |
|
26 |
+#include "Size.h" |
|
27 |
+#include "StreamMgr.h" |
|
28 |
+#include "StreamRecv.h" |
|
29 |
+#include "Time.h" |
|
30 |
+#include "TimeCallee.h" |
|
31 |
+ |
|
32 |
+namespace Blinker { |
|
33 |
+ |
|
34 |
+/** |
|
35 |
+ * @brief constructor |
|
36 |
+ * @param[in] callMgr callback manager |
|
37 |
+ * @param[in] streamMgr stream manager |
|
38 |
+ * @param[in] dirBase base directory |
|
39 |
+ */ |
|
40 |
+FlexiPix::FlexiPix(CallMgr &callMgr, StreamMgr &streamMgr, |
|
41 |
+ const Directory &dirBase): |
|
42 |
+ Module(callMgr, streamMgr, dirBase), |
|
43 |
+ m_fileInStream(dirBase.getFile("instream"), streamMgr), |
|
44 |
+ m_fileConfig(dirBase.getFile("flexipix.flp")), |
|
45 |
+ m_pDisplay(NULL) |
|
46 |
+{ |
|
47 |
+ // set up |
|
48 |
+ m_fileInStream.setStreamRecv(this); |
|
49 |
+ createDisplay(); |
|
50 |
+} |
|
51 |
+ |
|
52 |
+/// virtual destructor |
|
53 |
+FlexiPix::~FlexiPix() |
|
54 |
+{ |
|
55 |
+ // clean up |
|
56 |
+ destroyDisplay(); |
|
57 |
+ m_fileInStream.setStreamRecv(NULL); |
|
58 |
+ m_callMgr.cancelTimeCall(this); |
|
59 |
+} |
|
60 |
+ |
|
61 |
+/// check for update of configuration |
|
62 |
+void FlexiPix::updateConfig() |
|
63 |
+{ |
|
64 |
+ // input stream name file was modified -> re-get input stream |
|
65 |
+ if (m_fileInStream.checkModified()) |
|
66 |
+ m_fileInStream.update(); |
|
67 |
+ |
|
68 |
+ // FlexiPix config file was modified -> re-create display |
|
69 |
+ if (m_fileConfig.checkModified()) |
|
70 |
+ createDisplay(); |
|
71 |
+} |
|
72 |
+ |
|
73 |
+/** |
|
74 |
+ * @brief set current frame |
|
75 |
+ * @param[in] stream stream name |
|
76 |
+ * @param[in] pFrame current frame (NULL for none) |
|
77 |
+ */ |
|
78 |
+void FlexiPix::setFrame(const std::string &stream, stBlinkenFrame *pFrame) |
|
79 |
+{ |
|
80 |
+ displayFrame(pFrame); |
|
81 |
+ (void)stream; // unused |
|
82 |
+} |
|
83 |
+ |
|
84 |
+/// callback when requested time reached |
|
85 |
+void FlexiPix::timeCall() |
|
86 |
+{ |
|
87 |
+ // refresh frame |
|
88 |
+ sendFrame(); |
|
89 |
+} |
|
90 |
+ |
|
91 |
+/// (re-)create FlexiPix display |
|
92 |
+void FlexiPix::createDisplay() |
|
93 |
+{ |
|
94 |
+#ifdef BLINKER_CFG_FLEXIPIX |
|
95 |
+ destroyDisplay(); |
|
96 |
+ |
|
97 |
+ // create a display |
|
98 |
+ m_pDisplay = flp_display_create(m_fileConfig.getPath().c_str(), NULL, NULL); |
|
99 |
+ if (!m_pDisplay) |
|
100 |
+ return; |
|
101 |
+ |
|
102 |
+ // get size of display |
|
103 |
+ flp_display_get_size(m_pDisplay, &m_size.m_width, &m_size.m_height); |
|
104 |
+ |
|
105 |
+ // output current frame |
|
106 |
+ displayFrame(m_fileInStream.getCurFrame()); |
|
107 |
+#endif // #ifdef BLINKER_CFG_FLEXIPIX |
|
108 |
+} |
|
109 |
+ |
|
110 |
+/// destroy FlexiPix display |
|
111 |
+void FlexiPix::destroyDisplay() |
|
112 |
+{ |
|
113 |
+#ifdef BLINKER_CFG_FLEXIPIX |
|
114 |
+ if (m_pDisplay) { |
|
115 |
+ flp_display_free(m_pDisplay); |
|
116 |
+ m_pDisplay = NULL; |
|
117 |
+ } |
|
118 |
+#endif // #ifdef BLINKER_CFG_FLEXIPIX |
|
119 |
+} |
|
120 |
+ |
|
121 |
+/** |
|
122 |
+ * @brief display frame on FlexiPix |
|
123 |
+ * @param[in] pFrame frame to display (or NULL) |
|
124 |
+ */ |
|
125 |
+void FlexiPix::displayFrame(stBlinkenFrame *pFrame) |
|
126 |
+{ |
|
127 |
+#ifdef BLINKER_CFG_FLEXIPIX |
|
128 |
+ char data[65536]; |
|
129 |
+ bool haveData = false; |
|
130 |
+ stBlinkenFrame *pClonedFrame; |
|
131 |
+ |
|
132 |
+ // leave if no display |
|
133 |
+ if (!m_pDisplay) |
|
134 |
+ return; |
|
135 |
+ |
|
136 |
+ // convert frame to needed size and then to MCUF data as FlexiPix library |
|
137 |
+ // can read data section of MCUF packet |
|
138 |
+ |
|
139 |
+ // frame available |
|
140 |
+ if (pFrame) { |
|
141 |
+ // format matches (size matches and 24bit RGB as required by FlexiPix) |
|
142 |
+ if (BlinkenFrameGetWidth(pFrame) == (int)m_size.m_width && |
|
143 |
+ BlinkenFrameGetHeight(pFrame) == (int)m_size.m_height && |
|
144 |
+ BlinkenFrameGetChannels(pFrame) == 3 && |
|
145 |
+ BlinkenFrameGetMaxval(pFrame) == 255) { |
|
146 |
+ // convert to MCUF packet |
|
147 |
+ haveData = BlinkenFrameToNetwork(pFrame, BlinkenProtoMcuf, |
|
148 |
+ data, sizeof(data)) >= 0; |
|
149 |
+ } |
|
150 |
+ // format does not match |
|
151 |
+ else { |
|
152 |
+ // convert format: clone and resize |
|
153 |
+ pClonedFrame = BlinkenFrameClone(pFrame); |
|
154 |
+ if (pClonedFrame) { |
|
155 |
+ BlinkenFrameResize(pClonedFrame, m_size.m_height, |
|
156 |
+ m_size.m_width, 3, 255); |
|
157 |
+ // convert to MCUF packet |
|
158 |
+ haveData = BlinkenFrameToNetwork(pFrame, BlinkenProtoMcuf, |
|
159 |
+ data, sizeof(data)) >= 0; |
|
160 |
+ // free clones frame |
|
161 |
+ BlinkenFrameFree(pClonedFrame); |
|
162 |
+ } |
|
163 |
+ } |
|
164 |
+ } |
|
165 |
+ |
|
166 |
+ // data available -> to FlexiPix display |
|
167 |
+ if (haveData) |
|
168 |
+ flp_display_data(m_pDisplay, (flp_u8_t*)(data + 12), 3, m_size.m_width * 3, |
|
169 |
+ 0, 0, m_size.m_width, m_size.m_height); |
|
170 |
+ // no data available -> clear FlexiPix display |
|
171 |
+ else |
|
172 |
+ flp_display_data_clear(m_pDisplay); |
|
173 |
+ |
|
174 |
+ // send configured frame |
|
175 |
+ sendFrame(); |
|
176 |
+#else // #ifdef BLINKER_CFG_FLEXIPIX |
|
177 |
+ (void)pFrame; |
|
178 |
+#endif // #ifdef BLINKER_CFG_FLEXIPIX else |
|
179 |
+} |
|
180 |
+ |
|
181 |
+/// (re-)send frame to FlexiPix |
|
182 |
+void FlexiPix::sendFrame() |
|
183 |
+{ |
|
184 |
+#ifdef BLINKER_CFG_FLEXIPIX |
|
185 |
+ if (m_pDisplay) { |
|
186 |
+ flp_display_send(m_pDisplay); |
|
187 |
+ m_callMgr.requestTimeCall(this, Time::now() + Time(1)); // for refresh |
|
188 |
+ } |
|
189 |
+#endif // #ifdef BLINKER_CFG_FLEXIPIX |
|
190 |
+} |
|
191 |
+ |
|
192 |
+} // namespace Blinker |
|
193 |
+ |
... | ... |
@@ -0,0 +1,88 @@ |
1 |
+/* Blinker |
|
2 |
+ Copyright 2011 Stefan Schuermans <stefan@blinkenarea.org> |
|
3 |
+ Copyleft GNU public license - http://www.gnu.org/copyleft/gpl.html |
|
4 |
+ a blinkenarea.org project */ |
|
5 |
+ |
|
6 |
+#ifndef BLINKER_FLEXIPIX_H |
|
7 |
+#define BLINKER_FLEXIPIX_H |
|
8 |
+ |
|
9 |
+#include <string> |
|
10 |
+ |
|
11 |
+#include <BlinkenLib/BlinkenFrame.h> |
|
12 |
+ |
|
13 |
+#include "CallMgr.h" |
|
14 |
+#include "Directory.h" |
|
15 |
+#include "File.h" |
|
16 |
+#include "InStreamFile.h" |
|
17 |
+#include "Module.h" |
|
18 |
+#include "Size.h" |
|
19 |
+#include "StreamMgr.h" |
|
20 |
+#include "StreamRecv.h" |
|
21 |
+#include "Time.h" |
|
22 |
+#include "TimeCallee.h" |
|
23 |
+ |
|
24 |
+namespace Blinker { |
|
25 |
+ |
|
26 |
+/// FlexiPix output module |
|
27 |
+class FlexiPix: public Module, public StreamRecv, public TimeCallee |
|
28 |
+{ |
|
29 |
+public: |
|
30 |
+ /** |
|
31 |
+ * @brief constructor |
|
32 |
+ * @param[in] callMgr callback manager |
|
33 |
+ * @param[in] streamMgr stream manager |
|
34 |
+ * @param[in] dirBase base directory |
|
35 |
+ */ |
|
36 |
+ FlexiPix(CallMgr &callMgr, StreamMgr &streamMgr, const Directory &dirBase); |
|
37 |
+ |
|
38 |
+ /// virtual destructor |
|
39 |
+ virtual ~FlexiPix(); |
|
40 |
+ |
|
41 |
+private: |
|
42 |
+ /// copy constructor disabled |
|
43 |
+ FlexiPix(const FlexiPix &that); |
|
44 |
+ |
|
45 |
+ /// assignment operator disabled |
|
46 |
+ const FlexiPix & operator=(const FlexiPix &that); |
|
47 |
+ |
|
48 |
+public: |
|
49 |
+ /// check for update of configuration |
|
50 |
+ virtual void updateConfig(); |
|
51 |
+ |
|
52 |
+ /** |
|
53 |
+ * @brief set current frame |
|
54 |
+ * @param[in] stream stream name |
|
55 |
+ * @param[in] pFrame current frame (NULL for none) |
|
56 |
+ */ |
|
57 |
+ virtual void setFrame(const std::string &stream, stBlinkenFrame *pFrame); |
|
58 |
+ |
|
59 |
+ /// callback when requested time reached |
|
60 |
+ virtual void timeCall(); |
|
61 |
+ |
|
62 |
+protected: |
|
63 |
+ /// (re-)create FlexiPix display |
|
64 |
+ void createDisplay(); |
|
65 |
+ |
|
66 |
+ /// destroy FlexiPix display |
|
67 |
+ void destroyDisplay(); |
|
68 |
+ |
|
69 |
+ /** |
|
70 |
+ * @brief display frame on FlexiPix |
|
71 |
+ * @param[in] pFrame frame to display (or NULL) |
|
72 |
+ */ |
|
73 |
+ void displayFrame(stBlinkenFrame *pFrame); |
|
74 |
+ |
|
75 |
+ /// (re-)send frame to FlexiPix |
|
76 |
+ void sendFrame(); |
|
77 |
+ |
|
78 |
+protected: |
|
79 |
+ InStreamFile m_fileInStream; ///< input stream name file |
|
80 |
+ File m_fileConfig; ///< FlexiPix config file |
|
81 |
+ struct flp_display_s *m_pDisplay; ///< FlexiPix display |
|
82 |
+ Size m_size; ///< size of FlexiPix display |
|
83 |
+}; // class FlexiPix |
|
84 |
+ |
|
85 |
+} // namespace Blinker |
|
86 |
+ |
|
87 |
+#endif // #ifndef BLINKER_FLEXIPIX_H |
|
88 |
+ |
... | ... |
@@ -9,6 +9,7 @@ |
9 | 9 |
#include "CallMgr.h" |
10 | 10 |
#include "Canvas.h" |
11 | 11 |
#include "Directory.h" |
12 |
+#include "FlexiPix.h" |
|
12 | 13 |
#include "ModuleMgr.h" |
13 | 14 |
#include "ModuleMgr_impl.h" |
14 | 15 |
#include "Output.h" |
... | ... |
@@ -31,6 +32,8 @@ void run(const std::string &dirConfig) |
31 | 32 |
|
32 | 33 |
ModuleMgr<Canvas> canvasMgr(callMgr, streamMgr, |
33 | 34 |
dirCfg.getSubdir("canvases")); |
35 |
+ ModuleMgr<FlexiPix> flexipixMgr(callMgr, streamMgr, |
|
36 |
+ dirCfg.getSubdir("flexipixes")); |
|
34 | 37 |
ModuleMgr<Output> outputMgr(callMgr, streamMgr, |
35 | 38 |
dirCfg.getSubdir("outputs")); |
36 | 39 |
ModuleMgr<Player> playerMgr(callMgr, streamMgr, |
... | ... |
@@ -54,7 +57,9 @@ int main(int argc, const char *argv[]) |
54 | 57 |
const char * dirConfig; |
55 | 58 |
|
56 | 59 |
if (argc < 2) { |
57 |
- std::cerr << "usage: " << argv[0] << " config-directory" << std::endl; |
|
60 |
+ std::cerr << "Blinker" << std::endl |
|
61 |
+ << "configuration:"BLINKER_CONFIG << std::endl |
|
62 |
+ << "usage: " << argv[0] << " config-directory" << std::endl; |
|
58 | 63 |
return 2; |
59 | 64 |
} |
60 | 65 |
dirConfig = argv[1]; |
61 | 66 |