FlightGear next
TrafficMgr.hxx
Go to the documentation of this file.
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#pragma once
47
48#include <set>
49#include <memory>
50
51#include <simgear/structure/subsystem_mgr.hxx>
52#include <simgear/props/propertyObject.hxx>
53#include <simgear/misc/sg_path.hxx>
54
55#include "SchedFlight.hxx"
56#include "Schedule.hxx"
57
58
60{
61public:
62 std::string registration;
63 unsigned int runCount;
64 unsigned int hits;
65 unsigned int lastRun;
66};
67
68typedef std::vector<Heuristic> heuristicsVector;
69typedef std::vector<Heuristic>::iterator heuristicsVectorIterator;
70
71typedef std::map < std::string, Heuristic> HeuristicMap;
72typedef HeuristicMap::iterator HeuristicMapIterator;
73
74
76
77class FGTrafficManager : public SGSubsystem
78{
79private:
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
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
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
113public:
114 explicit FGTrafficManager();
115 virtual ~FGTrafficManager();
116
117 // Subsystem API.
118 void init() override;
119 void update(double time) override;
120
121 // Subsystem identification.
122 static const char* staticSubsystemClassId() { return "traffic-manager"; }
123
124 FGScheduledFlightVecIterator getFirstFlight(const std::string &ref) { return flights[ref].begin(); }
125 FGScheduledFlightVecIterator getLastFlight(const std::string &ref) { return flights[ref].end(); }
126};
std::map< std::string, FGScheduledFlightVec > FGScheduledFlightMap
std::vector< FGScheduledFlight * >::iterator FGScheduledFlightVecIterator
std::vector< FGAISchedule * > ScheduleVector
Definition Schedule.hxx:149
std::vector< FGAISchedule * >::iterator ScheduleVectorIterator
Definition Schedule.hxx:150
HeuristicMap::iterator HeuristicMapIterator
std::vector< Heuristic > heuristicsVector
std::map< std::string, Heuristic > HeuristicMap
std::vector< Heuristic >::iterator heuristicsVectorIterator
void update(double time) override
static const char * staticSubsystemClassId()
FGScheduledFlightVecIterator getLastFlight(const std::string &ref)
void init() override
friend class ScheduleParseThread
FGScheduledFlightVecIterator getFirstFlight(const std::string &ref)
virtual ~FGTrafficManager()
unsigned int hits
std::string registration
unsigned int runCount
unsigned int lastRun
Thread encapsulating parsing the traffic schedules.