1
0
Fork 0

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:
James Turner 2021-07-21 15:46:03 +01:00
parent e2ef3dacd6
commit 16295cd536
2 changed files with 22 additions and 9 deletions

View file

@ -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

View file

@ -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;