From 559890c482f5973f06aafdfec9550fee5ba3c7f2 Mon Sep 17 00:00:00 2001
From: wenxiangchao <wenxiangchao@ihengxin.com.cn>
Date: 星期一, 09 十一月 2026 17:02:15 +0800
Subject: [PATCH] feat: CAN 模拟器 TCP 化 + 多设备并发调试 + 后台生命周期管理
---
Plugin.TestResult/Chart.xaml.cs | 293 +++++++++++++++++++++++++++++++++++++---------------------
1 files changed, 187 insertions(+), 106 deletions(-)
diff --git a/Plugin.TestResult/Chart.xaml.cs b/Plugin.TestResult/Chart.xaml.cs
index 988f2a2..ffd5c46 100644
--- a/Plugin.TestResult/Chart.xaml.cs
+++ b/Plugin.TestResult/Chart.xaml.cs
@@ -1,12 +1,17 @@
-锘縰sing Plugin.TestResult_WPF.Model;
+锘縰sing log4net.Repository.Hierarchy;
+using Plugin.TestResult_WPF.Model;
using ScottPlot;
using ScottPlot.Plottables;
using ScottPlot.TickGenerators;
using System;
using System.Collections.Generic;
+using System.Data.SqlTypes;
using System.Linq;
+using System.Text;
using System.Timers;
using System.Windows.Controls;
+using System.Windows.Documents;
+using System.Xml.Linq;
namespace Plugin.TestResult_WPF
{
@@ -26,7 +31,8 @@
private readonly Dictionary<string, Queue<long>> xValues;
private readonly Dictionary<string, Queue<double>> yValues;
- readonly DataLogger singleLogger;
+ private readonly Dictionary<DataLogger, double> maxValue = new Dictionary<DataLogger, double>();
+ private readonly Dictionary<DataLogger, double> minValue = new Dictionary<DataLogger, double>();
private readonly string title;
private readonly bool multi;
@@ -37,6 +43,8 @@
private float fontSize = -1;
private Timer timer;
+
+ private LinePlot[] childrenPlot;
private readonly Dictionary<string, DataLogger> loggers = new Dictionary<string, DataLogger>();
@@ -49,12 +57,14 @@
return logger;
}
- public Chart(string title, bool multi, int maxSize, int refreshInterval)
+ public Chart(string title, bool multi, float titleSize)
{
+ BaseConfig config = new BaseConfig();
this.title = title;
- this.maxSize = maxSize;
+ this.maxSize = config.MaxSize;
this.multi = multi;
- this.refreshInterval = refreshInterval;
+ this.refreshInterval = config.RefreshInterval;
+ this.fontSize = titleSize;
InitializeComponent();
@@ -66,22 +76,19 @@
var legend = chart.Plot.ShowLegend(Edge.Top);
legend.Alignment = Alignment.UpperLeft;
legend.Padding = new PixelPadding(0);
-
-
- chart.Plot.Axes.Left.TickLabelStyle.FontSize = 12;
- chart.Plot.Axes.Bottom.TickLabelStyle.FontSize = 12;
- chart.Plot.Axes.Left.Label.FontSize = 15;
}
else
{
- singleLogger = InitLogger();
- singleLogger.Color = Colors.Red;
xData = new Queue<long>(maxSize);
yData = new Queue<double>(maxSize);
- chart.Plot.Axes.Left.TickLabelStyle.FontSize = (float)FontSizeConverter.CountFontSize(12, ActualHeight, 92);
- chart.Plot.Axes.Bottom.TickLabelStyle.FontSize = (float)FontSizeConverter.CountFontSize(12, ActualHeight, 92);
- chart.Plot.Axes.Left.Label.FontSize = (float)FontSizeConverter.CountFontSize(15, ActualHeight, 92);
}
+
+ chart.Plot.Axes.Left.TickLabelStyle.FontSize = 12;
+ chart.Plot.Axes.Left.Label.FontSize = 15;
+ chart.Plot.Axes.Bottom.TickLabelStyle.FontSize = 12;
+ chart.Plot.Axes.Bottom.TickLabelStyle.IsVisible = false;
+ chart.Plot.Axes.Bottom.MajorTickStyle.Color = Colors.Transparent;
+ chart.Plot.Axes.Bottom.MinorTickStyle.Color = Colors.Transparent;
/// 绂佺敤榧犳爣
chart.UserInputProcessor.Disable();
@@ -172,40 +179,36 @@
timer.Elapsed += Timer_Elapsed;
}
- public Chart(string title, bool multi, float titleSize)
+ public Chart(string title, string[] serials, float titleSize)
{
BaseConfig config = new BaseConfig();
this.title = title;
- this.multi = multi;
+ this.multi = true;
this.maxSize = config.MaxSize;
this.refreshInterval = config.RefreshInterval;
fontSize = titleSize;
+ childrenPlot = new LinePlot[serials.Length];
+
InitializeComponent();
- if (this.multi)
- {
- xValues = new Dictionary<string, Queue<long>>();
- yValues = new Dictionary<string, Queue<double>>();
- //chart.Plot.ShowLegend(Alignment.UpperLeft, Orientation.Vertical);
- var legend = chart.Plot.ShowLegend(Edge.Top);
- legend.Alignment = Alignment.UpperLeft;
- legend.Padding = new PixelPadding(0);
+ xValues = new Dictionary<string, Queue<long>>();
+ yValues = new Dictionary<string, Queue<double>>();
+ //chart.Plot.ShowLegend(Alignment.UpperLeft, Orientation.Vertical);
+ var panel = chart.Plot.ShowLegend(Edge.Top);
+ panel.Alignment = Alignment.UpperLeft;
+ panel.Padding = new PixelPadding(0);
- chart.Plot.Axes.Left.TickLabelStyle.FontSize = titleSize - 3;
- chart.Plot.Axes.Bottom.TickLabelStyle.FontSize = titleSize - 3;
- chart.Plot.Axes.Left.Label.FontSize = titleSize;
- }
- else
- {
- singleLogger = InitLogger();
- singleLogger.Color = Colors.Red;
- xData = new Queue<long>(maxSize);
- yData = new Queue<double>(maxSize);
- chart.Plot.Axes.Left.TickLabelStyle.FontSize = titleSize - 3;
- chart.Plot.Axes.Bottom.TickLabelStyle.FontSize = titleSize - 3;
- chart.Plot.Axes.Left.Label.FontSize = titleSize;
- }
+ chart.Plot.Axes.Left.TickLabelStyle.FontSize = titleSize - 3;
+ chart.Plot.Axes.Left.Label.FontSize = titleSize;
+
+ chart.Plot.Axes.Right.TickLabelStyle.FontSize = titleSize - 3;
+ chart.Plot.Axes.Right.Label.FontSize = titleSize;
+
+ chart.Plot.Axes.Bottom.TickLabelStyle.FontSize = titleSize - 3;
+ chart.Plot.Axes.Bottom.TickLabelStyle.IsVisible = false;
+ chart.Plot.Axes.Bottom.MajorTickStyle.Color = Colors.Transparent;
+ chart.Plot.Axes.Bottom.MinorTickStyle.Color = Colors.Transparent;
/// 绂佺敤榧犳爣
chart.UserInputProcessor.Disable();
@@ -216,6 +219,8 @@
return TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)).AddMilliseconds(position).ToString("HH:mm:ss");
return "";
}
+ chart.Plot.HideLegend();
+
EvenlySpacedMinorTickGenerator minorTickGen = new EvenlySpacedMinorTickGenerator(10);
NumericAutomatic myTickGenerator = new NumericAutomatic()
{
@@ -223,12 +228,28 @@
MinorTickGenerator = minorTickGen
};
chart.Plot.Axes.Bottom.TickGenerator = myTickGenerator;
- if (!string.IsNullOrEmpty(this.title))
+ if (!string.IsNullOrEmpty(serials[0]))
{
- chart.Plot.Axes.Left.Label.Text = this.title;
+ var newLine = chart.Plot.Add.Line(Coordinates.NaN, Coordinates.NaN);
+ newLine.Axes.YAxis = chart.Plot.Axes.Left;
+ newLine.Axes.XAxis = chart.Plot.Axes.Bottom;
+
+ childrenPlot[0] = newLine;
+ chart.Plot.Axes.Left.Label.Text = serials[0];
chart.Plot.Axes.Left.Label.Bold = false;
chart.Plot.Font.Automatic();
- //RefreshData();
+ }
+
+ if (!string.IsNullOrEmpty(serials[1]))
+ {
+ var newLine = chart.Plot.Add.Line(Coordinates.NaN, Coordinates.NaN);
+ newLine.Axes.YAxis = chart.Plot.Axes.Right;
+ newLine.Axes.XAxis = chart.Plot.Axes.Bottom;
+
+ childrenPlot[1] = newLine;
+ chart.Plot.Axes.Right.Label.Text = serials[1];
+ chart.Plot.Axes.Right.Label.Bold = false;
+ chart.Plot.Font.Automatic();
}
timer = new Timer();
@@ -244,12 +265,30 @@
}
}
+ private DataLogger GetLogger(string name, out bool isNew, string legend = null)
+ {
+ isNew = false;
+ if (!loggers.ContainsKey(name))
+ {
+ var logger = InitLogger();
+ if (legend != null) logger.LegendText = name;
+ loggers.Add(name, logger);
+ isNew = true;
+ }
+ return loggers[name];
+ }
+
public void RefreshData()
{
bool flag = timer.Enabled;
try
{
timer.Enabled = false;
+ foreach (var logger in loggers.Values)
+ {
+ logger.ViewFull();
+ }
+
/// 闄愬埗y杞�
if (maxYValue > -1)
{
@@ -271,47 +310,15 @@
{
this.maxYValue = -1;
this.minYValue = double.MaxValue;
- if (this.multi)
+ foreach (var name in loggers.Keys)
{
- foreach (var name in loggers.Keys)
- {
- loggers[name].Clear();
- xValues[name].Clear();
- yValues[name].Clear();
- }
- chart.Refresh();
- return;
+ loggers[name].Clear();
+ xValues?[name]?.Clear();
+ yValues?[name]?.Clear();
}
- singleLogger.Clear();
- xData.Clear();
- yData.Clear();
+ xData?.Clear();
+ yData?.Clear();
chart.Refresh();
- }
-
- public void AddData(double y)
- {
- if (this.multi)
- {
- return;
- }
-
- this.maxYValue = y > maxYValue ? y : maxYValue;
- this.minYValue = y < minYValue ? y : minYValue;
-
- var nowTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
- InsertData(xData, yData, nowTime, y);
-
- singleLogger.Add(new Coordinates(nowTime, y));
- //Streamer1.Add(new Coordinates(DateTimeOffset.Now.ToUnixTimeSeconds(), y));
-
- chart.Plot.GetPlottables<Marker>()
- .ToList()
- .ForEach(m => m.X -= 1);
- chart.Plot.GetPlottables<Marker>()
- .Where(m => m.X < 0)
- .ToList()
- .ForEach(m => chart.Plot.Remove(m));
- //RefreshData();
}
public List<double> GetSingleData()
@@ -339,38 +346,21 @@
yAxis.Enqueue(y);
}
- public void AddData(string name, double y)
+ public void AddData(double y)
{
- if (!this.multi)
+ if (this.multi)
{
return;
}
-
+ var commonName = "Single";
this.maxYValue = y > maxYValue ? y : maxYValue;
this.minYValue = y < minYValue ? y : minYValue;
- if (loggers.ContainsKey(name))
- {
- var logger = loggers[name];
- var x = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
- logger.Add(new Coordinates(x, y));
- InsertData(xValues[name], yValues[name], x, y);
- }
- else
- {
- var logger = InitLogger();
- logger.LegendText = name;
- loggers.Add(name, logger);
- var xAxis = new Queue<long>(maxSize);
- var yAxis = new Queue<double>(maxSize);
-
- xValues.Add(name, xAxis);
- yValues.Add(name, yAxis);
-
- var x = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
- logger.Add(new Coordinates(x, y));
- InsertData(xAxis, yAxis, x, y);
- }
+ var nowTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+ DataLogger singleLogger = GetLogger(commonName, out _);
+ singleLogger.Color = Colors.Red;
+ InsertData(xData, yData, nowTime, y);
+ singleLogger.Add(new Coordinates(nowTime, y));
//Streamer1.Add(new Coordinates(DateTimeOffset.Now.ToUnixTimeSeconds(), y));
@@ -381,7 +371,98 @@
.Where(m => m.X < 0)
.ToList()
.ForEach(m => chart.Plot.Remove(m));
- //RefreshData();
+ }
+
+ public void AddData(string name, double y)
+ {
+ if (!this.multi)
+ {
+ return;
+ }
+
+ this.maxYValue = y > maxYValue ? y : maxYValue;
+ this.minYValue = y < minYValue ? y : minYValue;
+ DataLogger logger = null;
+ if (loggers.ContainsKey(name))
+ {
+ logger = loggers[name];
+ }
+ else
+ {
+ logger = InitLogger();
+ logger.LegendText = name;
+ loggers.Add(name, logger);
+ var xAxis = new Queue<long>(maxSize);
+ var yAxis = new Queue<double>(maxSize);
+
+ xValues.Add(name, xAxis);
+ yValues.Add(name, yAxis);
+ }
+
+ var x = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+ logger.Add(new Coordinates(x, y));
+ InsertData(xValues[name], yValues[name], x, y);
+
+ //Streamer1.Add(new Coordinates(DateTimeOffset.Now.ToUnixTimeSeconds(), y));
+
+ chart.Plot.GetPlottables<Marker>()
+ .ToList()
+ .ForEach(m => m.X -= 1);
+ chart.Plot.GetPlottables<Marker>()
+ .Where(m => m.X < 0)
+ .ToList()
+ .ForEach(m => chart.Plot.Remove(m));
+ }
+
+ public void AddData(int serials, string name, double y)
+ {
+ if (!this.multi)
+ {
+ return;
+ }
+ var plot = childrenPlot[serials];
+
+ DataLogger logger = GetLogger(name, out bool isNew, name);
+ this.maxYValue = y > maxYValue ? y : maxYValue;
+ this.minYValue = y < minYValue ? y : minYValue;
+
+ logger.Axes.YAxis = plot.Axes.YAxis;
+ logger.Axes.XAxis = plot.Axes.XAxis;
+ if (name == "姘寸娓╁害")
+ {
+ logger.Color = Colors.Red;
+ }
+ else if (name == "鍥炴按娓╁害")
+ {
+ logger.Color = Colors.Blue;
+ }
+ else
+ {
+ logger.Color = Colors.Green;
+ }
+
+ if (isNew)
+ {
+ var xAxis = new Queue<long>(maxSize);
+ var yAxis = new Queue<double>(maxSize);
+
+ xValues.Add(name, xAxis);
+ yValues.Add(name, yAxis);
+ }
+
+ var x = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+ logger.Add(new Coordinates(x, y));
+ InsertData(xValues[name], yValues[name], x, y);
+
+ //Streamer1.Add(new Coordinates(DateTimeOffset.Now.ToUnixTimeSeconds(), y));
+
+ chart.Plot.GetPlottables<Marker>()
+ .ToList()
+ .ForEach(m => m.X -= 1);
+ chart.Plot.GetPlottables<Marker>()
+ .Where(m => m.X < 0)
+ .ToList()
+ .ForEach(m => chart.Plot.Remove(m));
}
private void UserControl_Loaded(object sender, System.Windows.RoutedEventArgs e)
--
Gitblit v1.9.1