From b0fd4e03b2ab899591f3bd47bfa8d5aae8edfe3b Mon Sep 17 00:00:00 2001 From: Roland Rossgotterer Date: Mon, 25 Feb 2019 09:19:48 +0100 Subject: [PATCH] Implement CSimulatorFs9::updateOwnSimulatorCockpit --- src/plugins/simulator/fs9/simulatorfs9.cpp | 26 +++++++++++---- src/plugins/simulator/fs9/simulatorfs9.h | 3 ++ src/plugins/simulator/fscommon/fsuipc.h | 3 ++ .../simulator/fscommon/fsuipcdummy.cpp | 6 ++++ src/plugins/simulator/fscommon/fsuipcimpl.cpp | 32 +++++++++++++++++++ 5 files changed, 64 insertions(+), 6 deletions(-) diff --git a/src/plugins/simulator/fs9/simulatorfs9.cpp b/src/plugins/simulator/fs9/simulatorfs9.cpp index 7efe463b5..0fc2ed1cf 100644 --- a/src/plugins/simulator/fs9/simulatorfs9.cpp +++ b/src/plugins/simulator/fs9/simulatorfs9.cpp @@ -240,7 +240,10 @@ namespace BlackSimPlugin if (newTransponder.getTransponderCode() != m_simTransponder.getTransponderCode()) { changed = true; } if (newTransponder.getTransponderMode() != m_simTransponder.getTransponderMode()) { changed = true; } - //! \todo KB 8/2017 set FS9 cockpit values + m_fsuipc->write(ownAircraft); + + // avoid changes of cockpit back to old values due to an outdated read back value + if (changed) { m_skipCockpitUpdateCycles = SkipUpdateCyclesForCockpit; } // bye return changed; @@ -371,11 +374,22 @@ namespace BlackSimPlugin void CSimulatorFs9::updateOwnAircraftFromSimulator(const CSimulatedAircraft &simDataOwnAircraft) { - this->updateCockpit( - simDataOwnAircraft.getCom1System(), - simDataOwnAircraft.getCom2System(), - simDataOwnAircraft.getTransponder(), - this->identifier()); + // When I change cockpit values in the sim (from GUI to simulator, not originating from simulator) + // it takes a little while before these values are set in the simulator. + // To avoid jitters, I wait some update cylces to stabilize the values + if (m_skipCockpitUpdateCycles < 1) + { + this->updateCockpit( + simDataOwnAircraft.getCom1System(), + simDataOwnAircraft.getCom2System(), + simDataOwnAircraft.getTransponder(), + this->identifier()); + } + else + { + m_skipCockpitUpdateCycles--; + } + this->updateOwnSituation(simDataOwnAircraft.getSituation()); reverseLookupAndUpdateOwnAircraftModel(simDataOwnAircraft.getModelString()); } diff --git a/src/plugins/simulator/fs9/simulatorfs9.h b/src/plugins/simulator/fs9/simulatorfs9.h index b817d0e91..86a8300ec 100644 --- a/src/plugins/simulator/fs9/simulatorfs9.h +++ b/src/plugins/simulator/fs9/simulatorfs9.h @@ -105,6 +105,9 @@ namespace BlackSimPlugin bool m_simConnected = false; //!< Is simulator connected? QSharedPointer m_fs9Host; QSharedPointer m_lobbyClient; + int m_skipCockpitUpdateCycles = 0; //!< skip some update cycles to allow changes in simulator cockpit to be set + + static constexpr int SkipUpdateCyclesForCockpit = 10; }; //! Listener for FS9 diff --git a/src/plugins/simulator/fscommon/fsuipc.h b/src/plugins/simulator/fscommon/fsuipc.h index 45f127431..c80a23df2 100644 --- a/src/plugins/simulator/fscommon/fsuipc.h +++ b/src/plugins/simulator/fscommon/fsuipc.h @@ -44,6 +44,9 @@ namespace BlackSimPlugin //! Really open, means connected and data can be sent bool isOpen() const; + //! Write aircraft + bool write(const BlackMisc::Simulation::CSimulatedAircraft &aircraft); + //! Write variables bool write(const BlackMisc::Aviation::CTransponder &xpdr); diff --git a/src/plugins/simulator/fscommon/fsuipcdummy.cpp b/src/plugins/simulator/fscommon/fsuipcdummy.cpp index 97315091c..84990cbd2 100644 --- a/src/plugins/simulator/fscommon/fsuipcdummy.cpp +++ b/src/plugins/simulator/fscommon/fsuipcdummy.cpp @@ -48,6 +48,12 @@ namespace BlackSimPlugin return false; } + bool CFsuipc::write(const CSimulatedAircraft &aircraft) + { + Q_UNUSED(aircraft); + return false; + } + bool CFsuipc::write(const CTransponder &xpdr) { Q_UNUSED(xpdr); diff --git a/src/plugins/simulator/fscommon/fsuipcimpl.cpp b/src/plugins/simulator/fscommon/fsuipcimpl.cpp index 837cb0cf2..726445e8f 100644 --- a/src/plugins/simulator/fscommon/fsuipcimpl.cpp +++ b/src/plugins/simulator/fscommon/fsuipcimpl.cpp @@ -148,6 +148,38 @@ namespace BlackSimPlugin return false; } + bool CFsuipc::write(const CSimulatedAircraft &aircraft) + { + Q_ASSERT_X(CThreadUtils::isCurrentThreadObjectThread(this), Q_FUNC_INFO, "Open not threadsafe"); + if (!this->isOpened()) { return false; } + + quint16 com1ActiveRaw = aircraft.getCom1System().getFrequencyActive().value(CFrequencyUnit::MHz()) * 100; + quint16 com2ActiveRaw = aircraft.getCom2System().getFrequencyActive().value(CFrequencyUnit::MHz()) * 100; + quint16 com1StandbyRaw = aircraft.getCom1System().getFrequencyStandby().value(CFrequencyUnit::MHz()) * 100; + quint16 com2StandbyRaw = aircraft.getCom2System().getFrequencyStandby().value(CFrequencyUnit::MHz()) * 100; + com1ActiveRaw = CBcdConversions::dec2Bcd(com1ActiveRaw - 10000); + com2ActiveRaw = CBcdConversions::dec2Bcd(com2ActiveRaw - 10000); + com1StandbyRaw = CBcdConversions::dec2Bcd(com1StandbyRaw - 10000); + com2StandbyRaw = CBcdConversions::dec2Bcd(com2StandbyRaw - 10000); + quint16 transponderCodeRaw = static_cast(aircraft.getTransponderCode()); + + transponderCodeRaw = CBcdConversions::dec2Bcd(transponderCodeRaw); + + DWORD dwResult = 0; + + bool ok = + FSUIPC_Write(0x034e, 2, &com1ActiveRaw, &dwResult) && + FSUIPC_Write(0x3118, 2, &com2ActiveRaw, &dwResult) && + FSUIPC_Write(0x311a, 2, &com1StandbyRaw, &dwResult) && + FSUIPC_Write(0x311c, 2, &com2StandbyRaw, &dwResult) && + FSUIPC_Write(0x0354, 2, &transponderCodeRaw, &dwResult); + if (ok) { FSUIPC_Process(&dwResult); } + + ok = ok && write(aircraft.getTransponder()); + + return ok && dwResult == 0; + } + bool CFsuipc::write(const CTransponder &xpdr) { Q_ASSERT_X(CThreadUtils::isCurrentThreadObjectThread(this), Q_FUNC_INFO, "Open not threadsafe");