CtuService.cs 2.7 KB
using Mushiny;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using OnlineStore.Common;
using log4net.Util;
namespace DeviceLibrary.CtuService
{
    public class CtuService : IDisposable
    {
        public delegate void ProcessMsg(List<Msg> msg);
        public event ProcessMsg ProcessMsgEvent;
        bool run = true;
        public CtuService()
        {

        }
        /// <summary>
        /// 需要更新
        /// </summary>
        public bool NeedUpdate { get; set; }
        /// <summary>
        /// 用户暂停
        /// </summary>
        public bool UserPause { get; set; }
        public void Start()
        {
            serviceProcess();
        }
        public void Stop()
        {
            run = false;
        }

        DateTime lastClearMsgTime = DateTime.Now;
        string[] disabledLanes = TaskUtil.disabledLancode;
        void showMsgInfo()
        {
            try
            {
                if (disabledLanes != null && disabledLanes.Length > 0)
                {
                    if(disabledLanes.Length==1)
                    {
                        if (string.IsNullOrEmpty(disabledLanes[0])) return;
                    }
                    Msg.add($"当前已屏蔽任务的巷道:{string.Join(",", disabledLanes)}", MsgLevel.info);
                }
            }
            catch (Exception ex)
            {

            }

        }
        void serviceProcess()
        {
            run = true;
            while (run)
            {
                Thread.Sleep(200);
                if (!RobotManager.isRunning)
                    continue;
                if (UserPause) continue;
                showMsgInfo();

                foreach (var ctu in CTUManager.GetCTUs())
                {
                    try
                    {
                        if (ctu.Enabled)
                            ctu.ShowAgvState();
                        if (ctu.RunState != RunState.Executing)
                            continue;

                        ctu.Process();
                    }
                    catch (Exception ex)
                    {
                        LogUtil.error($"[{ctu.Name}]执行异常", ex);
                    }


                }
                ProcessMsgEvent?.Invoke(Msg.get());
                if ((DateTime.Now - lastClearMsgTime).TotalSeconds > 2)
                {
                    Msg.clear();
                    lastClearMsgTime = DateTime.Now;
                }


            }
            RobotManager.isRunning = false;
        }

        public void Dispose()
        {
            run = false;
        }

        ~CtuService()
        {
            Dispose();
        }
    }
}