Разделение классов на заголовочный и реализацию
This commit is contained in:
parent
6d8765ce4f
commit
303328b26d
197
DroneClientCpp/Drone.cpp
Normal file
197
DroneClientCpp/Drone.cpp
Normal file
@ -0,0 +1,197 @@
|
||||
#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);
|
||||
}
|
||||
|
||||
// Реализация приватного метода RecvDataIMU
|
||||
array<Byte>^ Drone::RecvDataIMU(array<Byte>^ data)
|
||||
{
|
||||
DroneData::DataIMU imu = (DroneData::DataIMU)FromBytes(data, DroneData::DataIMU::typeid);
|
||||
|
||||
AccX = imu.Acc.X; AccY = imu.Acc.Y; AccZ = imu.Acc.Z;
|
||||
GyrX = imu.Gyr.X; GyrY = imu.Gyr.Y; GyrZ = imu.Gyr.Z;
|
||||
|
||||
return gcnew array<Byte>(0);
|
||||
}
|
||||
|
||||
// Реализация приватного метода RecvDataPos
|
||||
array<Byte>^ Drone::RecvDataPos(array<Byte>^ data)
|
||||
{
|
||||
DroneData::DataPos pos = (DroneData::DataPos)FromBytes(data, DroneData::DataPos::typeid);
|
||||
|
||||
PosX = pos.Local.X; PosY = pos.Local.Y;
|
||||
LaserRange = pos.LiDAR;
|
||||
|
||||
return gcnew array<Byte>(0);
|
||||
}
|
||||
|
||||
// Реализация приватного метода ClientRequestResponse
|
||||
array<Byte>^ Drone::ClientRequestResponse(DroneData::DataHead head, array<Byte>^ body)
|
||||
{
|
||||
array<Byte>^ zero = gcnew array<Byte>(0);
|
||||
|
||||
switch (head.Type)
|
||||
{
|
||||
case DroneData::DataType::DataIMU:
|
||||
if (head.Mode == DroneData::DataMode::Request)
|
||||
{
|
||||
return zero; // Запрос данных (не реализовано)
|
||||
}
|
||||
else
|
||||
{
|
||||
return RecvDataIMU(body); // Пришли данные
|
||||
}
|
||||
|
||||
case DroneData::DataType::DataPos:
|
||||
if (head.Mode == DroneData::DataMode::Request)
|
||||
{
|
||||
return zero; // Запрос данных (не реализовано)
|
||||
}
|
||||
else
|
||||
{
|
||||
return RecvDataPos(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
|
||||
System::Collections::Generic::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 imu;
|
||||
imu.Size = DroneData::DataHead::StrLen;
|
||||
imu.Mode = DroneData::DataMode::Request;
|
||||
imu.Type = DroneData::DataType::DataIMU;
|
||||
|
||||
DroneData::DataHead pos;
|
||||
pos.Size = DroneData::DataHead::StrLen;
|
||||
pos.Mode = DroneData::DataMode::Request;
|
||||
pos.Type = DroneData::DataType::DataPos;
|
||||
|
||||
array<Byte>^ si = GetBytes(imu);
|
||||
array<Byte>^ sp = GetBytes(pos);
|
||||
array<Byte>^ sm = SendDataMotor4();
|
||||
|
||||
array<Byte>^ send = gcnew array<Byte>(si->Length + sp->Length + sm->Length);
|
||||
Array::Copy(si, 0, send, 0, si->Length);
|
||||
Array::Copy(sp, 0, send, si->Length, sp->Length);
|
||||
Array::Copy(sm, 0, send, si->Length + sp->Length, sm->Length);
|
||||
|
||||
return send;
|
||||
}
|
||||
}
|
@ -23,194 +23,24 @@ namespace DroneClient {
|
||||
|
||||
float MotorUL, MotorUR, MotorDL, MotorDR;
|
||||
|
||||
static array<Byte>^ 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;
|
||||
}
|
||||
|
||||
static Object^ 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;
|
||||
}
|
||||
static array<Byte>^ GetBytes(Object^ data);
|
||||
static Object^ FromBytes(array<Byte>^ arr, Type^ type);
|
||||
|
||||
private:
|
||||
array<Byte>^ 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>^ RecvDataIMU(array<Byte>^ data)
|
||||
{
|
||||
DroneData::DataIMU imu = (DroneData::DataIMU)FromBytes(data, DroneData::DataIMU::typeid);
|
||||
|
||||
AccX = imu.Acc.X; AccY = imu.Acc.Y; AccZ = imu.Acc.Z;
|
||||
GyrX = imu.Gyr.X; GyrY = imu.Gyr.Y; GyrZ = imu.Gyr.Z;
|
||||
|
||||
return gcnew array<Byte>(0);
|
||||
}
|
||||
|
||||
array<Byte>^ RecvDataPos(array<Byte>^ data)
|
||||
{
|
||||
DroneData::DataPos pos = (DroneData::DataPos)FromBytes(data, DroneData::DataPos::typeid);
|
||||
|
||||
PosX = pos.Local.X; PosY = pos.Local.Y;
|
||||
LaserRange = pos.LiDAR;
|
||||
|
||||
return gcnew array<Byte>(0);
|
||||
}
|
||||
|
||||
array<Byte>^ ClientRequestResponse(DroneData::DataHead head, array<Byte>^ body)
|
||||
{
|
||||
array<Byte>^ zero = gcnew array<Byte>(0);
|
||||
|
||||
switch (head.Type)
|
||||
{
|
||||
case DroneData::DataType::DataIMU:
|
||||
if (head.Mode == DroneData::DataMode::Request)
|
||||
{
|
||||
return zero; // Запрос данных (не реализовано)
|
||||
}
|
||||
else
|
||||
{
|
||||
return RecvDataIMU(body); // Пришли данные
|
||||
}
|
||||
|
||||
case DroneData::DataType::DataPos:
|
||||
if (head.Mode == DroneData::DataMode::Request)
|
||||
{
|
||||
return zero; // Запрос данных (не реализовано)
|
||||
}
|
||||
else
|
||||
{
|
||||
return RecvDataPos(body); // Пришли данные
|
||||
}
|
||||
|
||||
case DroneData::DataType::DataMotor4:
|
||||
if (head.Mode == DroneData::DataMode::Request)
|
||||
{
|
||||
return SendDataMotor4(); // Запрос данных
|
||||
}
|
||||
else
|
||||
{
|
||||
return zero; // Пришли данные (не реализовано)
|
||||
}
|
||||
}
|
||||
|
||||
return zero;
|
||||
}
|
||||
array<Byte>^ SendDataMotor4();
|
||||
array<Byte>^ RecvDataIMU(array<Byte>^ data);
|
||||
array<Byte>^ RecvDataPos(array<Byte>^ data);
|
||||
array<Byte>^ ClientRequestResponse(DroneData::DataHead head, array<Byte>^ body);
|
||||
|
||||
literal int DroneStreamCount = 512;
|
||||
array<Byte>^ DroneStreamData = gcnew array<Byte>(DroneStreamCount);
|
||||
int DroneStreamIndex = 0;
|
||||
DroneData::DataHead DroneStreamHead; // Исправлено: без явной инициализации
|
||||
array<Byte>^ DroneStreamData;
|
||||
int DroneStreamIndex;
|
||||
DroneData::DataHead DroneStreamHead;
|
||||
|
||||
public:
|
||||
// Конструктор для явной инициализации
|
||||
Drone()
|
||||
{
|
||||
DroneStreamHead.Mode = DroneData::DataMode::None;
|
||||
DroneStreamHead.Size = 0;
|
||||
DroneStreamHead.Type = DroneData::DataType::None;
|
||||
}
|
||||
Drone(); // Конструктор для инициализации
|
||||
|
||||
System::Collections::Generic::List<array<Byte>^>^ 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;
|
||||
}
|
||||
|
||||
array<Byte>^ SendRequest()
|
||||
{
|
||||
DroneData::DataHead imu;
|
||||
imu.Size = DroneData::DataHead::StrLen;
|
||||
imu.Mode = DroneData::DataMode::Request;
|
||||
imu.Type = DroneData::DataType::DataIMU;
|
||||
|
||||
DroneData::DataHead pos;
|
||||
pos.Size = DroneData::DataHead::StrLen;
|
||||
pos.Mode = DroneData::DataMode::Request;
|
||||
pos.Type = DroneData::DataType::DataPos;
|
||||
|
||||
array<Byte>^ si = GetBytes(imu);
|
||||
array<Byte>^ sp = GetBytes(pos);
|
||||
array<Byte>^ sm = SendDataMotor4();
|
||||
|
||||
array<Byte>^ send = gcnew array<Byte>(si->Length + sp->Length + sm->Length);
|
||||
Array::Copy(si, 0, send, 0, si->Length);
|
||||
Array::Copy(sp, 0, send, si->Length, sp->Length);
|
||||
Array::Copy(sm, 0, send, si->Length + sp->Length, sm->Length);
|
||||
|
||||
return send;
|
||||
}
|
||||
System::Collections::Generic::List<array<Byte>^>^ DataStream(array<Byte>^ data, int size);
|
||||
array<Byte>^ SendRequest();
|
||||
};
|
||||
}
|
@ -118,7 +118,9 @@
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="Drone.cpp" />
|
||||
<ClCompile Include="FormMain.cpp" />
|
||||
<ClCompile Include="NetClient.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="Drone.h" />
|
||||
|
@ -18,6 +18,12 @@
|
||||
<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">
|
||||
|
Binary file not shown.
BIN
DroneClientCpp/DroneClientCpp/x64/Debug/Drone.obj
Normal file
BIN
DroneClientCpp/DroneClientCpp/x64/Debug/Drone.obj
Normal file
Binary file not shown.
@ -2,7 +2,7 @@
|
||||
<Project>
|
||||
<ProjectOutputs>
|
||||
<ProjectOutput>
|
||||
<FullPath>D:\Projects\Simulator\DroneClientCpp\x64\Debug\DroneClientCpp.exe</FullPath>
|
||||
<FullPath>C:\Projects\Simulator\DroneClientCpp\x64\Debug\DroneClientCpp.exe</FullPath>
|
||||
</ProjectOutput>
|
||||
</ProjectOutputs>
|
||||
<ContentFiles />
|
||||
|
@ -1,3 +1,5 @@
|
||||
FormMain.cpp
|
||||
FormMain.obj : обнаружен модуль MSIL; для MSIL последовательная компоновка отключена; выполняется полная компоновка
|
||||
DroneClientCpp.vcxproj -> D:\Projects\Simulator\DroneClientCpp\x64\Debug\DroneClientCpp.exe
|
||||
NetClient.cpp
|
||||
Создание кода...
|
||||
Drone.obj : обнаружен модуль MSIL; для MSIL последовательная компоновка отключена; выполняется полная компоновка
|
||||
DroneClientCpp.vcxproj -> C:\Projects\Simulator\DroneClientCpp\x64\Debug\DroneClientCpp.exe
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,2 +1,4 @@
|
||||
D:\Projects\Simulator\DroneClientCpp\FormMain.cpp;D:\Projects\Simulator\DroneClientCpp\DroneClientCpp\x64\Debug\FormMain.obj
|
||||
D:\Projects\Simulator\DroneClientCpp\DroneClientCpp\x64\Debug\.NETFramework,Version=v4.7.2.AssemblyAttributes.cpp;D:\Projects\Simulator\DroneClientCpp\DroneClientCpp\x64\Debug\.NETFramework,Version=v4.7.2.AssemblyAttributes.obj
|
||||
C:\Projects\Simulator\DroneClientCpp\Drone.cpp;C:\Projects\Simulator\DroneClientCpp\DroneClientCpp\x64\Debug\Drone.obj
|
||||
C:\Projects\Simulator\DroneClientCpp\FormMain.cpp;C:\Projects\Simulator\DroneClientCpp\DroneClientCpp\x64\Debug\FormMain.obj
|
||||
C:\Projects\Simulator\DroneClientCpp\NetClient.cpp;C:\Projects\Simulator\DroneClientCpp\DroneClientCpp\x64\Debug\NetClient.obj
|
||||
C:\Projects\Simulator\DroneClientCpp\DroneClientCpp\x64\Debug\.NETFramework,Version=v4.7.2.AssemblyAttributes.cpp;C:\Projects\Simulator\DroneClientCpp\DroneClientCpp\x64\Debug\.NETFramework,Version=v4.7.2.AssemblyAttributes.obj
|
||||
|
@ -1,2 +1,2 @@
|
||||
PlatformToolSet=v143:VCToolArchitecture=Native64Bit:VCToolsVersion=14.43.34808:TargetPlatformVersion=10.0.22621.0:TargetFrameworkVersion=v4.7.2::EnableManagedIncrementalBuild=true:
|
||||
Debug|x64|D:\Projects\Simulator\DroneClientCpp\|
|
||||
PlatformToolSet=v143:VCToolArchitecture=Native64Bit:VCToolsVersion=14.42.34433:TargetPlatformVersion=10.0.22621.0:TargetFrameworkVersion=v4.7.2::EnableManagedIncrementalBuild=true:
|
||||
Debug|x64|C:\Projects\Simulator\DroneClientCpp\|
|
||||
|
@ -1,4 +1,4 @@
|
||||
^D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX
|
||||
D:\Projects\Simulator\DroneClientCpp\DroneClientCpp.vcxproj
|
||||
^D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX
|
||||
D:\Projects\Simulator\DroneClientCpp\DroneClientCpp.vcxproj
|
||||
^C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX
|
||||
C:\Projects\Simulator\DroneClientCpp\DroneClientCpp.vcxproj
|
||||
^C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX
|
||||
C:\Projects\Simulator\DroneClientCpp\DroneClientCpp.vcxproj
|
||||
|
@ -1,4 +1,4 @@
|
||||
^D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX
|
||||
D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\DRONECLIENTCPP.VCXPROJ
|
||||
^D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX
|
||||
D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\DRONECLIENTCPP.VCXPROJ
|
||||
^C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX
|
||||
C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\DRONECLIENTCPP.VCXPROJ
|
||||
^C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX
|
||||
C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\DRONECLIENTCPP.VCXPROJ
|
||||
|
@ -1,4 +1,4 @@
|
||||
^D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX
|
||||
D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\X64\DEBUG\DRONECLIENTCPP.EXE
|
||||
^D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX
|
||||
D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\X64\DEBUG\DRONECLIENTCPP.EXE
|
||||
^C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX
|
||||
C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\X64\DEBUG\DRONECLIENTCPP.EXE
|
||||
^C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX
|
||||
C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\X64\DEBUG\DRONECLIENTCPP.EXE
|
||||
|
Binary file not shown.
Binary file not shown.
@ -1 +1 @@
|
||||
^D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\DRONECLIENTCPP\X64\DEBUG\.NETFRAMEWORK,VERSION=V4.7.2.ASSEMBLYATTRIBUTES.OBJ|D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\DRONECLIENTCPP\X64\DEBUG\FORMMAIN.OBJ
|
||||
^C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\DRONECLIENTCPP\X64\DEBUG\.NETFRAMEWORK,VERSION=V4.7.2.ASSEMBLYATTRIBUTES.OBJ|C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\DRONECLIENTCPP\X64\DEBUG\DRONE.OBJ|C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\DRONECLIENTCPP\X64\DEBUG\FORMMAIN.OBJ|C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\DRONECLIENTCPP\X64\DEBUG\NETCLIENT.OBJ
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
DroneClientCpp/DroneClientCpp/x64/Debug/NetClient.obj
Normal file
BIN
DroneClientCpp/DroneClientCpp/x64/Debug/NetClient.obj
Normal file
Binary file not shown.
Binary file not shown.
105
DroneClientCpp/NetClient.cpp
Normal file
105
DroneClientCpp/NetClient.cpp
Normal file
@ -0,0 +1,105 @@
|
||||
#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 { 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 { ServerSocket->BeginReceive(DataServer->buffer, 0, ServerData::size, SocketFlags::None, gcnew AsyncCallback(this, &NetClient::ReadCallback), receiveData); }
|
||||
catch (...) {}
|
||||
|
||||
return ClientState::Connected;
|
||||
}
|
||||
|
||||
// Реализация метода Close
|
||||
void NetClient::Close()
|
||||
{
|
||||
try { ServerSocket->Shutdown(SocketShutdown::Both); }
|
||||
catch (...) {}
|
||||
ServerSocket->Close();
|
||||
Connected = false;
|
||||
}
|
||||
|
||||
// Реализация метода Send
|
||||
void NetClient::Send(array<Byte>^ data)
|
||||
{
|
||||
if (ServerSocket != nullptr && Connected)
|
||||
{
|
||||
try { 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)
|
||||
{
|
||||
ServerSocket->Close();
|
||||
Connected = false;
|
||||
|
||||
if (ServerSocket != nullptr)
|
||||
{
|
||||
ConnectionCallback(gcnew ConnectData(false, nullptr));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
ReceiveCallback(gcnew ReceiveData(cd->Buffer, bytes, ServerSocket));
|
||||
|
||||
try { ServerSocket->BeginReceive(cd->Buffer, 0, ServerData::size, SocketFlags::None, gcnew AsyncCallback(this, &NetClient::ReadCallback), cd); }
|
||||
catch (...) {}
|
||||
}
|
||||
}
|
@ -21,12 +21,7 @@ namespace DroneSimulator {
|
||||
bool Connect;
|
||||
Socket^ Server;
|
||||
|
||||
// Добавлен конструктор
|
||||
ConnectData(bool connect, Socket^ server)
|
||||
{
|
||||
Connect = connect;
|
||||
Server = server;
|
||||
}
|
||||
ConnectData(bool connect, Socket^ server);
|
||||
};
|
||||
|
||||
ref class ReceiveData
|
||||
@ -36,13 +31,7 @@ namespace DroneSimulator {
|
||||
int Size;
|
||||
Socket^ Server;
|
||||
|
||||
// Добавлен конструктор
|
||||
ReceiveData(array<Byte>^ buffer, int size, Socket^ server)
|
||||
{
|
||||
Buffer = buffer;
|
||||
Size = size;
|
||||
Server = server;
|
||||
}
|
||||
ReceiveData(array<Byte>^ buffer, int size, Socket^ server);
|
||||
};
|
||||
|
||||
private:
|
||||
@ -53,96 +42,27 @@ namespace DroneSimulator {
|
||||
array<Byte>^ buffer = gcnew array<Byte>(size);
|
||||
};
|
||||
|
||||
bool Connected = false;
|
||||
Socket^ ServerSocket = nullptr;
|
||||
ServerData^ DataServer = gcnew ServerData();
|
||||
bool Connected;
|
||||
Socket^ ServerSocket;
|
||||
ServerData^ DataServer;
|
||||
|
||||
public:
|
||||
delegate void ClientCallback(Object^ o);
|
||||
|
||||
private:
|
||||
ClientCallback^ ConnectionCallback;
|
||||
ClientCallback^ ReceiveCallback;
|
||||
|
||||
public:
|
||||
NetClient(); // Добавлен конструктор
|
||||
|
||||
enum class ClientState { Error, Connected, Stop };
|
||||
|
||||
ClientState 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 { 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 { ServerSocket->BeginReceive(DataServer->buffer, 0, ServerData::size, SocketFlags::None, gcnew AsyncCallback(this, &NetClient::ReadCallback), receiveData); }
|
||||
catch (...) {}
|
||||
|
||||
return ClientState::Connected;
|
||||
}
|
||||
|
||||
void Close()
|
||||
{
|
||||
try { ServerSocket->Shutdown(SocketShutdown::Both); }
|
||||
catch (...) {}
|
||||
ServerSocket->Close();
|
||||
Connected = false;
|
||||
}
|
||||
|
||||
void Send(array<Byte>^ data)
|
||||
{
|
||||
if (ServerSocket != nullptr && Connected)
|
||||
{
|
||||
try { ServerSocket->Send(data); }
|
||||
catch (...) {}
|
||||
}
|
||||
}
|
||||
ClientState Connect(String^ Addr, int Port, ClientCallback^ Connection, ClientCallback^ Receive);
|
||||
void Close();
|
||||
void Send(array<Byte>^ data);
|
||||
|
||||
private:
|
||||
void ReadCallback(IAsyncResult^ ar)
|
||||
{
|
||||
ReceiveData^ cd = (ReceiveData^)ar->AsyncState;
|
||||
if (cd == nullptr) return;
|
||||
|
||||
int bytes = 0;
|
||||
try { bytes = ServerSocket->EndReceive(ar); }
|
||||
catch (...) {}
|
||||
|
||||
if (bytes == 0)
|
||||
{
|
||||
ServerSocket->Close();
|
||||
Connected = false;
|
||||
|
||||
if (ServerSocket != nullptr)
|
||||
{
|
||||
// Исправленный вызов с конструктором
|
||||
ConnectionCallback(gcnew ConnectData(false, nullptr));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Исправленный вызов с конструктором
|
||||
ReceiveCallback(gcnew ReceiveData(cd->Buffer, bytes, ServerSocket));
|
||||
|
||||
try { ServerSocket->BeginReceive(cd->Buffer, 0, ServerData::size, SocketFlags::None, gcnew AsyncCallback(this, &NetClient::ReadCallback), cd); }
|
||||
catch (...) {}
|
||||
}
|
||||
void ReadCallback(IAsyncResult^ ar);
|
||||
};
|
||||
}
|
Binary file not shown.
@ -87,6 +87,23 @@ Class DroneClient.Drone: AutoLayout, AnsiClass, Class, Public, BeforeFieldInit
|
||||
FromBytes(Byte[], Type): PrivateScope, Public, Static, HideBySig
|
||||
DataStream(Byte[], Int32): PrivateScope, Public, HideBySig
|
||||
SendRequest(): PrivateScope, Public, HideBySig
|
||||
Struct DroneData.DataMode: AutoLayout, AnsiClass, Class, Public, Sealed, BeforeFieldInit
|
||||
:System.Enum
|
||||
Fields:
|
||||
UInt16 value__ : Public, SpecialName, RTSpecialName
|
||||
DroneData.DataMode None = 0 : Public, Static, Literal, HasDefault
|
||||
DroneData.DataMode Response = 1 : Public, Static, Literal, HasDefault
|
||||
DroneData.DataMode Request = 2 : Public, Static, Literal, HasDefault
|
||||
Struct DroneData.DataType: AutoLayout, AnsiClass, Class, Public, Sealed, BeforeFieldInit
|
||||
:System.Enum
|
||||
Fields:
|
||||
UInt16 value__ : Public, SpecialName, RTSpecialName
|
||||
DroneData.DataType None = 0 : Public, Static, Literal, HasDefault
|
||||
DroneData.DataType Head = 1 : Public, Static, Literal, HasDefault
|
||||
DroneData.DataType DataIMU = 1001 : Public, Static, Literal, HasDefault
|
||||
DroneData.DataType DataPos = 1002 : Public, Static, Literal, HasDefault
|
||||
DroneData.DataType DataMotor4 = 2001 : Public, Static, Literal, HasDefault
|
||||
DroneData.DataType DataMotor6 = 2002 : Public, Static, Literal, HasDefault
|
||||
Class DroneSimulator.NetClient: AutoLayout, AnsiClass, Class, Public, BeforeFieldInit
|
||||
Void .ctor(): PrivateScope, Public, HideBySig, SpecialName, RTSpecialName
|
||||
Methods:
|
||||
@ -121,20 +138,3 @@ Struct DroneSimulator.NetClient+ClientState: AutoLayout, AnsiClass, Class, Neste
|
||||
Class DroneClientCpp.FormMain: AutoLayout, AnsiClass, Class, Public, BeforeFieldInit
|
||||
:System.Windows.Forms.Form
|
||||
Void .ctor(): PrivateScope, Public, HideBySig, SpecialName, RTSpecialName
|
||||
Struct DroneData.DataMode: AutoLayout, AnsiClass, Class, Public, Sealed, BeforeFieldInit
|
||||
:System.Enum
|
||||
Fields:
|
||||
UInt16 value__ : Public, SpecialName, RTSpecialName
|
||||
DroneData.DataMode None = 0 : Public, Static, Literal, HasDefault
|
||||
DroneData.DataMode Response = 1 : Public, Static, Literal, HasDefault
|
||||
DroneData.DataMode Request = 2 : Public, Static, Literal, HasDefault
|
||||
Struct DroneData.DataType: AutoLayout, AnsiClass, Class, Public, Sealed, BeforeFieldInit
|
||||
:System.Enum
|
||||
Fields:
|
||||
UInt16 value__ : Public, SpecialName, RTSpecialName
|
||||
DroneData.DataType None = 0 : Public, Static, Literal, HasDefault
|
||||
DroneData.DataType Head = 1 : Public, Static, Literal, HasDefault
|
||||
DroneData.DataType DataIMU = 1001 : Public, Static, Literal, HasDefault
|
||||
DroneData.DataType DataPos = 1002 : Public, Static, Literal, HasDefault
|
||||
DroneData.DataType DataMotor4 = 2001 : Public, Static, Literal, HasDefault
|
||||
DroneData.DataType DataMotor6 = 2002 : Public, Static, Literal, HasDefault
|
||||
|
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user