Slow parts update and using event for flaps, as sim. variable sets the flaps, but then always retracts it.

https://swift-project.slack.com/archives/G96QTUBEG/p1558454646002200
This commit is contained in:
Klaus Basan
2019-05-23 12:54:45 +02:00
committed by Mat Sutcliffe
parent b1d265bc0b
commit f7add9f33e
5 changed files with 45 additions and 22 deletions

View File

@@ -357,8 +357,12 @@ namespace BlackSimPlugin
void DataDefinitionRemoteAircraftPartsWithoutLights::initFromParts(const CAircraftParts &parts)
{
gearHandlePosition = parts.isGearDown() ? 1.0 : 0.0;
flapsTrailingEdgeLeftPercent = flapsTrailingEdgeRightPercent = parts.getFlapsPercent() / 100.0;
flapsLeadingEdgeLeftPercent = flapsLeadingEdgeRightPercent = parts.getFlapsPercent() * 0.2 / 100.0;
const double trail = parts.getFlapsPercent() / 100.0;
const double lead = trail;
flapsTrailingEdgeLeftPercent = trail;
flapsLeadingEdgeRightPercent = trail;
flapsLeadingEdgeLeftPercent = lead;
flapsLeadingEdgeRightPercent = lead;
spoilersHandlePosition = parts.isSpoilersOut() ? 1.0 : 0.0;
this->setAllEngines(false); // init

View File

@@ -118,10 +118,10 @@ namespace BlackSimPlugin
//! Data struct of remote aircraft parts
struct FSXCOMMON_EXPORT DataDefinitionRemoteAircraftPartsWithoutLights
{
double flapsLeadingEdgeLeftPercent; //!< Leading edge left in percent
double flapsLeadingEdgeRightPercent; //!< Leading edge right in percent
double flapsTrailingEdgeLeftPercent; //!< Trailing edge left in percent
double flapsTrailingEdgeRightPercent; //!< Trailing edge right in percent
double flapsLeadingEdgeLeftPercent; //!< Leading edge left in percent 0..1
double flapsLeadingEdgeRightPercent; //!< Leading edge right in percent 0..1
double flapsTrailingEdgeLeftPercent; //!< Trailing edge left in percent 0..1
double flapsTrailingEdgeRightPercent; //!< Trailing edge right in percent 0..1
double gearHandlePosition; //!< Gear handle position
double spoilersHandlePosition; //!< Spoilers out?
double engine1Combustion; //!< Engine 1 combustion flag

View File

@@ -1862,6 +1862,8 @@ namespace BlackSimPlugin
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventToggleTaxiLights, "TOGGLE_TAXI_LIGHTS");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventToggleWingLights, "TOGGLE_WING_LIGHTS");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventFlapsSet, "FLAPS_SET");
if (isFailure(hr))
{
CLogMessage(this).error(u"FSX plugin error: %1") << "SimConnect_MapClientEventToSimEvent failed";
@@ -1920,7 +1922,11 @@ namespace BlackSimPlugin
// values used for position and parts
const qint64 currentTimestamp = QDateTime::currentMSecsSinceEpoch();
if (this->isUpdateAircraftLimitedWithStats(currentTimestamp)) { return; }
if (this->isUpdateAircraftLimitedWithStats(currentTimestamp))
{
this->finishUpdateRemoteAircraftAndSetStatistics(currentTimestamp, true);
return;
}
m_updateRemoteAircraftInProgress = true;
// interpolation for all remote aircraft
@@ -1946,11 +1952,13 @@ namespace BlackSimPlugin
// Interpolated situation
// simObjectNumber is passed to equally distributed steps like guessing parts
const bool slowUpdate = (((m_statsUpdateAircraftRuns + simObjectNumber) % 40) == 0);
const CInterpolationResult result = simObject.getInterpolation(currentTimestamp, setup, simObjectNumber++);
const bool forceUpdate = slowUpdate || updateAllAircraft || setup.isForcingFullInterpolation();
if (result.getInterpolationStatus().hasValidSituation())
{
// update situation
if (updateAllAircraft || setup.isForcingFullInterpolation() || !this->isEqualLastSent(result.getInterpolatedSituation()))
if (forceUpdate || !this->isEqualLastSent(result.getInterpolatedSituation()))
{
SIMCONNECT_DATA_INITPOSITION position = this->aircraftSituationToFsxPosition(result, sendGround);
const HRESULT hr = this->logAndTraceSendId(
@@ -1971,7 +1979,7 @@ namespace BlackSimPlugin
}
// Interpolated parts
const bool updatedParts = this->updateRemoteAircraftParts(simObject, result);
const bool updatedParts = this->updateRemoteAircraftParts(simObject, result, forceUpdate);
Q_UNUSED(updatedParts);
} // all callsigns
@@ -1980,7 +1988,7 @@ namespace BlackSimPlugin
this->finishUpdateRemoteAircraftAndSetStatistics(currentTimestamp);
}
bool CSimulatorFsxCommon::updateRemoteAircraftParts(const CSimConnectObject &simObject, const CInterpolationResult &result)
bool CSimulatorFsxCommon::updateRemoteAircraftParts(const CSimConnectObject &simObject, const CInterpolationResult &result, bool forcedUpdate)
{
if (!simObject.hasValidRequestAndObjectId()) { return false; }
if (!simObject.isConfirmedAdded()) { return false; }
@@ -1990,10 +1998,9 @@ namespace BlackSimPlugin
if (parts.getPartsDetails() != CAircraftParts::GuessedParts && !result.getPartsStatus().isSupportingParts()) { return false; }
const CCallsign cs = simObject.getCallsign();
if (result.getPartsStatus().isReusedParts() || this->isEqualLastSent(parts, cs)) { return true; }
if (!forcedUpdate && (result.getPartsStatus().isReusedParts() || this->isEqualLastSent(parts, cs))) { return true; }
DataDefinitionRemoteAircraftPartsWithoutLights ddRemoteAircraftPartsWithoutLights(parts); // all values will be set
const bool ok = this->sendRemoteAircraftPartsToSimulator(simObject, ddRemoteAircraftPartsWithoutLights, parts.getAdjustedLights());
const bool ok = this->sendRemoteAircraftPartsToSimulator(simObject, parts);
if (ok) { this->rememberLastSent(parts, cs); }
return ok;
}
@@ -2032,16 +2039,19 @@ namespace BlackSimPlugin
}
}
bool CSimulatorFsxCommon::sendRemoteAircraftPartsToSimulator(const CSimConnectObject &simObject, DataDefinitionRemoteAircraftPartsWithoutLights &ddRemoteAircraftPartsWithoutLights, const CAircraftLights &lights)
bool CSimulatorFsxCommon::sendRemoteAircraftPartsToSimulator(const CSimConnectObject &simObject, const CAircraftParts &parts)
{
Q_ASSERT(m_hSimConnect);
if (!simObject.isReadyToSend()) { return false; }
const DWORD objectId = simObject.getObjectId();
const bool traceId = this->isTracingSendId();
const bool simObjectAircraftType = simObject.isAircraftSimulatedObject(); // no real aircraft type
DataDefinitionRemoteAircraftPartsWithoutLights ddRemoteAircraftPartsWithoutLights(parts);
const CAircraftLights lights = parts.getAdjustedLights();
// in case we sent, we sent everything
const bool simObjectAircraftType = simObject.isAircraftSimulatedObject(); // no real aircraft type
const HRESULT hr1 = simObjectAircraftType ?
S_OK :
this->logAndTraceSendId(
@@ -2050,14 +2060,21 @@ namespace BlackSimPlugin
sizeof(DataDefinitionRemoteAircraftPartsWithoutLights), &ddRemoteAircraftPartsWithoutLights),
traceId, simObject, "Failed so set parts", Q_FUNC_INFO, "SimConnect_SetDataOnSimObject::ddRemoteAircraftPartsWithoutLights");
// lights we can set directly
// Sim variable version, not working, setting the value, but flaps retracting to 0 again
// Sets flap handle to closest increment (0 to 16383)
const DWORD flapsDw = static_cast<DWORD>(qMin(16383, qRound((parts.getFlapsPercent() / 100.0) * 16383)));
const HRESULT hr2 = this->logAndTraceSendId(
SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventFlapsSet, flapsDw,
SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
traceId, simObject, "Failed so set flaps", Q_FUNC_INFO, "SimConnect_TransmitClientEvent::EventFlapsSet");
// lights we can set directly
const HRESULT hr3 = this->logAndTraceSendId(
SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventLandingLightsSet, lights.isLandingOn() ? 1.0 : 0.0,
SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
traceId, simObject, "Failed so set landing lights", Q_FUNC_INFO, "SimConnect_TransmitClientEvent::EventLandingLightsSet");
const HRESULT hr3 = this->logAndTraceSendId(
const HRESULT hr4 = this->logAndTraceSendId(
SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventStrobesSet, lights.isStrobeOn() ? 1.0 : 0.0,
SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
traceId, simObject, "Failed to set strobe lights", Q_FUNC_INFO, "SimConnect_TransmitClientEvent::EventStrobesSet");
@@ -2067,7 +2084,7 @@ namespace BlackSimPlugin
this->sendToggledLightsToSimulator(simObject, lights);
// done
return isOk(hr1, hr2, hr3);
return isOk(hr1, hr2, hr3, hr4);
}
bool CSimulatorFsxCommon::sendRemoteAircraftAtcDataToSimulator(const CSimConnectObject &simObject)

View File

@@ -82,6 +82,9 @@ namespace BlackSimPlugin
EventToggleRecognitionLights,
EventToggleTaxiLights,
EventToggleWingLights,
// ------------- flaps -------------
EventFlapsSet,
// ---------- end marker -----------
EventFSXEndMarker
};
@@ -431,7 +434,7 @@ namespace BlackSimPlugin
void updateRemoteAircraft();
//! Update remote aircraft parts (send to FSX)
bool updateRemoteAircraftParts(const CSimConnectObject &simObject, const BlackMisc::Simulation::CInterpolationResult &result);
bool updateRemoteAircraftParts(const CSimConnectObject &simObject, const BlackMisc::Simulation::CInterpolationResult &result, bool forcedUpdate);
//! Calling CSimulatorFsxCommon::updateAirports
void triggerUpdateAirports(const BlackMisc::Aviation::CAirportList &airports);
@@ -441,7 +444,7 @@ namespace BlackSimPlugin
//! Send parts to simulator
//! \remark does not send if there is no change
bool sendRemoteAircraftPartsToSimulator(const CSimConnectObject &simObject, DataDefinitionRemoteAircraftPartsWithoutLights &ddRemoteAircraftParts, const BlackMisc::Aviation::CAircraftLights &lights);
bool sendRemoteAircraftPartsToSimulator(const CSimConnectObject &simObject, const BlackMisc::Aviation::CAircraftParts &parts);
//! Send ATC data (callsign etc.) to simulator
bool sendRemoteAircraftAtcDataToSimulator(const CSimConnectObject &simObject);