AgvTaskManager.cs 5.1 KB
using Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DeviceLibrary
{
    /// <summary>
    /// AGV任务管理
    /// </summary>
    public class AgvTaskManager
    {
        /// <summary>
        /// 任务列表
        /// </summary>
        public static List<AgvTask> AgvTasks;

        /// <summary>
        /// 加载任务
        /// </summary>
        public static void InitAgvTask()
        {
            try
            {
                AgvTasks = new List<AgvTask>();
                manager.XmlConfigOpManager.LoadTaskInfos(AgvTasks);
            }
            catch (Exception ex)
            {
                LogUtil.error("加载AGV任务失败", ex);
            }

        }
        public static void InitView(ComboBox comboBox)
        {
            comboBox.DisplayMember = "AliceName";
            comboBox.ValueMember = "Id";
            foreach (AgvTask mission in AgvTaskManager.AgvTasks)
            {
                comboBox.Items.Add(mission);
            }
            comboBox.SelectedItem = GetTaskByName(SettingString.Init);
        }
        /// <summary>
        /// 根据id获取任务
        /// </summary>
        /// <param name="taskName"></param>
        /// <returns></returns>
        public static AgvTask GetTaskById(int id)
        {
            AgvTask task = AgvTasks.Find(s => s.Id.Equals(id));
            if (task != null)
                return task;
            else
                LogUtil.error(string.Format("任务Id={0}不存在,请检查配置文件!", id));
            return new AgvTask();
        }
        /// <summary>
        /// 根据任务名获取任务
        /// </summary>
        /// <returns></returns>
        public static AgvTask GetTaskByName(string name)
        {
            AgvTask task = AgvTasks.Find(s => s.Name.Equals(name));
            if (task != null)
                return task.ToCopy();
            else
                LogUtil.error(string.Format("任务名{0}不存在,请检查配置文件!", name));
            return new AgvTask();
        }
        public static AgvTask GetTaskByAliceName(string aliceName)
        {
            AgvTask mission = AgvTasks.Find(s => s.AliceName.Equals(aliceName));
            if (mission != null)
                return mission;
            else
                LogUtil.error(string.Format("任务[{0}]不存在,请检查!", aliceName));
            return new AgvTask();
        }
        /// <summary>
        /// 向小车发送任务
        /// </summary>
        /// <returns></returns>
        public static bool AssignMission(Agv_Info agv, string taskname)
        {
            bool rtn = false;
            AgvTask task = GetTaskByName(taskname);
            Node node =  manager.NodeManager.GetNodeByName(taskname);
            if (task !=null)
            {
                agv.TaskRunState.Task = task;
                if (node != null)
                    agv.Place = node;
                if (!agv.IsCon)
                {
                    agv.TaskRunState.ResetInfo();
                    agv.TaskRunState.EnWaitTaskQueue(task);
                    LogUtil.info(string.Format("{0} 离线,任务{1}加入等待队列 ", agv.Name, task.AliceName));
                    return false;
                }
                if (agv.UseFleet)
                {
                    rtn = MiR_API.Add_Mission_Fleet(agv);
                    MiR_API.State_Ready(agv);
                    if (rtn)
                    {
                        LogUtil.info(string.Format("{0} Add_Mission_Fleet {1} Success", agv.Name, agv.TaskRunState.ToTaskInfo()));
                    }
                    else
                    {
                        LogUtil.info(string.Format("{0} Add_Mission_Fleet {1} Fail", agv.Name, agv.TaskRunState.ToTaskInfo()));
                    }
                }
                else
                {
                    rtn = MiR_API.Add_Mission(agv);
                    MiR_API.State_Ready(agv);
                    if (rtn)
                    {
                        LogUtil.info(string.Format("{0} Add_Mission {1} Success", agv.Name, agv.TaskRunState.ToTaskInfo()));
                    }
                    else
                    {
                        LogUtil.info(string.Format("{0} Add_Mission {1} Fail", agv.Name, agv.TaskRunState.ToTaskInfo()));
                    }
                }
                agv.StateKanban.SetCurTask(agv.TaskRunState.ToTaskShowInfo());
                if (!rtn)
                    agv.TaskRunState.EnWaitTaskQueue(task);
            }
            return rtn;
        }
        /// <summary>
        /// 删除任务
        /// </summary>
        /// <returns></returns>
        public static void DelMission(Agv_Info agv)
        {
            if (agv.UseFleet)
            {
                MiR_API.Del_Mission_Fleet(agv);
            }
            else
            {
                MiR_API.Del_Mission(agv);
            }
            LogUtil.info(string.Format("{0} DelMission [{1}] OK", agv.Name, agv.TaskRunState.ToTaskInfo()));

        }
    }
}