Files
pilotclient/src/core/context/contextsimulator.h
2024-12-31 17:42:06 +01:00

309 lines
14 KiB
C++

// SPDX-FileCopyrightText: Copyright (C) 2013 swift Project Community / Contributors
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
//! \file
#ifndef SWIFT_CORE_CONTEXTSIMULATOR_H
#define SWIFT_CORE_CONTEXTSIMULATOR_H
#include <QObject>
#include <QString>
#include "core/context/context.h"
#include "core/corefacade.h"
#include "core/corefacadeconfig.h"
#include "core/simulator.h"
#include "core/swiftcoreexport.h"
#include "misc/aviation/airportlist.h"
#include "misc/geo/elevationplane.h"
#include "misc/pixmap.h"
#include "misc/pq/length.h"
#include "misc/simulation/aircraftmatchersetup.h"
#include "misc/simulation/aircraftmodellist.h"
#include "misc/simulation/interpolation/interpolationrenderingsetup.h"
#include "misc/simulation/matchinglog.h"
#include "misc/simulation/matchingstatistics.h"
#include "misc/simulation/settings/simulatorsettings.h"
#include "misc/simulation/simulatorinternals.h"
#include "misc/simulation/simulatorplugininfo.h"
#include "misc/simulation/simulatorplugininfolist.h"
// clazy:excludeall=const-signal-or-slot
//! \ingroup dbus
//! DBus interface for context
#define SWIFT_CORE_CONTEXTSIMULATOR_INTERFACENAME "org.swift_project.swift_core.contextsimulator"
//! \ingroup dbus
//! DBus object path for context
#define SWIFT_CORE_CONTEXTSIMULATOR_OBJECTPATH "/simulator"
class QDBusConnection;
namespace swift::misc
{
class CDBusServer;
namespace simulation
{
class CSimulatedAircraft;
}
} // namespace swift::misc
namespace swift::core::context
{
//! Network context
class SWIFT_CORE_EXPORT IContextSimulator : public IContext
{
Q_OBJECT
Q_CLASSINFO("D-Bus Interface", SWIFT_CORE_CONTEXTSIMULATOR_INTERFACENAME)
public:
//! Service name
static const QString &InterfaceName();
//! Service path
static const QString &ObjectPath();
//! \copydoc IContext::getPathAndContextId()
QString getPathAndContextId() const override { return this->buildPathAndContextId(ObjectPath()); }
//! Factory method
static IContextSimulator *create(CCoreFacade *parent, CCoreFacadeConfig::ContextMode mode,
swift::misc::CDBusServer *server, QDBusConnection &connection);
//! Destructor
~IContextSimulator() override {}
signals:
//! Simulator combined status
//! \sa ISimulator::SimulatorStatus
//! \remark still int for DBus
void simulatorStatusChanged(int status);
//! Simulator plugin loaded / unloaded (default info)
void simulatorPluginChanged(const swift::misc::simulation::CSimulatorPluginInfo &info);
//! Same as simulatorPluginChanged, only with simulator signature
void simulatorChanged(const swift::misc::simulation::CSimulatorInfo &simulator);
//! Simulator settings have been changed
void simulatorSettingsChanged();
//! A formerly vital driver is no longer vital/responding
void vitalityLost();
//! Frame rate has fallen too far below the threshold to maintain consistent sim rate
void insufficientFrameRateDetected(bool fatal);
//! Render restrictions have been changed
void renderRestrictionsChanged(bool restricted, bool enabled, int maxAircraft,
const swift::misc::physical_quantities::CLength &maxRenderedDistance);
//! Setup changed
void interpolationAndRenderingSetupChanged();
//! Matching setup changed
void matchingSetupChanged();
//! Model set ready or changed
void modelSetChanged(const swift::misc::simulation::CSimulatorInfo &simulator);
//! A single model has been matched for given aircraft
void modelMatchingCompleted(const swift::misc::simulation::CSimulatedAircraft &aircraft);
//! Adding a remote aircraft failed
void addingRemoteModelFailed(const swift::misc::simulation::CSimulatedAircraft &aircraft, bool disabled,
bool failover, const swift::misc::CStatusMessage &message);
//! Aircraft rendering changed
void aircraftRenderingChanged(const swift::misc::simulation::CSimulatedAircraft &aircraft);
//! Emitted when own aircraft model changes
void ownAircraftModelChanged(const swift::misc::simulation::CAircraftModel &model);
//! An airspace snapshot was handled
void airspaceSnapshotHandled();
//! Relevant simulator messages to be explicitly displayed
void driverMessages(const swift::misc::CStatusMessageList &messages);
//! Validated model set
void validatedModelSet(const swift::misc::simulation::CSimulatorInfo &simulator,
const swift::misc::simulation::CAircraftModelList &valid,
const swift::misc::simulation::CAircraftModelList &invalid, bool stopped,
const swift::misc::CStatusMessageList &msgs);
//! Auto publish data written for simulator
void autoPublishDataWritten(const swift::misc::simulation::CSimulatorInfo &simulator);
public slots:
//! Is a simulator plugin loaded (connected to the simulator)?
bool isSimulatorAvailable() const;
//! Is available simulator simulating? Returns false if no simulator is available
bool isSimulatorSimulating() const;
//! Simulator info, currently loaded plugin
virtual swift::misc::simulation::CSimulatorPluginInfo getSimulatorPluginInfo() const = 0;
//! Return list of available simulator plugins
virtual swift::misc::simulation::CSimulatorPluginInfoList getAvailableSimulatorPlugins() const = 0;
//! Get the current simulator settings
virtual swift::misc::simulation::settings::CSimulatorSettings getSimulatorSettings() const = 0;
//! Set settings for give simulator
virtual bool setSimulatorSettings(const swift::misc::simulation::settings::CSimulatorSettings &settings,
const swift::misc::simulation::CSimulatorInfo &simulator) = 0;
//! Check all listeners enabled if simulator is connected
virtual int checkListeners() = 0;
//! Load and start specific simulator plugin
virtual bool startSimulatorPlugin(const swift::misc::simulation::CSimulatorPluginInfo &simulatorInfo) = 0;
//! Stop listener or unload the given plugin (if currently loaded)
virtual void stopSimulatorPlugin(const swift::misc::simulation::CSimulatorPluginInfo &simulatorInfo) = 0;
//! Simulator combined status
virtual ISimulator::SimulatorStatus getSimulatorStatus() const = 0;
//! Simulator setup
virtual swift::misc::simulation::CSimulatorInternals getSimulatorInternals() const = 0;
//! Installed models in simulator eco system
//! \note might be slow since list can be big
virtual swift::misc::simulation::CAircraftModelList getModelSet() const = 0;
//! Get the model set loader simulator directly
virtual swift::misc::simulation::CSimulatorInfo getModelSetLoaderSimulator() const = 0;
//! Set the model set loader simulator directly
//! \note for testing purposes and can be used if no simulator is connected
virtual void setModelSetLoaderSimulator(const swift::misc::simulation::CSimulatorInfo &simulator) = 0;
//! Simulators which have an initialized model set
virtual swift::misc::simulation::CSimulatorInfo simulatorsWithInitializedModelSet() const = 0;
//! Verify prerequisites for simulation like an existing model set
//! \pre system needs to be initialized to work correctly
virtual swift::misc::CStatusMessageList verifyPrerequisites() const = 0;
//! Number of installed models in simulator eco system
virtual int getModelSetCount() const = 0;
//! Models for model string
virtual swift::misc::simulation::CAircraftModelList
getModelSetModelsStartingWith(const QString &modelString) const = 0;
//! Model strings
virtual QStringList getModelSetStrings() const = 0;
//! Model set completer string
virtual QStringList getModelSetCompleterStrings(bool sorted) const = 0;
//! Remove models from set
virtual int removeModelsFromSet(const swift::misc::simulation::CAircraftModelList &removeModels) = 0;
//! \copydoc CAircraftMatcher::disableModelsForMatching
virtual void disableModelsForMatching(const swift::misc::simulation::CAircraftModelList &removedModels,
bool incremental) = 0;
//! \copydoc CAircraftMatcher::getDisabledModelsForMatching
virtual swift::misc::simulation::CAircraftModelList getDisabledModelsForMatching() const = 0;
//! \copydoc swift::misc::simulation::CBackgroundValidation::isValidating
virtual bool isValidationInProgress() const = 0;
//! Trigger model set validation
virtual bool triggerModelSetValidation(const swift::misc::simulation::CSimulatorInfo &simulator) = 0;
//! \copydoc CAircraftMatcher::restoreDisabledModels
virtual void restoreDisabledModels() = 0;
//! Known model?
virtual bool isKnownModelInSet(const QString &modelstring) const = 0;
//! \copydoc swift::misc::simulation::IInterpolationSetupProvider::getInterpolationSetupGlobal
virtual swift::misc::simulation::CInterpolationAndRenderingSetupGlobal
getInterpolationAndRenderingSetupGlobal() const = 0;
//! \copydoc swift::misc::simulation::IInterpolationSetupProvider::getInterpolationSetupsPerCallsign
virtual swift::misc::simulation::CInterpolationSetupList
getInterpolationAndRenderingSetupsPerCallsign() const = 0;
//! \copydoc swift::misc::simulation::IInterpolationSetupProvider::getInterpolationSetupPerCallsignOrDefault
virtual swift::misc::simulation::CInterpolationAndRenderingSetupPerCallsign
getInterpolationAndRenderingSetupPerCallsignOrDefault(
const swift::misc::aviation::CCallsign &callsign) const = 0;
//! \copydoc swift::misc::simulation::IInterpolationSetupProvider::setInterpolationSetupGlobal
virtual void setInterpolationAndRenderingSetupGlobal(
const swift::misc::simulation::CInterpolationAndRenderingSetupGlobal &setup) = 0;
//! \copydoc swift::misc::simulation::IInterpolationSetupProvider::setInterpolationSetupsPerCallsign
virtual bool
setInterpolationAndRenderingSetupsPerCallsign(const swift::misc::simulation::CInterpolationSetupList &setups,
bool ignoreSameAsGlobal) = 0;
//! Interpolation messages
virtual swift::misc::CStatusMessageList
getInterpolationMessages(const swift::misc::aviation::CCallsign &callsign) const = 0;
//! Get mapping messages
virtual swift::misc::CStatusMessageList
getMatchingMessages(const swift::misc::aviation::CCallsign &callsign) const = 0;
//! Enabled mapping logging?
virtual swift::misc::simulation::MatchingLog isMatchingMessagesEnabled() const = 0;
//! Enable mapping logging
virtual void enableMatchingMessages(swift::misc::simulation::MatchingLog enabled) = 0;
//! Follow aircraft im simulator view
virtual bool followAircraft(const swift::misc::aviation::CCallsign &callsign) = 0;
//! Recalculate all aircraft
virtual void recalculateAllAircraft() = 0;
//! Reset model by matching it again
virtual bool resetToModelMatchingAircraft(const swift::misc::aviation::CCallsign &callsign) = 0;
//! \copydoc swift::misc::simulation::ISimulationEnvironmentProvider::requestElevationBySituation
virtual bool requestElevationBySituation(const swift::misc::aviation::CAircraftSituation &situation) = 0;
//! \copydoc swift::misc::simulation::ISimulationEnvironmentProvider::findClosestElevationWithinRange
virtual swift::misc::geo::CElevationPlane
findClosestElevationWithinRange(const swift::misc::geo::CCoordinateGeodetic &reference,
const swift::misc::physical_quantities::CLength &range) const = 0;
//! Repeat all matchings
virtual int doMatchingsAgain() = 0;
//! Repeat the matching callsign
virtual bool doMatchingAgain(const swift::misc::aviation::CCallsign &callsign) = 0;
//! Current matching statistics
virtual swift::misc::simulation::CMatchingStatistics getCurrentMatchingStatistics(bool missingOnly) const = 0;
//! Set matching setup
virtual void setMatchingSetup(const swift::misc::simulation::CAircraftMatcherSetup &setup) = 0;
//! Test a remote aircraft
virtual bool testRemoteAircraft(const swift::misc::simulation::CSimulatedAircraft &aircraft, bool add) = 0;
//! Test update remote aircraft
virtual bool testUpdateRemoteAircraft(const swift::misc::aviation::CCallsign &cs,
const swift::misc::aviation::CAircraftSituation &situation,
const swift::misc::aviation::CAircraftParts &parts) = 0;
//! Get matching setup
virtual swift::misc::simulation::CAircraftMatcherSetup getMatchingSetup() const = 0;
protected:
//! Constructor
IContextSimulator(CCoreFacadeConfig::ContextMode mode, CCoreFacade *runtime) : IContext(mode, runtime) {}
};
} // namespace swift::core::context
#endif // SWIFT_CORE_CONTEXTSIMULATOR_H