Beispiel #1
0
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;
			}
		}
	}
}
Beispiel #2
0
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;
}
Beispiel #4
0
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{};
	}
}