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 )
|
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() );
|
||||||
|
|
Loading…
Reference in a new issue