-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.cpp
105 lines (88 loc) · 3.62 KB
/
server.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <iostream>
#include <chrono>
#include <thread>
#include <vector>
#include <cstring>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <unistd.h>
#include <algorithm> // Для std::reverse
void float_to_big_endian(float value, uint8_t* bytes) {
std::memcpy(bytes, &value, sizeof(float));
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
// Если система little-endian, переворачиваем байты
std::reverse(bytes, bytes + sizeof(float));
#endif
}
void send_angles(float gusl_angle, float gusr_angle, float richag_angle, float golova_angle, const std::string& ip = "172.17.0.1", int port = 8500, int sockfd = -1) {
// Создаем буфер для хранения данных
uint8_t data[16]; // 4 угла по 4 байта
// Преобразуем каждый угол в big-endian формат
float_to_big_endian(gusl_angle, &data[0]);
float_to_big_endian(gusr_angle, &data[4]);
float_to_big_endian(richag_angle, &data[8]);
float_to_big_endian(golova_angle, &data[12]);
// Настраиваем адрес
sockaddr_in addr{};
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
inet_pton(AF_INET, ip.c_str(), &addr.sin_addr);
// Отправляем данные
sendto(sockfd, data, sizeof(data), 0, (sockaddr*)&addr, sizeof(addr));
std::cout << "Отправлены углы на " << ip << ":" << port << " - GusL: " << gusl_angle << ", GusR: " << gusr_angle << ", Richag: " << richag_angle << ", Golova: " << golova_angle << std::endl;
}
int main() {
int mode;
std::cout << "Выберите режим управления:" << std::endl;
std::cout << "1. Постоянно отправлять значения" << std::endl;
std::cout << "2. Отправить определенное значение" << std::endl;
std::cout << "Введите номер режима: ";
std::cin >> mode;
// Создаем UDP-сокет
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("Не удалось создать сокет");
return -1;
}
if (mode == 1) {
float gusl_angle = 90.0f;
float gusr_angle = 90.0f;
float richag_angle = 180.0f;
float golova_angle = 90.0f;
bool decreasing = true;
while (true) {
send_angles(gusl_angle, gusr_angle, richag_angle, golova_angle, "172.17.0.1", 8500, sockfd);
// Обновляем углы
if (decreasing) {
gusl_angle -= 1.0f;
gusr_angle -= 1.0f;
richag_angle -= 1.0f;
golova_angle -= 1.0f;
if (gusl_angle <= 0.0f) {
decreasing = false;
}
} else {
gusl_angle += 1.0f;
gusr_angle += 1.0f;
richag_angle += 1.0f;
golova_angle += 1.0f;
if (gusl_angle >= 90.0f) {
decreasing = true;
}
}
// Задержка между отправками
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
} else if (mode == 2) {
std::vector<float> angles(4);
std::cout << "Введите 4 значения углов (через пробел): ";
for (int i = 0; i < 4; ++i) {
std::cin >> angles[i];
}
send_angles(angles[0], angles[1], angles[2], angles[3], "172.17.0.1", 8500, sockfd);
} else {
std::cout << "Некорректный режим." << std::endl;
}
close(sockfd);
return 0;
}