JAKAServer.cs 4.5 KB

using Dolen.Communication.TCP;
using System;
using System.Collections.Generic;
using System.Linq;

namespace JAKA
{
    public class JAKAServer
    {
        Dictionary<string, JAKABean> JAKAs;
        TCPServer TCPServer;
        public Dictionary<string, JakaCmd> RobotCmds = new Dictionary<string, JakaCmd>();
        public JAKAServer(string[] clientips, string serverIp = "0.0.0.0", int port = 5000)
        {
            loadCmds();
            JAKAs = new Dictionary<string, JAKABean>();
            TCPServer = new TCPServer(serverIp, port);
            TCPServer.RecvMsgEvent += TCPServer_RecvMsgEvent;
            TCPServer.ClientChangedEvent += TCPServer_ClientChangedEvent;
            foreach (string ip in clientips)
            {
                JAKAs.Add(ip, new JAKABean(ip));
            }
        }
        public static string _回原 = "_回原点";
        void loadCmds()
        {
            //  string[] pointNames= Enum.GetNames(typeof(JakaPoint));

            foreach (var item in Enum.GetNames(typeof(JakaPoint)))
            {
                JakaPoint point = (JakaPoint)Enum.Parse(typeof(JakaPoint), item);
                if (point.Equals(JakaPoint.A下皮带末端) || point.Equals(JakaPoint.B下皮带末端))
                    RobotCmds.Add(item, new JakaCmd(JakaCmdType.MoveAndRound, point, item));
                else
                    RobotCmds.Add(item, new JakaCmd(JakaCmdType.Move, point, item));
                RobotCmds.Add($"{item}{_回原}", new JakaCmd(JakaCmdType.Home, point, $"{item}{_回原}"));
            }
            //foreach (var item in Enum.GetNames(typeof(JakaPoint)))
            //{
            //    JakaPoint point = (JakaPoint)Enum.Parse(typeof(JakaPoint), item);
            //    if (point.Equals(JakaPoint.A下皮带末端) || point.Equals(JakaPoint.B下皮带末端))
            //        RobotCmds.Add(item, new JakaCmd(JakaCmdType.MoveAndRound, point, item));
            //    else
            //        RobotCmds.Add(item, new JakaCmd(JakaCmdType.Move, point, item));
            //}
        }
        private void TCPServer_ClientChangedEvent(List<Client> clientKey)
        {
            foreach (string ip in JAKAs.Keys)
            {
                Client client = clientKey.Find(s => s.IP.Equals(ip));
                if (client != null)
                {
                    JAKAs[ip].RemoteEndPoint = client.EndPoint;
                    JAKAs[ip].RobotData.Online = true;
                }
                else
                {
                    JAKAs[ip].RemoteEndPoint = "";
                    JAKAs[ip].RobotData.Online = false;
                }
            }
        }
        string getCmdName(string msg)
        {
            JakaCmd jakaCmd = RobotCmds.Values.ToList().Find(s => s.CheckIsCurCmd(msg));
            if (jakaCmd != null) return jakaCmd.CmdName;
            return msg;
        }
        string parseRecvMsg(string msg)
        {
            return $"{getCmdName(msg)};{JakaCmd.ParseMsg(msg)}";
        }
        private void TCPServer_RecvMsgEvent(string clientKey, string msg)
        {
            try
            {
                string ip = clientKey.Split(':')[0];
                if (msg?.Contains("get") ?? false) return;
                JAKABean jAKA = JAKAs[ip];
                if (jAKA != null)
                {
                    jAKA.RobotData.RecvMsg = parseRecvMsg(msg.Replace(" ", ""));
                }
            }
            catch
            {
               
            }
        }

        public void Start()
        {
            TCPServer.Start();
            foreach (JAKABean item in JAKAs.Values)
            {
                item.Start();
            }
        }
        public void Stop()
        {
            TCPServer.Stop();
        }

        public void AssociateControl(UCRobot uCRobot, JAKABean jAKABean)
        {
            uCRobot.Regidter(jAKABean, this);
        }
        public JAKABean GetJAKABean(string ip)
        {
            return JAKAs[ip];
        }
        /// <summary>
        /// 发送命令
        /// </summary>
        /// <param name="endpoint"></param>
        /// <param name="cmd"></param>
        public void SendCmd(string endpoint, string cmdKey,int roundVal=0)
        {
            string ip = endpoint.Split(':')[0];
            if (JAKAs.ContainsKey(ip))
            {
                JAKAs[ip].RobotData.RecvMsg = "";
                JAKAs[ip].RobotData.CurCmd = cmdKey;
                TCPServer.SendMsg(endpoint, RobotCmds[cmdKey].ToCopy(roundVal).ToCmd());
            }

        }
    }
}