Files
WoodDrone/Graph/WindowsFormsApp2/MainForm.cs
Dana Markova 0de214c9a1 first commit
2025-07-28 13:21:36 +03:00

217 lines
7.0 KiB
C#

using System;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.IO;
using System.Diagnostics;
using System.Windows.Forms.DataVisualization.Charting;
using System.Runtime.InteropServices;
using System.Net;
namespace WindowsFormsApp1
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
foreach (var s in chart_Graph.Series) s.XValueType = ChartValueType.DateTime;
chart_Graph.ChartAreas[0].AxisX.LabelStyle.Format = "mm:ss";
chart_Graph.ChartAreas[0].AxisX.Minimum = DateTime.Now.ToOADate();
chart_Graph.ChartAreas[0].AxisX.Maximum = DateTime.Now.AddSeconds(trackBar_GraphX_Down.Value).ToOADate();
chart_Graph.ChartAreas[0].AxisX.IntervalAutoMode = IntervalAutoMode.FixedCount;
chart_Graph.ChartAreas[0].AxisX.Interval = (new DateTime(1, 1, 1, 0, 0, 1)).ToOADate();
}
private const int RecvCount = 4;
private byte[] RecvData = new byte[RecvCount];
private int RecvSize = 0;
private enum RecvModeEnum : byte { Begin, Data, Done };
private int TimerStop = 0;
private DateTime GraphLast = DateTime.Now;
private RecvModeEnum RecvMode;
private void DrawGraph(byte[] data, int from, int size)
{
if (checkBox_Track.Checked)
{
chart_Graph.ChartAreas[0].AxisX.Minimum = DateTime.Now.AddSeconds(-trackBar_GraphX_Down.Value).ToOADate();
chart_Graph.ChartAreas[0].AxisX.Maximum = DateTime.Now.ToOADate();
}
else
{
TimeSpan shift = DateTime.Now.Subtract(GraphLast);
if (shift.TotalSeconds > trackBar_GraphX_Down.Value)
{
GraphLast = DateTime.Now;
for (int a = 0; a < chart_Graph.Series.Count; a++) chart_Graph.Series[a].Points.Clear();
chart_Graph.ChartAreas[0].AxisX.Minimum = DateTime.Now.ToOADate();
chart_Graph.ChartAreas[0].AxisX.Maximum = DateTime.Now.AddSeconds(trackBar_GraphX_Down.Value).ToOADate();
}
}
float[] lines = new float[1];
Buffer.BlockCopy(data, from, lines, 0, size);
chart_Graph.Series[0].Points.AddXY(DateTime.Now, lines[0]);
if (checkBox_Track.Checked)
{
while (true)
{
if ((DateTime.Now - DateTime.FromOADate(chart_Graph.Series[0].Points[0].XValue)).TotalSeconds > trackBar_GraphX_Down.Value + 1)
chart_Graph.Series[0].Points.RemoveAt(0);
else break;
}
}
}
private void button_Connect_Click(object sender, EventArgs e)
{
if (button_Connect.Text == "Connect")
{
try { serialPort_COM.PortName = comboBox_Port.Text; } catch { MessageBox.Show("Error to set port", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; }
try
{
serialPort_COM.Open();
serialPort_COM.DiscardInBuffer();
}
catch { MessageBox.Show("Error to connect", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; }
timer_Tick.Enabled = true;
button_Connect.Text = "Disonnect";
}
else
{
serialPort_COM.Close();
timer_Tick.Enabled = false;
button_Connect.Text = "Connect";
}
}
private void timer_Tick_Tick(object sender, EventArgs e)
{
switch (RecvMode)
{
case RecvModeEnum.Begin:
{
TimerStop = 20;
byte[] recv = new byte[1];
int len;
try { len = serialPort_COM.Read(recv, 0, 1); } catch { break; }
if (recv[0] == 'Z')
{
RecvMode = RecvModeEnum.Data;
}
break;
}
case RecvModeEnum.Data:
{
int len;
try { len = serialPort_COM.Read(RecvData, RecvSize, RecvData.Length - RecvSize); } catch { break; }
RecvSize += len;
if (RecvSize < RecvData.Length) break;
RecvSize = 0;
DrawGraph(RecvData, 0, RecvData.Length);
RecvMode = RecvModeEnum.Begin;
break;
}
default:
{
RecvMode = RecvModeEnum.Begin;
break;
}
}
TimerStop--;
if (TimerStop <= 0)
{
RecvMode = RecvModeEnum.Begin;
}
}
private void comboBox_Port_DropDown(object sender, EventArgs e)
{
comboBox_Port.Items.Clear();
foreach (string p in SerialPort.GetPortNames()) comboBox_Port.Items.Add(p);
}
private void numericUpDown_Min_ValueChanged(object sender, EventArgs e)
{
trackBar_GraphX_Down.Maximum = (int)numericUpDown_Min.Value;
if (sender == numericUpDown_Min) trackBar_GraphX_Down.Value = trackBar_GraphX_Down.Maximum;
else foreach (var s in chart_Graph.Series) s.Points.Clear();
GraphLast = DateTime.Now;
chart_Graph.ChartAreas[0].AxisX.Minimum = DateTime.Now.ToOADate();
chart_Graph.ChartAreas[0].AxisX.Maximum = DateTime.Now.AddSeconds(trackBar_GraphX_Down.Value).ToOADate();
chart_Graph.ChartAreas[0].AxisX.Interval = (new DateTime(1, 1, 1, 0, 0, 0).AddSeconds(((double)trackBar_GraphX_Down.Value) / 10)).ToOADate();
if (trackBar_GraphX_Down.Value < 10) chart_Graph.ChartAreas[0].AxisX.LabelStyle.Format = "mm:ss.f";
else chart_Graph.ChartAreas[0].AxisX.LabelStyle.Format = "mm:ss";
}
private void numericUpDown_Graph_MaxY_ValueChanged(object sender, EventArgs e)
{
chart_Graph.ChartAreas[0].AxisY.Minimum = (double)numericUpDown_Graph_MinY.Value;
chart_Graph.ChartAreas[0].AxisY.Maximum = (double)numericUpDown_Graph_MaxY.Value;
trackBar_GraphY_Left.Maximum = (int)numericUpDown_Graph_MaxY.Value;
trackBar_GraphY_Left.Minimum = (int)numericUpDown_Graph_MinY.Value;
trackBar_GraphY_Right.Maximum = (int)numericUpDown_Graph_MaxY.Value;
trackBar_GraphY_Right.Minimum = (int)numericUpDown_Graph_MinY.Value;
}
private void checkBox_AutoY_CheckedChanged(object sender, EventArgs e)
{
if (checkBox_AutoY.Checked)
{
chart_Graph.ChartAreas[0].AxisY.Minimum = double.NaN;
chart_Graph.ChartAreas[0].AxisY.Maximum = double.NaN;
numericUpDown_Graph_MinY.Enabled = false;
numericUpDown_Graph_MaxY.Enabled = false;
panel_GraphY.Enabled = false;
}
else
{
numericUpDown_Graph_MaxY_ValueChanged(null, null);
numericUpDown_Graph_MinY.Enabled = true;
numericUpDown_Graph_MaxY.Enabled = true;
panel_GraphY.Enabled = true;
trackBar_GraphY_Left.Value = trackBar_GraphY_Left.Minimum;
trackBar_GraphY_Right.Value = trackBar_GraphY_Right.Maximum;
}
}
private void trackBar_GraphY_Left_Scroll(object sender, EventArgs e)
{
int min = trackBar_GraphY_Left.Value;
int max = trackBar_GraphY_Right.Value;
if (min > max)
{
int sub = min;
min = max;
max = sub;
}
if (max == min) max += 1;
chart_Graph.ChartAreas[0].AxisY.Minimum = min;
chart_Graph.ChartAreas[0].AxisY.Maximum = max;
}
private void button_Update_Click(object sender, EventArgs e)
{
}
}
}