1 /* -*- Mode: C++ -*- ***************************************************** 2 * TrafficMgr.hxx 3 * Written by Durk Talsma. Started May 5, 2004 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU General Public License as 7 * published by the Free Software Foundation; either version 2 of the 8 * License, or (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, but 11 * WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 18 * 19 * 20 **************************************************************************/ 21 22 /************************************************************************** 23 * This file contains the class definitions for a (Top Level) traffic 24 * manager for FlightGear. 25 * 26 * This is traffic manager version II. The major difference from version 27 * I is that the Flight Schedules are decoupled from the AIAircraft 28 * entities. This allows for a much greater flexibility in setting up 29 * Irregular schedules. Traffic Manager II also makes no longer use of .xml 30 * based configuration files. 31 * 32 * Here is a step plan to achieve the goal of creating Traffic Manager II 33 * 34 * 1) Read aircraft data from a simple text file, like the one provided by 35 * Gabor Toth 36 * 2) Create a new database structure of SchedFlights. This new database 37 * should not be part of the Schedule class, but of TrafficManager itself 38 * 3) Each aircraft should have a list of possible Flights it can operate 39 * (i.e. airline and AC type match). 40 * 4) Aircraft processing proceeds as current. During initialization, we seek 41 * the most urgent flight that needs to be operated 42 * 5) Modify the getNextLeg function so that the next flight is loaded smoothly. 43 44 **************************************************************************/ 45 46 #ifndef _TRAFFICMGR_HXX_ 47 #define _TRAFFICMGR_HXX_ 48 49 #include <set> 50 #include <memory> 51 52 #include <simgear/structure/subsystem_mgr.hxx> 53 #include <simgear/props/propertyObject.hxx> 54 #include <simgear/misc/sg_path.hxx> 55 56 #include "SchedFlight.hxx" 57 #include "Schedule.hxx" 58 59 class Heuristic 60 { 61 public: 62 std::string registration; 63 unsigned int runCount; 64 unsigned int hits; 65 unsigned int lastRun; 66 }; 67 68 typedef std::vector<Heuristic> heuristicsVector; 69 typedef std::vector<Heuristic>::iterator heuristicsVectorIterator; 70 71 typedef std::map < std::string, Heuristic> HeuristicMap; 72 typedef HeuristicMap::iterator HeuristicMapIterator; 73 74 75 class ScheduleParseThread; 76 77 class FGTrafficManager : public SGSubsystem 78 { 79 private: 80 bool inited; 81 bool doingInit; 82 bool trafficSyncRequested; 83 84 double waitingMetarTime; 85 std::string waitingMetarStation; 86 87 ScheduleVector scheduledAircraft; 88 ScheduleVectorIterator currAircraft, currAircraftClosest; 89 90 FGScheduledFlightMap flights; 91 92 void readTimeTableFromFile(SGPath infilename); 93 void Tokenize(const std::string& str, std::vector<std::string>& tokens, const std::string& delimiters = " "); 94 95 simgear::PropertyObject<bool> enabled, aiEnabled, realWxEnabled, metarValid, active, aiDataUpdateNow; 96 97 void loadHeuristics(); 98 99 bool doDataSync(); 100 void finishInit(); 101 void shutdown(); 102 103 friend class ScheduleParseThread; 104 std::unique_ptr<ScheduleParseThread> scheduleParser; 105 106 // helper to read and parse the schedule data. 107 // this is run on a helper thread, so be careful about 108 // accessing properties during parsing 109 void parseSchedule(const SGPath& path); 110 111 bool metarReady(double dt); 112 113 public: 114 FGTrafficManager(); 115 ~FGTrafficManager(); 116 117 // Subsystem API. 118 void init() override; 119 void update(double time) override; 120 121 // Subsystem identification. staticSubsystemClassId()122 static const char* staticSubsystemClassId() { return "traffic-manager"; } 123 getFirstFlight(const std::string & ref)124 FGScheduledFlightVecIterator getFirstFlight(const std::string &ref) { return flights[ref].begin(); } getLastFlight(const std::string & ref)125 FGScheduledFlightVecIterator getLastFlight(const std::string &ref) { return flights[ref].end(); } 126 }; 127 128 #endif 129