You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

336 lines
11 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. #include "stm32f4xx_hal.h"
  2. #include "lwip.h"
  3. #include "udp.h"
  4. #include "string.h"
  5. #include "udpclient.h"
  6. #include "socket.h"
  7. #include "sockets.h"
  8. #include "def.h"
  9. #include "encoder.h"
  10. #include "zport.h"
  11. #define cmd_checksum(data) \
  12. if (computesum8((char *)data, recv_datalen - 1) != data->checksum) \
  13. { \
  14. printf("checksum error\r\n"); \
  15. return; \
  16. }
  17. static bool udp_client_active_flag;
  18. static bool genlock_and_esync_active_flag;
  19. /* 定义端口号 */
  20. #define UDP_REMOTE_PORT 8881 /* 远端端口 */
  21. #define UDP_LOCAL_PORT 8880 /* 本地端口 */
  22. #define SERVER_FAMILY AF_INET
  23. #define SOCKET_ERROR -1
  24. #define BUFFER_SIZE 256 // 缓冲区大小
  25. #define ACTIVE_ID 0XDD
  26. #define DEVICE_ID 0X01
  27. #define AVTIVE_DISABLE 0
  28. #define ACTIVE_ENABLE 1
  29. #define CLEAR_ENCODER_ALL 0
  30. #define CLEAR_ENCODER_1 1
  31. #define CLEAR_ENCODER_2 2
  32. static char s_sendBuf[BUFFER_SIZE]; // 发送数据的缓冲区
  33. static char s_receBuf[BUFFER_SIZE]; // 接收数据的缓冲区
  34. SOCKET sock_Client = 0; // 客户端用于通信的Socket
  35. static struct sockaddr_in addr_server;
  36. static struct sockaddr_in addr_client;
  37. static struct sockaddr_in sock;
  38. socklen_t sock_len = sizeof(sock);
  39. static active_report_data_t active_report_data_structer;
  40. static int active_report_cycle;
  41. static void active_report_data_structer_init(void)
  42. {
  43. /* index在每次上报一次主动上报数据后+1,时间戳在获取ESync命令时更新,编码器数值在 active_report_data_structer_update中更新,校验和在上传数据前(udp_client_active_response)进行更新*/
  44. active_report_data_structer.index = 0; /* */
  45. active_report_data_structer.cmd_id = ACTIVE_ID; /* 指令id */
  46. active_report_data_structer.time_stamp_s = 0; /* 时间戳 */
  47. active_report_data_structer.encoder_1_count = 0; /* 编码器1计数 */
  48. active_report_data_structer.encoder_2_count = 0; /* 编码器2计数 */
  49. active_report_data_structer.device_id = DEVICE_ID; /* 设备ID号 */
  50. }
  51. static void active_report_data_structer_update(void)
  52. {
  53. /* 时间戳暂时先不管,后续完善 */
  54. encoder_read_with_encoder(CAMERA_ENCODER, &active_report_data_structer.encoder_1_count);
  55. encoder_read_with_encoder(DRIVEN_ENCODER_GEAR, &active_report_data_structer.encoder_2_count);
  56. }
  57. static void get_encoder_response_encoder_update(get_encoder_respont_t *get_encoder_respont_structer)
  58. {
  59. /* 时间戳暂时先不管,后续完善 */
  60. active_report_data_structer_update();
  61. get_encoder_respont_structer->encoder1 = active_report_data_structer.encoder_1_count;
  62. get_encoder_respont_structer->encoder2 = active_report_data_structer.encoder_2_count;
  63. }
  64. static void udp_client_create_basic_response(basic_report_data_t *rxcmd, int recv_datalen)
  65. {
  66. /* 因为发送和接收是一致的,所以不需要二次校验,直接把接收的数据发送即可 */
  67. if (sendto(sock_Client, rxcmd, sizeof(basic_report_data_t), 0, (struct sockaddr *)&addr_server, sizeof(struct sockaddr_in)) == SOCKET_ERROR)
  68. {
  69. printf("send basic_response error\r\n");
  70. }
  71. }
  72. static void udp_client_create_get_encoder_response(get_encoder_report_t *get_encoder_cmd, int recv_datalen)
  73. {
  74. get_encoder_respont_t get_encoder_respont_structer;
  75. get_encoder_respont_structer.index = get_encoder_cmd->index;
  76. get_encoder_respont_structer.cmd_id = get_encoder_cmd->cmd_id;
  77. get_encoder_response_encoder_update(&get_encoder_respont_structer);
  78. get_encoder_respont_structer.checksum = computesum8((char *)&get_encoder_respont_structer, sizeof(get_encoder_respont_t) - 1);
  79. if (sendto(sock_Client, &get_encoder_respont_structer, sizeof(get_encoder_respont_t), 0, (struct sockaddr *)&addr_server, sizeof(struct sockaddr_in)) == SOCKET_ERROR)
  80. {
  81. printf("send basic_response error\r\n");
  82. }
  83. }
  84. static void udp_client_active_response(void)
  85. {
  86. active_report_data_structer.checksum = computesum8((char *)&active_report_data_structer, sizeof(active_report_data_t) - 1);
  87. if (sendto(sock_Client, &active_report_data_structer, sizeof(active_report_data_t), 0, (struct sockaddr *)&addr_server, sizeof(struct sockaddr_in)) == SOCKET_ERROR)
  88. {
  89. printf("send basic_response error\r\n");
  90. }
  91. }
  92. static void udp_client_all_encoder_light_set(encoder_light_state_t state)
  93. {
  94. if (state == STANDBY)
  95. {
  96. encoder_set_state(CAMERA_ENCODER, STANDBY);
  97. encoder_set_state(DRIVEN_ENCODER_GEAR, STANDBY);
  98. }
  99. else if (state == WORKING)
  100. {
  101. encoder_set_state(CAMERA_ENCODER, WORKING);
  102. encoder_set_state(DRIVEN_ENCODER_GEAR, WORKING);
  103. }
  104. }
  105. void udp_client_recv_data_dump(int recv_datalen)
  106. {
  107. /* debug使用 */
  108. for (size_t i = 0; i < recv_datalen; i++)
  109. {
  110. printf("%d ", s_receBuf[i]);
  111. }
  112. printf("\r\n");
  113. }
  114. void config_server(struct sockaddr_in *addr_server)
  115. {
  116. addr_server->sin_family = SERVER_FAMILY;
  117. addr_server->sin_port = htons(UDP_REMOTE_PORT);
  118. addr_server->sin_addr.s_addr = htonl(INADDR_BROADCAST);
  119. }
  120. void config_client(struct sockaddr_in *addr_client)
  121. {
  122. addr_client->sin_family = AF_INET;
  123. addr_client->sin_addr.s_addr = inet_addr("0.0.0.0");
  124. addr_client->sin_port = htons(UDP_LOCAL_PORT);
  125. }
  126. void udp_client_send_string(char *pData)
  127. {
  128. memcpy(s_sendBuf, pData, strlen(pData));
  129. if (sendto(sock_Client, s_sendBuf, strlen(pData), 0, (struct sockaddr *)&addr_server, sizeof(struct sockaddr_in)) == SOCKET_ERROR)
  130. {
  131. printf("send string error\n");
  132. }
  133. }
  134. void udp_client_init(void)
  135. {
  136. active_report_data_structer_init();
  137. active_report_cycle = 1000; /* 上报周期开始设置默认为1S */
  138. // bool bOpt = true;
  139. struct timeval tv = {0, 1000};
  140. config_server(&addr_server);
  141. config_client(&addr_client);
  142. // 创建客户端用于通信的Socket
  143. sock_Client = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  144. if (sock_Client == SOCKET_ERROR)
  145. {
  146. printf("create socket error...\n");
  147. }
  148. else
  149. {
  150. printf("create socket success!\n");
  151. }
  152. // /* 开启广播 */
  153. // if (lwip_setsockopt(sock_Client, SOL_SOCKET, SO_BROADCAST, (char *)&bOpt, sizeof(bOpt)) == SOCKET_ERROR)
  154. // {
  155. // printf("enable broadcast error...\n");
  156. // }
  157. // else
  158. // {
  159. // printf("enable broadcast success!\n");
  160. // }
  161. /* 设置超时 */
  162. if (lwip_setsockopt(sock_Client, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv)) == SOCKET_ERROR)
  163. {
  164. printf("enable receive timeout error...\n");
  165. }
  166. else
  167. {
  168. printf("enable receive timeout success!\n");
  169. }
  170. /* 绑定 */
  171. if (bind(sock_Client, (struct sockaddr *)&addr_client, sizeof(addr_client)) == SOCKET_ERROR)
  172. {
  173. printf("Bind failed");
  174. return;
  175. }
  176. }
  177. void udp_client_recv(void)
  178. {
  179. int recv_datalen = recvfrom(sock_Client, s_receBuf, sizeof(s_receBuf), 0, (struct sockaddr *)&sock, &sock_len);
  180. if (recv_datalen > 0)
  181. {
  182. printf("udp recv data len:%d\r\n", recv_datalen);
  183. udp_client_parse(recv_datalen);
  184. }
  185. }
  186. void udp_client_parse(int recv_datalen)
  187. {
  188. if (recv_datalen >= adwin_config_protocol_size)
  189. {
  190. adwin_config_protocol_t *rxcmd = (adwin_config_protocol_t *)s_receBuf;
  191. active_report_data_structer.time_stamp_s = rxcmd->time_stamp_s;
  192. genlock_and_esync_active_flag = true;
  193. }
  194. else if (recv_datalen <= basic_report_data_size)
  195. {
  196. basic_report_data_t *rxcmd = (basic_report_data_t *)s_receBuf;
  197. get_encoder_report_t *get_encoder_cmd = (get_encoder_report_t *)s_receBuf;
  198. switch (rxcmd->cmd_id)
  199. {
  200. case CMD_SET_AUTOMATIC_REPORTING_FREQUENCY: /* 设置自动上报频率 */
  201. cmd_checksum(rxcmd);
  202. if (rxcmd->data >= 10)
  203. {
  204. active_report_cycle = rxcmd->data;
  205. }
  206. udp_client_create_basic_response(rxcmd, recv_datalen);
  207. break;
  208. case CMD_GET_ENCODER_DATA: /* 获取编码器数据 */
  209. cmd_checksum(get_encoder_cmd);
  210. udp_client_create_get_encoder_response(get_encoder_cmd, recv_datalen);
  211. if (!udp_client_active_flag)
  212. {
  213. udp_client_all_encoder_light_set(STANDBY);
  214. }
  215. break;
  216. case CMD_SET_ACTIVE: /* 设置主动上报 */
  217. cmd_checksum(rxcmd);
  218. if ((rxcmd->data == AVTIVE_DISABLE) || (rxcmd->data == ACTIVE_ENABLE))
  219. {
  220. udp_client_active_flag = rxcmd->data;
  221. if (udp_client_active_flag)
  222. {
  223. udp_client_all_encoder_light_set(WORKING);
  224. }
  225. else
  226. {
  227. udp_client_all_encoder_light_set(STANDBY);
  228. }
  229. }
  230. udp_client_create_basic_response(rxcmd, recv_datalen);
  231. break;
  232. case CMD_CLEAR_ENCODER: /* 清除编码器数据 */
  233. cmd_checksum(rxcmd);
  234. switch (rxcmd->data)
  235. {
  236. case CLEAR_ENCODER_ALL:
  237. encoder_all_encoder_clear_counter_and_structer_count();
  238. break;
  239. case CLEAR_ENCODER_1:
  240. encoder_switch_encoder_clear_count_and_structer_count(CAMERA_ENCODER);
  241. break;
  242. case CLEAR_ENCODER_2:
  243. encoder_switch_encoder_clear_count_and_structer_count(DRIVEN_ENCODER_GEAR);
  244. break;
  245. default:
  246. printf("not find clear encoder cmd\r\n");
  247. break;
  248. }
  249. udp_client_create_basic_response(rxcmd, recv_datalen);
  250. break;
  251. default:
  252. break;
  253. }
  254. }
  255. }
  256. void udp_client_active(void)
  257. {
  258. if (udp_client_active_flag)
  259. {
  260. static uint32_t lastprocess = 0;
  261. if (sys_haspassedms(lastprocess) > active_report_cycle)
  262. {
  263. lastprocess = HAL_GetTick();
  264. active_report_data_structer_update();
  265. udp_client_active_response();
  266. active_report_data_structer.index += 1;
  267. }
  268. }
  269. }
  270. void udp_client_genlock_and_esync_active(void)
  271. {
  272. if (genlock_and_esync_active_flag)
  273. {
  274. active_report_data_structer_update();
  275. udp_client_active_response();
  276. if (!udp_client_active_flag)
  277. {
  278. udp_client_all_encoder_light_set(STANDBY);
  279. }
  280. active_report_data_structer.index += 1;
  281. active_report_data_structer.time_stamp_s = 0;
  282. genlock_and_esync_active_flag = false;
  283. }
  284. }
  285. bool *udp_client_genlock_and_esync_active_flag_ret(void)
  286. {
  287. return &genlock_and_esync_active_flag;
  288. }
  289. active_report_data_t *udp_client_get_active_report_data_structer(void)
  290. {
  291. return &active_report_data_structer;
  292. }