Beispiel #1
0
    public static UniTask <Cube.TargetMoveRespondType> TargetMove(Cube cube,
                                                                  int targetX, int targetY, int targetAngle, int configID = 0, int timeOut                  = 0,
                                                                  Cube.TargetMoveType targetMoveType         = Cube.TargetMoveType.RotatingMove, int maxSpd = 80,
                                                                  Cube.TargetSpeedType targetSpeedType       = Cube.TargetSpeedType.UniformSpeed,
                                                                  Cube.TargetRotationType targetRotationType = Cube.TargetRotationType.AbsoluteLeastAngle,
                                                                  Cube.ORDER_TYPE order = Cube.ORDER_TYPE.Strong)
    {
        var source      = new UniTaskCompletionSource <Cube.TargetMoveRespondType>();
        var callbackKey = Guid.NewGuid().ToString();

        cube.targetMoveCallback.RemoveListener(callbackKey);
        cube.targetMoveCallback.AddListener(callbackKey, (_cube, _configId, _respondType) =>
        {
            if (_configId == configID)
            {
                DelayedRemoveTargetMoveCallback(cube, callbackKey);
                source.TrySetResult(_respondType);
            }
        });

        cube.TargetMove(targetX, targetY, targetAngle, configID, timeOut,
                        targetMoveType, maxSpd, targetSpeedType, targetRotationType, order);

        return(source.Task);
    }
Beispiel #2
0
        // COMMAND API
        public override void TargetMove(
            int targetX,
            int targetY,
            int targetAngle,
            int configID,
            int timeOut,
            Cube.TargetMoveType targetMoveType,
            int maxSpd,
            Cube.TargetSpeedType targetSpeedType,
            Cube.TargetRotationType targetRotationType
            )
        {
#if !RELEASE
            if (65535 < targetX || targetX < -1)
            {
                Debug.LogErrorFormat("[Cube.TargetMove]X座標範囲を超えました. targetX={0}", targetX);
            }
            if (65535 < targetY || targetY < -1)
            {
                Debug.LogErrorFormat("[Cube.TargetMove]Y座標範囲を超えました. targetY={0}", targetY);
            }
            if (8191 < targetAngle)
            {
                Debug.LogErrorFormat("[Cube.TargetMove]回転角度範囲を超えました. targetAngle={0}", targetAngle);
            }
            if (255 < configID)
            {
                Debug.LogErrorFormat("[Cube.TargetMove]制御識別値範囲を超えました. configID={0}", configID);
            }
            if (255 < timeOut)
            {
                Debug.LogErrorFormat("[Cube.TargetMove]制御時間範囲を超えました. timeOut={0}", timeOut);
            }
            if (this.maxMotor < maxSpd)
            {
                Debug.LogErrorFormat("[Cube.TargetMove]速度範囲を超えました. maxSpd={0}", maxSpd);
            }
#endif
            MotorTargetCmd cmd = new MotorTargetCmd();
            cmd.x               = (ushort)(targetX == -1?65535:Mathf.Clamp(targetX, 0, 65535));
            cmd.y               = (ushort)(targetY == -1?65535:Mathf.Clamp(targetY, 0, 65535));
            cmd.deg             = (ushort)Mathf.Clamp(targetAngle, 0, 8191);
            cmd.configID        = (byte)Mathf.Clamp(configID, 0, 255);
            cmd.timeOut         = (byte)Mathf.Clamp(timeOut, 0, 255);
            cmd.targetMoveType  = targetMoveType;
            cmd.maxSpd          = (byte)Mathf.Clamp(maxSpd, 0, this.maxMotor);
            cmd.targetSpeedType = targetSpeedType; cmd.targetRotationType = targetRotationType;
            cmd.tRecv           = Time.time;

            MotorSetCmd(MotorCmdType.MotorTargetCmd, cmd);
        }
 // --------- 2.1.0 --------
 public void TargetMove(
     int targetX,
     int targetY,
     int targetAngle,
     int configID,
     int timeOut,
     Cube.TargetMoveType targetMoveType,
     int maxSpd,
     Cube.TargetSpeedType targetSpeedType,
     Cube.TargetRotationType targetRotationType
     )
 {
     DelayCommand(() => impl.TargetMove(targetX, targetY, targetAngle, configID, timeOut, targetMoveType, maxSpd, targetSpeedType, targetRotationType));
 }
Beispiel #4
0
        protected (float, float, float) TargetMove_RotateControl(
            float absoluteDeg, float relativeDeg, float lastDeg,
            Cube.TargetRotationType targetRotationType, byte maxSpd
            )
        {
            float rotate = 0;

            var ddeg = Deg(absoluteDeg - this.deg);

            // 回転タイプ
            switch (targetRotationType)
            {
            case (Cube.TargetRotationType.AbsoluteLeastAngle): // 絶対角度 回転量が少ない方向
            case (Cube.TargetRotationType.Original):           // 書き込み操作時と同じ 回転量が少ない方向
            {
                rotate = ddeg;
                break;
            }

            case (Cube.TargetRotationType.AbsoluteClockwise):           // 絶対角度 正方向(時計回り)
            {
                rotate = (ddeg + 360) % 360;
                break;
            }

            case (Cube.TargetRotationType.RelativeClockwise):          // 相対角度 正方向(時計回り)
            {
                if (relativeDeg < 180)
                {
                    rotate = (ddeg + 360) % 360;
                }
                else
                {
                    var ddegr = Deg(this.deg - lastDeg);
                    relativeDeg = relativeDeg - ddegr;
                    this.motorTargetCmd.lastDeg = this.deg;
                    rotate = 360;
                }
                break;
            }

            case (Cube.TargetRotationType.AbsoluteCounterClockwise):           // 絶対角度 負方向(反時計回り)
            {
                rotate = -(-ddeg + 360) % 360;
                break;
            }

            case (Cube.TargetRotationType.RelativeCounterClockwise):          // 相対角度 負方向(反時計回り)
            {
                if (relativeDeg < 180)
                {
                    rotate = -(-ddeg + 360) % 360;
                }
                else
                {
                    var ddegr = Deg(this.deg - lastDeg);
                    relativeDeg = relativeDeg + ddegr;
                    this.motorTargetCmd.lastDeg = this.deg;
                    rotate = -360;
                }
                break;
            }
            }
            if (rotate >= 0)
            {
                rotate = Mathf.Clamp(rotate, deadzone, maxSpd);
            }
            else
            {
                rotate = Mathf.Clamp(rotate, -maxSpd, -deadzone);
            }

            return(0, rotate, relativeDeg);
        }