Ejemplo n.º 1
0
        // COMMAND API
        public override void AccelerationMove(
            int targetSpeed,
            int acceleration,
            int rotationSpeed,
            Cube.AccPriorityType accPriorityType,
            int controlTime
            )
        {
#if !RELEASE
            if (this.maxMotor < Mathf.Abs(targetSpeed))
            {
                Debug.LogErrorFormat("[Cube.AccelerationMove]直線速度範囲を超えました. targetSpeed={0}", targetSpeed);
            }
            if (255 < acceleration)
            {
                Debug.LogErrorFormat("[Cube.AccelerationMove]加速度範囲を超えました. acceleration={0}", acceleration);
            }
            if (65535 < rotationSpeed)
            {
                Debug.LogErrorFormat("[Cube.AccelerationMove]回転速度範囲を超えました. rotationSpeed={0}", rotationSpeed);
            }
            if (255 < controlTime)
            {
                Debug.LogErrorFormat("[Cube.AccelerationMove]制御時間範囲を超えました. controlTime={0}", controlTime);
            }
#endif
            MotorAccCmd cmd = new MotorAccCmd();
            cmd.spd             = Mathf.Clamp(targetSpeed, -this.maxMotor, this.maxMotor);
            cmd.acc             = (byte)Mathf.Clamp(acceleration, 0, 255);
            cmd.rotationSpeed   = Mathf.Clamp(rotationSpeed, -65535, 65535);
            cmd.accPriorityType = accPriorityType;
            cmd.controlTime     = (byte)Mathf.Clamp(controlTime, 0, 255);
            cmd.tRecv           = Time.time;
            motorAccCmdQ.Enqueue(cmd);
        }
Ejemplo n.º 2
0
        protected override void MotorScheduler(float t)
        {
            float               latestRecvTime = 0;
            bool                newCmd         = false;
            string              oldCmdType     = motorCurrentCmdType;
            MotorAccCmd         oldAccCmd      = currMotorAccCmd;
            MotorMultiTargetCmd multiCmdTemp   = default;

            byte oldConfigID = 0;

            switch (motorCurrentCmdType)
            {
            case "Target": { oldConfigID = currMotorTargetCmd.configID; break; }

            case "MultiTarget": { oldConfigID = currMotorMultiTargetCmd.configID; break; }
            }

            bool overwriteMulti = false;


            // ----- Dequeue Commands -----
            while (motorTimeCmdQ.Count > 0 && t > motorTimeCmdQ.Peek().tRecv)
            {
                currMotorTimeCmd    = motorTimeCmdQ.Dequeue();
                motorCurrentCmdType = "Time"; latestRecvTime = currMotorTimeCmd.tRecv;
                newCmd         = true;
                overwriteMulti = true;
            }
            while (motorTargetCmdQ.Count > 0 && t > motorTargetCmdQ.Peek().tRecv)
            {
                currMotorTargetCmd = motorTargetCmdQ.Dequeue();
                if (currMotorTargetCmd.tRecv > latestRecvTime)
                {
                    motorCurrentCmdType = "Target"; latestRecvTime = currMotorTargetCmd.tRecv;
                    newCmd = true;
                }
                overwriteMulti = true;
            }
            while (motorMultiTargetCmdQ.Count > 0 && t > motorMultiTargetCmdQ.Peek().tRecv)
            {
                multiCmdTemp = motorMultiTargetCmdQ.Dequeue();
                if (multiCmdTemp.tRecv > latestRecvTime)
                {
                    motorCurrentCmdType = "MultiTarget"; latestRecvTime = multiCmdTemp.tRecv;
                    newCmd = true;
                }
            }
            while (motorAccCmdQ.Count > 0 && t > motorAccCmdQ.Peek().tRecv)
            {
                currMotorAccCmd = motorAccCmdQ.Dequeue();
                if (currMotorAccCmd.tRecv > latestRecvTime)
                {
                    motorCurrentCmdType = "Acc"; latestRecvTime = currMotorAccCmd.tRecv;
                    newCmd = true;
                }
                overwriteMulti = true;
            }

            // ----- elipsed -----
            float elipsed = 0;

            switch (motorCurrentCmdType)
            {
            case "Time": elipsed = t - currMotorTimeCmd.tRecv; break;

            case "Target": elipsed = t - currMotorTargetCmd.tRecv; break;

            case "MultiTarget": elipsed = t - multiCmdTemp.tRecv; break;

            case "Acc": elipsed = t - currMotorAccCmd.tRecv; break;
            }


            // ----- Target -----
            if (newCmd && oldCmdType == "Target")
            {
                this.targetMoveCallback?.Invoke(oldConfigID, Cube.TargetMoveRespondType.OtherWrite);
            }
            if (newCmd && motorCurrentCmdType == "Target")
            {
                TargetMoveInit();
            }

            // ----- Multi Target -----
            if (overwriteMulti)
            {
                hasNextMotorMultiTargetCmd = false;
            }
            if (oldCmdType == "MultiTarget" && overwriteMulti)
            {
                this.multiTargetMoveCallback?.Invoke(oldConfigID, Cube.TargetMoveRespondType.OtherWrite);
                if (motorCurrentCmdType == "MultiTarget" && newCmd)
                {
                    currMotorMultiTargetCmd = multiCmdTemp;
                    MultiTargetMoveInit();
                }
            }
            else if (oldCmdType != "MultiTarget")
            {
                if (motorCurrentCmdType == "MultiTarget" && newCmd)
                {
                    currMotorMultiTargetCmd = multiCmdTemp;
                    MultiTargetMoveInit();
                }
            }
            else if (newCmd)    // oldCmdType == "MultiTarget" && !overwriteMulti
            {
                if (multiCmdTemp.multiWriteType == Cube.MultiWriteType.Write)
                {
                    this.multiTargetMoveCallback?.Invoke(oldConfigID, Cube.TargetMoveRespondType.OtherWrite);
                    currMotorMultiTargetCmd = multiCmdTemp;
                    MultiTargetMoveInit();
                }
                else if (this.hasNextMotorMultiTargetCmd)
                {
                    this.multiTargetMoveCallback?.Invoke(multiCmdTemp.configID, Cube.TargetMoveRespondType.AddRefused);
                }
                else
                {
                    this.nextMotorMultiTargetCmd    = multiCmdTemp;
                    this.hasNextMotorMultiTargetCmd = true;
                }
            }

            // ----- Acceleration -----
            if (newCmd && motorCurrentCmdType == "Acc")
            {
                if (oldCmdType == "Acc")                            // 前指令がAccの場合
                {
                    currMotorAccCmd.initialSpd = oldAccCmd.currSpd; // 速度を継続する
                }
                else                                                // 前指令がAccじゃない場合
                {
                    currMotorAccCmd.initialSpd = 0;                 // 速度を継続する     ※リアルのテスト結果
                }
                // currMotorAccCmd.acc = 0;    // 直ちに目標速度にする      ※仕様書
            }


            // ----- Excute Order -----
            switch (motorCurrentCmdType)
            {
            case "Time":
            {
                if (currMotorTimeCmd.duration == 0 ||
                    elipsed < currMotorTimeCmd.duration / 1000f)
                {
                    motorCmdL = currMotorTimeCmd.left;
                    motorCmdR = currMotorTimeCmd.right;
                }
                else
                {
                    motorCmdL = 0; motorCmdR = 0;
                }
                break;
            }

            case "Target":
            {
                TargetMoveController(elipsed);
                break;
            }

            case "MultiTarget":
            {
                MultiTargetMoveController(elipsed);
                break;
            }

            case "Acc":
            {
                AccMoveController(elipsed);
                break;
            }
            }
        }