implemented priority based...
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 "Directory.h"
13) #include "File.h"
14) #include "Module.h"
15) #include "Priority.h"
16) #include "PriorityInput.h"
17) #include "SettingFile.h"
18) #include "StreamMgr.h"
19) #include "StreamRecv.h"
20)
21) namespace Blinker {
22)
23) /**
24) * @brief constructor
25) * @param[in] callMgr callback manager
26) * @param[in] streamMgr stream manager
27) * @param[in] dirBase base directory
28) */
29) Priority::Priority(CallMgr &callMgr, StreamMgr &streamMgr, const Directory &dirBase):
30) Module(callMgr, streamMgr, dirBase),
31) m_dirInputs(dirBase.getSubdir("inputs")),
32) m_fileOutStream(dirBase.getFile("outstream")),
33) m_itCurIn(m_inList.rend()),
34) m_pOutStream(NULL)
35) {
36) // set up
37) updateInListFull();
38) getOutStream();
39) }
40)
41) /// virtual destructor
42) Priority::~Priority()
43) {
44) // clean up
45) releaseOutStream();
46) while (!m_inList.empty()) {
47) delete m_inList.back().m_pInput;
48) m_inList.pop_back();
49) }
50) }
51)
52) /// check for update of configuration
53) void Priority::updateConfig()
54) {
55) // input list update (directory modified -> full, otherwise -> light)
56) if (m_dirInputs.checkModified())
57) updateInListFull();
58) else
59) updateInListLight();
60)
61) // output stream name file was modified -> re-get output stream
62) if (m_fileOutStream.checkModified()) {
63) releaseOutStream();
64) getOutStream();
65) }
66) }
67)
68) /// light update of input list, i.e. check all entries in current input list
69) void Priority::updateInListLight()
70) {
71) // walk through all inputs in input list and check for modification
72) InList::iterator itIn;
73) for (itIn = m_inList.begin(); itIn != m_inList.end(); ++itIn)
74) itIn->m_pInput->updateConfig();
75) }
76)
77) /// full update of input list, i.e. scan subdirs in input list directory
78) void Priority::updateInListFull()
79) {
80) // get list of subdirs in input directory
81) typedef std::list<std::string> Subdirlist;
82) Subdirlist curSubdirs;
83) m_dirInputs.getEntries(Directory::TypeSubdir, curSubdirs);
84)
85) // walk through current input list and subdir list simultaneously
86) Subdirlist::const_iterator itSubdir = curSubdirs.begin();
87) InList::iterator itIn = m_inList.begin();
88) while (itSubdir != curSubdirs.end() || itIn != m_inList.end()) {
89)
90) // new input inserted
91) if (itIn == m_inList.end() ||
92) (itSubdir != curSubdirs.end() && *itSubdir < itIn->m_name)) {
93) // create input object
94) InEntry inEntry(*itSubdir);
95) inEntry.m_pInput = new Input(*this, *itSubdir,
96) m_dirInputs.getSubdir(*itSubdir));
97) if (inEntry.m_pInput)
98) // insert input list entry
99) m_inList.insert(itIn, inEntry);
100) // advance to next subdir
101) ++itSubdir;
102) }
103)
104) // input removed
105) else if (itSubdir == curSubdirs.end() || *itSubdir > itIn->m_name) {
106) // remove input
107) delete itIn->m_pInput;
108) itIn = m_inList.erase(itIn);
109) // do not advance to next subdir
110) }
111)
112) // input stayed in input list
113) else {
114) // check for update
115) itIn->m_pInput->updateConfig();
116) // advance to next file and next entry
117) ++itSubdir;
118) ++itIn;
119) }
120)
|
minor typos in comment
Stefan Schuermans authored 12 years ago
|
121) } // while itSubdir itIn
|
implemented priority based...
Stefan Schuermans authored 12 years ago
|
122) }
123)
124) /// get output stream
125) void Priority::getOutStream()
126) {
127) // get name of output stream
128) m_fileOutStream.getStr(m_nameOutStream);
129)
130) // get output stream
131) m_pOutStream = &m_streamMgr.refStream(m_nameOutStream);
132)
133) // send current frame to stream
134) curFrame();
135) }
136)
137) /// release output stream
138) void Priority::releaseOutStream()
139) {
140) // send no frame information
141) if (m_pOutStream)
|
merged frame processing wit...
Stefan Schuermans authored 12 years ago
|
142) m_pOutStream->setFrame(NULL);
|
implemented priority based...
Stefan Schuermans authored 12 years ago
|
143)
144) // unreference output stream
145) m_pOutStream = NULL;
146) m_streamMgr.unrefStream(m_nameOutStream);
147) }
148)
149) /**
150) * @brief select specific input (called by inputs)
151) * @param[in] input input to select
152) */
153) void Priority::select(const Input *pInput)
154) {
155) // search inputs for passed input
156) m_itCurIn = m_inList.rbegin();
157) while (m_itCurIn != m_inList.rend() && m_itCurIn->m_pInput != pInput)
158) ++m_itCurIn;
159)
160) // send current frame
161) curFrame();
162) }
163)
164) /// select lower priority input (called by inputs)
165) void Priority::selectLower()
166) {
167) stBlinkenFrame *pFrame;
168)
169) // search inputs with lower priority until a frame is found
170) while (m_itCurIn != m_inList.rend()) {
171) // check for frame
172) if (m_itCurIn->m_pInput->getCurFrame(pFrame)) {
173) // frame found -> keep this input as current, send frame
174) frame(pFrame);
175) return;
176) }
177) // try next input
178) ++m_itCurIn;
179) }
180)
181) // no input has got a frame -> send no frame
|
merged frame processing wit...
Stefan Schuermans authored 12 years ago
|
182) frame(NULL);
|
implemented priority based...
Stefan Schuermans authored 12 years ago
|
183) }
184)
185) /// send current frame to output stream
186) void Priority::curFrame()
187) {
188) stBlinkenFrame *pFrame;
189)
190) // current input available and frame it it available -> send frame
191) if (m_itCurIn != m_inList.rend() &&
192) m_itCurIn->m_pInput->getCurFrame(pFrame))
193) frame(pFrame);
194) // no frame available -> send this information
195) else
|
merged frame processing wit...
Stefan Schuermans authored 12 years ago
|
196) frame(NULL);
|
implemented priority based...
Stefan Schuermans authored 12 years ago
|
197) }
198)
199) /**
200) * @brief set current frame (also called by inputs)
|
merged frame processing wit...
Stefan Schuermans authored 12 years ago
|
201) * @param[in] pFrame new frame to use (NULL for none)
|