Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions include/ECFMP/ECFMP.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include "ECFMP/eventbus/EventListener.h"
#include "ECFMP/flightinformationregion/FlightInformationRegion.h"
#include "ECFMP/flowmeasure/AirportFilter.h"
#include "ECFMP/flowmeasure/CanonicalFlowMeasureInfo.h"
#include "ECFMP/flowmeasure/EventFilter.h"
#include "ECFMP/flowmeasure/FlowMeasure.h"
#include "ECFMP/flowmeasure/FlowMeasureFilters.h"
Expand Down
18 changes: 18 additions & 0 deletions include/ECFMP/Sdk.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#pragma once
#include "api/ElementCollectionTypes.h"

namespace ECFMP {
namespace EventBus {
Expand All @@ -19,6 +20,23 @@ namespace ECFMP::Plugin {
public:
virtual ~Sdk() = default;

/**
* All the flight information regions that are currently loaded.
*/
[[nodiscard]] virtual auto FlightInformationRegions() const noexcept
-> std::shared_ptr<const Api::FlightInformationRegionCollection> = 0;

/**
* All the events that are currently loaded.
*/
[[nodiscard]] virtual auto Events() const noexcept -> std::shared_ptr<const Api::EventCollection> = 0;

/**
* All the flow measures that are currently loaded.
*/
[[nodiscard]] virtual auto FlowMeasures() const noexcept
-> std::shared_ptr<const Api::FlowMeasureCollection> = 0;

/**
* The event bus for the SDK, which can be used to subscribe to events.
*/
Expand Down
24 changes: 18 additions & 6 deletions include/ECFMP/SdkEvents.h
Original file line number Diff line number Diff line change
@@ -1,28 +1,40 @@
#pragma once
#include "ECFMP/api/ElementCollectionTypes.h"

namespace ECFMP::FlowMeasure {
class FlowMeasure;
}// namespace ECFMP::FlowMeasure

namespace ECFMP::Plugin {

// Events
using EventsUpdatedEvent = struct EventsUpdatedEvent {
std::shared_ptr<ECFMP::Api::EventCollection> events;
};

// Flow measures
using FlowMeasuresUpdatedEvent = struct FlowMeasureUpdatedEvent {
std::shared_ptr<ECFMP::Api::FlowMeasureCollection> flowMeasures;
};

using FlowMeasureNotifiedEvent = struct FlowMeasureNotifiedEvent {
const FlowMeasure::FlowMeasure& measure;
std::shared_ptr<const FlowMeasure::FlowMeasure> flowMeasure;
};

using FlowMeasureActivatedEvent = struct FlowMeasureActivatedEvent {
const FlowMeasure::FlowMeasure& measure;
std::shared_ptr<const FlowMeasure::FlowMeasure> flowMeasure;
};

using FlowMeasureExpiredEvent = struct FlowMeasureExpiredEvent {
const FlowMeasure::FlowMeasure& measure;
std::shared_ptr<const FlowMeasure::FlowMeasure> flowMeasure;
};

using FlowMeasureWithdrawnEvent = struct FlowMeasureWithdrawnEvent {
const FlowMeasure::FlowMeasure& measure;
std::shared_ptr<const FlowMeasure::FlowMeasure> flowMeasure;
};

using FlowMeasureReissuedEvent = struct FlowMeasureReissuedEvent {
const FlowMeasure::FlowMeasure& original;
const FlowMeasure::FlowMeasure& reissued;
std::shared_ptr<const FlowMeasure::FlowMeasure> original;
std::shared_ptr<const FlowMeasure::FlowMeasure> reissued;
};
}// namespace ECFMP::Plugin
2 changes: 1 addition & 1 deletion include/ECFMP/SdkFactory.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ namespace ECFMP::Plugin {
*
* Throws an SdkConfigurationException if the configuration is bad.
*/
[[nodiscard]] auto Instance() -> std::unique_ptr<Sdk>;
[[nodiscard]] auto Instance() -> std::shared_ptr<Sdk>;

private:
SdkFactory();
Expand Down
46 changes: 40 additions & 6 deletions include/ECFMP/eventbus/EventBus.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#pragma once
#include "eventbus/InternalEventStream.h"
#include "../../src/eventbus/EventDispatcherFactory.h"
#include "../../src/eventbus/EventStream.h"
#include "../../src/eventbus/SubscriptionFlags.h"
#include <any>
#include <mutex>
#include <typeindex>
Expand All @@ -10,6 +12,12 @@ namespace ECFMP::EventBus {
class EventBus
{
public:
explicit EventBus(const std::shared_ptr<EventDispatcherFactory>& dispatcherFactory)
: dispatcherFactory(dispatcherFactory)
{
assert(dispatcherFactory != nullptr && "Dispatcher factory cannot be null");
}

virtual ~EventBus() = default;
/**
* Subscribes the given listener to the event stream.
Expand All @@ -24,7 +32,15 @@ namespace ECFMP::EventBus {
void
Subscribe(std::shared_ptr<EventListener<EventType>> listener, std::shared_ptr<EventFilter<EventType>> filter)
{
GetStream<EventType>().Subscribe(listener, filter);
if (listener == nullptr) {
throw std::invalid_argument("Listener cannot be null");
}

Subscribe<EventType>(EventSubscription{
dispatcherFactory->CreateDispatcher<EventType>(listener, EventDispatchMode::Euroscope),
listener,
filter,
{EventDispatchMode::Euroscope, false}});
};

/**
Expand All @@ -41,7 +57,15 @@ namespace ECFMP::EventBus {
std::shared_ptr<EventListener<EventType>> listener, std::shared_ptr<EventFilter<EventType>> filter
)
{
GetStream<EventType>().SubscribeOnce(listener, filter);
if (listener == nullptr) {
throw std::invalid_argument("Listener cannot be null");
}

Subscribe<EventType>(EventSubscription{
dispatcherFactory->CreateDispatcher<EventType>(listener, EventDispatchMode::Euroscope),
listener,
filter,
{EventDispatchMode::Euroscope, true}});
};

/**
Expand All @@ -55,18 +79,28 @@ namespace ECFMP::EventBus {
return GetStream<EventType>().template HasListenerOfType<ListenerType>();
}

protected:
template<typename ListenerType, typename EventType>
void Subscribe(const EventSubscription<EventType>& subscription)
{
GetStream<EventType>().Subscribe(subscription);
}

// Factory for dispatchers
std::shared_ptr<EventDispatcherFactory> dispatcherFactory;

private:
template<typename EventType>
auto GetStream() -> InternalEventStream<EventType>&
auto GetStream() -> EventStream<EventType>&
{
auto lock = std::lock_guard(mutex);

const auto index = std::type_index(typeid(EventType));
if (!streams.contains(index)) {
streams.insert({index, std::any(std::make_shared<InternalEventStream<EventType>>())});
streams.insert({index, std::any(std::make_shared<EventStream<EventType>>())});
}

return *std::any_cast<std::shared_ptr<InternalEventStream<EventType>>>(streams.at(index));
return *std::any_cast<std::shared_ptr<EventStream<EventType>>>(streams.at(index));
}

// Protects the streams map
Expand Down
2 changes: 1 addition & 1 deletion include/ECFMP/eventbus/EventFilter.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@ namespace ECFMP::EventBus {
{
public:
virtual ~EventFilter() = default;
virtual bool ShouldProcess(const EventType&) = 0;
virtual bool ShouldProcess(const EventType& event) = 0;
};
}// namespace ECFMP::EventBus
2 changes: 1 addition & 1 deletion include/ECFMP/eventbus/EventListener.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@ namespace ECFMP::EventBus {
{
public:
virtual ~EventListener() = default;
virtual void OnEvent(const EventType&) = 0;
virtual void OnEvent(const EventType& event) = 0;
};
}// namespace ECFMP::EventBus
71 changes: 0 additions & 71 deletions include/ECFMP/eventbus/EventStream.h

This file was deleted.

27 changes: 27 additions & 0 deletions include/ECFMP/flowmeasure/CanonicalFlowMeasureInfo.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#pragma once

namespace ECFMP::FlowMeasure {

/**
* Contains information about a canonical flow measure.
*/
class CanonicalFlowMeasureInfo
{
public:
CanonicalFlowMeasureInfo(const std::string& identifier);
[[nodiscard]] auto Identifier() const noexcept -> const std::string&;
[[nodiscard]] auto Revision() const noexcept -> int;
[[nodiscard]] auto IsAfter(const CanonicalFlowMeasureInfo& other) const noexcept -> bool;

private:
[[nodiscard]] static auto ParseIdentifier(const std::string& identifier) -> std::string;
[[nodiscard]] static auto ParseRevision(const std::string& identifier) -> int;

// The identifier of the canonical flow measure
std::string identifier;

// The revision of the canonical flow measure
int revision;
};

}// namespace ECFMP::FlowMeasure
4 changes: 4 additions & 0 deletions include/ECFMP/flowmeasure/FlowMeasure.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ namespace ECFMP {
namespace ECFMP::FlowMeasure {
class FlowMeasureFilters;
class Measure;
class CanonicalFlowMeasureInfo;

/**
* Represents the status of the flow measure
Expand Down Expand Up @@ -111,5 +112,8 @@ namespace ECFMP::FlowMeasure {
* Returns a collection of filters that apply to the flow measure.
*/
[[nodiscard]] virtual auto Filters() const noexcept -> const FlowMeasureFilters& = 0;

// Information about the canonical nature of the flow measure
[[nodiscard]] virtual auto CanonicalInformation() const noexcept -> const CanonicalFlowMeasureInfo& = 0;
};
}// namespace ECFMP::FlowMeasure
4 changes: 4 additions & 0 deletions include/mock/FlowMeasureMock.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ namespace ECFMP::Mock::FlowMeasure {
MOCK_METHOD(std::shared_ptr<const ECFMP::Event::Event>, Event, (), (const, noexcept, override));
MOCK_METHOD(const std::string&, Identifier, (), (const, noexcept, override));
MOCK_METHOD(const std::string&, Reason, (), (const, noexcept, override));
MOCK_METHOD(
const ECFMP::FlowMeasure::CanonicalFlowMeasureInfo&, CanonicalInformation, (),
(const, noexcept, override)
);
MOCK_METHOD(const std::chrono::system_clock::time_point&, StartTime, (), (const, noexcept, override));
MOCK_METHOD(const std::chrono::system_clock::time_point&, EndTime, (), (const, noexcept, override));
MOCK_METHOD(const std::chrono::system_clock::time_point&, WithdrawnAt, (), (const, override));
Expand Down
21 changes: 12 additions & 9 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ SET(PROJECT_NAME flow_plugin_sdk_src)

set(CMAKE_CXX_STANDARD 20)

set(src_api api/ApiDataDownloader.cpp api/ApiDataDownloader.h api/ApiDataScheduler.cpp api/ApiDataScheduler.h api/FlightInformationRegionDataParser.cpp api/FlightInformationRegionDataParser.h api/InternalApiElementCollection.h api/InternalApiElementCollection.h api/ApiElementIterator.cpp api/InternalElementCollectionTypes.h api/EventDataParser.cpp api/EventDataParser.h api/FlowMeasureDataParser.cpp api/FlowMeasureDataParser.h api/FlowMeasureMeasureParserInterface.h api/FlowMeasureFilterParser.cpp api/FlowMeasureFilterParser.h api/ApiDataParser.cpp api/ApiDataParser.h api/ApiDataDownloadedEvent.h api/FlightInformationRegionDataParserInterface.h api/EventDataParserInterface.h api/FlowMeasureDataParserInterface.h ../include/ECFMP/api/StringIdentifierApiElementCollection.h api/InternalStringIdentifierApiElementCollection.h)
set(src_api api/ApiDataDownloader.cpp api/ApiDataDownloader.h api/ApiDataScheduler.cpp api/ApiDataScheduler.h api/FlightInformationRegionDataParser.cpp api/FlightInformationRegionDataParser.h api/InternalApiElementCollection.h api/InternalApiElementCollection.h api/ApiElementIterator.cpp api/InternalElementCollectionTypes.h api/EventDataParser.cpp api/EventDataParser.h api/FlowMeasureDataParser.cpp api/FlowMeasureDataParser.h api/FlowMeasureMeasureParserInterface.h api/FlowMeasureFilterParser.cpp api/FlowMeasureFilterParser.h api/ApiDataParser.cpp api/ApiDataParser.h api/ApiDataDownloadedEvent.h api/FlightInformationRegionDataParserInterface.h api/EventDataParserInterface.h api/FlowMeasureDataParserInterface.h ../include/ECFMP/api/StringIdentifierApiElementCollection.h api/InternalStringIdentifierApiElementCollection.h api/FlowMeasureMeasureParser.cpp api/FlowMeasureMeasureParser.h eventbus/InternalEventBusFactory.cpp)

set(src_date date/ParseDateStrings.cpp date/ParseDateStrings.h)

Expand All @@ -14,25 +14,27 @@ set(src_flight_information_regions
set(src_events
event/ConcreteEvent.cpp event/ConcreteEvent.h
event/ConcreteEventParticipant.cpp "event/ConcreteEventParticipant.h"
event/Event.cpp ../include/ECFMP/eventbus/EventStream.h ../include/ECFMP/eventbus/EventListener.h ../include/ECFMP/eventbus/EventFilter.h)
event/Event.cpp eventbus/EventStream.h ../include/ECFMP/eventbus/EventListener.h ../include/ECFMP/eventbus/EventFilter.h)

set(src_eventbus
../include/ECFMP/eventbus/EventStream.h
eventbus/EventStream.h
../include/ECFMP/eventbus/EventListener.h
../include/ECFMP/eventbus/EventFilter.h eventbus/InternalEventStream.h ../include/ECFMP/eventbus/EventBus.h eventbus/InternalEventBus.h)
../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)

set(src_flowmeasures
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/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)

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

set(src_pch
pch.h pch.cpp)

set(src_plugin
plugin/ConcreteSdk.h
plugin/ConcreteSdk.cpp
plugin/SdkFactory.cpp ../include/ECFMP/SdkEvents.h)
plugin/InternalSdk.h
plugin/InternalSdk.cpp
plugin/SdkFactory.cpp ../include/ECFMP/SdkEvents.h plugin/InternalSdkEvents.h)

set(src_time time/Clock.cpp time/Clock.h)

set(ALL_FILES
${src_api}
Expand All @@ -43,7 +45,8 @@ set(ALL_FILES
${src_flight_information_regions}
${src_log}
${src_pch}
${src_plugin} api/FlowMeasureMeasureParser.cpp api/FlowMeasureMeasureParser.h)
${src_plugin}
${src_time})

add_library(${PROJECT_NAME} STATIC ${ALL_FILES})
set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32" JSON_MultipleHeaders "ON")
Expand Down
2 changes: 1 addition & 1 deletion src/api/ApiDataDownloader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ namespace ECFMP::Api {
}
ApiDataDownloader::~ApiDataDownloader() = default;

void ApiDataDownloader::DownloadData()
void ApiDataDownloader::OnEvent(const Plugin::ApiDataDownloadRequiredEvent& event)
{
// Get the API response
logger->Info("Downloading data");
Expand Down
Loading