f0c104c5056a43dc4a9f4267fd08c8b521d2f660
Stefan Schuermans first version of canvas mod...

Stefan Schuermans authored 12 years ago

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 <list>
7) #include <string>
8) 
9) #include <BlinkenLib/BlinkenFrame.h>
10) 
11) #include "CallMgr.h"
12) #include "Canvas.h"
13) #include "CanvasInput.h"
14) #include "Directory.h"
15) #include "File.h"
16) #include "Format.h"
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

17) #include "FormatFile.h"
Stefan Schuermans first version of canvas mod...

Stefan Schuermans authored 12 years ago

18) #include "Module.h"
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

19) #include "OutStreamFile.h"
Stefan Schuermans first version of canvas mod...

Stefan Schuermans authored 12 years ago

20) #include "StreamMgr.h"
21) #include "StreamRecv.h"
22) 
23) namespace Blinker {
24) 
25) /**
26)  * @brief constructor
27)  * @param[in] callMgr callback manager
28)  * @param[in] streamMgr stream manager
29)  * @param[in] dirBase base directory
30)  */
31) Canvas::Canvas(CallMgr &callMgr, StreamMgr &streamMgr, const Directory &dirBase):
32)   Module(callMgr, streamMgr, dirBase),
33)   m_fileFormat(dirBase.getFile("format")),
34)   m_dirInputs(dirBase.getSubdir("inputs")),
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

35)   m_fileOutStream(dirBase.getFile("outstream"), streamMgr),
Stefan Schuermans first version of canvas mod...

Stefan Schuermans authored 12 years ago

36)   m_pCanvas(NULL),
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

37)   m_canvasHasFrame(false)
Stefan Schuermans first version of canvas mod...

Stefan Schuermans authored 12 years ago

38) {
39)   // set up
40)   createCanvas();
41)   updateInListFull();
42) }
43) 
44) /// virtual destructor
45) Canvas::~Canvas()
46) {
47)   // clean up
48)   while (!m_inList.empty()) {
49)     delete m_inList.back().m_pInput;
50)     m_inList.pop_back();
51)   }
52)   destroyCanvas();
53) }
54) 
55) /// check for update of configuration
56) void Canvas::updateConfig()
57) {
58)   // format file was modified -> re-create canvas
59)   if (m_fileFormat.checkModified()) {
60)     createCanvas();
61)   }
62) 
63)   // input list update (directory modified -> full, otherwise -> light)
64)   if (m_dirInputs.checkModified())
65)     updateInListFull();
66)   else
67)     updateInListLight();
68) 
69)   // output stream name file was modified -> re-get output stream
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

70)   if (m_fileOutStream.checkModified())
71)     m_fileOutStream.update();
Stefan Schuermans first version of canvas mod...

Stefan Schuermans authored 12 years ago

72) }
73) 
74) /// (re-)create canvas
75) void Canvas::createCanvas()
76) {
77)   // get rid of old canvas
78)   destroyCanvas();
79) 
80)   // read format from format file
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

81)   m_fileFormat.update();
82)   if (!m_fileFormat.m_valid)
Stefan Schuermans first version of canvas mod...

Stefan Schuermans authored 12 years ago

83)     return;
84) 
85)   // create frame
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

86)   m_pCanvas = BlinkenFrameNew(m_fileFormat.m_obj.m_height,
87)                               m_fileFormat.m_obj.m_width,
88)                               m_fileFormat.m_obj.m_channels,
89)                               m_fileFormat.m_obj.m_maxval, 1);
Stefan Schuermans merged frame processing wit...

Stefan Schuermans authored 12 years ago

90)   m_canvasHasFrame = false;
Stefan Schuermans first version of canvas mod...

Stefan Schuermans authored 12 years ago

91) }
92) 
93) /// tear down canvas
94) void Canvas::destroyCanvas()
95) {
96)   if (m_pCanvas) {
97)     BlinkenFrameFree(m_pCanvas);
98)     m_pCanvas = NULL;
Stefan Schuermans merged frame processing wit...

Stefan Schuermans authored 12 years ago

99)     m_canvasHasFrame = false;
Stefan Schuermans first version of canvas mod...

Stefan Schuermans authored 12 years ago

100)   }
101) }
102) 
103) /// light update of input list, i.e. check all entries in current input list
104) void Canvas::updateInListLight()
105) {
106)   // walk through all inputs in input list and check for modification
107)   InList::iterator itIn;
108)   for (itIn = m_inList.begin(); itIn != m_inList.end(); ++itIn)
109)     itIn->m_pInput->updateConfig();
110) }
111) 
112) /// full update of input list, i.e. scan subdirs in input list directory
113) void Canvas::updateInListFull()
114) {
115)   // get list of subdirs in input directory
116)   typedef std::list<std::string> Subdirlist;
117)   Subdirlist curSubdirs;
118)   m_dirInputs.getEntries(Directory::TypeSubdir, curSubdirs);
119) 
120)   // walk through current input list and subdir list simultaneously
121)   Subdirlist::const_iterator itSubdir = curSubdirs.begin();
122)   InList::iterator           itIn     = m_inList.begin();
123)   while (itSubdir != curSubdirs.end() || itIn != m_inList.end()) {
124) 
125)     // new input inserted
126)     if (itIn == m_inList.end() ||
127)         (itSubdir != curSubdirs.end() && *itSubdir < itIn->m_name)) {
128)       // create input object
129)       InEntry inEntry(*itSubdir);
130)       inEntry.m_pInput = new Input(*this, m_dirInputs.getSubdir(*itSubdir));
131)       if (inEntry.m_pInput)
132)         // insert input list entry
133)         m_inList.insert(itIn, inEntry);
134)       // advance to next subdir
135)       ++itSubdir;
136)     }
137) 
138)     // input removed
139)     else if (itSubdir == curSubdirs.end() || *itSubdir > itIn->m_name) {
140)       // remove input
141)       delete itIn->m_pInput;
142)       itIn = m_inList.erase(itIn);
143)       // do not advance to next subdir
144)     }
145) 
146)     // input stayed in input list
147)     else {
148)       // check for update
149)       itIn->m_pInput->updateConfig();
150)       // advance to next file and next entry
151)       ++itSubdir;
152)       ++itIn;
153)     }
154) 
Stefan Schuermans minor typos in comment

Stefan Schuermans authored 12 years ago

155)   } // while itSubdir itIn
Stefan Schuermans first version of canvas mod...

Stefan Schuermans authored 12 years ago

156) }
157) 
158) /// notfication to redraw (called by inputs)
159) void Canvas::redraw()
160) {
161)   // do nothing if there is no canvas
162)   if (!m_pCanvas)
163)     return;
164) 
165)   // black background
166)   BlinkenFrameClear(m_pCanvas);
167)   m_canvasHasFrame = false; // no frame on canvas yet
168) 
169)   // tell all inputs to draw on canvas
170)   InList::iterator itIn;
171)   for (itIn = m_inList.begin(); itIn != m_inList.end(); ++itIn)
172)     if (itIn->m_pInput->draw())
173)       m_canvasHasFrame = true; // drawing successful -> there is a frame now
174) 
175)   // send current frame to stream
176)   sendFrame();
177) }
178) 
179) /// send current frame to output stream
180) void Canvas::sendFrame()
181) {
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

182)   // frame available -> send it
183)   if (m_canvasHasFrame)
184)     m_fileOutStream.setFrame(m_pCanvas);
185)   // no frame available -> send this information
186)   else
187)     m_fileOutStream.setFrame(NULL);