From ac760ce9b010f447f38b43012615df4aec81fba8 Mon Sep 17 00:00:00 2001 From: Roland Winklmeier Date: Sat, 7 Mar 2015 18:28:59 +0100 Subject: [PATCH] Adapt X-Plane plugin to aircraft history interfaces --- .../simulator/xplane/simulator_xplane.cpp | 131 +++++++++--------- .../simulator/xplane/simulator_xplane.h | 4 +- 2 files changed, 70 insertions(+), 65 deletions(-) diff --git a/src/plugins/simulator/xplane/simulator_xplane.cpp b/src/plugins/simulator/xplane/simulator_xplane.cpp index b43a7a787..b0dd72bea 100644 --- a/src/plugins/simulator/xplane/simulator_xplane.cpp +++ b/src/plugins/simulator/xplane/simulator_xplane.cpp @@ -46,6 +46,27 @@ namespace BlackSimPlugin m_slowTimer->start(1000); resetData(); + + bool c = remoteAircraftProvider->connectRemoteAircraftProviderSignals( + std::bind(&CSimulatorXPlane::ps_addAircraftSituation, this, std::placeholders::_1), + std::bind(&CSimulatorXPlane::ps_addAircraftParts, this, std::placeholders::_1), + [] (const BlackMisc::Aviation::CCallsign &) {}); + Q_ASSERT(c); + Q_UNUSED(c); + } + + // convert xplane squawk mode to swift squawk mode + BlackMisc::Aviation::CTransponder::TransponderMode xpdrMode(int xplaneMode, bool ident) + { + if (ident) { return BlackMisc::Aviation::CTransponder::StateIdent; } + if (xplaneMode == 0 || xplaneMode == 1) { return BlackMisc::Aviation::CTransponder::StateStandby; } + return BlackMisc::Aviation::CTransponder::ModeC; + } + + // convert swift squawk mode to xplane squawk mode + int xpdrMode(BlackMisc::Aviation::CTransponder::TransponderMode mode) + { + return mode == BlackMisc::Aviation::CTransponder::StateStandby ? 1 : 2; } void CSimulatorXPlane::ps_fastTimerTimeout() @@ -67,6 +88,19 @@ namespace BlackSimPlugin m_service->getTransponderModeAsync(&m_xplaneData.xpdrMode); m_service->getTransponderIdentAsync(&m_xplaneData.xpdrIdent); m_service->getAllWheelsOnGroundAsync(&m_xplaneData.onGroundAll); + + Aviation::CAircraftSituation situation; + situation.setPosition({ m_xplaneData.latitude, m_xplaneData.longitude, 0 }); + situation.setAltitude({ m_xplaneData.altitude, Aviation::CAltitude::MeanSeaLevel, CLengthUnit::m() }); + situation.setHeading({ m_xplaneData.trueHeading, Aviation::CHeading::True, CAngleUnit::deg() }); + situation.setPitch({ m_xplaneData.pitch, CAngleUnit::deg() }); + situation.setBank({ m_xplaneData.roll, CAngleUnit::deg() }); + situation.setGroundspeed({ m_xplaneData.groundspeed, CSpeedUnit::m_s() }); + ownAircraft().setSituation(situation); + ownAircraft().setIcaoInfo(Aviation::CAircraftIcao { m_xplaneData.aircraftIcaoCode }); + ownAircraft().setCom1System(Aviation::CComSystem::getCom1System({ m_xplaneData.com1Active, CFrequencyUnit::kHz() }, { m_xplaneData.com1Standby, CFrequencyUnit::kHz() })); + ownAircraft().setCom2System(Aviation::CComSystem::getCom2System({ m_xplaneData.com2Active, CFrequencyUnit::kHz() }, { m_xplaneData.com2Standby, CFrequencyUnit::kHz() })); + ownAircraft().setTransponder(Aviation::CTransponder::getStandardTransponder(m_xplaneData.xpdrCode, xpdrMode(m_xplaneData.xpdrMode, m_xplaneData.xpdrIdent))); } } @@ -86,6 +120,20 @@ namespace BlackSimPlugin m_service->getEngineN1PercentageAsync(&m_xplaneData.enginesN1Percentage); m_service->getSpeedBrakeRatioAsync(&m_xplaneData.speedBrakeRatio); + CAircraftEngineList engines; + for (int engineNumber = 0; engineNumber < m_xplaneData.enginesN1Percentage.size(); ++engineNumber) + { + // Engine number start counting at 1 + // We consider the engine running when N1 is bigger than 5 % + CAircraftEngine engine {engineNumber + 1, m_xplaneData.enginesN1Percentage.at(engineNumber) > 5.0}; + engines.push_back(engine); + } + + Aviation::CAircraftParts parts { { m_xplaneData.strobeLightsOn, m_xplaneData.landingLightsOn, m_xplaneData.taxiLightsOn, + m_xplaneData.beaconLightsOn, m_xplaneData.navLightsOn, false }, + { m_xplaneData.gearReployRatio > 0 }, { static_cast(m_xplaneData.flapsReployRatio * 100) }, + { m_xplaneData.speedBrakeRatio > 0.5 }, engines, { m_xplaneData.onGroundAll } }; + ownAircraft().setParts(parts); } } @@ -191,54 +239,6 @@ namespace BlackSimPlugin emit ownAircraftModelChanged(ownAircraft()); } - // convert xplane squawk mode to swift squawk mode - BlackMisc::Aviation::CTransponder::TransponderMode xpdrMode(int xplaneMode, bool ident) - { - if (ident) { return BlackMisc::Aviation::CTransponder::StateIdent; } - if (xplaneMode == 0 || xplaneMode == 1) { return BlackMisc::Aviation::CTransponder::StateStandby; } - return BlackMisc::Aviation::CTransponder::ModeC; - } - // convert swift squawk mode to xplane squawk mode - int xpdrMode(BlackMisc::Aviation::CTransponder::TransponderMode mode) - { - return mode == BlackMisc::Aviation::CTransponder::StateStandby ? 1 : 2; - } - - CSimulatedAircraft CSimulatorXPlane::xplaneDataToSimulatedAircraft() const - { - if (! isConnected()) { return {}; } - Aviation::CAircraftSituation situation; - situation.setPosition({ m_xplaneData.latitude, m_xplaneData.longitude, 0 }); - situation.setAltitude({ m_xplaneData.altitude, Aviation::CAltitude::MeanSeaLevel, CLengthUnit::m() }); - situation.setHeading({ m_xplaneData.trueHeading, Aviation::CHeading::True, CAngleUnit::deg() }); - situation.setPitch({ m_xplaneData.pitch, CAngleUnit::deg() }); - situation.setBank({ m_xplaneData.roll, CAngleUnit::deg() }); - situation.setGroundspeed({ m_xplaneData.groundspeed, CSpeedUnit::m_s() }); - CSimulatedAircraft ac(ownAircraft()); - ac.setSituation(situation); - ac.setIcaoInfo(Aviation::CAircraftIcao { m_xplaneData.aircraftIcaoCode }); - ac.setCom1System(Aviation::CComSystem::getCom1System({ m_xplaneData.com1Active, CFrequencyUnit::kHz() }, { m_xplaneData.com1Standby, CFrequencyUnit::kHz() })); - ac.setCom2System(Aviation::CComSystem::getCom2System({ m_xplaneData.com2Active, CFrequencyUnit::kHz() }, { m_xplaneData.com2Standby, CFrequencyUnit::kHz() })); - ac.setTransponder(Aviation::CTransponder::getStandardTransponder(m_xplaneData.xpdrCode, xpdrMode(m_xplaneData.xpdrMode, m_xplaneData.xpdrIdent))); - - CAircraftEngineList engines; - - for (int engineNumber = 0; engineNumber < m_xplaneData.enginesN1Percentage.size(); ++engineNumber) - { - // Engine number start counting at 1 - // We consider the engine running when N1 is bigger than 5 % - CAircraftEngine engine {engineNumber + 1, m_xplaneData.enginesN1Percentage.at(engineNumber) > 5.0}; - engines.push_back(engine); - } - - Aviation::CAircraftParts parts { { m_xplaneData.strobeLightsOn, m_xplaneData.landingLightsOn, m_xplaneData.taxiLightsOn, - m_xplaneData.beaconLightsOn, m_xplaneData.navLightsOn, false }, - { m_xplaneData.gearReployRatio > 0 }, { static_cast(m_xplaneData.flapsReployRatio * 100) }, - { m_xplaneData.speedBrakeRatio > 0.5 }, engines, { m_xplaneData.onGroundAll } }; - ac.setParts(parts); - return ac; - } - void CSimulatorXPlane::displayStatusMessage(const BlackMisc::CStatusMessage &message) const { if (! isConnected()) { return; } @@ -344,22 +344,25 @@ namespace BlackSimPlugin return true; } - //! \todo XPlane driver, where would this go? -// void CSimulatorXPlane::addAircraftSituation(const BlackMisc::Aviation::CCallsign &callsign, -// const BlackMisc::Aviation::CAircraftSituation &situ) -// { -// if (! isConnected()) { return; } -// using namespace BlackMisc::PhysicalQuantities; -// m_traffic->setPlanePosition(callsign.asString(), -// situ.latitude().value(CAngleUnit::deg()), -// situ.longitude().value(CAngleUnit::deg()), -// situ.getAltitude().value(CLengthUnit::ft()), -// situ.getPitch().value(CAngleUnit::deg()), -// situ.getBank().value(CAngleUnit::deg()), -// situ.getHeading().value(CAngleUnit::deg())); -// m_traffic->setPlaneSurfaces(callsign.asString(), true, 0, 0, 0, 0, 0, 0, 0, 0, 0, true, true, true, true, 0); // TODO landing gear, lights, control surfaces -// m_traffic->setPlaneTransponder(callsign.asString(), 2000, true, false); // TODO transponder -// } + void CSimulatorXPlane::ps_addAircraftSituation(const BlackMisc::Aviation::CAircraftSituation &situ) + { + if (! isConnected()) { return; } + using namespace BlackMisc::PhysicalQuantities; + m_traffic->setPlanePosition(situ.getCallsign().asString(), + situ.latitude().value(CAngleUnit::deg()), + situ.longitude().value(CAngleUnit::deg()), + situ.getAltitude().value(CLengthUnit::ft()), + situ.getPitch().value(CAngleUnit::deg()), + situ.getBank().value(CAngleUnit::deg()), + situ.getHeading().value(CAngleUnit::deg())); + } + + void CSimulatorXPlane::ps_addAircraftParts(const BlackMisc::Aviation::CAircraftParts &parts) + { + if (! isConnected()) { return; } + m_traffic->setPlaneSurfaces(parts.getCallsign().asString(), true, 0, 0, 0, 0, 0, 0, 0, 0, 0, true, true, true, true, 0); // TODO landing gear, lights, control surfaces + m_traffic->setPlaneTransponder(parts.getCallsign().asString(), 2000, true, false); // TODO transponder + } bool CSimulatorXPlane::removeRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign) { diff --git a/src/plugins/simulator/xplane/simulator_xplane.h b/src/plugins/simulator/xplane/simulator_xplane.h index 7c93eaedb..60218e2ca 100644 --- a/src/plugins/simulator/xplane/simulator_xplane.h +++ b/src/plugins/simulator/xplane/simulator_xplane.h @@ -112,6 +112,9 @@ namespace BlackSimPlugin void ps_fastTimerTimeout(); void ps_slowTimerTimeout(); + void ps_addAircraftSituation(const BlackMisc::Aviation::CAircraftSituation &situ); + void ps_addAircraftParts(const BlackMisc::Aviation::CAircraftParts &parts); + private: QDBusConnection m_conn { "default" }; QDBusServiceWatcher *m_watcher { nullptr }; @@ -120,7 +123,6 @@ namespace BlackSimPlugin QTimer *m_fastTimer { nullptr }; QTimer *m_slowTimer { nullptr }; BlackMisc::Aviation::CAirportList m_airportsInRange; //!< aiports in range of own aircraft - BlackMisc::Simulation::CSimulatedAircraft xplaneDataToSimulatedAircraft() const; //! \todo Add units to members? pitchDeg?, altitudeFt? struct // data is written by DBus async method callbacks