Context.cs 9.2 KB
using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
using Common;

namespace DeviceLibrary
{
    /// <summary>
    /// 程序上下文变量
    /// </summary>
    public static class Context
    {
        /// <summary>
        /// 节点信息
        /// </summary>
        public static List<Agv.ClientNode> nodeInfo;
        /// <summary>
        /// 任务类型
        /// </summary>
        public static List<JobType> jobTypeInfo;
        /// <summary>
        /// 小车信息
        /// </summary>
        public static List<Agv_Info> agvInfo;

        public static Agv.Server server;
        public static Dictionary<string, string> agvMission;
        public static Dictionary<string, string> showNameMissionName;
        public static Control control;
        private static List<string> msg = new List<string>();
        public static readonly string CONFIG_PATH = AppDomain.CurrentDomain.BaseDirectory + "Config\\";
        public static Charge Charge;
        public static Standby Standby;

        public static string ReadIni(string section, string key)
        {
            return IniFileHelper.ReadValue(section, key, CONFIG_PATH + SettingString.FileName_tempData);
        }

        public static void WriteIni(string section, string key, string value)
        {
            IniFileHelper.WriteValue(section, key, value, CONFIG_PATH + SettingString.FileName_tempData);
        }
        public static bool GetNodeNameByAliceName(string aliceName, out string nodeName)
        {
            nodeName = "";
            int id = nodeInfo.FindIndex(s => s.AliceName.Equals(aliceName));
            if (id > -1)
            {
                nodeName = nodeInfo[id].Name;
                return true;
            }
            else
            {
                return false;
            }
        }

        public static bool GetLineNameByNodeName(string nodeName, out string lineName)
        {
            lineName = "";
            int id = nodeInfo.FindIndex(s => s.Name.Equals(nodeName));
            if (id > -1)
            {
                lineName = nodeInfo[id].LineName;
                return true;
            }
            else
            {
                return false;
            }
        }
        /// <summary>
        /// 查找节点是否存在以及是否调用
        /// </summary>
        /// <param name="nodeName">节点名称</param>
        /// <returns></returns>
        public static int FindNode(string nodeName)
        {
            int idx = nodeInfo.FindIndex(s => s.Name.Equals(nodeName) && s.IsUse);
            return idx;
        }

        /// <summary>
        /// 移动到节点位置
        /// </summary>
        /// <param name="agv"></param>
        /// <param name="nodeName"></param>
        /// <returns></returns>
        public static bool MoveToNode(Agv_Info agv, string nodeName)
        {
            string log;
            //清除目的地
            agv.Place = "";
            //执行下一个任务
            int i = FindNode(nodeName);
            bool rtn = agv.AssignTask(SettingString.Move + nodeName);
            if (rtn)
            {
                agv.Place = nodeName;
                if (i > -1)
                    log = string.Format("{0} {1} To Node {2} {3}", agv.Name, SettingString.Move, nodeName,nodeInfo[i].Action);
                else
                    log = string.Format("{0} {1} To Node {2}", agv.Name, SettingString.Move, nodeName);
                LogUtil.info(log);
                MiR_API.State_Ready(agv);
            }
            else
            {
                log = string.Format("{0} {1} To Node {2} 失败", agv.Name, SettingString.Move, nodeName);
                LogUtil.info(log);
            }

            return rtn;

        }
        /// <summary>
        /// 移动到节点位置
        /// </summary>
        /// <param name="agv"></param>
        /// <param name="nodeName"></param>
        /// <returns></returns>
        public static bool DockToNode(Agv_Info agv, string nodeName)
        {
            string log;
            //清除目的地
            agv.Place = "";
            //执行下一个任务
            bool rtn = agv.AssignTask(SettingString.Dock + nodeName);
            if (rtn)
            {
                agv.Place = nodeName;
                log = string.Format("{0} {1} To Node {2}", agv.Name, SettingString.Dock, nodeName);
                LogUtil.info(log);
                MiR_API.State_Ready(agv);
            }
            else
            {
                log = string.Format("{0} {1} To Node {2} 失败", agv.Name, SettingString.Dock, nodeName);
                LogUtil.info(log);
            }

            return rtn;

        }

        public static bool DoorMission(Agv_Info agv, string doorName)
        {
            agv.Place = doorName;
            return agv.AssignTask(SettingString.Move + doorName);
        }

        /// <summary>
        /// 检查当前移动任务是否结束
        /// </summary>
        /// <param name="taskName">任务名称</param>
        /// <param name="taskGUID">任务GUID</param>
        /// <returns></returns>
        public static bool CheckTaskMoveFinished(Agv_Info agv, string nodeName, string curTaskState)
        {
            LogUtil.debug(agv.Name + " 检查当前任务是否结束: " + SettingString.Move + nodeName + " " + curTaskState);
            return agvMission[SettingString.Move + nodeName].Equals(agv.CurTaskGUID) && curTaskState.Equals(SettingString.Done);
        }
        /// <summary>
        /// 检查当前停靠任务是否结束
        /// </summary>
        /// <param name="taskName">任务名称</param>
        /// <param name="taskGUID">任务GUID</param>
        /// <returns></returns>
        public static bool CheckTaskDockFinished(Agv_Info agv, string nodeName, string curTaskState)
        {
            LogUtil.debug(agv.Name + " 检查当前任务是否结束: " + SettingString.Dock + nodeName + " " + curTaskState);
            return agvMission[SettingString.Dock + nodeName].Equals(agv.CurTaskGUID) && curTaskState.Equals(SettingString.Done);
        }
        /// <summary>
        /// 检查充电任务是否分配完成
        /// </summary>
        /// <param name="taskName"></param>
        /// <returns></returns>
        public static bool CheckTaskFinished(Agv_Info agv, string taskName)
        {
            return taskName.Contains(SettingString.AutoCharge) && agv.CurTaskState.Equals(SettingString.Executing);
        }

        public static bool CheckEnterOrLeaveFinished(Agv_Info agv, string actionName, string curTaskState)
        {
            LogUtil.debug(agv.Name + " 检查进出料是否结束: " + actionName + " " + curTaskState);
            return agvMission[actionName].Equals(agv.CurTaskGUID) && curTaskState.Equals(SettingString.Done);
        }


        /// <summary>
        /// 判断电量是否够执行任务,默认20
        /// </summary>
        /// <param name="agv"></param>
        /// <returns></returns>
        public static bool CheckCanExecuteMission(Agv_Info agv, int threshold = 20)
        {
            if (agv.Battery <= threshold)
            {
                LogUtil.debug(agv.Name + " 电量小于20%,不执行任务,等待充电");
                return false;
            }

            return true;
        }

        /// <summary>
        /// 判断小车是否空闲(充电/待机位)
        /// </summary>
        /// <param name="agv"></param>
        /// <returns></returns>
        public static bool CheckAGVStatusNone(Agv_Info agv)
        {
            if ((agv.CurJob == null || agv.CurJob is ChargeJob || agv.CurJob is StandyJob) && !agv.IsExistShelf)
                return true;
            else
                return false;
        }

        /// <summary>
        /// 获取Job任务状态
        /// </summary>
        /// <param name="CurTaskID"></param>
        /// <returns></returns>
        public static string GetTakJobState(Agv_Info agv)
        {
            if (!agv.CurTaskID.Equals(-1) && MiR_API.Get_Task_State(agv, out string st))
                return st;
            return SettingString.Wait;
        }

    }

    public static class Window_API
    {
        [DllImport("user32.dll", EntryPoint = "ShowWindow", CharSet = CharSet.Auto)]
        public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);
        [DllImport("user32.dll ", SetLastError = true)]
        public static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab);
        public const int SW_RESTORE = 9;

    }

    /// <summary>
    /// 客户端
    /// </summary>
    public class Client
    {
        /// <summary>
        /// 循环
        /// </summary>
        public bool Loop;
        /// <summary>
        /// IP地址
        /// </summary>
        public string IP;
        /// <summary>
        /// 是否连接
        /// </summary>
        public bool IsConn;
        /// <summary>
        /// 节点名称集合
        /// </summary>
        public List<string> nodeName;
        /// <summary>
        /// 套接字
        /// </summary>
        public Socket Socket;
        /// <summary>
        /// 接收数据线程
        /// </summary>
        public Thread ListenNet;
    }
}