Ref T717, function to send parts/situation for testing and in the model browser

This commit is contained in:
Klaus Basan
2019-09-15 14:51:12 +02:00
committed by Mat Sutcliffe
parent 73b9371c73
commit f80e093a0a
21 changed files with 188 additions and 14 deletions

View File

@@ -316,6 +316,9 @@ namespace BlackCore
//! Test a remote aircraft
virtual bool testRemoteAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, bool add) = 0;
//! Test update remote aircraft
virtual bool testUpdateRemoteAircraft(const BlackMisc::Aviation::CCallsign cs, const BlackMisc::Aviation::CAircraftSituation &situation, const BlackMisc::Aviation::CAircraftParts &parts) = 0;
//! Get matching setup
virtual BlackMisc::Simulation::CAircraftMatcherSetup getMatchingSetup() const = 0;

View File

@@ -419,6 +419,16 @@ namespace BlackCore
return false;
}
//! \copydoc IContextSimulator::testUpdateRemoteAircraft
virtual bool testUpdateRemoteAircraft(const BlackMisc::Aviation::CCallsign cs, const BlackMisc::Aviation::CAircraftSituation &situation, const BlackMisc::Aviation::CAircraftParts &parts) override
{
Q_UNUSED(cs);
Q_UNUSED(situation);
Q_UNUSED(parts);
logEmptyContextWarning(Q_FUNC_INFO);
return false;
}
//! \copydoc IContextSimulator::setMatchingSetup
virtual BlackMisc::Simulation::CAircraftMatcherSetup getMatchingSetup() const override
{

View File

@@ -1019,6 +1019,14 @@ namespace BlackCore
return added;
}
bool CContextSimulator::testUpdateRemoteAircraft(const CCallsign cs, const CAircraftSituation &situation, const CAircraftParts &parts)
{
if (!m_simulatorPlugin.second || !m_simulatorPlugin.second->isConnected()) { return false; }
CAircraftSituation s = situation; // make sure to have correct callsign
s.setCallsign(cs);
return m_simulatorPlugin.second->testSendSituationAndParts(cs, s, parts);
}
bool CContextSimulator::parseCommandLine(const QString &commandLine, const CIdentifier &originator)
{
Q_UNUSED(originator);

View File

@@ -128,6 +128,7 @@ namespace BlackCore
virtual BlackMisc::Simulation::CAircraftMatcherSetup getMatchingSetup() const override;
virtual BlackMisc::CStatusMessageList copyFsxTerrainProbe(const BlackMisc::Simulation::CSimulatorInfo &simulator) override;
virtual bool testRemoteAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, bool add) override;
virtual bool testUpdateRemoteAircraft(const BlackMisc::Aviation::CCallsign cs, const BlackMisc::Aviation::CAircraftSituation &situation, const BlackMisc::Aviation::CAircraftParts &parts) override;
// also in IAircraftModelSetProvider
virtual BlackMisc::Simulation::CAircraftModelList getModelSet() const override;

View File

@@ -375,5 +375,10 @@ namespace BlackCore
return m_dBusInterface->callDBusRet<bool>(QLatin1String("testRemoteAircraft"), aircraft, add);
}
bool CContextSimulatorProxy::testUpdateRemoteAircraft(const CCallsign cs, const CAircraftSituation &situation, const CAircraftParts &parts)
{
return m_dBusInterface->callDBusRet<bool>(QLatin1String("testUpdateRemoteAircraft"), cs, situation, parts);
}
} // namespace
} // namespace

View File

@@ -111,6 +111,7 @@ namespace BlackCore
virtual BlackMisc::Simulation::CAircraftMatcherSetup getMatchingSetup() const override;
virtual BlackMisc::CStatusMessageList copyFsxTerrainProbe(const BlackMisc::Simulation::CSimulatorInfo &simulator) override;
virtual bool testRemoteAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, bool add) override;
virtual bool testUpdateRemoteAircraft(const BlackMisc::Aviation::CCallsign cs, const BlackMisc::Aviation::CAircraftSituation &situation, const BlackMisc::Aviation::CAircraftParts &parts) override;
//! @}
private:

View File

@@ -215,6 +215,9 @@ namespace BlackCore
//! Test mode?
bool isTestMode() const { return m_test; }
//! Send situation/parts for testing
virtual bool testSendSituationAndParts(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &situation, const BlackMisc::Aviation::CAircraftParts &parts) = 0;
//! Debug function to check state after all aircraft have been removed
//! \remarks only in local developer builds
virtual BlackMisc::CStatusMessageList debugVerifyStateAfterAllAircraftRemoved() const;

View File

@@ -183,6 +183,14 @@ namespace BlackSimPlugin
return m_interpolators[callsign]->getInterpolationMessages(setup.getInterpolatorMode());
}
bool CSimulatorEmulated::testSendSituationAndParts(const CCallsign &callsign, const CAircraftSituation &situation, const CAircraftParts &parts)
{
if (!m_renderedAircraft.containsCallsign(callsign)) { return false; }
m_renderedAircraft.setAircraftSituation(callsign, situation);
m_renderedAircraft.setAircraftPartsSynchronized(callsign, parts);
return true;
}
void CSimulatorEmulated::highlightAircraft(const CSimulatedAircraft &aircraftToHighlight, bool enableHighlight, const CTime &displayTime)
{
if (canLog()) { m_monitorWidget->appendReceivingCall(Q_FUNC_INFO, aircraftToHighlight.toQString(), boolToTrueFalse(enableHighlight), displayTime.toQString()); }

View File

@@ -69,6 +69,7 @@ namespace BlackSimPlugin
virtual bool isPhysicallyRenderedAircraft(const BlackMisc::Aviation::CCallsign &callsign) const override;
virtual BlackMisc::Aviation::CCallsignSet physicallyRenderedAircraft() const override;
virtual BlackMisc::CStatusMessageList getInterpolationMessages(const BlackMisc::Aviation::CCallsign &callsign) const override;
virtual bool testSendSituationAndParts(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &situation, const BlackMisc::Aviation::CAircraftParts &parts) override;
// ----- functions just logged -------
virtual void highlightAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraftToHighlight, bool enableHighlight, const BlackMisc::PhysicalQuantities::CTime &displayTime) override;

View File

@@ -94,16 +94,16 @@ namespace BlackSimPlugin
QDBusPendingReply<QStringList, QList<double>, QList<double>, QList<double>, QList<double>> reply = *watcher;
if (!reply.isError())
{
const QStringList callsigns = reply.argumentAt<0>();
const QList<double> latitudesDeg = reply.argumentAt<1>();
const QList<double> longitudesDeg = reply.argumentAt<2>();
const QList<double> elevationsM = reply.argumentAt<3>();
const QStringList callsigns = reply.argumentAt<0>();
const QList<double> latitudesDeg = reply.argumentAt<1>();
const QList<double> longitudesDeg = reply.argumentAt<2>();
const QList<double> elevationsM = reply.argumentAt<3>();
const QList<double> verticalOffsets = reply.argumentAt<4>();
setter(callsigns, latitudesDeg, longitudesDeg, elevationsM, verticalOffsets);
setter(callsigns, latitudesDeg, longitudesDeg, elevationsM, verticalOffsets);
}
watcher->deleteLater();
};
m_dbusInterface->callDBusAsync(QLatin1String("getRemoteAircraftData"), callback, callsigns);
}
}
}
} // ns
} // ns

View File

@@ -12,6 +12,8 @@
#define BLACKSIMPLUGIN_FLIGHTGEAR_TRAFFIC_PROXY_H
#include "blackmisc/genericdbusinterface.h"
#include "blackmisc/aviation/aircraftsituation.h"
#include "blackmisc/aviation/aircraftparts.h"
#include "blackmisc/aviation/callsign.h"
#include "blackmisc/geo/elevationplane.h"
@@ -47,21 +49,34 @@ namespace BlackSimPlugin
const int s = callsigns.size();
if (s != latitudesDeg.size()) { return false; }
if (s != longitudesDeg.size()) { return false; }
if (s != altitudesFt.size()) { return false; }
if (s != altitudesFt.size()) { return false; }
if (s != pitchesDeg.size()) { return false; }
if (s != rollsDeg.size()) { return false; }
if (s != headingsDeg.size()) { return false; }
return true;
}
QStringList callsigns; //!< List of callsigns
//! Push back the latest situation
void push_back(const BlackMisc::Aviation::CAircraftSituation &situation)
{
this->callsigns.push_back(situation.getCallsign().asString());
this->latitudesDeg.push_back(situation.latitude().value(BlackMisc::PhysicalQuantities::CAngleUnit::deg()));
this->longitudesDeg.push_back(situation.longitude().value(BlackMisc::PhysicalQuantities::CAngleUnit::deg()));
this->altitudesFt.push_back(situation.getAltitude().value(BlackMisc::PhysicalQuantities::CLengthUnit::ft()));
this->pitchesDeg.push_back(situation.getPitch().value(BlackMisc::PhysicalQuantities::CAngleUnit::deg()));
this->rollsDeg.push_back(situation.getBank().value(BlackMisc::PhysicalQuantities::CAngleUnit::deg()));
this->headingsDeg.push_back(situation.getHeading().value(BlackMisc::PhysicalQuantities::CAngleUnit::deg()));
this->onGrounds.push_back(situation.getOnGround() == BlackMisc::Aviation::CAircraftSituation::OnGround);
}
QStringList callsigns; //!< List of callsigns
QList<double> latitudesDeg; //!< List of latitudes
QList<double> longitudesDeg; //!< List of longitudes
QList<double> altitudesFt; //!< List of altitudes
QList<double> altitudesFt; //!< List of altitudes
QList<double> pitchesDeg; //!< List of pitches
QList<double> rollsDeg; //!< List of rolls
QList<double> headingsDeg; //!< List of headings
QList<bool> onGrounds; //!< List of onGrounds
QList<bool> onGrounds; //!< List of onGrounds
};
//! Planes surfaces
@@ -70,6 +85,29 @@ namespace BlackSimPlugin
//! Is empty?
bool isEmpty() const { return callsigns.isEmpty(); }
//! Push back the latest parts
void push_back(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftParts &parts)
{
this->callsigns.push_back(callsign.asString());
this->gears.push_back(parts.isGearDown() ? 1 : 0);
this->flaps.push_back(parts.getFlapsPercent() / 100.0);
this->spoilers.push_back(parts.isSpoilersOut() ? 1 : 0);
this->speedBrakes.push_back(parts.isSpoilersOut() ? 1 : 0);
this->slats.push_back(parts.getFlapsPercent() / 100.0);
this->wingSweeps.push_back(0.0);
this->thrusts.push_back(parts.isAnyEngineOn() ? 0 : 0.75);
this->elevators.push_back(0.0);
this->rudders.push_back(0.0);
this->ailerons.push_back(0.0);
this->landLights.push_back(parts.getLights().isLandingOn());
//! \todo KB 2019-09 Missing taxi lights in FG
// this->taxiLights.push_back(parts.getLights().isTaxiOn());
this->beaconLights.push_back(parts.getLights().isBeaconOn());
this->strobeLights.push_back(parts.getLights().isStrobeOn());
this->navLights.push_back(parts.getLights().isNavOn());
this->lightPatterns.push_back(0);
}
QStringList callsigns; //!< List of callsigns
QList<double> gears; //!< List of gears
QList<double> flaps; //!< List of flaps
@@ -177,7 +215,6 @@ namespace BlackSimPlugin
//! Get remote aircrafts data (lat, lon, elevation and CG)
void getRemoteAircraftData(const QStringList &callsigns, const RemoteAircraftDataCallback &setter) const;
private:
BlackMisc::CGenericDBusInterface *m_dbusInterface = nullptr;
};

View File

@@ -149,6 +149,32 @@ namespace BlackSimPlugin
return m_flightgearAircraftObjects[callsign].getInterpolationMessages(setup.getInterpolatorMode());
}
bool CSimulatorFlightgear::testSendSituationAndParts(const CCallsign &callsign, const CAircraftSituation &situation, const CAircraftParts &parts)
{
if (!this->isConnected()) { return false; }
if (!m_trafficProxy) { return false; }
if (!m_flightgearAircraftObjects.contains(callsign)) { return false; }
int u = 0;
if (!situation.isNull())
{
PlanesPositions planesPositions;
planesPositions.push_back(situation);
m_trafficProxy->setPlanesPositions(planesPositions);
u++;
}
if (!parts.isNull())
{
PlanesSurfaces surfaces;
surfaces.push_back(callsign, parts);
//! \todo KB 2091-09 FG parts sending missing
// m_trafficProxy->setPlanesSurfaces(surfaces);
u++;
}
return u > 0;
}
void CSimulatorFlightgear::clearAllRemoteAircraftData()
{
m_aircraftAddedFailed.clear();

View File

@@ -135,6 +135,7 @@ namespace BlackSimPlugin
virtual QString getStatisticsSimulatorSpecific() const override;
virtual void resetAircraftStatistics() override;
virtual BlackMisc::CStatusMessageList getInterpolationMessages(const BlackMisc::Aviation::CCallsign &callsign) const override;
virtual bool testSendSituationAndParts(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &situation, const BlackMisc::Aviation::CAircraftParts &parts) override;
//! @}
//! Creates an appropriate dbus connection from the string describing it

View File

@@ -348,8 +348,12 @@ namespace BlackSimPlugin
// Test only for successful position. FS9 requires constant positions
if (!result.getInterpolationStatus().hasValidSituation()) { return; }
this->sendMultiplayerPosition(result.getInterpolatedSituation());
}
MPPositionSlewMode positionSlewMode = aircraftSituationToFS9(result.getInterpolatedSituation());
void CFs9Client::sendMultiplayerPosition(const CAircraftSituation &situation)
{
MPPositionSlewMode positionSlewMode = aircraftSituationToFS9(situation);
QByteArray positionMessage;
MultiPlayerPacketParser::writeType(positionMessage, CFs9Sdk::MULTIPLAYER_PACKET_ID_POSITION_SLEWMODE);

View File

@@ -61,7 +61,9 @@ namespace BlackSimPlugin
//! \copydoc BlackMisc::Simulation::CInterpolator::getInterpolationMessages
BlackMisc::CStatusMessageList getInterpolationMessages(BlackMisc::Simulation::CInterpolationAndRenderingSetupBase::InterpolatorMode mode) const;
public slots:
//! Send a situtaion (position)
void sendMultiplayerPosition(const BlackMisc::Aviation::CAircraftSituation &situation);
//! Send new text message
void sendTextMessage(const QString &textMessage);

View File

@@ -298,6 +298,22 @@ namespace BlackSimPlugin
return client->getInterpolationMessages(setup.getInterpolatorMode());
}
bool CSimulatorFs9::testSendSituationAndParts(const CCallsign &callsign, const CAircraftSituation &situation, const CAircraftParts &parts)
{
if (!m_hashFs9Clients.contains(callsign)) { return false; }
CFs9Client *client = m_hashFs9Clients[callsign].data();
if (!client) { return false; }
Q_UNUSED(parts);
int u = 0;
if (situation.isNull())
{
u++;
client->sendMultiplayerPosition(situation);
}
return u > 0;
}
bool CSimulatorFs9::isPhysicallyRenderedAircraft(const CCallsign &callsign) const
{
return m_hashFs9Clients.contains(callsign);

View File

@@ -64,6 +64,7 @@ namespace BlackSimPlugin
virtual void displayStatusMessage(const BlackMisc::CStatusMessage &message) const override;
virtual void displayTextMessage(const BlackMisc::Network::CTextMessage &message) const override;
virtual BlackMisc::CStatusMessageList getInterpolationMessages(const BlackMisc::Aviation::CCallsign &callsign) const override;
virtual bool testSendSituationAndParts(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &situation, const BlackMisc::Aviation::CAircraftParts &parts) override;
//! \@}
protected:

View File

@@ -417,6 +417,26 @@ namespace BlackSimPlugin
return (m_simConnectObjects[callsign]).getInterpolationMessages(setup.getInterpolatorMode());
}
bool CSimulatorFsxCommon::testSendSituationAndParts(const CCallsign &callsign, const CAircraftSituation &situation, const CAircraftParts &parts)
{
if (!m_simConnectObjects.contains(callsign)) { return false; }
CSimConnectObject simObject = m_simConnectObjects.value(callsign);
int u = 0;
if (!parts.isNull()) { this->sendRemoteAircraftPartsToSimulator(simObject, parts); u++; }
if (!situation.isNull())
{
SIMCONNECT_DATA_INITPOSITION position = this->aircraftSituationToFsxPosition(situation, true);
const bool traceSendId = this->isTracingSendId();
const HRESULT hr = this->logAndTraceSendId(
SimConnect_SetDataOnSimObject(
m_hSimConnect, CSimConnectDefinitions::DataRemoteAircraftSetPosition,
static_cast<SIMCONNECT_OBJECT_ID>(simObject.getObjectId()), 0, 0, sizeof(SIMCONNECT_DATA_INITPOSITION), &position),
traceSendId, simObject, "Failed to set position", Q_FUNC_INFO, "SimConnect_SetDataOnSimObject");
if (hr == S_OK) { u++; }
}
return u > 0;
}
CSimConnectDefinitions::SimObjectRequest CSimulatorFsxCommon::requestToSimObjectRequest(DWORD requestId)
{
DWORD v = static_cast<DWORD>(CSimConnectDefinitions::SimObjectEndMarker);

View File

@@ -155,6 +155,7 @@ namespace BlackSimPlugin
virtual void resetAircraftStatistics() override;
virtual void setFlightNetworkConnected(bool connected) override;
virtual BlackMisc::CStatusMessageList getInterpolationMessages(const BlackMisc::Aviation::CCallsign &callsign) const override;
virtual bool testSendSituationAndParts(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &situation, const BlackMisc::Aviation::CAircraftParts &parts) override;
//! @}
//! \copydoc BlackMisc::Simulation::ISimulationEnvironmentProvider::requestElevation

View File

@@ -152,6 +152,31 @@ namespace BlackSimPlugin
return m_xplaneAircraftObjects[callsign].getInterpolationMessages(setup.getInterpolatorMode());
}
bool CSimulatorXPlane::testSendSituationAndParts(const CCallsign &callsign, const CAircraftSituation &situation, const CAircraftParts &parts)
{
if (!this->isConnected()) { return false; }
if (!m_trafficProxy) { return false; }
if (!m_xplaneAircraftObjects.contains(callsign)) { return false; }
int u = 0;
if (!situation.isNull())
{
PlanesPositions planesPositions;
planesPositions.push_back(situation);
m_trafficProxy->setPlanesPositions(planesPositions);
u++;
}
if (!parts.isNull())
{
PlanesSurfaces surfaces;
surfaces.push_back(callsign, parts);
m_trafficProxy->setPlanesSurfaces(surfaces);
u++;
}
return u > 0;
}
void CSimulatorXPlane::clearAllRemoteAircraftData()
{
m_aircraftAddedFailed.clear();

View File

@@ -143,6 +143,7 @@ namespace BlackSimPlugin
virtual QString getStatisticsSimulatorSpecific() const override;
virtual void resetAircraftStatistics() override;
virtual BlackMisc::CStatusMessageList getInterpolationMessages(const BlackMisc::Aviation::CCallsign &callsign) const override;
virtual bool testSendSituationAndParts(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &situation, const BlackMisc::Aviation::CAircraftParts &parts) override;
//! @}
//! \copydoc BlackMisc::Simulation::ISimulationEnvironmentProvider::requestElevation