FixMissionManager.cs 5.4 KB
using Common;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DeviceLibrary.manager
{
    public class FixMissionManager
    {
        public delegate void MissionChangedEventHandler();
        public static event MissionChangedEventHandler MissionChangedEvent;
        static List<MissionInfo> fixMissionInfos = new List<MissionInfo>();
        static WebService web = new WebService();
        static object lockObj = new object();
        public static void InitMission()
        {
            string path = AGVManager.CONFIG_PATH + SettingString.FileName_Missions;
            if (!System.IO.File.Exists(path))
                return;
            string txt = System.IO.File.ReadAllText(path, Encoding.GetEncoding("utf-8"));
            fixMissionInfos = JsonHelper.DeserializeJsonToList<MissionInfo>(txt);
        }
        static void WriteMission()
        {
            string path = AGVManager.CONFIG_PATH + SettingString.FileName_Missions;
            string txt = JsonHelper.SerializeObject(fixMissionInfos);
            try
            {
                System.IO.File.WriteAllText(path, txt);
            }
            catch (Exception e)
            {
                LogUtil.error("任务保存失败", e);
            }
        }
        public static void InitView(DataGridView dataGridView)
        {
            // Set up the DataGridView.
            dataGridView.Dock = DockStyle.Fill;

            // Automatically generate the DataGridView columns.
            dataGridView.AutoGenerateColumns = true;
            foreach (DataGridViewColumn item in dataGridView.Columns)
            {
                item.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
            }
            dataGridView.RowsDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            dataGridView.AllowUserToAddRows = false;
            BindingSource bindingSource = new BindingSource();
            bindingSource.DataSource = fixMissionInfos.ToList<MissionInfo>();
            dataGridView.DataSource = bindingSource;
        }
        public static void UpdateDataSource(DataGridView dataGridView)
        {
            BindingSource bindingSource = new BindingSource();
            bindingSource.DataSource = fixMissionInfos.ToList<MissionInfo>();
            dataGridView.DataSource = bindingSource;
        }
        public static bool IsOpen()
        {
            return web.State;
        }
        public static void Open()
        {
            web.Open(AppConfigHelper.GetValue("WebService"));
        }
        public static void Close()
        {
            web.Close();
        }
        public static bool HasNext(MissionType missionType)
        {
            List<MissionInfo> has = fixMissionInfos.FindAll(s=>s.MissionType.Equals(missionType));
            if (has!=null && has.Count > 0)
                return true;
            return false;
        }
        public static bool Contains(MissionInfo fixMissionInfo)
        {
            int id = fixMissionInfos.FindIndex(s => s.Equals(fixMissionInfo));
            if (id > -1)
                return true;
            return false;
        }

        public static List<MissionInfo> GetMissions()
        {
            return fixMissionInfos;
        }
        public static void Add(MissionInfo fixMission)
        {
            try
            {
                if (Monitor.TryEnter(lockObj,1000))
                {
                    fixMissionInfos.Add(fixMission);
                }
            }
            catch(Exception e)
            {
                LogUtil.error("操作 fixMissionInfos 超时");
            }
            finally
            {
                Monitor.Exit(lockObj);
            }

            WriteMission();
            MissionChangedEvent?.Invoke();
        }
        public static MissionInfo ExecuteMission(MissionType missionType)
        {
            MissionInfo missionInfo=null;
            try
            {
                if (Monitor.TryEnter(lockObj, 1000))
                {

                    missionInfo = fixMissionInfos.Find(s=>s.MissionType.Equals(missionType));
                    fixMissionInfos.Remove(missionInfo);
                }
            }
            catch (Exception e)
            {
                LogUtil.error("操作 fixMissionInfos 超时");
            }
            finally
            {
                Monitor.Exit(lockObj);
            }
 
            WriteMission();
            MissionChangedEvent?.Invoke();
            return missionInfo;
        }

        public static void SetMissionState(int id)
        {
            fixMissionInfos[id].On = !fixMissionInfos[id].On;
            if (!fixMissionInfos[id].On)
            {
                LogUtil.info("取消呼叫任务:" + fixMissionInfos[id].ToString());
                try
                {
                    if (Monitor.TryEnter(lockObj, 1000))
                    {
                        fixMissionInfos.RemoveAt(id);
                    }
                }
                catch (Exception e)
                {
                    LogUtil.error("操作 fixMissionInfos 超时");
                }
                finally
                {
                    Monitor.Exit(lockObj);
                }
            }
            WriteMission();
            MissionChangedEvent?.Invoke();
        }
    }
}