示例#1
0
        public override void Stop(StopMode mode)
        {
            Historique.AjouterAction(new ActionStop(this, mode));

            _lockMove.WaitOne();

            if (mode == StopMode.Smooth)
            {
                Position nouvelleDestination = new Position(Position.Angle, new RealPoint(_currentPosition.Coordinates.X, _currentPosition.Coordinates.Y));

                if (IsInLineMove)
                {
                    if (_sensMove == SensAR.Avant)
                    {
                        nouvelleDestination.Move(GetCurrentLineBreakDistance());
                    }
                    else
                    {
                        nouvelleDestination.Move(-GetCurrentLineBreakDistance());
                    }
                }

                _destination = nouvelleDestination;
            }
            else if (mode == StopMode.Abrupt)
            {
                _currentSpeed = 0;
                _destination  = Position;
            }
            _lockMove.Release();
        }
示例#2
0
        public override void MoveForward(int distance, bool wait = true)
        {
            base.MoveForward(distance, wait);

            IsInLineMove = true;

            if (distance > 0)
            {
                if (!_inRecalibration)
                {
                    Historique.AjouterAction(new ActionAvance(this, distance));
                }
                _sensMove = SensAR.Avant;
            }
            else
            {
                if (!_inRecalibration)
                {
                    Historique.AjouterAction(new ActionRecule(this, -distance));
                }
                _sensMove = SensAR.Arriere;
            }

            _destination = new Position(Position.Angle, new RealPoint(Position.Coordinates.X + distance * Position.Angle.Cos, Position.Coordinates.Y + distance * Position.Angle.Sin));

            // TODO2018 attente avec un sémaphore ?
            if (wait)
            {
                while ((Position.Coordinates.X != _destination.Coordinates.X ||
                        Position.Coordinates.Y != _destination.Coordinates.Y) && !Execution.Shutdown)
                {
                    Thread.Sleep(10);
                }
            }
        }
示例#3
0
文件: RobotReel.cs 项目: Omybot/GoBot
        public override void MoveBackward(int distance, bool wait = true)
        {
            base.MoveBackward(distance, wait);

            if (wait)
            {
                _lockFrame[UdpFrameFunction.FinDeplacement] = new Semaphore(0, int.MaxValue);
            }

            IsInLineMove = true;

            Frame frame;

            if (distance < 0)
            {
                frame = UdpFrameFactory.Deplacer(SensAR.Avant, -distance, this);
            }
            else
            {
                frame = UdpFrameFactory.Deplacer(SensAR.Arriere, distance, this);
            }

            _asserConnection.SendMessage(frame);

            Historique.AjouterAction(new ActionRecule(this, distance));

            if (wait)
            {
                //if (!SemaphoresTrame[FrameFunction.FinDeplacement].WaitOne((int)SpeedConfig.LineDuration(distance).TotalMilliseconds))
                //    Thread.Sleep(1000); // Tempo de secours, on a jamais reçu la fin de trajectoire après la fin du délai théorique
                _lockFrame[UdpFrameFunction.FinDeplacement].WaitOne();
            }
        }
示例#4
0
文件: RobotReel.cs 项目: Omybot/GoBot
 private void SpeedConfig_ParamChange(bool lineAccelChange, bool lineDecelChange, bool lineSpeedChange, bool pivotAccelChange, bool pivotDecelChange, bool pivotSpeedChange)
 {
     if (lineSpeedChange)
     {
         Frame frame = UdpFrameFactory.VitesseLigne(SpeedConfig.LineSpeed, this);
         _asserConnection.SendMessage(frame);
         Historique.AjouterAction(new ActionVitesseLigne(this, SpeedConfig.LineSpeed));
     }
     if (lineAccelChange || lineDecelChange)
     {
         Frame frame = UdpFrameFactory.AccelLigne(SpeedConfig.LineAcceleration, SpeedConfig.LineDeceleration, this);
         _asserConnection.SendMessage(frame);
         Historique.AjouterAction(new ActionAccelerationLigne(this, SpeedConfig.LineAcceleration, SpeedConfig.LineDeceleration));
     }
     if (pivotSpeedChange)
     {
         Frame frame = UdpFrameFactory.VitessePivot(SpeedConfig.PivotSpeed, this);
         _asserConnection.SendMessage(frame);
         Historique.AjouterAction(new ActionVitessePivot(this, SpeedConfig.PivotSpeed));
     }
     if (pivotAccelChange || pivotDecelChange)
     {
         Frame frame = UdpFrameFactory.AccelPivot(SpeedConfig.PivotAcceleration, this);
         _asserConnection.SendMessage(frame);
         Historique.AjouterAction(new ActionAccelerationPivot(this, SpeedConfig.PivotAcceleration, SpeedConfig.PivotDeceleration));
     }
 }
示例#5
0
文件: Robot.cs 项目: Omybot/GoBot
 public virtual void SetMotorSpeed(MotorID moteur, SensGD sens, int vitesse)
 {
     if (MotorState.ContainsKey(moteur))
     {
         MotorState[moteur] = vitesse == 0 ? false : true;
     }
     Historique.AjouterAction(new ActionMoteur(this, vitesse, moteur));
 }
示例#6
0
文件: RobotReel.cs 项目: Omybot/GoBot
        public override void SetActuatorOnOffValue(ActuatorOnOffID actuator, bool on)
        {
            ActuatorOnOffState[actuator] = on;

            Frame frame = UdpFrameFactory.ActionneurOnOff(_boardActuatorOnOff[actuator], actuator, on);

            Connections.UDPBoardConnection[_boardActuatorOnOff[actuator]].SendMessage(frame);

            Historique.AjouterAction(new ActionOnOff(this, actuator, on));
        }
示例#7
0
文件: RobotReel.cs 项目: Omybot/GoBot
        public override void Stop(StopMode mode = StopMode.Smooth)
        {
            AsserEnable = (mode != StopMode.Freely);

            IsInLineMove = false;

            Frame frame = UdpFrameFactory.Stop(mode, this);

            _asserConnection.SendMessage(frame);

            Historique.AjouterAction(new ActionStop(this, mode));
        }
示例#8
0
        public override void Recalibration(SensAR sens, bool wait = true, bool sendOffset = false)
        {
            _inRecalibration = true;

            Historique.AjouterAction(new ActionRecallage(this, sens));

            if (wait)
            {
                RecalProcedure(sens);
            }
            else
            {
                ThreadManager.CreateThread(link => RecalProcedure(sens)).StartThread();
            }

            base.Recalibration(sens, wait, sendOffset);
        }
示例#9
0
        public override void PivotRight(AngleDelta angle, bool wait = true)
        {
            base.PivotRight(angle, wait);

            angle = Math.Round(angle, 2);
            Historique.AjouterAction(new ActionPivot(this, angle, SensGD.Droite));

            _destination = new Position(Position.Angle + angle, new RealPoint(Position.Coordinates.X, Position.Coordinates.Y));
            _sensPivot   = SensGD.Droite;

            if (wait)
            {
                while (Position.Angle != _destination.Angle)
                {
                    Thread.Sleep(10);
                }
            }
        }
示例#10
0
文件: RobotReel.cs 项目: Omybot/GoBot
        public override void Turn(SensAR sensAr, SensGD sensGd, int radius, AngleDelta angle, bool wait = true)
        {
            if (wait)
            {
                _lockFrame[UdpFrameFunction.FinDeplacement] = new Semaphore(0, int.MaxValue);
            }

            Frame frame = UdpFrameFactory.Virage(sensAr, sensGd, radius, angle, this);

            _asserConnection.SendMessage(frame);

            Historique.AjouterAction(new ActionVirage(this, radius, angle, sensAr, sensGd));

            if (wait)
            {
                _lockFrame[UdpFrameFunction.FinDeplacement].WaitOne();
            }
        }
示例#11
0
文件: RobotReel.cs 项目: Omybot/GoBot
        public override void Recalibration(SensAR sens, bool wait = true, bool sendOffset = false)
        {
            if (wait)
            {
                _lockFrame[UdpFrameFunction.FinDeplacement] = new Semaphore(0, int.MaxValue);
            }

            Frame frame = UdpFrameFactory.Recallage(sens, this);

            _asserConnection.SendMessage(frame);

            Historique.AjouterAction(new ActionRecallage(this, sens));

            if (wait)
            {
                _lockFrame[UdpFrameFunction.FinDeplacement].WaitOne();
            }

            base.Recalibration(sens, wait, sendOffset);
        }
示例#12
0
文件: RobotReel.cs 项目: Omybot/GoBot
        public override void PivotRight(AngleDelta angle, bool wait = true)
        {
            base.PivotRight(angle, wait);

            if (wait)
            {
                _lockFrame[UdpFrameFunction.FinDeplacement] = new Semaphore(0, int.MaxValue);
            }

            Frame frame = UdpFrameFactory.Pivot(SensGD.Droite, angle, this);

            _asserConnection.SendMessage(frame);

            Historique.AjouterAction(new ActionPivot(this, angle, SensGD.Droite));

            if (wait)
            {
                //if (!SemaphoresTrame[FrameFunction.FinDeplacement].WaitOne((int)SpeedConfig.PivotDuration(angle, Entraxe).TotalMilliseconds))
                //    Thread.Sleep(1000); // Tempo de secours, on a jamais reçu la fin de trajectoire après la fin du délai théorique
                _lockFrame[UdpFrameFunction.FinDeplacement].WaitOne();
            }
        }
示例#13
0
文件: Robot.cs 项目: Omybot/GoBot
 public virtual void SetMotorAcceleration(MotorID moteur, int acceleration)
 {
     Historique.AjouterAction(new ActionMoteur(this, acceleration, moteur));
 }
示例#14
0
 public override void SetActuatorOnOffValue(ActuatorOnOffID actuator, bool on)
 {
     // TODO
     Historique.AjouterAction(new ActionOnOff(this, actuator, on));
 }