1
0
Fork 0

fgpanel: avoid lagging

Avoid lagging when data is sent at (slightly) higher rate than
fgpanel's display rate. Always read all available data - display
most recent.
This commit is contained in:
ThorstenB 2011-11-12 11:24:08 +01:00
parent e54f83d77b
commit 05eade445e

View file

@ -123,15 +123,25 @@ FGPanelProtocol::~FGPanelProtocol()
void FGPanelProtocol::update( double dt ) void FGPanelProtocol::update( double dt )
{ {
char buf[8192]; char buf[2][8192];
if( io == NULL ) if( io == NULL )
return; return;
int length = io->readline( buf, sizeof(buf)-1 ); // read all available lines, keep last one
buf[sizeof(buf)-1] = 0; int Page = 0;
if ( length > 0 ) { bool HaveData = false;
vector<string> tokens = simgear::strutils::split( buf, "," ); while ( io->readline( buf[Page], sizeof(buf[Page])-1 ) > 0 )
{
HaveData = true;
Page ^= 1;
}
if ( HaveData ) {
// process most recent line of data
Page ^= 1;
buf[Page][sizeof(buf[Page])-1] = 0;
vector<string> tokens = simgear::strutils::split( buf[Page], "," );
for( vector<string>::size_type i = 0; i < tokens.size(); i++ ) { for( vector<string>::size_type i = 0; i < tokens.size(); i++ ) {
if( i < propertySetterVector.size() ) if( i < propertySetterVector.size() )
propertySetterVector[i]->setValue( tokens[i].c_str() ); propertySetterVector[i]->setValue( tokens[i].c_str() );