From 7eba07d667cf1a7613fed1170e884a3a43123fe1 Mon Sep 17 00:00:00 2001 From: We-unite <3205135446@qq.com> Date: Tue, 11 Jun 2024 22:10:20 +0800 Subject: wheel ctrl finished, can use udpserver ctrl wheel --- .gitignore | 1 + CMakeLists.txt | 17 +++++++++++++++++ README.md | 8 ++++++++ lib/liblcm.so | Bin 0 -> 144320 bytes serial.c | 20 ++++++++++++++------ udp2lcm.c | 26 ++++++++++++++++++++------ 6 files changed, 60 insertions(+), 12 deletions(-) create mode 100644 CMakeLists.txt create mode 100644 README.md create mode 100755 lib/liblcm.so diff --git a/.gitignore b/.gitignore index 367f77e..938c377 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ build/* +bin/* .vscode/* \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..da5fc52 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,17 @@ +cmake_minimum_required(VERSION 3.10) +project(WheelCtrl) + +# Set the output directory for the build executables. +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin) +add_compile_options(-g -w) + +# Find the required libraries +find_library(LCM_LIBRARY lcm lib) + +# Add the executable serial +add_executable(serial serial.c path/path_ctrl_t.c) +target_link_libraries(serial ${LCM_LIBRARY}) + +# Add the executable udp2lcm +add_executable(udp2lcm udp2lcm.c path/path_ctrl_t.c) +target_link_libraries(udp2lcm ${LCM_LIBRARY}) \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..b00f48f --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +这是ohos项目中关于udp与lcm互转服务器、以及轮子控制的代码。 + +# 功能说明 +- udp2lcm.c是udp与lcm互转服务器的代码,该服务器负责: + - 接收来自手机端的udp包,解析其命令,发布到对应的lcm通道,供轮子控制模块或算法模块使用 + - 将所有来自算法模块或轮子控制模块的lcm包,转发到手机端 + - 必要的其他功能,如心跳包的更新与发送、拉起http服务器等 +- serial.c串口通信,是轮子控制模块,接收来自对应信道的lcm命令,解析其命令后发送到轮子的驱动板,控制轮子的转动 \ No newline at end of file diff --git a/lib/liblcm.so b/lib/liblcm.so new file mode 100755 index 0000000..cb18db8 Binary files /dev/null and b/lib/liblcm.so differ diff --git a/serial.c b/serial.c index 6251675..6b4eb72 100644 --- a/serial.c +++ b/serial.c @@ -10,6 +10,7 @@ typedef unsigned char byte; #define MAX_BUFFER_SIZE 1024 +#define DEFAULT_SPEED 0x15 int fd; // 轮子的串口文件描述符 char portname[50] = "/dev/ttyUSB0"; // 串口设备名 @@ -19,18 +20,24 @@ struct termios tty; bool whellInit(); bool wheelSend(byte a, byte a_v, byte b, byte b_v); void speedControl(byte status, byte speed); -void parseCmd(const path_ctrl_t *msg, void *user); +void parseCmd(const lcm_recv_buf_t *rbuf, const char *channel, + const path_ctrl_t *msg, void *userdata); int main() { if (!whellInit()) { goto err; } - lcm *path_lcm = lcm_create(NULL); + lcm_t *path_lcm = lcm_create(NULL); if (!path_lcm) { fprintf(stderr, "Failed to create LCM\n"); goto err; } - path_ctrl_t_subscribe(path_lcm, "PATH_CTRL", parseCmd); + path_ctrl_t cmd; + path_ctrl_t_subscribe(path_lcm, "wheel_ctrl", parseCmd, &cmd); + + while (true) { + lcm_handle(path_lcm); + } err: close(fd); @@ -102,17 +109,18 @@ bool wheelSend(byte a, byte a_v, byte b, byte b_v) { return true; } -void parseCmd(const path_ctrl_t *msg, void *user) { +void parseCmd(const lcm_recv_buf_t *rbuf, const char *channel, + const path_ctrl_t *msg, void *userdata) { byte status = msg->cmd, speed = msg->speed; switch (status) { case 1: wheelSend(0x01, speed, 0x01, speed); break; case 2: - wheelSend(0x02, speed, 0x01, speed); + wheelSend(0x02, DEFAULT_SPEED, 0x01, DEFAULT_SPEED); break; case 3: - wheelSend(0x01, speed, 0x02, speed); + wheelSend(0x01, DEFAULT_SPEED, 0x02, DEFAULT_SPEED); break; case 0: default: diff --git a/udp2lcm.c b/udp2lcm.c index ec8aee8..c328a96 100644 --- a/udp2lcm.c +++ b/udp2lcm.c @@ -10,9 +10,19 @@ * cmd为0停,1前,2左,3右 */ #include "path/path_ctrl_t.h" +#include +#include +#include +#include +#include +#include +#include #include #include #include +#include +#include +#include #define MAX_BUFFER_SIZE 1024 #define PORT 5001 @@ -37,6 +47,9 @@ int main() { } // 开启udp接收线程 pthread_create(&udpRecv, NULL, udpRecvHandler, NULL); + while (true) { + pause(); + } return 0; } @@ -62,6 +75,7 @@ void udpRecvHandler() { int retval; struct pollfd fds; + printf("udpRecvHandler\n"); if ((socketfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) { fprintf(stderr, "Error: Failed to create socket\n"); return; @@ -69,7 +83,7 @@ void udpRecvHandler() { memset((char *)&serverAddr, 0, sizeof(serverAddr)); memset(buffer, 0, sizeof(buffer)); serverAddr.sin_family = AF_INET; - serverAddr.sin_port = htons(port); + serverAddr.sin_port = htons(PORT); serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(socketfd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) == @@ -107,7 +121,9 @@ void udpRecvHandler() { break; } else if (retval == 0) { printf("No data within three seconds.\n"); - speedControl(0, 0); + // out of 3s, stop the wheel + path_ctrl_t path = {0, 0}; + path_ctrl_t_publish(path_ctrl_lcm, "wheel_ctrl", &path); } else { bytesReceived = recvfrom(socketfd, buffer, MAX_BUFFER_SIZE, 0, (struct sockaddr *)&clientAddr, &addrLen); @@ -136,7 +152,7 @@ void udpSendHandler() { memset((char *)&serverAddr, 0, sizeof(serverAddr)); serverAddr.sin_family = AF_INET; // 设置地址族为IPv4 - serverAddr.sin_port = htons(port); // 设置端口号 + serverAddr.sin_port = htons(PORT); // 设置端口号 if (inet_aton(clientIP, &serverAddr.sin_addr) == 0) { fprintf(stderr, "Error: Failed to convert IP address\n"); close(sockfd); @@ -146,14 +162,13 @@ void udpSendHandler() { while (true) { sendto(sockfd, (const char *)heartBeat, 9, 0, (struct sockaddr *)&serverAddr, sizeof(serverAddr)); - printf("Send: Data %02x udpSend successfully!\n", a); sleep(1); } } void parseCmd(const char *buffer, int bytesReceived) { // TODO: 完成本函数的内容 - if (buffer == NULL || strlen(buffer) != 9) { + if (buffer == NULL) { fprintf(stderr, "Error: Invalid message\n"); return; } @@ -179,6 +194,5 @@ void parseCmd(const char *buffer, int bytesReceived) { */ } else if (buffer[0] == 3) { // 手机发来的终点坐标,转发给算法模块 - ; } } \ No newline at end of file -- cgit v1.2.3-70-g09d2