-
Notifications
You must be signed in to change notification settings - Fork 22
/
CachedAircraftFirExitGenerator.cpp
107 lines (87 loc) · 3.69 KB
/
CachedAircraftFirExitGenerator.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include "AircraftFirExit.h"
#include "CachedAircraftFirExitGenerator.h"
#include "ExitDetermination.h"
#include "FirExitPoint.h"
#include "FirExitPointCollection.h"
#include "euroscope/EuroScopeCFlightPlanInterface.h"
#include "flightplan/FlightplanPoint.h"
#include "flightplan/ParsedFlightplan.h"
namespace UKControllerPlugin::IntentionCode {
CachedAircraftFirExitGenerator::CachedAircraftFirExitGenerator(const FirExitPointCollection& firExitPoints)
: firExitPoints(firExitPoints)
{
}
void CachedAircraftFirExitGenerator::AddCacheEntry(const std::shared_ptr<AircraftFirExit>& entry)
{
cache[entry->callsign] = entry;
}
auto CachedAircraftFirExitGenerator::GetCacheEntryForCallsign(const std::string& callsign) const
-> std::shared_ptr<AircraftFirExit>
{
return cache.contains(callsign) ? cache.at(callsign) : nullptr;
}
void CachedAircraftFirExitGenerator::RemoveCacheEntryForCallsign(const std::string& callsign)
{
cache.erase(callsign);
}
auto CachedAircraftFirExitGenerator::Generate(const Euroscope::EuroScopeCFlightPlanInterface& flightplan)
-> std::shared_ptr<AircraftFirExit>
{
auto cachedEntry = GetCacheEntryForCallsign(flightplan.GetCallsign());
if (cachedEntry) {
return cachedEntry;
}
auto exit = AircraftFirExit{};
exit.callsign = flightplan.GetCallsign();
const auto parsedFlightplan = flightplan.GetParsedFlightplan();
for (size_t i = 0; i < parsedFlightplan->CountPoints(); i++) {
const auto flightplanPoint = parsedFlightplan->PointByIndex(i);
// If we've reached the end of the flightplan, stop.
if (!flightplanPoint) {
break;
}
const auto firExitPoint = firExitPoints.PointByIdentifier(flightplanPoint->Identifier());
if (!firExitPoint) {
continue;
}
/*
* If the aircraft is exiting between the two FIRs, we only care about recording this if we don't already
* have an internal exit point and the aircraft is exiting.
*/
if (firExitPoint->IsInternal()) {
if (exit.internalExitPoint) {
continue;
}
if (firExitPoint->FirExitDetermination().AircraftIsExiting(*flightplanPoint, flightplan)) {
exit.internalExitPoint = firExitPoint;
}
continue;
}
/*
* If the aircraft is not exiting between the two FIRs, then we have reached the UK exit and don't need
* to check this any further.\
*/
if (firExitPoint->FirExitDetermination().AircraftIsExiting(*flightplanPoint, flightplan)) {
exit.ukExitPoint = firExitPoint;
break;
}
}
const auto cacheItem = std::make_shared<AircraftFirExit>(exit);
AddCacheEntry(cacheItem);
return cacheItem;
}
void CachedAircraftFirExitGenerator::FlightPlanEvent(
Euroscope::EuroScopeCFlightPlanInterface& flightPlan, Euroscope::EuroScopeCRadarTargetInterface& radarTarget)
{
RemoveCacheEntryForCallsign(flightPlan.GetCallsign());
}
void CachedAircraftFirExitGenerator::FlightPlanDisconnectEvent(Euroscope::EuroScopeCFlightPlanInterface& flightPlan)
{
RemoveCacheEntryForCallsign(flightPlan.GetCallsign());
}
void CachedAircraftFirExitGenerator::ControllerFlightPlanDataEvent(
Euroscope::EuroScopeCFlightPlanInterface& flightPlan, int dataType)
{
// Nothing to do here
}
} // namespace UKControllerPlugin::IntentionCode