AgvManager.cs 3.3 KB
using Acc.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Acc.AgvManager
{
    public class AgvManager{

        public static Dictionary<string,Node> nodeMap = new Dictionary<string, Node>();

        public static Dictionary<string,AgvBean> agvBeanMap = new Dictionary<string, AgvBean>();

        public static Node GetNode(string nodeName)
        {
            nodeMap.TryGetValue(nodeName, out Node node);
            return node;
        }

        public static void UpdateNode(Node node)
        {
            string nodeName = node.GetNodeName();
            if (nodeMap.ContainsKey(nodeName))
            {
                nodeMap.Add(nodeName, node);
            }
            else
            {
                nodeMap[nodeName] = node;
            }
        }

        public static void UpdateNodeStatus(string nodeName, NodeStatus nodeStatus)
        {
            nodeMap.TryGetValue(nodeName, out Node node);
            if(node != null)
            {
                node.UpdateNodeStatus(nodeStatus);
                nodeMap[nodeName] = node;
            }

        }

        public static void UpdateAgvStatus(string agvName, AgvStatus agvStatus)
        {

        }

        public void onTimer()
        {
            foreach (AgvBean agvBean in agvBeanMap.Values)
            {
                
                if (agvBean.IsIdle() || agvBean.IsInCharge())
                {
                    //空闲,判断电量,是否要进行充电
                    if (agvBean.NeedCharge())
                    {
                        if (!agvBean.IsInCharge())
                        {
                            //充电
                            LogUtil.info("AGV["+agvBean.Name+"]电量过低,执行充电任务");
                        }

                    }
                    else
                    {
                        //执行优先级最高的新任务
                        Job jobToExecute = null;
                        foreach (Node node in nodeMap.Values)
                        {
                            Job job = node.GetNewJob(agvBean, nodeMap, agvBeanMap);
                            if (job != null)
                            {
                                if (jobToExecute == null || job.GetPriority() > jobToExecute.GetPriority())
                                {
                                    jobToExecute = job;
                                }
                            }
                        }

                        if (jobToExecute != null)
                        {
                            if (agvBean.IsInCharge())
                            {
                                //充电取消
                                LogUtil.info("AGV[" + agvBean.Name + "]充电任务中断");
                            }
                            LogUtil.info("AGV[" + agvBean.Name + "]开启新的任务"+ jobToExecute.ToString());
                            agvBean.ExecuteNewJob(jobToExecute);
                        }
                    }
                }
                else
                {
                    //有任务,继续监控任务状态
                    agvBean.JobContinue(agvBean, nodeMap, agvBeanMap);
                }

            }
        }
    }
}