Common.cs 9.3 KB
using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Threading;

namespace Asa
{
    /// <summary>
    /// 公共参数
    /// </summary>
    public static class Common
    {
        /// <summary>
        /// 节点信息
        /// </summary>
        public static List<ClientNode> nodeInfo;
        /// <summary>
        /// 小车信息
        /// </summary>
        public static List<AgvInfo> agvInfo;


    }

    /// <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;
    }

    /// <summary>
    /// 客户端的节点
    /// </summary>
    public class ClientNode
    {
        private string rfid = "00";

        /// <summary>
        /// 节点名称
        /// </summary>
        public string Name { set; get; }
        /// <summary>
        /// RFID
        /// </summary>
        public string RFID
        {
            set
            {
                if (value.Length < 2)
                    rfid = value.PadLeft(2, '0');
                else
                    rfid = value;
            }
            get
            {
                return rfid;
            }
        }
        /// <summary>
        /// 动作
        /// </summary>
        public ClientAction Action { set; get; }
        /// <summary>
        /// 优先级
        /// </summary>
        public ClientLevel Level { set; get; }
        /// <summary>
        /// 小车名称
        /// </summary>
        public string AgvName { set; get; }
        /// <summary>
        /// 在线
        /// </summary>
        public bool Online { set; get; }
        /// <summary>
        /// 是否可用
        /// </summary>
        public bool IsUse { set; get; }

        /// <summary>
        /// 客户端节点
        /// </summary>
        /// <param name="name"></param>
        /// <param name="isUse"></param>
        public ClientNode(string name, bool isUse)
        {
            Name = name;
            RFID = rfid;
            Action = ClientAction.None;
            Level = ClientLevel.Low;
            AgvName = "";
            Online = false;
            IsUse = isUse;
        }

        /// <summary>
        /// 客户端节点
        /// </summary>
        /// <param name="name"></param>
        /// <param name="rfid"></param>
        /// <param name="action"></param>
        /// <param name="level"></param>
        public ClientNode(string name, string rfid = "", ClientAction action = ClientAction.None, ClientLevel level = ClientLevel.Low)
        {
            Name = name;
            RFID = rfid;
            Action = action;
            Level = level;
            AgvName = "";
            Online = false;
            IsUse = false;
        }

        /// <summary>
        /// 所有属性的文本形式
        /// </summary>
        /// <returns></returns>
        public string ToText()
        {
            string s = string.Format("Name={0}, Action={1}, Level={2}", Name, Action, Level);
            return s;
        }

        /// <summary>
        /// 脱机
        /// </summary>
        public void Offline()
        {
            RFID = "00";
            Action = ClientAction.None;
            Level = ClientLevel.Low;
            AgvName = "";
            Online = false;
        }
    }

    public class AgvInfo
    {
        /// <summary>
        /// 小车名称
        /// </summary>
        public string Name { set; get; }
        /// <summary>
        /// 小车在FLEET中的ID号
        /// </summary>
        public string ID { set; get; }
        /// <summary>
        /// IP地址
        /// </summary>
        public string IP { set; get; }
        /// <summary>
        /// 授权码
        /// </summary>
        public string Authorization { set; get; }
        /// <summary>
        /// 当前架子的RFID
        /// </summary>
        public string RFID { set; get; }
        /// <summary>
        /// 是否在线
        /// </summary>
        public bool IsCon { set; get; }
        /// <summary>
        /// 是否可用
        /// </summary>
        public bool IsUse { set; get; }
        /// <summary>
        /// 地点
        /// </summary>
        public string Place { set; get; }
        /// <summary>
        /// 小车的状态id
        /// </summary>
        public int StateID { set; get; }
        /// <summary>
        /// 小车的状态
        /// </summary>
        public string StateText { set; get; }
        /// <summary>
        /// 电量百分比
        /// </summary>
        public int Battery { set; get; }
        /// <summary>
        /// 任务文本
        /// </summary>
        public string Mission_text { set; get; }
        /// <summary>
        /// 任务的状态
        /// </summary>
        //public Mission_Status MissionStatus { set; get; }
        /// <summary>
        /// 下一个任务
        /// </summary>
        public string NextMission { set; get; }
        /// <summary>
        /// 关门,用于执行一次
        /// </summary>
        public bool CloseDoor { set; get; }
        /// <summary>
        /// 任务发送,用于已调用API,但还没有修改状态
        /// </summary>
        public bool TaskSend { set; get; }
        /// <summary>
        /// 闲置等待时间,用于充电
        /// </summary>
        public int WaitTime { set; get; }
        /// <summary>
        /// 临时待机位,用于执行一次
        /// </summary>
        public bool StandbyTemp { set; get; }

        public AgvInfo(string id, string name, string ip, string authorization, string ioId, bool isUse)
        {
            ID = id;
            Name = name;
            IP = ip;
            Authorization = authorization;
            RFID = "";
            IsCon = false;
            IsUse = isUse;
            Place = "";
            StateText = "";
            WaitTime = 0;
        }

        public string[] ToRow()
        {
            //AGV名称,IP,AGV状态,任务状态,地点,后续任务,在线,电量,调用,清除缓存
            string[] s = new string[10];
            s[0] = Name;
            s[1] = IP;
            if (IsCon)
            {
                s[2] = StateText;
                //s[3] = string.Format("{0}({1})", MissionStatus.ToString(), (int)MissionStatus);
                s[4] = Place;
                s[5] = NextMission;
            }
            s[6] = IsCon.ToString();
            s[7] = Battery + "%";
            s[8] = IsUse.ToString();
            s[9] = "Clear";

            return s;
        }


        public string[] ToMission()
        {
            //AGV名称,IP,AGV状态,任务状态,地点,后续任务,在线,电量,调用,清除缓存
            string[] s = new string[2];
            s[0] = Name;
            s[1] = Mission_text;

            return s;
        }
        /// <summary>
        /// 脱机
        /// </summary>
        public void Offline()
        {
            IsCon = false;
            //Mark = "";
            //RFID = "";
            //Place = "";
            //StateID = -1;
            //StateText = "";
            //MissionStatus = Mission_Status.None;
            //MissionQueue = "";
        }
    }

    /// <summary>
    /// 客户端的动作
    /// </summary>
    public enum ClientAction : byte
    {
        /// <summary>
        /// 没有动作
        /// </summary>
        None = 0,
        /// <summary>
        /// 需要7寸D料架
        /// </summary>
        NeedD = 1,
        /// <summary>
        /// 需要大尺寸C料架
        /// </summary>
        NeedC = 2,
        /// <summary>
        /// 需要进入料架
        /// </summary>
        NeedEnter = 3,
        /// <summary>
        /// 需要出去料架
        /// </summary>
        NeedLeave = 4,
        /// <summary>
        /// 需要进入离开料架
        /// </summary>
        NeedEnterLeave = 5,
        /// <summary>
        /// 准备进入,服务器发送
        /// </summary>
        ReadyEnter = 6,
        /// <summary>
        /// 可以进入料架
        /// </summary>
        MayEnter = 7,
        /// <summary>
        /// 完成进入料架
        /// </summary>
        FinishEnter = 8,
        /// <summary>
        /// 准备离开,服务器发送
        /// </summary>
        ReadyLeave = 9,
        /// <summary>
        /// 可以出去料架
        /// </summary>
        MayLeave = 10,
        /// <summary>
        /// 完成出去料架
        /// </summary>
        FinishLeave = 11,

    }

    /// <summary>
    /// 客户端的优先级
    /// </summary>
    public enum ClientLevel : byte
    {
        /// <summary>
        /// 低
        /// </summary>
        Low = 0,
        /// <summary>
        /// 中等
        /// </summary>
        Middle = 1,
        /// <summary>
        /// 高
        /// </summary>
        High = 2
    }


}