b6b2996b76e1b0f0e403b4be40430a445bc0873c
Stefan Schuermans added flexipix output suppo...

Stefan Schuermans authored 12 years ago

1) /* Blinker
Stefan Schuermans update copyright years

Stefan Schuermans authored 10 years ago

2)    Copyright 2011-2014 Stefan Schuermans <stefan@blinkenarea.org>
Stefan Schuermans added flexipix output suppo...

Stefan Schuermans authored 12 years ago

3)    Copyleft GNU public license - http://www.gnu.org/copyleft/gpl.html
4)    a blinkenarea.org project */
5) 
6) #include <iostream>
7) #include <stdlib.h>
8) #include <string>
9) #include <string.h>
10) 
11) #include <BlinkenLib/BlinkenFrame.h>
12) #include <BlinkenLib/BlinkenProto.h>
13) 
14) #ifdef BLINKER_CFG_FLEXIPIX
15) extern "C" {
16) #include <flexipix/flexipix.h>
17) } // extern "C"
18) #endif // #ifdef BLINKER_CFG_FLEIXPIX
19) 
20) #include "Directory.h"
21) #include "File.h"
22) #include "FlexiPix.h"
23) #include "InStreamFile.h"
Stefan Schuermans put all managers in one str...

Stefan Schuermans authored 12 years ago

24) #include "Mgrs.h"
Stefan Schuermans added flexipix output suppo...

Stefan Schuermans authored 12 years ago

25) #include "Module.h"
26) #include "Size.h"
27) #include "StreamRecv.h"
28) #include "Time.h"
29) #include "TimeCallee.h"
30) 
31) namespace Blinker {
32) 
33) /**
34)  * @brief constructor
Stefan Schuermans make modules know their name

Stefan Schuermans authored 12 years ago

35)  * @param[in] name module name
Stefan Schuermans put all managers in one str...

Stefan Schuermans authored 12 years ago

36)  * @param[in] mgrs managers
Stefan Schuermans added flexipix output suppo...

Stefan Schuermans authored 12 years ago

37)  * @param[in] dirBase base directory
38)  */
Stefan Schuermans make modules know their name

Stefan Schuermans authored 12 years ago

39) FlexiPix::FlexiPix(const std::string &name, Mgrs &mgrs,
Stefan Schuermans added flexipix output suppo...

Stefan Schuermans authored 12 years ago

40)                  const Directory &dirBase):
Stefan Schuermans make modules know their name

Stefan Schuermans authored 12 years ago

41)   Module(name, mgrs, dirBase),
Stefan Schuermans put all managers in one str...

Stefan Schuermans authored 12 years ago

42)   m_fileInStream(dirBase.getFile("instream"), mgrs.m_streamMgr),
Stefan Schuermans added flexipix output suppo...

Stefan Schuermans authored 12 years ago

43)   m_fileConfig(dirBase.getFile("flexipix.flp")),
44)   m_pDisplay(NULL)
45) {
46)   // set up
47)   m_fileInStream.setStreamRecv(this);
48)   createDisplay();
49) }
50) 
51) /// virtual destructor
52) FlexiPix::~FlexiPix()
53) {
54)   // clean up
55)   destroyDisplay();
56)   m_fileInStream.setStreamRecv(NULL);
Stefan Schuermans put all managers in one str...

Stefan Schuermans authored 12 years ago

57)   m_mgrs.m_callMgr.cancelTimeCall(this);
Stefan Schuermans added flexipix output suppo...

Stefan Schuermans authored 12 years ago

58) }
59) 
60) /// check for update of configuration
61) void FlexiPix::updateConfig()
62) {
63)   // input stream name file was modified -> re-get input stream
64)   if (m_fileInStream.checkModified())
65)     m_fileInStream.update();
66) 
67)   // FlexiPix config file was modified -> re-create display
68)   if (m_fileConfig.checkModified())
69)     createDisplay();
70) }
71) 
72) /**
73)  * @brief set current frame
74)  * @param[in] stream stream name
75)  * @param[in] pFrame current frame (NULL for none)
76)  */
77) void FlexiPix::setFrame(const std::string &stream, stBlinkenFrame *pFrame)
78) {
79)   displayFrame(pFrame);
80)   (void)stream; // unused
81) }
82) 
83) /// callback when requested time reached
84) void FlexiPix::timeCall()
85) {
86)   // refresh frame
87)   sendFrame();
88) }
89) 
90) /// (re-)create FlexiPix display
91) void FlexiPix::createDisplay()
92) {
93) #ifdef BLINKER_CFG_FLEXIPIX
94)   destroyDisplay();
95) 
96)   // create a display
97)   m_pDisplay = flp_display_create(m_fileConfig.getPath().c_str(), NULL, NULL);
98)   if (!m_pDisplay)
99)     return;
100) 
101)   // get size of display
102)   flp_display_get_size(m_pDisplay, &m_size.m_width, &m_size.m_height);
103) 
104)   // output current frame
105)   displayFrame(m_fileInStream.getCurFrame());
106) #endif // #ifdef BLINKER_CFG_FLEXIPIX
107) }
108) 
109) /// destroy FlexiPix display
110) void FlexiPix::destroyDisplay()
111) {
112) #ifdef BLINKER_CFG_FLEXIPIX
113)   if (m_pDisplay) {
114)     flp_display_free(m_pDisplay);
115)     m_pDisplay = NULL;
116)   }
117) #endif // #ifdef BLINKER_CFG_FLEXIPIX
118) }
119) 
120) /**
121)  * @brief display frame on FlexiPix
122)  * @param[in] pFrame frame to display (or NULL)
123)  */
124) void FlexiPix::displayFrame(stBlinkenFrame *pFrame)
125) {
126) #ifdef BLINKER_CFG_FLEXIPIX
127)   char data[65536];
128)   bool haveData = false;
129)   stBlinkenFrame *pClonedFrame;
130) 
131)   // leave if no display
132)   if (!m_pDisplay)
133)     return;
134) 
135)   // convert frame to needed size and then to MCUF data as FlexiPix library
136)   // can read data section of MCUF packet
137) 
138)   // frame available
139)   if (pFrame) {
140)     // format matches (size matches and 24bit RGB as required by FlexiPix)
141)     if (BlinkenFrameGetWidth(pFrame) == (int)m_size.m_width &&
142)         BlinkenFrameGetHeight(pFrame) == (int)m_size.m_height &&
143)         BlinkenFrameGetChannels(pFrame) == 3 &&
144)         BlinkenFrameGetMaxval(pFrame) == 255) {
145)       // convert to MCUF packet
146)       haveData = BlinkenFrameToNetwork(pFrame, BlinkenProtoMcuf,
147)                                        data, sizeof(data)) >= 0;
148)     }
149)     // format does not match
150)     else {
151)       // convert format: clone and resize
152)       pClonedFrame = BlinkenFrameClone(pFrame);
153)       if (pClonedFrame) {
154)         BlinkenFrameResize(pClonedFrame, m_size.m_height,
155)                            m_size.m_width, 3, 255);
156)         // convert to MCUF packet
157)         haveData = BlinkenFrameToNetwork(pFrame, BlinkenProtoMcuf,
158)                                          data, sizeof(data)) >= 0;
159)         // free clones frame
160)         BlinkenFrameFree(pClonedFrame);
161)       }
162)     }
163)   }
164) 
165)   // data available -> to FlexiPix display
166)   if (haveData)
167)     flp_display_data(m_pDisplay, (flp_u8_t*)(data + 12), 3, m_size.m_width * 3,
168)                      0, 0, m_size.m_width, m_size.m_height);
169)   // no data available -> clear FlexiPix display
170)   else
171)     flp_display_data_clear(m_pDisplay);
172) 
173)   // send configured frame
174)   sendFrame();
175) #else // #ifdef BLINKER_CFG_FLEXIPIX
176)   (void)pFrame;
177) #endif // #ifdef BLINKER_CFG_FLEXIPIX else
178) }
179) 
180) /// (re-)send frame to FlexiPix
181) void FlexiPix::sendFrame()
182) {
183) #ifdef BLINKER_CFG_FLEXIPIX
184)   if (m_pDisplay) {
185)     flp_display_send(m_pDisplay);
Stefan Schuermans make modules know their name

Stefan Schuermans authored 12 years ago

186)     m_mgrs.m_callMgr.requestTimeCall(this, Time::now() + Time(1)); // refresh