diff --git a/src/Airports/groundnetwork.cxx b/src/Airports/groundnetwork.cxx index c20cf2bea..18db6c0a6 100644 --- a/src/Airports/groundnetwork.cxx +++ b/src/Airports/groundnetwork.cxx @@ -272,7 +272,7 @@ FGGroundNetwork::~FGGroundNetwork() bool saveData = false; ofstream cachefile; if (fgGetBool("/sim/ai/groundnet-cache")) { - SGPath cacheData(fgGetString("/sim/fg-home")); + SGPath cacheData(globals->get_fg_home()); cacheData.append("ai"); string airport = parent->getId(); @@ -316,7 +316,7 @@ void FGGroundNetwork::saveElevationCache() { bool saveData = false; ofstream cachefile; if (fgGetBool("/sim/ai/groundnet-cache")) { - SGPath cacheData(fgGetString("/sim/fg-home")); + SGPath cacheData(globals->get_fg_home()); cacheData.append("ai"); string airport = parent->getId(); @@ -432,7 +432,7 @@ void FGGroundNetwork::init() //cerr << "Done initializing ground network" << endl; //exit(1); if (fgGetBool("/sim/ai/groundnet-cache")) { - SGPath cacheData(fgGetString("/sim/fg-home")); + SGPath cacheData(globals->get_fg_home()); cacheData.append("ai"); string airport = parent->getId(); diff --git a/src/GUI/gui_funcs.cxx b/src/GUI/gui_funcs.cxx index 82a481772..1da13da29 100644 --- a/src/GUI/gui_funcs.cxx +++ b/src/GUI/gui_funcs.cxx @@ -483,7 +483,7 @@ namespace if (_path.create_dir( 0755 )) { SG_LOG(SG_GENERAL, SG_ALERT, "Cannot create screenshot directory '" << dir << "'. Trying home directory."); - dir = fgGetString("/sim/fg-home"); + dir = globals->get_fg_home(); } char filename[24]; @@ -588,7 +588,7 @@ bool fgDumpSnapShot () if (path.create_dir( 0755 )) { SG_LOG(SG_GENERAL, SG_ALERT, "Cannot create screenshot directory '" << dir << "'. Trying home directory."); - dir = fgGetString("/sim/fg-home"); + dir = globals->get_fg_home(); } char filename[24]; diff --git a/src/Input/FGDeviceConfigurationMap.cxx b/src/Input/FGDeviceConfigurationMap.cxx index 1991daaef..5680149f1 100644 --- a/src/Input/FGDeviceConfigurationMap.cxx +++ b/src/Input/FGDeviceConfigurationMap.cxx @@ -39,6 +39,7 @@ FGDeviceConfigurationMap::FGDeviceConfigurationMap( const char * relative_path, childname(aChildname) { int index = 1000; + scan_dir( SGPath(globals->get_fg_home(), relative_path), &index); scan_dir( SGPath(globals->get_fg_root(), relative_path), &index); PropertyList childNodes = base->getChildren(childname); diff --git a/src/Input/FGJoystickInput.cxx b/src/Input/FGJoystickInput.cxx index 041fcc2e1..046106abe 100644 --- a/src/Input/FGJoystickInput.cxx +++ b/src/Input/FGJoystickInput.cxx @@ -104,6 +104,7 @@ void FGJoystickInput::init() jsInit(); SG_LOG(SG_INPUT, SG_DEBUG, "Initializing joystick bindings"); SGPropertyNode_ptr js_nodes = fgGetNode("/input/joysticks", true); + status_node = fgGetNode("/devices/status/joysticks", true); FGDeviceConfigurationMap configMap("Input/Joysticks", js_nodes, "js-named"); @@ -310,6 +311,16 @@ void FGJoystickInput::update( double dt ) js->read(&buttons, axis_values); if (js->notWorking()) // If js is disconnected continue; + + // Update device status + SGPropertyNode_ptr status = status_node->getChild("joystick", i, true); + for (int j = 0; j < MAX_JOYSTICK_AXES; j++) { + status->getChild("axis", j, true)->setFloatValue(axis_values[j]); + } + + for (int j = 0; j < MAX_JOYSTICK_BUTTONS; j++) { + status->getChild("button", j, true)->setBoolValue((buttons & (1u << j)) > 0 ); + } // Fire bindings for the axes. for (int j = 0; j < bindings[i].naxes; j++) { diff --git a/src/Input/FGJoystickInput.hxx b/src/Input/FGJoystickInput.hxx index 45de33f94..1ab5a6f59 100644 --- a/src/Input/FGJoystickInput.hxx +++ b/src/Input/FGJoystickInput.hxx @@ -53,6 +53,7 @@ public: private: void _remove(bool all); + SGPropertyNode_ptr status_node; /** * Settings for a single joystick axis. @@ -83,7 +84,7 @@ private: int nbuttons; axis * axes; FGButton * buttons; - bool predefined; + bool predefined; }; joystick bindings[MAX_JOYSTICKS]; diff --git a/src/Main/fg_init.cxx b/src/Main/fg_init.cxx index cb4a2e537..651b0d443 100644 --- a/src/Main/fg_init.cxx +++ b/src/Main/fg_init.cxx @@ -406,6 +406,8 @@ bool fgInitConfig ( int argc, char **argv ) const char *fg_home = getenv("FG_HOME"); if (fg_home) dataPath = fg_home; + + globals->set_fg_home(dataPath.c_str()); simgear::Dir exportDir(simgear::Dir(dataPath).file("Export")); if (!exportDir.exists()) { @@ -588,8 +590,8 @@ static bool fgSetPosFromAirportIDandParkpos( const string& id, const string& par string fltType; string acOperator; SGPath acData; - try { - acData = fgGetString("/sim/fg-home"); + try { + acData = globals->get_fg_home(); acData.append("aircraft-data"); string acfile = fgGetString("/sim/aircraft") + string(".xml"); acData.append(acfile); diff --git a/src/Main/globals.cxx b/src/Main/globals.cxx index 8c8ca52bf..a8df39d03 100644 --- a/src/Main/globals.cxx +++ b/src/Main/globals.cxx @@ -128,6 +128,7 @@ FGGlobals::FGGlobals() : event_mgr( new SGEventMgr ), sim_time_sec( 0.0 ), fg_root( "" ), + fg_home( "" ), time_params( NULL ), ephem( NULL ), mag( NULL ), @@ -214,7 +215,6 @@ FGGlobals::~FGGlobals() locale = NULL; } - // set the fg_root path void FGGlobals::set_fg_root (const string &root) { SGPath tmp(root); @@ -242,6 +242,12 @@ void FGGlobals::set_fg_root (const string &root) { simgear::ResourceManager::PRIORITY_DEFAULT); } +// set the fg_home path +void FGGlobals::set_fg_home (const string &home) { + SGPath tmp(home); + fg_home = tmp.realpath(); +} + void FGGlobals::append_fg_scenery (const string &paths) { // fg_scenery.clear(); @@ -483,7 +489,7 @@ FGGlobals::saveUserSettings() // don't save settings more than once on shutdown haveUserSettings = false; - SGPath autosaveFile(fgGetString("/sim/fg-home")); + SGPath autosaveFile(globals->get_fg_home()); autosaveFile.append( "autosave.xml" ); autosaveFile.create_dir( 0700 ); SG_LOG(SG_IO, SG_INFO, "Saving user settings to " << autosaveFile.str()); diff --git a/src/Main/globals.hxx b/src/Main/globals.hxx index 2ec9cc377..4079a4a9a 100644 --- a/src/Main/globals.hxx +++ b/src/Main/globals.hxx @@ -98,6 +98,9 @@ private: // Root of FlightGear data tree std::string fg_root; + // Users home directory for data + std::string fg_home; + // Roots of FlightGear scenery tree string_list fg_scenery; @@ -192,6 +195,9 @@ public: inline const std::string &get_fg_root () const { return fg_root; } void set_fg_root (const std::string &root); + inline const std::string &get_fg_home () const { return fg_home; } + void set_fg_home (const std::string &home); + inline const string_list &get_fg_scenery () const { return fg_scenery; } void append_fg_scenery (const std::string &scenery); diff --git a/src/Main/options.cxx b/src/Main/options.cxx index d5cc06e9a..98614e10f 100644 --- a/src/Main/options.cxx +++ b/src/Main/options.cxx @@ -1182,7 +1182,7 @@ fgOptVersion( const char *arg ) cerr << "Revision: " << REVISION << endl; cerr << "Build-Id: " << HUDSON_BUILD_ID << endl; cerr << "FG_ROOT=" << globals->get_fg_root() << endl; - cerr << "FG_HOME=" << fgGetString("/sim/fg-home") << endl; + cerr << "FG_HOME=" << globals->get_fg_home() << endl; cerr << "FG_SCENERY="; int didsome = 0; @@ -2031,7 +2031,7 @@ void Options::processOptions() if (fgGetBool("/sim/terrasync/enabled")) { string terrasyncDir = fgGetString("/sim/terrasync/scenery-dir"); if (terrasyncDir.empty()) { - SGPath p(fgGetString("/sim/fg-home")); + SGPath p(globals->get_fg_home()); p.append("TerraSync"); if (!p.exists()) { simgear::Dir dd(p); diff --git a/src/Radio/antenna.cxx b/src/Radio/antenna.cxx index 8a55707d5..fa5e00110 100644 --- a/src/Radio/antenna.cxx +++ b/src/Radio/antenna.cxx @@ -73,7 +73,7 @@ double FGRadioAntenna::calculate_gain(double bearing, double angle) { void FGRadioAntenna::load_NEC_antenna_pattern(string type) { - //SGPath pattern_file(fgGetString("/sim/fg-home")); + //SGPath pattern_file(globals->get_fg_home()); SGPath pattern_file(globals->get_fg_root()); pattern_file.append("Navaids/Antennas"); pattern_file.append(type + ".txt"); diff --git a/src/Traffic/TrafficMgr.cxx b/src/Traffic/TrafficMgr.cxx index a4562d3b4..2de3be5d0 100644 --- a/src/Traffic/TrafficMgr.cxx +++ b/src/Traffic/TrafficMgr.cxx @@ -99,7 +99,7 @@ void FGTrafficManager::shutdown() bool saveData = false; ofstream cachefile; if (fgGetBool("/sim/traffic-manager/heuristics")) { - SGPath cacheData(fgGetString("/sim/fg-home")); + SGPath cacheData(globals->get_fg_home()); cacheData.append("ai"); string airport = fgGetString("/sim/presets/airport-id"); @@ -223,7 +223,7 @@ void FGTrafficManager::loadHeuristics() HeuristicMap heurMap; //cerr << "Processing Heuristics" << endl; // Load the heuristics data - SGPath cacheData(fgGetString("/sim/fg-home")); + SGPath cacheData(globals->get_fg_home()); cacheData.append("ai"); string airport = fgGetString("/sim/presets/airport-id"); if ((airport) != "") {