refs #420, refs #421, finetuning of FSX shutdown and crash detection

This commit is contained in:
Klaus Basan
2015-05-18 12:56:08 +02:00
parent a0c0da52c0
commit 6d5c3d85a1
5 changed files with 54 additions and 27 deletions

View File

@@ -200,6 +200,8 @@ namespace BlackCore
void CSimulatorCommon::unload()
{
this->disconnectFrom(); // disconnect from simulator
// disconnect as many signals as possible
for (QMetaObject::Connection &c : m_remoteAircraftProviderConnections)
{
QObject::disconnect(c);

View File

@@ -88,7 +88,9 @@ namespace BlackSimPlugin
bool CSimulatorFs9::disconnectFrom()
{
disconnectAllClients();
m_fsuipc->disconnect();
// disconnect FSUIPC and status
CSimulatorFsCommon::disconnectFrom();
return true;
}

View File

@@ -50,6 +50,10 @@ namespace BlackSimPlugin
bool CSimulatorFsCommon::disconnectFrom()
{
if (this->m_fsuipc) { this->m_fsuipc->disconnect(); }
// reset flags
m_simPaused = false;
emitSimulatorCombinedStatus();
return true;
}

View File

@@ -66,7 +66,7 @@ namespace BlackSimPlugin
bool CSimulatorFsx::isSimulating() const
{
return m_simRunning;
return m_simSimulating;
}
bool CSimulatorFsx::connectTo()
@@ -74,6 +74,9 @@ namespace BlackSimPlugin
if (m_simConnected) { return true; }
if (FAILED(SimConnect_Open(&m_hSimConnect, BlackMisc::CProject::systemNameAndVersionChar(), nullptr, 0, 0, 0)))
{
m_simConnected = false;
m_simPaused = false;
m_simSimulating = false;
emitSimulatorCombinedStatus();
return false;
}
@@ -85,7 +88,6 @@ namespace BlackSimPlugin
initWhenConnected();
m_simconnectTimerId = startTimer(10);
m_simConnected = true;
emitSimulatorCombinedStatus();
return true;
}
@@ -109,22 +111,28 @@ namespace BlackSimPlugin
bool CSimulatorFsx::disconnectFrom()
{
if (!m_simConnected) { return true; }
if (m_hSimConnect)
{
SimConnect_Close(m_hSimConnect);
this->m_fsuipc->disconnect();
}
// stop mapper init
//! \todo mapper shutdown in FSX, review keep it?
// mapperInstance()->gracefulShutdown();
if (m_simconnectTimerId)
{
killTimer(m_simconnectTimerId);
}
m_hSimConnect = nullptr;
m_simconnectTimerId = -1;
m_simConnected = false;
if (m_hSimConnect)
{
SimConnect_Close(m_hSimConnect);
m_hSimConnect = nullptr;
}
emitSimulatorCombinedStatus();
m_simConnected = false;
m_simSimulating = false;
m_simconnectTimerId = -1;
// emit status and disconnect FSUIPC
CSimulatorFsCommon::disconnectFrom();
return true;
}
@@ -295,9 +303,8 @@ namespace BlackSimPlugin
void CSimulatorFsx::onSimRunning()
{
if (m_simRunning) { return; }
qDebug() << "onSimRunning";
m_simRunning = true; // only place where this should be set to true
if (m_simSimulating) { return; }
m_simSimulating = true; // only place where this should be set to true
m_simConnected = true;
HRESULT hr = SimConnect_RequestDataOnSimObject(m_hSimConnect, CSimConnectDefinitions::RequestOwnAircraft,
CSimConnectDefinitions::DataOwnAircraft,
@@ -334,7 +341,7 @@ namespace BlackSimPlugin
void CSimulatorFsx::onSimStopped()
{
m_simRunning = false;
m_simSimulating = false;
emitSimulatorCombinedStatus();
}
@@ -346,13 +353,7 @@ namespace BlackSimPlugin
void CSimulatorFsx::onSimExit()
{
// reset complete state, we are going down
m_simConnected = false;
m_simRunning = false;
m_simPaused = false;
// stop background reading if ongoing
mapperInstance()->gracefulShutdown();
emitSimulatorCombinedStatus();
disconnectFrom();
}
void CSimulatorFsx::updateOwnAircraftFromSimulator(DataDefinitionOwnAircraft simulatorOwnAircraft)
@@ -477,7 +478,24 @@ namespace BlackSimPlugin
void CSimulatorFsx::ps_dispatch()
{
SimConnect_CallDispatch(m_hSimConnect, SimConnectProc, this);
HRESULT hr = SimConnect_CallDispatch(m_hSimConnect, SimConnectProc, this);
if (hr != S_OK)
{
m_dispatchErrors++;
if (m_dispatchErrors == 2)
{
// 2nd time, an error / avoid multiple messages
// idea: if it happens once ignore
CLogMessage(this).error("FSX: Dispatch error");
}
else if (m_dispatchErrors > 5)
{
// this normally happens during a FSX crash or shutdown
this->disconnectFrom();
}
return;
}
m_dispatchErrors = 0;
if (m_useFsuipc && m_fsuipc)
{
CSimulatedAircraft fsuipcAircraft(getOwnAircraft());
@@ -505,7 +523,7 @@ namespace BlackSimPlugin
{
if (m_simconnectTimerId >= 0) { killTimer(m_simconnectTimerId); }
m_simConnected = false;
m_simRunning = false;
m_simSimulating = false;
emitSimulatorCombinedStatus();
}
}

View File

@@ -186,15 +186,16 @@ namespace BlackSimPlugin
static const int SkipUpdateCyclesForCockpit = 10; //!< skip x cycles before updating cockpit again
bool m_simConnected = false; //!< Is simulator connected?
bool m_simRunning = false; //!< Simulator running?
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_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
HANDLE m_hSimConnect = nullptr; //!< Handle to SimConnect object
int m_nextObjID = 1; //!< object ID TODO: also used as request id, where to we place other request ids as for facilities
int m_dispatchErrors = 0; //!< numer of dispatched failed, \sa ps_dispatch
HANDLE m_hSimConnect = nullptr; //!< Handle to SimConnect object
QHash<BlackMisc::Aviation::CCallsign, CSimConnectObject> m_simConnectObjects;
QFutureWatcher<bool> m_watcherConnect;