diff --git a/DroneClientCpp/Drone.cpp b/DroneClientCpp/Drone.cpp new file mode 100644 index 0000000..b59532a --- /dev/null +++ b/DroneClientCpp/Drone.cpp @@ -0,0 +1,197 @@ +#include "Drone.h" + +namespace DroneClient { + + // Реализация статического метода GetBytes + array^ Drone::GetBytes(Object^ data) + { + int size = Marshal::SizeOf(data); + array^ arr = gcnew array(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^ 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^ 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^ Drone::RecvDataIMU(array^ 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(0); + } + + // Реализация приватного метода RecvDataPos + array^ Drone::RecvDataPos(array^ 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(0); + } + + // Реализация приватного метода ClientRequestResponse + array^ Drone::ClientRequestResponse(DroneData::DataHead head, array^ body) + { + array^ zero = gcnew array(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(DroneStreamCount); // Инициализация массива + DroneStreamIndex = 0; + DroneStreamHead.Mode = DroneData::DataMode::None; + DroneStreamHead.Size = 0; + DroneStreamHead.Type = DroneData::DataType::None; + } + + // Реализация метода DataStream + System::Collections::Generic::List^>^ Drone::DataStream(array^ data, int size) + { + System::Collections::Generic::List^>^ ret = gcnew System::Collections::Generic::List^>(); + + 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^ body = gcnew array(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^ 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^ si = GetBytes(imu); + array^ sp = GetBytes(pos); + array^ sm = SendDataMotor4(); + + array^ send = gcnew array(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; + } +} \ No newline at end of file diff --git a/DroneClientCpp/Drone.h b/DroneClientCpp/Drone.h index 32e35d1..2b603e7 100644 --- a/DroneClientCpp/Drone.h +++ b/DroneClientCpp/Drone.h @@ -23,194 +23,24 @@ namespace DroneClient { float MotorUL, MotorUR, MotorDL, MotorDR; - static array^ GetBytes(Object^ data) - { - int size = Marshal::SizeOf(data); - array^ arr = gcnew array(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^ 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^ GetBytes(Object^ data); + static Object^ FromBytes(array^ arr, Type^ type); private: - array^ 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^ RecvDataIMU(array^ 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(0); - } - - array^ RecvDataPos(array^ 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(0); - } - - array^ ClientRequestResponse(DroneData::DataHead head, array^ body) - { - array^ zero = gcnew array(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^ SendDataMotor4(); + array^ RecvDataIMU(array^ data); + array^ RecvDataPos(array^ data); + array^ ClientRequestResponse(DroneData::DataHead head, array^ body); literal int DroneStreamCount = 512; - array^ DroneStreamData = gcnew array(DroneStreamCount); - int DroneStreamIndex = 0; - DroneData::DataHead DroneStreamHead; // Исправлено: без явной инициализации + array^ 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^>^ DataStream(array^ data, int size) - { - System::Collections::Generic::List^>^ ret = gcnew System::Collections::Generic::List^>(); - - 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^ body = gcnew array(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^ 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^ si = GetBytes(imu); - array^ sp = GetBytes(pos); - array^ sm = SendDataMotor4(); - - array^ send = gcnew array(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^>^ DataStream(array^ data, int size); + array^ SendRequest(); }; } \ No newline at end of file diff --git a/DroneClientCpp/DroneClientCpp.vcxproj b/DroneClientCpp/DroneClientCpp.vcxproj index 7d5a72e..4588522 100644 --- a/DroneClientCpp/DroneClientCpp.vcxproj +++ b/DroneClientCpp/DroneClientCpp.vcxproj @@ -118,7 +118,9 @@ + + diff --git a/DroneClientCpp/DroneClientCpp.vcxproj.filters b/DroneClientCpp/DroneClientCpp.vcxproj.filters index da4b977..6c37b72 100644 --- a/DroneClientCpp/DroneClientCpp.vcxproj.filters +++ b/DroneClientCpp/DroneClientCpp.vcxproj.filters @@ -18,6 +18,12 @@ Исходные файлы + + Исходные файлы + + + Исходные файлы + diff --git a/DroneClientCpp/DroneClientCpp/x64/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.obj b/DroneClientCpp/DroneClientCpp/x64/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.obj index 927d218..4e2ebc8 100644 Binary files a/DroneClientCpp/DroneClientCpp/x64/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.obj and b/DroneClientCpp/DroneClientCpp/x64/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.obj differ diff --git a/DroneClientCpp/DroneClientCpp/x64/Debug/Drone.obj b/DroneClientCpp/DroneClientCpp/x64/Debug/Drone.obj new file mode 100644 index 0000000..5100df5 Binary files /dev/null and b/DroneClientCpp/DroneClientCpp/x64/Debug/Drone.obj differ diff --git a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.exe.recipe b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.exe.recipe index 160b943..56d93d9 100644 --- a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.exe.recipe +++ b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.exe.recipe @@ -2,7 +2,7 @@ - D:\Projects\Simulator\DroneClientCpp\x64\Debug\DroneClientCpp.exe + C:\Projects\Simulator\DroneClientCpp\x64\Debug\DroneClientCpp.exe diff --git a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.log b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.log index f2443f5..8653d76 100644 --- a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.log +++ b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.log @@ -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 diff --git a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/CL.command.1.tlog b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/CL.command.1.tlog index 027bacd..7f6965d 100644 Binary files a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/CL.command.1.tlog and b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/CL.command.1.tlog differ diff --git a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/CL.read.1.tlog b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/CL.read.1.tlog index f8c1fe0..fe75ac3 100644 Binary files a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/CL.read.1.tlog and b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/CL.read.1.tlog differ diff --git a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/CL.write.1.tlog b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/CL.write.1.tlog index 5745a6b..bd1e816 100644 Binary files a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/CL.write.1.tlog and b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/CL.write.1.tlog differ diff --git a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/Cl.items.tlog b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/Cl.items.tlog index 6e54b74..8542a26 100644 --- a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/Cl.items.tlog +++ b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/Cl.items.tlog @@ -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 diff --git a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/DroneClientCpp.lastbuildstate b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/DroneClientCpp.lastbuildstate index b79056b..fd05cf4 100644 --- a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/DroneClientCpp.lastbuildstate +++ b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/DroneClientCpp.lastbuildstate @@ -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\| diff --git a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/ResGen.command.1.tlog b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/ResGen.command.1.tlog index 7acc16a..3cd14e6 100644 --- a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/ResGen.command.1.tlog +++ b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/ResGen.command.1.tlog @@ -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 diff --git a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/ResGen.read.1.tlog b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/ResGen.read.1.tlog index 6db3fdf..3ff0702 100644 --- a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/ResGen.read.1.tlog +++ b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/ResGen.read.1.tlog @@ -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 diff --git a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/ResGen.write.1.tlog b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/ResGen.write.1.tlog index a4a6f60..523f081 100644 --- a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/ResGen.write.1.tlog +++ b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/ResGen.write.1.tlog @@ -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 diff --git a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/link.command.1.tlog b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/link.command.1.tlog index 1bf3820..9724604 100644 Binary files a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/link.command.1.tlog and b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/link.command.1.tlog differ diff --git a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/link.read.1.tlog b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/link.read.1.tlog index 439c608..036619e 100644 Binary files a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/link.read.1.tlog and b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/link.read.1.tlog differ diff --git a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/link.secondary.1.tlog b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/link.secondary.1.tlog index 5050e9e..77b6e59 100644 --- a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/link.secondary.1.tlog +++ b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/link.secondary.1.tlog @@ -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 diff --git a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/link.write.1.tlog b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/link.write.1.tlog index 186c846..996e0e0 100644 Binary files a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/link.write.1.tlog and b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.tlog/link.write.1.tlog differ diff --git a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.vcxproj.AssemblyReference.cache b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.vcxproj.AssemblyReference.cache index d6579e8..0cd4393 100644 Binary files a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.vcxproj.AssemblyReference.cache and b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.vcxproj.AssemblyReference.cache differ diff --git a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.vcxproj.GenerateResource.cache b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.vcxproj.GenerateResource.cache index 2274cf0..1d992a4 100644 Binary files a/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.vcxproj.GenerateResource.cache and b/DroneClientCpp/DroneClientCpp/x64/Debug/DroneClientCpp.vcxproj.GenerateResource.cache differ diff --git a/DroneClientCpp/DroneClientCpp/x64/Debug/FormMain.obj b/DroneClientCpp/DroneClientCpp/x64/Debug/FormMain.obj index 06459fc..296e4ee 100644 Binary files a/DroneClientCpp/DroneClientCpp/x64/Debug/FormMain.obj and b/DroneClientCpp/DroneClientCpp/x64/Debug/FormMain.obj differ diff --git a/DroneClientCpp/DroneClientCpp/x64/Debug/NetClient.obj b/DroneClientCpp/DroneClientCpp/x64/Debug/NetClient.obj new file mode 100644 index 0000000..4750e0c Binary files /dev/null and b/DroneClientCpp/DroneClientCpp/x64/Debug/NetClient.obj differ diff --git a/DroneClientCpp/DroneClientCpp/x64/Debug/vc143.pdb b/DroneClientCpp/DroneClientCpp/x64/Debug/vc143.pdb index 0c899cd..b988d96 100644 Binary files a/DroneClientCpp/DroneClientCpp/x64/Debug/vc143.pdb and b/DroneClientCpp/DroneClientCpp/x64/Debug/vc143.pdb differ diff --git a/DroneClientCpp/NetClient.cpp b/DroneClientCpp/NetClient.cpp new file mode 100644 index 0000000..e3e7c78 --- /dev/null +++ b/DroneClientCpp/NetClient.cpp @@ -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^ 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^ 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 (...) {} + } +} \ No newline at end of file diff --git a/DroneClientCpp/NetClient.h b/DroneClientCpp/NetClient.h index 512bbc3..adfe19e 100644 --- a/DroneClientCpp/NetClient.h +++ b/DroneClientCpp/NetClient.h @@ -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^ buffer, int size, Socket^ server) - { - Buffer = buffer; - Size = size; - Server = server; - } + ReceiveData(array^ buffer, int size, Socket^ server); }; private: @@ -53,96 +42,27 @@ namespace DroneSimulator { array^ buffer = gcnew array(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^ 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^ 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); }; } \ No newline at end of file diff --git a/DroneClientCpp/x64/Debug/DroneClientCpp.exe b/DroneClientCpp/x64/Debug/DroneClientCpp.exe index ff2d9b3..899450e 100644 Binary files a/DroneClientCpp/x64/Debug/DroneClientCpp.exe and b/DroneClientCpp/x64/Debug/DroneClientCpp.exe differ diff --git a/DroneClientCpp/x64/Debug/DroneClientCpp.exe.metagen b/DroneClientCpp/x64/Debug/DroneClientCpp.exe.metagen index 80ef721..ab80ae5 100644 --- a/DroneClientCpp/x64/Debug/DroneClientCpp.exe.metagen +++ b/DroneClientCpp/x64/Debug/DroneClientCpp.exe.metagen @@ -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 diff --git a/DroneClientCpp/x64/Debug/DroneClientCpp.pdb b/DroneClientCpp/x64/Debug/DroneClientCpp.pdb index 6a8435a..7df85c2 100644 Binary files a/DroneClientCpp/x64/Debug/DroneClientCpp.pdb and b/DroneClientCpp/x64/Debug/DroneClientCpp.pdb differ