Stefan Schuermans commited on 2011-12-27 19:23:46
Showing 2 changed files, with 60 additions and 18 deletions.
| ... | ... |
@@ -86,11 +86,19 @@ void Output::setFrame(const std::string &stream, stBlinkenFrame *pFrame) |
| 86 | 86 |
/// callback when requested time reached |
| 87 | 87 |
void Output::timeCall() |
| 88 | 88 |
{
|
| 89 |
- // if device is not open, try to (re-)open it |
|
| 90 |
- if (!m_pDevice) |
|
| 89 |
+ // device is not open -> try to (re-)open it |
|
| 90 |
+ if (!m_pDevice) {
|
|
| 91 | 91 |
openDevice(); |
| 92 |
+ return; |
|
| 93 |
+ } |
|
| 94 |
+ |
|
| 95 |
+ // buffer not empty -> try to output rest of data |
|
| 96 |
+ if (!m_buffer.empty()) {
|
|
| 97 |
+ outputBufferedData(); |
|
| 98 |
+ return; |
|
| 99 |
+ } |
|
| 92 | 100 |
|
| 93 |
- // re-output current frame |
|
| 101 |
+ // (re-)output current frame |
|
| 94 | 102 |
outputFrame(); |
| 95 | 103 |
} |
| 96 | 104 |
|
| ... | ... |
@@ -136,11 +144,11 @@ void Output::closeDevice() |
| 136 | 144 |
m_pDevice = NULL; |
| 137 | 145 |
} |
| 138 | 146 |
|
| 139 |
- // clear buffered data |
|
| 147 |
+ // reset internal status |
|
| 140 | 148 |
m_buffer.clear(); |
| 149 |
+ m_dropped = false; |
|
| 141 | 150 |
|
| 142 |
- // request time callback in one second (for trying to re-open device) |
|
| 143 |
- m_mgrs.m_callMgr.requestTimeCall(this, Time::now() + Time(1)); |
|
| 151 |
+ updateTimeCallback(); |
|
| 144 | 152 |
} |
| 145 | 153 |
|
| 146 | 154 |
/// output current frame to device |
| ... | ... |
@@ -169,12 +177,9 @@ void Output::outputFrame() |
| 169 | 177 |
len = 0; |
| 170 | 178 |
data.assign(buf, len); |
| 171 | 179 |
|
| 172 |
- // output data to device |
|
| 173 | 180 |
outputFrameData(data); |
| 174 | 181 |
|
| 175 |
- /* request time callback in one second |
|
| 176 |
- (for outputting current frame again or reopening device) */ |
|
| 177 |
- m_mgrs.m_callMgr.requestTimeCall(this, Time::now() + Time(1)); |
|
| 182 |
+ updateTimeCallback(); |
|
| 178 | 183 |
} |
| 179 | 184 |
|
| 180 | 185 |
/** |
| ... | ... |
@@ -183,20 +188,50 @@ void Output::outputFrame() |
| 183 | 188 |
*/ |
| 184 | 189 |
void Output::outputFrameData(const std::string &data) |
| 185 | 190 |
{
|
| 186 |
- // no device -> leave |
|
| 187 |
- if (!m_pDevice) |
|
| 188 |
- return; |
|
| 189 |
- |
|
| 190 | 191 |
// add data to buffer (if current buffer contains less than 10 frames) |
| 191 |
- if (m_buffer.size() < data.size() * 10) |
|
| 192 |
+ if (m_buffer.size() < data.size() * 10) {
|
|
| 192 | 193 |
m_buffer += data; |
| 194 |
+ m_dropped = false; // last frame was not dropped |
|
| 195 |
+ } else {
|
|
| 196 |
+ m_dropped = true; // remember that last frame was dropped |
|
| 197 |
+ } |
|
| 198 |
+ |
|
| 199 |
+ outputBufferedData(); |
|
| 200 |
+} |
|
| 201 |
+ |
|
| 202 |
+/// write data in output buffer to device |
|
| 203 |
+void Output::outputBufferedData() |
|
| 204 |
+{
|
|
| 205 |
+ // no device -> forget buffered data, leave |
|
| 206 |
+ if (!m_pDevice) {
|
|
| 207 |
+ m_buffer.clear(); |
|
| 208 |
+ return; |
|
| 209 |
+ } |
|
| 193 | 210 |
|
| 194 | 211 |
// write (at least some) data to device |
| 195 | 212 |
std::string::size_type len; |
| 196 |
- if (!m_pDevice->write(m_buffer, len)) |
|
| 213 |
+ if (!m_pDevice->write(m_buffer, len)) {
|
|
| 197 | 214 |
closeDevice(); // error -> close device |
| 198 |
- else |
|
| 199 |
- m_buffer = m_buffer.substr(len); // done -> remove written data from buffer |
|
| 215 |
+ return; |
|
| 216 |
+ } |
|
| 217 |
+ |
|
| 218 |
+ // remove written data from buffer |
|
| 219 |
+ m_buffer = m_buffer.substr(len); |
|
| 220 |
+ |
|
| 221 |
+ updateTimeCallback(); |
|
| 222 |
+} |
|
| 223 |
+ |
|
| 224 |
+/// update time callback request |
|
| 225 |
+void Output::updateTimeCallback() |
|
| 226 |
+{
|
|
| 227 |
+ /* no device -> call in 1s for re-opening device |
|
| 228 |
+ buffer empty, last frame not dropped -> call in 1s for re-outputting |
|
| 229 |
+ buffer not empty -> call in 50ms for outputting more data |
|
| 230 |
+ last frame dropped -> call in 50ms for frame update */ |
|
| 231 |
+ Time delay(1); |
|
| 232 |
+ if (m_pDevice && (!m_buffer.empty() || m_dropped)) |
|
| 233 |
+ delay.fromMs(50); |
|
| 234 |
+ m_mgrs.m_callMgr.requestTimeCall(this, Time::now() + delay); |
|
| 200 | 235 |
} |
| 201 | 236 |
|
| 202 | 237 |
} // namespace Blinker |
| ... | ... |
@@ -81,6 +81,12 @@ protected: |
| 81 | 81 |
*/ |
| 82 | 82 |
void outputFrameData(const std::string &data); |
| 83 | 83 |
|
| 84 |
+ /// write data in output buffer to device |
|
| 85 |
+ void outputBufferedData(); |
|
| 86 |
+ |
|
| 87 |
+ /// update time callback request |
|
| 88 |
+ void updateTimeCallback(); |
|
| 89 |
+ |
|
| 84 | 90 |
protected: |
| 85 | 91 |
InStreamFile m_fileInStream; ///< input stream name file |
| 86 | 92 |
ProtocolFile m_fileProtocol; ///< protocol file |
| ... | ... |
@@ -88,6 +94,7 @@ protected: |
| 88 | 94 |
SerCfgFile m_fileSerCfg; ///< serial port configuration file |
| 89 | 95 |
Device *m_pDevice; ///< device to output to |
| 90 | 96 |
std::string m_buffer; ///< buffered data still to be output to device |
| 97 |
+ bool m_dropped; ///< if the last frame has been dropped |
|
| 91 | 98 |
}; // class Output |
| 92 | 99 |
|
| 93 | 100 |
} // namespace Blinker |
| 94 | 101 |