Compare commits

..

15 Commits

Author SHA1 Message Date
1558429ad0 Merge branch 'main' into devVlad 2025-04-09 09:28:30 +03:00
e0af20b46d Удаление лишнего 2025-04-04 13:14:41 +03:00
099ec402cf Merge branch 'main' into devVlad 2025-04-04 13:13:16 +03:00
16fa3780d9 Включён таймер
Почему-то каждый раз слетает
2025-04-04 12:03:50 +03:00
c6f2acf140 Переписанный код на c++/cli
Рабочий вариант
2025-04-04 11:49:03 +03:00
9f0faac821 Тест 2025-04-04 00:05:34 +03:00
994b0f8712 Создание класса клиента 2025-04-03 13:07:57 +03:00
e83f355fa3 Переписывание подключения 2025-04-03 13:05:30 +03:00
34d53ad7f1 Разделение кода на функции
Нужно, чтобы создать класс клиента
2025-04-03 11:45:18 +03:00
7248be8217 Написан код клиента c++
Подключение, отправка и получение данных
2025-04-02 22:00:47 +03:00
e28a8a01bf Тест подключения 2025-04-01 20:00:52 +03:00
acf6379279 Чистка кода от мусора 2025-04-01 14:27:21 +03:00
eeb7c5764f Удаление спрятанного .gitignore 2025-04-01 14:23:14 +03:00
17d2edfceb Загрузка DroneClientCpp 2025-04-01 14:13:49 +03:00
b565ec7608 Новый .gitignore 2025-04-01 14:12:24 +03:00
21 changed files with 322 additions and 1352 deletions

3
.gitignore vendored
View File

@ -1,4 +1,3 @@
.vs/
obj/
bin/
x64/
bin/

View File

@ -1,5 +1,4 @@
using System.Diagnostics.Metrics;
using System.Drawing;
using System.Drawing;
using System.Runtime.InteropServices;
namespace DroneClient
@ -9,11 +8,8 @@ namespace DroneClient
public float AccX, AccY, AccZ;
public float GyrX, GyrY, GyrZ;
public uint TimeAcc, TimeGyr;
public float PosX, PosY;
public float LaserRange;
public uint TimeRange;
public float MotorUL, MotorUR, MotorDL, MotorDR;
@ -74,44 +70,22 @@ namespace DroneClient
return getBytes(mot4);
}
private byte[]? RecvDataAcc(byte[] data)
private byte[]? RecvDataIMU(byte[] data)
{
DroneData.DataAcc imu = (DroneData.DataAcc)fromBytes(data, typeof(DroneData.DataAcc));
DroneData.DataIMU imu = (DroneData.DataIMU)fromBytes(data, typeof(DroneData.DataIMU));
AccX = imu.Acc.X; AccY = imu.Acc.Y; AccZ = imu.Acc.Z;
TimeAcc= imu.Time;
return new byte[0];
}
private byte[]? RecvDataGyr(byte[] data)
{
DroneData.DataGyr imu = (DroneData.DataGyr)fromBytes(data, typeof(DroneData.DataGyr));
GyrX = imu.Gyr.X; GyrY = imu.Gyr.Y; GyrZ = imu.Gyr.Z;
TimeGyr = imu.Time;
return new byte[0];
}
private byte[]? RecvDataRange(byte[] data)
private byte[]? RecvDataPos(byte[] data)
{
DroneData.DataRange pos = (DroneData.DataRange)fromBytes(data, typeof(DroneData.DataRange));
LaserRange = pos.LiDAR;
TimeRange = pos.Time;
return new byte[0];
}
private byte[]? RecvDataLocal(byte[] data)
{
DroneData.DataLocal pos = (DroneData.DataLocal)fromBytes(data, typeof(DroneData.DataLocal));
DroneData.DataPos pos = (DroneData.DataPos)fromBytes(data, typeof(DroneData.DataPos));
PosX = pos.Local.X; PosY = pos.Local.Y;
LaserRange = pos.LiDAR;
return new byte[0];
}
@ -122,7 +96,7 @@ namespace DroneClient
switch (head.Type)
{
case DroneData.DataType.DataAcc:
case DroneData.DataType.DataIMU:
{
if (head.Mode == DroneData.DataMode.Request)
{
@ -134,11 +108,11 @@ namespace DroneClient
else
{
// Пришли данные
return RecvDataAcc(body);
return RecvDataIMU(body);
}
}
case DroneData.DataType.DataGyr:
case DroneData.DataType.DataPos:
{
if (head.Mode == DroneData.DataMode.Request)
{
@ -150,39 +124,7 @@ namespace DroneClient
else
{
// Пришли данные
return RecvDataGyr(body);
}
}
case DroneData.DataType.DataRange:
{
if (head.Mode == DroneData.DataMode.Request)
{
// Запрос данных
// ... //
//
return zero;
}
else
{
// Пришли данные
return RecvDataRange(body);
}
}
case DroneData.DataType.DataLocal:
{
if (head.Mode == DroneData.DataMode.Request)
{
// Запрос данных
// ... //
//
return zero;
}
else
{
// Пришли данные
return RecvDataLocal(body);
return RecvDataPos(body);
}
}
@ -251,46 +193,24 @@ namespace DroneClient
public byte[] SendReqest()
{
DroneData.DataHead acc = new DroneData.DataHead();
acc.Size = DroneData.DataHead.StrLen;
acc.Mode = DroneData.DataMode.Request;
acc.Type = DroneData.DataType.DataAcc;
DroneData.DataHead imu = new DroneData.DataHead();
imu.Size = DroneData.DataHead.StrLen;
imu.Mode = DroneData.DataMode.Request;
imu.Type = DroneData.DataType.DataIMU;
DroneData.DataHead gyr = new DroneData.DataHead();
gyr.Size = DroneData.DataHead.StrLen;
gyr.Mode = DroneData.DataMode.Request;
gyr.Type = DroneData.DataType.DataGyr;
DroneData.DataHead pos = new DroneData.DataHead();
pos.Size = DroneData.DataHead.StrLen;
pos.Mode = DroneData.DataMode.Request;
pos.Type = DroneData.DataType.DataPos;
DroneData.DataHead range = new DroneData.DataHead();
range.Size = DroneData.DataHead.StrLen;
range.Mode = DroneData.DataMode.Request;
range.Type = DroneData.DataType.DataRange;
byte[] si = getBytes(imu);
byte[] sp = getBytes(pos);
byte[] sm = SendDataMotor4();
DroneData.DataHead local = new DroneData.DataHead();
local.Size = DroneData.DataHead.StrLen;
local.Mode = DroneData.DataMode.Request;
local.Type = DroneData.DataType.DataLocal;
List<byte[]> list = new List<byte[]>();
list.Add(getBytes(acc));
list.Add(getBytes(gyr));
list.Add(getBytes(range));
list.Add(getBytes(local));
list.Add(SendDataMotor4());
int count = 0;
foreach (byte[] d in list) count += d.Length;
byte[] send = new byte[count];
count = 0;
foreach (byte[] d in list)
{
d.CopyTo(send, count);
count += d.Length;
}
byte[] send = new byte[si.Length + sp.Length + sm.Length];
si.CopyTo(send, 0);
sp.CopyTo(send, si.Length);
sm.CopyTo(send, si.Length + sp.Length);
return send;
}

View File

@ -8,11 +8,11 @@ namespace DroneData
};
public enum DataType : ushort
{
{
None = 0, Head = 1,
// Output
DataAcc = 1001, DataGyr = 1002, DataMag = 1003, DataRange = 1004, DataLocal = 1005,
DataIMU = 1001, DataPos = 1002,
// Input
DataMotor4 = 2001, DataMotor6 = 2002
@ -25,66 +25,32 @@ namespace DroneData
public DataMode Mode;
public DataType Type;
public uint Time; // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
static public int StrLen = Marshal.SizeOf(typeof(DroneData.DataHead));
}
public struct XYZ { public float X, Y, Z; }
public struct DataAcc
public struct DataIMU
{
public DataHead Head;
public XYZ Acc;
public XYZ Acc, Gyr, Mag;
public uint Time; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static public int StrLen = Marshal.SizeOf(typeof(DroneData.DataAcc));
static public int StrLen = Marshal.SizeOf(typeof(DroneData.DataIMU));
}
public struct DataGyr
{
public DataHead Head;
public XYZ Gyr;
public uint Time; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static public int StrLen = Marshal.SizeOf(typeof(DroneData.DataGyr));
}
public struct DataMag
{
public DataHead Head;
public XYZ Mag;
public uint Time; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static public int StrLen = Marshal.SizeOf(typeof(DroneData.DataMag));
}
public struct DataLocal
public struct DataPos
{
public DataHead Head;
public XYZ Local; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
public uint Time; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static public int StrLen = Marshal.SizeOf(typeof(DroneData.DataLocal));
}
public struct DataRange
{
public DataHead Head;
public float LiDAR; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
public uint Time; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static public int StrLen = Marshal.SizeOf(typeof(DroneData.DataRange));
static public int StrLen = Marshal.SizeOf(typeof(DroneData.DataPos));
}
public struct DataMotor4
{
public DataHead Head;
public ulong Count;
public float UL, UR, DL, DR;
static public int StrLen = Marshal.SizeOf(typeof(DroneData.DataMotor4));
@ -93,6 +59,7 @@ namespace DroneData
public struct DataMotor6
{
public DataHead Head;
public ulong Count;
public float UL, UR, LL, RR, DL, DR;
static public int StrLen = Marshal.SizeOf(typeof(DroneData.DataMotor6));

View File

@ -65,9 +65,6 @@
label_Pow = new Label();
button_ML = new Button();
button_MR = new Button();
label_time_acc = new Label();
label_time_range = new Label();
label_time_gyr = new Label();
groupBox1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)numericUpDown_Server_Port).BeginInit();
groupBox2.SuspendLayout();
@ -159,7 +156,6 @@
//
// groupBox2
//
groupBox2.Controls.Add(label_time_acc);
groupBox2.Controls.Add(label_Acc_Z);
groupBox2.Controls.Add(label7);
groupBox2.Controls.Add(label_Acc_Y);
@ -168,7 +164,7 @@
groupBox2.Controls.Add(label1);
groupBox2.Location = new Point(6, 86);
groupBox2.Name = "groupBox2";
groupBox2.Size = new Size(78, 118);
groupBox2.Size = new Size(78, 100);
groupBox2.TabIndex = 5;
groupBox2.TabStop = false;
groupBox2.Text = "Acc";
@ -220,7 +216,6 @@
//
// groupBox3
//
groupBox3.Controls.Add(label_time_gyr);
groupBox3.Controls.Add(label_Gyr_Z);
groupBox3.Controls.Add(label9);
groupBox3.Controls.Add(label_Gyr_Y);
@ -229,7 +224,7 @@
groupBox3.Controls.Add(label13);
groupBox3.Location = new Point(95, 86);
groupBox3.Name = "groupBox3";
groupBox3.Size = new Size(78, 118);
groupBox3.Size = new Size(78, 100);
groupBox3.TabIndex = 6;
groupBox3.TabStop = false;
groupBox3.Text = "Gyr";
@ -290,7 +285,6 @@
//
// groupBox4
//
groupBox4.Controls.Add(label_time_range);
groupBox4.Controls.Add(label_Pos_L);
groupBox4.Controls.Add(label6);
groupBox4.Controls.Add(label_Pos_Y);
@ -299,7 +293,7 @@
groupBox4.Controls.Add(label14);
groupBox4.Location = new Point(188, 86);
groupBox4.Name = "groupBox4";
groupBox4.Size = new Size(78, 118);
groupBox4.Size = new Size(78, 100);
groupBox4.TabIndex = 7;
groupBox4.TabStop = false;
groupBox4.Text = "Pos";
@ -443,33 +437,6 @@
button_MR.MouseDown += button_UU_MouseDown;
button_MR.MouseUp += button_UU_MouseUp;
//
// label_time_acc
//
label_time_acc.AutoSize = true;
label_time_acc.Location = new Point(6, 100);
label_time_acc.Name = "label_time_acc";
label_time_acc.Size = new Size(13, 15);
label_time_acc.TabIndex = 25;
label_time_acc.Text = "0";
//
// label_time_range
//
label_time_range.AutoSize = true;
label_time_range.Location = new Point(6, 100);
label_time_range.Name = "label_time_range";
label_time_range.Size = new Size(13, 15);
label_time_range.TabIndex = 27;
label_time_range.Text = "0";
//
// label_time_gyr
//
label_time_gyr.AutoSize = true;
label_time_gyr.Location = new Point(3, 100);
label_time_gyr.Name = "label_time_gyr";
label_time_gyr.Size = new Size(13, 15);
label_time_gyr.TabIndex = 26;
label_time_gyr.Text = "0";
//
// Form_Main
//
AutoScaleDimensions = new SizeF(7F, 15F);
@ -542,9 +509,5 @@
private Label label_Pow;
private Button button_ML;
private Button button_MR;
private Label label4;
private Label label_time_acc;
private Label label_time_range;
private Label label_time_gyr;
}
}

View File

@ -95,20 +95,14 @@ namespace DroneSimulator
label_Acc_Y.Text = dataDrone.AccY.ToString();
label_Acc_Z.Text = dataDrone.AccZ.ToString();
label_time_acc.Text = dataDrone.TimeAcc.ToString();
label_Gyr_X.Text = dataDrone.GyrX.ToString();
label_Gyr_Y.Text = dataDrone.GyrY.ToString();
label_Gyr_Z.Text = dataDrone.GyrZ.ToString();
label_time_gyr.Text = dataDrone.TimeGyr.ToString();
label_Pos_X.Text = dataDrone.PosX.ToString();
label_Pos_Y.Text = dataDrone.PosY.ToString();
label_Pos_L.Text = dataDrone.LaserRange.ToString();
label_time_range.Text = dataDrone.TimeRange.ToString();
netClient.SendData(dataDrone.SendReqest());
}

View File

@ -1,255 +0,0 @@
#include "Drone.h"
namespace DroneClient {
// Реализация статического метода GetBytes
array<Byte>^ Drone::GetBytes(Object^ data)
{
int size = Marshal::SizeOf(data);
array<Byte>^ arr = gcnew array<Byte>(size);
IntPtr ptr = IntPtr::Zero;
try
{
ptr = Marshal::AllocHGlobal(size);
Marshal::StructureToPtr(data, ptr, true);
Marshal::Copy(ptr, arr, 0, size);
}
finally
{
Marshal::FreeHGlobal(ptr);
}
return arr;
}
// Реализация статического метода FromBytes
Object^ Drone::FromBytes(array<Byte>^ arr, Type^ type)
{
Object^ mem = gcnew Object();
int size = Marshal::SizeOf(type);
IntPtr ptr = IntPtr::Zero;
try
{
ptr = Marshal::AllocHGlobal(size);
Marshal::Copy(arr, 0, ptr, size);
mem = Marshal::PtrToStructure(ptr, type);
}
finally
{
Marshal::FreeHGlobal(ptr);
}
return mem;
}
// Реализация приватного метода SendDataMotor4
array<Byte>^ Drone::SendDataMotor4()
{
DroneData::DataMotor4 mot4;
mot4.Head.Size = Marshal::SizeOf(DroneData::DataMotor4::typeid);
mot4.Head.Mode = DroneData::DataMode::Response;
mot4.Head.Type = DroneData::DataType::DataMotor4;
mot4.UL = MotorUL;
mot4.UR = MotorUR;
mot4.DL = MotorDL;
mot4.DR = MotorDR;
return GetBytes(mot4);
}
array<Byte>^ Drone::RecvDataAcc(array<Byte>^ data)
{
DroneData::DataAcc imu = (DroneData::DataAcc)FromBytes(data, DroneData::DataAcc::typeid);
AccX = imu.Acc.X; AccY = imu.Acc.Y; AccZ = imu.Acc.Z;
TimeAcc = imu.Time;
return gcnew array<Byte>(0);
}
array<Byte>^ Drone::RecvDataGyr(array<Byte>^ data)
{
DroneData::DataGyr imu = (DroneData::DataGyr)FromBytes(data, DroneData::DataGyr::typeid);
GyrX = imu.Gyr.X; GyrY = imu.Gyr.Y; GyrZ = imu.Gyr.Z;
TimeGyr = imu.Time;
return gcnew array<Byte>(0);
}
array<Byte>^ Drone::RecvDataRange(array<Byte>^ data)
{
DroneData::DataRange pos = (DroneData::DataRange)FromBytes(data, DroneData::DataRange::typeid);
LaserRange = pos.LiDAR;
TimeRange = pos.Time;
return gcnew array<Byte>(0);
}
array<Byte>^ Drone::RecvDataLocal(array<Byte>^ data)
{
DroneData::DataLocal pos = (DroneData::DataLocal)FromBytes(data, DroneData::DataLocal::typeid);
PosX = pos.Local.X; PosY = pos.Local.Y;
return gcnew array<Byte>(0);
}
array<Byte>^ Drone::ClientRequestResponse(DroneData::DataHead head, array<Byte>^ body)
{
array<Byte>^ zero = gcnew array<Byte>(0);
switch (head.Type)
{
case DroneData::DataType::DataAcc:
if (head.Mode == DroneData::DataMode::Request)
{
return zero; // Запрос данных (не реализовано)
}
else
{
return RecvDataAcc(body); // Пришли данные
}
case DroneData::DataType::DataGyr:
if (head.Mode == DroneData::DataMode::Request)
{
return zero; // Запрос данных (не реализовано)
}
else
{
return RecvDataGyr(body); // Пришли данные
}
case DroneData::DataType::DataRange:
if (head.Mode == DroneData::DataMode::Request)
{
return zero; // Запрос данных (не реализовано)
}
else
{
return RecvDataRange(body); // Пришли данные
}
case DroneData::DataType::DataLocal:
if (head.Mode == DroneData::DataMode::Request)
{
return zero; // Запрос данных (не реализовано)
}
else
{
return RecvDataLocal(body); // Пришли данные
}
case DroneData::DataType::DataMotor4:
if (head.Mode == DroneData::DataMode::Request)
{
return SendDataMotor4(); // Запрос данных
}
else
{
return zero; // Пришли данные (не реализовано)
}
}
return zero;
}
// Реализация конструктора
Drone::Drone()
{
DroneStreamData = gcnew array<Byte>(DroneStreamCount); // Инициализация массива
DroneStreamIndex = 0;
DroneStreamHead.Mode = DroneData::DataMode::None;
DroneStreamHead.Size = 0;
DroneStreamHead.Type = DroneData::DataType::None;
}
// Реализация метода DataStream
List<array<Byte>^>^ Drone::DataStream(array<Byte>^ data, int size)
{
System::Collections::Generic::List<array<Byte>^>^ ret = gcnew System::Collections::Generic::List<array<Byte>^>();
if (data == nullptr) return ret; // Последовательность не сформирована
if (size + DroneStreamIndex > DroneStreamCount) return nullptr; // Ошибка переполнения
Array::Copy(data, 0, DroneStreamData, DroneStreamIndex, size);
DroneStreamIndex += size;
while (true)
{
if (DroneStreamHead.Size == 0) // Заголовок еще не получен
{
if (DroneStreamIndex < DroneData::DataHead::StrLen) return ret;
DroneStreamHead = (DroneData::DataHead)FromBytes(DroneStreamData, DroneData::DataHead::typeid);
}
if (DroneStreamHead.Size > DroneStreamIndex) break; // Пакет еще не полный
array<Byte>^ body = gcnew array<Byte>(DroneStreamHead.Size);
Array::Copy(DroneStreamData, 0, body, 0, DroneStreamHead.Size);
int shift = DroneStreamHead.Size;
DroneStreamIndex -= shift;
Array::Copy(DroneStreamData, shift, DroneStreamData, 0, DroneStreamIndex); // Сдвиг массива
DroneStreamHead.Size = 0; // Сброс заголовка
ret->Add(ClientRequestResponse(DroneStreamHead, body));
}
return ret;
}
// Реализация метода SendRequest
array<Byte>^ Drone::SendRequest()
{
DroneData::DataHead^ acc = gcnew DroneData::DataHead();
acc->Size = DroneData::DataHead::StrLen;
acc->Mode = DroneData::DataMode::Request;
acc->Type = DroneData::DataType::DataAcc;
DroneData::DataHead^ gyr = gcnew DroneData::DataHead();
gyr->Size = DroneData::DataHead::StrLen;
gyr->Mode = DroneData::DataMode::Request;
gyr->Type = DroneData::DataType::DataGyr;
DroneData::DataHead^ range = gcnew DroneData::DataHead();
range->Size = DroneData::DataHead::StrLen;
range->Mode = DroneData::DataMode::Request;
range->Type = DroneData::DataType::DataRange;
DroneData::DataHead^ local = gcnew DroneData::DataHead();
local->Size = DroneData::DataHead::StrLen;
local->Mode = DroneData::DataMode::Request;
local->Type = DroneData::DataType::DataLocal;
List<array<byte>^>^ list = gcnew List<array<byte>^>();
list->Add(GetBytes(acc));
list->Add(GetBytes(gyr));
list->Add(GetBytes(range));
list->Add(GetBytes(local));
list->Add(SendDataMotor4());
int count = 0;
for each(array<byte>^ d in list) count += d->Length;
array<byte>^ send = gcnew array<byte>(count);
count = 0;
for each (array<byte> ^ d in list)
{
d->CopyTo(send, count);
count += d->Length;
}
return send;
}
}

View File

@ -1,51 +0,0 @@
#pragma once
#include "DroneData.h"
#include <Windows.h>
#include <vcclr.h>
#using <System.dll>
#using <mscorlib.dll>
using namespace System;
using namespace System::Collections::Generic;
using namespace System::Runtime::InteropServices;
namespace DroneClient {
public ref class Drone
{
public:
float AccX, AccY, AccZ;
float GyrX, GyrY, GyrZ;
unsigned int TimeAcc, TimeGyr;
float PosX, PosY;
float LaserRange;
unsigned int TimeRange;
float MotorUL, MotorUR, MotorDL, MotorDR;
static array<Byte>^ GetBytes(Object^ data);
static Object^ FromBytes(array<Byte>^ arr, Type^ type);
private:
array<Byte>^ SendDataMotor4();
array<Byte>^ RecvDataAcc(array<Byte>^ data);
array<Byte>^ RecvDataGyr(array<Byte>^ data);
array<Byte>^ RecvDataRange(array<Byte>^ data);
array<Byte>^ RecvDataLocal(array<Byte>^ data);
array<Byte>^ ClientRequestResponse(DroneData::DataHead head, array<Byte>^ body);
literal int DroneStreamCount = 512;
array<Byte>^ DroneStreamData;
int DroneStreamIndex;
DroneData::DataHead DroneStreamHead;
public:
Drone(); // Конструктор для инициализации
System::Collections::Generic::List<array<Byte>^>^ DataStream(array<Byte>^ data, int size);
array<Byte>^ SendRequest();
};
}

View File

@ -5,6 +5,8 @@ VisualStudioVersion = 17.12.35527.113
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DroneClientCpp", "DroneClientCpp.vcxproj", "{690C304C-A70B-4B0F-BF61-8C51290BF444}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestClientConnection", "..\TestClientConnection\TestClientConnection.vcxproj", "{B7CC5245-B628-40E9-A9A0-A904E2BF25EA}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
@ -21,6 +23,14 @@ Global
{690C304C-A70B-4B0F-BF61-8C51290BF444}.Release|x64.Build.0 = Release|x64
{690C304C-A70B-4B0F-BF61-8C51290BF444}.Release|x86.ActiveCfg = Release|Win32
{690C304C-A70B-4B0F-BF61-8C51290BF444}.Release|x86.Build.0 = Release|Win32
{B7CC5245-B628-40E9-A9A0-A904E2BF25EA}.Debug|x64.ActiveCfg = Debug|x64
{B7CC5245-B628-40E9-A9A0-A904E2BF25EA}.Debug|x64.Build.0 = Debug|x64
{B7CC5245-B628-40E9-A9A0-A904E2BF25EA}.Debug|x86.ActiveCfg = Debug|Win32
{B7CC5245-B628-40E9-A9A0-A904E2BF25EA}.Debug|x86.Build.0 = Debug|Win32
{B7CC5245-B628-40E9-A9A0-A904E2BF25EA}.Release|x64.ActiveCfg = Release|x64
{B7CC5245-B628-40E9-A9A0-A904E2BF25EA}.Release|x64.Build.0 = Release|x64
{B7CC5245-B628-40E9-A9A0-A904E2BF25EA}.Release|x86.ActiveCfg = Release|Win32
{B7CC5245-B628-40E9-A9A0-A904E2BF25EA}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@ -118,13 +118,10 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="Drone.cpp" />
<ClCompile Include="FormMain.cpp" />
<ClCompile Include="NetClient.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="Drone.h" />
<ClInclude Include="DroneData.h" />
<ClInclude Include="DroneClient.h" />
<ClInclude Include="FormMain.h">
<FileType>CppForm</FileType>
</ClInclude>

View File

@ -18,12 +18,6 @@
<ClCompile Include="FormMain.cpp">
<Filter>Исходные файлы</Filter>
</ClCompile>
<ClCompile Include="NetClient.cpp">
<Filter>Исходные файлы</Filter>
</ClCompile>
<ClCompile Include="Drone.cpp">
<Filter>Исходные файлы</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="FormMain.h">
@ -32,10 +26,7 @@
<ClInclude Include="NetClient.h">
<Filter>Файлы заголовков</Filter>
</ClInclude>
<ClInclude Include="DroneData.h">
<Filter>Файлы заголовков</Filter>
</ClInclude>
<ClInclude Include="Drone.h">
<ClInclude Include="DroneClient.h">
<Filter>Файлы заголовков</Filter>
</ClInclude>
</ItemGroup>

View File

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup />
</Project>

View File

@ -0,0 +1,2 @@
#using <mscorlib.dll>
[assembly: System::Runtime::Versioning::TargetFrameworkAttribute(L".NETFramework,Version=v4.7.2", FrameworkDisplayName=L".NET Framework 4.7.2")];

View File

@ -1,117 +0,0 @@
#pragma once
#include <Windows.h>
#include <vcclr.h>
using namespace System;
using namespace System::Runtime::InteropServices;
namespace DroneData {
public enum class DataMode : unsigned short
{
None = 0, Response = 1, Request = 2
};
public enum class DataType : unsigned short
{
None = 0, Head = 1,
// Output
DataAcc = 1001, DataGyr = 1002, DataMag = 1003, DataRange = 1004, DataLocal = 1005,
// Input
DataMotor4 = 2001, DataMotor6 = 2002
};
public value struct DataHead
{
public:
long Size;
DataMode Mode;
DataType Type;
unsigned long Time;
static const int StrLen = sizeof(DataHead);
};
public value struct XYZ
{
public:
float X, Y, Z;
};
public value struct DataAcc
{
public:
DataHead Head;
XYZ Acc;
unsigned long Time;
static const int StrLen = sizeof(DataAcc);
};
public value struct DataGyr
{
public:
DataHead Head;
XYZ Gyr;
unsigned long Time;
static const int StrLen = sizeof(DataGyr);
};
public value struct DataMag
{
public:
DataHead Head;
XYZ Mag;
unsigned long Time;
static const int StrLen = sizeof(DataMag);
};
public value struct DataRange
{
public:
DataHead Head;
float LiDAR;
unsigned long Time;
static const int StrLen = sizeof(DataRange);
};
public value struct DataLocal
{
public:
DataHead Head;
XYZ Local;
unsigned long Time;
static const int StrLen = sizeof(DataLocal);
};
public value struct DataMotor4
{
public:
DataHead Head;
float UL, UR, DL, DR;
static const int StrLen = sizeof(DataMotor4);
};
public value struct DataMotor6
{
public:
DataHead Head;
float UL, UR, LL, RR, DL, DR;
static const int StrLen = sizeof(DataMotor6);
};
}

Binary file not shown.

View File

@ -1,105 +0,0 @@
#include "NetClient.h"
namespace DroneSimulator {
// Конструктор ConnectData
NetClient::ConnectData::ConnectData(bool connect, Socket^ server)
{
Connect = connect;
Server = server;
}
// Конструктор ReceiveData
NetClient::ReceiveData::ReceiveData(array<Byte>^ buffer, int size, Socket^ server)
{
Buffer = buffer;
Size = size;
Server = server;
}
// Конструктор NetClient
NetClient::NetClient()
{
Connected = false;
ServerSocket = nullptr;
DataServer = gcnew ServerData(); // Инициализация DataServer
}
// Реализация метода Connect
NetClient::ClientState NetClient::Connect(String^ Addr, int Port, ClientCallback^ Connection, ClientCallback^ Receive)
{
if (Connected)
{
Close();
return ClientState::Stop;
}
ConnectionCallback = Connection;
ReceiveCallback = Receive;
IPEndPoint^ ep = gcnew IPEndPoint(IPAddress::Parse(Addr), Port);
ServerSocket = gcnew Socket(AddressFamily::InterNetwork, SocketType::Stream, ProtocolType::Tcp);
try { if (ServerSocket) ServerSocket->Connect(ep); }
catch (...) { ServerSocket->Close(); return ClientState::Error; }
Connected = true;
ConnectionCallback(gcnew ConnectData(true, ServerSocket));
ReceiveData^ receiveData = gcnew ReceiveData(DataServer->buffer, ServerData::size, ServerSocket);
try { if (ServerSocket) ServerSocket->BeginReceive(DataServer->buffer, 0, ServerData::size, SocketFlags::None, gcnew AsyncCallback(this, &NetClient::ReadCallback), receiveData); }
catch (...) {}
return ClientState::Connected;
}
// Реализация метода Close
void NetClient::Close()
{
try { if(ServerSocket) ServerSocket->Shutdown(SocketShutdown::Both); }
catch (...) {}
if(ServerSocket) ServerSocket->Close();
Connected = false;
}
// Реализация метода Send
void NetClient::Send(array<Byte>^ data)
{
if (ServerSocket != nullptr && Connected)
{
try { if (ServerSocket) ServerSocket->Send(data); }
catch (...) {}
}
}
// Реализация метода ReadCallback
void NetClient::ReadCallback(IAsyncResult^ ar)
{
ReceiveData^ cd = (ReceiveData^)ar->AsyncState;
if (cd == nullptr) return;
int bytes = 0;
try { bytes = ServerSocket->EndReceive(ar); }
catch (...) {}
if (bytes == 0)
{
if (ServerSocket) ServerSocket->Close();
Connected = false;
if (ServerSocket != nullptr)
{
ConnectionCallback(gcnew ConnectData(false, nullptr));
}
return;
}
ReceiveCallback(gcnew ReceiveData(cd->Buffer, bytes, ServerSocket));
try { if (ServerSocket) ServerSocket->BeginReceive(cd->Buffer, 0, ServerData::size, SocketFlags::None, gcnew AsyncCallback(this, &NetClient::ReadCallback), cd); }
catch (...) {}
}
}

View File

@ -1,4 +1,5 @@
#pragma once
// NetClient.h
#pragma once
#include <Windows.h>
#include <vcclr.h>
@ -9,60 +10,247 @@
using namespace System;
using namespace System::Net;
using namespace System::Net::Sockets;
using namespace System::Runtime::InteropServices;
namespace DroneSimulator {
namespace DroneSimulator
{
public ref class NetClient
{
public:
// Вложенный класс для данных подключения
ref class ConnectData
{
public:
bool Connect;
Socket^ Server;
ConnectData(bool connect, Socket^ server);
property bool Connect;
property Socket^ Server;
};
// Вложенный класс для данных приема
ref class ReceiveData
{
public:
array<Byte>^ Buffer;
int Size;
Socket^ Server;
ReceiveData(array<Byte>^ buffer, int size, Socket^ server);
property array<Byte>^ Buffer;
property int Size;
property Socket^ Server;
};
// Состояния клиента
enum class ClientState { Error, Connected, Stop };
// Делегат для callback-функций
delegate void ClientCallback(Object^ o);
NetClient()
{
Connected = false;
ServerSocket = nullptr;
DataServer = gcnew ServerData();
}
~NetClient()
{
// Вызываем Close() для корректного закрытия соединения
Close();
// Дополнительная очистка ресурсов
if (DataServer != nullptr)
{
// Очищаем буфер данных
DataServer->buffer = nullptr;
DataServer = nullptr;
}
// Обнуляем callback-делегаты
ConnectionCallback = nullptr;
ReceiveCallback = nullptr;
}
ClientState Connect(String^ addr, int port, ClientCallback^ connectionCallback, ClientCallback^ receiveCallback)
{
if (Connected)
{
Disconnect();
return ClientState::Stop;
}
ConnectionCallback = connectionCallback;
ReceiveCallback = receiveCallback;
try
{
IPEndPoint^ ep = gcnew IPEndPoint(IPAddress::Parse(addr), port);
ServerSocket = gcnew Socket(AddressFamily::InterNetwork, SocketType::Stream, ProtocolType::Tcp);
ServerSocket->Connect(ep);
Connected = true;
// Уведомление о подключении
ConnectData^ connectData = gcnew ConnectData();
connectData->Connect = true;
connectData->Server = ServerSocket;
ConnectionCallback(connectData);
// Начало приема данных
ReceiveData^ receiveData = gcnew ReceiveData();
receiveData->Buffer = DataServer->buffer;
receiveData->Size = ServerData::size;
receiveData->Server = ServerSocket;
ServerSocket->BeginReceive(DataServer->buffer, 0, ServerData::size, SocketFlags::None, gcnew AsyncCallback(this, &NetClient::ReadCallback), receiveData);
return ClientState::Connected;
}
catch (Exception^)
{
if (ServerSocket != nullptr)
{
ServerSocket->Close();
}
return ClientState::Error;
}
}
void Close()
{
Disconnect();
}
private:
ref class ServerData
{
public:
literal int size = 1024;
static const int size = 1024;
array<Byte>^ buffer = gcnew array<Byte>(size);
};
bool Connected;
Socket^ ServerSocket;
ServerData^ DataServer;
public:
delegate void ClientCallback(Object^ o);
private:
ClientCallback^ ConnectionCallback;
ClientCallback^ ReceiveCallback;
public:
NetClient(); // Добавлен конструктор
void Disconnect()
{
if (ServerSocket != nullptr)
{
try { ServerSocket->Shutdown(SocketShutdown::Both); }
catch (...) {}
ServerSocket->Close();
ServerSocket = nullptr;
}
Connected = false;
}
enum class ClientState { Error, Connected, Stop };
void ReadCallback(IAsyncResult^ ar)
{
try
{
// Проверка на null входного параметра
if (ar == nullptr) return;
ClientState Connect(String^ Addr, int Port, ClientCallback^ Connection, ClientCallback^ Receive);
void Close();
void Send(array<Byte>^ data);
// Безопасное приведение типа
ReceiveData^ cd = dynamic_cast<ReceiveData^>(ar->AsyncState);
if (cd == nullptr || ServerSocket == nullptr || !ServerSocket->Connected)
{
Disconnect();
return;
}
private:
void ReadCallback(IAsyncResult^ ar);
int bytes = 0;
try
{
bytes = ServerSocket->EndReceive(ar);
}
catch (ObjectDisposedException^)
{
// Сокет был закрыт
Disconnect();
return;
}
catch (SocketException^ ex)
{
// Логирование ошибки сокета
System::Diagnostics::Debug::WriteLine(
"Socket receive error: " + ex->Message);
Disconnect();
return;
}
catch (...)
{
Disconnect();
return;
}
// Проверка на разрыв соединения
if (bytes == 0)
{
Disconnect();
if (ConnectionCallback != nullptr)
{
ConnectData^ disconnectData = gcnew ConnectData();
disconnectData->Connect = false;
disconnectData->Server = nullptr;
ConnectionCallback(disconnectData);
}
return;
}
// Вызов callback получения данных
if (ReceiveCallback != nullptr && cd->Buffer != nullptr)
{
try
{
ReceiveCallback(cd);
}
catch (Exception^ ex)
{
System::Diagnostics::Debug::WriteLine(
"ReceiveCallback error: " + ex->Message);
}
}
// Продолжаем прием данных
if (ServerSocket != nullptr && ServerSocket->Connected)
{
try
{
IAsyncResult^ result = ServerSocket->BeginReceive(
cd->Buffer,
0,
ServerData::size,
SocketFlags::None,
gcnew AsyncCallback(this, &NetClient::ReadCallback),
cd);
// Проверка на ошибку асинхронной операции
if (result == nullptr)
{
Disconnect();
}
}
catch (ObjectDisposedException^)
{
Disconnect();
}
catch (SocketException^ ex)
{
System::Diagnostics::Debug::WriteLine(
"BeginReceive error: " + ex->Message);
Disconnect();
}
catch (...)
{
Disconnect();
}
}
}
catch (Exception^ ex)
{
System::Diagnostics::Debug::WriteLine(
"ReadCallback general error: " + ex->Message);
Disconnect();
}
}
};
}

View File

@ -21,8 +21,6 @@ namespace DroneSimulator
public Vector3 Acc, Gyr; // Имитация: Акселерометр, Гироскоп
public float LaserRange; // Имитация: Дальномер
private uint DataTimer;
private const float Gravity = 9.8f;
private const float TO_GRAD = 180 / MathF.PI;
@ -74,6 +72,33 @@ namespace DroneSimulator
return mem;
}
/*public struct DataOut
{
public float AccX, AccY, AccZ;
public float GyrX, GyrY, GyrZ;
public float PosX, PosY;
public float LaserRange;
}
public DataOut GetDataOut()
{
DataOut data = new DataOut();
data.AccX = Acc.X; data.AccY = Acc.Y; data.AccZ = Acc.Z;
data.GyrX = Gyr.X; data.GyrY = Gyr.Y; data.GyrZ = Gyr.Z;
data.PosX = PosXYZ.X; data.PosY = PosXYZ.Y;
data.LaserRange = LaserRange;
return data;
}
public struct DataIn
{
public float MotorUL, MotorUR, MotorDL, MotorDR;
}*/
public struct DataVisual
{
public int ID; // Идентификатор
@ -239,8 +264,6 @@ namespace DroneSimulator
if (tilt < 90 && ori.W > 0) LaserRange = PosXYZ.Z / MathF.Cos(tilt);
else LaserRange = float.MaxValue;
}
DataTimer = (uint)tick;
}
private float Range(float pow)
@ -269,79 +292,33 @@ namespace DroneSimulator
SetQadroPow(mot.UL, mot.UR, mot.DL, mot.DR);
}
private byte[] SendDataAcc()
private byte[] SendDataIMU()
{
DroneData.DataAcc acc = new DroneData.DataAcc();
DroneData.DataIMU imu = new DroneData.DataIMU();
acc.Head.Size = Marshal.SizeOf(typeof(DroneData.DataAcc));
acc.Head.Mode = DroneData.DataMode.Response;
acc.Head.Type = DroneData.DataType.DataAcc;
acc.Head.Time = (uint)Environment.TickCount;
imu.Head.Size = Marshal.SizeOf(typeof(DroneData.DataIMU));
imu.Head.Mode = DroneData.DataMode.Response;
imu.Head.Type = DroneData.DataType.DataIMU;
acc.Acc.X = Acc.X; acc.Acc.Y = Acc.Y; acc.Acc.Z = Acc.Z;
acc.Time = DataTimer;
imu.Acc.X = Acc.X; imu.Acc.Y = Acc.Y; imu.Acc.Z = Acc.Z;
imu.Gyr.X = Gyr.X; imu.Gyr.Y = Gyr.Y; imu.Gyr.Z = Gyr.Z;
imu.Mag.X = 0; imu.Mag.Y = 0; imu.Mag.Z = 0;
return getBytes(acc);
return getBytes(imu);
}
private byte[] SendDataGyr()
private byte[] SendDataPos()
{
DroneData.DataGyr gyr = new DroneData.DataGyr();
DroneData.DataPos pos = new DroneData.DataPos();
gyr.Head.Size = Marshal.SizeOf(typeof(DroneData.DataGyr));
gyr.Head.Mode = DroneData.DataMode.Response;
gyr.Head.Type = DroneData.DataType.DataGyr;
gyr.Head.Time = (uint)Environment.TickCount;
pos.Head.Size = Marshal.SizeOf(typeof(DroneData.DataPos));
pos.Head.Mode = DroneData.DataMode.Response;
pos.Head.Type = DroneData.DataType.DataPos;
gyr.Gyr.X = Gyr.X; gyr.Gyr.Y = Gyr.Y; gyr.Gyr.Z = Gyr.Z;
gyr.Time = DataTimer;
pos.Local.X = PosXYZ.X; pos.Local.Y = PosXYZ.Y; pos.Local.Z = PosXYZ.Z;
pos.LiDAR = LaserRange;
return getBytes(gyr);
}
private byte[] SendDataMag()
{
DroneData.DataMag mag = new DroneData.DataMag();
mag.Head.Size = Marshal.SizeOf(typeof(DroneData.DataMag));
mag.Head.Mode = DroneData.DataMode.Response;
mag.Head.Type = DroneData.DataType.DataMag;
mag.Head.Time = (uint)Environment.TickCount;
mag.Mag.X = 0; mag.Mag.Y = 0; mag.Mag.Z = 0;
mag.Time = DataTimer;
return getBytes(mag);
}
private byte[] SendDataRange()
{
DroneData.DataRange range = new DroneData.DataRange();
range.Head.Size = Marshal.SizeOf(typeof(DroneData.DataRange));
range.Head.Mode = DroneData.DataMode.Response;
range.Head.Type = DroneData.DataType.DataRange;
range.Head.Time = (uint)Environment.TickCount;
range.LiDAR = LaserRange;
range.Time = DataTimer;
return getBytes(range);
}
private byte[] SendDataLocal()
{
DroneData.DataLocal local = new DroneData.DataLocal();
local.Head.Size = Marshal.SizeOf(typeof(DroneData.DataLocal));
local.Head.Mode = DroneData.DataMode.Response;
local.Head.Type = DroneData.DataType.DataLocal;
local.Head.Time = (uint)Environment.TickCount;
local.Local.X = PosXYZ.X; local.Local.Y = PosXYZ.Y; local.Local.Z = PosXYZ.Z;
local.Time = DataTimer;
return getBytes(local);
return getBytes(pos);
}
private byte[]? ServerRequestResponse(DroneData.DataHead head, byte[] body)
@ -350,12 +327,12 @@ namespace DroneSimulator
switch (head.Type)
{
case DroneData.DataType.DataAcc:
case DroneData.DataType.DataIMU:
{
if (head.Mode == DroneData.DataMode.Request)
{
// Запрос данных
return SendDataAcc();
return SendDataIMU();
}
else
{
@ -366,60 +343,12 @@ namespace DroneSimulator
}
}
case DroneData.DataType.DataGyr:
case DroneData.DataType.DataPos:
{
if (head.Mode == DroneData.DataMode.Request)
{
// Запрос данных
return SendDataGyr();
}
else
{
// Пришли данные
// ... //
//
return zero;
}
}
case DroneData.DataType.DataMag:
{
if (head.Mode == DroneData.DataMode.Request)
{
// Запрос данных
return SendDataMag();
}
else
{
// Пришли данные
// ... //
//
return zero;
}
}
case DroneData.DataType.DataRange:
{
if (head.Mode == DroneData.DataMode.Request)
{
// Запрос данных
return SendDataRange();
}
else
{
// Пришли данные
// ... //
//
return zero;
}
}
case DroneData.DataType.DataLocal:
{
if (head.Mode == DroneData.DataMode.Request)
{
// Запрос данных
return SendDataLocal();
return SendDataPos();
}
else
{

View File

@ -12,7 +12,7 @@ namespace DroneData
None = 0, Head = 1,
// Output
DataAcc = 1001, DataGyr = 1002, DataMag = 1003, DataRange = 1004, DataLocal = 1005,
DataIMU = 1001, DataPos = 1002,
// Input
DataMotor4 = 2001, DataMotor6 = 2002
@ -25,66 +25,32 @@ namespace DroneData
public DataMode Mode;
public DataType Type;
public uint Time; // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
static public int StrLen = Marshal.SizeOf(typeof(DroneData.DataHead));
}
public struct XYZ { public float X, Y, Z; }
public struct DataAcc
public struct DataIMU
{
public DataHead Head;
public XYZ Acc;
public XYZ Acc, Gyr, Mag;
public uint Time; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static public int StrLen = Marshal.SizeOf(typeof(DroneData.DataAcc));
static public int StrLen = Marshal.SizeOf(typeof(DroneData.DataIMU));
}
public struct DataGyr
{
public DataHead Head;
public XYZ Gyr;
public uint Time; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static public int StrLen = Marshal.SizeOf(typeof(DroneData.DataGyr));
}
public struct DataMag
{
public DataHead Head;
public XYZ Mag;
public uint Time; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static public int StrLen = Marshal.SizeOf(typeof(DroneData.DataMag));
}
public struct DataLocal
public struct DataPos
{
public DataHead Head;
public XYZ Local; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
public uint Time; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static public int StrLen = Marshal.SizeOf(typeof(DroneData.DataLocal));
}
public struct DataRange
{
public DataHead Head;
public float LiDAR; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
public uint Time; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static public int StrLen = Marshal.SizeOf(typeof(DroneData.DataRange));
static public int StrLen = Marshal.SizeOf(typeof(DroneData.DataPos));
}
public struct DataMotor4
{
public DataHead Head;
public ulong Count;
public float UL, UR, DL, DR;
static public int StrLen = Marshal.SizeOf(typeof(DroneData.DataMotor4));
@ -93,6 +59,7 @@ namespace DroneData
public struct DataMotor6
{
public DataHead Head;
public ulong Count;
public float UL, UR, LL, RR, DL, DR;
static public int StrLen = Marshal.SizeOf(typeof(DroneData.DataMotor6));

View File

@ -61,37 +61,6 @@
comboBox_Drone_Rotor = new ComboBox();
comboBox_Drone = new ComboBox();
timer_Test = new System.Windows.Forms.Timer(components);
textBox_GPS_Lat = new TextBox();
label2 = new Label();
groupBox_GPS = new GroupBox();
textBox_GPS_Lon = new TextBox();
label4 = new Label();
numericUpDown_GPS_Freq = new NumericUpDown();
label_GPS_Frequency = new Label();
label6 = new Label();
groupBox_Barometer = new GroupBox();
numericUpDown_Bar_Freq = new NumericUpDown();
label5 = new Label();
label7 = new Label();
label8 = new Label();
numericUpDown_Bar_Accur = new NumericUpDown();
label9 = new Label();
label10 = new Label();
textBox_GPS_Accur = new NumericUpDown();
label11 = new Label();
groupBox1 = new GroupBox();
label12 = new Label();
numericUpDown_OF_Accur = new NumericUpDown();
label13 = new Label();
numericUpDown_OF_Freq = new NumericUpDown();
label14 = new Label();
label15 = new Label();
checkBox_GPS_Enable = new CheckBox();
label16 = new Label();
numericUpDown1 = new NumericUpDown();
label17 = new Label();
checkBox_OF_Enable = new CheckBox();
checkBox_Bar_Enable = new CheckBox();
menuStrip_Menu.SuspendLayout();
groupBox_Screen.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBox_2D).BeginInit();
@ -103,19 +72,8 @@
groupBox_Clients.SuspendLayout();
((System.ComponentModel.ISupportInitialize)numericUpDown_Clients_Limit).BeginInit();
((System.ComponentModel.ISupportInitialize)numericUpDown_Clients_Port).BeginInit();
tabPage_Model.SuspendLayout();
groupBox_Navi.SuspendLayout();
panel1.SuspendLayout();
groupBox_GPS.SuspendLayout();
((System.ComponentModel.ISupportInitialize)numericUpDown_GPS_Freq).BeginInit();
groupBox_Barometer.SuspendLayout();
((System.ComponentModel.ISupportInitialize)numericUpDown_Bar_Freq).BeginInit();
((System.ComponentModel.ISupportInitialize)numericUpDown_Bar_Accur).BeginInit();
((System.ComponentModel.ISupportInitialize)textBox_GPS_Accur).BeginInit();
groupBox1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)numericUpDown_OF_Accur).BeginInit();
((System.ComponentModel.ISupportInitialize)numericUpDown_OF_Freq).BeginInit();
((System.ComponentModel.ISupportInitialize)numericUpDown1).BeginInit();
SuspendLayout();
//
// menuStrip_Menu
@ -368,9 +326,6 @@
//
// tabPage_Model
//
tabPage_Model.Controls.Add(groupBox1);
tabPage_Model.Controls.Add(groupBox_Barometer);
tabPage_Model.Controls.Add(groupBox_GPS);
tabPage_Model.Location = new Point(4, 24);
tabPage_Model.Name = "tabPage_Model";
tabPage_Model.Padding = new Padding(3);
@ -447,341 +402,6 @@
timer_Test.Interval = 10;
timer_Test.Tick += timer_Test_Tick;
//
// textBox_GPS_Lat
//
textBox_GPS_Lat.Location = new Point(37, 22);
textBox_GPS_Lat.Name = "textBox_GPS_Lat";
textBox_GPS_Lat.Size = new Size(92, 23);
textBox_GPS_Lat.TabIndex = 0;
textBox_GPS_Lat.Text = "47.2125649";
//
// label2
//
label2.AutoSize = true;
label2.Location = new Point(5, 25);
label2.Name = "label2";
label2.Size = new Size(26, 15);
label2.TabIndex = 1;
label2.Text = "Lat:";
//
// groupBox_GPS
//
groupBox_GPS.Controls.Add(checkBox_GPS_Enable);
groupBox_GPS.Controls.Add(label10);
groupBox_GPS.Controls.Add(textBox_GPS_Accur);
groupBox_GPS.Controls.Add(label11);
groupBox_GPS.Controls.Add(numericUpDown_GPS_Freq);
groupBox_GPS.Controls.Add(label6);
groupBox_GPS.Controls.Add(label_GPS_Frequency);
groupBox_GPS.Controls.Add(label4);
groupBox_GPS.Controls.Add(textBox_GPS_Lon);
groupBox_GPS.Controls.Add(label2);
groupBox_GPS.Controls.Add(textBox_GPS_Lat);
groupBox_GPS.Dock = DockStyle.Top;
groupBox_GPS.Enabled = false;
groupBox_GPS.Location = new Point(3, 3);
groupBox_GPS.Name = "groupBox_GPS";
groupBox_GPS.Size = new Size(204, 112);
groupBox_GPS.TabIndex = 2;
groupBox_GPS.TabStop = false;
groupBox_GPS.Text = "GPS";
//
// textBox_GPS_Lon
//
textBox_GPS_Lon.Location = new Point(37, 51);
textBox_GPS_Lon.Name = "textBox_GPS_Lon";
textBox_GPS_Lon.Size = new Size(92, 23);
textBox_GPS_Lon.TabIndex = 2;
textBox_GPS_Lon.Text = "38.9160740";
//
// label4
//
label4.AutoSize = true;
label4.Location = new Point(5, 54);
label4.Name = "label4";
label4.Size = new Size(30, 15);
label4.TabIndex = 3;
label4.Text = "Lon:";
//
// numericUpDown_GPS_Freq
//
numericUpDown_GPS_Freq.Location = new Point(135, 51);
numericUpDown_GPS_Freq.Minimum = new decimal(new int[] { 1, 0, 0, 0 });
numericUpDown_GPS_Freq.Name = "numericUpDown_GPS_Freq";
numericUpDown_GPS_Freq.Size = new Size(40, 23);
numericUpDown_GPS_Freq.TabIndex = 4;
numericUpDown_GPS_Freq.Value = new decimal(new int[] { 10, 0, 0, 0 });
//
// label_GPS_Frequency
//
label_GPS_Frequency.AutoSize = true;
label_GPS_Frequency.Location = new Point(135, 25);
label_GPS_Frequency.Name = "label_GPS_Frequency";
label_GPS_Frequency.Size = new Size(62, 15);
label_GPS_Frequency.TabIndex = 5;
label_GPS_Frequency.Tag = "#frequency";
label_GPS_Frequency.Text = "Frequency";
//
// label6
//
label6.AutoSize = true;
label6.Location = new Point(176, 54);
label6.Name = "label6";
label6.Size = new Size(21, 15);
label6.TabIndex = 6;
label6.Text = "Hz";
//
// groupBox_Barometer
//
groupBox_Barometer.Controls.Add(checkBox_Bar_Enable);
groupBox_Barometer.Controls.Add(label9);
groupBox_Barometer.Controls.Add(numericUpDown_Bar_Accur);
groupBox_Barometer.Controls.Add(label8);
groupBox_Barometer.Controls.Add(numericUpDown_Bar_Freq);
groupBox_Barometer.Controls.Add(label5);
groupBox_Barometer.Controls.Add(label7);
groupBox_Barometer.Dock = DockStyle.Top;
groupBox_Barometer.Location = new Point(3, 115);
groupBox_Barometer.Name = "groupBox_Barometer";
groupBox_Barometer.Size = new Size(204, 88);
groupBox_Barometer.TabIndex = 3;
groupBox_Barometer.TabStop = false;
groupBox_Barometer.Tag = "#barometer";
groupBox_Barometer.Text = "Barometer";
//
// numericUpDown_Bar_Freq
//
numericUpDown_Bar_Freq.Location = new Point(69, 22);
numericUpDown_Bar_Freq.Maximum = new decimal(new int[] { 200, 0, 0, 0 });
numericUpDown_Bar_Freq.Minimum = new decimal(new int[] { 1, 0, 0, 0 });
numericUpDown_Bar_Freq.Name = "numericUpDown_Bar_Freq";
numericUpDown_Bar_Freq.Size = new Size(40, 23);
numericUpDown_Bar_Freq.TabIndex = 7;
numericUpDown_Bar_Freq.Value = new decimal(new int[] { 50, 0, 0, 0 });
//
// label5
//
label5.AutoSize = true;
label5.Location = new Point(111, 24);
label5.Name = "label5";
label5.Size = new Size(21, 15);
label5.TabIndex = 9;
label5.Text = "Hz";
//
// label7
//
label7.AutoSize = true;
label7.Location = new Point(6, 24);
label7.Name = "label7";
label7.Size = new Size(62, 15);
label7.TabIndex = 8;
label7.Tag = "#frequency";
label7.Text = "Frequency";
//
// label8
//
label8.AutoSize = true;
label8.Location = new Point(7, 53);
label8.Name = "label8";
label8.Size = new Size(56, 15);
label8.TabIndex = 10;
label8.Tag = "#accuracy";
label8.Text = "Accuracy";
//
// numericUpDown_Bar_Accur
//
numericUpDown_Bar_Accur.DecimalPlaces = 1;
numericUpDown_Bar_Accur.Location = new Point(69, 51);
numericUpDown_Bar_Accur.Maximum = new decimal(new int[] { 10, 0, 0, 0 });
numericUpDown_Bar_Accur.Name = "numericUpDown_Bar_Accur";
numericUpDown_Bar_Accur.Size = new Size(40, 23);
numericUpDown_Bar_Accur.TabIndex = 11;
numericUpDown_Bar_Accur.Value = new decimal(new int[] { 1, 0, 0, 0 });
//
// label9
//
label9.AutoSize = true;
label9.Location = new Point(112, 53);
label9.Name = "label9";
label9.Size = new Size(20, 15);
label9.TabIndex = 12;
label9.Text = "Pa";
//
// label10
//
label10.AutoSize = true;
label10.Location = new Point(111, 82);
label10.Name = "label10";
label10.Size = new Size(18, 15);
label10.TabIndex = 15;
label10.Text = "m";
//
// textBox_GPS_Accur
//
textBox_GPS_Accur.DecimalPlaces = 1;
textBox_GPS_Accur.Location = new Point(68, 80);
textBox_GPS_Accur.Maximum = new decimal(new int[] { 10, 0, 0, 0 });
textBox_GPS_Accur.Name = "textBox_GPS_Accur";
textBox_GPS_Accur.Size = new Size(40, 23);
textBox_GPS_Accur.TabIndex = 14;
textBox_GPS_Accur.Value = new decimal(new int[] { 1, 0, 0, 0 });
//
// label11
//
label11.AutoSize = true;
label11.Location = new Point(6, 82);
label11.Name = "label11";
label11.Size = new Size(56, 15);
label11.TabIndex = 13;
label11.Tag = "#accuracy";
label11.Text = "Accuracy";
//
// groupBox1
//
groupBox1.Controls.Add(checkBox_OF_Enable);
groupBox1.Controls.Add(label17);
groupBox1.Controls.Add(numericUpDown1);
groupBox1.Controls.Add(label16);
groupBox1.Controls.Add(label12);
groupBox1.Controls.Add(numericUpDown_OF_Accur);
groupBox1.Controls.Add(label13);
groupBox1.Controls.Add(numericUpDown_OF_Freq);
groupBox1.Controls.Add(label14);
groupBox1.Controls.Add(label15);
groupBox1.Dock = DockStyle.Top;
groupBox1.Enabled = false;
groupBox1.Location = new Point(3, 203);
groupBox1.Name = "groupBox1";
groupBox1.Size = new Size(204, 114);
groupBox1.TabIndex = 4;
groupBox1.TabStop = false;
groupBox1.Text = "Optical flow";
//
// label12
//
label12.AutoSize = true;
label12.Location = new Point(111, 53);
label12.Name = "label12";
label12.Size = new Size(28, 15);
label12.TabIndex = 18;
label12.Text = "Deg";
//
// numericUpDown_OF_Accur
//
numericUpDown_OF_Accur.DecimalPlaces = 1;
numericUpDown_OF_Accur.Location = new Point(69, 51);
numericUpDown_OF_Accur.Maximum = new decimal(new int[] { 10, 0, 0, 0 });
numericUpDown_OF_Accur.Name = "numericUpDown_OF_Accur";
numericUpDown_OF_Accur.Size = new Size(40, 23);
numericUpDown_OF_Accur.TabIndex = 17;
numericUpDown_OF_Accur.Value = new decimal(new int[] { 1, 0, 0, 0 });
//
// label13
//
label13.AutoSize = true;
label13.Location = new Point(7, 53);
label13.Name = "label13";
label13.Size = new Size(56, 15);
label13.TabIndex = 16;
label13.Tag = "#accuracy";
label13.Text = "Accuracy";
//
// numericUpDown_OF_Freq
//
numericUpDown_OF_Freq.Location = new Point(69, 22);
numericUpDown_OF_Freq.Maximum = new decimal(new int[] { 200, 0, 0, 0 });
numericUpDown_OF_Freq.Minimum = new decimal(new int[] { 1, 0, 0, 0 });
numericUpDown_OF_Freq.Name = "numericUpDown_OF_Freq";
numericUpDown_OF_Freq.Size = new Size(40, 23);
numericUpDown_OF_Freq.TabIndex = 13;
numericUpDown_OF_Freq.Value = new decimal(new int[] { 100, 0, 0, 0 });
//
// label14
//
label14.AutoSize = true;
label14.Location = new Point(112, 24);
label14.Name = "label14";
label14.Size = new Size(21, 15);
label14.TabIndex = 15;
label14.Text = "Hz";
//
// label15
//
label15.AutoSize = true;
label15.Location = new Point(6, 24);
label15.Name = "label15";
label15.Size = new Size(62, 15);
label15.TabIndex = 14;
label15.Tag = "#frequency";
label15.Text = "Frequency";
//
// checkBox_GPS_Enable
//
checkBox_GPS_Enable.AutoSize = true;
checkBox_GPS_Enable.Checked = true;
checkBox_GPS_Enable.CheckState = CheckState.Checked;
checkBox_GPS_Enable.Location = new Point(158, 87);
checkBox_GPS_Enable.Name = "checkBox_GPS_Enable";
checkBox_GPS_Enable.Size = new Size(39, 19);
checkBox_GPS_Enable.TabIndex = 16;
checkBox_GPS_Enable.Tag = "#en";
checkBox_GPS_Enable.Text = "En";
checkBox_GPS_Enable.UseVisualStyleBackColor = true;
//
// label16
//
label16.AutoSize = true;
label16.Location = new Point(1, 82);
label16.Name = "label16";
label16.Size = new Size(67, 15);
label16.TabIndex = 19;
label16.Tag = "#max_height";
label16.Text = "Max height";
//
// numericUpDown1
//
numericUpDown1.Location = new Point(68, 80);
numericUpDown1.Minimum = new decimal(new int[] { 1, 0, 0, 0 });
numericUpDown1.Name = "numericUpDown1";
numericUpDown1.Size = new Size(40, 23);
numericUpDown1.TabIndex = 20;
numericUpDown1.Value = new decimal(new int[] { 8, 0, 0, 0 });
//
// label17
//
label17.AutoSize = true;
label17.Location = new Point(111, 82);
label17.Name = "label17";
label17.Size = new Size(18, 15);
label17.TabIndex = 21;
label17.Text = "m";
//
// checkBox_OF_Enable
//
checkBox_OF_Enable.AutoSize = true;
checkBox_OF_Enable.Checked = true;
checkBox_OF_Enable.CheckState = CheckState.Checked;
checkBox_OF_Enable.Location = new Point(158, 89);
checkBox_OF_Enable.Name = "checkBox_OF_Enable";
checkBox_OF_Enable.Size = new Size(39, 19);
checkBox_OF_Enable.TabIndex = 22;
checkBox_OF_Enable.Tag = "#en";
checkBox_OF_Enable.Text = "En";
checkBox_OF_Enable.UseVisualStyleBackColor = true;
//
// checkBox_Bar_Enable
//
checkBox_Bar_Enable.AutoSize = true;
checkBox_Bar_Enable.Checked = true;
checkBox_Bar_Enable.CheckState = CheckState.Checked;
checkBox_Bar_Enable.Location = new Point(158, 63);
checkBox_Bar_Enable.Name = "checkBox_Bar_Enable";
checkBox_Bar_Enable.Size = new Size(39, 19);
checkBox_Bar_Enable.TabIndex = 17;
checkBox_Bar_Enable.Tag = "#en";
checkBox_Bar_Enable.Text = "En";
checkBox_Bar_Enable.UseVisualStyleBackColor = true;
//
// Form_Main
//
AutoScaleDimensions = new SizeF(7F, 15F);
@ -811,22 +431,8 @@
groupBox_Clients.PerformLayout();
((System.ComponentModel.ISupportInitialize)numericUpDown_Clients_Limit).EndInit();
((System.ComponentModel.ISupportInitialize)numericUpDown_Clients_Port).EndInit();
tabPage_Model.ResumeLayout(false);
groupBox_Navi.ResumeLayout(false);
panel1.ResumeLayout(false);
groupBox_GPS.ResumeLayout(false);
groupBox_GPS.PerformLayout();
((System.ComponentModel.ISupportInitialize)numericUpDown_GPS_Freq).EndInit();
groupBox_Barometer.ResumeLayout(false);
groupBox_Barometer.PerformLayout();
((System.ComponentModel.ISupportInitialize)numericUpDown_Bar_Freq).EndInit();
((System.ComponentModel.ISupportInitialize)numericUpDown_Bar_Accur).EndInit();
((System.ComponentModel.ISupportInitialize)textBox_GPS_Accur).EndInit();
groupBox1.ResumeLayout(false);
groupBox1.PerformLayout();
((System.ComponentModel.ISupportInitialize)numericUpDown_OF_Accur).EndInit();
((System.ComponentModel.ISupportInitialize)numericUpDown_OF_Freq).EndInit();
((System.ComponentModel.ISupportInitialize)numericUpDown1).EndInit();
ResumeLayout(false);
PerformLayout();
}
@ -864,36 +470,5 @@
private Label label1;
private Label label_Visual_Num;
private Label label3;
private GroupBox groupBox_GPS;
private TextBox textBox_GPS_Lon;
private Label label2;
private TextBox textBox_GPS_Lat;
private NumericUpDown numericUpDown_GPS_Freq;
private Label label6;
private Label label_GPS_Frequency;
private Label label4;
private GroupBox groupBox_Barometer;
private NumericUpDown numericUpDown_Bar_Freq;
private Label label5;
private Label label7;
private Label label9;
private NumericUpDown numericUpDown_Bar_Accur;
private Label label8;
private Label label10;
private NumericUpDown textBox_GPS_Accur;
private Label label11;
private GroupBox groupBox1;
private Label label12;
private NumericUpDown numericUpDown_OF_Accur;
private Label label13;
private NumericUpDown numericUpDown_OF_Freq;
private Label label14;
private Label label15;
private CheckBox checkBox_GPS_Enable;
private Label label17;
private NumericUpDown numericUpDown1;
private Label label16;
private CheckBox checkBox_OF_Enable;
private CheckBox checkBox_Bar_Enable;
}
}

View File