LB_SmartVision/Forms/Pages/CommunicatorPage/CommunicatorForm.cs
@@ -3,19 +3,31 @@
using LB_VisionProcesses.Communicators.TCom;
using ReaLTaiizor.Forms;
using RJCP.IO.Ports;
using S7.Net;
using System.Diagnostics;
using System.Linq;
namespace LB_SmartVision.Forms.Pages.CommunicatorPage
{
    public delegate void CommunicatorChange(BaseCommunicator communicator);
    public partial class CommunicatorForm : Form
    {
        BaseCommunicator communicator { get; set; }
        public event CommunicatorChange CommunicatorChanged;
        private void communicatorChanged(BaseCommunicator communicator)
        {
            if (CommunicatorChanged != null)
            {
                CommunicatorChanged(communicator);
            }
        }
        public CommunicatorForm()
        {
            InitializeComponent();
            cmbType.Items.Clear();
            if (communicator != null && !string.IsNullOrEmpty(communicator.CommunicatorConnections["型号"]?.ToString()))
            {
                cmbType.Items.Add(communicator.CommunicatorConnections["型号"]?.ToString());
@@ -26,38 +38,44 @@
        {
            InitializeComponent();
            if (communicator == null)
            {
                return;
            }
            cmbIP.Enabled = false;
            txtIP.Enabled = false;
            txtPort.Enabled = false;
            cmbDataType.Enabled = false;
            lblType.Visible = false;
            lblAddress.Visible = false;
            cmbType.Visible = false;
            txtAddress.Visible = false;
            lblDataType.Visible = false;
            cmbDataType.Visible = false;
            this.Text = name;
            if (communicator is UARTPort)
            {
                //统计可用端口
                SerialPortStream temp = new SerialPortStream();
                string[] ArryPort = temp.GetPortNames();
                for (int i = 0; i < ArryPort.Length; i++)
                {
                    cmbIP.Items.Add(ArryPort[i]);
                }
                cmbIP.Text = communicator.CommunicatorConnections["地址"]?.ToString();
                txtPort.Text = communicator.CommunicatorConnections["端口"]?.ToString();
                txtIP.Visible = false;
                cmbIP.Visible = true;
                this.btnRuleSend.Visible = true;
                lblType.Visible = false;
                lblAddress.Visible = false;
                cmbType.Visible = false;
                txtAddress.Visible = false;
                lblDataType.Visible = false;
                cmbDataType.Visible = false;
                lblIP.Text = "COM口";
                lblPort.Text = "波特率";
@@ -65,14 +83,16 @@
            else if (communicator is TCPClient || communicator is TCPServer)
            {
                txtIP.Text = communicator.CommunicatorConnections["地址"]?.ToString();
                txtPort.SelectedText = communicator.CommunicatorConnections["端口"]?.ToString();
                txtPort.Text = communicator.CommunicatorConnections["端口"]?.ToString();
                txtIP.Visible = true;
                cmbIP.Visible = false;
                this.btnRuleSend.Visible = false;
                lblType.Visible = false;
                lblAddress.Visible = false;
                cmbType.Visible = false;
                txtAddress.Visible = false;
                lblDataType.Visible = false;
                cmbDataType.Visible = false;
                lblIP.Text = "地址";
                lblPort.Text = "端口";
@@ -82,19 +102,34 @@
                txtIP.Text = communicator.CommunicatorConnections["地址"]?.ToString();
                txtPort.Text = communicator.CommunicatorConnections["端口"]?.ToString();
                cmbType.Items.Clear();
                if (!string.IsNullOrEmpty(communicator.CommunicatorConnections["型号"]?.ToString()))
                {
                    cmbType.Items.Add(communicator.CommunicatorConnections["型号"]?.ToString());
                    cmbType.Text = communicator.CommunicatorConnections["型号"]?.ToString();
                }
                cmbType.Text = communicator.CommunicatorConnections["型号"]?.ToString();
                if (!string.IsNullOrEmpty(communicator.CommunicatorConnections["变量地址"]?.ToString()))
                {
                    txtAddress.Text = communicator.CommunicatorConnections["变量地址"]?.ToString();
                }
                // 初始化数据类型
                cmbDataType.Items.Clear();
                cmbDataType.Items.AddRange(new string[] { "String", "Bool", "Byte", "Int", "DInt", "Real", "Double", "Word", "DWord" });
                if (communicator.CommunicatorConnections.Contains("数据类型"))
                    cmbDataType.Text = communicator.CommunicatorConnections["数据类型"].ToString();
                else
                    cmbDataType.Text = "String";
                txtIP.Visible = true;
                cmbIP.Visible = false;
                this.btnRuleSend.Visible = false;
                lblType.Visible = true;
                lblAddress.Visible = true;
                cmbType.Visible = true;
                txtAddress.Visible = true;
                lblDataType.Visible = true;
                cmbDataType.Visible = true;
                cmbDataType.Enabled = true; // 启用数据类型选择
                lblIP.Text = "IP";
                lblPort.Text = "槽";
@@ -103,6 +138,15 @@
            this.communicator = communicator;
            //加载回调函数
            Subscribe();
        }
        private void cmbDataType_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (communicator != null)
            {
                communicator.CommunicatorConnections.Add("数据类型", cmbDataType.Text);
                communicatorChanged(communicator);
            }
        }
        private void CommunicatorForm_FormClosing(object sender, FormClosingEventArgs e) => Unsubscribe();
@@ -115,6 +159,14 @@
                    return;
                //取消回调函数
                communicator.MessageReceived -= ShowReceiveMsg;
                if (communicator != null)
                {
                    communicatorChanged(communicator);
                    if (GlobalVar.dicCommunicators != null && GlobalVar.dicCommunicators.Keys.Count > 0 && GlobalVar.dicCommunicators.Keys.Contains(communicator.CommunicatorName))
                    {
                        GlobalVar.dicCommunicators[communicator.CommunicatorName] = communicator;
                    }
                }
            }
            catch (Exception ex)
            {
@@ -196,6 +248,24 @@
            }
        }
        private void ShowLogMsg(string msg)
        {
            // 如果当前不是 UI 线程,则通过 Invoke 将操作调度到 UI 线程
            if (this.InvokeRequired)
            {
                this.Invoke(new Action<string>((message) =>
                {
                    this.txtReceiveMsg.AppendText("[" + DateTime.Now.ToString("HH:mm:ss.fff") + "] " + message + "\r\n");
                    this.txtReceiveMsg.ScrollToCaret();
                }), msg);
            }
            else
            {
                this.txtReceiveMsg.AppendText("[" + DateTime.Now.ToString("HH:mm:ss.fff") + "] " + msg + "\r\n");
                this.txtReceiveMsg.ScrollToCaret();
            }
        }
        private void btnSend_Click(object sender, EventArgs e)
        {
            if (communicator == null)
@@ -203,6 +273,8 @@
            if (communicator.SendMessage(txtSendMsg.Text))
                ShowSendMsg(txtSendMsg.Text);
            else
                ShowLogMsg(communicator.Msg);
        }
        private void btnRuleSend_Click(object sender, EventArgs e)
@@ -221,6 +293,30 @@
            if (communicator.SendMessage(SendMsg))
                ShowSendMsg(SendMsg);
            else
                ShowLogMsg(communicator.Msg);
        }
        private void txtAddress_TextChanged(object sender, EventArgs e)
        {
            if (communicator != null)
            {
                communicator.CommunicatorConnections.Add("变量地址", txtAddress.Text);
                communicatorChanged(communicator);
            }
        }
        private void cmbVarType_SelectedIndexChanged(object sender, EventArgs e)
        {
            //if (communicator != null && !communicator.CommunicatorConnections.Contains("变量类型"))
            //{
            //    communicator.CommunicatorConnections.Add("变量类型", cmbVarType.Text);
            //}
            //else if (communicator != null)
            //{
            //    communicator.CommunicatorConnections["变量类型"] = cmbVarType.Text;
            //    communicatorChanged(communicator);
            //}
        }
    }
}