Skip to content

Commit af63ddc

Browse files
committed
feat: custom flow measure filters
1 parent 71e40a0 commit af63ddc

21 files changed

Lines changed: 216 additions & 47 deletions

include/ECFMP/ECFMP.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
#pragma once
22
#include "../../src/pch.h"
33

4+
#include "Sdk.h"
5+
#include "SdkEvents.h"
6+
#include "SdkFactory.h"
47
#include "api/ApiElementCollection.h"
58
#include "api/StringIdentifierApiElementCollection.h"
69
#include "event/Event.h"
@@ -11,6 +14,7 @@
1114
#include "flightinformationregion/FlightInformationRegion.h"
1215
#include "flowmeasure/AirportFilter.h"
1316
#include "flowmeasure/CanonicalFlowMeasureInfo.h"
17+
#include "flowmeasure/CustomFlowMeasureFilter.h"
1418
#include "flowmeasure/EventFilter.h"
1519
#include "flowmeasure/FlowMeasure.h"
1620
#include "flowmeasure/FlowMeasureFilters.h"
@@ -20,6 +24,3 @@
2024
#include "flowmeasure/RouteFilter.h"
2125
#include "http/HttpClient.h"
2226
#include "log/Logger.h"
23-
#include "Sdk.h"
24-
#include "SdkFactory.h"
25-
#include "SdkEvents.h"

include/ECFMP/SdkFactory.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#pragma once
2+
#include "ECFMP/flowmeasure/CustomFlowMeasureFilter.h"
23
#include "Sdk.h"
4+
#include <memory>
35

46
namespace ECFMP {
57
namespace Http {
@@ -50,6 +52,14 @@ namespace ECFMP::Plugin {
5052
*/
5153
[[nodiscard]] auto WithLogger(std::unique_ptr<Log::Logger> log) -> SdkFactory&;
5254

55+
/**
56+
* Allows consumers to provide a custom filter for flow measures. This will be called for every
57+
* flow measure that is received from ECFMP when checking if the flow measure is applicable to
58+
* the given aircraft.
59+
*/
60+
[[nodiscard]] auto
61+
WithCustomFlowMeasureFilter(const std::shared_ptr<FlowMeasure::CustomFlowMeasureFilter>& filter) -> SdkFactory&;
62+
5363
/**
5464
* Returns the configured SDK instance.
5565
*
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#pragma once
2+
#include "EuroScopePlugIn.h"
3+
4+
namespace ECFMP::FlowMeasure {
5+
class FlowMeasure;
6+
7+
/**
8+
* A class that consumers of the SDK can implement to provide a custom filter for flow measures.
9+
*/
10+
class CustomFlowMeasureFilter
11+
{
12+
public:
13+
virtual ~CustomFlowMeasureFilter() = default;
14+
15+
/**
16+
* Returns true if the given aircraft is applicable to the flow measure.
17+
* @return
18+
*/
19+
[[nodiscard]] virtual auto ApplicableToAircraft(
20+
const EuroScopePlugIn::CFlightPlan& flightplan, const EuroScopePlugIn::CRadarTarget& radarTarget,
21+
const FlowMeasure& flowMeasure
22+
) const noexcept -> bool = 0;
23+
};
24+
}// namespace ECFMP::FlowMeasure

include/ECFMP/flowmeasure/FlowMeasureFilters.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ namespace ECFMP::FlowMeasure {
2121
/**
2222
* Represents a collection of flow measure filters, along with some helper
2323
* methods for commonly used queries.
24+
*
25+
* It does not include any custom filters provided by the user.
2426
*/
2527
class FlowMeasureFilters
2628
{

include/ECFMP/flowmeasure/LevelRangeFilter.h

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
11
#pragma once
22
#include "ChecksAircraftApplicability.h"
3+
#include "LevelRangeFilterType.h"
34

45
namespace ECFMP::FlowMeasure {
56

6-
enum LevelRangeFilterType
7-
{
8-
AtOrAbove = 1,
9-
AtOrBelow = 2
10-
};
11-
127
/**
138
* A filter that pertains to the cruising level of the aircraft.
149
*/
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#pragma once
2+
3+
namespace ECFMP::FlowMeasure {
4+
5+
enum LevelRangeFilterType
6+
{
7+
AtOrAbove = 1,
8+
AtOrBelow = 2
9+
};
10+
}// namespace ECFMP::FlowMeasure

src/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ set(src_eventbus
2424
../include/ECFMP/eventbus/EventFilter.h ../include/ECFMP/eventbus/EventBus.h eventbus/InternalEventBus.h eventbus/EventDispatcher.h eventbus/SynchronousEventDispatcher.h eventbus/AsynchronousEventDispatcher.h eventbus/EuroscopeEventDispatcher.h eventbus/PendingEuroscopeEvents.cpp eventbus/PendingEuroscopeEvents.h eventbus/EventDispatcherFactory.h eventbus/SubscriptionFlags.h)
2525

2626
set(src_flowmeasures
27-
flowmeasure/ConcreteFlowMeasure.cpp flowmeasure/ConcreteFlowMeasure.h flowmeasure/ConcreteAirportFilter.cpp flowmeasure/ConcreteAirportFilter.h flowmeasure/ConcreteEventFilter.cpp flowmeasure/ConcreteEventFilter.h flowmeasure/ConcreteLevelRangeFilter.cpp flowmeasure/ConcreteLevelRangeFilter.h flowmeasure/ConcreteRouteFilter.cpp flowmeasure/ConcreteRouteFilter.h flowmeasure/ConcreteMeasure.cpp flowmeasure/ConcreteMeasure.h flowmeasure/ConcreteMeasureFactory.cpp flowmeasure/ConcreteMeasureFactory.h flowmeasure/ConcreteFlowMeasureFilters.cpp flowmeasure/ConcreteFlowMeasureFilters.h api/FlowMeasureFilterParserInterface.h ../include/ECFMP/flowmeasure/MultipleLevelFilter.h flowmeasure/ConcreteMultipleLevelFilter.cpp flowmeasure/ConcreteMultipleLevelFilter.h ../include/mock/MultipleLevelFilterMock.h ../include/ECFMP/flowmeasure/RangeToDestinationFilter.h flowmeasure/ConcreteRangeToDestinationFilter.cpp flowmeasure/ConcreteRangeToDestinationFilter.h flowmeasure/CanonicalFlowMeasureInfo.cpp ../include/ECFMP/flowmeasure/CanonicalFlowMeasureInfo.h flowmeasure/FlowMeasureStatusUpdates.cpp flowmeasure/FlowMeasureStatusUpdates.h ../include/ECFMP/flowmeasure/ChecksAircraftApplicability.h)
27+
flowmeasure/ConcreteFlowMeasure.cpp flowmeasure/ConcreteFlowMeasure.h flowmeasure/ConcreteAirportFilter.cpp flowmeasure/ConcreteAirportFilter.h flowmeasure/ConcreteEventFilter.cpp flowmeasure/ConcreteEventFilter.h flowmeasure/ConcreteLevelRangeFilter.cpp flowmeasure/ConcreteLevelRangeFilter.h flowmeasure/ConcreteRouteFilter.cpp flowmeasure/ConcreteRouteFilter.h flowmeasure/ConcreteMeasure.cpp flowmeasure/ConcreteMeasure.h flowmeasure/ConcreteMeasureFactory.cpp flowmeasure/ConcreteMeasureFactory.h flowmeasure/ConcreteFlowMeasureFilters.cpp flowmeasure/ConcreteFlowMeasureFilters.h api/FlowMeasureFilterParserInterface.h ../include/ECFMP/flowmeasure/MultipleLevelFilter.h flowmeasure/ConcreteMultipleLevelFilter.cpp flowmeasure/ConcreteMultipleLevelFilter.h ../include/mock/MultipleLevelFilterMock.h ../include/ECFMP/flowmeasure/RangeToDestinationFilter.h flowmeasure/ConcreteRangeToDestinationFilter.cpp flowmeasure/ConcreteRangeToDestinationFilter.h flowmeasure/CanonicalFlowMeasureInfo.cpp ../include/ECFMP/flowmeasure/CanonicalFlowMeasureInfo.h flowmeasure/FlowMeasureStatusUpdates.cpp flowmeasure/FlowMeasureStatusUpdates.h ../include/ECFMP/flowmeasure/ChecksAircraftApplicability.h ../include/ECFMP/flowmeasure/CustomFlowMeasureFilter.h ../include/ECFMP/flowmeasure/LevelRangeFilterType.h)
2828

2929
set(src_log log/LogDecorator.cpp log/LogDecorator.h log/LogDecorator.h log/NullLogger.cpp log/NullLogger.h)
3030

@@ -64,7 +64,7 @@ target_include_directories(${PROJECT_NAME} PRIVATE
6464
target_include_directories(${PROJECT_NAME} PUBLIC
6565
"${CMAKE_CURRENT_SOURCE_DIR};"
6666
"${CMAKE_CURRENT_SOURCE_DIR}/../include;"
67-
)
67+
)
6868

6969
# Treat Euroscope as a system include directory to suppress warning, because they have lots
7070
target_include_directories(${PROJECT_NAME} SYSTEM PRIVATE

src/api/FlowMeasureDataParser.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include "ECFMP/SdkEvents.h"
33
#include "ECFMP/flightinformationregion/FlightInformationRegion.h"
44
#include "ECFMP/flowmeasure/FlowMeasure.h"
5+
#include "ECFMP/flowmeasure/FlowMeasureFilters.h"
56
#include "ECFMP/log/Logger.h"
67
#include "FlowMeasureFilterParser.h"
78
#include "FlowMeasureMeasureParser.h"
@@ -16,15 +17,17 @@ namespace ECFMP::Api {
1617
FlowMeasureDataParser::FlowMeasureDataParser(
1718
std::unique_ptr<FlowMeasureFilterParserInterface> filterParser,
1819
std::unique_ptr<FlowMeasureMeasureParserInterface> measureParser, std::shared_ptr<Log::Logger> logger,
19-
std::shared_ptr<EventBus::InternalEventBus> eventBus
20+
std::shared_ptr<EventBus::InternalEventBus> eventBus,
21+
std::shared_ptr<std::vector<std::shared_ptr<ECFMP::FlowMeasure::CustomFlowMeasureFilter>>> customFilters
2022
)
2123
: filterParser(std::move(filterParser)), measureParser(std::move(measureParser)), logger(std::move(logger)),
22-
eventBus(std::move(eventBus))
24+
eventBus(std::move(eventBus)), customFilters(std::move(customFilters))
2325
{
2426
assert(this->filterParser != nullptr && "FlowMeasureDataParser::FlowMeasureDataParser: filterParser is null");
2527
assert(this->measureParser != nullptr && "FlowMeasureDataParser::FlowMeasureDataParser: measureParser is null");
2628
assert(this->logger != nullptr && "FlowMeasureDataParser::FlowMeasureDataParser: logger is null");
2729
assert(this->eventBus != nullptr && "FlowMeasureDataParser::FlowMeasureDataParser: eventBus is null");
30+
assert(this->customFilters != nullptr && "FlowMeasureDataParser::FlowMeasureDataParser: customFilters is null");
2831
}
2932

3033
auto FlowMeasureDataParser::ParseFlowMeasures(
@@ -89,7 +92,7 @@ namespace ECFMP::Api {
8992
auto flowMeasure = std::make_shared<FlowMeasure::ConcreteFlowMeasure>(
9093
flowMeasureData.at("id").get<int>(), event, flowMeasureData.at("ident").get<std::string>(),
9194
flowMeasureData.at("reason").get<std::string>(), startTime, endTime, withdrawnAt, measureStatus,
92-
std::move(notifiedFirs), std::move(measure), std::move(filters)
95+
std::move(notifiedFirs), std::move(measure), std::move(filters), customFilters
9396
);
9497
flowMeasures->Add(flowMeasure);
9598
}

src/api/FlowMeasureDataParser.h

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,14 @@
44
#include "eventbus/InternalEventBus.h"
55
#include "nlohmann/json_fwd.hpp"
66

7-
namespace ECFMP::Log {
8-
class Logger;
9-
}// namespace ECFMP::Log
7+
namespace ECFMP {
8+
namespace FlowMeasure {
9+
class CustomFlowMeasureFilter;
10+
}// namespace FlowMeasure
11+
namespace Log {
12+
class Logger;
13+
}// namespace Log
14+
}// namespace ECFMP
1015

1116
namespace ECFMP::Api {
1217

@@ -19,7 +24,8 @@ namespace ECFMP::Api {
1924
FlowMeasureDataParser(
2025
std::unique_ptr<FlowMeasureFilterParserInterface> filterParser,
2126
std::unique_ptr<FlowMeasureMeasureParserInterface> measureParser, std::shared_ptr<Log::Logger> logger,
22-
std::shared_ptr<EventBus::InternalEventBus> eventBus
27+
std::shared_ptr<EventBus::InternalEventBus> eventBus,
28+
std::shared_ptr<std::vector<std::shared_ptr<ECFMP::FlowMeasure::CustomFlowMeasureFilter>>> customFilters
2329
);
2430
~FlowMeasureDataParser() override = default;
2531
[[nodiscard]] auto ParseFlowMeasures(
@@ -50,6 +56,9 @@ namespace ECFMP::Api {
5056

5157
// Event bus
5258
std::shared_ptr<EventBus::InternalEventBus> eventBus;
59+
60+
// Custom flow measure filters
61+
std::shared_ptr<std::vector<std::shared_ptr<ECFMP::FlowMeasure::CustomFlowMeasureFilter>>> customFilters;
5362
};
5463

5564
}// namespace ECFMP::Api

src/api/FlowMeasureFilterParser.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
#pragma once
2-
#include "ECFMP/flowmeasure/FlowMeasureFilters.h"
3-
#include "ECFMP/flowmeasure/LevelRangeFilter.h"
4-
#include "ECFMP/flowmeasure/MultipleLevelFilter.h"
5-
#include "ECFMP/flowmeasure/RangeToDestinationFilter.h"
2+
#include "ECFMP/flowmeasure/LevelRangeFilterType.h"
63
#include "FlowMeasureFilterParserInterface.h"
74

85
namespace ECFMP {
@@ -11,7 +8,11 @@ namespace ECFMP {
118
}// namespace Euroscope
129
namespace FlowMeasure {
1310
class AirportFilter;
11+
class CustomFlowMeasureFilter;
1412
class EventFilter;
13+
class LevelRangeFilter;
14+
class MultipleLevelFilter;
15+
class RangeToDestinationFilter;
1516
class RouteFilter;
1617
}// namespace FlowMeasure
1718
namespace Log {

0 commit comments

Comments
 (0)