SettingsForm.cs 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. using System;
  2. using System.IO.Ports;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Net.NetworkInformation;
  6. using System.Net.Sockets;
  7. using System.Windows.Forms;
  8. using APS7100TestTool.Models;
  9. using APS7100TestTool.Services;
  10. namespace APS7100TestTool.Forms
  11. {
  12. public partial class SettingsForm : Form
  13. {
  14. private ConfigService _configService;
  15. private AppSettings _settings;
  16. public SettingsForm()
  17. {
  18. InitializeComponent();
  19. _configService = new ConfigService();
  20. LoadSettings();
  21. }
  22. private void LoadSettings()
  23. {
  24. _settings = _configService.LoadAppSettings();
  25. // 刷新串口列表
  26. RefreshComPorts();
  27. // 刷新本地IP列表
  28. RefreshLocalIpAddresses();
  29. // APS7100 设置
  30. chkAutoConnectAPS7100.Checked = _settings.AutoConnectAPS7100;
  31. rbAPS7100Serial.Checked = _settings.APS7100ConnectionType == "Serial";
  32. rbAPS7100Ethernet.Checked = _settings.APS7100ConnectionType == "Ethernet";
  33. SelectComPort(cmbAPS7100ComPort, _settings.APS7100ComPort);
  34. cmbAPS7100BaudRate.Text = _settings.APS7100BaudRate.ToString();
  35. txtAPS7100IpAddress.Text = _settings.APS7100IpAddress;
  36. numAPS7100Port.Value = _settings.APS7100Port;
  37. // PSW250 设置
  38. chkAutoConnectPSW250.Checked = _settings.AutoConnectPSW250;
  39. rbPSW250Serial.Checked = _settings.PSW250ConnectionType == "Serial";
  40. rbPSW250Ethernet.Checked = _settings.PSW250ConnectionType == "Ethernet";
  41. SelectComPort(cmbPSW250ComPort, _settings.PSW250ComPort);
  42. cmbPSW250BaudRate.Text = _settings.PSW250BaudRate.ToString();
  43. txtPSW250IpAddress.Text = _settings.PSW250IpAddress;
  44. numPSW250Port.Value = _settings.PSW250Port;
  45. // Modbus 设置
  46. chkAutoStartModbus.Checked = _settings.AutoStartModbus;
  47. numModbusPort.Value = _settings.ModbusPort;
  48. SelectBindIpAddress(_settings.ModbusBindIpAddress);
  49. // 启动行为设置
  50. chkStartMinimized.Checked = _settings.StartMinimized;
  51. UpdateUI();
  52. }
  53. private void RefreshLocalIpAddresses()
  54. {
  55. cmbModbusBindIp.Items.Clear();
  56. cmbModbusBindIp.Items.Add("0.0.0.0 (所有接口)");
  57. try
  58. {
  59. // 获取所有网络接口
  60. foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
  61. {
  62. // 只获取已连接的接口
  63. if (ni.OperationalStatus != OperationalStatus.Up)
  64. continue;
  65. // 获取 IPv4 地址
  66. foreach (UnicastIPAddressInformation ip in ni.GetIPProperties().UnicastAddresses)
  67. {
  68. if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
  69. {
  70. string displayText = $"{ip.Address} ({ni.Name})";
  71. cmbModbusBindIp.Items.Add(displayText);
  72. }
  73. }
  74. }
  75. }
  76. catch (Exception)
  77. {
  78. // 忽略获取网络接口失败
  79. }
  80. if (cmbModbusBindIp.Items.Count > 0)
  81. cmbModbusBindIp.SelectedIndex = 0;
  82. }
  83. private void SelectBindIpAddress(string ipAddress)
  84. {
  85. if (string.IsNullOrEmpty(ipAddress) || ipAddress == "0.0.0.0")
  86. {
  87. cmbModbusBindIp.SelectedIndex = 0;
  88. return;
  89. }
  90. // 查找匹配的 IP
  91. for (int i = 0; i < cmbModbusBindIp.Items.Count; i++)
  92. {
  93. string item = cmbModbusBindIp.Items[i].ToString();
  94. if (item.StartsWith(ipAddress + " ") || item == ipAddress)
  95. {
  96. cmbModbusBindIp.SelectedIndex = i;
  97. return;
  98. }
  99. }
  100. // 如果没找到,选择第一项
  101. cmbModbusBindIp.SelectedIndex = 0;
  102. }
  103. private string GetSelectedBindIpAddress()
  104. {
  105. if (cmbModbusBindIp.SelectedItem == null)
  106. return "0.0.0.0";
  107. string selected = cmbModbusBindIp.SelectedItem.ToString();
  108. // 提取 IP 地址部分(在括号之前)
  109. int spaceIndex = selected.IndexOf(' ');
  110. if (spaceIndex > 0)
  111. return selected.Substring(0, spaceIndex);
  112. return selected;
  113. }
  114. private void RefreshComPorts()
  115. {
  116. string[] ports = SerialPort.GetPortNames();
  117. cmbAPS7100ComPort.Items.Clear();
  118. cmbPSW250ComPort.Items.Clear();
  119. cmbAPS7100ComPort.Items.AddRange(ports);
  120. cmbPSW250ComPort.Items.AddRange(ports);
  121. }
  122. private void SelectComPort(ComboBox cmb, string portName)
  123. {
  124. if (!string.IsNullOrEmpty(portName))
  125. {
  126. int index = cmb.Items.IndexOf(portName);
  127. if (index >= 0) cmb.SelectedIndex = index;
  128. }
  129. }
  130. private void UpdateUI()
  131. {
  132. // APS7100 连接类型 UI
  133. bool isAPS7100Serial = rbAPS7100Serial.Checked;
  134. cmbAPS7100ComPort.Visible = isAPS7100Serial;
  135. lblAPS7100ComPort.Visible = isAPS7100Serial;
  136. cmbAPS7100BaudRate.Visible = isAPS7100Serial;
  137. lblAPS7100BaudRate.Visible = isAPS7100Serial;
  138. txtAPS7100IpAddress.Visible = !isAPS7100Serial;
  139. lblAPS7100IpAddress.Visible = !isAPS7100Serial;
  140. numAPS7100Port.Visible = !isAPS7100Serial;
  141. lblAPS7100Port.Visible = !isAPS7100Serial;
  142. // PSW250 连接类型 UI
  143. bool isPSW250Serial = rbPSW250Serial.Checked;
  144. cmbPSW250ComPort.Visible = isPSW250Serial;
  145. lblPSW250ComPort.Visible = isPSW250Serial;
  146. cmbPSW250BaudRate.Visible = isPSW250Serial;
  147. lblPSW250BaudRate.Visible = isPSW250Serial;
  148. txtPSW250IpAddress.Visible = !isPSW250Serial;
  149. lblPSW250IpAddress.Visible = !isPSW250Serial;
  150. numPSW250Port.Visible = !isPSW250Serial;
  151. lblPSW250Port.Visible = !isPSW250Serial;
  152. }
  153. private void rbAPS7100_CheckedChanged(object sender, EventArgs e) => UpdateUI();
  154. private void rbPSW250_CheckedChanged(object sender, EventArgs e) => UpdateUI();
  155. private void btnRefreshPorts_Click(object sender, EventArgs e)
  156. {
  157. RefreshComPorts();
  158. MessageBox.Show("串口列表已刷新", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  159. }
  160. private void btnSave_Click(object sender, EventArgs e)
  161. {
  162. try
  163. {
  164. // APS7100 设置
  165. _settings.AutoConnectAPS7100 = chkAutoConnectAPS7100.Checked;
  166. _settings.APS7100ConnectionType = rbAPS7100Serial.Checked ? "Serial" : "Ethernet";
  167. _settings.APS7100ComPort = cmbAPS7100ComPort.SelectedItem?.ToString() ?? "";
  168. _settings.APS7100BaudRate = int.TryParse(cmbAPS7100BaudRate.Text, out int br1) ? br1 : 9600;
  169. _settings.APS7100IpAddress = txtAPS7100IpAddress.Text.Trim();
  170. _settings.APS7100Port = (int)numAPS7100Port.Value;
  171. // PSW250 设置
  172. _settings.AutoConnectPSW250 = chkAutoConnectPSW250.Checked;
  173. _settings.PSW250ConnectionType = rbPSW250Serial.Checked ? "Serial" : "Ethernet";
  174. _settings.PSW250ComPort = cmbPSW250ComPort.SelectedItem?.ToString() ?? "";
  175. _settings.PSW250BaudRate = int.TryParse(cmbPSW250BaudRate.Text, out int br2) ? br2 : 9600;
  176. _settings.PSW250IpAddress = txtPSW250IpAddress.Text.Trim();
  177. _settings.PSW250Port = (int)numPSW250Port.Value;
  178. // Modbus 设置
  179. _settings.AutoStartModbus = chkAutoStartModbus.Checked;
  180. _settings.ModbusPort = (int)numModbusPort.Value;
  181. _settings.ModbusBindIpAddress = GetSelectedBindIpAddress();
  182. // 启动行为设置
  183. _settings.StartMinimized = chkStartMinimized.Checked;
  184. _configService.SaveAppSettings(_settings);
  185. MessageBox.Show("设置已保存!\n\n自动连接设置将在下次启动程序时生效。",
  186. "保存成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
  187. this.DialogResult = DialogResult.OK;
  188. this.Close();
  189. }
  190. catch (Exception ex)
  191. {
  192. MessageBox.Show($"保存失败: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
  193. }
  194. }
  195. private void btnCancel_Click(object sender, EventArgs e)
  196. {
  197. this.DialogResult = DialogResult.Cancel;
  198. this.Close();
  199. }
  200. }
  201. }