CTURealtimeInfo.cs 4.1 KB
using Mushiny;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CtuDeviceLib
{
    /// <summary>
    /// 运行中的CTU实时信息
    /// </summary>
    public class CTURealtimeInfo
    {
        public CTURealtimeInfo(CTU ctu)
        {
            Ctu = ctu;
        }
        /// <summary>
        /// 当前Ctu
        /// </summary>
        public CTU Ctu { get; set; }
        /// <summary>
        /// 当前移动状态
        /// </summary>
        public CtuMoveState MoveState {
            get; 
            set; 
        }
        /// <summary>
        /// 目标信息
        /// </summary>
        public PosInfo DstPosInfo { get; set; }

        /// <summary>
        /// 路线中的Ctu名称
        /// </summary>
        public List<string> CtusInPath { get; private set; } = new List<string>();

        /// <summary>
        /// 设置障碍点信息-得出路上ctu
        /// </summary>
        /// <param name="pointCodes"></param>
        public void SetBlockedPoints(List<PointCode> pointCodes)
        {
            if (pointCodes == null || pointCodes.Count == 0)
            {
                CtusInPath.Clear();
                return;
            }
            CtusInPath.Clear();
            var ctus = MushinyManager.GetCTUBean().GetCTUs();
            foreach (var ctu in ctus)
            {
                if (ctu.Name.Equals(Ctu.Name))
                {
                    continue;
                }
                var find = pointCodes.Find(s => s.Id == ctu.CurLandMark);
                if (find != null)
                {
                    if (!CtusInPath.Contains(ctu.Name))
                    {
                        CtusInPath.Add(ctu.Name);
                    }
                }
            }
        }
        /// <summary>
        /// 当前所在的路线
        /// </summary>
        public PathWay CurPathWay
        {
            get
            {
                if (Ctu == null) return null;
                if (Ctu.CurLandMark == 0) return null;
                return MushinyManager.GetCTUBean()?.GetPathWay(Ctu.CurLandMark);
            }
        }
        public PathWay NextPathWay { get;private set; }

        public void SetNextPathWay(List<PointCode> pointCodes)
        {
            if (pointCodes == null)
            {
                NextPathWay=null;
                return;
            }

            if (pointCodes.Count == 0)
            {
                NextPathWay = null;
                return;
            }

            if (pointCodes.Count == 1)
            {
                NextPathWay = MushinyManager.GetCTUBean()?.GetPathWay(pointCodes[0].Id);
            }
            else
            {
                NextPathWay = MushinyManager.GetCTUBean()?.GetPathWay(pointCodes[0].Id, pointCodes[1].Id);
            }
        }
        /// <summary>
        /// 优先级
        /// </summary>
        public int Priority
        {
            get
            {
                int idx = CTUManager.CTUs.IndexOf(Ctu);
                var execTasks = TaskManager.GetAllTasks()?.FindAll(s => Ctu.Name.Equals(s.CtuName));
                int taskCnt = execTasks?.Count ?? 0;
                var ppType = MushinyManager.GetCTUBean()?.GetPointCode(Ctu.CurLandMark);
                int inLane = 0;
                if (ppType != null)
                {
                    if (ppType.Type == LandmarkType.Shelves)
                    {
                        inLane = 2;
                    }
                    if (ppType.Type == LandmarkType.Docking_0 || ppType.Type == LandmarkType.Docking_90
                        || ppType.Type == LandmarkType.Docking_180 || ppType.Type == LandmarkType.Docking_270)
                    {
                        inLane = 1;
                    }
                }

                return idx + taskCnt + inLane;
            }
        }


    }
    public enum CtuMoveState
    {
        空闲,
        规划中,
        规划失败,
        避让中,
        规划成功,
        移动中,
        等待路径释放,
        重规划失败
    }
}