3534d9ac8f9b2b25d33aa6854358ceff94f8a511
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
Stefan Schuermans simplified interface of get...

Stefan Schuermans authored 12 years ago

68)  * @return current frame (NULL if none)
Stefan Schuermans implemented priority based...

Stefan Schuermans authored 12 years ago

69)  */
Stefan Schuermans simplified interface of get...

Stefan Schuermans authored 12 years ago

70) stBlinkenFrame * Priority::Input::getCurFrame()
Stefan Schuermans implemented priority based...

Stefan Schuermans authored 12 years ago

71) {
Stefan Schuermans simplified interface of get...

Stefan Schuermans authored 12 years ago

72)   return m_pFrame;
Stefan Schuermans implemented priority based...

Stefan Schuermans authored 12 years ago

73) }
74) 
75) /// get input stream and attach to it
76) void Priority::Input::getInStream()
77) {
78)   // get input stream
79)   m_fileInStream.getStr(m_nameInStream);
80)   m_pInStream = &m_priority.m_streamMgr.refStream(m_nameInStream);
81) 
82)   // attach to input stream
83)   if (m_pInStream)
84)     m_pInStream->attach(this);
85) 
86)   // processing of frame will happen automatically when stream sets frame
87) }
88) 
89) /// detach from input stream and release it
90) void Priority::Input::releaseInStream()
91) {
92)   // set current frame to none
Stefan Schuermans merged frame processing wit...

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

115) 
Stefan Schuermans merged frame processing wit...

Stefan Schuermans authored 12 years ago

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