69ac12fcb8ee5ac55fadc04d3a96a3a7c2d0038a
Stefan Schuermans sender static destination n...

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) 
Stefan Schuermans namespace for preprocessor...

Stefan Schuermans authored 12 years ago

6) #ifndef BLINKER_SENDER_IMPL_H
7) #define BLINKER_SENDER_IMPL_H
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

8) 
9) #include <list>
10) #include <map>
11) #include <string>
12) 
13) #include <BlinkenLib/BlinkenProto.h>
14) #include <BlinkenLib/BlinkenFrame.h>
15) 
16) #include "Directory.h"
17) #include "File.h"
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

18) #include "InStreamFile.h"
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

19) #include "IoCallee.h"
Stefan Schuermans converted sender to use lis...

Stefan Schuermans authored 12 years ago

20) #include "ListTracker.h"
21) #include "ListTracker_impl.h"
Stefan Schuermans put all managers in one str...

Stefan Schuermans authored 12 years ago

22) #include "Mgrs.h"
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

23) #include "Module.h"
Stefan Schuermans simplified sender module a...

Stefan Schuermans authored 12 years ago

24) #include "Protocol.h"
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

25) #include "ProtocolFile.h"
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

26) #include "Sender.h"
27) #include "SenderDest.h"
28) #include "SenderDest_impl.h"
29) #include "SettingFile.h"
30) #include "StreamRecv.h"
31) #include "Time.h"
32) #include "TimeCallee.h"
33) 
34) namespace Blinker {
35) 
36) /**
37)  * @brief constructor
Stefan Schuermans make modules know their name

Stefan Schuermans authored 12 years ago

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

Stefan Schuermans authored 12 years ago

39)  * @param[in] mgrs managers
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

40)  * @param[in] dirBase base directory
41)  */
42) template<typename ADDR, typename SOCK>
Stefan Schuermans make modules know their name

Stefan Schuermans authored 12 years ago

43) Sender<ADDR, SOCK>::Sender(const std::string &name, Mgrs &mgrs,
44)                            const Directory &dirBase):
45)   Module(name, mgrs, dirBase),
Stefan Schuermans put all managers in one str...

Stefan Schuermans authored 12 years ago

46)   m_fileInStream(dirBase.getFile("instream"), mgrs.m_streamMgr),
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

47)   m_fileBind(dirBase.getFile("bind")),
Stefan Schuermans simplified sender module a...

Stefan Schuermans authored 12 years ago

48)   m_fileProtocol(dirBase.getFile("protocol")),
Stefan Schuermans converted sender to use lis...

Stefan Schuermans authored 12 years ago

49)   m_pSock(NULL),
50)   m_destListTracker(*this, dirBase.getSubdir("destinations"))
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

51) {
Stefan Schuermans simplified sender module a...

Stefan Schuermans authored 12 years ago

52)   // read protocol
53)   readProto();
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

54) 
Stefan Schuermans typos

Stefan Schuermans authored 12 years ago

55)   // attach to input stream
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

56)   m_fileInStream.setStreamRecv(this);
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

57)   // create and bind socket
58)   createSock();
59) 
60)   // load static destinations
Stefan Schuermans converted sender to use lis...

Stefan Schuermans authored 12 years ago

61)   m_destListTracker.init();
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

62) }
63) 
64) /// virtual destructor
65) template<typename ADDR, typename SOCK>
66) Sender<ADDR, SOCK>::~Sender()
67) {
68)   // send "no frame" to all destinations
69)   sendAllNoFrame();
70) 
Stefan Schuermans converted sender to use lis...

Stefan Schuermans authored 12 years ago

71)   // free static destinations
72)   m_destListTracker.clear();
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

73) 
74)   // destroy socket
75)   destroySock();
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

76)   // detach from input stream
77)   m_fileInStream.setStreamRecv(NULL);
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

78)   // cancel time callback
Stefan Schuermans put all managers in one str...

Stefan Schuermans authored 12 years ago

79)   m_mgrs.m_callMgr.cancelTimeCall(this);
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

80) }
81) 
82) /// check for update of configuration
83) template<typename ADDR, typename SOCK>
84) void Sender<ADDR, SOCK>::updateConfig()
85) {
86)   // input stream name file was modified -> re-get input stream
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

87)   if (m_fileInStream.checkModified())
88)     m_fileInStream.update();
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

89) 
90)   // bind address file was modified -> re-create socket
91)   if (m_fileBind.checkModified()) {
92)     destroySock();
93)     createSock();
94)   }
95) 
Stefan Schuermans simplified sender module a...

Stefan Schuermans authored 12 years ago

96)   // protocol file was modified -> re-read protocol
97)   if (m_fileProtocol.checkModified())
98)     readProto();
99) 
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

100)   // static destinations update
Stefan Schuermans converted sender to use lis...

Stefan Schuermans authored 12 years ago

101)   m_destListTracker.updateConfig();
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

102) }
103) 
104) /**
105)  * @brief set current frame
106)  * @param[in] stream stream name
Stefan Schuermans merged frame processing wit...

Stefan Schuermans authored 12 years ago

107)  * @param[in] pFrame current frame (NULL for none)
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

108)  */
109) template<typename ADDR, typename SOCK>
110) void Sender<ADDR, SOCK>::setFrame(const std::string &stream,
111)                                   stBlinkenFrame *pFrame)
112) {
Stefan Schuermans simplified implementation o...

Stefan Schuermans authored 12 years ago

113)   // convert new frame to protocol data
Stefan Schuermans simplified sender module a...

Stefan Schuermans authored 12 years ago

114)   frame2data(pFrame, m_data);
Stefan Schuermans simplified implementation o...

Stefan Schuermans authored 12 years ago

115) 
116)   // send new protocol data to all destinations
117)   sendAllProto();
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

118) 
119)   (void)stream; // unused
120) }
121) 
Stefan Schuermans fixed comment typo

Stefan Schuermans authored 12 years ago

122) /// callback when requested time reached
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

123) template<typename ADDR, typename SOCK>
124) void Sender<ADDR, SOCK>::timeCall()
125) {
Stefan Schuermans simplified implementation o...

Stefan Schuermans authored 12 years ago

126)   // repeat current protocol data to all destinations
127)   sendAllProto();
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

128) }
129) 
130) /**
131)  * @brief callback when I/O object is readable
132)  * @param[in] io I/O object that is readable
133)  */
134) template<typename ADDR, typename SOCK>
135) void Sender<ADDR, SOCK>::ioReadCall(Io *io)
136) {
137)   // reception on socket
138)   if (io == m_pSock)
139)     receiveFromSock();
140) }
141) 
142) /**
143)  * @brief callback when I/O object is writable
144)  * @param[in] io I/O object that is writable
145)  */
146) template<typename ADDR, typename SOCK>
147) void Sender<ADDR, SOCK>::ioWriteCall(Io *io)
148) {
149)   (void)io; // unused
150) }
151) 
Stefan Schuermans simplified sender module a...

Stefan Schuermans authored 12 years ago

152) /// (re-)read protocol
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

153) template<typename ADDR, typename SOCK>
Stefan Schuermans simplified sender module a...

Stefan Schuermans authored 12 years ago

154) void Sender<ADDR, SOCK>::readProto()
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

155) {
Stefan Schuermans simplified sender module a...

Stefan Schuermans authored 12 years ago

156)   // send "no frame" to all destinations
157)   // (stream with old protocol will stop now)
158)   sendAllNoFrame();
159) 
160)   // clear dynamic destinations
161)   // (they registered with old protocol, which is out of service now)
162)   m_dynDests.clear();
163) 
164)   // clear old frame data and old no frame data
165)   m_noFrameData.clear();
166)   m_data.clear();
167) 
168)   // read new protocol from file
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

169)   m_fileProtocol.update();
Stefan Schuermans simplified sender module a...

Stefan Schuermans authored 12 years ago

170) 
171)   // create new no frame protocol data and new protocol data
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

172)   frame2data(NULL, m_noFrameData);
173)   frame2data(m_fileInStream.getCurFrame(), m_data);
Stefan Schuermans simplified sender module a...

Stefan Schuermans authored 12 years ago

174) 
175)   // send current protocol data to all destinations
176)   sendAllProto();
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

177) }
178) 
179) /// create socket and bind it
180) template<typename ADDR, typename SOCK>
181) void Sender<ADDR, SOCK>::createSock()
182) {
183)   // create socket
184)   if (!m_pSock) {
185)     m_pSock = new SOCK();
186)     if (!m_pSock)
187)       return;
188)   }
189) 
190)   // get bind address from bind address setting file
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

191)   m_fileBind.update();
192)   if (!m_fileBind.m_valid) {
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

193)     delete m_pSock;
194)     m_pSock = NULL;
195)     return;
196)   }
197) 
198)   // bind socket
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

199)   if (!m_pSock->bind(m_fileBind.m_obj)) {
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

200)     delete m_pSock;
201)     m_pSock = NULL;
202)     return;
203)   }
204) 
Stefan Schuermans simplified sender module a...

Stefan Schuermans authored 12 years ago

205)   // request callback on recepetion
Stefan Schuermans put all managers in one str...

Stefan Schuermans authored 12 years ago

206)   m_mgrs.m_callMgr.requestIoReadCall(this, m_pSock);
Stefan Schuermans simplified sender module a...

Stefan Schuermans authored 12 years ago

207) 
208)   // send current protocol data to all destinations
209)   sendAllProto();
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

210) }
211) 
212) /// destroy socket
213) template<typename ADDR, typename SOCK>
214) void Sender<ADDR, SOCK>::destroySock()
215) {
216)   // send "no frame" to all destinations
217)   // (stream from this socket will stop now)
218)   sendAllNoFrame();
219) 
220)   // clear dynamic destinations
Stefan Schuermans simplified implementation o...

Stefan Schuermans authored 12 years ago

221)   // (they registered with this socket and this socket is gone)
Stefan Schuermans simplified sender module a...

Stefan Schuermans authored 12 years ago

222)   m_dynDests.clear();
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

223) 
224)   // cancel callback request
Stefan Schuermans put all managers in one str...

Stefan Schuermans authored 12 years ago

225)   m_mgrs.m_callMgr.cancelIoReadCall(this, m_pSock);
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

226) 
227)   // destroy socket
228)   if (m_pSock) {
229)     delete m_pSock;
230)     m_pSock = NULL;
231)   }
232) }
233) 
234) /// remove timed-out dynamic destinations
235) template<typename ADDR, typename SOCK>
236) void Sender<ADDR, SOCK>::removeTimedOutDynDests()
237) {
238)   Time now, timeout;
239)   typename DynDests::iterator itDyn;
240) 
241)   now = Time::now();
242)   timeout = Time(30);
243) 
Stefan Schuermans simplified sender module a...

Stefan Schuermans authored 12 years ago

244)   for (itDyn = m_dynDests.begin(); itDyn != m_dynDests.end(); )
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

245)     if (itDyn->second + timeout < now)
Stefan Schuermans simplified sender module a...

Stefan Schuermans authored 12 years ago

246)       m_dynDests.erase(itDyn++);
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

247)     else
248)       ++itDyn;
249) }
250) 
Stefan Schuermans simplified implementation o...

Stefan Schuermans authored 12 years ago

251) /// send current protocol data to all destinations
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

252) template<typename ADDR, typename SOCK>
Stefan Schuermans simplified implementation o...

Stefan Schuermans authored 12 years ago

253) void Sender<ADDR, SOCK>::sendAllProto()
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

254) {
255)   // remove timed-out dynamic destinations
256)   removeTimedOutDynDests();
257) 
Stefan Schuermans simplified implementation o...

Stefan Schuermans authored 12 years ago

258)   // send current protocol data to all static/dynamic destinations
Stefan Schuermans simplified sender module a...

Stefan Schuermans authored 12 years ago

259)   sendDests(&m_data);
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

260) 
261)   // request time callback in one second
Stefan Schuermans put all managers in one str...

Stefan Schuermans authored 12 years ago

262)   m_mgrs.m_callMgr.requestTimeCall(this, Time::now() + Time(1));
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

263) }
264) 
265) /// send "no frame" to all destinations
266) template<typename ADDR, typename SOCK>
267) void Sender<ADDR, SOCK>::sendAllNoFrame()
268) {
269)   // remove timed-out dynamic destinations
270)   removeTimedOutDynDests();
271) 
272)   // get "no frame" protocol data and send to all static/dynamic destinations
Stefan Schuermans simplified sender module a...

Stefan Schuermans authored 12 years ago

273)   sendDests(&m_noFrameData);
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

274) 
275)   // request time callback in one second
Stefan Schuermans put all managers in one str...

Stefan Schuermans authored 12 years ago

276)   m_mgrs.m_callMgr.requestTimeCall(this, Time::now() + Time(1));
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

277) }
278) 
279) /**
280)  * @brief send data to static/dynamic destinations
281)  * @param[in] data *pData protocol data to send
282)  */
283) template<typename ADDR, typename SOCK>
Stefan Schuermans simplified sender module a...

Stefan Schuermans authored 12 years ago

284) void Sender<ADDR, SOCK>::sendDests(const std::string *pData)
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

285) {
286)   // send data to static destinations
Stefan Schuermans converted sender to use lis...

Stefan Schuermans authored 12 years ago

287)   typename DestListTracker::ListIt itDest;
288)   for (itDest = m_destListTracker.m_list.begin();
289)        itDest != m_destListTracker.m_list.end(); ++itDest)
290)     itDest->m_pObj->setProtoData(pData);
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

291) 
292)   // send data to all dynamic destinations
293)   typename DynDests::const_iterator itDyn;
Stefan Schuermans simplified sender module a...

Stefan Schuermans authored 12 years ago

294)   for (itDyn = m_dynDests.begin(); itDyn != m_dynDests.end(); ++itDyn)
Stefan Schuermans simplified implementation o...

Stefan Schuermans authored 12 years ago

295)     sendProto(*pData, itDyn->first);
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

296) }
297) 
298) /**
Stefan Schuermans simplified implementation o...

Stefan Schuermans authored 12 years ago

299)  * @brief send protocol data to address
Stefan Schuermans simplified sender module a...

Stefan Schuermans authored 12 years ago

300)  * @param[in] data protocol data of frame (empty if unknown)
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

301)  * @param[in] addr address to send to
302)  */
303) template<typename ADDR, typename SOCK>
Stefan Schuermans simplified implementation o...

Stefan Schuermans authored 12 years ago

304) void Sender<ADDR, SOCK>::sendProto(const std::string &data,
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

305)                                    const ADDR &addr) const
306) {
Stefan Schuermans simplified sender module a...

Stefan Schuermans authored 12 years ago

307)   if (m_pSock && !data.empty())
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

308)     m_pSock->send(data, addr);
309) }
310) 
311) /**
312)  * @brief convert frame to protocol data
Stefan Schuermans merged frame processing wit...

Stefan Schuermans authored 12 years ago

313)  * @param[in] pFrame frame (NULL for none)
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

314)  * @param[out] data protocol data
315)  */
316) template<typename ADDR, typename SOCK>
317) void Sender<ADDR, SOCK>::frame2data(stBlinkenFrame *pFrame,
Stefan Schuermans simplified sender module a...

Stefan Schuermans authored 12 years ago

318)                                     std::string &data) const
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

319) {
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

320)   etBlinkenProto proto;
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

321)   char buf[65536];
322)   int len;
323) 
Stefan Schuermans simplified sender module a...

Stefan Schuermans authored 12 years ago

324)   // no protocol -> leave with empty data
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

325)   if (!m_fileProtocol.m_valid) {
Stefan Schuermans simplified sender module a...

Stefan Schuermans authored 12 years ago

326)     data.clear();
327)     return;
328)   }
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

329)   proto = m_fileProtocol.m_obj.m_proto;
Stefan Schuermans simplified sender module a...

Stefan Schuermans authored 12 years ago

330) 
Stefan Schuermans typo

Stefan Schuermans authored 12 years ago

331)   // convert frame to protocol data
Stefan Schuermans merged frame processing wit...

Stefan Schuermans authored 12 years ago

332)   if (pFrame)
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

333)     len = BlinkenFrameToNetwork(pFrame, proto, buf, sizeof(buf));
Stefan Schuermans merged frame processing wit...

Stefan Schuermans authored 12 years ago

334)   else
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

335)     len = BlinkenProtoMakePacket(proto, BlinkenPacketStreamEnd,
Stefan Schuermans merged frame processing wit...

Stefan Schuermans authored 12 years ago

336)                                  buf, sizeof(buf));
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

337)   if (len < 0)
338)     len = 0;
339)   data.assign(buf, len);
340) }
341) 
342) /// receive data from socket
343) template<typename ADDR, typename SOCK>
344) void Sender<ADDR, SOCK>::receiveFromSock()
345) {
346)   etBlinkenProto proto;
347)   etBlinkenPacket packet;
348)   std::string data;
349)   ADDR addr;
350) 
351)   // make sure socket exists
352)   if (!m_pSock)
353)     return;
354) 
355)   // receive (leave if no reception)
356)   if (!m_pSock->recv(data, addr))
357)     return;
358) 
359)   // detect packet type and protocol
360)   BlinkenProtoDetectPacket(data.c_str(), data.size(), &proto, &packet);
361) 
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

362)   if (m_fileProtocol.m_valid && proto == m_fileProtocol.m_obj.m_proto) {
Stefan Schuermans simplified sender module a...

Stefan Schuermans authored 12 years ago

363)     switch (packet) {
364) 
365)       // request -> add to dynamic destinations and send current frame
366)       case BlinkenPacketRequest:
367)         m_dynDests[addr] = Time::now();
368)         sendProto(m_data, addr);
369)         break;
370) 
371)       // end request -> remove from dynamic destinations
372)       case BlinkenPacketEndRequest:
373)         m_dynDests.erase(addr);
374)         break;
375) 
376)       default:
377)         break;
378) 
379)     } // switch (packet)
Stefan Schuermans implemented specialized set...

Stefan Schuermans authored 12 years ago

380)   } // if (m_fileProtocol.m_valid ...
Stefan Schuermans sender static destination n...

Stefan Schuermans authored 12 years ago

381) }
382) 
383) } // namespace Blinker
384) 
Stefan Schuermans namespace for preprocessor...

Stefan Schuermans authored 12 years ago

385) #endif // #ifndef BLINKER_SENDER_H