From d1b72117058f1131046b6aa3add8e3ccfae033d8 Mon Sep 17 00:00:00 2001
From: wenxiangchao <wenxiangchao@ihengxin.com.cn>
Date: 星期一, 09 十一月 2026 10:36:07 +0800
Subject: [PATCH] docs: CAN 模拟器独立 TCP 服务进程设计规格(统一 CanDeviceDriver + 双工推送协议)

---
 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