From e08eee587dbc78d871ea9c1c5c64fb82fc76c9c2 Mon Sep 17 00:00:00 2001 From: James Turner Date: Fri, 2 Dec 2022 12:21:39 +0000 Subject: [PATCH] Route-manager: is expose is-route property for UI --- docs-mini/README-structure.md | 77 +++++++++++++++++++++++++++++++++++ src/Autopilot/route_mgr.cxx | 33 ++++----------- src/Autopilot/route_mgr.hxx | 26 +++--------- 3 files changed, 91 insertions(+), 45 deletions(-) create mode 100644 docs-mini/README-structure.md diff --git a/docs-mini/README-structure.md b/docs-mini/README-structure.md new file mode 100644 index 000000000..62b48ff80 --- /dev/null +++ b/docs-mini/README-structure.md @@ -0,0 +1,77 @@ +# Strucutral Overview + +## Foundation Components + + +There is a group os basic objects used widely throughout the codebase, which +are useful building blocks in all major simulation elements. + +### Properties + +Properties form a hierarchy of named, typed values. The hierarchy can be extended +and modified at runtime by aircraft, simulation components and external protocols. + +### Listeners + +Listeners are a callback interface `SGPropertyChangeListener` which can implemented +to receive notification when a property is modified, or its children added/removed. +Most commonly listeners are used to look for a user input or simulation event +changing some value (for example, a switch being turned from on to off), but it's +possible to monitor an entire sub-tree of properties. + +It's important than listeners do not block or perform excessive amounts of work, since +the code modifying the property may not expect this. If non-trivial work needs to be +performed in response to a property changing, the listener should set a dirty flag +and a subsystem (etc) should check this in its `update()` method. + +### Tied properties + +Tied properties allow a property to be defined by a C++ memory location (such as a class +member variable) or by callback functions implementation the get/set operations. This +is very convenient for the implementating code. However, by default it has the +problematic side-effect that listeners do not correctly, since they have no way to be +notified thst the underlying value (or result of invoking the getter) has changed. + +It is therefore critical, when using tied properties, to _manually_ invoke `fireValueChanged` +on dependent proeprties, when updating the internal state producing them. Care should be +taken to only fire the change, when the result of the getters would actually change; it is +_not_ acceptable to simply call `fireValueChanged` each iteration, since any connected +listener will be run at the simulation rate. + +### Conditions + +_Conditions_ are predicates which can be evaluated on demand. They can contain +logical operations such as 'and' and 'or', and comparisoms: for example checking that +a property is equal to a constant value, or that a property is less than another +property. + +Conditions are widely used to drive other state from properties; for example +enabling or disabling user-interface in a dialog, or activating an autopilot +element. + +### Bindings + +_Bindings_ are a command invocation with associated arguments. In the simplest case +this might be invoking the `property-set` command with an argument of 42. At its +most complex, the command might invoke a Nasal script, supplied as part of the +binding, and substituing a runtime value into the Nasal logic. + +Bindings are typically used in response to user actions, such as a menu item, key +press or interacting with a cockpit control, to update some part of the simulator +state. + +## Structural Components + +Most code within FlightGear is organized into subsystems. Subsystems are isolated from each other; +a well designed subsytem can be added, remove or restarting independently. Many subystems do not +full conform to these goals, especially regarding runtime adding and removal, but an increasing +number do support it. + +=== Subsystems === + +=== Commands === + + +## Finding data files + +## Subsysterm Lifecycle diff --git a/src/Autopilot/route_mgr.cxx b/src/Autopilot/route_mgr.cxx index 3d9b5a02d..76fdba57b 100644 --- a/src/Autopilot/route_mgr.cxx +++ b/src/Autopilot/route_mgr.cxx @@ -1,26 +1,8 @@ // route_mgr.cxx - manage a route (i.e. a collection of waypoints) -// -// Written by Curtis Olson, started January 2004. -// Norman Vine -// Melchior FRANZ -// -// Copyright (C) 2004 Curtis L. Olson - http://www.flightgear.org/~curt -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -// -// $Id$ +/* + * SPDX-FileCopyrightText: (C) 2004 Curtis L. Olson http://www.flightgear.org/~curt + * SPDX-License-Identifier: GPL-2.0-or-later + */ #include @@ -372,7 +354,8 @@ void FGRouteMgr::init() { _edited = fgGetNode(RM "signals/edited", true); _flightplanChanged = fgGetNode(RM "signals/flightplan-changed", true); - + _isRoute = fgGetNode(RM "is-route", true); + _currentWpt = fgGetNode(RM "current-wp", true); _currentWpt->setAttribute(SGPropertyNode::LISTENER_SAFE, true); _currentWpt->tie(SGRawValueMethods @@ -411,6 +394,8 @@ void FGRouteMgr::postinit() loadRoute(path); } + _isRoute->setBoolValue(_plan->isRoute()); + // this code only matters for the --wp option now - perhaps the option // should be deprecated in favour of an explicit flight-plan file? // then the global initial waypoint list could die. @@ -486,7 +471,7 @@ void FGRouteMgr::setFlightPlan(const FlightPlanRef& plan) _plan = plan; _plan->addDelegate(this); - + _isRoute->setBoolValue(_plan->isRoute()); _flightplanChanged->fireValueChanged(); // fire all the callbacks! diff --git a/src/Autopilot/route_mgr.hxx b/src/Autopilot/route_mgr.hxx index accc975ee..7e4d36a84 100644 --- a/src/Autopilot/route_mgr.hxx +++ b/src/Autopilot/route_mgr.hxx @@ -1,24 +1,8 @@ // route_mgr.hxx - manage a route (i.e. a collection of waypoints) -// -// Written by Curtis Olson, started January 2004. -// -// Copyright (C) 2004 Curtis L. Olson - http://www.flightgear.org/~curt -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -// -// $Id$ +/* + * SPDX-FileCopyrightText: (C) 2004 Curtis L. Olson http://www.flightgear.org/~curt + * SPDX-License-Identifier: GPL-2.0-or-later + */ #pragma once @@ -144,7 +128,7 @@ private: SGPropertyNode_ptr _pathNode; SGPropertyNode_ptr _currentWpt; - + SGPropertyNode_ptr _isRoute; /** * Signal property to notify people that the route was edited