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