Context.cs 2.8 KB
using Common;
using DeviceLib.Model.AGV;
using System;
using System.Threading;

namespace DeviceLib.BLL
{
    public class Context
    {
        static Thread threadRobotCall;
        static int interval = 1000;
        static bool isLoad = false;
        static bool loop = false;

        /// <summary>
        /// 加载配置
        /// </summary>
        public static void Load()
        {
            isLoad = false;
            RobotManager.Load();
            NodeManager.Load();
            MissionManager.Load();
            NodeManager.InitServer();
            isLoad = true;
            LogUtil.Info("程序配置加载成功!");
        }

        /// <summary>
        /// 启动
        /// </summary>
        public static void Start()
        {
            loop = true;
            threadRobotCall = new Thread(RobotCall);
            threadRobotCall.IsBackground = true;
            threadRobotCall.Start();
            NodeManager.StartServer();
            ServiceManager.Start();
        }
        /// <summary>
        /// 停止
        /// </summary>
        public static void Stop()
        {
            loop = false;
            NodeManager.StopServer();
            ServiceManager.Stop();
        }
        /// <summary>
        /// agv占用节点
        /// </summary>
        /// <param name="robotId">机器人编号</param>
        /// <param name="nodeName">节点名</param>
        public static void SetNodeOccupied(int robotId, string nodeName = "")
        {
            if (nodeName.Equals(""))
            {
                foreach (var item in NodeManager.GetClientNodes())
                {
                    if (item.occupiedAgv.Equals(robotId))
                        item.occupiedAgv = 0;
                }
            }
            else
            {
                ClientNode clientNode = NodeManager.GetClientNodeByName(nodeName);
                if (clientNode != null)
                    clientNode.occupiedAgv = robotId;
            }

        }
        static void RobotCall()
        {
            while (loop)
            {
                try
                {
                    if (!isLoad)
                        continue;
                    foreach (var item in RobotManager.GetAllRobots())
                    {
                       // if (!item?.status?.is_online ?? false) continue;
                        JobManager.CheckResend(item);
                        JobManager.GetNewJob(item);
                        JobManager.Execute(item);
                        RobotManager.UploadState(item);
                    }
                    Thread.Sleep(interval);

                }
                catch (Exception ex)
                {
                    LogUtil.Error("RobotCall", ex);
                }
            }
        }
    }
}