362c1f4c3b5ce9e3fce11167a51fbe4cdb2174de
Stefan Schuermans implemented output module t...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp   1) /* Blinker
Stefan Schuermans update copyright header

Stefan Schuermans authored 5 years ago

src/common/Output.cpp   2)    Copyright 2011-2019 Stefan Schuermans <stefan@blinkenarea.org>
Stefan Schuermans implemented output module t...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp   3)    Copyleft GNU public license - http://www.gnu.org/copyleft/gpl.html
src/noarch/Output.cpp   4)    a blinkenarea.org project */
src/noarch/Output.cpp   5) 
src/noarch/Output.cpp   6) #include <string>
src/noarch/Output.cpp   7) 
src/noarch/Output.cpp   8) #include <BlinkenLib/BlinkenFrame.h>
src/noarch/Output.cpp   9) #include <BlinkenLib/BlinkenProto.h>
src/noarch/Output.cpp  10) 
src/noarch/Output.cpp  11) #include "Device.h"
src/noarch/Output.cpp  12) #include "Directory.h"
src/noarch/Output.cpp  13) #include "File.h"
src/noarch/Output.cpp  14) #include "InStreamFile.h"
Stefan Schuermans put all managers in one str...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp  15) #include "Mgrs.h"
Stefan Schuermans implemented output module t...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp  16) #include "Module.h"
src/noarch/Output.cpp  17) #include "NameFile.h"
src/noarch/Output.cpp  18) #include "Output.h"
src/noarch/Output.cpp  19) #include "Protocol.h"
src/noarch/Output.cpp  20) #include "ProtocolFile.h"
src/noarch/Output.cpp  21) #include "SerCfgFile.h"
src/noarch/Output.cpp  22) #include "StreamRecv.h"
Stefan Schuermans added missing header file

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp  23) #include "Time.h"
Stefan Schuermans implemented output module t...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp  24) #include "TimeCallee.h"
src/noarch/Output.cpp  25) 
src/noarch/Output.cpp  26) namespace Blinker {
src/noarch/Output.cpp  27) 
src/noarch/Output.cpp  28) /**
src/noarch/Output.cpp  29)  * @brief constructor
Stefan Schuermans make modules know their name

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp  30)  * @param[in] name module name
Stefan Schuermans put all managers in one str...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp  31)  * @param[in] mgrs managers
Stefan Schuermans implemented output module t...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp  32)  * @param[in] dirBase base directory
src/noarch/Output.cpp  33)  */
Stefan Schuermans make modules know their name

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp  34) Output::Output(const std::string &name, Mgrs &mgrs,
Stefan Schuermans implemented output module t...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp  35)                const Directory &dirBase):
Stefan Schuermans make modules know their name

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp  36)   Module(name, mgrs, dirBase),
Stefan Schuermans put all managers in one str...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp  37)   m_fileInStream(dirBase.getFile("instream"), mgrs.m_streamMgr),
Stefan Schuermans implemented output module t...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp  38)   m_fileProtocol(dirBase.getFile("protocol")),
src/noarch/Output.cpp  39)   m_fileDevice(dirBase.getFile("device")),
Stefan Schuermans add missing initialization

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp  40)   m_fileSerCfg(dirBase.getFile("ser_cfg")),
src/noarch/Output.cpp  41)   m_pDevice(NULL)
Stefan Schuermans implemented output module t...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp  42) {
src/noarch/Output.cpp  43)   // set up
src/noarch/Output.cpp  44)   m_fileInStream.setStreamRecv(this);
src/noarch/Output.cpp  45)   readProto();
src/noarch/Output.cpp  46)   openDevice();
src/noarch/Output.cpp  47) }
src/noarch/Output.cpp  48) 
src/noarch/Output.cpp  49) /// virtual destructor
src/noarch/Output.cpp  50) Output::~Output()
src/noarch/Output.cpp  51) {
src/noarch/Output.cpp  52)   // clean up
src/noarch/Output.cpp  53)   closeDevice();
src/noarch/Output.cpp  54)   m_fileInStream.setStreamRecv(NULL);
Stefan Schuermans put all managers in one str...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp  55)   m_mgrs.m_callMgr.cancelTimeCall(this);
Stefan Schuermans implemented output module t...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp  56) }
src/noarch/Output.cpp  57) 
src/noarch/Output.cpp  58) /// check for update of configuration
src/noarch/Output.cpp  59) void Output::updateConfig()
src/noarch/Output.cpp  60) {
src/noarch/Output.cpp  61)   // input stream name file was modified -> re-get input stream
src/noarch/Output.cpp  62)   if (m_fileInStream.checkModified())
src/noarch/Output.cpp  63)     m_fileInStream.update();
src/noarch/Output.cpp  64) 
src/noarch/Output.cpp  65)   // protocol file was modified -> re-read protocol
src/noarch/Output.cpp  66)   if (m_fileProtocol.checkModified())
src/noarch/Output.cpp  67)     readProto();
src/noarch/Output.cpp  68) 
src/noarch/Output.cpp  69)   // device file or serial settings file was modified -> re-open device
src/noarch/Output.cpp  70)   if (m_fileDevice.checkModified() || m_fileSerCfg.checkModified())
src/noarch/Output.cpp  71)     openDevice();
src/noarch/Output.cpp  72) }
src/noarch/Output.cpp  73) 
src/noarch/Output.cpp  74) /**
src/noarch/Output.cpp  75)  * @brief set current frame
src/noarch/Output.cpp  76)  * @param[in] stream stream name
src/noarch/Output.cpp  77)  * @param[in] pFrame current frame (NULL for none)
src/noarch/Output.cpp  78)  */
src/noarch/Output.cpp  79) void Output::setFrame(const std::string &stream, stBlinkenFrame *pFrame)
src/noarch/Output.cpp  80) {
src/noarch/Output.cpp  81)   outputFrame();
src/noarch/Output.cpp  82)   (void)stream; // unused
src/noarch/Output.cpp  83)   (void)pFrame; // unused
src/noarch/Output.cpp  84) }
src/noarch/Output.cpp  85) 
src/noarch/Output.cpp  86) /// callback when requested time reached
src/noarch/Output.cpp  87) void Output::timeCall()
src/noarch/Output.cpp  88) {
Stefan Schuermans retry harder to output data...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp  89)   // device is not open -> try to (re-)open it
src/noarch/Output.cpp  90)   if (!m_pDevice) {
Stefan Schuermans implemented output module t...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp  91)     openDevice();
Stefan Schuermans retry harder to output data...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp  92)     return;
src/noarch/Output.cpp  93)   }
src/noarch/Output.cpp  94) 
src/noarch/Output.cpp  95)   // buffer not empty -> try to output rest of data
src/noarch/Output.cpp  96)   if (!m_buffer.empty()) {
src/noarch/Output.cpp  97)     outputBufferedData();
src/noarch/Output.cpp  98)     return;
src/noarch/Output.cpp  99)   }
Stefan Schuermans implemented output module t...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp 100) 
Stefan Schuermans retry harder to output data...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp 101)   // (re-)output current frame
Stefan Schuermans implemented output module t...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp 102)   outputFrame();
src/noarch/Output.cpp 103) }
src/noarch/Output.cpp 104) 
src/noarch/Output.cpp 105) /// (re-)read protocol
src/noarch/Output.cpp 106) void Output::readProto()
src/noarch/Output.cpp 107) {
src/noarch/Output.cpp 108)   // update protocol from file
src/noarch/Output.cpp 109)   m_fileProtocol.update();
src/noarch/Output.cpp 110) 
src/noarch/Output.cpp 111)   // re-output current frame using new protocol
src/noarch/Output.cpp 112)   outputFrame();
src/noarch/Output.cpp 113) }
src/noarch/Output.cpp 114) 
src/noarch/Output.cpp 115) /// open device
src/noarch/Output.cpp 116) void Output::openDevice()
src/noarch/Output.cpp 117) {
src/noarch/Output.cpp 118)   closeDevice();
src/noarch/Output.cpp 119) 
src/noarch/Output.cpp 120)   // get new device name and new serial config
src/noarch/Output.cpp 121)   m_fileDevice.update();
src/noarch/Output.cpp 122)   m_fileSerCfg.update();
src/noarch/Output.cpp 123) 
src/noarch/Output.cpp 124)   // open device
src/noarch/Output.cpp 125)   if (m_fileDevice.m_valid)
src/noarch/Output.cpp 126)     m_pDevice = new Device(m_fileDevice.m_obj.m_str);
src/noarch/Output.cpp 127) 
src/noarch/Output.cpp 128)   // serial config available -> configure serial port
src/noarch/Output.cpp 129)   if (m_pDevice && m_fileSerCfg.m_valid) {
src/noarch/Output.cpp 130)     if (!m_pDevice->setSerCfg(m_fileSerCfg.m_obj))
src/noarch/Output.cpp 131)       closeDevice(); // error -> close device
src/noarch/Output.cpp 132)   }
src/noarch/Output.cpp 133) 
src/noarch/Output.cpp 134)   // output current frame to device
src/noarch/Output.cpp 135)   outputFrame();
src/noarch/Output.cpp 136) }
src/noarch/Output.cpp 137) 
src/noarch/Output.cpp 138) /// close device
src/noarch/Output.cpp 139) void Output::closeDevice()
src/noarch/Output.cpp 140) {
src/noarch/Output.cpp 141)   // close device
src/noarch/Output.cpp 142)   if (m_pDevice) {
src/noarch/Output.cpp 143)     delete m_pDevice;
src/noarch/Output.cpp 144)     m_pDevice = NULL;
src/noarch/Output.cpp 145)   }
src/noarch/Output.cpp 146) 
Stefan Schuermans retry harder to output data...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp 147)   // reset internal status
Stefan Schuermans added buffer to serial devi...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp 148)   m_buffer.clear();
Stefan Schuermans retry harder to output data...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp 149)   m_dropped = false;
Stefan Schuermans added buffer to serial devi...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp 150) 
Stefan Schuermans retry harder to output data...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp 151)   updateTimeCallback();
Stefan Schuermans implemented output module t...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp 152) }
src/noarch/Output.cpp 153) 
src/noarch/Output.cpp 154) /// output current frame to device
src/noarch/Output.cpp 155) void Output::outputFrame()
src/noarch/Output.cpp 156) {
src/noarch/Output.cpp 157)   stBlinkenFrame *pFrame;
src/noarch/Output.cpp 158)   char buf[65536];
src/noarch/Output.cpp 159)   int len;
src/noarch/Output.cpp 160)   std::string data;
src/noarch/Output.cpp 161) 
src/noarch/Output.cpp 162)   // no protocol or no device -> leave
src/noarch/Output.cpp 163)   if (!m_fileProtocol.m_valid || !m_pDevice)
src/noarch/Output.cpp 164)     return;
src/noarch/Output.cpp 165) 
src/noarch/Output.cpp 166)   // get current frame from input stream
src/noarch/Output.cpp 167)   pFrame = m_fileInStream.getCurFrame();
src/noarch/Output.cpp 168) 
src/noarch/Output.cpp 169)   // convert frame to protocol data
src/noarch/Output.cpp 170)   if (pFrame)
src/noarch/Output.cpp 171)     len = BlinkenFrameToNetwork(pFrame, m_fileProtocol.m_obj.m_proto,
src/noarch/Output.cpp 172)                                 buf, sizeof(buf));
src/noarch/Output.cpp 173)   else
src/noarch/Output.cpp 174)     len = BlinkenProtoMakePacket(m_fileProtocol.m_obj.m_proto,
src/noarch/Output.cpp 175)                                  BlinkenPacketStreamEnd, buf, sizeof(buf));
src/noarch/Output.cpp 176)   if (len < 0)
src/noarch/Output.cpp 177)     len = 0;
src/noarch/Output.cpp 178)   data.assign(buf, len);
src/noarch/Output.cpp 179) 
Stefan Schuermans added buffer to serial devi...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp 180)   outputFrameData(data);
Stefan Schuermans implemented output module t...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp 181) 
Stefan Schuermans retry harder to output data...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp 182)   updateTimeCallback();
Stefan Schuermans implemented output module t...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp 183) }
src/noarch/Output.cpp 184) 
Stefan Schuermans added buffer to serial devi...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp 185) /**
src/noarch/Output.cpp 186)  * @brief output frame data to device
src/noarch/Output.cpp 187)  * @param[in] data data of one frame to output to device
src/noarch/Output.cpp 188)  */
src/noarch/Output.cpp 189) void Output::outputFrameData(const std::string &data)
src/noarch/Output.cpp 190) {
src/noarch/Output.cpp 191)   // add data to buffer (if current buffer contains less than 10 frames)
Stefan Schuermans retry harder to output data...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp 192)   if (m_buffer.size() < data.size() * 10) {
Stefan Schuermans added buffer to serial devi...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp 193)     m_buffer += data;
Stefan Schuermans retry harder to output data...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp 194)     m_dropped = false; // last frame was not dropped
src/noarch/Output.cpp 195)   } else {
src/noarch/Output.cpp 196)     m_dropped = true; // remember that last frame was dropped
src/noarch/Output.cpp 197)   }
src/noarch/Output.cpp 198) 
src/noarch/Output.cpp 199)   outputBufferedData();
src/noarch/Output.cpp 200) }
src/noarch/Output.cpp 201) 
src/noarch/Output.cpp 202) /// write data in output buffer to device
src/noarch/Output.cpp 203) void Output::outputBufferedData()
src/noarch/Output.cpp 204) {
src/noarch/Output.cpp 205)   // no device -> forget buffered data, leave
src/noarch/Output.cpp 206)   if (!m_pDevice) {
src/noarch/Output.cpp 207)     m_buffer.clear();
src/noarch/Output.cpp 208)     return;
src/noarch/Output.cpp 209)   }
Stefan Schuermans added buffer to serial devi...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp 210) 
src/noarch/Output.cpp 211)   // write (at least some) data to device
src/noarch/Output.cpp 212)   std::string::size_type len;
Stefan Schuermans retry harder to output data...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp 213)   if (!m_pDevice->write(m_buffer, len)) {
Stefan Schuermans added buffer to serial devi...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp 214)     closeDevice(); // error -> close device
Stefan Schuermans retry harder to output data...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp 215)     return;
src/noarch/Output.cpp 216)   }
src/noarch/Output.cpp 217) 
src/noarch/Output.cpp 218)   // remove written data from buffer
src/noarch/Output.cpp 219)   m_buffer = m_buffer.substr(len);
src/noarch/Output.cpp 220) 
src/noarch/Output.cpp 221)   updateTimeCallback();
src/noarch/Output.cpp 222) }
src/noarch/Output.cpp 223) 
src/noarch/Output.cpp 224) /// update time callback request
src/noarch/Output.cpp 225) void Output::updateTimeCallback()
src/noarch/Output.cpp 226) {
src/noarch/Output.cpp 227)   /* no device -> call in 1s for re-opening device
src/noarch/Output.cpp 228)      buffer empty, last frame not dropped -> call in 1s for re-outputting
src/noarch/Output.cpp 229)      buffer not empty -> call in 50ms for outputting more data
src/noarch/Output.cpp 230)      last frame dropped -> call in 50ms for frame update */
src/noarch/Output.cpp 231)   Time delay(1);
src/noarch/Output.cpp 232)   if (m_pDevice && (!m_buffer.empty() || m_dropped))
src/noarch/Output.cpp 233)     delay.fromMs(50);
src/noarch/Output.cpp 234)   m_mgrs.m_callMgr.requestTimeCall(this, Time::now() + delay);
Stefan Schuermans added buffer to serial devi...

Stefan Schuermans authored 12 years ago

src/noarch/Output.cpp 235) }
src/noarch/Output.cpp 236)