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
{
///
/// SettingDialog.xaml 的交互逻辑
///
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(),
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()
};
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();
}
}
}