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:
parent
e54f83d77b
commit
05eade445e
1 changed files with 15 additions and 5 deletions
|
@ -123,15 +123,25 @@ FGPanelProtocol::~FGPanelProtocol()
|
|||
|
||||
void FGPanelProtocol::update( double dt )
|
||||
{
|
||||
char buf[8192];
|
||||
char buf[2][8192];
|
||||
|
||||
if( io == NULL )
|
||||
return;
|
||||
|
||||
int length = io->readline( buf, sizeof(buf)-1 );
|
||||
buf[sizeof(buf)-1] = 0;
|
||||
if ( length > 0 ) {
|
||||
vector<string> tokens = simgear::strutils::split( buf, "," );
|
||||
// read all available lines, keep last one
|
||||
int Page = 0;
|
||||
bool HaveData = false;
|
||||
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++ ) {
|
||||
if( i < propertySetterVector.size() )
|
||||
propertySetterVector[i]->setValue( tokens[i].c_str() );
|
||||
|
|
Loading…
Reference in a new issue