Ejemplo n.º 1
0
        public void Enqueue(DetectedBall detectedBall)
        {
            lock (queueLock)
            {
                while (this.detectedBalls.Count >= this.capacity)
                {
                    this.detectedBalls.Dequeue();
                }

                this.detectedBalls.Enqueue(detectedBall);
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        ///
        /// </summary>
        /// <returns>DetectedBall - return null if queue is empty, otherwise element at front of queue (oldest).</returns>
        public DetectedBall Dequeue()
        {
            lock (queueLock)
            {
                DetectedBall detectedBall = null;

                if (this.detectedBalls.Count != 0)
                {
                    detectedBall = this.detectedBalls.Dequeue();
                }

                return(detectedBall);
            }
        }
Ejemplo n.º 3
0
        private DriveCommand DriveBallDetected(TennisBall ball)
        {
            // Sanity check
            if (ball == null)
            {
                this.verificationQueue.Clear();
                return(null);
            }

            // Add to verification queue
            DetectedBall detectedBall = new DetectedBall(ball, AscentPacketHandler.GPSData.GetDistanceTo(this.gate), DateTimeOffset.UtcNow.ToUnixTimeMilliseconds());

            this.verificationQueue.Enqueue(detectedBall);

            // TODO debugging - delete
            Console.Write("Ball detected | Verifying ({0})... ", this.verificationQueue.Count);


            // Detected ball so no longer scan
            this.scan = null;

            // Within required distance - use verification queue to determine if we should send back success
            if (IsWithinRequiredDistance(ball))
            {
                if (this.verificationQueue.VerifyBallDetection(
                        VERIFICATION_DISTANCE_PERCENTAGE,
                        DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() - VERIFICATION_TIMESTAMP_THRESHOLD,
                        DriveContext.REQUIRED_DISTANCE_FROM_BALL,
                        DriveContext.REQUIRED_DISTANCE_FROM_BALL + DriveContext.GPS_PRECISION))
                {
                    this.isWithinRequiredDistance = true;
                }

                Console.Write("WITHIN REQUIRED DISTANCE | ");

                // Halt to wait for success to be sent back to base station
                return(DriveCommand.Straight(Speed.HALT));
            }

            return(DriveTowardBall(ball));
        }