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 |