Разделение классов на заголовочный и реализацию
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;
|
float MotorUL, MotorUR, MotorDL, MotorDR;
|
||||||
|
|
||||||
static array<Byte>^ GetBytes(Object^ data)
|
static array<Byte>^ GetBytes(Object^ data);
|
||||||
{
|
static Object^ FromBytes(array<Byte>^ arr, Type^ type);
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
array<Byte>^ SendDataMotor4()
|
array<Byte>^ SendDataMotor4();
|
||||||
{
|
array<Byte>^ RecvDataIMU(array<Byte>^ data);
|
||||||
DroneData::DataMotor4 mot4;
|
array<Byte>^ RecvDataPos(array<Byte>^ data);
|
||||||
|
array<Byte>^ ClientRequestResponse(DroneData::DataHead head, array<Byte>^ body);
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
literal int DroneStreamCount = 512;
|
literal int DroneStreamCount = 512;
|
||||||
array<Byte>^ DroneStreamData = gcnew array<Byte>(DroneStreamCount);
|
array<Byte>^ DroneStreamData;
|
||||||
int DroneStreamIndex = 0;
|
int DroneStreamIndex;
|
||||||
DroneData::DataHead DroneStreamHead; // Исправлено: без явной инициализации
|
DroneData::DataHead DroneStreamHead;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// Конструктор для явной инициализации
|
Drone(); // Конструктор для инициализации
|
||||||
Drone()
|
|
||||||
{
|
|
||||||
DroneStreamHead.Mode = DroneData::DataMode::None;
|
|
||||||
DroneStreamHead.Size = 0;
|
|
||||||
DroneStreamHead.Type = DroneData::DataType::None;
|
|
||||||
}
|
|
||||||
|
|
||||||
System::Collections::Generic::List<array<Byte>^>^ DataStream(array<Byte>^ data, int size)
|
System::Collections::Generic::List<array<Byte>^>^ DataStream(array<Byte>^ data, int size);
|
||||||
{
|
array<Byte>^ SendRequest();
|
||||||
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;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
}
|
}
|
@ -118,7 +118,9 @@
|
|||||||
<Reference Include="System.Xml" />
|
<Reference Include="System.Xml" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClCompile Include="Drone.cpp" />
|
||||||
<ClCompile Include="FormMain.cpp" />
|
<ClCompile Include="FormMain.cpp" />
|
||||||
|
<ClCompile Include="NetClient.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="Drone.h" />
|
<ClInclude Include="Drone.h" />
|
||||||
|
@ -18,6 +18,12 @@
|
|||||||
<ClCompile Include="FormMain.cpp">
|
<ClCompile Include="FormMain.cpp">
|
||||||
<Filter>Исходные файлы</Filter>
|
<Filter>Исходные файлы</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="NetClient.cpp">
|
||||||
|
<Filter>Исходные файлы</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Drone.cpp">
|
||||||
|
<Filter>Исходные файлы</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="FormMain.h">
|
<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>
|
<Project>
|
||||||
<ProjectOutputs>
|
<ProjectOutputs>
|
||||||
<ProjectOutput>
|
<ProjectOutput>
|
||||||
<FullPath>D:\Projects\Simulator\DroneClientCpp\x64\Debug\DroneClientCpp.exe</FullPath>
|
<FullPath>C:\Projects\Simulator\DroneClientCpp\x64\Debug\DroneClientCpp.exe</FullPath>
|
||||||
</ProjectOutput>
|
</ProjectOutput>
|
||||||
</ProjectOutputs>
|
</ProjectOutputs>
|
||||||
<ContentFiles />
|
<ContentFiles />
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
FormMain.cpp
|
FormMain.cpp
|
||||||
FormMain.obj : обнаружен модуль MSIL; для MSIL последовательная компоновка отключена; выполняется полная компоновка
|
NetClient.cpp
|
||||||
DroneClientCpp.vcxproj -> D:\Projects\Simulator\DroneClientCpp\x64\Debug\DroneClientCpp.exe
|
Создание кода...
|
||||||
|
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
|
C:\Projects\Simulator\DroneClientCpp\Drone.cpp;C:\Projects\Simulator\DroneClientCpp\DroneClientCpp\x64\Debug\Drone.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\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:
|
PlatformToolSet=v143:VCToolArchitecture=Native64Bit:VCToolsVersion=14.42.34433:TargetPlatformVersion=10.0.22621.0:TargetFrameworkVersion=v4.7.2::EnableManagedIncrementalBuild=true:
|
||||||
Debug|x64|D:\Projects\Simulator\DroneClientCpp\|
|
Debug|x64|C:\Projects\Simulator\DroneClientCpp\|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
^D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX
|
^C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX
|
||||||
D:\Projects\Simulator\DroneClientCpp\DroneClientCpp.vcxproj
|
C:\Projects\Simulator\DroneClientCpp\DroneClientCpp.vcxproj
|
||||||
^D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX
|
^C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX
|
||||||
D:\Projects\Simulator\DroneClientCpp\DroneClientCpp.vcxproj
|
C:\Projects\Simulator\DroneClientCpp\DroneClientCpp.vcxproj
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
^D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX
|
^C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX
|
||||||
D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\DRONECLIENTCPP.VCXPROJ
|
C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\DRONECLIENTCPP.VCXPROJ
|
||||||
^D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX
|
^C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX
|
||||||
D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\DRONECLIENTCPP.VCXPROJ
|
C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\DRONECLIENTCPP.VCXPROJ
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
^D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX
|
^C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX
|
||||||
D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\X64\DEBUG\DRONECLIENTCPP.EXE
|
C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\X64\DEBUG\DRONECLIENTCPP.EXE
|
||||||
^D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX
|
^C:\PROJECTS\SIMULATOR\DRONECLIENTCPP\FORMMAIN.RESX
|
||||||
D:\PROJECTS\SIMULATOR\DRONECLIENTCPP\X64\DEBUG\DRONECLIENTCPP.EXE
|
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;
|
bool Connect;
|
||||||
Socket^ Server;
|
Socket^ Server;
|
||||||
|
|
||||||
// Добавлен конструктор
|
ConnectData(bool connect, Socket^ server);
|
||||||
ConnectData(bool connect, Socket^ server)
|
|
||||||
{
|
|
||||||
Connect = connect;
|
|
||||||
Server = server;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
ref class ReceiveData
|
ref class ReceiveData
|
||||||
@ -36,13 +31,7 @@ namespace DroneSimulator {
|
|||||||
int Size;
|
int Size;
|
||||||
Socket^ Server;
|
Socket^ Server;
|
||||||
|
|
||||||
// Добавлен конструктор
|
ReceiveData(array<Byte>^ buffer, int size, Socket^ server);
|
||||||
ReceiveData(array<Byte>^ buffer, int size, Socket^ server)
|
|
||||||
{
|
|
||||||
Buffer = buffer;
|
|
||||||
Size = size;
|
|
||||||
Server = server;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -53,96 +42,27 @@ namespace DroneSimulator {
|
|||||||
array<Byte>^ buffer = gcnew array<Byte>(size);
|
array<Byte>^ buffer = gcnew array<Byte>(size);
|
||||||
};
|
};
|
||||||
|
|
||||||
bool Connected = false;
|
bool Connected;
|
||||||
Socket^ ServerSocket = nullptr;
|
Socket^ ServerSocket;
|
||||||
ServerData^ DataServer = gcnew ServerData();
|
ServerData^ DataServer;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
delegate void ClientCallback(Object^ o);
|
delegate void ClientCallback(Object^ o);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ClientCallback^ ConnectionCallback;
|
ClientCallback^ ConnectionCallback;
|
||||||
ClientCallback^ ReceiveCallback;
|
ClientCallback^ ReceiveCallback;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
NetClient(); // Добавлен конструктор
|
||||||
|
|
||||||
enum class ClientState { Error, Connected, Stop };
|
enum class ClientState { Error, Connected, Stop };
|
||||||
|
|
||||||
ClientState Connect(String^ Addr, int Port, ClientCallback^ Connection, ClientCallback^ Receive)
|
ClientState Connect(String^ Addr, int Port, ClientCallback^ Connection, ClientCallback^ Receive);
|
||||||
{
|
void Close();
|
||||||
if (Connected)
|
void Send(array<Byte>^ data);
|
||||||
{
|
|
||||||
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 (...) {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void ReadCallback(IAsyncResult^ ar)
|
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 (...) {}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
}
|
}
|
Binary file not shown.
@ -87,6 +87,23 @@ Class DroneClient.Drone: AutoLayout, AnsiClass, Class, Public, BeforeFieldInit
|
|||||||
FromBytes(Byte[], Type): PrivateScope, Public, Static, HideBySig
|
FromBytes(Byte[], Type): PrivateScope, Public, Static, HideBySig
|
||||||
DataStream(Byte[], Int32): PrivateScope, Public, HideBySig
|
DataStream(Byte[], Int32): PrivateScope, Public, HideBySig
|
||||||
SendRequest(): 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
|
Class DroneSimulator.NetClient: AutoLayout, AnsiClass, Class, Public, BeforeFieldInit
|
||||||
Void .ctor(): PrivateScope, Public, HideBySig, SpecialName, RTSpecialName
|
Void .ctor(): PrivateScope, Public, HideBySig, SpecialName, RTSpecialName
|
||||||
Methods:
|
Methods:
|
||||||
@ -121,20 +138,3 @@ Struct DroneSimulator.NetClient+ClientState: AutoLayout, AnsiClass, Class, Neste
|
|||||||
Class DroneClientCpp.FormMain: AutoLayout, AnsiClass, Class, Public, BeforeFieldInit
|
Class DroneClientCpp.FormMain: AutoLayout, AnsiClass, Class, Public, BeforeFieldInit
|
||||||
:System.Windows.Forms.Form
|
:System.Windows.Forms.Form
|
||||||
Void .ctor(): PrivateScope, Public, HideBySig, SpecialName, RTSpecialName
|
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