f87ca9819b41e4c91cd3f8597d76cf0f065bb9f0
Stefan Schuermans 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) 
Stefan Schuermans minor typos in comment

Stefan Schuermans authored 12 years ago

121)   } // while itSubdir itIn
Stefan Schuermans 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)
Stefan Schuermans merged frame processing wit...

Stefan Schuermans authored 12 years ago

142)     m_pOutStream->setFrame(NULL);
Stefan Schuermans 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
Stefan Schuermans merged frame processing wit...

Stefan Schuermans authored 12 years ago

182)   frame(NULL);
Stefan Schuermans 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
Stefan Schuermans merged frame processing wit...

Stefan Schuermans authored 12 years ago

196)     frame(NULL);
Stefan Schuermans implemented priority based...

Stefan Schuermans authored 12 years ago

197) }
198) 
199) /**
200)  * @brief set current frame (also called by inputs)
Stefan Schuermans merged frame processing wit...

Stefan Schuermans authored 12 years ago

201)  * @param[in] pFrame new frame to use (NULL for none)