Remove a per-frame property lookup
Cache some property nodes so the GPS doesn't do a lookup by name each update().
This commit is contained in:
parent
e2ef3dacd6
commit
16295cd536
2 changed files with 22 additions and 9 deletions
|
@ -264,6 +264,10 @@ GPS::bind()
|
|||
// navradio slaving properties
|
||||
tie(_gpsNode, "cdi-deflection", SGRawValueMethods<GPS,double>
|
||||
(*this, &GPS::getCDIDeflection));
|
||||
|
||||
_currentWpLatNode = _currentWayptNode->getNode("latitude-deg", true);
|
||||
_currentWpLonNode = _currentWayptNode->getNode("longitude-deg", true);
|
||||
_currentWpAltNode = _currentWayptNode->getNode("altitude-ft", true);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -271,6 +275,10 @@ GPS::unbind()
|
|||
{
|
||||
_tiedProperties.Untie();
|
||||
_gpsNode.clear();
|
||||
_currentWayptNode.clear();
|
||||
_currentWpLatNode.clear();
|
||||
_currentWpLonNode.clear();
|
||||
_currentWpAltNode.clear();
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -323,11 +331,7 @@ GPS::update (double delta_time_sec)
|
|||
if (_dataValid) {
|
||||
if (_wayptController.get()) {
|
||||
_wayptController->update(delta_time_sec);
|
||||
SGGeod p(_wayptController->position());
|
||||
_currentWayptNode->setDoubleValue("longitude-deg", p.getLongitudeDeg());
|
||||
_currentWayptNode->setDoubleValue("latitude-deg", p.getLatitudeDeg());
|
||||
_currentWayptNode->setDoubleValue("altitude-ft", p.getElevationFt());
|
||||
|
||||
updateCurrentWpNode(_wayptController->position());
|
||||
_desiredCourse = getLegMagCourse();
|
||||
|
||||
_gpsNode->setStringValue("rnav-controller-status", _wayptController->status());
|
||||
|
@ -800,15 +804,19 @@ void GPS::wp1Changed()
|
|||
_legDistanceNm = _wayptController->distanceToWayptM() * SG_METER_TO_NM;
|
||||
|
||||
// synchronise these properties immediately
|
||||
SGGeod p(_wayptController->position());
|
||||
_currentWayptNode->setDoubleValue("longitude-deg", p.getLongitudeDeg());
|
||||
_currentWayptNode->setDoubleValue("latitude-deg", p.getLatitudeDeg());
|
||||
_currentWayptNode->setDoubleValue("altitude-ft", p.getElevationFt());
|
||||
updateCurrentWpNode(_wayptController->position());
|
||||
|
||||
_desiredCourse = getLegMagCourse();
|
||||
}
|
||||
}
|
||||
|
||||
void GPS::updateCurrentWpNode(const SGGeod& p)
|
||||
{
|
||||
_currentWpLatNode->setDoubleValue(p.getLatitudeDeg());
|
||||
_currentWpLonNode->setDoubleValue(p.getLongitudeDeg());
|
||||
_currentWpAltNode->setDoubleValue(p.getElevationFt());
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// property getter/setters
|
||||
|
||||
|
|
|
@ -321,6 +321,8 @@ private:
|
|||
void tieSGGeodReadOnly(SGPropertyNode* aNode, SGGeod& aRef,
|
||||
const char* lonStr, const char* latStr, const char* altStr);
|
||||
|
||||
void updateCurrentWpNode(const SGGeod& p);
|
||||
|
||||
// FlightPlan::Delegate
|
||||
void currentWaypointChanged() override;
|
||||
void waypointsChanged() override;
|
||||
|
@ -334,6 +336,9 @@ private:
|
|||
// members
|
||||
SGPropertyNode_ptr _gpsNode;
|
||||
SGPropertyNode_ptr _currentWayptNode;
|
||||
SGPropertyNode_ptr _currentWpLatNode,
|
||||
_currentWpLonNode, _currentWpAltNode;
|
||||
|
||||
SGPropertyNode_ptr _magvar_node;
|
||||
SGPropertyNode_ptr _serviceable_node;
|
||||
SGPropertyNode_ptr _electrical_node;
|
||||
|
|
Loading…
Add table
Reference in a new issue