| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- using Panuon.WPF.UI;
- using SWRIS.Core;
- using SWRIS.Enums;
- using SWRIS.Extensions;
- using SWRIS.Models;
- using SWRIS.Models.ViewModel;
- using System;
- using System.Collections.ObjectModel;
- using System.IO.Ports;
- using System.Linq;
- using System.Windows.Markup;
- namespace SWRIS.Pages
- {
- /// <summary>
- /// SettingDialog.xaml 的交互逻辑
- /// </summary>
- public partial class SettingDialog : WindowX, IComponentConnector
- {
- public SettingViewModel SettingView { get; set; }
- public bool IsAutoStart { get; set; }
- public SettingDialog()
- {
- InitializeComponent();
- InitializeSettingView();
- DataContext = SettingView;
- }
- private void InitializeSettingView()
- {
- SettingView = new SettingViewModel
- {
- AppName = App.Config.AppName,
- Version = App.Config.Version,
- Copyright = App.Config.Copyright,
- Crane = App.Config.Crane,
- IpAddress = App.Config.IpAddress,
- Port = App.Config.Port,
- AlarmValidCount = App.Config.AlarmValidCount,
- DamageExtent = App.Config.DamageExtent,
- DataSaveDays = App.Config.DataSaveDays,
- ShowDebugMessage = App.Config.ShowDebugMessage,
- SpeedVariationThreshold = App.Config.SpeedVariationThreshold,
- SoundRiskLevel = (int)App.Config.SoundRiskLevel,
- CleanScheduledTime = App.Config.CleanScheduledTime,
- DamageNearPointCount = App.Config.DamageNearPointCount,
- Calibration = new CalibrationDataModel
- {
- ModuleType = (int)App.Config.Calibration.ModuleType,
- Trolleys = new ObservableCollection<TrolleyLimitDataModel>(),
- Tcp = new TcpDataModel
- {
- IpAddress = App.Config.Calibration.Tcp.IpAddress,
- Port = App.Config.Calibration.Tcp.Port,
- Station = App.Config.Calibration.Tcp.Station
- },
- Serial = new SerialDataModel
- {
- PortName = App.Config.Calibration.Serial.PortName,
- BaudRate = App.Config.Calibration.Serial.BaudRate,
- DataBits = App.Config.Calibration.Serial.DataBits,
- Parity = App.Config.Calibration.Serial.Parity.ToString(),
- StopBits = (int)App.Config.Calibration.Serial.StopBits,
- Station = App.Config.Calibration.Serial.Station
- }
- }
- };
- LoadTrolleyData();
- }
- private void LoadTrolleyData()
- {
- foreach (var trolley in App.Config.Trolleys)
- {
- var trolleyLimitData = new TrolleyLimitDataModel
- {
- TrolleyId = trolley.Id,
- TrolleyName = trolley.Name,
- Limits = new ObservableCollection<LimitDataModel>()
- };
- var trolleyLimits = App.Config.Calibration.Limits
- .Where(c => c.TrolleyId == trolley.Id)
- .Select(limit => new LimitDataModel
- {
- Name = limit.Name,
- Address = limit.Address,
- IsReverse = limit.IsReverse,
- TrolleyId = trolley.Id,
- Position = limit.Position,
- SwitchIndex = limit.SwitchIndex,
- IsEnable = limit.IsEnable,
- RelatedRopes = App.Config.Equipments.Where(c => c.TrolleyId == trolley.Id).Select(c => new RopeDataModel
- {
- RopeName = c.RopeName,
- RopeNumber = c.RopeNumber,
- IsSelected = limit.RelatedRopes.Contains(c.RopeNumber)
- }).ToList()
- })
- .ToList();
- trolleyLimitData.Limits.AddRange(trolleyLimits);
- SettingView.Calibration.Trolleys.Add(trolleyLimitData);
- }
- }
- private void Save_Click(object sender, System.Windows.RoutedEventArgs e)
- {
- try
- {
- UpdateConfiguration();
- if (ConfigHelper.Set(App.Config))
- {
- IsAutoStart = SettingView.IsAutoStart;
- DialogResult = true;
- Close();
- }
- else
- {
- LogHelper.Warn("保存配置失败,请检查配置文件权限。");
- DialogResult = false;
- }
- }
- catch (Exception ex)
- {
- LogHelper.Error($"保存配置时发生错误: {ex.Message}", ex);
- DialogResult = false;
- }
- }
- private void UpdateConfiguration()
- {
- // 更新基本配置
- App.Config.Crane = SettingView.Crane;
- App.Config.IpAddress = SettingView.IpAddress;
- App.Config.Port = SettingView.Port;
- App.Config.CleanScheduledTime = SettingView.CleanScheduledTime;
- App.Config.DataSaveDays = SettingView.DataSaveDays;
- App.Config.SoundRiskLevel = (RiskLevel)SettingView.SoundRiskLevel;
- App.Config.SpeedVariationThreshold = SettingView.SpeedVariationThreshold;
- App.Config.DamageExtent = SettingView.DamageExtent;
- App.Config.AlarmValidCount = SettingView.AlarmValidCount;
- App.Config.DamageNearPointCount = SettingView.DamageNearPointCount;
- App.Config.ShowDebugMessage = SettingView.ShowDebugMessage;
- // 更新校准配置
- UpdateCalibrationConfiguration();
- // 更新限制配置
- UpdateLimitConfiguration();
- }
- private void UpdateCalibrationConfiguration()
- {
- App.Config.Calibration.ModuleType = (ModuleType)SettingView.Calibration.ModuleType;
- if (SettingView.Calibration.ModuleType == (int)ModuleType.ModbusRtu)
- {
- var serial = SettingView.Calibration.Serial;
- App.Config.Calibration.Serial.PortName = serial.PortName;
- App.Config.Calibration.Serial.BaudRate = serial.BaudRate;
- App.Config.Calibration.Serial.DataBits = serial.DataBits;
- App.Config.Calibration.Serial.Parity = (Parity)Enum.Parse(typeof(Parity), serial.Parity);
- App.Config.Calibration.Serial.StopBits = (StopBits)serial.StopBits;
- App.Config.Calibration.Serial.Station = serial.Station;
- }
- else
- {
- var tcp = SettingView.Calibration.Tcp;
- App.Config.Calibration.Tcp.IpAddress = tcp.IpAddress;
- App.Config.Calibration.Tcp.Port = tcp.Port;
- App.Config.Calibration.Tcp.Station = tcp.Station;
- }
- }
- private void UpdateLimitConfiguration()
- {
- // 使用更安全的方式更新限制配置
- var limitsToUpdate = SettingView.Calibration.Trolleys
- .SelectMany(t => t.Limits)
- .ToList();
- foreach (var sourceLimit in limitsToUpdate)
- {
- var targetLimit = App.Config.Calibration.Limits
- .FirstOrDefault(limit => limit.TrolleyId == sourceLimit.TrolleyId && limit.Address == sourceLimit.Address);
- if (targetLimit != null)
- {
- targetLimit.Name = sourceLimit.Name;
- targetLimit.Address = sourceLimit.Address;
- targetLimit.Position = sourceLimit.Position;
- targetLimit.IsEnable = sourceLimit.IsEnable;
- targetLimit.IsReverse = sourceLimit.IsReverse;
- targetLimit.SwitchIndex = sourceLimit.SwitchIndex;
- targetLimit.RelatedRopes = sourceLimit.RelatedRopes
- .Where(r => r.IsSelected)
- .Select(r => r.RopeNumber)
- .ToList();
- }
- }
- }
- private void Cancel_Click(object sender, System.Windows.RoutedEventArgs e)
- {
- DialogResult = false;
- Close();
- }
- }
- }
|