Добавьте файлы проекта.

This commit is contained in:
2025-03-26 17:37:13 +11:00
parent fc3e7c8026
commit 5bd17f261b
23 changed files with 2653 additions and 0 deletions

25
TelemetryIO.sln Normal file
View File

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.6.33712.159
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TelemetryIO", "TelemetryIO\TelemetryIO.csproj", "{DDC6B03D-9702-4DF4-82AC-D310ACA9C549}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{DDC6B03D-9702-4DF4-82AC-D310ACA9C549}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DDC6B03D-9702-4DF4-82AC-D310ACA9C549}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DDC6B03D-9702-4DF4-82AC-D310ACA9C549}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DDC6B03D-9702-4DF4-82AC-D310ACA9C549}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {B159E8CE-F43C-4A4E-83AA-269FA4C8AA60}
EndGlobalSection
EndGlobal

6
TelemetryIO/App.config Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
</configuration>

59
TelemetryIO/DataSlots.cs Normal file
View File

@ -0,0 +1,59 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TelemetryIO
{
internal class DataSlots
{
static private int[] raw_imu = new int[6];
public DataSlots() { }
static public void setSlot(int slot, byte[] data, int offset, int len)
{
switch (slot)
{
case 0:
setSlot0(data, offset, len);
break;
case 1:
setSlot0(data, offset, len);
break;
}
}
static public void setSlot0(byte[]data, int offset, int len)
{
for(int i = 0; i < (int)(len/4); i++)
{
byte[]bs = new byte[4];
Array.Copy(data, i * 4, bs, 0, 4);
raw_imu[(int)(offset/4)] = bytes_to_int(bs, 0);
}
}
static public int[] getSlot0()
{
return raw_imu;
}
static public int bytes_to_int(byte[] bytes, int startPos)
{
byte[] bs = new byte[4];
Array.Copy(bytes, startPos, bs, 0, 4);
int ret = (int)(bs[0] | (bs[1] << 8) | (bs[2] << 16) | (bs[3] << 24));
return ret;
}
static public uint bytes_to_uint(byte[] bytes, int startPos)
{
byte[] bs = new byte[4];
Array.Copy(bytes, startPos, bs, 0, 4);
uint ret = (uint)(bs[0] | (bs[1] << 8) | (bs[2] << 16) | (bs[3] << 24));
return ret;
}
}
}

253
TelemetryIO/MainForm.Designer.cs generated Normal file
View File

@ -0,0 +1,253 @@
namespace TelemetryIO
{
partial class MainForm
{
/// <summary>
/// Обязательная переменная конструктора.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Освободить все используемые ресурсы.
/// </summary>
/// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Код, автоматически созданный конструктором форм Windows
/// <summary>
/// Требуемый метод для поддержки конструктора — не изменяйте
/// содержимое этого метода с помощью редактора кода.
/// </summary>
private void InitializeComponent()
{
this.PortSelector = new System.Windows.Forms.ComboBox();
this.label1 = new System.Windows.Forms.Label();
this.Send_btn = new System.Windows.Forms.Button();
this.Connect_btn = new System.Windows.Forms.Button();
this.InfoLabel = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.SpeedSelector = new System.Windows.Forms.ComboBox();
this.SendContinuous_btn = new System.Windows.Forms.Button();
this.IMU_label = new System.Windows.Forms.Label();
this.TestWrite_btn = new System.Windows.Forms.Button();
this.tabControl1 = new System.Windows.Forms.TabControl();
this.tabPage1 = new System.Windows.Forms.TabPage();
this.tabPage2 = new System.Windows.Forms.TabPage();
this.ratePID_control = new TelemetryIO.RatePID();
this.monitorVars1 = new TelemetryIO.MonitorVars();
this.name_label = new System.Windows.Forms.Label();
this.tabControl1.SuspendLayout();
this.tabPage1.SuspendLayout();
this.tabPage2.SuspendLayout();
this.SuspendLayout();
//
// PortSelector
//
this.PortSelector.FormattingEnabled = true;
this.PortSelector.Location = new System.Drawing.Point(63, 12);
this.PortSelector.Name = "PortSelector";
this.PortSelector.Size = new System.Drawing.Size(121, 21);
this.PortSelector.TabIndex = 0;
this.PortSelector.MouseDown += new System.Windows.Forms.MouseEventHandler(this.PortSelector_RefreshItems);
//
// label1
//
this.label1.AutoSize = true;
this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.label1.Location = new System.Drawing.Point(16, 14);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(41, 17);
this.label1.TabIndex = 1;
this.label1.Text = "Порт";
//
// Send_btn
//
this.Send_btn.Location = new System.Drawing.Point(118, 57);
this.Send_btn.Name = "Send_btn";
this.Send_btn.Size = new System.Drawing.Size(66, 21);
this.Send_btn.TabIndex = 2;
this.Send_btn.Text = "Send";
this.Send_btn.UseVisualStyleBackColor = true;
this.Send_btn.Click += new System.EventHandler(this.Send_btn_Click);
//
// Connect_btn
//
this.Connect_btn.Location = new System.Drawing.Point(19, 57);
this.Connect_btn.Name = "Connect_btn";
this.Connect_btn.Size = new System.Drawing.Size(79, 21);
this.Connect_btn.TabIndex = 3;
this.Connect_btn.Text = "Подключить";
this.Connect_btn.UseVisualStyleBackColor = true;
this.Connect_btn.Click += new System.EventHandler(this.Connect_btn_Click);
//
// InfoLabel
//
this.InfoLabel.Location = new System.Drawing.Point(12, 793);
this.InfoLabel.Name = "InfoLabel";
this.InfoLabel.Size = new System.Drawing.Size(1240, 18);
this.InfoLabel.TabIndex = 4;
this.InfoLabel.Text = "Ok";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.label2.Location = new System.Drawing.Point(208, 14);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(69, 17);
this.label2.TabIndex = 6;
this.label2.Text = "Скорость";
//
// SpeedSelector
//
this.SpeedSelector.FormattingEnabled = true;
this.SpeedSelector.Location = new System.Drawing.Point(283, 12);
this.SpeedSelector.Name = "SpeedSelector";
this.SpeedSelector.Size = new System.Drawing.Size(121, 21);
this.SpeedSelector.TabIndex = 5;
//
// SendContinuous_btn
//
this.SendContinuous_btn.Location = new System.Drawing.Point(190, 57);
this.SendContinuous_btn.Name = "SendContinuous_btn";
this.SendContinuous_btn.Size = new System.Drawing.Size(109, 21);
this.SendContinuous_btn.TabIndex = 7;
this.SendContinuous_btn.Text = "Send_Continuous";
this.SendContinuous_btn.UseVisualStyleBackColor = true;
this.SendContinuous_btn.Click += new System.EventHandler(this.SendContinuous_btn_Click);
//
// IMU_label
//
this.IMU_label.Location = new System.Drawing.Point(496, 16);
this.IMU_label.Name = "IMU_label";
this.IMU_label.Size = new System.Drawing.Size(208, 19);
this.IMU_label.TabIndex = 8;
this.IMU_label.Text = "label3";
//
// TestWrite_btn
//
this.TestWrite_btn.Location = new System.Drawing.Point(318, 56);
this.TestWrite_btn.Name = "TestWrite_btn";
this.TestWrite_btn.Size = new System.Drawing.Size(75, 23);
this.TestWrite_btn.TabIndex = 9;
this.TestWrite_btn.Text = "TestWrite";
this.TestWrite_btn.UseVisualStyleBackColor = true;
this.TestWrite_btn.Click += new System.EventHandler(this.TestWrite_btn_Click);
//
// tabControl1
//
this.tabControl1.Alignment = System.Windows.Forms.TabAlignment.Bottom;
this.tabControl1.Controls.Add(this.tabPage1);
this.tabControl1.Controls.Add(this.tabPage2);
this.tabControl1.Location = new System.Drawing.Point(12, 110);
this.tabControl1.Multiline = true;
this.tabControl1.Name = "tabControl1";
this.tabControl1.SelectedIndex = 0;
this.tabControl1.Size = new System.Drawing.Size(1339, 680);
this.tabControl1.TabIndex = 10;
//
// tabPage1
//
this.tabPage1.Controls.Add(this.ratePID_control);
this.tabPage1.Location = new System.Drawing.Point(4, 4);
this.tabPage1.Name = "tabPage1";
this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
this.tabPage1.Size = new System.Drawing.Size(1331, 654);
this.tabPage1.TabIndex = 0;
this.tabPage1.Text = "PIDs";
this.tabPage1.UseVisualStyleBackColor = true;
//
// tabPage2
//
this.tabPage2.Controls.Add(this.monitorVars1);
this.tabPage2.Location = new System.Drawing.Point(4, 4);
this.tabPage2.Name = "tabPage2";
this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
this.tabPage2.Size = new System.Drawing.Size(1331, 654);
this.tabPage2.TabIndex = 1;
this.tabPage2.Text = "Monitor";
this.tabPage2.UseVisualStyleBackColor = true;
//
// ratePID_control
//
this.ratePID_control.BackColor = System.Drawing.Color.AntiqueWhite;
this.ratePID_control.bottom_label = null;
this.ratePID_control.Location = new System.Drawing.Point(6, 6);
this.ratePID_control.Name = "ratePID_control";
this.ratePID_control.serial = null;
this.ratePID_control.Size = new System.Drawing.Size(1240, 600);
this.ratePID_control.TabIndex = 11;
//
// monitorVars1
//
this.monitorVars1.Location = new System.Drawing.Point(6, 6);
this.monitorVars1.Name = "monitorVars1";
this.monitorVars1.serial = null;
this.monitorVars1.Size = new System.Drawing.Size(1200, 600);
this.monitorVars1.TabIndex = 0;
//
// name_label
//
this.name_label.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.name_label.Location = new System.Drawing.Point(1203, 10);
this.name_label.Name = "name_label";
this.name_label.Size = new System.Drawing.Size(148, 23);
this.name_label.TabIndex = 11;
this.name_label.Text = "name";
//
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1363, 820);
this.Controls.Add(this.name_label);
this.Controls.Add(this.tabControl1);
this.Controls.Add(this.TestWrite_btn);
this.Controls.Add(this.IMU_label);
this.Controls.Add(this.SendContinuous_btn);
this.Controls.Add(this.label2);
this.Controls.Add(this.SpeedSelector);
this.Controls.Add(this.InfoLabel);
this.Controls.Add(this.Connect_btn);
this.Controls.Add(this.Send_btn);
this.Controls.Add(this.label1);
this.Controls.Add(this.PortSelector);
this.Name = "MainForm";
this.Text = "Form1";
this.tabControl1.ResumeLayout(false);
this.tabPage1.ResumeLayout(false);
this.tabPage2.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.ComboBox PortSelector;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Button Send_btn;
private System.Windows.Forms.Button Connect_btn;
private System.Windows.Forms.Label InfoLabel;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.ComboBox SpeedSelector;
private System.Windows.Forms.Button SendContinuous_btn;
private System.Windows.Forms.Label IMU_label;
private System.Windows.Forms.Button TestWrite_btn;
private System.Windows.Forms.TabControl tabControl1;
private System.Windows.Forms.TabPage tabPage1;
private System.Windows.Forms.TabPage tabPage2;
private RatePID ratePID_control;
private MonitorVars monitorVars1;
private System.Windows.Forms.Label name_label;
}
}

166
TelemetryIO/MainForm.cs Normal file
View File

@ -0,0 +1,166 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Timers;
using System.Diagnostics;
using System.Reflection.Emit;
using System.Xml.Linq;
using TelemetryIO.Models;
namespace TelemetryIO
{
public partial class MainForm : Form
{
private SerialHandler serial = new SerialHandler();
private string[] speedItems = { "9600", "19200", "38400", "115200" };
private System.Timers.Timer packageReceivingTimeout = new System.Timers.Timer(5);
private System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
private System.Timers.Timer packageTransferTimer = new System.Timers.Timer(50);
private List<byte> rx_buf = new List<byte>();
private List<byte[]> send_queue = new List<byte[]>();
private bool sendContinuousFlag = false;
private float test_f = 0;
public MainForm()
{
InitializeComponent();
PortSelector.Items.AddRange(SerialPort.GetPortNames());
PortSelector.SelectedIndex = 0;
SpeedSelector.Items.AddRange(speedItems);
SpeedSelector.SelectedIndex = 0;
Send_btn.Enabled = false;
packageTransferTimer.AutoReset = true;
timer.Interval = 100;
timer.Start();
timer.Tick += Timer_Tick;
ratePID_control.SubscribeOnEvent(serial);
ratePID_control.bottom_label = InfoLabel;
}
private void Timer_Tick(object sender, EventArgs e)
{
if (name_label.InvokeRequired) {
name_label.BeginInvoke(new Action(() => IMU_label.Text = Telemetry.Instance.name)); // Асинхронный вызов
}
else
{
name_label.Text = Telemetry.Instance.name;
}
UpdateLabel(serial.view_str);
}
private void serialSend()
{
}
private void Send_btn_Click(object sender, EventArgs e)
{
serial.sendTest();
}
private void Connect_btn_Click(object sender, EventArgs e)
{
InfoLabel.Text = "";
Button b = sender as Button;
bool a = serial.isOpen;
if (!serial.isOpen)
{
string port;
string speed;
try
{
port = PortSelector.SelectedItem.ToString();
speed = SpeedSelector.SelectedItem.ToString();
}
catch (Exception ex)
{
InfoLabel.Text = "Порт не существует.";
return;
}
if (port != null)
{
try
{
serial.PortName = port;
serial.BaudRate = int.Parse(speed);
serial.Open();
}
catch (Exception ex)
{
InfoLabel.Text = ex.Message;
return;
}
b.Text = "Отключить";
Send_btn.Enabled = true;
}
}
else
{
serial.Close();
b.Text = "Подключить";
Send_btn.Enabled = false;
}
}
private void PortSelector_RefreshItems(object sender, MouseEventArgs e)
{
PortSelector.Items.Clear();
PortSelector.Items.AddRange(SerialPort.GetPortNames());
PortSelector.SelectedIndex = 0;
}
private void SendContinuous_btn_Click(object sender, EventArgs e)
{
serial.sendTestCont();
/*Button b = sender as Button;
if (sendContinuousFlag == true)
{
sendContinuousFlag = false;
packageTransferTimer.Stop();
b.Text = "Stop_Sending";
}
else
{
sendContinuousFlag = true;
send_queue.Add(prepareTelegram());
packageTransferTimer.Start();
b.Text = "Send_Continuous";
}*/
}
public void UpdateLabel(string newText)
{
if (IMU_label.InvokeRequired)
{
IMU_label.BeginInvoke(new Action(() => IMU_label.Text = newText)); // Асинхронный вызов
}
else
{
IMU_label.Text = newText;
}
}
private void TestWrite_btn_Click(object sender, EventArgs e)
{
float[] f = {0, 1, 2, 3, 4, 5, 6, 7, 8};
serial.sendTestWrite(f);
}
}
}

120
TelemetryIO/MainForm.resx Normal file
View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,72 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TelemetryIO.Models
{
public sealed class Telemetry
{
private static volatile Telemetry instance;
private static readonly object _lock = new object();
public string name = "";
public float[] raw_imu = new float[6];
public float[] motor_act = new float[4];
public float[] motor_sp = new float[4];
public float[] pid0 = new float[9];
public float[] pid1 = new float[9];
public float[] pid2 = new float[9];
public float[] pid3 = new float[9];
private Telemetry() { }
public static Telemetry Instance
{
get
{
if(instance == null)
{
lock(_lock)
{
if (instance == null)
{
instance = new Telemetry();
}
}
}
return instance;
}
}
public void setSlot(int slot, byte[] data, int offset, int len)
{
switch (slot)
{
case 0://RAW IMU
set_raw_imu(data, offset, len);
break;
case 9999:
set_name(data);
break;
}
}
private void set_raw_imu(byte[] data, int offset, int len)
{
for (int i = 0; i < (int)(len / 4); i++)
{
byte[] bs = new byte[4];
Array.Copy(data, i * 4, bs, 0, 4);
raw_imu[(int)(offset / 4)] = BitConverter.ToSingle(bs, 0);
}
}
private void set_name(byte[] data)
{
name = Encoding.ASCII.GetString(data, 0, 16);
}
}
}

57
TelemetryIO/MonitorVars.Designer.cs generated Normal file
View File

@ -0,0 +1,57 @@
namespace TelemetryIO
{
partial class MonitorVars
{
/// <summary>
/// Обязательная переменная конструктора.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Освободить все используемые ресурсы.
/// </summary>
/// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Код, автоматически созданный конструктором компонентов
/// <summary>
/// Требуемый метод для поддержки конструктора — не изменяйте
/// содержимое этого метода с помощью редактора кода.
/// </summary>
private void InitializeComponent()
{
this.MainFormPlot = new ScottPlot.WinForms.FormsPlot();
this.SuspendLayout();
//
// MainFormPlot
//
this.MainFormPlot.DisplayScale = 0F;
this.MainFormPlot.Location = new System.Drawing.Point(115, 3);
this.MainFormPlot.Name = "MainFormPlot";
this.MainFormPlot.Size = new System.Drawing.Size(1046, 594);
this.MainFormPlot.TabIndex = 0;
//
// MonitorVars
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.MainFormPlot);
this.Name = "MonitorVars";
this.Size = new System.Drawing.Size(1240, 600);
this.ResumeLayout(false);
}
#endregion
private ScottPlot.WinForms.FormsPlot MainFormPlot;
}
}

View File

@ -0,0 +1,34 @@
using ScottPlot;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace TelemetryIO
{
public partial class MonitorVars : UserControl
{
public SerialHandler serial { get; set; }
public float[][] monitoringBuffer = new float[32][];
public MonitorVars()
{
InitializeComponent();
initMonitoringBuffer();
MainFormPlot.Multiplot.AddPlots(4);
//MainFormPlot.
}
void initMonitoringBuffer()
{
for (int i = 0; i < monitoringBuffer.Length; i++)
{
monitoringBuffer[i] = new float[8192];
}
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,25 @@
<configuration>
<dllmap os="linux" dll="opengl32.dll" target="libGL.so.1"/>
<dllmap os="linux" dll="glu32.dll" target="libGLU.so.1"/>
<dllmap os="linux" dll="openal32.dll" target="libopenal.so.1"/>
<dllmap os="linux" dll="alut.dll" target="libalut.so.0"/>
<dllmap os="linux" dll="opencl.dll" target="libOpenCL.so"/>
<dllmap os="linux" dll="libX11" target="libX11.so.6"/>
<dllmap os="linux" dll="libXi" target="libXi.so.6"/>
<dllmap os="linux" dll="SDL2.dll" target="libSDL2-2.0.so.0"/>
<dllmap os="osx" dll="opengl32.dll" target="/System/Library/Frameworks/OpenGL.framework/OpenGL"/>
<dllmap os="osx" dll="openal32.dll" target="/System/Library/Frameworks/OpenAL.framework/OpenAL" />
<dllmap os="osx" dll="alut.dll" target="/System/Library/Frameworks/OpenAL.framework/OpenAL" />
<dllmap os="osx" dll="libGLES.dll" target="/System/Library/Frameworks/OpenGLES.framework/OpenGLES" />
<dllmap os="osx" dll="libGLESv1_CM.dll" target="/System/Library/Frameworks/OpenGLES.framework/OpenGLES" />
<dllmap os="osx" dll="libGLESv2.dll" target="/System/Library/Frameworks/OpenGLES.framework/OpenGLES" />
<dllmap os="osx" dll="opencl.dll" target="/System/Library/Frameworks/OpenCL.framework/OpenCL"/>
<dllmap os="osx" dll="SDL2.dll" target="libSDL2.dylib"/>
<!-- XQuartz compatibility (X11 on Mac) -->
<dllmap os="osx" dll="libGL.so.1" target="/usr/X11/lib/libGL.dylib"/>
<dllmap os="osx" dll="libX11" target="/usr/X11/lib/libX11.dylib"/>
<dllmap os="osx" dll="libXcursor.so.1" target="/usr/X11/lib/libXcursor.dylib"/>
<dllmap os="osx" dll="libXi" target="/usr/X11/lib/libXi.dylib"/>
<dllmap os="osx" dll="libXinerama" target="/usr/X11/lib/libXinerama.dylib"/>
<dllmap os="osx" dll="libXrandr.so.2" target="/usr/X11/lib/libXrandr.dylib"/>
</configuration>

22
TelemetryIO/Program.cs Normal file
View File

@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace TelemetryIO
{
internal static class Program
{
/// <summary>
/// Главная точка входа для приложения.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
}
}

View File

@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// Общие сведения об этой сборке предоставляются следующим набором
// набора атрибутов. Измените значения этих атрибутов для изменения сведений,
// связанных со сборкой.
[assembly: AssemblyTitle("TelemetryIO")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("TelemetryIO")]
[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми
// для компонентов COM. Если необходимо обратиться к типу в этой сборке через
// COM, следует установить атрибут ComVisible в TRUE для этого типа.
[assembly: ComVisible(false)]
// Следующий GUID служит для идентификации библиотеки типов, если этот проект будет видимым для COM
[assembly: Guid("ddc6b03d-9702-4df4-82ac-d310aca9c549")]
// Сведения о версии сборки состоят из указанных ниже четырех значений:
//
// Основной номер версии
// Дополнительный номер версии
// Номер сборки
// Редакция
//
// Можно задать все значения или принять номера сборки и редакции по умолчанию
// используя "*", как показано ниже:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@ -0,0 +1,71 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Этот код создан программным средством.
// Версия среды выполнения: 4.0.30319.42000
//
// Изменения в этом файле могут привести к неправильному поведению и будут утрачены, если
// код создан повторно.
// </auto-generated>
//------------------------------------------------------------------------------
namespace TelemetryIO.Properties
{
/// <summary>
/// Класс ресурсов со строгим типом для поиска локализованных строк и пр.
/// </summary>
// Этот класс был автоматически создан при помощи StronglyTypedResourceBuilder
// класс с помощью таких средств, как ResGen или Visual Studio.
// Для добавления или удаления члена измените файл .ResX, а затем перезапустите ResGen
// с параметром /str или заново постройте свой VS-проект.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources
{
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources()
{
}
/// <summary>
/// Возврат кэшированного экземпляра ResourceManager, используемого этим классом.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get
{
if ((resourceMan == null))
{
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("TelemetryIO.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Переопределяет свойство CurrentUICulture текущего потока для всех
/// подстановки ресурсов с помощью этого класса ресурсов со строгим типом.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture
{
get
{
return resourceCulture;
}
set
{
resourceCulture = value;
}
}
}
}

View File

@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,30 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace TelemetryIO.Properties
{
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
{
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default
{
get
{
return defaultInstance;
}
}
}
}

View File

@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

698
TelemetryIO/RatePID.Designer.cs generated Normal file
View File

@ -0,0 +1,698 @@
namespace TelemetryIO
{
partial class RatePID
{
/// <summary>
/// Обязательная переменная конструктора.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Освободить все используемые ресурсы.
/// </summary>
/// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Код, автоматически созданный конструктором компонентов
/// <summary>
/// Требуемый метод для поддержки конструктора — не изменяйте
/// содержимое этого метода с помощью редактора кода.
/// </summary>
private void InitializeComponent()
{
this.Save_btn = new System.Windows.Forms.Button();
this.button1 = new System.Windows.Forms.Button();
this.tabControl1 = new System.Windows.Forms.TabControl();
this.tab_pid0 = new System.Windows.Forms.TabPage();
this.pid0_panel = new System.Windows.Forms.Panel();
this.label7 = new System.Windows.Forms.Label();
this.label8 = new System.Windows.Forms.Label();
this.label9 = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label();
this.label5 = new System.Windows.Forms.Label();
this.label6 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.tab_pid1 = new System.Windows.Forms.TabPage();
this.numericUpDown1 = new System.Windows.Forms.NumericUpDown();
this.numericUpDown2 = new System.Windows.Forms.NumericUpDown();
this.numericUpDown3 = new System.Windows.Forms.NumericUpDown();
this.numericUpDown4 = new System.Windows.Forms.NumericUpDown();
this.numericUpDown5 = new System.Windows.Forms.NumericUpDown();
this.numericUpDown6 = new System.Windows.Forms.NumericUpDown();
this.numericUpDown7 = new System.Windows.Forms.NumericUpDown();
this.numericUpDown8 = new System.Windows.Forms.NumericUpDown();
this.numericUpDown9 = new System.Windows.Forms.NumericUpDown();
this.panel2 = new System.Windows.Forms.Panel();
this.numericUpDown10 = new System.Windows.Forms.NumericUpDown();
this.numericUpDown11 = new System.Windows.Forms.NumericUpDown();
this.numericUpDown12 = new System.Windows.Forms.NumericUpDown();
this.numericUpDown13 = new System.Windows.Forms.NumericUpDown();
this.numericUpDown14 = new System.Windows.Forms.NumericUpDown();
this.numericUpDown15 = new System.Windows.Forms.NumericUpDown();
this.numericUpDown16 = new System.Windows.Forms.NumericUpDown();
this.numericUpDown17 = new System.Windows.Forms.NumericUpDown();
this.numericUpDown18 = new System.Windows.Forms.NumericUpDown();
this.label10 = new System.Windows.Forms.Label();
this.label11 = new System.Windows.Forms.Label();
this.label12 = new System.Windows.Forms.Label();
this.label13 = new System.Windows.Forms.Label();
this.label14 = new System.Windows.Forms.Label();
this.label15 = new System.Windows.Forms.Label();
this.label16 = new System.Windows.Forms.Label();
this.label17 = new System.Windows.Forms.Label();
this.label18 = new System.Windows.Forms.Label();
this.tabControl1.SuspendLayout();
this.tab_pid0.SuspendLayout();
this.pid0_panel.SuspendLayout();
this.tab_pid1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown3)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown4)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown5)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown6)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown7)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown8)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown9)).BeginInit();
this.panel2.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown10)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown11)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown12)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown13)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown14)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown15)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown16)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown17)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown18)).BeginInit();
this.SuspendLayout();
//
// Save_btn
//
this.Save_btn.Location = new System.Drawing.Point(1012, 562);
this.Save_btn.Name = "Save_btn";
this.Save_btn.Size = new System.Drawing.Size(75, 23);
this.Save_btn.TabIndex = 18;
this.Save_btn.Text = "Сохранить";
this.Save_btn.UseVisualStyleBackColor = true;
this.Save_btn.Click += new System.EventHandler(this.Save_btn_Click);
//
// button1
//
this.button1.Location = new System.Drawing.Point(1107, 562);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 19;
this.button1.Text = "Отменить";
this.button1.UseVisualStyleBackColor = true;
//
// tabControl1
//
this.tabControl1.Controls.Add(this.tab_pid0);
this.tabControl1.Controls.Add(this.tab_pid1);
this.tabControl1.Location = new System.Drawing.Point(32, 23);
this.tabControl1.Name = "tabControl1";
this.tabControl1.SelectedIndex = 0;
this.tabControl1.Size = new System.Drawing.Size(570, 193);
this.tabControl1.TabIndex = 20;
//
// tab_pid0
//
this.tab_pid0.Controls.Add(this.pid0_panel);
this.tab_pid0.Location = new System.Drawing.Point(4, 22);
this.tab_pid0.Name = "tab_pid0";
this.tab_pid0.Padding = new System.Windows.Forms.Padding(3);
this.tab_pid0.Size = new System.Drawing.Size(562, 167);
this.tab_pid0.TabIndex = 0;
this.tab_pid0.Text = "Набор 0";
this.tab_pid0.UseVisualStyleBackColor = true;
//
// pid0_panel
//
this.pid0_panel.Controls.Add(this.numericUpDown7);
this.pid0_panel.Controls.Add(this.numericUpDown8);
this.pid0_panel.Controls.Add(this.numericUpDown9);
this.pid0_panel.Controls.Add(this.numericUpDown4);
this.pid0_panel.Controls.Add(this.numericUpDown5);
this.pid0_panel.Controls.Add(this.numericUpDown6);
this.pid0_panel.Controls.Add(this.numericUpDown3);
this.pid0_panel.Controls.Add(this.numericUpDown2);
this.pid0_panel.Controls.Add(this.label7);
this.pid0_panel.Controls.Add(this.label8);
this.pid0_panel.Controls.Add(this.label9);
this.pid0_panel.Controls.Add(this.label4);
this.pid0_panel.Controls.Add(this.label5);
this.pid0_panel.Controls.Add(this.label6);
this.pid0_panel.Controls.Add(this.label3);
this.pid0_panel.Controls.Add(this.label2);
this.pid0_panel.Controls.Add(this.label1);
this.pid0_panel.Controls.Add(this.numericUpDown1);
this.pid0_panel.Location = new System.Drawing.Point(23, 25);
this.pid0_panel.Name = "pid0_panel";
this.pid0_panel.Size = new System.Drawing.Size(517, 117);
this.pid0_panel.TabIndex = 0;
//
// label7
//
this.label7.AutoSize = true;
this.label7.Location = new System.Drawing.Point(347, 77);
this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(39, 13);
this.label7.TabIndex = 53;
this.label7.Text = "Yaw.D";
//
// label8
//
this.label8.AutoSize = true;
this.label8.Location = new System.Drawing.Point(347, 51);
this.label8.Name = "label8";
this.label8.Size = new System.Drawing.Size(34, 13);
this.label8.TabIndex = 51;
this.label8.Text = "Yaw.I";
//
// label9
//
this.label9.AutoSize = true;
this.label9.Location = new System.Drawing.Point(347, 25);
this.label9.Name = "label9";
this.label9.Size = new System.Drawing.Size(38, 13);
this.label9.TabIndex = 49;
this.label9.Text = "Yaw.P";
//
// label4
//
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(185, 77);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(42, 13);
this.label4.TabIndex = 47;
this.label4.Text = "Pitch.D";
//
// label5
//
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(185, 51);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(37, 13);
this.label5.TabIndex = 45;
this.label5.Text = "Pitch.I";
//
// label6
//
this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(185, 25);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(41, 13);
this.label6.TabIndex = 43;
this.label6.Text = "Pitch.P";
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(26, 77);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(36, 13);
this.label3.TabIndex = 41;
this.label3.Text = "Roll.D";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(26, 51);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(31, 13);
this.label2.TabIndex = 39;
this.label2.Text = "Roll.I";
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(26, 25);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(35, 13);
this.label1.TabIndex = 37;
this.label1.Text = "Roll.P";
//
// tab_pid1
//
this.tab_pid1.Controls.Add(this.panel2);
this.tab_pid1.Location = new System.Drawing.Point(4, 22);
this.tab_pid1.Name = "tab_pid1";
this.tab_pid1.Padding = new System.Windows.Forms.Padding(3);
this.tab_pid1.Size = new System.Drawing.Size(562, 167);
this.tab_pid1.TabIndex = 1;
this.tab_pid1.Text = "Набор 1";
this.tab_pid1.UseVisualStyleBackColor = true;
//
// numericUpDown1
//
this.numericUpDown1.DecimalPlaces = 2;
this.numericUpDown1.Location = new System.Drawing.Point(67, 23);
this.numericUpDown1.Maximum = new decimal(new int[] {
10,
0,
0,
0});
this.numericUpDown1.Name = "numericUpDown1";
this.numericUpDown1.Size = new System.Drawing.Size(100, 20);
this.numericUpDown1.TabIndex = 1;
this.numericUpDown1.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
//
// numericUpDown2
//
this.numericUpDown2.DecimalPlaces = 2;
this.numericUpDown2.Location = new System.Drawing.Point(67, 51);
this.numericUpDown2.Maximum = new decimal(new int[] {
10,
0,
0,
0});
this.numericUpDown2.Name = "numericUpDown2";
this.numericUpDown2.Size = new System.Drawing.Size(100, 20);
this.numericUpDown2.TabIndex = 2;
this.numericUpDown2.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
//
// numericUpDown3
//
this.numericUpDown3.DecimalPlaces = 2;
this.numericUpDown3.Location = new System.Drawing.Point(67, 77);
this.numericUpDown3.Maximum = new decimal(new int[] {
10,
0,
0,
0});
this.numericUpDown3.Name = "numericUpDown3";
this.numericUpDown3.Size = new System.Drawing.Size(100, 20);
this.numericUpDown3.TabIndex = 3;
this.numericUpDown3.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
//
// numericUpDown4
//
this.numericUpDown4.DecimalPlaces = 2;
this.numericUpDown4.Location = new System.Drawing.Point(232, 77);
this.numericUpDown4.Maximum = new decimal(new int[] {
10,
0,
0,
0});
this.numericUpDown4.Name = "numericUpDown4";
this.numericUpDown4.Size = new System.Drawing.Size(100, 20);
this.numericUpDown4.TabIndex = 6;
this.numericUpDown4.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
//
// numericUpDown5
//
this.numericUpDown5.DecimalPlaces = 2;
this.numericUpDown5.Location = new System.Drawing.Point(232, 51);
this.numericUpDown5.Maximum = new decimal(new int[] {
10,
0,
0,
0});
this.numericUpDown5.Name = "numericUpDown5";
this.numericUpDown5.Size = new System.Drawing.Size(100, 20);
this.numericUpDown5.TabIndex = 5;
this.numericUpDown5.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
//
// numericUpDown6
//
this.numericUpDown6.DecimalPlaces = 2;
this.numericUpDown6.Location = new System.Drawing.Point(232, 23);
this.numericUpDown6.Maximum = new decimal(new int[] {
10,
0,
0,
0});
this.numericUpDown6.Name = "numericUpDown6";
this.numericUpDown6.Size = new System.Drawing.Size(100, 20);
this.numericUpDown6.TabIndex = 4;
this.numericUpDown6.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
//
// numericUpDown7
//
this.numericUpDown7.DecimalPlaces = 2;
this.numericUpDown7.Location = new System.Drawing.Point(398, 77);
this.numericUpDown7.Maximum = new decimal(new int[] {
10,
0,
0,
0});
this.numericUpDown7.Name = "numericUpDown7";
this.numericUpDown7.Size = new System.Drawing.Size(100, 20);
this.numericUpDown7.TabIndex = 9;
this.numericUpDown7.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
//
// numericUpDown8
//
this.numericUpDown8.DecimalPlaces = 2;
this.numericUpDown8.Location = new System.Drawing.Point(398, 51);
this.numericUpDown8.Maximum = new decimal(new int[] {
10,
0,
0,
0});
this.numericUpDown8.Name = "numericUpDown8";
this.numericUpDown8.Size = new System.Drawing.Size(100, 20);
this.numericUpDown8.TabIndex = 8;
this.numericUpDown8.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
//
// numericUpDown9
//
this.numericUpDown9.DecimalPlaces = 2;
this.numericUpDown9.Location = new System.Drawing.Point(398, 23);
this.numericUpDown9.Maximum = new decimal(new int[] {
10,
0,
0,
0});
this.numericUpDown9.Name = "numericUpDown9";
this.numericUpDown9.Size = new System.Drawing.Size(100, 20);
this.numericUpDown9.TabIndex = 7;
this.numericUpDown9.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
//
// panel2
//
this.panel2.Controls.Add(this.numericUpDown10);
this.panel2.Controls.Add(this.numericUpDown11);
this.panel2.Controls.Add(this.numericUpDown12);
this.panel2.Controls.Add(this.numericUpDown13);
this.panel2.Controls.Add(this.numericUpDown14);
this.panel2.Controls.Add(this.numericUpDown15);
this.panel2.Controls.Add(this.numericUpDown16);
this.panel2.Controls.Add(this.numericUpDown17);
this.panel2.Controls.Add(this.numericUpDown18);
this.panel2.Controls.Add(this.label10);
this.panel2.Controls.Add(this.label11);
this.panel2.Controls.Add(this.label12);
this.panel2.Controls.Add(this.label13);
this.panel2.Controls.Add(this.label14);
this.panel2.Controls.Add(this.label15);
this.panel2.Controls.Add(this.label16);
this.panel2.Controls.Add(this.label17);
this.panel2.Controls.Add(this.label18);
this.panel2.Location = new System.Drawing.Point(23, 25);
this.panel2.Name = "panel2";
this.panel2.Size = new System.Drawing.Size(517, 117);
this.panel2.TabIndex = 1;
//
// numericUpDown10
//
this.numericUpDown10.DecimalPlaces = 2;
this.numericUpDown10.Location = new System.Drawing.Point(398, 77);
this.numericUpDown10.Maximum = new decimal(new int[] {
10,
0,
0,
0});
this.numericUpDown10.Name = "numericUpDown10";
this.numericUpDown10.Size = new System.Drawing.Size(100, 20);
this.numericUpDown10.TabIndex = 62;
this.numericUpDown10.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
//
// numericUpDown11
//
this.numericUpDown11.DecimalPlaces = 2;
this.numericUpDown11.Location = new System.Drawing.Point(398, 51);
this.numericUpDown11.Maximum = new decimal(new int[] {
10,
0,
0,
0});
this.numericUpDown11.Name = "numericUpDown11";
this.numericUpDown11.Size = new System.Drawing.Size(100, 20);
this.numericUpDown11.TabIndex = 61;
this.numericUpDown11.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
//
// numericUpDown12
//
this.numericUpDown12.DecimalPlaces = 2;
this.numericUpDown12.Location = new System.Drawing.Point(398, 23);
this.numericUpDown12.Maximum = new decimal(new int[] {
10,
0,
0,
0});
this.numericUpDown12.Name = "numericUpDown12";
this.numericUpDown12.Size = new System.Drawing.Size(100, 20);
this.numericUpDown12.TabIndex = 60;
this.numericUpDown12.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
//
// numericUpDown13
//
this.numericUpDown13.DecimalPlaces = 2;
this.numericUpDown13.Location = new System.Drawing.Point(232, 77);
this.numericUpDown13.Maximum = new decimal(new int[] {
10,
0,
0,
0});
this.numericUpDown13.Name = "numericUpDown13";
this.numericUpDown13.Size = new System.Drawing.Size(100, 20);
this.numericUpDown13.TabIndex = 59;
this.numericUpDown13.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
//
// numericUpDown14
//
this.numericUpDown14.DecimalPlaces = 2;
this.numericUpDown14.Location = new System.Drawing.Point(232, 51);
this.numericUpDown14.Maximum = new decimal(new int[] {
10,
0,
0,
0});
this.numericUpDown14.Name = "numericUpDown14";
this.numericUpDown14.Size = new System.Drawing.Size(100, 20);
this.numericUpDown14.TabIndex = 58;
this.numericUpDown14.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
//
// numericUpDown15
//
this.numericUpDown15.DecimalPlaces = 2;
this.numericUpDown15.Location = new System.Drawing.Point(232, 23);
this.numericUpDown15.Maximum = new decimal(new int[] {
10,
0,
0,
0});
this.numericUpDown15.Name = "numericUpDown15";
this.numericUpDown15.Size = new System.Drawing.Size(100, 20);
this.numericUpDown15.TabIndex = 57;
this.numericUpDown15.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
//
// numericUpDown16
//
this.numericUpDown16.DecimalPlaces = 2;
this.numericUpDown16.Location = new System.Drawing.Point(67, 77);
this.numericUpDown16.Maximum = new decimal(new int[] {
10,
0,
0,
0});
this.numericUpDown16.Name = "numericUpDown16";
this.numericUpDown16.Size = new System.Drawing.Size(100, 20);
this.numericUpDown16.TabIndex = 56;
this.numericUpDown16.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
//
// numericUpDown17
//
this.numericUpDown17.DecimalPlaces = 2;
this.numericUpDown17.Location = new System.Drawing.Point(67, 51);
this.numericUpDown17.Maximum = new decimal(new int[] {
10,
0,
0,
0});
this.numericUpDown17.Name = "numericUpDown17";
this.numericUpDown17.Size = new System.Drawing.Size(100, 20);
this.numericUpDown17.TabIndex = 55;
this.numericUpDown17.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
//
// numericUpDown18
//
this.numericUpDown18.DecimalPlaces = 2;
this.numericUpDown18.Location = new System.Drawing.Point(67, 23);
this.numericUpDown18.Maximum = new decimal(new int[] {
10,
0,
0,
0});
this.numericUpDown18.Name = "numericUpDown18";
this.numericUpDown18.Size = new System.Drawing.Size(100, 20);
this.numericUpDown18.TabIndex = 54;
this.numericUpDown18.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
//
// label10
//
this.label10.AutoSize = true;
this.label10.Location = new System.Drawing.Point(347, 77);
this.label10.Name = "label10";
this.label10.Size = new System.Drawing.Size(39, 13);
this.label10.TabIndex = 53;
this.label10.Text = "Yaw.D";
//
// label11
//
this.label11.AutoSize = true;
this.label11.Location = new System.Drawing.Point(347, 51);
this.label11.Name = "label11";
this.label11.Size = new System.Drawing.Size(34, 13);
this.label11.TabIndex = 51;
this.label11.Text = "Yaw.I";
//
// label12
//
this.label12.AutoSize = true;
this.label12.Location = new System.Drawing.Point(347, 25);
this.label12.Name = "label12";
this.label12.Size = new System.Drawing.Size(38, 13);
this.label12.TabIndex = 49;
this.label12.Text = "Yaw.P";
//
// label13
//
this.label13.AutoSize = true;
this.label13.Location = new System.Drawing.Point(185, 77);
this.label13.Name = "label13";
this.label13.Size = new System.Drawing.Size(42, 13);
this.label13.TabIndex = 47;
this.label13.Text = "Pitch.D";
//
// label14
//
this.label14.AutoSize = true;
this.label14.Location = new System.Drawing.Point(185, 51);
this.label14.Name = "label14";
this.label14.Size = new System.Drawing.Size(37, 13);
this.label14.TabIndex = 45;
this.label14.Text = "Pitch.I";
//
// label15
//
this.label15.AutoSize = true;
this.label15.Location = new System.Drawing.Point(185, 25);
this.label15.Name = "label15";
this.label15.Size = new System.Drawing.Size(41, 13);
this.label15.TabIndex = 43;
this.label15.Text = "Pitch.P";
//
// label16
//
this.label16.AutoSize = true;
this.label16.Location = new System.Drawing.Point(26, 77);
this.label16.Name = "label16";
this.label16.Size = new System.Drawing.Size(36, 13);
this.label16.TabIndex = 41;
this.label16.Text = "Roll.D";
//
// label17
//
this.label17.AutoSize = true;
this.label17.Location = new System.Drawing.Point(26, 51);
this.label17.Name = "label17";
this.label17.Size = new System.Drawing.Size(31, 13);
this.label17.TabIndex = 39;
this.label17.Text = "Roll.I";
//
// label18
//
this.label18.AutoSize = true;
this.label18.Location = new System.Drawing.Point(26, 25);
this.label18.Name = "label18";
this.label18.Size = new System.Drawing.Size(35, 13);
this.label18.TabIndex = 37;
this.label18.Text = "Roll.P";
//
// RatePID
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.tabControl1);
this.Controls.Add(this.button1);
this.Controls.Add(this.Save_btn);
this.Name = "RatePID";
this.Size = new System.Drawing.Size(1200, 600);
this.tabControl1.ResumeLayout(false);
this.tab_pid0.ResumeLayout(false);
this.pid0_panel.ResumeLayout(false);
this.pid0_panel.PerformLayout();
this.tab_pid1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown3)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown4)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown5)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown6)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown7)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown8)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown9)).EndInit();
this.panel2.ResumeLayout(false);
this.panel2.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown10)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown11)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown12)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown13)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown14)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown15)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown16)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown17)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown18)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Button Save_btn;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.TabControl tabControl1;
private System.Windows.Forms.TabPage tab_pid0;
private System.Windows.Forms.TabPage tab_pid1;
private System.Windows.Forms.Panel pid0_panel;
private System.Windows.Forms.Label label7;
private System.Windows.Forms.Label label8;
private System.Windows.Forms.Label label9;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.NumericUpDown numericUpDown1;
private System.Windows.Forms.NumericUpDown numericUpDown7;
private System.Windows.Forms.NumericUpDown numericUpDown8;
private System.Windows.Forms.NumericUpDown numericUpDown9;
private System.Windows.Forms.NumericUpDown numericUpDown4;
private System.Windows.Forms.NumericUpDown numericUpDown5;
private System.Windows.Forms.NumericUpDown numericUpDown6;
private System.Windows.Forms.NumericUpDown numericUpDown3;
private System.Windows.Forms.NumericUpDown numericUpDown2;
private System.Windows.Forms.Panel panel2;
private System.Windows.Forms.NumericUpDown numericUpDown10;
private System.Windows.Forms.NumericUpDown numericUpDown11;
private System.Windows.Forms.NumericUpDown numericUpDown12;
private System.Windows.Forms.NumericUpDown numericUpDown13;
private System.Windows.Forms.NumericUpDown numericUpDown14;
private System.Windows.Forms.NumericUpDown numericUpDown15;
private System.Windows.Forms.NumericUpDown numericUpDown16;
private System.Windows.Forms.NumericUpDown numericUpDown17;
private System.Windows.Forms.NumericUpDown numericUpDown18;
private System.Windows.Forms.Label label10;
private System.Windows.Forms.Label label11;
private System.Windows.Forms.Label label12;
private System.Windows.Forms.Label label13;
private System.Windows.Forms.Label label14;
private System.Windows.Forms.Label label15;
private System.Windows.Forms.Label label16;
private System.Windows.Forms.Label label17;
private System.Windows.Forms.Label label18;
}
}

64
TelemetryIO/RatePID.cs Normal file
View File

@ -0,0 +1,64 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace TelemetryIO
{
public partial class RatePID : UserControl
{
private float[] pid0 = new float[9];
private float[] pid1 = new float[9];
private float zh = 0;
private bool isSubscribed = false;
public SerialHandler serial { get; set; }
public Label bottom_label { get; set; }
public RatePID()
{
InitializeComponent();
Debug.Write("tab elements = " + tabControl1.TabPages[0].Controls[0].Controls);
}
private void Serial_AnswerReceived(object sender, SerialEventArgs e)
{
if (bottom_label.InvokeRequired)
{
bottom_label.BeginInvoke(new Action(() => bottom_label.Text = e.Answer)); // Асинхронный вызов
}
else
{
bottom_label.Text = e.Answer; ;
}
}
public void SubscribeOnEvent(SerialHandler s)
{
if (isSubscribed) return;
isSubscribed = true;
serial = s;
serial.AnswerReceived += Serial_AnswerReceived;
}
private void Save_btn_Click(object sender, EventArgs e)
{
float[] floats = new float[9];
for(int i = 0; i < pid0_panel.Controls.Count; i++)
{
if (pid0_panel.Controls[i] is NumericUpDown)
{
NumericUpDown c = pid0_panel.Controls[i] as NumericUpDown;
floats[pid0_panel.Controls[i].TabIndex - 1] = (float)c.Value;
}
}
serial.sendTestWrite(floats);
}
}
}

120
TelemetryIO/RatePID.resx Normal file
View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,355 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO.Ports;
using System.Linq;
using System.Net.Http;
using System.Security.Permissions;
using System.Text;
using System.Threading.Tasks;
using TelemetryIO.Models;
namespace TelemetryIO
{
public class SerialHandler
{
public const int TELE_CMD_RD_ONCE = 1;
private const int TELE_CMD_RD_MON_ON = 2;
private const int TELE_CMD_RD_MON_OFF = 3;
private const int TELE_CMD_RD_MON_ADD = 4;
private const int TELE_CMD_RD_MON_REMOVE = 5;
private const int TELE_CMD_RD_MON_REMOVEALL = 6;
private const int TELE_CMD_WR = 10;
private const int TELE_CMD_ABORT = 999;
private const int TELE_CMD_HELLO = 9999;
private const byte CRC8_POLYNOMIAL = 0x07;
private const int CRC32_POLY = 0x04C11DB7;
private const byte ESCAPE_BEGIN = 0xBE;
private const byte ESCAPE_END = 0xED;
private const byte ESCAPE_CHAR = 0x0E;
private SerialPort com_port;
static private List<byte> rx_buf = new List<byte>();
static private byte[] data;
public delegate void AnswerEventHandler<SerialEventArgs>(object sender, SerialEventArgs e);
public event AnswerEventHandler<SerialEventArgs> AnswerReceived;
private int int_test = 0;
private float[] monitor = new float[32];
public string view_str = "";
Telemetry telemetry = Telemetry.Instance;
public struct Telegram
{
public int cmd;
public int slot;
public int len;
public int offset;
public byte[] param;
};
public string PortName
{
get { return com_port.PortName; }
set { com_port.PortName = value; }
}
public int BaudRate
{
get { return com_port.BaudRate; }
set { com_port.BaudRate = value; }
}
public bool isOpen
{
get { return com_port.IsOpen; }
}
public SerialHandler()
{
com_port = new SerialPort();
}
public SerialHandler(string PortName, int BaudRate)
{
com_port = new SerialPort();
com_port.PortName = PortName;
com_port.BaudRate = BaudRate;
}
private void Serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
while (sp.BytesToRead > 0)
{
if (!sp.IsOpen) return;
byte b = (byte)sp.ReadByte();
if (b == ESCAPE_END)
{
byte[] unscape = EscapeSeqToBytes(rx_buf.ToArray());
uint checksum = crc32(unscape, unscape.Length - 4);
uint re_checksum = DataSlots.bytes_to_uint(unscape, unscape.Length - 4);
if (re_checksum == checksum)
{
//Parse telegram
int cmd = DataSlots.bytes_to_int(unscape, 0);
int slot = DataSlots.bytes_to_int(unscape, 4);
int len = DataSlots.bytes_to_int(unscape, 8);
int offset = DataSlots.bytes_to_int(unscape, 12);
byte[] data = new byte[len];
Array.Copy(unscape, 16, data, 0, len);
if (cmd == TELE_CMD_RD_ONCE)
{
DataSlots.setSlot(slot, data, offset, len);
}
else if (cmd == TELE_CMD_RD_MON_ON)
{
for(int i = 0; i < data.Length/4; i++)
{
monitor[i] = BitConverter.ToSingle(data, i*4);
}
view_str = string.Join(", ", monitor.Select(x => "" + x).ToArray(), 0, data.Length/4);
}
else if (cmd == TELE_CMD_WR)
{
if (data[0] == 'O' && data[1] == 'k')
{
Debug.Write("Data is written\n");
OnAnswerReceived("Data is written");
}
}else if(cmd == TELE_CMD_HELLO)
{
telemetry.setSlot(9999, data, 0, 0);
view_str = Encoding.ASCII.GetString(data);
}
}
}
else if (b == ESCAPE_BEGIN)
{
rx_buf.Clear();
}
else
{
rx_buf.Add(b);
}
}
}
public void Open()
{
com_port.Open();
com_port.DataReceived += Serial_DataReceived;
byte[] to = prepareTelegram(TELE_CMD_HELLO, 0, new byte[0], 0);
com_port.Write(to, 0, to.Length);
}
public void Close()
{
com_port.DataReceived -= Serial_DataReceived;
com_port.Close();
}
byte crc8(byte[] data, int length)
{
byte crc = 0x00; // Initial value
for (int i = 0; i < length; i++)
{
crc ^= data[i]; // XOR with the data byte
for (int j = 0; j < 8; j++)
{
if ((byte)(crc & 0x80) > 0)
{
crc = (byte)((byte)(crc << 1) ^ CRC8_POLYNOMIAL);
}
else
{
crc = (byte)(crc << 1);
}
}
}
return crc;
}
uint crc32(byte[] data, int length)
{
uint crc = 0xFFFFFFFF; // Начальное значение CRC
for (int i = 0; i < length; i++)
{
crc ^= (uint)data[i] << 24; // XOR с текущим байтом
for (int j = 0; j < 8; j++)
{
if ((uint)(crc & 0x80000000) != 0)
{
crc = (crc << 1) ^ CRC32_POLY;
}
else
{
crc <<= 1;
}
}
}
return crc;
}
public void sendTest()
{
//data - index in monitor
byte[] to = prepareTelegram(TELE_CMD_RD_MON_ADD, 0, BitConverter.GetBytes(int_test), int_test, 4);
com_port.Write(to, 0, to.Length);
int_test++;
}
public void sendTestCont()
{
byte[] b = new byte[0];
byte[] to = prepareTelegram(TELE_CMD_RD_MON_ON, 0, b, 0, 24);
com_port.Write(to, 0, to.Length);
}
public void sendTestWrite(float[] f)
{
byte[] b = prepareTelegram(TELE_CMD_WR, 1000, f, 0);
com_port.Write(b, 0, b.Length);
}
byte[] prepareTelegram<T>(int cmd, int slot, T[] load, int offset, int len = 0)
{
byte[] byteload = DataArrayToBytes(load);
int total_len = 20 + byteload.Length;//cmd[4 bytes] + slot[4 bytes] + len[4 bytes] + offset[4 bytes] + load[len bytes]
byte[] data = new byte[total_len];
//Construct telegram
data[0] = (byte)(0xFF & cmd);
data[1] = (byte)(0xFF & (cmd >> 8));
data[2] = (byte)(0xFF & (cmd >> 16));
data[3] = (byte)(0xFF & (cmd >> 24));
data[4] = (byte)(0xFF & slot);
data[5] = (byte)(0xFF & (slot >> 8));
data[6] = (byte)(0xFF & (slot >> 16));
data[7] = (byte)(0xFF & (slot >> 24));
int l = 0;
if (cmd == TELE_CMD_WR) l = byteload.Length;
else l = len;
data[8] = (byte)(0xFF & l);
data[9] = (byte)(0xFF & (l >> 8));
data[10] = (byte)(0xFF & (l >> 16));
data[11] = (byte)(0xFF & (l >> 24));
data[12] = (byte)(0xFF & offset);
data[13] = (byte)(0xFF & (offset >> 8));
data[14] = (byte)(0xFF & (offset >> 16));
data[15] = (byte)(0xFF & (offset >> 24));
if(byteload.Length > 0)
{
//Copy data
Array.Copy(byteload, 0, data, 16, byteload.Length);
}
//CRC32
uint checksum = crc32(data, total_len - 4);
data[total_len - 4] = (byte)(0xFF & checksum);
data[total_len - 3] = (byte)(0xFF & (checksum >> 8));
data[total_len - 2] = (byte)(0xFF & (checksum >> 16));
data[total_len - 1] = (byte)(0xFF & (checksum >> 24));
byte[] escape = BytesToEscapeSeq(data);
byte[] ret = new byte[escape.Length + 2];
Array.Copy(escape, 0, ret, 1, escape.Length);
ret[0] = ESCAPE_BEGIN;
ret[ret.Length - 1] = ESCAPE_END;
return ret;
}
byte[] DataArrayToBytes<T>(T[] data)
{
if (data == null) return new byte[0];
List<byte>ret = new List<byte> ();
for(int i = 0; i < data.Length; i++)
{
if(typeof(T) == typeof(float))
{
ret.AddRange(BitConverter.GetBytes((float)(object)data[i]));
}else if(typeof(T) == typeof(int))
{
ret.AddRange(BitConverter.GetBytes((int)(object)data[i]));
}else if(typeof(T) == typeof(byte))
{
ret.Add((byte)(object)data[i]);
}else if(typeof(T) == typeof(bool))
{
bool t = (bool)(object)data[i];
if (t) ret.Add(1);
else ret.Add(0);
}
}
return ret.ToArray();
}
byte[] BytesToEscapeSeq(byte[] data)
{
List<byte> ret = new List<byte>();
for (int i = 0; i < data.Length; i++)
{
if ((data[i] == ESCAPE_BEGIN) || (data[i] == ESCAPE_CHAR) || (data[i] == ESCAPE_END))
{
ret.Add(ESCAPE_CHAR);
ret.Add((byte)(data[i] - 0x0E));
}
else
{
ret.Add(data[i]);
}
}
return ret.ToArray();
}
byte[] EscapeSeqToBytes(byte[] EscSeq)
{
List<byte> ret = new List<byte>();
for (int i = 0; i < EscSeq.Length; i++)
{
if ((EscSeq[i] == ESCAPE_BEGIN) || (EscSeq[i] == ESCAPE_CHAR) || (EscSeq[i] == ESCAPE_END))
{
i++;
ret.Add((byte)(EscSeq[i] + 0x0E));
}
else
{
ret.Add(EscSeq[i]);
}
}
return ret.ToArray();
}
protected virtual void OnAnswerReceived(string answer)
{
AnswerReceived?.Invoke(this, new SerialEventArgs(answer));
}
}
public class SerialEventArgs: EventArgs
{
public string Answer { get; set; }
public SerialEventArgs(string answer)
{
Answer = answer;
}
}
}

View File

@ -0,0 +1,172 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{DDC6B03D-9702-4DF4-82AC-D310ACA9C549}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>TelemetryIO</RootNamespace>
<AssemblyName>TelemetryIO</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="HarfBuzzSharp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL">
<HintPath>..\packages\HarfBuzzSharp.7.3.0.3\lib\net462\HarfBuzzSharp.dll</HintPath>
</Reference>
<Reference Include="OpenTK, Version=3.1.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4, processorArchitecture=MSIL">
<HintPath>..\packages\OpenTK.3.1.0\lib\net20\OpenTK.dll</HintPath>
</Reference>
<Reference Include="OpenTK.GLControl, Version=3.1.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4, processorArchitecture=MSIL">
<HintPath>..\packages\OpenTK.GLControl.3.1.0\lib\net20\OpenTK.GLControl.dll</HintPath>
</Reference>
<Reference Include="ScottPlot, Version=5.0.55.0, Culture=neutral, PublicKeyToken=86698dc10387c39e, processorArchitecture=MSIL">
<HintPath>..\packages\ScottPlot.5.0.55\lib\net462\ScottPlot.dll</HintPath>
</Reference>
<Reference Include="ScottPlot.WinForms, Version=5.0.55.0, Culture=neutral, PublicKeyToken=86698dc10387c39e, processorArchitecture=MSIL">
<HintPath>..\packages\ScottPlot.WinForms.5.0.55\lib\net462\ScottPlot.WinForms.dll</HintPath>
</Reference>
<Reference Include="SkiaSharp, Version=2.88.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL">
<HintPath>..\packages\SkiaSharp.2.88.9\lib\net462\SkiaSharp.dll</HintPath>
</Reference>
<Reference Include="SkiaSharp.HarfBuzz, Version=2.88.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL">
<HintPath>..\packages\SkiaSharp.HarfBuzz.2.88.9\lib\net462\SkiaSharp.HarfBuzz.dll</HintPath>
</Reference>
<Reference Include="SkiaSharp.Views.Desktop.Common, Version=2.88.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL">
<HintPath>..\packages\SkiaSharp.Views.Desktop.Common.2.88.9\lib\net462\SkiaSharp.Views.Desktop.Common.dll</HintPath>
</Reference>
<Reference Include="SkiaSharp.Views.WindowsForms, Version=2.88.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL">
<HintPath>..\packages\SkiaSharp.Views.WindowsForms.2.88.9\lib\net462\SkiaSharp.Views.WindowsForms.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
</Reference>
<Reference Include="System.Core" />
<Reference Include="System.Drawing.Common, Version=4.0.0.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Drawing.Common.4.7.3\lib\net461\System.Drawing.Common.dll</HintPath>
</Reference>
<Reference Include="System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll</HintPath>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll</HintPath>
</Reference>
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="DataSlots.cs" />
<Compile Include="MainForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="MainForm.Designer.cs">
<DependentUpon>MainForm.cs</DependentUpon>
</Compile>
<Compile Include="Models\Telemetry.cs" />
<Compile Include="MonitorVars.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="MonitorVars.Designer.cs">
<DependentUpon>MonitorVars.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="RatePID.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="RatePID.Designer.cs">
<DependentUpon>RatePID.cs</DependentUpon>
</Compile>
<Compile Include="SerialHandler.cs" />
<EmbeddedResource Include="MainForm.resx">
<DependentUpon>MainForm.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="MonitorVars.resx">
<DependentUpon>MonitorVars.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<EmbeddedResource Include="RatePID.resx">
<DependentUpon>RatePID.cs</DependentUpon>
</EmbeddedResource>
<None Include="OpenTK.dll.config" />
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="..\packages\HarfBuzzSharp.NativeAssets.macOS.7.3.0.3\build\net462\HarfBuzzSharp.NativeAssets.macOS.targets" Condition="Exists('..\packages\HarfBuzzSharp.NativeAssets.macOS.7.3.0.3\build\net462\HarfBuzzSharp.NativeAssets.macOS.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>Данный проект ссылается на пакеты NuGet, отсутствующие на этом компьютере. Используйте восстановление пакетов NuGet, чтобы скачать их. Дополнительную информацию см. по адресу: http://go.microsoft.com/fwlink/?LinkID=322105. Отсутствует следующий файл: {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\HarfBuzzSharp.NativeAssets.macOS.7.3.0.3\build\net462\HarfBuzzSharp.NativeAssets.macOS.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\HarfBuzzSharp.NativeAssets.macOS.7.3.0.3\build\net462\HarfBuzzSharp.NativeAssets.macOS.targets'))" />
<Error Condition="!Exists('..\packages\HarfBuzzSharp.NativeAssets.Win32.7.3.0.3\build\net462\HarfBuzzSharp.NativeAssets.Win32.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\HarfBuzzSharp.NativeAssets.Win32.7.3.0.3\build\net462\HarfBuzzSharp.NativeAssets.Win32.targets'))" />
<Error Condition="!Exists('..\packages\SkiaSharp.NativeAssets.macOS.2.88.9\build\net462\SkiaSharp.NativeAssets.macOS.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\SkiaSharp.NativeAssets.macOS.2.88.9\build\net462\SkiaSharp.NativeAssets.macOS.targets'))" />
<Error Condition="!Exists('..\packages\SkiaSharp.NativeAssets.Win32.2.88.9\build\net462\SkiaSharp.NativeAssets.Win32.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\SkiaSharp.NativeAssets.Win32.2.88.9\build\net462\SkiaSharp.NativeAssets.Win32.targets'))" />
<Error Condition="!Exists('..\packages\HarfBuzzSharp.NativeAssets.Linux.7.3.0.3\build\net462\HarfBuzzSharp.NativeAssets.Linux.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\HarfBuzzSharp.NativeAssets.Linux.7.3.0.3\build\net462\HarfBuzzSharp.NativeAssets.Linux.targets'))" />
<Error Condition="!Exists('..\packages\SkiaSharp.NativeAssets.Linux.NoDependencies.2.88.9\build\net462\SkiaSharp.NativeAssets.Linux.NoDependencies.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\SkiaSharp.NativeAssets.Linux.NoDependencies.2.88.9\build\net462\SkiaSharp.NativeAssets.Linux.NoDependencies.targets'))" />
</Target>
<Import Project="..\packages\HarfBuzzSharp.NativeAssets.Win32.7.3.0.3\build\net462\HarfBuzzSharp.NativeAssets.Win32.targets" Condition="Exists('..\packages\HarfBuzzSharp.NativeAssets.Win32.7.3.0.3\build\net462\HarfBuzzSharp.NativeAssets.Win32.targets')" />
<Import Project="..\packages\SkiaSharp.NativeAssets.macOS.2.88.9\build\net462\SkiaSharp.NativeAssets.macOS.targets" Condition="Exists('..\packages\SkiaSharp.NativeAssets.macOS.2.88.9\build\net462\SkiaSharp.NativeAssets.macOS.targets')" />
<Import Project="..\packages\SkiaSharp.NativeAssets.Win32.2.88.9\build\net462\SkiaSharp.NativeAssets.Win32.targets" Condition="Exists('..\packages\SkiaSharp.NativeAssets.Win32.2.88.9\build\net462\SkiaSharp.NativeAssets.Win32.targets')" />
<Import Project="..\packages\HarfBuzzSharp.NativeAssets.Linux.7.3.0.3\build\net462\HarfBuzzSharp.NativeAssets.Linux.targets" Condition="Exists('..\packages\HarfBuzzSharp.NativeAssets.Linux.7.3.0.3\build\net462\HarfBuzzSharp.NativeAssets.Linux.targets')" />
<Import Project="..\packages\SkiaSharp.NativeAssets.Linux.NoDependencies.2.88.9\build\net462\SkiaSharp.NativeAssets.Linux.NoDependencies.targets" Condition="Exists('..\packages\SkiaSharp.NativeAssets.Linux.NoDependencies.2.88.9\build\net462\SkiaSharp.NativeAssets.Linux.NoDependencies.targets')" />
</Project>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="HarfBuzzSharp" version="7.3.0.3" targetFramework="net472" />
<package id="HarfBuzzSharp.NativeAssets.Linux" version="7.3.0.3" targetFramework="net472" />
<package id="HarfBuzzSharp.NativeAssets.macOS" version="7.3.0.3" targetFramework="net472" />
<package id="HarfBuzzSharp.NativeAssets.Win32" version="7.3.0.3" targetFramework="net472" />
<package id="OpenTK" version="3.1.0" targetFramework="net472" />
<package id="OpenTK.GLControl" version="3.1.0" targetFramework="net472" />
<package id="ScottPlot" version="5.0.55" targetFramework="net472" />
<package id="ScottPlot.WinForms" version="5.0.55" targetFramework="net472" />
<package id="SkiaSharp" version="2.88.9" targetFramework="net472" />
<package id="SkiaSharp.HarfBuzz" version="2.88.9" targetFramework="net472" />
<package id="SkiaSharp.NativeAssets.Linux.NoDependencies" version="2.88.9" targetFramework="net472" />
<package id="SkiaSharp.NativeAssets.macOS" version="2.88.9" targetFramework="net472" />
<package id="SkiaSharp.NativeAssets.Win32" version="2.88.9" targetFramework="net472" />
<package id="SkiaSharp.Views.Desktop.Common" version="2.88.9" targetFramework="net472" />
<package id="SkiaSharp.Views.WindowsForms" version="2.88.9" targetFramework="net472" />
<package id="System.Buffers" version="4.5.1" targetFramework="net472" />
<package id="System.Drawing.Common" version="4.7.3" targetFramework="net472" />
<package id="System.Memory" version="4.5.5" targetFramework="net472" />
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net472" />
<package id="System.Runtime.CompilerServices.Unsafe" version="4.5.3" targetFramework="net472" />
<package id="System.ValueTuple" version="4.5.0" targetFramework="net472" />
</packages>