Răsfoiți Sursa

支持KCS_KDC3_24V300W_8T型号并优化控制器配置逻辑

新增光源型号KCS_KDC3_24V300W_8T,重构LightControllerConfig初始化流程,移除LightModel属性自动初始化,改为显式Init()方法。实现通道集合智能调整,支持界面型号切换时自动刷新配置。完善界面可见性控制,提升配置健壮性和可扩展性。
孝锋 徐 7 luni în urmă
părinte
comite
26e4a0af7b

+ 4 - 0
TeamAAS-VM/Core/Lights/LightModel.cs

@@ -15,5 +15,9 @@ namespace TeamAAS_VP.Core.Lights
         /// 顺尚信KDC-12V60W-4T
         /// </summary>
         KCS_KDC_12V60W_4T,
+        /// <summary>
+        /// 顺尚信KDC3-24V300W-8T
+        /// </summary>
+        KCS_KDC3_24V300W_8T,
     }
 }

+ 123 - 60
TeamAAS-VM/Models/Lights/LightControllerConfig.cs

@@ -15,7 +15,7 @@ namespace TeamAAS_VP.Models.Lights
     /// 根据所选的 <see cref="LightModel"/> 执行不同的初始化逻辑(如通道数量、串口或 TCP 配置等)。
     /// 该类继承自 Prism 的 <see cref="BindableBase"/>,支持属性变更通知,适用于 WPF MVVM 绑定。
     /// </summary>
-    public class LightControllerConfig: BindableBase
+    public class LightControllerConfig : BindableBase
     {
         private int _Id;
         /// <summary>
@@ -56,52 +56,7 @@ namespace TeamAAS_VP.Models.Lights
         public LightModel LightModel
         {
             get { return _LightModel; }
-            set {
-                if (SetProperty(ref _LightModel, value))
-                {
-                    // 当 LightModel 发生变化时,根据不同型号初始化相关字段与集合。
-                    switch (value)
-                    {
-                        case LightModel.KCS_KDC_12V60W_4T:
-                            // 该型号为 4 通道的串口控制器(示例)
-                            ChannelCount = 4;
-                            // 对于串口型号,清空/禁用 TCP 配置
-                            TcpConfig = null;
-                            // 如果尚未创建串口配置则初始化
-                            if (SerialPortConfig == null)
-                            {
-                                SerialPortConfig = new SerialPortConfig();
-                            }
-
-                            // 初始化通道集合,确保包含正确数量的 ChannelConfig
-                            ChannelConfigs = new ObservableCollection<ChannelConfig>();
-                            if (ChannelConfigs.Count != ChannelCount)
-                            {
-                                ChannelConfigs.Clear();
-                                for (int i = 0; i < ChannelCount; i++)
-                                {
-                                    // 为每个通道创建默认配置:本地索引/全局索引、名称、描述和默认亮度
-                                    ChannelConfigs.Add(new ChannelConfig()
-                                    {
-                                        LocalIndex = i,
-                                        GlobalIndex = i,
-                                        Name = $"Channel {i + 1}",
-                                        Description = $"Description for Channel {i + 1}",
-                                        DefaultBrightness = 100
-                                    });
-                                }
-                            }
-
-                            break;
-                        default:
-                            // 对于未知或未实现的型号,清理所有特定配置并使用默认空集合
-                            ChannelConfigs = new ObservableCollection<ChannelConfig>();
-                            SerialPortConfig = null;
-                            TcpConfig = null;
-                            break;
-                    }
-                }
-            }
+            set { SetProperty(ref _LightModel, value); }
         }
 
         private ObservableCollection<ChannelConfig> _ChannelConfigs;
@@ -160,30 +115,138 @@ namespace TeamAAS_VP.Models.Lights
             switch (LightModel)
             {
                 case LightModel.KCS_KDC_12V60W_4T:
-                    // 该型号为 4 通道的串口控制器(示例),与 setter 中保持一致的初始化
+                    // 该型号为 4 通道的串口控制器(示例)
                     ChannelCount = 4;
                     TcpConfig = null;
-                    SerialPortConfig = new SerialPortConfig();
-                    ChannelConfigs = new ObservableCollection<ChannelConfig>();
-                    for (int i = 0; i < ChannelCount; i++)
+                    if (SerialPortConfig == null)
+                    {
+                        SerialPortConfig = new SerialPortConfig();
+                    }
+                    // 调整通道集合,保留已有配置,若不足则追加,若过多则裁剪
+                    ResizeChannelConfigs(ChannelCount);
+                    break;
+                case LightModel.KCS_KDC3_24V300W_8T:
+                    // 该型号为 8 通道的串口控制器(示例)
+                    ChannelCount = 8;
+                    TcpConfig = null;
+                    if (SerialPortConfig == null)
                     {
-                        ChannelConfigs.Add(new ChannelConfig()
-                        {
-                            LocalIndex = i,
-                            GlobalIndex = i,
-                            Name = $"Channel {i + 1}",
-                            Description = $"Description for Channel {i + 1}",
-                            DefaultBrightness = 100
-                        });
+                        SerialPortConfig = new SerialPortConfig();
                     }
+                    ResizeChannelConfigs(ChannelCount);
                     break;
                 default:
                     // 未知型号:初始化空集合并清空通信配置
-                    ChannelConfigs = new ObservableCollection<ChannelConfig>();
+                    ChannelCount = 0;
+                    if (ChannelConfigs == null)
+                        ChannelConfigs = new ObservableCollection<ChannelConfig>();
+                    else
+                        ResizeChannelConfigs(0);
+                    SerialPortConfig = null;
+                    TcpConfig = null;
+                    break;
+            }
+        }
+
+        public LightControllerConfig Init()
+        {
+            // 当 LightModel 发生变化时,根据不同型号初始化相关字段与集合。
+            switch (LightModel)
+            {
+                case LightModel.KCS_KDC_12V60W_4T:
+                    // 该型号为 4 通道的串口控制器(示例)
+                    ChannelCount = 4;
+                    TcpConfig = null;
+                    if (SerialPortConfig == null)
+                    {
+                        SerialPortConfig = new SerialPortConfig();
+                    }
+                    ResizeChannelConfigs(ChannelCount);
+                    break;
+                case LightModel.KCS_KDC3_24V300W_8T:
+                    // 该型号为 8 通道的串口控制器(示例)
+                    ChannelCount = 8;
+                    TcpConfig = null;
+                    if (SerialPortConfig == null)
+                    {
+                        SerialPortConfig = new SerialPortConfig();
+                    }
+                    ResizeChannelConfigs(ChannelCount);
+                    break;
+                default:
+                    // 对于未知或未实现的型号,清理所有特定配置并使用默认空集合
+                    ChannelCount = 0;
+                    if (ChannelConfigs == null)
+                        ChannelConfigs = new ObservableCollection<ChannelConfig>();
+                    else
+                        ResizeChannelConfigs(0);
                     SerialPortConfig = null;
                     TcpConfig = null;
                     break;
             }
+            return this;
+        }
+
+        /// <summary>
+        /// 调整 ChannelConfigs 的数量以匹配 desiredCount:
+        /// - 保留已有前段配置;
+        /// - 若不足则追加新配置;
+        /// - 若过多则从末尾裁剪;
+        /// - 最后规范化每个通道的 LocalIndex/GlobalIndex,并在 Name/Description 为空时填默认值。
+        /// </summary>
+        /// <param name="desiredCount">期望的通道数量</param>
+        private void ResizeChannelConfigs(int desiredCount)
+        {
+            if (ChannelConfigs == null)
+            {
+                ChannelConfigs = new ObservableCollection<ChannelConfig>();
+            }
+
+            int current = ChannelConfigs.Count;
+
+            if (current < desiredCount)
+            {
+                for (int i = current; i < desiredCount; i++)
+                {
+                    ChannelConfigs.Add(new ChannelConfig()
+                    {
+                        LocalIndex = i,
+                        GlobalIndex = i,
+                        Name = $"Channel {i + 1}",
+                        Description = $"Description for Channel {i + 1}",
+                        DefaultBrightness = 100
+                    });
+                }
+            }
+            else if (current > desiredCount)
+            {
+                // 从末尾删除多余通道,保留前面的配置
+                for (int i = current - 1; i >= desiredCount; i--)
+                {
+                    ChannelConfigs.RemoveAt(i);
+                }
+            }
+
+            // 规范化索引与默认文本(不覆盖已有非空 Name/Description)
+            for (int i = 0; i < ChannelConfigs.Count; i++)
+            {
+                var cfg = ChannelConfigs[i];
+                if (cfg == null)
+                    continue;
+
+                cfg.LocalIndex = i;
+                cfg.GlobalIndex = i;
+
+                if (string.IsNullOrWhiteSpace(cfg.Name))
+                    cfg.Name = $"Channel {i + 1}";
+
+                if (string.IsNullOrWhiteSpace(cfg.Description))
+                    cfg.Description = $"Description for Channel {i + 1}";
+
+                // 如果需要可以在此处保留或调整 DefaultBrightness 等字段,但默认不覆盖已有值
+                if (cfg.DefaultBrightness <= 0)
+                    cfg.DefaultBrightness = 100;
+            }
         }
     }
 }

+ 2 - 2
TeamAAS-VM/ViewModels/Setting/AddLightControllerViewModel.cs

@@ -36,7 +36,7 @@ namespace TeamAAS_VP.ViewModels.Setting
 
         public void OnDialogOpened(IDialogParameters parameters)
         {
-            LightController = new LightControllerConfig() { Id = 0, Name = "New Controller", LightModel = TeamAAS_VP.Core.Lights.LightModel.KCS_KDC_12V60W_4T };
+            LightController = new LightControllerConfig() { Id = 0, Name = "New Controller", LightModel = TeamAAS_VP.Core.Lights.LightModel.KCS_KDC_12V60W_4T }.Init();
         }
 
         bool CanExecuteConfirmCommand()
@@ -47,7 +47,7 @@ namespace TeamAAS_VP.ViewModels.Setting
         void ExecuteConfirmCommand()
         {
             var p = new DialogParameters();
-            p.Add("LightController", LightController);
+            p.Add("LightController", LightController.Init());
             RequestClose?.Invoke(new DialogResult(ButtonResult.OK, p));
         }
 

+ 26 - 0
TeamAAS-VM/ViewModels/SettingViewModel.cs

@@ -426,7 +426,11 @@ namespace TeamAAS_VP.ViewModels
         public DelegateCommand SaveScrewFeedersCommand =>
             _SaveScrewFeedersCommand ?? (_SaveScrewFeedersCommand = new DelegateCommand(ExecuteSaveScrewFeedersCommand));
 
+        private DelegateCommand<object> _LightModelChangedCommand;
+        public DelegateCommand<object> LightModelChangedCommand =>
+            _LightModelChangedCommand ?? (_LightModelChangedCommand = new DelegateCommand<object>(ExecuteLightModelChangedCommand));
 
+        
         #endregion
 
         #region 事件
@@ -976,6 +980,28 @@ namespace TeamAAS_VP.ViewModels
                 _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = Lang.完成, Duration = 1 });
             }
         }
+
+        /// <summary>
+        /// 光源型号改变
+        /// </summary>
+        void ExecuteLightModelChangedCommand(object obj)
+        {
+            try
+            {
+                if (obj == null)
+                {
+                    return;
+                }
+                if (obj is LightControllerConfig lc)
+                {
+                    lc.Init();
+                }
+            }
+            catch (Exception)
+            {
+
+            }
+        }
         #endregion
 
         #region 螺丝供料器

+ 18 - 1
TeamAAS-VM/Views/SettingView.xaml

@@ -1519,7 +1519,14 @@
                                       Grid.Column="1"
                                       Margin="10,0"
                                       SelectedItem="{Binding SelectLightController.LightModel,Mode=TwoWay}"
-                                      ItemsSource="{ext:EnumBindingSource EnumType=coreLights:LightModel}" />
+                                      ItemsSource="{ext:EnumBindingSource EnumType=coreLights:LightModel}">
+                                <b:Interaction.Triggers>
+                                    <b:EventTrigger EventName="SelectionChanged">
+                                        <b:InvokeCommandAction Command="{Binding LightModelChangedCommand}"
+                                                               CommandParameter="{Binding SelectLightController}"/>
+                                    </b:EventTrigger>
+                                </b:Interaction.Triggers>
+                            </ComboBox>
 
                             <!-- Channel count -->
                             <TextBlock Text="{lex:Loc 通道数, Converter={StaticResource StringFormatConverter},ConverterParameter='{}{0}: '}"
@@ -1580,6 +1587,11 @@
                                                 <Setter Property="Visibility"
                                                         Value="Visible" />
                                             </DataTrigger>
+                                            <DataTrigger Binding="{Binding SelectLightController.LightModel}"
+                                                         Value="{x:Static coreLights:LightModel.KCS_KDC3_24V300W_8T}">
+                                                <Setter Property="Visibility"
+                                                        Value="Visible" />
+                                            </DataTrigger>
                                         </Style.Triggers>
                                     </Style>
                                 </GroupBox.Style>
@@ -1653,6 +1665,11 @@
                                                 <Setter Property="Visibility"
                                                         Value="Collapsed" />
                                             </DataTrigger>
+                                            <DataTrigger Binding="{Binding SelectLightController.LightModel}"
+                                                         Value="{x:Static coreLights:LightModel.KCS_KDC3_24V300W_8T}">
+                                                <Setter Property="Visibility"
+                                                        Value="Collapsed" />
+                                            </DataTrigger>
                                         </Style.Triggers>
                                     </Style>
                                 </GroupBox.Style>