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 <string>
7) 
8) #include <BlinkenLib/BlinkenFrame.h>
9) 
10) #include "Directory.h"
11) #include "File.h"
12) #include "Priority.h"
13) #include "PriorityInput.h"
14) #include "SettingFile.h"
15) #include "StreamMgr.h"
16) #include "StreamRecv.h"
17) 
18) namespace Blinker {
19) 
20) /**
21)  * @brief constructor
22)  * @param[in] priority owning priority based selector
23)  * @param[in] name name of input (i.e. priority)
24)  * @param[in] dirBase base directory
25)  */
26) Priority::Input::Input(Priority &priority, const std::string &name,
27)                        const Directory &dirBase):
28)   m_priority(priority),
29)   m_name(name),
30)   m_fileInStream(dirBase.getFile("instream")),
31)   m_pInStream(NULL),
32)   m_pFrame(NULL)
33) {
34)   // attach to input stream
35)   getInStream();
36) }
37) 
38) /// virtual destructor
39) Priority::Input::~Input()
40) {
41)   // detach from input stream and release it
42)   releaseInStream();
43) }
44) 
45) /// check for update of configuration
46) void Priority::Input::updateConfig()
47) {
48)   // input stream name file was modified -> re-get input stream
49)   if (m_fileInStream.checkModified()) {
50)     releaseInStream();
51)     getInStream();
52)   }
53) }
54) 
55) /**
56)  * @brief set current frame
57)  * @param[in] stream stream name
Stefan Schuermans merged frame processing wit...

Stefan Schuermans authored 12 years ago

58)  * @param[in] pFrame current frame (NULL for none)
Stefan Schuermans implemented priority based...

Stefan Schuermans authored 12 years ago

59)  */
60) void Priority::Input::setFrame(const std::string &stream, stBlinkenFrame *pFrame)
61) {
62)   frame(pFrame);
63)   (void)stream; // unused
64) }
65) 
66) /**
67)  * @brief get current frame
68)  * @param[out] pFrame current frame
69)  * @return if a current frame exists
70)  */
71) bool Priority::Input::getCurFrame(stBlinkenFrame *&pFrame)
72) {
73)   pFrame = m_pFrame;
74)   return pFrame;
75) }
76) 
77) /// get input stream and attach to it
78) void Priority::Input::getInStream()
79) {
80)   // get input stream
81)   m_fileInStream.getStr(m_nameInStream);
82)   m_pInStream = &m_priority.m_streamMgr.refStream(m_nameInStream);
83) 
84)   // attach to input stream
85)   if (m_pInStream)
86)     m_pInStream->attach(this);
87) 
88)   // processing of frame will happen automatically when stream sets frame
89) }
90) 
91) /// detach from input stream and release it
92) void Priority::Input::releaseInStream()
93) {
94)   // set current frame to none
Stefan Schuermans merged frame processing wit...

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

96) 
97)   // detach from input stream
98)   if (m_pInStream)
99)     m_pInStream->detach(this);
100) 
101)   // unreference stream
102)   m_pInStream = NULL;
103)   m_priority.m_streamMgr.unrefStream(m_nameInStream);
104) }
105) 
106) /**
107)  * @brief set current frame
Stefan Schuermans merged frame processing wit...

Stefan Schuermans authored 12 years ago

108)  * @param[in] pFrame current frame (NULL for none)
Stefan Schuermans implemented priority based...

Stefan Schuermans authored 12 years ago

109)  */
110) void Priority::Input::frame(stBlinkenFrame *pFrame)
111) {
112)   // save new frame
113)   m_pFrame = pFrame;
114) 
Stefan Schuermans merged frame processing wit...

Stefan Schuermans authored 12 years ago

115)   // there is a frame now
116)   if (pFrame) {
Stefan Schuermans implemented priority based...

Stefan Schuermans authored 12 years ago

117) 
Stefan Schuermans merged frame processing wit...

Stefan Schuermans authored 12 years ago

118)     // if we are current input
119)     if (m_priority.m_itCurIn != m_priority.m_inList.rend() &&
120)         m_priority.m_itCurIn->m_pInput == this)
121)       // pass on frame
122)       m_priority.frame(pFrame);
123) 
124)     // we have a higher priority than current input
125)     if (m_priority.m_itCurIn == m_priority.m_inList.rend() ||
126)         m_priority.m_itCurIn->m_name < m_name)
127)       // tell priority based selector to select us as input
128)       m_priority.select(this);
129) 
130)   }
131)   // there is no frame
132)   else {
133) 
134)     // if we are current input
135)     if (m_priority.m_itCurIn != m_priority.m_inList.rend() &&
136)         m_priority.m_itCurIn->m_pInput == this)
137)       // tell priority based selector to select lower priority input
138)       m_priority.selectLower();
139) 
140)   }