void Serial::Go() { ResetSamples(); _lastChunkTime = _lastChunkSamples = 0; _unpacked = 0; DWORD chunkStartTime = ::GetTickCount(); int chunkSamples = 0; const int sampleSize = sizeof(Sample::value_t); while (!_abort) { DWORD bytesRead = 0; ReadFile(_file, _buffer, BufferSize, &bytesRead, nullptr); if (bytesRead) { chunkSamples += ReadSamples(bytesRead); DWORD now = ::GetTickCount(); if (now > chunkStartTime + 250) { std::lock_guard<std::mutex> lock(_chunkMutex); _lastChunkSamples = chunkSamples; _lastChunkTime = now - chunkStartTime; chunkSamples = 0; chunkStartTime = now; } } } }
Serial::Serial() : _file(nullptr), _abort(false), _lastChunkTime(0), _lastChunkSamples(0), _unpacked(0), _unpack(0) { _samples.resize(MaxSampleCount); _buffer = new byte[BufferSize]; ResetSamples(); }
BallMovement BallMovementCalculator::CalculateBallMovement(TimedDetectedBall timedDetectedBall) { Mat image(480,640, CV_8UC3, Scalar(0,0,0)); if (!timedDetectedBall.IsDetected) { return BallMovement::BallNotDetected(); } if(timedDetectedBall.DetectionTime - m_SamplesArray[0].DetectionTime > 2) { ResetSamples(); } if (IsNewSampleRelevant(timedDetectedBall)) { PushDetectedBallToQueue(timedDetectedBall); } // if (!IsEnoughSamples()) // { // return BallMovement::NotEnoughSamples(); // } vector<TimedDetectedBall> relevantSamples = GetRelevantSamples(); if(relevantSamples.size() < MIN_NUM_OF_SAMPLES_TO_APPROX) { return BallMovement::NotEnoughSamples(); } // if (!IsTimeDiffValid()) // { // return BallMovement::InvalidTimeDiff(); // } // // if (!IsLocationDiffValid()) // { // return BallMovement::InvalidLocationDiff(); // } LeastSquareApprox* ballMovementApprox = LineApprox::Approx(GetYValues(relevantSamples), GetXValues(relevantSamples)); JumpDirection jumpDirection = CalculateDirection(ballMovementApprox); LeastSquareApprox* timingApprox = ParabolaApprox::Approx(GetYValues(relevantSamples), GetTimes(relevantSamples)); float msToJump = CalculateJumpingTime(timingApprox); BallMovement ballMovement(jumpDirection, msToJump); if(DEBUG_MODE) { PrintCalculationData(image, relevantSamples); ballMovement.PrintDetailsOnImage(image, Point(0, (NUM_OF_SAMPLES + 1)*20)); } imshow("Ball movement calc", image); return ballMovement; }
void TerrainGesture::TouchBegan(Touch* touch) { TerrainView* terrainView = _hotspot->GetTerrainView(); bounds2f viewportBounds = (bounds2f)terrainView->GetTerrainViewport().GetViewportBounds(); if (!viewportBounds.contains(touch->GetCurrentPosition())) return; if (_hotspot->TryCaptureTouch(touch)) { ResetSamples(touch->GetTimestamp()); _orbitVelocity = 0; _scrollVelocity = glm::vec2{}; } }