refs #814, allow to disable aircraft parts updates, mostly for testing

* added flag in setup
* and UI
* plus some formatting in driver classes, removed unused member
This commit is contained in:
Klaus Basan
2016-11-29 01:14:47 +01:00
parent 8f779fff35
commit df2073e5e6
7 changed files with 94 additions and 51 deletions

View File

@@ -72,6 +72,7 @@ namespace BlackGui
connect(ui->cb_DebugDriver, &QCheckBox::stateChanged, this, &CInternalsComponent::ps_enableDebug);
connect(ui->cb_DebugInterpolator, &QCheckBox::stateChanged, this, &CInternalsComponent::ps_enableDebug);
connect(ui->cb_ForceFullInterpolation, &QCheckBox::stateChanged, this, &CInternalsComponent::ps_enableDebug);
connect(ui->cb_EnableParts, &QCheckBox::stateChanged, this, &CInternalsComponent::ps_enableDebug);
connect(ui->pb_SendTextMessage, &QPushButton::pressed, this, &CInternalsComponent::ps_sendTextMessage);
connect(ui->tb_LogStatusMessage, &QPushButton::pressed, this, &CInternalsComponent::ps_logStatusMessage);
@@ -176,17 +177,18 @@ namespace BlackGui
bool debug = (checkState == Qt::Checked);
QObject *sender = QObject::sender();
if (sender == ui->cb_DebugContextApplication) { sGui->getIContextApplication()->setDebugEnabled(debug); }
else if (sender == ui->cb_DebugContextAudio) { sGui->getIContextAudio()->setDebugEnabled(debug); }
else if (sender == ui->cb_DebugContextNetwork) { sGui->getIContextNetwork()->setDebugEnabled(debug);}
else if (sender == ui->cb_DebugContextOwnAircraft) { sGui->getIContextOwnAircraft()->setDebugEnabled(debug); }
else if (sender == ui->cb_DebugContextSimulator) { sGui->getIContextSimulator()->setDebugEnabled(debug);}
else if (sender == ui->cb_DebugDriver || sender == ui->cb_DebugInterpolator || sender == ui->cb_ForceFullInterpolation)
if (sender == ui->cb_DebugContextApplication) { sGui->getIContextApplication()->setDebugEnabled(debug); }
else if (sender == ui->cb_DebugContextAudio) { sGui->getIContextAudio()->setDebugEnabled(debug); }
else if (sender == ui->cb_DebugContextNetwork) { sGui->getIContextNetwork()->setDebugEnabled(debug);}
else if (sender == ui->cb_DebugContextOwnAircraft) { sGui->getIContextOwnAircraft()->setDebugEnabled(debug); }
else if (sender == ui->cb_DebugContextSimulator) { sGui->getIContextSimulator()->setDebugEnabled(debug);}
else if (sender == ui->cb_DebugDriver || sender == ui->cb_EnableParts || sender == ui->cb_DebugInterpolator || sender == ui->cb_ForceFullInterpolation)
{
CInterpolationAndRenderingSetup setup;
setup.setForceFullInterpolation(ui->cb_ForceFullInterpolation->isChecked());
setup.setDriverDebuggingMessages(ui->cb_DebugDriver->isChecked());
setup.setInterpolatorDebuggingMessages(ui->cb_DebugInterpolator->isChecked());
setup.setEnabledAircraftParts(ui->cb_EnableParts->isChecked());
sGui->getIContextSimulator()->setInterpolationAndRenderingSetup(setup);
}
}

View File

@@ -104,7 +104,7 @@
<item row="0" column="0">
<widget class="QCheckBox" name="cb_DebugDriver">
<property name="text">
<string>Driver dbg. msgs.</string>
<string>driver dbg. msgs.</string>
</property>
</widget>
</item>
@@ -115,10 +115,20 @@
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<item row="1" column="0">
<widget class="QCheckBox" name="cb_ForceFullInterpolation">
<property name="text">
<string>force full interpolation</string>
<string>force full interpol.</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="cb_EnableParts">
<property name="text">
<string>enable parts</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>

View File

@@ -34,6 +34,11 @@ namespace BlackMisc
return isRenderingEnabled() && (isMaxAircraftRestricted() || isMaxDistanceRestricted());
}
bool CInterpolationAndRenderingSetup::isAircraftPartsEnabled() const
{
return this->m_enabledAircraftParts;
}
int CInterpolationAndRenderingSetup::getMaxRenderedAircraft() const
{
return (m_maxRenderedAircraft <= InfiniteAircraft()) ? m_maxRenderedAircraft : InfiniteAircraft();
@@ -79,6 +84,13 @@ namespace BlackMisc
return true;
}
bool CInterpolationAndRenderingSetup::setEnabledAircraftParts(bool enabled)
{
if (this->m_enabledAircraftParts == enabled) { return false; }
m_enabledAircraftParts = enabled;
return true;
}
void CInterpolationAndRenderingSetup::clearMaxRenderedDistance()
{
this->setMaxRenderedDistance(CLength(0.0, CLengthUnit::nullUnit()));
@@ -154,6 +166,8 @@ namespace BlackMisc
return CVariant::fromValue(m_maxRenderedAircraft);
case IndexMaxRenderedDistance:
return CVariant::fromValue(m_maxRenderedDistance);
case IndexEnabledAircraftParts:
return CVariant::fromValue(m_enabledAircraftParts);
default:
return CValueObject::propertyByIndex(index);
}
@@ -184,6 +198,9 @@ namespace BlackMisc
case IndexMaxRenderedDistance:
this->m_maxRenderedDistance = variant.value<CLength>();
break;
case IndexEnabledAircraftParts:
this->m_enabledAircraftParts = variant.toBool();
break;
default:
CValueObject::setPropertyByIndex(index, variant);
break;

View File

@@ -34,7 +34,8 @@ namespace BlackMisc
IndexSimulatorDebugMessages,
IndexForceFullInterpolation,
IndexMaxRenderedAircraft,
IndexMaxRenderedDistance
IndexMaxRenderedDistance,
IndexEnabledAircraftParts
};
//! Constructor.
@@ -70,6 +71,9 @@ namespace BlackMisc
//! Max. distance for rendering
bool setMaxRenderedDistance(const BlackMisc::PhysicalQuantities::CLength &distance);
//! Set enabled aircraft parts
bool setEnabledAircraftParts(bool enabled);
//! Disable
void clearMaxRenderedDistance();
@@ -79,6 +83,9 @@ namespace BlackMisc
//! Rendering enabled, but restricted
bool isRenderingRestricted() const;
//! Aircraft parts enabled
bool isAircraftPartsEnabled() const;
//! Max.distance for rendering
BlackMisc::PhysicalQuantities::CLength getMaxRenderedDistance() const { return m_maxRenderedDistance; }
@@ -107,9 +114,10 @@ namespace BlackMisc
void setPropertyByIndex(const BlackMisc::CPropertyIndex &index, const CVariant &variant);
private:
bool m_interpolatorDebugMessage = false; //! Debug messages in interpolator
bool m_simulatorDebugMessages = false; //! Debug messages of simulator (aka plugin)
bool m_forceFullInterpolation = false; //! always do a full interpolation, even if aircraft is not moving
bool m_interpolatorDebugMessage = false; //! Debug messages in interpolator
bool m_simulatorDebugMessages = false; //! Debug messages of simulator (aka plugin)
bool m_forceFullInterpolation = false; //! always do a full interpolation, even if aircraft is not moving
bool m_enabledAircraftParts = true; //! Update aircraft parts
int m_maxRenderedAircraft = InfiniteAircraft(); //!< max.rendered aircraft
BlackMisc::PhysicalQuantities::CLength m_maxRenderedDistance { 0.0, BlackMisc::PhysicalQuantities::CLengthUnit::nullUnit()}; //!< max.distance for rendering
@@ -118,6 +126,7 @@ namespace BlackMisc
BLACK_METAMEMBER(interpolatorDebugMessage),
BLACK_METAMEMBER(simulatorDebugMessages),
BLACK_METAMEMBER(forceFullInterpolation),
BLACK_METAMEMBER(enabledAircraftParts),
BLACK_METAMEMBER(maxRenderedAircraft),
BLACK_METAMEMBER(maxRenderedDistance)
);

View File

@@ -74,6 +74,9 @@ namespace BlackSimPlugin
// Position
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraftPosition, "Initial Position", NULL, SIMCONNECT_DATATYPE_INITPOSITION);
// Hint: "Bool" and "Percent .." are units name
// default data type is SIMCONNECT_DATATYPE_FLOAT64 -> double
// Lights
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraftParts, "LIGHT STROBE", "Bool");
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraftParts, "LIGHT LANDING", "Bool");

View File

@@ -93,7 +93,7 @@ namespace BlackSimPlugin
// set structures and move on
initEvents();
initDataDefinitionsWhenConnected();
m_simconnectTimerId = startTimer(10);
m_simConnectTimerId = startTimer(10);
m_realityBubbleTimer.start();
reloadWeatherSettings();
return true;
@@ -102,8 +102,8 @@ namespace BlackSimPlugin
bool CSimulatorFsx::disconnectFrom()
{
if (!m_simConnected) { return true; }
if (m_simconnectTimerId >= 0) { killTimer(m_simconnectTimerId); }
m_simconnectTimerId = -1;
if (m_simConnectTimerId >= 0) { killTimer(m_simConnectTimerId); }
m_simConnectTimerId = -1;
if (m_hSimConnect)
{
SimConnect_Close(m_hSimConnect);
@@ -803,8 +803,9 @@ namespace BlackSimPlugin
const int remoteAircraftNo = this->getAircraftInRangeCount();
if (remoteAircraftNo < 1) { m_interpolationRequest = 0; return; }
// interpolate and send to SIM
// interpolate and send to simulator
m_interpolationRequest++;
const bool enableAircraftParts = m_interpolationRenderingSetup.isAircraftPartsEnabled(); // allow to disable all parts updates for testing
// values used for position and parts
bool isOnGround = false;
@@ -814,7 +815,7 @@ namespace BlackSimPlugin
const QList<CSimConnectObject> simObjects(m_simConnectObjects.values());
for (const CSimConnectObject &simObj : simObjects)
{
// happending if aircraft is not yet added to SIM or to be deleted
// happening if aircraft is not yet added to simulator or to be deleted
if (simObj.isPendingAdded()) { continue; }
if (simObj.isPendingRemoved()) { continue; }
@@ -828,9 +829,9 @@ namespace BlackSimPlugin
// having the onGround flag in parts forces me to obtain parts here
// which is not the smartest thing regarding performance
IInterpolator::PartsStatus partsStatus;
partsStatus.setSupportsParts(aircraftWithParts.contains(callsign));
partsStatus.setSupportsParts(enableAircraftParts && aircraftWithParts.contains(callsign));
CAircraftPartsList parts;
if (partsStatus.allTrue())
if (enableAircraftParts && partsStatus.allTrue())
{
parts = this->m_interpolator->getPartsBeforeTime(callsign, currentTimestamp, partsStatus);
}
@@ -841,7 +842,7 @@ namespace BlackSimPlugin
SIMCONNECT_DATA_INITPOSITION position = aircraftSituationToFsxPosition(interpolatedSituation);
//! \fixme The onGround in parts is no ideal, as already mentioned in the discussion
// a) I am forced to read parts even if i just want to update position
// a) I am forced to read parts even if I just want to update position
// b) Unlike the other values it is not a fire and forget value, as I need it again in the next cycle
if (partsStatus.isSupportingParts() && !parts.isEmpty())
{
@@ -867,9 +868,12 @@ namespace BlackSimPlugin
if (interpolatorStatus.didInterpolationSucceed())
{
// aircraft parts
// inside "interpolator if", as no parts can be sent without position
updateRemoteAircraftParts(simObj, parts, partsStatus, interpolatedSituation, isOnGround); // update and retrieve parts in the same step
// aircraft parts inside "interpolator if", as no parts can be set without situation
// situation is used to anticipate parts if other client does not send them
if (enableAircraftParts)
{
updateRemoteAircraftParts(simObj, parts, partsStatus, interpolatedSituation, isOnGround); // update and retrieve parts in the same step
}
}
} // all callsigns
@@ -892,17 +896,17 @@ namespace BlackSimPlugin
// we have parts
CAircraftParts newestParts = parts.front();
ddRemoteAircraftParts.lightStrobe = newestParts.getLights().isStrobeOn() ? 1.0 : 0.0;
ddRemoteAircraftParts.lightLanding = newestParts.getLights().isLandingOn() ? 1.0 : 0.0;
// ddRemoteAircraftParts.lightTaxi = newestParts.getLights().isTaxiOn() ? 1.0 : 0.0;
ddRemoteAircraftParts.lightBeacon = newestParts.getLights().isBeaconOn() ? 1.0 : 0.0;
ddRemoteAircraftParts.lightNav = newestParts.getLights().isNavOn() ? 1.0 : 0.0;
ddRemoteAircraftParts.lightLogo = newestParts.getLights().isLogoOn() ? 1.0 : 0.0;
ddRemoteAircraftParts.lightStrobe = newestParts.getLights().isStrobeOn() ? 1 : 0;
ddRemoteAircraftParts.lightLanding = newestParts.getLights().isLandingOn() ? 1 : 0;
// ddRemoteAircraftParts.lightTaxi = newestParts.getLights().isTaxiOn() ? 1 : 0;
ddRemoteAircraftParts.lightBeacon = newestParts.getLights().isBeaconOn() ? 1 : 0;
ddRemoteAircraftParts.lightNav = newestParts.getLights().isNavOn() ? 1 : 0;
ddRemoteAircraftParts.lightLogo = newestParts.getLights().isLogoOn() ? 1 : 0;
ddRemoteAircraftParts.flapsLeadingEdgeLeftPercent = newestParts.getFlapsPercent() / 100.0;
ddRemoteAircraftParts.flapsLeadingEdgeRightPercent = newestParts.getFlapsPercent() / 100.0;
ddRemoteAircraftParts.flapsTrailingEdgeLeftPercent = newestParts.getFlapsPercent() / 100.0;
ddRemoteAircraftParts.flapsTrailingEdgeRightPercent = newestParts.getFlapsPercent() / 100.0;
ddRemoteAircraftParts.spoilersHandlePosition = newestParts.isSpoilersOut() ? 1.0 : 0.0;
ddRemoteAircraftParts.spoilersHandlePosition = newestParts.isSpoilersOut() ? 1 : 0;
ddRemoteAircraftParts.gearHandlePosition = newestParts.isGearDown() ? 1 : 0;
ddRemoteAircraftParts.engine1Combustion = newestParts.isEngineOn(1) ? 1 : 0;
ddRemoteAircraftParts.engine2Combustion = newestParts.isEngineOn(2) ? 1 : 0;
@@ -912,43 +916,43 @@ namespace BlackSimPlugin
else
{
// mode is guessing parts
if (this->m_interpolationRequest % 20 != 0) { return false; } // only update every 20th cycle
// if (this->m_interpolationRequest % 20 != 0) { return false; } // only update every 20th cycle
ddRemoteAircraftParts.gearHandlePosition = isOnGround ? 1 : 0;
// when first detected moving, lights on
if (isOnGround)
{
// ddRemoteAircraftParts.lightTaxi = 1.0;
ddRemoteAircraftParts.lightBeacon = 1.0;
ddRemoteAircraftParts.lightNav = 1.0;
// ddRemoteAircraftParts.lightTaxi = 1;
ddRemoteAircraftParts.lightBeacon = 1;
ddRemoteAircraftParts.lightNav = 1;
double gskmh = interpolatedSituation.getGroundSpeed().value(CSpeedUnit::km_h());
if (gskmh > 7.5)
{
// mode taxi
// ddRemoteAircraftParts.lightTaxi = 1.0;
ddRemoteAircraftParts.lightLanding = 0.0;
// ddRemoteAircraftParts.lightTaxi = 1;
ddRemoteAircraftParts.lightLanding = 0;
}
else if (gskmh > 25)
{
// mode accelaration for takeoff
// ddRemoteAircraftParts.lightTaxi = 0.0;
ddRemoteAircraftParts.lightLanding = 1.0;
// ddRemoteAircraftParts.lightTaxi = 0;
ddRemoteAircraftParts.lightLanding = 1;
}
else
{
// slow movements or parking
// ddRemoteAircraftParts.lightTaxi = 0.0;
ddRemoteAircraftParts.lightLanding = 0.0;
// ddRemoteAircraftParts.lightTaxi = 0;
ddRemoteAircraftParts.lightLanding = 0;
}
}
else
{
// ddRemoteAircraftParts.lightTaxi = 0.0;
ddRemoteAircraftParts.lightBeacon = 1.0;
ddRemoteAircraftParts.lightNav = 1.0;
// ddRemoteAircraftParts.lightTaxi = 0;
ddRemoteAircraftParts.lightBeacon = 1;
ddRemoteAircraftParts.lightNav = 1;
// landing lights for < 10000ft (normally MSL, here ignored)
ddRemoteAircraftParts.lightLanding = (interpolatedSituation.getAltitude().value(CLengthUnit::ft()) < 10000) ? 1.0 : 0;
ddRemoteAircraftParts.lightLanding = (interpolatedSituation.getAltitude().value(CLengthUnit::ft()) < 10000) ? 1 : 0;
}
}
@@ -1052,14 +1056,13 @@ namespace BlackSimPlugin
void CSimulatorFsx::reset()
{
if (m_simconnectTimerId >= 0) { killTimer(m_simconnectTimerId); }
m_simconnectTimerId = -1;
if (m_simConnectTimerId >= 0) { killTimer(m_simConnectTimerId); }
m_simConnectTimerId = -1;
m_simConnected = false;
m_simSimulating = false;
m_syncDeferredCounter = 0;
m_skipCockpitUpdateCycles = 0;
m_interpolationRequest = 0;
m_interpolationsSkipped = 0;
m_requestId = 1;
m_dispatchErrors = 0;
m_receiveExceptionCount = 0;

View File

@@ -212,14 +212,13 @@ namespace BlackSimPlugin
bool m_simSimulating = false; //!< Simulator running?
bool m_useSbOffsets = true; //!< with SB offsets
int m_syncDeferredCounter = 0; //!< Set when synchronized, used to wait some time
int m_simconnectTimerId = -1; //!< Timer identifier
int m_simConnectTimerId = -1; //!< Timer identifier
int m_skipCockpitUpdateCycles = 0; //!< Skip some update cycles to allow changes in simulator cockpit to be set
int m_interpolationRequest = 0; //!< current interpolation request
int m_interpolationsSkipped = 0; //!< number of skipped interpolation request
int m_dispatchErrors = 0; //!< number of dispatched failed, \sa ps_dispatch
int m_receiveExceptionCount = 0; //!< exceptions
DWORD m_requestId = 1; //!< request id
HANDLE m_hSimConnect = nullptr; //!< Handle to SimConnect object
HANDLE m_hSimConnect = nullptr; //!< handle to SimConnect object
CSimConnectObjects m_simConnectObjects; //!< AI objects and their object / request ids
BlackMisc::Simulation::CSimulatedAircraftList m_outOfRealityBubble; //!< aircraft removed by FSX because they are out of reality bubble
BlackMisc::Geo::CCoordinateGeodetic m_lastWeatherPosition; //!< Own aircraft position at which weather was fetched and injected last