Ref T437, FSX common improvements

* some SB area fixes like SIMCONNECT_CLIENT_DATA_SET_FLAG_DEFAULT
* use either SB area or FSUIPC
* also write XPDR via FSUIPC
This commit is contained in:
Klaus Basan
2018-11-20 03:13:14 +01:00
parent d2ca97846d
commit 7bd3d2793e
4 changed files with 32 additions and 22 deletions

View File

@@ -240,7 +240,7 @@ namespace BlackSimPlugin
hr += SimConnect_AddToClientDataDefinition(hSimConnect, CSimConnectDefinitions::DataClientAreaSbStandby, 17, 1); // standby
hr += SimConnect_AddToClientDataDefinition(hSimConnect, CSimConnectDefinitions::DataClientAreaSbIdent, 19, 1); // ident
hr += SimConnect_AddToClientDataDefinition(hSimConnect, CSimConnectDefinitions::DataClientAreaSbConnected, 1, 1); // network connected
hr += SimConnect_AddToClientDataDefinition(hSimConnect, CSimConnectDefinitions::DataClientAreaSbRunning, 0, 1); // SB4 running
hr += SimConnect_AddToClientDataDefinition(hSimConnect, CSimConnectDefinitions::DataClientAreaSbRunning, 0, 1); // SB running
if (isFailure(hr))
{
@@ -252,8 +252,8 @@ namespace BlackSimPlugin
DataDefinitionClientAreaSb sbArea;
byte sbRunning = 1;
sbArea.setDefaultValues();
hr += SimConnect_SetClientData(hSimConnect, ClientAreaSquawkBox, CSimConnectDefinitions::DataClientAreaSb, SIMCONNECT_CLIENT_DATA_REQUEST_FLAG_DEFAULT, 0, sbSize, &sbArea);
hr += SimConnect_SetClientData(hSimConnect, ClientAreaSquawkBox, CSimConnectDefinitions::DataClientAreaSbRunning, SIMCONNECT_CLIENT_DATA_REQUEST_FLAG_DEFAULT, 0, 1, &sbRunning);
hr += SimConnect_SetClientData(hSimConnect, ClientAreaSquawkBox, CSimConnectDefinitions::DataClientAreaSb, SIMCONNECT_CLIENT_DATA_SET_FLAG_DEFAULT, 0, sbSize, &sbArea);
hr += SimConnect_SetClientData(hSimConnect, ClientAreaSquawkBox, CSimConnectDefinitions::DataClientAreaSbRunning, SIMCONNECT_CLIENT_DATA_SET_FLAG_DEFAULT, 0, 1, &sbRunning);
if (isFailure(hr))
{
CLogMessage(static_cast<CSimConnectDefinitions *>(nullptr)).error("SimConnect error: SimConnect_SetClientData %1") << hr;

View File

@@ -194,7 +194,7 @@ namespace BlackSimPlugin
std::fill(data, data + 128, static_cast<byte>(0));
data[0] = 1; // SB running, indicates the client is running as external app, 0..not running, 1..external app, 2..FS module
data[1] = 0; // SB connected to FSD, 0..not connected, 1..connected
data[17] = 1; // standby
data[17] = 1; // 1..standby, 0..mode C
data[19] = 0; // no ident
}
};
@@ -220,11 +220,11 @@ namespace BlackSimPlugin
DataRemoteAircraftGetPosition, //!< get position to evaluate altitude / AGL
DataRemoteAircraftModelData, //!< model data eventually used and reported back from simulator
DataSimEnvironment,
DataClientAreaSb, //!< whole SB area
DataClientAreaSbIdent, //!< SB ident single value
DataClientAreaSbStandby, //!< SB standby
DataClientAreaSbConnected, //!< SB connected with network
DataClientAreaSbRunning //!< SB running
DataClientAreaSb, //!< whole SB area, see http://squawkbox.ca/doc/sdk/fsuipc.php
DataClientAreaSbIdent, //!< SB ident single value 0x7b93/19
DataClientAreaSbStandby, //!< SB standby 0x7b91/17
DataClientAreaSbConnected, //!< SB connected with network 0x7b81/1
DataClientAreaSbRunning //!< SB running 0x7b80/0
};
//! SimConnect request IDs

View File

@@ -190,20 +190,25 @@ namespace BlackSimPlugin
if (newTransponder.getTransponderMode() != m_simTransponder.getTransponderMode())
{
// use one way to transfer XPDR ident/mode not both
if (m_useSbOffsets)
{
byte ident = newTransponder.isIdentifying() ? 1U : 0U; // 1 is ident
byte standby = newTransponder.isInStandby() ? 1U : 0U; // 1 is standby
HRESULT hr = s_ok();
hr += SimConnect_SetClientData(m_hSimConnect, ClientAreaSquawkBox, CSimConnectDefinitions::DataClientAreaSbIdent, SIMCONNECT_CLIENT_DATA_REQUEST_FLAG_DEFAULT, 0, 1, &ident);
hr += SimConnect_SetClientData(m_hSimConnect, ClientAreaSquawkBox, CSimConnectDefinitions::DataClientAreaSbStandby, SIMCONNECT_CLIENT_DATA_REQUEST_FLAG_DEFAULT, 0, 1, &standby);
hr += SimConnect_SetClientData(m_hSimConnect, ClientAreaSquawkBox, CSimConnectDefinitions::DataClientAreaSbIdent, SIMCONNECT_CLIENT_DATA_SET_FLAG_DEFAULT, 0, 1, &ident);
hr += SimConnect_SetClientData(m_hSimConnect, ClientAreaSquawkBox, CSimConnectDefinitions::DataClientAreaSbStandby, SIMCONNECT_CLIENT_DATA_SET_FLAG_DEFAULT, 0, 1, &standby);
if (isFailure(hr))
{
this->triggerAutoTraceSendId();
CLogMessage(this).warning("Setting transponder mode failed (SB offsets)");
}
}
else if (m_useFsuipc && m_fsuipc)
{
m_fsuipc->write(newTransponder);
}
changed = true;
}
@@ -354,7 +359,7 @@ namespace BlackSimPlugin
// update SB area network connected
byte sbNetworkConnected = connected ? 1u : 0u;
HRESULT hr = SimConnect_SetClientData(m_hSimConnect, ClientAreaSquawkBox, CSimConnectDefinitions::DataClientAreaSbConnected, SIMCONNECT_CLIENT_DATA_REQUEST_FLAG_DEFAULT, 0, 1, &sbNetworkConnected);
HRESULT hr = SimConnect_SetClientData(m_hSimConnect, ClientAreaSquawkBox, CSimConnectDefinitions::DataClientAreaSbConnected, SIMCONNECT_CLIENT_DATA_SET_FLAG_DEFAULT, 0, 1, &sbNetworkConnected);
if (isFailure(hr))
{
CLogMessage(this).warning("Setting network connected failed (SB offsets)");
@@ -647,7 +652,6 @@ namespace BlackSimPlugin
// defaults
CComSystem com1(myAircraft.getCom1System()); // set defaults
CComSystem com2(myAircraft.getCom2System());
CTransponder transponder(myAircraft.getTransponder());
// updates
com1.setFrequencyActive(CFrequency(simulatorOwnAircraft.com1ActiveMHz, CFrequencyUnit::MHz()));
@@ -660,11 +664,13 @@ namespace BlackSimPlugin
const bool changedCom2 = myAircraft.getCom2System() != com2;
m_simCom2 = com2;
CTransponder transponder(myAircraft.getTransponder());
transponder.setTransponderCode(qRound(simulatorOwnAircraft.transponderCode));
const bool changedXpr = (myAircraft.getTransponderCode() != transponder.getTransponderCode());
if (changedCom1 || changedCom2 || changedXpr)
{
// set in own aircraft provider
this->updateCockpit(com1, com2, transponder, identifier());
}
}
@@ -697,7 +703,7 @@ namespace BlackSimPlugin
this->physicallyInitAITerrainProbes(position, 2); // init probe
}
// SB3 offsets
// SB3 offsets updating
m_simulatorInternals.setValue(QStringLiteral("fsx/sb3"), boolToEnabledDisabled(m_useSbOffsets));
m_simulatorInternals.setValue(QStringLiteral("fsx/sb3packets"), m_useSbOffsets ? QString::number(m_sbDataReceived) : QStringLiteral("disabled"));
}
@@ -817,6 +823,7 @@ namespace BlackSimPlugin
void CSimulatorFsxCommon::updateOwnAircraftFromSimulatorFsuipc(const CTransponder &xpdr)
{
if (!m_useFsuipc) { return; }
const CSimulatedAircraft myAircraft(this->getOwnAircraft());
const bool changed = (myAircraft.getTransponderMode() != xpdr.getTransponderMode());
if (!changed) { return; }
@@ -1347,14 +1354,17 @@ namespace BlackSimPlugin
m_dispatchErrors = 0;
if (m_useFsuipc && m_fsuipc)
{
CSimulatedAircraft fsuipcAircraft(getOwnAircraft());
if (m_dispatchProcCount % 10 == 0)
{
// slow
const bool ok = m_fsuipc->read(fsuipcAircraft, true, false, false);
if (ok)
// slow updates, here only when SB/SimConnect is disabled as those do the same thing
if (!m_useSbOffsets)
{
this->updateOwnAircraftFromSimulatorFsuipc(fsuipcAircraft.getTransponder());
CSimulatedAircraft fsuipcAircraft(this->getOwnAircraft());
const bool ok = m_fsuipc->read(fsuipcAircraft, true, false, false);
if (ok)
{
this->updateOwnAircraftFromSimulatorFsuipc(fsuipcAircraft.getTransponder());
}
}
}
else

View File

@@ -437,9 +437,6 @@ namespace BlackSimPlugin
//! \param force send lights even if they appear to be the same
void sendToggledLightsToSimulator(const CSimConnectObject &simObject, const BlackMisc::Aviation::CAircraftLights &lightsWanted, bool force = false);
//! Called when data about our own aircraft are received
void updateOwnAircraftFromSimulator(const DataDefinitionOwnAircraft &simulatorOwnAircraft);
//! Call CSimulatorFsxCommon::updateRemoteAircraftFromSimulator asynchronously
//! \remark do not to send SimConnect data in event loop
void triggerUpdateRemoteAircraftFromSimulator(const CSimConnectObject &simObject, const DataDefinitionPosData &remoteAircraftData);
@@ -457,6 +454,9 @@ namespace BlackSimPlugin
//! Probe data sent from simulator
void updateProbeFromSimulator(const BlackMisc::Aviation::CCallsign &callsign, const DataDefinitionPosData &remoteAircraftData);
//! Called when data about our own aircraft are received
void updateOwnAircraftFromSimulator(const DataDefinitionOwnAircraft &simulatorOwnAircraft);
//! Update from SB client area
//! \threadsafe
void updateOwnAircraftFromSimulator(const DataDefinitionClientAreaSb &sbDataArea);