f0c104c5056a43dc4a9f4267fd08c8b521d2f660
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"
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

17) #include "OutStreamFile.h"
Stefan Schuermans implemented priority based...

Stefan Schuermans authored 12 years ago

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)  */
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

29) Priority::Priority(CallMgr &callMgr, StreamMgr &streamMgr,
30)                    const Directory &dirBase):
Stefan Schuermans implemented priority based...

Stefan Schuermans authored 12 years ago

31)   Module(callMgr, streamMgr, dirBase),
32)   m_dirInputs(dirBase.getSubdir("inputs")),
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

33)   m_fileOutStream(dirBase.getFile("outstream"), streamMgr),
34)   m_itCurIn(m_inList.rend())
Stefan Schuermans implemented priority based...

Stefan Schuermans authored 12 years ago

35) {
36)   // set up
37)   updateInListFull();
38) }
39) 
40) /// virtual destructor
41) Priority::~Priority()
42) {
43)   // clean up
44)   while (!m_inList.empty()) {
45)     delete m_inList.back().m_pInput;
46)     m_inList.pop_back();
47)   }
48) }
49) 
50) /// check for update of configuration
51) void Priority::updateConfig()
52) {
53)   // input list update (directory modified -> full, otherwise -> light)
54)   if (m_dirInputs.checkModified())
55)     updateInListFull();
56)   else
57)     updateInListLight();
58) 
59)   // output stream name file was modified -> re-get output stream
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

60)   if (m_fileOutStream.checkModified())
61)     m_fileOutStream.update();
Stefan Schuermans implemented priority based...

Stefan Schuermans authored 12 years ago

62) }
63) 
64) /// light update of input list, i.e. check all entries in current input list
65) void Priority::updateInListLight()
66) {
67)   // walk through all inputs in input list and check for modification
68)   InList::iterator itIn;
69)   for (itIn = m_inList.begin(); itIn != m_inList.end(); ++itIn)
70)     itIn->m_pInput->updateConfig();
71) }
72) 
73) /// full update of input list, i.e. scan subdirs in input list directory
74) void Priority::updateInListFull()
75) {
76)   // get list of subdirs in input directory
77)   typedef std::list<std::string> Subdirlist;
78)   Subdirlist curSubdirs;
79)   m_dirInputs.getEntries(Directory::TypeSubdir, curSubdirs);
80) 
81)   // walk through current input list and subdir list simultaneously
82)   Subdirlist::const_iterator itSubdir = curSubdirs.begin();
83)   InList::iterator           itIn     = m_inList.begin();
84)   while (itSubdir != curSubdirs.end() || itIn != m_inList.end()) {
85) 
86)     // new input inserted
87)     if (itIn == m_inList.end() ||
88)         (itSubdir != curSubdirs.end() && *itSubdir < itIn->m_name)) {
89)       // create input object
90)       InEntry inEntry(*itSubdir);
91)       inEntry.m_pInput = new Input(*this, *itSubdir,
92)                                    m_dirInputs.getSubdir(*itSubdir));
93)       if (inEntry.m_pInput)
94)         // insert input list entry
95)         m_inList.insert(itIn, inEntry);
96)       // advance to next subdir
97)       ++itSubdir;
98)     }
99) 
100)     // input removed
101)     else if (itSubdir == curSubdirs.end() || *itSubdir > itIn->m_name) {
102)       // remove input
103)       delete itIn->m_pInput;
104)       itIn = m_inList.erase(itIn);
105)       // do not advance to next subdir
106)     }
107) 
108)     // input stayed in input list
109)     else {
110)       // check for update
111)       itIn->m_pInput->updateConfig();
112)       // advance to next file and next entry
113)       ++itSubdir;
114)       ++itIn;
115)     }
116) 
Stefan Schuermans minor typos in comment

Stefan Schuermans authored 12 years ago

117)   } // while itSubdir itIn
Stefan Schuermans implemented priority based...

Stefan Schuermans authored 12 years ago

118) }
119) 
120) /**
121)  * @brief select specific input (called by inputs)
122)  * @param[in] input input to select
123)  */
124) void Priority::select(const Input *pInput)
125) {
126)   // search inputs for passed input
127)   m_itCurIn = m_inList.rbegin();
128)   while (m_itCurIn != m_inList.rend() && m_itCurIn->m_pInput != pInput)
129)     ++m_itCurIn;
130) 
131)   // send current frame
132)   curFrame();
133) }
134) 
135) /// select lower priority input (called by inputs)
136) void Priority::selectLower()
137) {
138)   stBlinkenFrame *pFrame;
139) 
140)   // search inputs with lower priority until a frame is found
141)   while (m_itCurIn != m_inList.rend()) {
142)     // check for frame
Stefan Schuermans simplified interface of get...

Stefan Schuermans authored 12 years ago

143)     if ((pFrame = m_itCurIn->m_pInput->getCurFrame())) {
Stefan Schuermans implemented priority based...

Stefan Schuermans authored 12 years ago

144)       // frame found -> keep this input as current, send frame
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

145)       m_fileOutStream.setFrame(pFrame);
Stefan Schuermans implemented priority based...

Stefan Schuermans authored 12 years ago

146)       return;
147)     }
148)     // try next input
149)     ++m_itCurIn;
150)   }
151) 
152)   // no input has got a frame -> send no frame
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

153)   m_fileOutStream.setFrame(NULL);
Stefan Schuermans implemented priority based...

Stefan Schuermans authored 12 years ago

154) }
155) 
156) /// send current frame to output stream
157) void Priority::curFrame()
158) {
159)   stBlinkenFrame *pFrame;
160) 
161)   // current input available and frame it it available -> send frame
162)   if (m_itCurIn != m_inList.rend() &&
Stefan Schuermans simplified interface of get...

Stefan Schuermans authored 12 years ago

163)       (pFrame = m_itCurIn->m_pInput->getCurFrame()))
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

164)     m_fileOutStream.setFrame(pFrame);
Stefan Schuermans implemented priority based...

Stefan Schuermans authored 12 years ago

165)   // no frame available -> send this information
166)   else
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

167)     m_fileOutStream.setFrame(NULL);