From c18de72dd4103e63d3b1e033cb27ecfcf43c751f Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Sun, 3 Nov 2013 19:06:06 -0800 Subject: [PATCH] work on debugging stutter behavior, mostly debugging and cleanup --- interface/src/Application.cpp | 259 ++++++++++++++---- interface/src/Application.h | 26 +- interface/src/VoxelPacketProcessor.cpp | 2 +- interface/src/VoxelSystem.cpp | 5 +- .../shared/src/ReceivedPacketProcessor.h | 12 +- 5 files changed, 236 insertions(+), 68 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 82fccf7d6d..30548d19cc 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -144,6 +144,8 @@ Application::Application(int& argc, char** argv, timeval &startup_time) : _packetsPerSecond(0), _bytesPerSecond(0), _bytesCount(0), + _recentMaxPackets(0), + _resetRecentMaxPacketsSoon(true), _swatch(NULL), _pasteMode(false) { @@ -1314,22 +1316,30 @@ void Application::idle() { double timeSinceLastUpdate = diffclock(&_lastTimeUpdated, &check); if (timeSinceLastUpdate > IDLE_SIMULATE_MSECS) { - - const float BIGGEST_DELTA_TIME_SECS = 0.25f; - update(glm::clamp((float)timeSinceLastUpdate / 1000.f, 0.f, BIGGEST_DELTA_TIME_SECS)); - _glWidget->updateGL(); - _lastTimeUpdated = check; - _idleLoopStdev.addValue(timeSinceLastUpdate); - - // Record standard deviation and reset counter if needed - const int STDEV_SAMPLES = 500; - if (_idleLoopStdev.getSamples() > STDEV_SAMPLES) { - _idleLoopMeasuredJitter = _idleLoopStdev.getStDev(); - _idleLoopStdev.reset(); + { + PerformanceWarning warn(showWarnings, "Application::idle()... update()"); + const float BIGGEST_DELTA_TIME_SECS = 0.25f; + update(glm::clamp((float)timeSinceLastUpdate / 1000.f, 0.f, BIGGEST_DELTA_TIME_SECS)); } + { + PerformanceWarning warn(showWarnings, "Application::idle()... updateGL()"); + _glWidget->updateGL(); + } + { + PerformanceWarning warn(showWarnings, "Application::idle()... rest of it"); + _lastTimeUpdated = check; + _idleLoopStdev.addValue(timeSinceLastUpdate); + + // Record standard deviation and reset counter if needed + const int STDEV_SAMPLES = 500; + if (_idleLoopStdev.getSamples() > STDEV_SAMPLES) { + _idleLoopMeasuredJitter = _idleLoopStdev.getStDev(); + _idleLoopStdev.reset(); + } - // After finishing all of the above work, restart the idle timer, allowing 2ms to process events. - idleTimer->start(2); + // After finishing all of the above work, restart the idle timer, allowing 2ms to process events. + idleTimer->start(2); + } } } void Application::terminate() { @@ -1776,6 +1786,8 @@ static QUuid DEFAULT_NODE_ID_REF; void Application::updateLookatTargetAvatar(const glm::vec3& mouseRayOrigin, const glm::vec3& mouseRayDirection, glm::vec3& eyePosition) { + bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); + PerformanceWarning warn(showWarnings, "Application::updateLookatTargetAvatar()"); _lookatTargetAvatar = findLookatTargetAvatar(mouseRayOrigin, mouseRayDirection, eyePosition, DEFAULT_NODE_ID_REF); } @@ -1907,17 +1919,13 @@ void Application::updateAvatars(float deltaTime, glm::vec3 mouseRayOrigin, glm:: } } -void Application::update(float deltaTime) { +void Application::updateMouseRay(float deltaTime, glm::vec3& mouseRayOrigin, glm::vec3& mouseRayDirection) { + bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); - PerformanceWarning warn(showWarnings, "Application::update()"); - - // tell my avatar if the mouse is being pressed... - _myAvatar.setMousePressed(_mousePressed); - - // check what's under the mouse and update the mouse voxel - glm::vec3 mouseRayOrigin, mouseRayDirection; - _viewFrustum.computePickRay(_mouseX / (float)_glWidget->width(), - _mouseY / (float)_glWidget->height(), mouseRayOrigin, mouseRayDirection); + PerformanceWarning warn(showWarnings, "Application::updateMouseRay()"); + + _viewFrustum.computePickRay(_mouseX / (float)_glWidget->width(), _mouseY / (float)_glWidget->height(), + mouseRayOrigin, mouseRayDirection); // adjust for mirroring if (_myCamera.getMode() == CAMERA_MODE_MIRROR) { @@ -1928,12 +1936,19 @@ void Application::update(float deltaTime) { _viewFrustum.getRight() * glm::dot(_viewFrustum.getRight(), mouseRayDirection)); } + // tell my avatar if the mouse is being pressed... + _myAvatar.setMousePressed(_mousePressed); + // tell my avatar the posiion and direction of the ray projected ino the world based on the mouse position _myAvatar.setMouseRay(mouseRayOrigin, mouseRayDirection); - - // Set where I am looking based on my mouse ray (so that other people can see) - glm::vec3 lookAtSpot; +} +void Application::updateFaceshift(float deltaTime, glm::vec3& mouseRayOrigin, glm::vec3& mouseRayDirection, + glm::vec3& lookAtRayOrigin, glm::vec3& lookAtRayDirection) { + + bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); + PerformanceWarning warn(showWarnings, "Application::updateFaceshift()"); + // Update faceshift _faceshift.update(); @@ -1943,14 +1958,19 @@ void Application::update(float deltaTime) { } // if we have faceshift, use that to compute the lookat direction - glm::vec3 lookAtRayOrigin = mouseRayOrigin, lookAtRayDirection = mouseRayDirection; if (_faceshift.isActive()) { lookAtRayOrigin = _myAvatar.getHead().calculateAverageEyePosition(); lookAtRayDirection = _myAvatar.getHead().getOrientation() * glm::quat(glm::radians(glm::vec3( _faceshift.getEstimatedEyePitch(), _faceshift.getEstimatedEyeYaw(), 0.0f))) * glm::vec3(0.0f, 0.0f, -1.0f); } +} - updateLookatTargetAvatar(mouseRayOrigin, mouseRayDirection, lookAtSpot); +void Application::updateMyAvatarLookAtPosition(glm::vec3& lookAtSpot, glm::vec3& lookAtRayOrigin, + glm::vec3& lookAtRayDirection) { + + bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); + PerformanceWarning warn(showWarnings, "Application::updateMyAvatarLookAtPosition()"); + if (_lookatTargetAvatar && !_faceshift.isActive()) { // If the mouse is over another avatar's head... _myAvatar.getHead().setLookAtPosition(lookAtSpot); @@ -1969,11 +1989,14 @@ void Application::update(float deltaTime) { lookAtSpot = lookAtRayOrigin + lookAtRayDirection * FAR_AWAY_STARE; _myAvatar.getHead().setLookAtPosition(lookAtSpot); } +} - // Find the voxel we are hovering over, and respond if clicked - float distance; - BoxFace face; - +void Application::updateHoverVoxels(float deltaTime, glm::vec3& mouseRayOrigin, glm::vec3& mouseRayDirection, + float& distance, BoxFace& face) { + + bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); + PerformanceWarning warn(showWarnings, "Application::updateHoverVoxels()"); + // If we have clicked on a voxel, update it's color if (_isHoverVoxelSounding) { VoxelNode* hoveredNode = _voxels.getVoxelAt(_hoverVoxel.x, _hoverVoxel.y, _hoverVoxel.z, _hoverVoxel.s); @@ -2005,13 +2028,19 @@ void Application::update(float deltaTime) { _isHoverVoxelSounding = true; } } - +} + +void Application::updateMouseVoxels(float deltaTime, glm::vec3& mouseRayOrigin, glm::vec3& mouseRayDirection, + float& distance, BoxFace& face) { + + bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); + PerformanceWarning warn(showWarnings, "Application::updateMouseVoxels()"); + _mouseVoxel.s = 0.0f; if (Menu::getInstance()->isVoxelModeActionChecked() && (fabs(_myAvatar.getVelocity().x) + fabs(_myAvatar.getVelocity().y) + fabs(_myAvatar.getVelocity().z)) / 3 < MAX_AVATAR_EDIT_VELOCITY) { - PerformanceWarning warn(showWarnings, "Application::update()... findRayIntersection()"); if (_voxels.findRayIntersection(mouseRayOrigin, mouseRayDirection, _mouseVoxel, distance, face)) { if (distance < MAX_VOXEL_EDIT_DISTANCE) { @@ -2080,12 +2109,17 @@ void Application::update(float deltaTime) { _justEditedVoxel = false; } } - +} + +void Application::updateHandAndTouch(float deltaTime) { + bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); + PerformanceWarning warn(showWarnings, "Application::updateHandAndTouch()"); + // walking triggers the handControl to stop if (_myAvatar.getMode() == AVATAR_MODE_WALKING) { _handControl.stop(); } - + // Update from Touch if (_isTouchPressed) { float TOUCH_YAW_SCALE = -0.25f; @@ -2096,19 +2130,29 @@ void Application::update(float deltaTime) { _lastTouchAvgX = _touchAvgX; _lastTouchAvgY = _touchAvgY; } - - // Leap finger-sensing device +} + +void Application::updateLeap(float deltaTime) { + bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); + PerformanceWarning warn(showWarnings, "Application::updateLeap()"); + LeapManager::enableFakeFingers(Menu::getInstance()->isOptionChecked(MenuOption::SimulateLeapHand)); _myAvatar.getHand().setRaveGloveActive(Menu::getInstance()->isOptionChecked(MenuOption::TestRaveGlove)); LeapManager::nextFrame(_myAvatar); - - // Read serial port interface devices +} + +void Application::updateSerialDevices(float deltaTime) { + bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); + PerformanceWarning warn(showWarnings, "Application::updateSerialDevices()"); + if (_serialHeadSensor.isActive()) { _serialHeadSensor.readData(deltaTime); } - - // Sample hardware, update view frustum if needed, and send avatar data to mixer/nodes - updateAvatar(deltaTime); +} + +void Application::updateThreads(float deltaTime) { + bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); + PerformanceWarning warn(showWarnings, "Application::updateThreads()"); // read incoming packets from network if (!_enableNetworkThread) { @@ -2120,12 +2164,12 @@ void Application::update(float deltaTime) { _voxelProcessor.threadRoutine(); _voxelEditSender.threadRoutine(); } +} + +void Application::updateMyAvatarSimulation(float deltaTime) { + bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); + PerformanceWarning warn(showWarnings, "Application::updateMyAvatarSimulation()"); - - //loop through all the other avatars and simulate them... - updateAvatars(deltaTime, mouseRayOrigin, mouseRayDirection); - - // Simulate myself if (Menu::getInstance()->isOptionChecked(MenuOption::Gravity)) { _myAvatar.setGravity(_environment.getGravity(_myAvatar.getPosition())); } @@ -2138,12 +2182,21 @@ void Application::update(float deltaTime) { } else { _myAvatar.simulate(deltaTime, NULL); } - - // Simulate particle cloud movements +} + +void Application::updateParticles(float deltaTime) { + bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); + PerformanceWarning warn(showWarnings, "Application::updateParticles()"); + if (Menu::getInstance()->isOptionChecked(MenuOption::ParticleCloud)) { _cloud.simulate(deltaTime); } - +} + +void Application::updateTransmitter(float deltaTime) { + bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); + PerformanceWarning warn(showWarnings, "Application::updateTransmitter()"); + // no transmitter drive implies transmitter pick if (!Menu::getInstance()->isOptionChecked(MenuOption::TransmitterDrive) && _myTransmitter.isConnected()) { _transmitterPickStart = _myAvatar.getSkeleton().joint[AVATAR_JOINT_CHEST].position; @@ -2178,7 +2231,12 @@ void Application::update(float deltaTime) { } else { _transmitterPickStart = _transmitterPickEnd = glm::vec3(); } - +} + +void Application::updateCamera(float deltaTime) { + bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); + PerformanceWarning warn(showWarnings, "Application::updateCamera()"); + if (!OculusManager::isConnected()) { if (Menu::getInstance()->isOptionChecked(MenuOption::FullscreenMirror)) { if (_myCamera.getMode() != CAMERA_MODE_MIRROR) { @@ -2213,7 +2271,12 @@ void Application::update(float deltaTime) { } } } - +} + +void Application::updateDialogs(float deltaTime) { + bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); + PerformanceWarning warn(showWarnings, "Application::updateDialogs()"); + // Update bandwidth dialog, if any BandwidthDialog* bandwidthDialog = Menu::getInstance()->getBandwidthDialog(); if (bandwidthDialog) { @@ -2224,6 +2287,11 @@ void Application::update(float deltaTime) { if (voxelStatsDialog) { voxelStatsDialog->update(); } +} + +void Application::updateAudio(float deltaTime) { + bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); + PerformanceWarning warn(showWarnings, "Application::updateAudio()"); // Update audio stats for procedural sounds #ifndef _WIN32 @@ -2231,7 +2299,12 @@ void Application::update(float deltaTime) { _audio.setLastVelocity(_myAvatar.getVelocity()); _audio.eventuallyAnalyzePing(); #endif - +} + +void Application::updateCursor(float deltaTime) { + bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); + PerformanceWarning warn(showWarnings, "Application::updateCursor()"); + // watch mouse position, if it hasn't moved, hide the cursor bool underMouse = _glWidget->underMouse(); if (!_mouseHidden) { @@ -2252,6 +2325,43 @@ void Application::update(float deltaTime) { } } +void Application::update(float deltaTime) { + bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); + PerformanceWarning warn(showWarnings, "Application::update()"); + + // check what's under the mouse and update the mouse voxel + glm::vec3 mouseRayOrigin, mouseRayDirection; + updateMouseRay(deltaTime, mouseRayOrigin, mouseRayDirection); + + // Set where I am looking based on my mouse ray (so that other people can see) + glm::vec3 lookAtSpot; + glm::vec3 lookAtRayOrigin = mouseRayOrigin, lookAtRayDirection = mouseRayDirection; + + updateFaceshift(deltaTime, mouseRayOrigin, mouseRayDirection, lookAtRayOrigin, lookAtRayDirection); + updateLookatTargetAvatar(mouseRayOrigin, mouseRayDirection, lookAtSpot); + updateMyAvatarLookAtPosition(lookAtSpot, lookAtRayOrigin, lookAtRayDirection); + + // Find the voxel we are hovering over, and respond if clicked + float distance; + BoxFace face; + + updateHoverVoxels(deltaTime, mouseRayOrigin, mouseRayDirection, distance, face); // clicking on voxels and making sounds + updateMouseVoxels(deltaTime, mouseRayOrigin, mouseRayDirection, distance, face); // UI/UX related to voxels + updateHandAndTouch(deltaTime); // Update state for touch sensors + updateLeap(deltaTime); // Leap finger-sensing device + updateSerialDevices(deltaTime); // Read serial port interface devices + updateAvatar(deltaTime); // Sample hardware, update view frustum if needed, and send avatar data to mixer/nodes + updateThreads(deltaTime); // If running non-threaded, then give the threads some time to process... + updateAvatars(deltaTime, mouseRayOrigin, mouseRayDirection); //loop through all the other avatars and simulate them... + updateMyAvatarSimulation(deltaTime); // Simulate myself + updateParticles(deltaTime); // Simulate particle cloud movements + updateTransmitter(deltaTime); // transmitter drive or pick + updateCamera(deltaTime); // handle various camera tweaks like off axis projection + updateDialogs(deltaTime); // update various stats dialogs if present + updateAudio(deltaTime); // Update audio stats for procedural sounds + updateCursor(deltaTime); // Handle cursor updates +} + void Application::updateAvatar(float deltaTime) { bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); PerformanceWarning warn(showWarnings, "Application::updateAvatar()"); @@ -3258,6 +3368,8 @@ void Application::displayStats() { drawtext(10, statsVerticalOffset, 0.10f, 0, 1.0, 0, avatarStats); + QLocale locale(QLocale::English); + std::stringstream voxelStats; voxelStats.precision(4); voxelStats << "Voxels " << @@ -3280,11 +3392,19 @@ void Application::displayStats() { statsVerticalOffset += PELS_PER_LINE; drawtext(10, statsVerticalOffset, 0.10f, 0, 1.0, 0, (char*)voxelStats.str().c_str()); + unsigned long localTotal = VoxelNode::getNodeCount(); + unsigned long localInternal = VoxelNode::getInternalNodeCount(); + unsigned long localLeaves = VoxelNode::getLeafNodeCount(); + QString localTotalString = locale.toString((uint)localTotal); // consider adding: .rightJustified(10, ' '); + QString localInternalString = locale.toString((uint)localInternal); + QString localLeavesString = locale.toString((uint)localLeaves); + + voxelStats.str(""); voxelStats << - "Local Voxels Total: " << VoxelNode::getNodeCount() << ", " << - "Internal: " << VoxelNode::getInternalNodeCount() << " , " << - "Leaves: " << VoxelNode::getLeafNodeCount() << ""; + "Local Voxels Total: " << localTotalString.toLocal8Bit().constData() << " / " << + "Internal: " << localInternalString.toLocal8Bit().constData() << " / " << + "Leaves: " << localLeavesString.toLocal8Bit().constData() << ""; statsVerticalOffset += PELS_PER_LINE; drawtext(10, statsVerticalOffset, 0.10f, 0, 1.0, 0, (char*)voxelStats.str().c_str()); @@ -3311,6 +3431,29 @@ void Application::displayStats() { voxelStats << "Sending Mode: " << voxelDetails; statsVerticalOffset += PELS_PER_LINE; drawtext(10, statsVerticalOffset, 0.10f, 0, 1.0, 0, (char*)voxelStats.str().c_str()); + + voxelStats.str(""); + int voxelPacketsToProcess = _voxelProcessor.packetsToProcessCount(); + QString packetsString = locale.toString((int)voxelPacketsToProcess); + QString maxString = locale.toString((int)_recentMaxPackets); + + voxelStats << "Voxel Packets to Process: " << packetsString.toLocal8Bit().constData() + << " [Recent Max: " << maxString.toLocal8Bit().constData() << "]"; + + if (_resetRecentMaxPacketsSoon && voxelPacketsToProcess > 0) { + _recentMaxPackets = 0; + _resetRecentMaxPacketsSoon = false; + } + if (voxelPacketsToProcess == 0) { + _resetRecentMaxPacketsSoon = true; + } else { + if (voxelPacketsToProcess > _recentMaxPackets) { + _recentMaxPackets = voxelPacketsToProcess; + } + } + statsVerticalOffset += PELS_PER_LINE; + drawtext(10, statsVerticalOffset, 0.10f, 0, 1.0, 0, (char*)voxelStats.str().c_str()); + Node *avatarMixer = NodeList::getInstance()->soloNodeOfType(NODE_TYPE_AVATAR_MIXER); char avatarMixerStats[200]; diff --git a/interface/src/Application.h b/interface/src/Application.h index 4154720419..ff8ae2f882 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -223,9 +223,30 @@ private: void init(); void update(float deltaTime); - + + // Various helper functions called during update() + void updateMouseRay(float deltaTime, glm::vec3& mouseRayOrigin, glm::vec3& mouseRayDirection); + void updateFaceshift(float deltaTime, glm::vec3& mouseRayOrigin, glm::vec3& mouseRayDirection, + glm::vec3& lookAtRayOrigin, glm::vec3& lookAtRayDirection); + void updateMyAvatarLookAtPosition(glm::vec3& lookAtSpot, glm::vec3& lookAtRayOrigin, glm::vec3& lookAtRayDirection); + void updateHoverVoxels(float deltaTime, glm::vec3& mouseRayOrigin, glm::vec3& mouseRayDirection, + float& distance, BoxFace& face); + void updateMouseVoxels(float deltaTime, glm::vec3& mouseRayOrigin, glm::vec3& mouseRayDirection, + float& distance, BoxFace& face); void updateLookatTargetAvatar(const glm::vec3& mouseRayOrigin, const glm::vec3& mouseRayDirection, glm::vec3& eyePosition); + void updateHandAndTouch(float deltaTime); + void updateLeap(float deltaTime); + void updateSerialDevices(float deltaTime); + void updateThreads(float deltaTime); + void updateMyAvatarSimulation(float deltaTime); + void updateParticles(float deltaTime); + void updateTransmitter(float deltaTime); + void updateCamera(float deltaTime); + void updateDialogs(float deltaTime); + void updateAudio(float deltaTime); + void updateCursor(float deltaTime); + Avatar* findLookatTargetAvatar(const glm::vec3& mouseRayOrigin, const glm::vec3& mouseRayDirection, glm::vec3& eyePosition, QUuid &nodeUUID); bool isLookingAtMyAvatar(Avatar* avatar); @@ -407,6 +428,9 @@ private: int _bytesPerSecond; int _bytesCount; + int _recentMaxPackets; // recent max incoming voxel packets to process + bool _resetRecentMaxPacketsSoon; + StDev _idleLoopStdev; float _idleLoopMeasuredJitter; diff --git a/interface/src/VoxelPacketProcessor.cpp b/interface/src/VoxelPacketProcessor.cpp index 76075c6fa5..9087a5a545 100644 --- a/interface/src/VoxelPacketProcessor.cpp +++ b/interface/src/VoxelPacketProcessor.cpp @@ -19,7 +19,7 @@ void VoxelPacketProcessor::processPacket(sockaddr& senderAddress, unsigned char* "VoxelPacketProcessor::processPacket()"); const int WAY_BEHIND = 300; - if (packetsToProcessCount() > WAY_BEHIND && Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings)) { + if (packetsToProcessCount() > WAY_BEHIND && Menu::getInstance()->isOptionChecked(MenuOption::ExtraDebugging)) { qDebug("VoxelPacketProcessor::processPacket() packets to process=%d\n", packetsToProcessCount()); } ssize_t messageLength = packetLength; diff --git a/interface/src/VoxelSystem.cpp b/interface/src/VoxelSystem.cpp index 541d7983d2..5e30141054 100644 --- a/interface/src/VoxelSystem.cpp +++ b/interface/src/VoxelSystem.cpp @@ -1882,7 +1882,7 @@ void VoxelSystem::hideOutOfView(bool forceFullFrustum) { _inhideOutOfView = true; bool showDebugDetails = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); - PerformanceWarning warn(showDebugDetails, "hideOutOfView()", showDebugDetails); + PerformanceWarning warn(showDebugDetails, "hideOutOfView()"); bool widenFrustum = true; // When using "delta" view frustums and only hide/show items that are in the difference @@ -1927,7 +1927,8 @@ void VoxelSystem::hideOutOfView(bool forceFullFrustum) { setupNewVoxelsForDrawingSingleNode(DONT_BAIL_EARLY); } - if (showDebugDetails) { + bool extraDebugDetails = Menu::getInstance()->isOptionChecked(MenuOption::ExtraDebugging); + if (extraDebugDetails) { qDebug("hideOutOfView() scanned=%ld removed=%ld inside=%ld intersect=%ld outside=%ld\n", args.nodesScanned, args.nodesRemoved, args.nodesInside, args.nodesIntersect, args.nodesOutside diff --git a/libraries/shared/src/ReceivedPacketProcessor.h b/libraries/shared/src/ReceivedPacketProcessor.h index f6d49cbb09..78017bffd7 100644 --- a/libraries/shared/src/ReceivedPacketProcessor.h +++ b/libraries/shared/src/ReceivedPacketProcessor.h @@ -24,6 +24,12 @@ public: /// \param ssize_t packetLength size of received data /// \thread network receive thread void queueReceivedPacket(sockaddr& senderAddress, unsigned char* packetData, ssize_t packetLength); + + /// Are there received packets waiting to be processed + bool hasPacketsToProcess() const { return _packets.size() > 0; } + + /// How many received packets waiting are to be processed + int packetsToProcessCount() const { return _packets.size(); } protected: /// Callback for processing of recieved packets. Implement this to process the incoming packets. @@ -36,12 +42,6 @@ protected: /// Implements generic processing behavior for this thread. virtual bool process(); - /// Are there received packets waiting to be processed - bool hasPacketsToProcess() const { return _packets.size() > 0; } - - /// How many received packets waiting are to be processed - int packetsToProcessCount() const { return _packets.size(); } - private: std::vector _packets;