mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-01 05:26:45 +08:00
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:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user