Пример #1
0
        private void btnLateral_Click(object sender, EventArgs e)
        {
            _isOnLeft = !_isOnLeft;

            if (_linkAnimation != null)
            {
                _linkAnimation.Cancel();
                _linkAnimation.WaitEnd();
            }

            if (!_isOnLeft)
            {
                Actionneur.ElevatorRight.DoPushInside();
                btnLateral.Image = Properties.Resources.BigArrow;
            }
            else
            {
                Actionneur.ElevatorRight.DoPushOutside();
                Bitmap bmp = new Bitmap(Properties.Resources.BigArrow);
                bmp.RotateFlip(RotateFlipType.RotateNoneFlipX);
                btnLateral.Image = bmp;
            }

            _linkAnimation = ThreadManager.CreateThread(link => ThreadLateral(!_isOnLeft ? -4 : 4));
            _linkAnimation.StartInfiniteLoop(15);

            picStorage.Focus();
        }
Пример #2
0
        private void btnAffichage_Click(object sender, EventArgs e)
        {
            if (btnAffichage.Text == "Lancer l'affichage")
            {
                _linkDisplay      = ThreadManager.CreateThread(link => DisplayInfos());
                _linkDisplay.Name = "Affichage des données";
                _linkDisplay.StartInfiniteLoop(new TimeSpan(0, 0, 0, 0, 100));

                Dessinateur.Start();

                btnAffichage.Text  = "Stopper l'affichage";
                btnAffichage.Image = GoBot.Properties.Resources.Pause16;
            }
            else
            {
                _linkDisplay?.Cancel();
                _linkDisplay?.WaitEnd();
                _linkDisplay = null;

                Dessinateur.Stop();

                btnAffichage.Text  = "Lancer l'affichage";
                btnAffichage.Image = GoBot.Properties.Resources.Play16;
            }
        }
Пример #3
0
        private void btnLaunch_Click(object sender, EventArgs e)
        {
            if (_linkPolling == null)
            {
                btnLaunch.Text  = "Stopper";
                btnLaunch.Image = Properties.Resources.Pause16;

                _linkPolling = ThreadManager.CreateThread(link => Measure());
                _linkPolling.StartInfiniteLoop(new TimeSpan(0));

                _linkDrawing = ThreadManager.CreateThread(link => DrawMeasures());
                _linkDrawing.StartInfiniteLoop(new TimeSpan(0, 0, 0, 0, 50));
            }
            else
            {
                btnLaunch.Text  = "Lancer";
                btnLaunch.Image = Properties.Resources.Play16;

                _linkPolling.Cancel();
                _linkDrawing.Cancel();

                _linkPolling.WaitEnd();
                _linkDrawing.WaitEnd();

                _linkPolling = null;
                _linkDrawing = null;
            }
        }
Пример #4
0
        public override void DeInit()
        {
            _linkAsserv.Cancel();
            _linkLogPositions.Cancel();

            _linkAsserv.WaitEnd();
            _linkLogPositions.WaitEnd();
        }
Пример #5
0
 protected override void StopLoop()
 {
     if (_feedLink != null)
     {
         _manager.CloseChannelUDP();
         _feedLink.Cancel();
         _feedLink.WaitEnd();
         _feedLink = null;
     }
 }
Пример #6
0
        private void DoFingersGrab()
        {
            ThreadLink left  = ThreadManager.CreateThread(link => Actionneur.FingerLeft.DoGrabColor(Buoy.Red));
            ThreadLink right = ThreadManager.CreateThread(link => Actionneur.FingerRight.DoGrabColor(Buoy.Green));

            left.StartThread();
            right.StartThread();

            left.WaitEnd();
            right.WaitEnd();
        }
Пример #7
0
        private void DoElevatorsDropoff(int level)
        {
            Color colorLeft = Color.Transparent, colorRight = Color.Transparent;
            bool  okColorLeft, okColorRight;

            ThreadLink left  = ThreadManager.CreateThread(link => colorLeft = Actionneur.ElevatorLeft.DoSequenceDropOff());
            ThreadLink right = ThreadManager.CreateThread(link => colorRight = Actionneur.ElevatorRight.DoSequenceDropOff());

            while (_zone.LoadsOnGreen < 4 && _zone.LoadsOnRed < 4 && Actionneur.ElevatorLeft.CountTotal > 0 && Actionneur.ElevatorRight.CountTotal > 0)
            {
                left.StartThread();
                right.StartThread();

                left.WaitEnd();
                right.WaitEnd();

                if (colorLeft != Color.Transparent)
                {
                    _zone.SetBuoyOnRed(colorLeft, level);
                    okColorLeft      = (colorLeft == Buoy.Red);
                    GameBoard.Score += (1 + (okColorLeft ? 1 : 0));
                }
                else
                {
                    okColorLeft = false;
                }

                if (colorRight != Color.Transparent)
                {
                    _zone.SetBuoyOnGreen(colorRight, level);
                    okColorRight     = (colorRight == Buoy.Green);
                    GameBoard.Score += (1 + (okColorRight ? 1 : 0));
                }
                else
                {
                    okColorRight = false;
                }

                if (okColorLeft && okColorRight)
                {
                    GameBoard.Score += 2;
                }

                level++;

                Robot.Move(-85);
            }

            // Pour ranger à la fin :
            Actionneur.ElevatorLeft.DoPushInsideFast();
            Actionneur.ElevatorRight.DoPushInsideFast();
        }
Пример #8
0
 private void btnFingerRight_Click(object sender, EventArgs e)
 {
     if (_linkFingerRight == null)
     {
         _linkFingerRight = Threading.ThreadManager.CreateThread(link => Actionneurs.Actionneur.FingerRight.DoDemoGrab(link));
         _linkFingerRight.StartThread();
     }
     else
     {
         _linkFingerRight.Cancel();
         _linkFingerRight.WaitEnd();
         _linkFingerRight = null;
     }
 }
Пример #9
0
 private void btnColorLeft_ValueChanged(object sender, bool value)
 {
     if (value)
     {
         Robots.MainRobot.SetActuatorOnOffValue(ActuatorOnOffID.PowerSensorColorBuoyLeft, true);
         Robots.MainRobot.SensorColorChanged += GrosRobot_SensorColorChanged;
         ThreadManager.CreateThread(link => PollingColorLeft(link)).StartInfiniteLoop(50);
     }
     else
     {
         Robots.MainRobot.SetActuatorOnOffValue(ActuatorOnOffID.PowerSensorColorBuoyLeft, false);
         _linkColorLeft.Cancel();
         _linkColorLeft.WaitEnd();
         _linkColorLeft = null;
     }
 }
Пример #10
0
        private void switchButtonPort_ValueChanged(object sender, bool value)
        {
            if ((switchButtonPortA.Value || switchButtonPortB.Value || switchButtonPortC.Value) && _link == null)
            {
                _link      = ThreadManager.CreateThread(link => AskValues());
                _link.Name = "Ports numériques " + _board.ToString();
                _link.StartInfiniteLoop(50);
            }

            if (!switchButtonPortA.Value & !switchButtonPortB.Value & !switchButtonPortC.Value & _link != null)
            {
                _link.Cancel();
                _link.WaitEnd();
                _link = null;
            }
        }
Пример #11
0
 private void btnOnOff_ValueChanged(object sender, bool value)
 {
     if (value)
     {
         ledState.Color = Robots.MainRobot.ReadSensorOnOff(_sensor) ? Color.LimeGreen : Color.Red;
         _linkPolling   = ThreadManager.CreateThread(link => PollingSensor());
         _linkPolling.RegisterName(nameof(PollingSensor) + " " + lblName.Text);
         _linkPolling.StartInfiniteLoop(50);
     }
     else
     {
         _linkPolling.Cancel();
         _linkPolling.WaitEnd();
         _linkPolling   = null;
         ledState.Color = Color.Gray;
     }
 }
Пример #12
0
        private void MainForm_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Down || e.KeyCode == Keys.Up)
            {
                _moveVertical = 0;
            }
            else if (e.KeyCode == Keys.Left || e.KeyCode == Keys.Right)
            {
                _moveHorizontal = 0;
            }

            if (_moveVertical == 0 && _moveHorizontal == 0 && _moveLoop != null)
            {
                _moveLoop.Cancel();
                _moveLoop.WaitEnd();
                _moveLoop = null;
            }
        }
Пример #13
0
        private void boxTorque_ValueChanged(object sender, bool value)
        {
            if (value)
            {
                _linkPolling = ThreadManager.CreateThread(link => GetServoInfos());
                _linkPolling.StartInfiniteLoop(new TimeSpan(0, 0, 0, 0, 20));

                _linkDrawing = ThreadManager.CreateThread(link => DrawTorqueCurve());
                _linkDrawing.StartInfiniteLoop(new TimeSpan(0, 0, 0, 0, 100));
            }
            else
            {
                _linkPolling.Cancel();
                _linkDrawing.Cancel();

                _linkPolling.WaitEnd();
                _linkDrawing.WaitEnd();

                _linkPolling = null;
                _linkDrawing = null;
            }
        }
Пример #14
0
        private void switchBouton_ValueChanged(object sender, bool value)
        {
            if (value)
            {
                _linkPolling      = ThreadManager.CreateThread(link => AskValues());
                _linkPolling.Name = "Ports analogiques " + Carte.ToString();
                _linkPolling.StartInfiniteLoop(50);

                _linkDraw      = ThreadManager.CreateThread(link => ctrlGraphique.DrawCurves());
                _linkDraw.Name = "Graph ports analogiques " + Carte.ToString();
                _linkDraw.StartInfiniteLoop(100);
            }
            else
            {
                _linkPolling.Cancel();
                _linkPolling.WaitEnd();
                _linkPolling = null;

                _linkDraw.Cancel();
                _linkDraw.WaitEnd();
                _linkDraw = null;
            }
        }
Пример #15
0
 public static void Stop()
 {
     _linkDisplay?.Cancel();
     _linkDisplay?.WaitEnd();
     _linkDisplay = null;
 }
Пример #16
0
        protected override void SequenceBegin()
        {
            // TODOEACHYEAR Actions fixes au lancement du match

            Robot robot = Robots.MainRobot;

            fixedMovements = new List <Movement>();

            // Ajouter les points fixes au score (non forfait, elements posés etc)
            int initScore = 0;

            initScore      += 2;  // Phare posé
            initScore      += 15; // 2 manches à air
            GameBoard.Score = initScore;

            // Sortir ICI de la zonde de départ
            robot.UpdateGraph(GameBoard.ObstaclesAll);

            // codé en bleu avec miroir
            Elevator left  = GameBoard.MyColor == GameBoard.ColorLeftBlue ? (Elevator)Actionneur.ElevatorLeft : Actionneur.ElevatorRight;
            Elevator right = GameBoard.MyColor == GameBoard.ColorLeftBlue ? (Elevator)Actionneur.ElevatorRight : Actionneur.ElevatorLeft;

            ThreadManager.CreateThread(link =>
            {
                left.DoGrabOpen();
                Thread.Sleep(750);
                left.DoGrabClose();
            }).StartThread();

            robot.MoveForward((int)(850 - 120 - Robots.MainRobot.LenghtBack + 50)); // Pour s'aligner sur le centre de l'écueil

            left.DoGrabOpen();

            robot.MoveBackward(50);

            right.DoGrabOpen();

            if (GameBoard.MyColor == GameBoard.ColorLeftBlue)
            {
                GameBoard.Elements.FindBuoy(new RealPoint(450, 510)).IsAvailable = false;
            }
            else
            {
                GameBoard.Elements.FindBuoy(new RealPoint(3000 - 450, 510)).IsAvailable = false;
            }

            robot.GoToAngle(-90);
            robot.SetSpeedSlow();
            robot.MoveForward(50);

            ThreadLink grabLink = ThreadManager.CreateThread(l => right.DoSequencePickupColor(GameBoard.MyColor == GameBoard.ColorLeftBlue ? Buoy.Green : Buoy.Red));

            grabLink.StartThread();
            Thread.Sleep(1000);

            Actionneur.ElevatorLeft.DoGrabOpen();
            Actionneur.ElevatorRight.DoGrabOpen();
            robot.MoveForward(450);
            grabLink.WaitEnd();



            //robot.MoveForward((int)(850 - 120 - Robots.MainRobot.LenghtBack)); // Pour s'aligner sur le centre de l'écueil

            //robot.GoToAngle(-90);
            //robot.SetSpeedSlow();
            //Actionneur.ElevatorLeft.DoGrabOpen();
            //Actionneur.ElevatorRight.DoGrabOpen();
            //robot.MoveForward(500);

            Threading.ThreadManager.CreateThread(link => { Actionneur.ElevatorLeft.DoSequencePickupColor(Buoy.Red); }).StartThread();
            Threading.ThreadManager.CreateThread(link => { Actionneur.ElevatorRight.DoSequencePickupColor(Buoy.Green); }).StartThread();

            List <Buoy> taken = GameBoard.Elements.Buoys.Where(b => b.Position.X <robot.Position.Coordinates.X + 200 && b.Position.X> robot.Position.Coordinates.X - 200 && b.Position.Y < 1000 && b.Position.Y > 0).ToList();

            taken.ForEach(b => b.IsAvailable = false);

            Thread.Sleep(500);

            robot.MoveBackward(35);
            robot.SetSpeedFast();
            robot.Pivot(180);

            // Ajouter ICI l'ordre de la strat fixe avant détection d'adversaire

            if (GameBoard.MyColor == GameBoard.ColorLeftBlue)
            {
                fixedMovements.Add(new MovementGroundedZone(GameBoard.Elements.GroundedZones[2]));
                fixedMovements.Add(new MovementBuoy(GameBoard.Elements.FindBuoy(new RealPoint(300, 400))));
                fixedMovements.Add(new MovementLightHouse(GameBoard.Elements.LightHouses[0]));
                fixedMovements.Add(new MovementGreenDropoff(GameBoard.Elements.RandomDropoffs[0]));
                fixedMovements.Add(new MovementGroundedZone(GameBoard.Elements.GroundedZones[0]));
                fixedMovements.Add(new MovementRedDropoff(GameBoard.Elements.RandomDropoffs[0]));
            }
            else
            {
                fixedMovements.Add(new MovementGroundedZone(GameBoard.Elements.GroundedZones[1]));
                fixedMovements.Add(new MovementBuoy(GameBoard.Elements.FindBuoy(new RealPoint(2700, 400))));
                fixedMovements.Add(new MovementLightHouse(GameBoard.Elements.LightHouses[1]));
                fixedMovements.Add(new MovementGreenDropoff(GameBoard.Elements.RandomDropoffs[1]));
                fixedMovements.Add(new MovementGroundedZone(GameBoard.Elements.GroundedZones[3]));
                fixedMovements.Add(new MovementRedDropoff(GameBoard.Elements.RandomDropoffs[1]));
            }
        }
Пример #17
0
        protected override bool MovementCore()
        {
            // TODO : Attrapage (avec test) des bouées exterieures, d'ailleurs prévoir de la place pour les attraper

            ThreadLink link1 = ThreadManager.CreateThread(link => Actionneur.ElevatorRight.DoSequencePickupColor(GameBoard.MyColor == GameBoard.ColorLeftBlue ? Buoy.Green : Buoy.Red));
            ThreadLink link2 = ThreadManager.CreateThread(link => Actionneur.ElevatorLeft.DoSequencePickupColor(GameBoard.MyColor == GameBoard.ColorLeftBlue ? Buoy.Red : Buoy.Green));

            link1.StartThread();
            link2.StartThread();

            link1.WaitEnd();
            link2.WaitEnd();

            if (_zone.HasOutsideBuoys)
            {
                Robot.SetSpeedSlow();
                Actionneur.ElevatorLeft.DoGrabOpen();
                Actionneur.ElevatorRight.DoGrabOpen();
                Robot.Move(250);
                Robot.SetSpeedFast();
                //ThreadManager.CreateThread(link => { Actionneur.ElevatorLeft.DoSequencePickupColor(Buoy.Red); }).StartThread();
                //ThreadManager.CreateThread(link => { Actionneur.ElevatorRight.DoSequencePickupColor(Buoy.Green); }).StartThread();
                Actionneur.ElevatorLeft.DoTakeLevel0(Buoy.Red);
                Actionneur.ElevatorRight.DoTakeLevel0(Buoy.Green);
                _zone.TakeOutsideBuoys();
                Thread.Sleep(500);
                Robot.PivotRight(180);
                Robot.Move(-150);
            }
            else
            {
                Robot.Move(-400);
            }

            Robot.SetSpeedSlow();

            if (_zone.HasInsideBuoys)
            {
                Robot.Recalibration(SensAR.Arriere, true, true);
                // TODO recallage X et Y tant qu'à faire ?
                DoFingersGrab(); // Attrapage des bouées initialement contre la bordure avec les fingers
                _zone.TakeInsideBuoys();
                Robot.SetSpeedFast();
                Robot.Move(150);
                Robot.PivotLeft(180);
                Robot.Move(125);
                Robot.SetSpeedSlow();
                DoElevatorsDropoff(0);
            }
            else
            {
                // TODO, y'a surement des bouées posées, donc pas de recallage et avancer moins
            }

            bool hasLeft  = Actionneur.FingerLeft.Loaded;
            bool hasRight = Actionneur.FingerRight.Loaded;

            if (hasLeft || hasRight)
            {
                Color cLeft  = Actionneur.FingerLeft.Load;
                Color cRight = Actionneur.FingerRight.Load;

                Robot.MoveBackward(90);
                Robot.PivotLeft(82);
                _zone.SetPendingRight(cRight, new RealPoint(Robot.Position.Coordinates.X + 193.5, Robot.Position.Coordinates.Y + 86.5).Rotation(Robot.Position.Angle.InPositiveDegrees + 90, Robot.Position.Coordinates));
                Actionneur.FingerRight.DoRelease();
                Robot.PivotRight(164);
                _zone.SetPendingLeft(cLeft, new RealPoint(Robot.Position.Coordinates.X - 193.5, Robot.Position.Coordinates.Y + 86.5).Rotation(Robot.Position.Angle.InPositiveDegrees + 90, Robot.Position.Coordinates));
                Actionneur.FingerLeft.DoRelease();
                Robot.PivotLeft(82);

                int score = 0;
                int level = _zone.GetAvailableLevel();
                if (hasLeft)
                {
                    _zone.SetBuoyOnGreen(cRight, level);
                    score += 2;
                }
                if (hasRight)
                {
                    _zone.SetBuoyOnRed(cLeft, level);
                    score += 2;
                }

                _zone.RemovePending();

                if (hasLeft && hasRight)
                {
                    score += 2;
                }

                GameBoard.Score += score;
            }

            if (_zone.LoadsOnGreen > 4 || _zone.LoadsOnRed > 4)
            {
                Actionneur.ElevatorLeft.DoGrabOpen();
                Actionneur.ElevatorRight.DoGrabOpen();
                Thread.Sleep(150);
                Robot.SetSpeedVerySlow();
                Robot.MoveForward(170);
                Robot.SetSpeedFast();
                Robot.MoveBackward(170);
            }
            else
            {
                Robot.MoveBackward(100);
            }

            Actionneur.ElevatorLeft.DoGrabClose();
            Actionneur.ElevatorRight.DoGrabClose();

            Robot.SetSpeedFast();

            return(true);
        }