From 6d26c965693bafe9e870fe693a4d61d531686cc3 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Thu, 22 Jun 2017 01:24:40 +0200 Subject: [PATCH] Ref T27, preparation for refactoring, turned private slots into normal member functions * Motivation: slots no longer required, and in the driver the (small) slot overhead might matter * renamed some members to better reflect future use * timer intervals as constexpr * fixed some typos and comments --- src/blackcore/simulatorcommon.cpp | 10 ++-- src/blackmisc/simulation/simulatedaircraft.h | 2 +- src/plugins/simulator/fsx/simulatorfsx.h | 2 +- .../simulator/fsxcommon/simconnectobject.cpp | 51 +++++++++++++++++- .../simulator/fsxcommon/simconnectobject.h | 22 +++++++- .../fsxcommon/simulatorfsxcommon.cpp | 54 ++++++++++--------- .../simulator/fsxcommon/simulatorfsxcommon.h | 43 +++++++-------- .../fsxcommon/simulatorfsxsimconnectproc.cpp | 8 +-- 8 files changed, 134 insertions(+), 58 deletions(-) diff --git a/src/blackcore/simulatorcommon.cpp b/src/blackcore/simulatorcommon.cpp index 2eb4290de..037b28296 100644 --- a/src/blackcore/simulatorcommon.cpp +++ b/src/blackcore/simulatorcommon.cpp @@ -134,7 +134,7 @@ namespace BlackCore } else { - this->physicallyAddRemoteAircraft(aircraft); + this->physicallyAddRemoteAircraft(aircraft); // blink } } } @@ -162,7 +162,7 @@ namespace BlackCore // are we already visible? if (!this->isPhysicallyRenderedAircraft(callsign)) { - this->physicallyAddRemoteAircraft(aircraft); + this->physicallyAddRemoteAircraft(aircraft); // enable/disable } } else @@ -455,7 +455,7 @@ namespace BlackCore { Q_ASSERT_X(aircraft.isEnabled(), Q_FUNC_INFO, "Disabled aircraft detected as to be added"); Q_ASSERT_X(aircraft.hasModelString(), Q_FUNC_INFO, "Missing model string"); - this->physicallyAddRemoteAircraft(aircraft); + this->physicallyAddRemoteAircraft(aircraft); // recalcuate snapshot changed = true; } } @@ -495,12 +495,16 @@ namespace BlackCore m_statsUpdateAircraftCountMs = 0; m_statsUpdateAircraftTimeAvgMs = 0; m_statsUpdateAircraftTimeTotalMs = 0; + m_blinkCycle = false; + m_highlightEndTimeMsEpoch = false; this->clearAllAircraft(); } void CSimulatorCommon::clearAllAircraft() { m_aircraftToAddAgainWhenRemoved.clear(); + m_highlightedAircraft.clear(); + m_callsignsToBeRendered.clear(); } CAirportList CSimulatorCommon::getWebServiceAirports() const diff --git a/src/blackmisc/simulation/simulatedaircraft.h b/src/blackmisc/simulation/simulatedaircraft.h index 3a9e553e9..66e23603c 100644 --- a/src/blackmisc/simulation/simulatedaircraft.h +++ b/src/blackmisc/simulation/simulatedaircraft.h @@ -332,7 +332,7 @@ namespace BlackMisc //! Compare for index int comparePropertyByIndex(const CPropertyIndex &index, const CSimulatedAircraft &compareValue) const; - //! Get model + //! Get model (model used for mapping) const BlackMisc::Simulation::CAircraftModel &getModel() const { return m_models[CurrentModel]; } //! Get network model diff --git a/src/plugins/simulator/fsx/simulatorfsx.h b/src/plugins/simulator/fsx/simulatorfsx.h index d859de607..291b90f3e 100644 --- a/src/plugins/simulator/fsx/simulatorfsx.h +++ b/src/plugins/simulator/fsx/simulatorfsx.h @@ -18,7 +18,7 @@ namespace BlackSimPlugin { namespace Fsx { - //! FSX Simulator Implementation + //! FSX simulator implementation class CSimulatorFsx : public BlackSimPlugin::FsxCommon::CSimulatorFsxCommon { Q_OBJECT diff --git a/src/plugins/simulator/fsxcommon/simconnectobject.cpp b/src/plugins/simulator/fsxcommon/simconnectobject.cpp index c294632b5..4a0b36820 100644 --- a/src/plugins/simulator/fsxcommon/simconnectobject.cpp +++ b/src/plugins/simulator/fsxcommon/simconnectobject.cpp @@ -129,7 +129,7 @@ namespace BlackSimPlugin return simObject.hasValidRequestAndObjectId() && objectId == simObject.getObjectId(); } - bool CSimConnectObjects::containsPendingAdd() const + bool CSimConnectObjects::containsPendingAdded() const { for (const CSimConnectObject &simObject : this->values()) { @@ -138,6 +138,55 @@ namespace BlackSimPlugin return false; } + bool CSimConnectObjects::containsPendingRemoved() const + { + for (const CSimConnectObject &simObject : this->values()) + { + if (simObject.isPendingRemoved()) { return true; } + } + return false; + } + + int CSimConnectObjects::countPendingAdded() const + { + int c = 0; + for (const CSimConnectObject &simObject : this->values()) + { + if (simObject.isPendingAdded()) { c++; } + } + return c; + } + + int CSimConnectObjects::countPendingRemoved() const + { + int c = 0; + for (const CSimConnectObject &simObject : this->values()) + { + if (simObject.isPendingRemoved()) { c++; } + } + return c; + } + + CCallsignSet CSimConnectObjects::getPendingAddedCallsigns() const + { + CCallsignSet callsigns; + for (const CSimConnectObject &simObject : this->values()) + { + if (simObject.isPendingAdded()) { callsigns.push_back(simObject.getCallsign()); } + } + return callsigns; + } + + CCallsignSet CSimConnectObjects::getPendingRemovedCallsigns() const + { + CCallsignSet callsigns; + for (const CSimConnectObject &simObject : this->values()) + { + if (simObject.isPendingRemoved()) { callsigns.push_back(simObject.getCallsign()); } + } + return callsigns; + } + void CSimConnectObjects::toggleInterpolatorModes() { for (const CCallsign &cs : this->keys()) diff --git a/src/plugins/simulator/fsxcommon/simconnectobject.h b/src/plugins/simulator/fsxcommon/simconnectobject.h index f139e9e60..dd376e66c 100644 --- a/src/plugins/simulator/fsxcommon/simconnectobject.h +++ b/src/plugins/simulator/fsxcommon/simconnectobject.h @@ -36,7 +36,7 @@ namespace BlackSimPlugin //! Destructor ~CSimConnectObject() {} - //! Get Callsign + //! Get callsign const BlackMisc::Aviation::CCallsign &getCallsign() const { return m_aircraft.getCallsign(); } //! Simulated aircraft (as added) @@ -57,6 +57,9 @@ namespace BlackSimPlugin //! Get current lights (requested from simulator) const BlackMisc::Aviation::CAircraftLights &getCurrentLightsInSimulator() const { return m_currentLightsInSim; } + //! Received lights in simulator + bool hasCurrentLightsInSimulator() const { return !m_currentLightsInSim.isNull(); } + //! Set current lights when received from simulator void setCurrentLightsInSimulator(const BlackMisc::Aviation::CAircraftLights &lights) { m_currentLightsInSim = lights; } @@ -162,7 +165,22 @@ namespace BlackSimPlugin bool isKnownSimObjectId(DWORD objectId) const; //! Pending add condition - bool containsPendingAdd() const; + bool containsPendingAdded() const; + + //! Pending removed condition + bool containsPendingRemoved() const; + + //! Number of pending added + int countPendingAdded() const; + + //! Number of pending removed + int countPendingRemoved() const; + + //! Callsigns of pending added callsigns + BlackMisc::Aviation::CCallsignSet getPendingAddedCallsigns() const; + + //! Callsigns of pending removed callsigns + BlackMisc::Aviation::CCallsignSet getPendingRemovedCallsigns() const; //! Toggle interpolator modes void toggleInterpolatorModes(); diff --git a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp index 6879092d8..a7a0dbb52 100644 --- a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp +++ b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp @@ -51,8 +51,8 @@ namespace BlackSimPlugin Q_ASSERT_X(ownAircraftProvider, Q_FUNC_INFO, "Missing provider"); Q_ASSERT_X(remoteAircraftProvider, Q_FUNC_INFO, "Missing provider"); Q_ASSERT_X(sApp, Q_FUNC_INFO, "Missing global object"); - m_realityBubbleTimer.setInterval(20 * 1000); - connect(&m_realityBubbleTimer, &QTimer::timeout, this, &CSimulatorFsxCommon::ps_addAircraftCurrentlyOutOfBubble); + m_addPendingAircraftTimer.setInterval(AddPendingAircraftIntervalMs); + connect(&m_addPendingAircraftTimer, &QTimer::timeout, this, &CSimulatorFsxCommon::addPendingAircraft); m_useFsuipc = false; m_defaultModel = @@ -94,8 +94,8 @@ namespace BlackSimPlugin // set structures and move on initEvents(); initDataDefinitionsWhenConnected(); - m_simConnectTimerId = startTimer(10); - m_realityBubbleTimer.start(); + m_simConnectTimerId = startTimer(DispatchIntervalMs); + m_addPendingAircraftTimer.start(); return true; } @@ -127,7 +127,7 @@ namespace BlackSimPlugin if (callsign.isEmpty()) { return false; } // check if we have to do something - m_outOfRealityBubble.removeByCallsign(callsign); + m_addPendingAircraft.removeByCallsign(callsign); if (m_simConnectObjects.contains(callsign)) { const CSimConnectObject simObj = m_simConnectObjects[callsign]; @@ -293,7 +293,7 @@ namespace BlackSimPlugin { CCallsignSet callsigns(this->m_simConnectObjects.keys()); callsigns.push_back(m_aircraftToAddAgainWhenRemoved.getCallsigns()); // not really rendered right now, but very soon - callsigns.push_back(m_outOfRealityBubble.getCallsigns()); // not really rendered, but for the logic it should look like it is + callsigns.push_back(m_addPendingAircraft.getCallsigns()); // not really rendered, but for the logic it should look like it is return CCallsignSet(this->m_simConnectObjects.keys()); } @@ -364,11 +364,12 @@ namespace BlackSimPlugin return; } - emitSimulatorCombinedStatus(); + emitSimulatorCombinedStatus(); // force sending status } void CSimulatorFsxCommon::onSimStopped() { + // stopping events in FSX: Load menu, weather and season const int oldStatus = getSimulatorStatus(); m_simSimulating = false; emitSimulatorCombinedStatus(oldStatus); @@ -547,11 +548,11 @@ namespace BlackSimPlugin if (!simObject.hasValidRequestAndObjectId() || callsign.isEmpty()) { return false; } // we know the object has been created. But it can happen it is directly removed afterwards - QTimer::singleShot(500, this, [ = ] { this->ps_deferredSimulatorReportedObjectAdded(callsign); }); + QTimer::singleShot(500, this, [ = ] { this->deferredSimulatorReportedObjectAdded(callsign); }); return true; } - bool CSimulatorFsxCommon::ps_deferredSimulatorReportedObjectAdded(const CCallsign &callsign) + bool CSimulatorFsxCommon::deferredSimulatorReportedObjectAdded(const CCallsign &callsign) { if (callsign.isEmpty()) { return false; } if (!m_simConnectObjects.contains(callsign)) { return false; } // removed in mean time @@ -594,13 +595,13 @@ namespace BlackSimPlugin return true; } - void CSimulatorFsxCommon::ps_addAircraftCurrentlyOutOfBubble() + void CSimulatorFsxCommon::addPendingAircraft() { - if (m_outOfRealityBubble.isEmpty()) { return; } + if (m_addPendingAircraft.isEmpty()) { return; } const CCallsignSet aircraftCallsignsInRange(getAircraftInRangeCallsigns()); CSimulatedAircraftList toBeAddedAircraft; CCallsignSet toBeRemovedCallsigns; - for (const CSimulatedAircraft &aircraft : as_const(m_outOfRealityBubble)) + for (const CSimulatedAircraft &aircraft : as_const(m_addPendingAircraft)) { Q_ASSERT_X(!aircraft.getCallsign().isEmpty(), Q_FUNC_INFO, "missing callsign"); if (aircraftCallsignsInRange.contains(aircraft.getCallsign())) @@ -612,7 +613,7 @@ namespace BlackSimPlugin toBeRemovedCallsigns.push_back(aircraft.getCallsign()); } } - m_outOfRealityBubble.removeByCallsigns(toBeRemovedCallsigns); + m_addPendingAircraft.removeByCallsigns(toBeRemovedCallsigns); // add aircraft, but non blocking int t = 100; @@ -633,7 +634,6 @@ namespace BlackSimPlugin const CCallsign callsign(simObject.getCallsign()); Q_ASSERT_X(!callsign.isEmpty(), Q_FUNC_INFO, "missing callsign"); - bool ok = false; if (simObject.isPendingRemoved()) { // good case, object has been removed @@ -642,11 +642,15 @@ namespace BlackSimPlugin else { // object was removed, but removal was not requested by us - // this means we are out of the reality bubble (or something else went wrong) + // this means we are out of the reality bubble or something else went wrong + // Possible reasons: + // 1) out of reality bubble + // 2) wrong position (in ground etc.) + // 3) Simulator not running (ie in stopped mode) if (!simObject.getAircraftModelString().isEmpty()) { - this->m_outOfRealityBubble.push_back(simObject.getAircraft()); - CLogMessage(this).info("Aircraft removed, '%1' '%2' object id '%3' out of reality bubble") << callsign.toQString() << simObject.getAircraftModelString() << objectID; + this->m_addPendingAircraft.push_back(simObject.getAircraft()); + CLogMessage(this).info("Aircraft removed, '%1' '%2' object id '%3' out of reality bubble or other reason") << callsign.toQString() << simObject.getAircraftModelString() << objectID; } else { @@ -656,7 +660,7 @@ namespace BlackSimPlugin // in all cases we remove const int c = m_simConnectObjects.remove(callsign); - ok = c > 0; + const bool removed = (c > 0); const bool updated = this->updateAircraftRendered(simObject.getCallsign(), false); if (updated) { @@ -694,10 +698,10 @@ namespace BlackSimPlugin void CSimulatorFsxCommon::timerEvent(QTimerEvent *event) { Q_UNUSED(event); - ps_dispatch(); + dispatch(); } - void CSimulatorFsxCommon::ps_dispatch() + void CSimulatorFsxCommon::dispatch() { HRESULT hr = SimConnect_CallDispatch(m_hSimConnect, SimConnectProc, this); if (hr != S_OK) @@ -736,7 +740,7 @@ namespace BlackSimPlugin Q_ASSERT_X(CThreadUtils::isCurrentThreadObjectThread(this), Q_FUNC_INFO, "wrong thread"); if (callsign.isEmpty()) { return false; } // can happen if an object is not an aircraft - m_outOfRealityBubble.removeByCallsign(callsign); + m_addPendingAircraft.removeByCallsign(callsign); if (!m_simConnectObjects.contains(callsign)) { return false; } // already fully removed or not yet added CSimConnectObject &simObject = m_simConnectObjects[callsign]; @@ -767,7 +771,7 @@ namespace BlackSimPlugin } // cleanup function, actually this should not be needed - QTimer::singleShot(100, this, &CSimulatorFsxCommon::ps_physicallyRemoveAircraftNotInProvider); + QTimer::singleShot(100, this, &CSimulatorFsxCommon::physicallyRemoveAircraftNotInProvider); // bye return true; @@ -870,7 +874,7 @@ namespace BlackSimPlugin return hr; } - // inti data definitions and SB data area + // init data definitions and SB data area hr += initDataDefinitionsWhenConnected(); if (hr != S_OK) { @@ -1287,7 +1291,7 @@ namespace BlackSimPlugin void CSimulatorFsxCommon::clearAllAircraft() { m_simConnectObjects.clear(); - m_outOfRealityBubble.clear(); + m_addPendingAircraft.clear(); CSimulatorFsCommon::clearAllAircraft(); } @@ -1318,7 +1322,7 @@ namespace BlackSimPlugin return simObjectCallsigns.difference(providerCallsigns); } - CCallsignSet CSimulatorFsxCommon::ps_physicallyRemoveAircraftNotInProvider() + CCallsignSet CSimulatorFsxCommon::physicallyRemoveAircraftNotInProvider() { const CCallsignSet toBeRemoved(getCallsignsMissingInProvider()); if (toBeRemoved.isEmpty()) { return toBeRemoved; } diff --git a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.h b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.h index 5982b87e0..885c8c065 100644 --- a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.h +++ b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.h @@ -138,30 +138,29 @@ namespace BlackSimPlugin virtual void ps_remoteProviderAddAircraftParts(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftParts &parts) override; //! @} - //! Timer event (our SimConnect event loop), runs ps_dispatch + //! Timer event (our SimConnect event loop), runs dispatch //! \sa m_simconnectTimerId virtual void timerEvent(QTimerEvent *event) override; - private slots: + private: //! Dispatch SimConnect messages - void ps_dispatch(); + void dispatch(); - //! Remove aircraft not in provider anymore + //! Remove aircraft no longer in provider //! \remark kind of cleanup function, in an ideal this should never need to cleanup something - BlackMisc::Aviation::CCallsignSet ps_physicallyRemoveAircraftNotInProvider(); + BlackMisc::Aviation::CCallsignSet physicallyRemoveAircraftNotInProvider(); //! Handle that an object has been added in simulator //! \remark checks if the object was really added after an add request and not directly removed again - bool ps_deferredSimulatorReportedObjectAdded(const BlackMisc::Aviation::CCallsign &callsign); + bool deferredSimulatorReportedObjectAdded(const BlackMisc::Aviation::CCallsign &callsign); - //! Try to add the aircraft currently out of bubble - void ps_addAircraftCurrentlyOutOfBubble(); + //! Try to add the next aircraft (one by one) + void addPendingAircraft(); - private: //! Call this method to declare the simulator connected void setSimConnected(); - //! Called when sim has started + //! Called when simulator has started void onSimRunning(); //! Slot called every visual frame @@ -213,13 +212,13 @@ namespace BlackSimPlugin void updateOwnAircraftFromSimulator(const DataDefinitionClientAreaSb &sbDataArea); //! An AI aircraft was added in the simulator - bool simulatorReportedObjectAdded(DWORD objectID); + bool simulatorReportedObjectAdded(DWORD objectId); //! Simulator reported that AI aircraft was removed bool simulatorReportedObjectRemoved(DWORD objectID); //! Set ID of a SimConnect object, so far we only have an request id in the object - bool setSimConnectObjectId(DWORD requestID, DWORD objectID); + bool setSimConnectObjectId(DWORD requestId, DWORD objectId); //! Remember current lights bool setCurrentLights(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftLights &lights); @@ -252,19 +251,21 @@ namespace BlackSimPlugin BlackMisc::Aviation::CCallsignSet getCallsignsMissingInProvider() const; //! Request for sim data? - static bool isRequestForSimData(DWORD requestId) { return requestId >= (RequestSimDataStart + RequestSimDataOffset) && requestId < (RequestSimDataStart + RequestSimDataOffset + SimObjectNumber); } + static bool isRequestForSimData(DWORD requestId) { return requestId >= (RequestSimDataStart + RequestSimDataOffset) && requestId < (RequestSimDataStart + RequestSimDataOffset + MaxSimObjects); } //! Request for sim data? - static bool isRequestForLights(DWORD requestId) { return requestId >= (RequestSimDataStart + RequestLightsOffset) && requestId < (RequestSimDataStart + RequestLightsOffset + SimObjectNumber); } + static bool isRequestForLights(DWORD requestId) { return requestId >= (RequestSimDataStart + RequestLightsOffset) && requestId < (RequestSimDataStart + RequestLightsOffset + MaxSimObjects); } static constexpr int GuessRemoteAircraftPartsCycle = 20; //!< guess every n-th cycle static constexpr int SkipUpdateCyclesForCockpit = 10; //!< skip x cycles before updating cockpit again static constexpr int IgnoreReceiveExceptions = 10; //!< skip exceptions when displayed more than x times - static constexpr int SimObjectNumber = 10000; //!< max. SimObjects at the same time + static constexpr int MaxSimObjects = 10000; //!< max.number of SimObjects at the same time static constexpr int RequestSimDataStart = static_cast(CSimConnectDefinitions::RequestEndMarker); - static constexpr int RequestSimDataEnd = RequestSimDataStart + SimObjectNumber - 1; - static constexpr int RequestSimDataOffset = 0 * SimObjectNumber; - static constexpr int RequestLightsOffset = 1 * SimObjectNumber; + static constexpr int RequestSimDataEnd = RequestSimDataStart + MaxSimObjects - 1; + static constexpr int RequestSimDataOffset = 0 * MaxSimObjects; + static constexpr int RequestLightsOffset = 1 * MaxSimObjects; + static constexpr int AddPendingAircraftIntervalMs = 20 * 1000; + static constexpr int DispatchIntervalMs = 10; QString m_simConnectVersion; //!< SimConnect version bool m_simConnected = false; //!< Is simulator connected? @@ -274,13 +275,13 @@ namespace BlackSimPlugin 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_dispatchErrors = 0; //!< number of dispatched failed, \sa ps_dispatch + int m_dispatchErrors = 0; //!< number of dispatched failed, \sa dispatch int m_receiveExceptionCount = 0; //!< exceptions HANDLE m_hSimConnect = nullptr; //!< handle to SimConnect object CSimConnectObjects m_simConnectObjects; //!< AI objects and their object / request ids - QTimer m_realityBubbleTimer { this }; //!< updating of aircraft out of reality bubble + QTimer m_addPendingAircraftTimer { this }; //!< updating of aircraft awaiting add DWORD m_requestIdSimData = RequestSimDataStart; //!< request id, use obtainRequestId() to get id - BlackMisc::Simulation::CSimulatedAircraftList m_outOfRealityBubble; //!< aircraft removed by FSX because they are out of reality bubble + BlackMisc::Simulation::CSimulatedAircraftList m_addPendingAircraft; //!< aircraft awaiting to be added }; //! Listener for FSX diff --git a/src/plugins/simulator/fsxcommon/simulatorfsxsimconnectproc.cpp b/src/plugins/simulator/fsxcommon/simulatorfsxsimconnectproc.cpp index 29d693656..2a3496d0b 100644 --- a/src/plugins/simulator/fsxcommon/simulatorfsxsimconnectproc.cpp +++ b/src/plugins/simulator/fsxcommon/simulatorfsxsimconnectproc.cpp @@ -111,7 +111,7 @@ namespace BlackSimPlugin case SIMCONNECT_RECV_ID_EVENT_OBJECT_ADDREMOVE: { const SIMCONNECT_RECV_EVENT_OBJECT_ADDREMOVE *event = static_cast(pData); - const DWORD objectID = event->dwData; + const DWORD objectId = event->dwData; const SIMCONNECT_SIMOBJECT_TYPE objectType = event->eObjType; if (objectType != SIMCONNECT_SIMOBJECT_TYPE_AIRCRAFT && objectType != SIMCONNECT_SIMOBJECT_TYPE_HELICOPTER) { @@ -119,15 +119,15 @@ namespace BlackSimPlugin } // such an object is not necessarily one of ours - // for instance, I always see object 5 when I start the simulator - if (!simulatorFsx->getSimConnectObjects().isKnownSimObjectId(objectID)) break; + // for instance, I always see object "5" when I start the simulator + if (!simulatorFsx->getSimConnectObjects().isKnownSimObjectId(objectId)) break; switch (event->uEventID) { case SystemEventObjectAdded: // added in SIMCONNECT_RECV_ID_ASSIGNED_OBJECT_ID break; case SystemEventObjectRemoved: - simulatorFsx->simulatorReportedObjectRemoved(objectID); + simulatorFsx->simulatorReportedObjectRemoved(objectId); break; default: break;