C#仿CANoe设计面板PANL的设计思路

C#仿CANoe设计面板PANL的设计思路_第1张图片C#仿CANoe设计面板PANL的设计思路_第2张图片C#仿CANoe设计面板PANL的设计思路_第3张图片

using System;
using System.Windows.Forms;
using UTS_Link_CANoe_Bridge.VariableManagerEnhanced;

namespace UTS_Link_CANoe_Bridge
{
    public partial class VariableManagerEnhanced_UIDebug : Form
    {
        public VariableManagerEnhanced_UIDebug()
        {
            InitializeComponent();

            // 创建绑定管理器
            UTS_Link_CANoe_Bridge.VariableManagerEnhanced.BindingManager bindingManager = new UTS_Link_CANoe_Bridge.VariableManagerEnhanced.BindingManager();

            // 1. 注册绑定后自动建立双向同步:
            try
            {
                bindingManager.RegisterBinding(textBox1, 1, "ZUOYI::Debug", "TextBox", DataType.Double, PanlEventType.Variable);
                bindingManager.ActiveStateValue = 1;
                bindingManager.InactiveStateValue = 0;
                bindingManager.RegisterBinding(checkBox1, 1, "ZUOYI::Debug", "Combox", DataType.Int, PanlEventType.Variable);
                bindingManager.ActiveStateValue = 1;
                bindingManager.InactiveStateValue = 0;
                bindingManager.RegisterBinding(button1, 1, "ZUOYI::Debug", "buntton", DataType.Int, PanlEventType.Variable);

                bindingManager.RegisterBinding(textBox2, 1, "EPS_3", "TorsionBarTorque", DataType.Double, PanlEventType.Signal);
                bindingManager.ActiveStateValue = 1;
                bindingManager.InactiveStateValue = 0;
                bindingManager.RegisterBinding(checkBox2, 1, "EPS_3", "TorsionBarTorque", DataType.Double, PanlEventType.Signal);
                bindingManager.ActiveStateValue = 1;
                bindingManager.InactiveStateValue = 0;
                bindingManager.RegisterBinding(button2, 1, "EPS_3", "TorsionBarTorque", DataType.Double, PanlEventType.Signal);
                bindingManager.RegisterBinding(comboBox1, 1, "CDU_OBC_3", "OBC_WorkingMode", DataType.Double, PanlEventType.Signal);
                bindingManager.ActiveStateValue = 1;
                bindingManager.InactiveStateValue = 0;
                bindingManager.RegisterBinding(radioButton2, 1, "CDU_OBC_3", "OBC_WorkingMode", DataType.Double, PanlEventType.Signal);
                bindingManager.ActiveStateValue = 2;
                bindingManager.InactiveStateValue = 0;
                bindingManager.RegisterBinding(radioButton3, 1, "CDU_OBC_3", "OBC_WorkingMode", DataType.Double, PanlEventType.Signal);
                
            }
            catch (Exception ex)
            {
                CommonLog.LogStaticForm.ERROR_Log(ex.Message);
            }
            // 注册自定义操作
            //bindingManager.RegisterAction(btnCalculate, value => {
            //    Console.WriteLine($"计算按钮被点击: {value}");});

            // 3. 设置全局变量变化处理器(可选)
            bindingManager.SetGlobalVariableChangedHandler((path, name, value) =>
            {
                CommonLog.LogStaticForm.DEBUG_Log($"变量变化: {path}::{name} = {value}");
            });
        }
    }
}


using System;
using System.Collections.Generic;
using Vector.CANoe.Interop;
using System.Windows.Forms;

// 定义绑定类型枚举
public enum BindingType
{
    Variable,
    Signal,
    Message
}

// 绑定处理器接口
public interface IBindingHandler
{
    void Register(Control control, object source, string path, string name, DataType dataType);
    void Activate();
    void Deactivate();
    event Action DataChanged;
}

// 变量绑定处理器
public class VariableBindingHandler : IBindingHandler
{
    // 实现变量绑定逻辑(继承自原BindingManager)
    // ... 原有RegisterBinding逻辑迁移至此 ...

    public event Action DataChanged;
    
    protected void OnDataChanged() => DataChanged?.Invoke(this, EventArgs.Empty);
}

// 报文绑定处理器(新增)
public class MessageBindingHandler : IBindingHandler
{
    private Application _canoeApp;
    private int _channel;
    private uint _messageId;

    public MessageBindingHandler(Application canoeApp)
    {
        _canoeApp = canoeApp;
    }

    public void Register(Control control, object source, string path, string name, DataType dataType)
    {
        // 解析CAN通道和报文ID
        if (int.TryParse(path, out _channel) && 
            uint.TryParse(name, out _messageId))
        {
            // 订阅CAN帧事件
            ((MeasurementEvents_Event)_canoeApp.Measurement).OnCANFrame += HandleCANFrame;
        }
    }

    private void HandleCANFrame(int channel, CANFrame frame)
    {
        if (channel == _channel && frame.ID == _messageId)
        {
            // 触发数据变更事件
            OnDataChanged();
        }
    }

    public void Activate() { /* 激活逻辑 */ }
    public void Deactivate() { /* 停用逻辑 */ }
    public event Action DataChanged;
}

// 绑定工厂
public static class BindingHandlerFactory
{
    public static IBindingHandler CreateHandler(BindingType type, Application canoeApp)
    {
        return type switch
        {
            BindingType.Variable => new VariableBindingHandler(),
            BindingType.Signal => new SignalBindingHandler(),
            BindingType.Message => new MessageBindingHandler(canoeApp),
            _ => throw new NotImplementedException()
        };
    }
}

// 增强型绑定管理器
public class EnhancedBindingManager
{
    private readonly Dictionary _bindings = new();
    private readonly Application _canoeApp;

    public EnhancedBindingManager(Application canoeApp)
    {
        _canoeApp = canoeApp;
    }

    public void RegisterBinding(Control control, BindingType type, 
        string sourcePath, string name, DataType dataType)
    {
        try
        {
            var handler = BindingHandlerFactory.CreateHandler(type, _canoeApp);
            handler.DataChanged += (s, e) => 
            {
                // 双向同步逻辑
                SyncToControl(control, s, dataType);
                SyncToCANoe(control, s, sourcePath, name, dataType);
            };

            handler.Register(control, null, sourcePath, name, dataType);
            handler.Activate();
            _bindings.Add(control, handler);
        }
        catch (Exception ex)
        {
            CommonLog.LogStaticForm.ERROR_Log($"绑定失败: {ex.Message}");
        }
    }

    private void SyncToControl(Control control, object sender, DataType dataType)
    {
        // 数据转换和控件更新逻辑
        // ... 实现数据类型转换和控件值更新 ...
    }

    private void SyncToCANoe(Control control, object sender, 
        string sourcePath, string name, DataType dataType)
    {
        // 将控件值写回CANoe
        // ... 实现CANoe变量/信号更新逻辑 ...
    }
}

// 使用示例
public partial class MainForm : Form
{
    private EnhancedBindingManager _bindingManager;

    public MainForm()
    {
        InitializeComponent();
        InitializeCANoe();
        InitializeBindings();
    }

    private void InitializeCANoe()
    {
        var canoeApp = new Application();
        canoeApp.Open(@"C:\Path\To\Config.cfg");
        _bindingManager = new EnhancedBindingManager(canoeApp);
    }

    private void InitializeBindings()
    {
        // 变量绑定示例
        _bindingManager.RegisterBinding(textBox1, BindingType.Variable,
            "ZUOYI::Debug", "TextBox", DataType.Double);

        // 报文绑定示例(监控CAN通道1的0x123报文)
        _bindingManager.RegisterBinding(comboBox1, BindingType.Message,
            "1", "123", DataType.Hex);

        // 信号绑定示例
        _bindingManager.RegisterBinding(checkBox1, BindingType.Signal,
            "EPS_3", "TorsionBarTorque", DataType.Double);
    }
}

// 日志记录扩展
public static class CommonLog
{
    public static class LogStaticForm
    {
        public static void DEBUG_Log(string message) 
            => File.AppendAllText("debug.log", $"{DateTime.Now}: {message}\n");
            
        public static void ERROR_Log(string message)
            => File.AppendAllText("error.log", $"{DateTime.Now}: ERROR - {message}\n");
    }
}

  1. 工厂模式
    • 通过BindingHandlerFactory创建不同类型的绑定处理器
    • 支持新增绑定类型扩展(如新增LIN消息处理)
  2. 模块化设计
    • 分离关注点:每个处理器负责特定类型的绑定
    • 统一的IBindingHandler接口保证处理一致性
  3. 报文监控增强
    • 专用MessageBindingHandler处理CAN帧事件
    • 支持通道和ID过滤(示例中监控1通道0x123报文)
  4. 双向同步
    • DataChanged事件触发时同时更新控件和CANoe
    • 数据类型转换逻辑集中管理
  5. 错误处理
    • 统一的异常捕获和日志记录
    • 类型安全的数据处理(通过DataType枚举)

你可能感兴趣的:(C#,c#,单片机,stm32)