If a menu-bar item is missing a <name>, we can end up building a string
from nullptr, which is a SEGV.
Reported as Sentry issue FLIGHTGEAR-1D
Will back-port to LTS once verified.
Use the ‘file name copying’ version of log(), to avoid an ASan use-
after-free. Note this requires SG change
908496d43dd7c3a7ca1de42b0e0c21aa0498c7df
to work correctly.
When there are installed the same aircrafts from different sources
(fgdata + fgaddon + git) with identical descriptions, use the URI to
provide stable sorting.
Handle the standard windows-3rd-party setup (used by fgmeta) with no
extra options, and also handle the slightly odd setup we use on Jenkins.
Try to tolerate all permutations of setting MSVC_3RDPARTY_ROOT to
different places in the hierarchy.
We no longer try to guess Boost_INCLUDEDIR by looking at parent dirs of
MSVC_3RDPARTY_ROOT, since this seemed kind of bad to me. Let’s try
it and see.
Fire the release bindings for active pick callbacks, even for a ‘handled’
mouse release. This means knobs, etc will fire their release binding
if the mouse is over a PUI dialog.
https://sourceforge.net/p/flightgear/codetickets/2347/
Attempting to fix Sentry crash FLIGHTGEAR-B, crash on shutdown. Not
sure this is quite right, but the logic is clearer and we handle
invalid iterators better.
Add a number of properties set by both AI Traffic and Swift aircraft:
gear/gear[0..5]/position-norm
surface-positions/flap-pos-norm
surface-positions/spoiler-pos-norm
surface-positions/speedbrake-pos-norm
controls/lighting/beacon
controls/lighting/cabin-lights
controls/lighting/landing-lights
controls/lighting/nav-lights
controls/lighting/strobe
controls/lighting/taxi-lights
Also improve take-off behaviour
Fix various places Valgrind identified as read-of-un-inited. Also
fix use of frequencies are integers: always use a double type explicitly,
which will make MSVC happier.
FGFX isA SGSampleGroup, but owns some SGXmlSounds, which also take an
owning ref to their sample group. Clear out the XMLSounds on unbind(),
to break the circular reference.
- fgfs --language=fr-FR now works as expected for the launcher (also with
--language=fr_FR as before): the value added by option --language to
the _languages member of FGLocale is normalized in "underscore" style
(e.g., fr_FR).
- Add-on translations must now use a hyphen in their property node names
in addon-metadata.xml (talking about children of <localized>): i.e.,
use for instance <fr-FR> there, not <fr_FR>. An exception
(addons::errors::error_loading_metadata_file) is thrown if one of
these nodes has a name containing an underscore.
Helipads were not being shown for convention airports, only for
heliports. Fix this up so helipads work alongside runways at
conventional airports, when the selected aircraft is a helicopter.
Set the menu action roles to avoid the text heuristic, which erroneously
confuses our configuration menu items with preferences and moves them.
Fixes bug:
https://sourceforge.net/p/flightgear/codetickets/2253/
Will pick to 2018.3, 2020.1 and 2020.2 since it’s nicely self-contained
and rather annoying.
Allow add-ons to define an FGData subdir, and support multiple —data=
command line arguments, to avoid the need to modify FG_ROOT (which might
be read-only). Allow additional data paths to be either higher or lower
priority than FG_ROOT, so that add-ons cannot replace files in FG_ROOT.
Suggested on the tracker, keep log files around longer. Currently we
keep the previous ten files.
Note we still don’t log for secondary running copies, since this would
violate the ‘only one copy can write to FGHome’ principle.
https://sourceforge.net/p/flightgear/codetickets/2243/
This avoids crashing when using Qt : we cannot call exit() safely since
QGuiApplication won’t shut down correctly. Instead throw a special
marker object and catch this in boostrap.
For an instance of this, see:
https://sourceforge.net/p/flightgear/codetickets/2070/
-D shows speed and drag values at fixed altitude.
--aD shows best speed at different altitudes.
Example:
yasim fgaddon-git/Harrier-GR3/Harrier-GR3.xml --aD
Results in tooltips for instrument needles, and control surfaces.
Enabled with /sim/rendering/automatic-animation-tooltips/enabled.
The max number of auto-created tooltips can be specified in
/sim/rendering/automatic-animation-tooltips/max-count (too many can cause
problems, e.g. on 777 i had to set max to 45).
src/Model/acmodel.cxx:fgLoad3DModelPanel(): pass new property values to
simgear::SGModelLib::loadModel(), so we can have auto-created tooltips for
animations in the user's aircraft.
[This all requires matching changes to simgear.]
We get away with things without these includes because
the build concats lots of C++ files together into
build/flightgear/src/GUI/fglauncher_autogen/mocs_compilation.cpp and luckily
earlier ones had the right includes.
Continuous replay:
If the user replays a continuous recording from file and then end replay
with the 'My controls' or 'End replay' buttons, we now forget about the
continuous recording. This enables the usual in-memory record/replay to be
used subsequently. Also added a '-continuous' suffix to continuous fgtape
filenames.
New recovery system:
If /sim/replay/recovery-period is set and greater than zero, we
periodically save a single-item continuous recording to a recovery file
called <aircraft-type>-recovery.fgtape (with no date or time in the name),
doing so in such a way as to ensure that there is always a valid recovery
file even if flightgear crashes. One can then resume the flight from the
most recently-saved point by loading this from within flightgear or with
the --load-tape=... option.
Also did a fair amount of refactoring and tried to clarify the different
property nodes that we embed within recordings.
This background recording keeps the user aircraft stationary while recording
all movements of multiplayer aircraft. Allows one to look at replay without,
for example, disturbing continuous record to file.
This allows full-fidelity recordings of arbitrary length (limited only by disc
space) to be created and replayed. These recordings always contain multiplayer
information, regardless of /sim/replay/multiplayer.
When an uncompressed recording is loaded, it is not copied into memory. Instead
we extract individual frame information as required when replaying.
Recording to file is activated by setting /sim/replay/record-continuous to
true. We use the same filename pattern as ordinary fgtapes. The file format
is similar except for being uncompressed (so that replaying can seek within
the recording; gzip etc don't seem to support seeking within the uncompressed
stream.)
Lars T identified some cases where the launcher would fail to include
local aircraft due to them using weird ways to include additional
XML into their -set.xml. Add a temporary resource provider while the
launcher is scanning, to make this work.
Will pick to LTS branch once verified.
Was being shown before locale was selected, so always using default
translation. Fixed by deferring the dialog, and also added an assert
for debug builds, if trying to access translated string too early.
With this change, “Reload Input” will discover newly attached devices
on macOS, which previously did not work.
Also add correct detection of disconnected devices, which previously
was not handled well, especially with the new ‘keep trying to open
devices’ behaviour of FGJoystickInput.
Should fix:
https://sourceforge.net/p/flightgear/codetickets/2259/
Overlay menus work better than native popups for most use-cases, and
simplify integration (no window focus changes). Switch the remaining
menus to always use the overlay system
As part of this, fix how Overlay positions are adjusted, to avoid
the ugly zero-interval timer.
Fgtape:
If multipayer replay is active we write multiplayer packet information to
fgtape files. We also add /sim/replay/multiplayer to the properties written
to fgtape file so at load time we knows whether to expect multiplayer
packets.
New builds of fg can load and replay old recordings.
It is expected (but has not been tested) that old builds of fg will be able
to read new fgtape recordings where /sim/replay/multiplayer was unset or
false (currently the default).
Old builds of fg will not be able to load fgtape recordings that include
multiplayer data.
Avoid incorrect removal of multiplayer aircraft when replaying:
We now clear multiplayer motion history when we jump forwards or backwards
during replay. This ensures that multiplayer code doesn't remove
multiplayer aircraft because of inconsistent-looking time stamps.
We preserve some multiplay information when purging recorded information
to save space. This ensures that when replaying we get frequent enough
packets to avoid the multiplayer code thinking that multiplayer aircraft
have disappeared.
At the moment this only works for live replays - we don't (yet) write the
multiplayer information to fgtape files.
Enable with:
--prop:bool:/sim/replay/multiplayer=true
This works by copying all raw multiplayer packets into a buffer in
FGMultiplayMgr. Each time it is called, FGFlightRecorder::capture() moves all
the available packet from this buffer into its FGReplayData. Thus we store
roughly syncronised multiplayer packets along with the user aircraft's detailed
replay properties.
When replaying, FGFlightRecorder pushes packets into a buffer in
FGMultiplayMgr, which are used instead of live multiplayer packets. [Actually
when replaying FGMultiplayMgr still reads live packets in order to handle live
chat messages, and ignores chat messages from FGFlightRecorder.]
Ensure /orientation/heading-magnetic-deg, etc have a type of double
immediately. Showed up as a bug in the SenecaII, since the property
is created but has NIL value until the first update() call.
Both the route-path cade and the RNAV code were using some bad logic
to compute the intersection point. All fixed now, but requires a
new helper in Simgear.
Remove the non-functional turn-anticipation code from the GPS, and
enable fly-by mode in (some of the) RNAV controllers: initially the
leg controller.
The new config property is gps/config/enable-fly-by, defaults to off
for compatibility.
Previously, the Nasal files in fgdata/Nasal/*.nas were loaded in
file-name order. This created a particular problem file files
beginning with "a" which might want to use props.nas.
This adds support for an ordered list of files to be defined
in the property tree that will be loaded before the rest of the
Nasal files.
Avoid encoding test-data as strings, since this exceeds MSVC limits
on string literals, and tests don’t need to be relocatable anyway,
so we can just hard-code the source location into config.h
Overhaul how transitions are stored in FlightPlan XML, and how
they’re exposed to Nasal. Simplify the Nasal access by making
‘sid_trans’ and ‘star_trans’ writeable.
Extend the unit-tests a lot to cover this, both from C++ and also
from Nasal
As part of this, overhaul the ownership of FlightPlan delegate
factories, to make it safer (use ref-counting of the factories,
and allow the factory to customise delegate clean-up behaviour)
Make FlightPlan::findIndexOfWp use the correct ::matches() method,
and special case this for basic waypoints. This fixes the behaviour
when loaded routes / procedures store a navaid-waypoint as basic.
Where the plan does not contain departure / arrival WPs, fire the
corresponding delegate methods after load, to run the selection logic.
Also, add a ‘loaded’ delegate callback, to give delegates a chance to
perform validation and fix-up after all flight-plan loads.
Re-work how position-init and ATC-manager work together to do
parking assignment and fallback (when the parking is unavailable).
Improve the logic for the reposition case, and teach ATC-manager about
reposition explicitly.
When the parking is unavailable, explicitly fall back to best-runway
selection in finalizePosition.
Add many additional position-init tests, to cover all of this.
This avoids an issue where the dialog doesn’t update on macOS, if it’s
shown immediately after a native message box, such as the migration
warning dialog.
Previously /sim/current-view/viewer-[lon|lat]-deg were set to
(0,0) when a view was bind() for the first time by the view
manager. This cause the scenery tile cache to immediately clear
and all scenery to be reloaded.
Now these values are set correctly the first time the view
bind() is called, so the cache behaves correctly.
Also fixed what looks like a possible bug on code read where
the tiles of the current view had a very short expiry time
set. Seems wrong.
Add translation macros for the text of the lock-file warning dialog,
and update the default text after some discussion on the devel list.
Also allow quiting the app, as an alternative option.
Speculative fix for a reposition assert which Huntley is seeing:
https://sourceforge.net/p/flightgear/codetickets/2229/
Unclear why it’s not happening for me other some other folks, but this
should logically be the correct fix. Let’s find out.
Only the in-sim version works for now, the test-suite mode is not
implemented yet. Also the test API will evolve, but should stay close
to what CppUnit defines.
Run a test file by specifying a path to nasal-test : examples will be
added to FGData shortly.
See ticket:
https://sourceforge.net/p/flightgear/codetickets/2133/
Give the user a chance to intervene, if we select read-only mode.
Offer a button to clear the lock file if it’s stale, and start in
read-write mode.
This is still evolving, but want to get some feedback on it.
Fix for: https://sourceforge.net/p/flightgear/codetickets/2059/
When copying addon-config into the main property tree, skip props
which already exist and which are marked ARCHIVE, on the assumption
they came from autosave.xml.
When load a GPX route, run normal departure/arrival airport callbacks
on the delegates. (They are blocked for ‘native’ XML routes to avoid
losing SIDs and STARs)
https://sourceforge.net/p/flightgear/codetickets/2227/
Similar to enable-velocity-vector, but indicates velocity relative to ground,
rather than velocity relative to air. E.g. useful for crosswind landings.
To support FMS which delete ‘past’ waypoints, add some helpers:
- waypoints can be flagged as hidden, this property is exposed to Nasal
- currentWP() accepts an offset parameter, allowing FlightPlan indexing
to treat the current WP as index 0
- a ‘numRemainingWaypoints()’ function on flightPlan in Nasal, again
to range how many waypoints are left, starting from the current WP
Add some basic tests of these new features to the route-manager tests.
Bug report and testing by Jonathan Redpath (see details in issue #276 at GitHub).
The check of FGInterface::get_agl_ft return value has been discarded a few years ago (commit 86b346) on the ground that the method was returning a meaningful altitude above ground level even if it failed.
See mailing lists discussions:
https://sourceforge.net/p/flightgear/mailman/message/32246380/https://sourceforge.net/p/flightgear/mailman/message/32247050/
There is no indication however that the other parameters are populated with meaningful values when FGInterface::get_agl_ft reports an error. The returned `material` pointer is therefore discarded when an error is reported. Ground reactions are still processed in all cases as was decided in 2014.
Took the opportunity to initialize the `material` pointer to null, to avoid yet another problem with unitialized values.
Some members were used before being initialized in FGPiston which could randomly generate invalid floating point values that could propagate to many places in JSBSim.
As a cure to the problem, all variables are now initialized to valid default values in the header (as allowed by C++11). The constructor is only expected to set the members to meaningful values.
Add some tests for the default GPS / route-manager handling of
DISCON in flight-plans. Especially check behaviour when sequencing
a DISCON, and resuming with a Direct-to after one.
This requires a corresponding FGData update to the default GPS Nasal.
This adds the names of the available parking positions/catapults
to the property tree, so we can build a suitable in-sim list
of parking positions for users to select from.
Takes special values "FLOLS" and "abeam" to set up
aligned for final approach or at the 180 for the carrier flight
deck. Or alternatively a catapult or parking position.
This fixes an error where the ‘serviceable’ property is tie()-ed twice.
The actual AP components don’t use bind (and aren’t created until init(),
so this only affects the serviceable property.
Only consider actual taxi nodes, not parking positions, as potential
hold-short locations, when doing an MP runway-start relocation. This
avoids some odd behaviours for groundnets which only define
parking positions and nothing else.
Support for --carrier-abeam option, which places the aircraft
at the end of a downwind opposite the FLOLS.
Add launcher support for above.
Add carrier display for launcher showing position relative to
carrier.
Previously YASim set /controls/gear/gear-down during startup
depending on whether the aircraft was on the ground or in the air.
As YASim initialization takes place after the overlay is applied,
this over-rode any setting from the overlay.
This change adds a property which can be used by an overlay to
ensure that its /controls/gear/gear-down configuration is not
over-ridden.
Reinstate lod/rough and lod/bare and therefore fix the use of range animations that implement hardwired LOD.
Initially I was reluctant to do this - but after a lot more research I'm no longer convinced that range animations cause a huge performance hit and so we can keep this fix until either the scenery is fixed or the situation becomes clear.
Ideally this fix should be reviewed prior to the next LTS release; or maybe after the next LTS release - but in future reviewed it must be
making the build between Simgear and Flightgear consistent.
- Fix an issue with lib/lib64 path between CentOS/RedHat distributions
and Debian derived distributions.
- Fix a compilation issue with HLA in the Flightgear code.
The base (non-FlightGear) implementation of YASim ground getBody
would always call itself. Fortunately we always replace it with the
FG-specific subclass (FGGround).
Aircraft rah-66 has a bug where it sets root node to type BOOL, which breaks
ViewPropertyEvaluator::getDoubleValue's handling of default values - the string
value of the node is no longer an empty string so we ended up returning 0.0 or
1.0 instead of default_.
The fix is to special-case BOOL. Have also special-cased handling of the root
node, as this is a fairly important part of how ViewPropertyEvaluator works.
Allow selecting carriers from scenarios, and starting at either a
parking position, or a distance offset from the FLOLS (effectively
a crude ‘on-final’)
Extend the —carrier startup option to accept a runway ident of FLOLS,
in conjunction with the existing —offset-distance argument.
Previous implementation wasn’t correct, use a better one now. In the
case of a non-clean exit we will leave a stale .pid file in FG_HOME,
but we clear stale files on the next launch.
We only look at config/eye-lon-deg-path etc if eye-fixed is true. This tag
should be set to true for all views where the eye position is fixed - e.g. all
Tower views plus Fly-By view in fgdata:defaults.xml.
This allows b26 turret views to work without requiring modifications to the
aircraft (which would break usage with older releases of fgfs).
Requires corresponding SimGear change. With this last round, we work
with FGData on non-Latin1 path on Windows. (Final fixes are for
Nasal io.readfile, which needed io.stat to work, and SGSky allowing
correct SGPath use)
Replace the default io.stat with one which uses our validator, and
uses SGPath to call _wstat on Windows. This does mean we return less
information in the stat() result, but it seems nothing actually uses
the result apart from checking if the file exists.
Mark images loaded from splash with origin of splash to prevent use of DDS texture cache and therefore fix distortion by preventing rescale to power of two
Still not complete, but now we set the command line args to be UTF-8 on
Windows, we can strip out more of the ‘local 8-bit’ places (which
screw up, generally).
When loading -set.xml, we load into temporary 'set' node,
then copy across only set/sim/view[]/config/* values into
/ai/models/multiplayer[]/set/sim/view[]/config/.
This ensures that we have just the information required for multiplayer views,
and avoids problems where some properties in /ai/models/multiplayer[]/ were
being archived to autosave_*.xml and loaded in later flightgear sessions.
Calling fgSetXY/fgGetXY takes to long (especially when calling the often needed properties a few times per second in main loop).
Switching to pointers for these nodes, initialized within service-class constructor.
- Fix Leg ownership to avoid segfaults when deleting them via Nasal
- Modify FP save/load code so restrictions and holds are correctly
saved and restored
Extend the tests to cover these cases.
Some AMD drivers do not like triangles for point sprites, which
breaks directional lights. This works around this by allowing
users to set /rendering/triangle-directional-lights=false which
falls back to the non-directional implementation of a point.
This is only for a MSVC build - sets the runtime path for the exe run in
the following 'add_custom_target( ... run fgrcc ...)' ...
modified: src/EmbeddedResources/CMakeLists.txt
Refactor to break circular references.
New custom target generates the resource files.
FGFS and Test_Suite targets declare a dependency to the generated files.
Nodes might be uninitialized when a channel is initailly disabled. To work around that issue, the initialization of the output nodes is forced at creation.
- Electric engines RPM is now exported in UDP sockets.
- The sign of the XZ inertia has been fixed in the property inertia/ixz-slug_ft2 (was just an output error, the correct XZ inertia was used internally). Thanks to Nikolai Verner Christensen for reporting the bug.
- The parameter <ignitionn2> was wrongly affected to N1. Bug reported by Nikolai Verner Christensen and fixed by Jonathan Redpath. Thanks to them.
This prevents the changing of the logstream priority as set by the test suite
permanently to "alert" during the execution of tests. Setting a default value
of SG_ALERT is not required as this is the simgear logstream default anyway.
We set /environment/metar/description to human-readable description of metar,
for use by fgdata's weather dialogue, using simgear FGMetar's new description()
method.
Use a new SGPropertyNode flag, LISTENER_SAFE, to white-list properties
where we do correctly fire listeners, and test this flag when listening
from Nasal, to avoid the warning.
One test so far, attempting to reproduce a bug I see with the 737.
Note these tests are skipped unless you have procedures available
and set a magic env var to find them.
Ensure changes from Nasal are picked up by delegates (such as GPS) when
they are made. Add a route-manager test which sets and exits a hold
using Nasal.
As part of this, update the test API to make it easy to run Nasal from
a test.
The GPS/RNAV system can now fly holds, both left and right-handed.
The correct entry is selected, and hold count can be selected.
Also there's lots of lovely test cases.
Avoid screwing up the derived / trend data when we are repositioned;
detect instantaneous position changes and don’t update the trend
data in this case.
GPS now lets the delegate handle the sequencing behaviour, by
setting a new config property. The default GPS delegate (in Nasal)
now sets this property.
This requires a corresponding FGData update.
- set wp[1] properties immediately (don’t require an update cycle)
- direct-to course-error is correct when init-ing the Direct-To; it
was previously wrong when beginning the DTO, due to invalid course
between identical SGGeods.
FlowRegime to wing definitions). (Daniel)
//amended according to James hints: change initializer to float constants, fix indention issues, add Math::polynomial and use it in Surface. (Henning)
The existence of the property that is used for <table> independent vars is now checked during execution rather than when the XML definition is parsed. This relaxes the order in which filters, table and more generally flight controls need to be declared in the XML definition files.
E.g. fgaddon/Aircraft/Icaro_MRX13/Icaro_Laminar_13_MRX-set.xml sets
/sim/current-view/view-number to 9.
It seems that recent View changes broke this, but this fix is in unchanged
code.
Prior to the recent multiplayer view changes, /sim/current-view/?-offset-m
contained the current view's offsets from /sim/view[]/config/?-offset-m. The
multiplayer view changes modified things to set /sim/current-view/?-offset-m
to zeros, and instead use /sim/view[]/config/?-offset-m. This was so
that multiplayer views could be implemented simply by prefixing with
/ai/models/multiplayer[]/set/ to get the right offsets.
We still added in /sim/current-view/?-offset-m, but these were usually zero.
However some aircraft write to /sim/current-view/?-offset-m, and assume that
values must include the /sim/view[]/config/?-offset-m. E.g. the spaceshuttle
does this in order to simulate SRB shaking. This results in the offset being
included twice, which breaks things.
So this commit restores the original handling of /sim/current-view/?-offset-m
by doing an additional subtraction of /sim/view[]/config/?-offset-m. It also
avoids resetting /sim/current-view/?-offset-m to zeros when the view changes.
This results in views working for user aircraft, user aircraft that do custom
view handling, and multiplayer aircraft.
- [Backward compatibility breakage] Gyros are now measuring rotation rates instead of rotational accelerations. Gyros that measure rotational accelerations do not exist in the real world.
- Output properties of flight control elements are no longer tied. This saves a lot of spurious warning messages and allows direct references of the same properties among several flight controls.
- Water vapor in the atmosphere is now managed through its mass fraction rather than its partial pressure. The former being the physical quantity that is conserved when pressure and temperature vary.
- Check that there are at least 3 contacts before trying to trim on ground.
- ECEF to ECI frame conversion has been moved from FGLocation to FGPropagate and FGInitialConditions since not all FGLocation need to manage that.
- Gravity computations have been moved to FGInertial because it is where all the constants to compute gravity are stored. This reduces the amount of data transmitted between FGInertial and FGAccelerations.
- Added optional transmission of the simulation time for FG UDP interface
- Code cleanup and use more C++11 idioms (override, constexpr, range-based for loop, etc.)
We now keep the aircraft in view when zooming, sacrificing the view of the
ground. I.e. we move the bottom of the view upwards, while keeping the top of
the view unchanged.
Recent changes to ViewPropertyEvaluator mean that
ViewPropertyEvaluator::getDoubleValue() doesn't handle default values very
well, so we were ending up with chase-distance of zero, not the default -25,
leading to over-zooming.
Un-caching of scenery appears to happen fairly often, and means that we fail
to find height of ground under aircraft, so we now go back to the last found
value instead of using zero.
This allows Tower View etc to use nearest tower when vewing remote multiplayer
aircraft.
Also force an update of nearest airport whenever multiplayer view changes, to
reduce delay before Tower View works.
SGVec3d's default constructor leaves the fields uninitialised, which seems to
sometimes break fg with lots of NaN-related diagnostics.
The fix is to use SGVec3d::zeros() instead.
Also call resetOffsetsAndFOV() from the View::View() constructor, to ensure
that things are set up consistently.
View 8 used to be new Tower View AGL view, but this interfered with hard-coded
aircraft view numbers. So fgdata now has removed Model View, meaning Tower
View AGL uses Model View's old number (7), which keeps sequential view numbers
unchanged.
src/MultiPlayer/multiplaymgr.cxx
src/MultiPlayer/multiplaymgr.hxx
removed starts_with() and ends_with() - already provided in simgear::.
removed output() fn for SGPropertyNode, as unused.
added makeStringPropertyNameSafe().
FGMultiplayMgr::addMultiplayer(): use std::find_if() to find model file.
added FGMultiplayMgr::subsystemName().
src/Viewer/view.cxx
src/Viewer/view.hxx
removed getDoubleValue() as not required.
moved agl code into new View::handleAGL() fn.
renamed View::Damping::setGet() => View::Damping::updateTarget().
Currently this works for all the default views except for Tower Look From (for
which it doesn't really make sense) and Fly-by View.
We now search for and load a -set.xml that matches the model .xml,
when new multiplayer aircraft is set up. This allows us to find view
offsets etc, e.g. allowing cockpit and helicopter views to work with
multiplayer aircraft. Properties from the -set.xml are placed into
/ai/models/multiplayer[]/set, so for example viewing offsets are in
/ai/models/multiplayer[]/set/sim/view[]/config/target-{x,y,z}-offset-m. We also
copy the aircraft's chase-distance into the view config params, similar to how
fgdata:defaults.xml does for the user's aircraft. And we also fill in views'
missing offsets from the Helicopter View config; e.g. this enables the new
Tower View AGL to show aircraft correctly centred, despite aircraft currently
not having this view defined in their -set.xml. [We don't currently attempt to
cache or reuse -set.xml data.]
Have ensured that view position responds to mouse movement in the same way for
viewing the user's aircraft as for multiplayer aircraft (previously, Model View
reversed the affect of vertical mouse movements).
Added new Tower AGL view. Behaves similarly to Tower view, but automatically
scales and pans vertically in order to always show the vertical range
extending from just above the aircraft down to the ground immediately below
the aircraft. We use aircrafts chase-distance as an indication of size. We
damp the ground level value to reduce the viewing jumping around too much
e.g. if the aircraft flies over buildings. The amount of damping is set by
fgdata:defaults.xml's lookat-agl-damping value.
Fixed problem where Tower View eye position moves slightly as target
aircraft heading changes. This was caused by us unnecessarily applying the
aircraft-centre correction to the eye position.
src/FDM/flight.cxx: also make /orientation/true-heading-deg. This allows
local orientation to be used like multiplayer orientation, which only
has /ai/models/multiplayer[]/orientation/true-heading-deg. [A better fix
might be to replace all occurrencies of /orientation/true-heading-deg with
/orientation/heading-deg, but this would be a rather large commit.]
Details:
src/Viewer/view.*: removed View::updateData() as is no longer required.
src/MultiPlayer/multiplaymgr.cxx: use helicopter view target offsets as
defaults. E.g. in tower view agl, aircraft won't currently be defining these
offsets. More generally, this allows aircraft to define target offsets only in
helicoter view.
src/FDM/flight.cxx
FGMultiplayMgr::FillMsgHdr(): Added tie of /orientation/true-heading-deg to
get_Psi_deg, so it duplictes the existing /orientation/heading-deg.
src/MultiPlayer/multiplaymgr.cxx
src/MultiPlayer/multiplaymgr.hxx
FGMultiplayMgr::addMultiplayer(): look for and load -set.xml that matches
the model. Patch various view-related things up in similar way to what we
do for the user's aircraft, so that multiplayer views work.
Made FGMultiplayMgr::getMultiplayer() public, so it can be used by
src/Viewer/view.cxx.
src/Viewer/view.cxx
src/Viewer/view.hxx
View::View(): Added lookat_agl, lookat_agl_damping params for new Tower
View AGL. Preserve user's field-of-view in separate variable so that Tower
View AGL can modify the actual field of view independently.
Added view_index param so that we can find multiplayer view[]/config/
properties.
getViewOffsets(): new fn that finds view offsets for user aircraft or
multiplayer aircraft.
View::recalcLookFrom() View::recalcLookAt: Lots of changes to allow things
to work with multiplayer aircraft. View::recalcLookAt() can now do Tower
View AGL.
View::Damping: support for damping, used by Tower View AGL. Might be good
to use this for other damping.
View::updateData(): removed, as calculations are now all done inside
View::recalc*().
put properties {x,y,z}-offset-m into new View::_adjust_offset_m member
instead of _offset_m. This avoids confusion between a view's offsets and
the offsets added in by the user via the 'Adjust View Position' dialogue.
src/Viewer/viewmgr.cxx
FGViewMgr::init(): pass view number to
flightgear::View::createFromProperties().
The _name, get_name(), and set_name() variables and functions have been removed.
The Component::get_name() function is now handled by Subsystem::subsystemId(),
and Component::set_name() replaced by SGSubsystem::set_name(). The
Component::_name variable is replaced by SGSubsystem::_subsystemId.
This is a clean up commit prior to the subsystem API standardisation to simplify
the diffs. It includes all SGSubsystem and SGSubsystemGroup derived classes.
Revert this change - I will re-add the unit-tests again, but we need
a different approach for 8.3 stations, than what I did here.
This reverts commit 91cc83abb5.
In 8.3 mode, ensure that 25 and 75Khz channels can be tuned using the
abbreviated syntax (eg 118.02 for 118.025).
As part of this, add test coverage of the CommRadio for basic and 8.3-
mode operation.
Deal with some cases in STAR -> approach routing better:
- when the IAF is the initial wpt of the approach primary sequence,
just accept this instead of warning. This is common in some XML
files from Navigraph, for example EDDF
- don’t duplicate the IAF into the wpts returned by Approach::route
- when add-noise is false, mute noise completely
- if the CommRadio is not powered by the generic electrical system,
work by default (as was previously the case)
Using Emesary Global Transmitter the following events are notified
* Frame Begin
* Frame End
* Mainloop started
* Mainloop stopped
This integrates with the background threaded Nasal Garbage collection (simgear:nasal/cppbind/NasalEmesaryInterface.hxx) and is also controlled by the properties as follows
* /sim/nasal-gc-threaded (true) - use background threaded GC
* /sim/nasal-gc-threaded-wait (false) - at the start of the frame wait for the previous GC thread to complete.
I initially thought that the wait at the start of the frame would be necessary; however in 100 or so hours of flight without the await for completion at the start of frame no threading problems (or any other problems) were shown; so nasal-gc-threaded-wait is defaulted to false which gives a slight boost in performance.
So what this does is to it removes the GC pause of 10-20ms every 4 seconds (test using the F-15). This change doesn't really give much extra performance per frame because normally GC is only performed when needed.
Neither Torsten nor I can recall why we continued to hard-code this,
so make it dynamic for now. When we remember why we hard-code it,
we can add a BigComment from future-James to future-future-James about
why not to do this again :)
Due to e43fe82094 models in AI scenarios were
being searched down the AI/Aircraft and Aircraft paths, where in fact
they are by default a full path from FGDATA.
This fixes the problem by setting DATA_ONLY as the search order.
Other search orders can be set in the scenario file by setting
the search-order tag to "DATA_ONLY", "PREFER_AI", "PREFER_DATA"
Based on the dew point temperature supplied by FG, JSBSim updates the atmosphere density and computes all the usual parameters (RH, vapor pressure, saturated vapor pressure, etc.)
The mass fraction of water per unit of air mass is capped according to the record high from ISA 1976 standard atmosphere. As a consequence, at very high altitudes, air is always extremely dry (approx. 30 ppm i.e. 30 parts per million) whatever the conditions at sea level.
Fix for https://sourceforge.net/p/flightgear/codetickets/2125/
Previously, selecting a non-pushback parking position from the l
auncher that did not have a ground network resulted in the
aircraft being placed in the center of the airport.
This resolves the problem by creating a default segment simply
moving forward 2m.
Since PLIBjs uses joyGetDevCaps()[1] on Windows and this function
accepts joystick ids from 0 to 15 (-1 being special), setting
MAX_JOYSTICKS to 16 ensures that FGJoystickInput::init() can scan all
joysticks that joyGetDevCaps() is able to report about.
[1] https://docs.microsoft.com/en-us/previous-versions/dd757105(v%3Dvs.85)
JSBSim was not checking the tag names inside <test> and <condition> statements and this has led to abusive use of tags unsupported by JSBSim such as <and> and <or>. The problem is that JSBSim was not interpreting the <or> statement as the user meant it: JSBSim interpreted it as <test logic="AND"> while the user obviously meant <test logic="OR">. As a result JSBSim silently swallowed the tag and gave results which were not was the user expected without any obvious indication about what was going wrong.
As a result, this commit implements stricter syntax checking and rejects illegal tags within <test> and <condition> statements.
This commit also introduces stricter checking on XML elements which allow either a real value or a property name to be used. JSBSim now rejects the statements where the property name is specified inside a <property> statement. For example, the follwoing statement is rejected:
<clipto>
<min> <property> /fdm/jsbsim/some/property </property> </min>
...
The correct syntax being
<clipto>
<min> /fdm/jsbsim/some/property </min>
Base class handles some common instrument features, such as the
serviceable node and electrical supply. The electrical supply node
and minimum voltage to operate can now be set in the configuration
via <power-supply>/path/to/output/volts</> and <minimum-supply-volts>
On this code path, AppKit uses exit, rather than letting main run as
normal. We handle most things via C++ destructors, which do run, but
Qt is happier if we clean it up explicitly.
- Fixed the scripts end time computation
- Fixed nested tests in switches
- Simplifications to the computation of the aerodynamics angles alpha & beta
- Account for the contact transition in the gear compression speed
- Fixed docs in FGTank
- simgear::strutils::readNonNegativeInt<unsigned int>() is better than
std::stoul() at detecting and reporting erroneous input (for one, it
checks that the given string *represents* an integer that fits in the
specified type, as opposed to just "starts with digits").
- The format version is now an unsigned int (just because it's largely
enough and simgear::strutils::readNonNegativeInt<unsigned long, 10>()
isn't instantiated for now).
- The format version is now printed to the log (it was already for
apt.dat files, but not for nav.dat files).
Instead of doing an illegal memory access (to fields[0]), properly
report the problem when the line that is supposed to contain the format
version of a nav.dat file is empty.
- PTT will now use whatever channel is selected; non zero simply means PTT active.
- The volume as set in the comm[]/radio will now be used as a factor on the FGComm volume
PTT now uses an int channel number (0 means not pressed, 1 = comm radio 1 (index [0]),etc...)
/comm-radio-selected is the default comm channel to use. This should usually be the same as will be set by PTT into /controls/radios/comm-ptt
However PTT will switch the FG comm inbound and outbound frequency to whichever radio was PTT'd.
New properties also set in multi-player to indicate the transmission frequency and normalised power (currently just set to 1.0)
13001(int) : sim/multiplay/comm-transmit-frequency-hz
13002(short-norm) : sim/multiplay/comm-transmit-power-norm
- New system component linear_actuator from Adriano Bassignana.
- Bug fix of Euler angles computations in FGMatrix33 (a pure westward heading of 270 deg was erroneously converted to a pure eastward heading of 90 deg). This could make the aircraft trimming fail when spawning with a heading of 270 deg.
Problem seen with Nasal setChildren/setValues where names were not
being passed down the stack. Identified as over-zealous IF_DEF
to remove unused variable compiler which meant snprintf was not being called
for non debug builds (see c177aeb623)
Fix is to change assert() calls to an naRuntime error, which ensures
that the len variable is always used and is
more appropriate as buffer overrun could occur in any release build if
someone tried to set a name of >1024 characters.
Assuming this should have been ‘vertical-mode’ all along, since the
corresponding other mode property is called ‘lateral-mode’. Make an
alias to the old name to keep existing scripts working.
Enhancements suggested by Nikolai Verner-Christensen - support loading
scenarios from {FG_HOME}/Scenarios, {aircraft-dir}/Scenarios and
{add-on}/Scenarios.
Additionally, allow passing the path to a scenario file to
—ai-scenario, eg —ai-scenario=/home/jmt/FGFS/my-test-scenario.xml
When a scenario defines a carrier, and —carrier is used to request a
carrier start, we now auto-load the corresponding scenario, to give
a nicer user experience.
This will use the inherently unsafe versions of the load methods which can result in deleting an object (from the cache) that has just been loaded in the database thread.
Symptom OSG WARN deleting still referenced object.
branches next, origin/next
Format fgfs-YYYYMMDDHHMMSS[-#] where the # is for the rare case when there are multiple screenshots per second.
The change makes the filenames sortable based on date and slightly improves run time performance when there are a lot of screenshots in a particular directory
Adjust the special NavCache function used for airport search, to
allow filtering by type (which is exposed in an upcoming patch to the
dialog code).
Patch by Daniel Wickstrom
Properties /consumable/fuel/tank[*]/unusable-* supplied in the -set.xml file are propagated to the aircraft model and accounted for in the tanks management.
* <function> and <fcs_function> that are only applied on constant parameters are now recognized and replaced by their result during initialization.
* Fixed a regression which prevented the wheels rotation speed to slow down while the gears were retracted.
* Added the ability to control the turbine engines spin down factor (thanks to Jonathan Redpath for the pull request).
* Internals : JSBSim has been refactored to use FGPropertyValue in many FCS components. This will allow consistent behavior accross the FCS components including the ability to prepend property names with minus signs '-' to indicate that the opposite sign of the property should be used.
lag compensation, this is the time manager part.
- introduction of a pure steady clock initialised from system clock at init
- the mp protocol clock have an offset available (will be used
to sync the players, in case ntpd is not accurate or inavailable)
- got a way to see drift between system clock and the fg steady clock, mainly
to see how differents OS behave ...
The problem was using FLT_MAX, FLT_MAX to disable a model; this tricked OSG into thinking that FLT_MAX was a valid range and therefore didn't do the update traversal (found by Stuart).
The correct technique to disable a model is to set the min/max range to 0,0
Also generally improved the way that the ranges are managed.
Maps foo=bar arguments to the top-level arguments dictionary of the
command, as strings only. (We could add CMake style foo:type=bar in
the future if needed). Very basic but this enables a bunch of useful
cases, since SGPropertyNode will do value conversion from string on
access.
- avoid updating the formatted frequencies each update()
- reset the station search timer when frequencies change
This should make the radio a bit more responsive (which aids testing
since we don’t need to wait for the search timeout when changing
frequencies)
- pass texture cache control properties to simgear
- /sim/rendering/texture-cache/cache-enabled
- /sim/rendering/texture-cache/compress-transparent
- /sim/rendering/texture-cache/compress-solid
- /sim/rendering/texture-cache/compress
- support --texture-cache-dir command line option
- set max reported supported texture size during splashscreen.
If a model is marked as <usage>interior</usage> there were a number of problems.
1 - the LOD setting AI/MP interior used the distance from the aircraft; this obviously doesn't quite work for when using the model view.
2 - with the way that models are now loaded as two LOD levels only the interior from the first model loaded (usually the lowest detail) would be considered or processed because the model loader had marked itself as already run (which it had, but not for the model that was actually just loaded.
(2) above could also be the cause of other things not working because the nasal model loaded would not be called, nor would the sound path be setup. There could be other things that aren't working properly because the assumption is that there is just one model.
The fix for (1) is to use the standard OSG PagedLOD and let it handle the details, so I've changed the interior to use this and removed the distane from ownship checks.
The fix for (2) is to use a map to decide if the model that has just finished loading has already been processed, and if not then proceed as normal.
Change the single model case to always set the range on the only model rather than the constant modelHighDetail. This is a regressions caused by the change from 0 to modelHighDetail and the reordering the list. When there is only one model the setRange must always refer to model range index 0.
- This could have caused models to not display correctly.
The feature fail_hardover of the <actuator> component was not giving the correct output in some occurences when clipmax was smaller in absolute value than clipmin.
Tables CORNERING_COEFF could not be used for BOGEY contact points.
No longer throw an exception when the `internal` keyword of a table is ignored.
The location where errors have been found are now reported.
Rework the LOD ranges.
1. The scenery ranges are now deltas (avoids overlapping values)
2. The AI/MP pixel mode now has a default radius that is 20 for Aircraft, 200 for ships, 350 for carriers. This is a simple constant in a virtual function.
3. Added the ability to set the AI/MP ranges equal which means use the low detail model.
4. Changed high detail only to be indicated by a -ve number in maxRangeDetail
5. Re-ordered the range list to go from lowest detail at [0] to highest detail at the end. This is because OSG always loads the models starting from zero on the assumption that the detail increases with the index.
This fixes the pixel mode, which previously would use the radius of the parent which would be confusingly large, and unrelated to the actual size of the model. With the simple defaults that we have the pixel values set in the ranges won't exactly match the rendered size of the model on screen, but it will be a lot closer and more importantly meaningful.
The following new features have been added to JSBSim:
* Added the ability to set up the starter and acceleration times of a turbine (parameters <n1spinup>, <n2spinup>, <n1startrate>, <n2startrate>).
* The <integrator> filter can now be reset to 0.0 by setting its <trigger> property to a negative value.
* The integration scheme of the <integrator> filter can now be chosen among "rect" (Euler), "trap" (Trapezoidal), "ab2" 2nd order Adams-BashForth and "ab3" 3rd order Adams-Bashforth
* The following functions can now be used in <function>: floor, ceil and fmod. Their functionalities are the same than the corresponding C/C++ functions.
The following bugs are fixed by this commit:
* PID integration with the 3rd order Adams-Bashforth was inccorect.
* The fail_stuck property of sensors (accelerometers, magnetometers, gyro, etc.) without a <lag> element was setting the output to zero instead of sticking to the last output value. Thanks to Jonathan Redpath (aka legoboyvdlp) for the bug report.
* When a sensor was stuck, the drift, gain, bias and quantization of the last output before being stuck were ignored. Thanks to Dennis J. Linse for the bug report.
Due to how the popup menu was refresh, using MP servers at index 0 or 1
didn’t work correctly. Change some logic and add a helper to make this
work reliably, without a second Repeater and dummy properties.
Expand the range of filtering options on axis values to include the
optional use of an interpolation table, which gives many more options
when dealing with some devices.
When the lat-lon of a waypoint disagrees with the discovered ident by
more than a threshold, assume we have a DB mismatch, and just revert
to a basic wpt specified by lat-lon. This avoids inserting huge
legs by selecting a very distant navaid with matching ident
https://sourceforge.net/p/flightgear/codetickets/1814/
* Disables dew point transmission as the humidity model is not handling the case where the vapor saturation pressure gets higher than the ambient pressure.
* Removed computations for temperatures at very high altitudes as they don't match with the rest of JSBSim atmosphere model.
Use an internal window (instead of a real OS window) for popup choices,
and cap the maximum size. Use a scrollbar when the number of items is
too large, and adjust the position to fit in the window.