| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- using System;
- using System.IO.Ports;
- using System.Linq;
- using System.Net;
- using System.Net.NetworkInformation;
- using System.Net.Sockets;
- using System.Windows.Forms;
- using APS7100TestTool.Models;
- using APS7100TestTool.Services;
- namespace APS7100TestTool.Forms
- {
- public partial class SettingsForm : Form
- {
- private ConfigService _configService;
- private AppSettings _settings;
- public SettingsForm()
- {
- InitializeComponent();
- _configService = new ConfigService();
- LoadSettings();
- }
- private void LoadSettings()
- {
- _settings = _configService.LoadAppSettings();
-
- // 刷新串口列表
- RefreshComPorts();
- // 刷新本地IP列表
- RefreshLocalIpAddresses();
- // APS7100 设置
- chkAutoConnectAPS7100.Checked = _settings.AutoConnectAPS7100;
- rbAPS7100Serial.Checked = _settings.APS7100ConnectionType == "Serial";
- rbAPS7100Ethernet.Checked = _settings.APS7100ConnectionType == "Ethernet";
- SelectComPort(cmbAPS7100ComPort, _settings.APS7100ComPort);
- cmbAPS7100BaudRate.Text = _settings.APS7100BaudRate.ToString();
- txtAPS7100IpAddress.Text = _settings.APS7100IpAddress;
- numAPS7100Port.Value = _settings.APS7100Port;
- // PSW250 设置
- chkAutoConnectPSW250.Checked = _settings.AutoConnectPSW250;
- rbPSW250Serial.Checked = _settings.PSW250ConnectionType == "Serial";
- rbPSW250Ethernet.Checked = _settings.PSW250ConnectionType == "Ethernet";
- SelectComPort(cmbPSW250ComPort, _settings.PSW250ComPort);
- cmbPSW250BaudRate.Text = _settings.PSW250BaudRate.ToString();
- txtPSW250IpAddress.Text = _settings.PSW250IpAddress;
- numPSW250Port.Value = _settings.PSW250Port;
- // Modbus 设置
- chkAutoStartModbus.Checked = _settings.AutoStartModbus;
- numModbusPort.Value = _settings.ModbusPort;
- SelectBindIpAddress(_settings.ModbusBindIpAddress);
- // 启动行为设置
- chkStartMinimized.Checked = _settings.StartMinimized;
- UpdateUI();
- }
- private void RefreshLocalIpAddresses()
- {
- cmbModbusBindIp.Items.Clear();
- cmbModbusBindIp.Items.Add("0.0.0.0 (所有接口)");
-
- try
- {
- // 获取所有网络接口
- foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
- {
- // 只获取已连接的接口
- if (ni.OperationalStatus != OperationalStatus.Up)
- continue;
- // 获取 IPv4 地址
- foreach (UnicastIPAddressInformation ip in ni.GetIPProperties().UnicastAddresses)
- {
- if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
- {
- string displayText = $"{ip.Address} ({ni.Name})";
- cmbModbusBindIp.Items.Add(displayText);
- }
- }
- }
- }
- catch (Exception)
- {
- // 忽略获取网络接口失败
- }
- if (cmbModbusBindIp.Items.Count > 0)
- cmbModbusBindIp.SelectedIndex = 0;
- }
- private void SelectBindIpAddress(string ipAddress)
- {
- if (string.IsNullOrEmpty(ipAddress) || ipAddress == "0.0.0.0")
- {
- cmbModbusBindIp.SelectedIndex = 0;
- return;
- }
- // 查找匹配的 IP
- for (int i = 0; i < cmbModbusBindIp.Items.Count; i++)
- {
- string item = cmbModbusBindIp.Items[i].ToString();
- if (item.StartsWith(ipAddress + " ") || item == ipAddress)
- {
- cmbModbusBindIp.SelectedIndex = i;
- return;
- }
- }
- // 如果没找到,选择第一项
- cmbModbusBindIp.SelectedIndex = 0;
- }
- private string GetSelectedBindIpAddress()
- {
- if (cmbModbusBindIp.SelectedItem == null)
- return "0.0.0.0";
- string selected = cmbModbusBindIp.SelectedItem.ToString();
-
- // 提取 IP 地址部分(在括号之前)
- int spaceIndex = selected.IndexOf(' ');
- if (spaceIndex > 0)
- return selected.Substring(0, spaceIndex);
-
- return selected;
- }
- private void RefreshComPorts()
- {
- string[] ports = SerialPort.GetPortNames();
-
- cmbAPS7100ComPort.Items.Clear();
- cmbPSW250ComPort.Items.Clear();
-
- cmbAPS7100ComPort.Items.AddRange(ports);
- cmbPSW250ComPort.Items.AddRange(ports);
- }
- private void SelectComPort(ComboBox cmb, string portName)
- {
- if (!string.IsNullOrEmpty(portName))
- {
- int index = cmb.Items.IndexOf(portName);
- if (index >= 0) cmb.SelectedIndex = index;
- }
- }
- private void UpdateUI()
- {
- // APS7100 连接类型 UI
- bool isAPS7100Serial = rbAPS7100Serial.Checked;
- cmbAPS7100ComPort.Visible = isAPS7100Serial;
- lblAPS7100ComPort.Visible = isAPS7100Serial;
- cmbAPS7100BaudRate.Visible = isAPS7100Serial;
- lblAPS7100BaudRate.Visible = isAPS7100Serial;
- txtAPS7100IpAddress.Visible = !isAPS7100Serial;
- lblAPS7100IpAddress.Visible = !isAPS7100Serial;
- numAPS7100Port.Visible = !isAPS7100Serial;
- lblAPS7100Port.Visible = !isAPS7100Serial;
- // PSW250 连接类型 UI
- bool isPSW250Serial = rbPSW250Serial.Checked;
- cmbPSW250ComPort.Visible = isPSW250Serial;
- lblPSW250ComPort.Visible = isPSW250Serial;
- cmbPSW250BaudRate.Visible = isPSW250Serial;
- lblPSW250BaudRate.Visible = isPSW250Serial;
- txtPSW250IpAddress.Visible = !isPSW250Serial;
- lblPSW250IpAddress.Visible = !isPSW250Serial;
- numPSW250Port.Visible = !isPSW250Serial;
- lblPSW250Port.Visible = !isPSW250Serial;
- }
- private void rbAPS7100_CheckedChanged(object sender, EventArgs e) => UpdateUI();
- private void rbPSW250_CheckedChanged(object sender, EventArgs e) => UpdateUI();
- private void btnRefreshPorts_Click(object sender, EventArgs e)
- {
- RefreshComPorts();
- MessageBox.Show("串口列表已刷新", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
- }
- private void btnSave_Click(object sender, EventArgs e)
- {
- try
- {
- // APS7100 设置
- _settings.AutoConnectAPS7100 = chkAutoConnectAPS7100.Checked;
- _settings.APS7100ConnectionType = rbAPS7100Serial.Checked ? "Serial" : "Ethernet";
- _settings.APS7100ComPort = cmbAPS7100ComPort.SelectedItem?.ToString() ?? "";
- _settings.APS7100BaudRate = int.TryParse(cmbAPS7100BaudRate.Text, out int br1) ? br1 : 9600;
- _settings.APS7100IpAddress = txtAPS7100IpAddress.Text.Trim();
- _settings.APS7100Port = (int)numAPS7100Port.Value;
- // PSW250 设置
- _settings.AutoConnectPSW250 = chkAutoConnectPSW250.Checked;
- _settings.PSW250ConnectionType = rbPSW250Serial.Checked ? "Serial" : "Ethernet";
- _settings.PSW250ComPort = cmbPSW250ComPort.SelectedItem?.ToString() ?? "";
- _settings.PSW250BaudRate = int.TryParse(cmbPSW250BaudRate.Text, out int br2) ? br2 : 9600;
- _settings.PSW250IpAddress = txtPSW250IpAddress.Text.Trim();
- _settings.PSW250Port = (int)numPSW250Port.Value;
- // Modbus 设置
- _settings.AutoStartModbus = chkAutoStartModbus.Checked;
- _settings.ModbusPort = (int)numModbusPort.Value;
- _settings.ModbusBindIpAddress = GetSelectedBindIpAddress();
- // 启动行为设置
- _settings.StartMinimized = chkStartMinimized.Checked;
- _configService.SaveAppSettings(_settings);
- MessageBox.Show("设置已保存!\n\n自动连接设置将在下次启动程序时生效。",
- "保存成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
-
- this.DialogResult = DialogResult.OK;
- this.Close();
- }
- catch (Exception ex)
- {
- MessageBox.Show($"保存失败: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
- }
- }
- private void btnCancel_Click(object sender, EventArgs e)
- {
- this.DialogResult = DialogResult.Cancel;
- this.Close();
- }
- }
- }
|