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(); }
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; } }
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; } }
public override void DeInit() { _linkAsserv.Cancel(); _linkLogPositions.Cancel(); _linkAsserv.WaitEnd(); _linkLogPositions.WaitEnd(); }
protected override void StopLoop() { if (_feedLink != null) { _manager.CloseChannelUDP(); _feedLink.Cancel(); _feedLink.WaitEnd(); _feedLink = null; } }
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(); }
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(); }
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; } }
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; } }
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; } }
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; } }
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; } }
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; } }
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; } }
public static void Stop() { _linkDisplay?.Cancel(); _linkDisplay?.WaitEnd(); _linkDisplay = null; }
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])); } }
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); }