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.

443 lines
16 KiB

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. checksum_flag = false; \
  16. }
  17. /* 定义端口号 */
  18. #define UDP_REMOTE_PORT 8881 /* 远端端口 */
  19. #define UDP_LOCAL_PORT 8880 /* 本地端口 */
  20. #define SERVER_FAMILY AF_INET
  21. #define SOCKET_ERROR -1
  22. #define BUFFER_SIZE 256 // 缓冲区大小
  23. #define ACTIVE_CMD_ID 0XC003
  24. #define TRIGGER_ID 0XC004
  25. #define DEVICE_ID 0X01
  26. #define AVTIVE_DISABLE 0
  27. #define ACTIVE_ENABLE 1
  28. #define TRIGGER_MOD_CLOSE 0
  29. #define TRIGGER_MOD_GENLOCK_OPEN 1
  30. #define CLEAR_ENCODER_ALL 0
  31. #define CLEAR_ENCODER_1 1
  32. #define CLEAR_ENCODER_2 2
  33. #define ORDER_RECEIPT_INTERCONVERSION 0X8000
  34. #define ACTIVE_MIN_REPORT_CYCLE 50
  35. static bool udp_client_active_flag;
  36. static bool genlock_and_esync_active_flag;
  37. static uint16_t s_trigger_mode;
  38. static char s_sendBuf[BUFFER_SIZE]; // 发送数据的缓冲区
  39. static char s_receBuf[BUFFER_SIZE]; // 接收数据的缓冲区
  40. SOCKET sock_Client = 0; // 客户端用于通信的Socket
  41. static struct sockaddr_in addr_server;
  42. static struct sockaddr_in addr_client;
  43. static struct sockaddr_in sock;
  44. socklen_t sock_len = sizeof(sock);
  45. static protocol_active_and_trigger_report_t active_report_data_structer;
  46. static protocol_active_and_trigger_report_t trigger_report_data_structer;
  47. static int active_report_cycle;
  48. static void udp_client_all_encoder_light_set(encoder_light_state_t state)
  49. {
  50. if (state == STANDBY)
  51. {
  52. encoder_set_state(CAMERA_ENCODER, STANDBY);
  53. encoder_set_state(DRIVEN_ENCODER_GEAR, STANDBY);
  54. }
  55. else if (state == WORKING)
  56. {
  57. encoder_set_state(CAMERA_ENCODER, WORKING);
  58. encoder_set_state(DRIVEN_ENCODER_GEAR, WORKING);
  59. }
  60. }
  61. /* ===================================================================== */
  62. static void active_report_data_structer_init(void)
  63. {
  64. /* index在每次上报一次主动上报数据后+1,时间戳在获取ESync命令时更新,编码器数值在 active_report_data_structer_update中更新,校验和在上传数据前(udp_client_active_response)进行更新*/
  65. active_report_data_structer.index = 0; /* */
  66. active_report_data_structer.cmd_id = ACTIVE_CMD_ID; /* 指令id */
  67. active_report_data_structer.placeholder_1 = 0;
  68. active_report_data_structer.placeholder_2 = 0;
  69. active_report_data_structer.encoder1 = 0;
  70. active_report_data_structer.encoder2 = 0;
  71. }
  72. static void trigger_report_data_structer_init(void)
  73. {
  74. /* index在每次上报一次主动上报数据后+1,时间戳在获取ESync命令时更新,编码器数值在 active_report_data_structer_update中更新,校验和在上传数据前(udp_client_active_response)进行更新*/
  75. trigger_report_data_structer.index = 0; /* */
  76. trigger_report_data_structer.cmd_id = TRIGGER_ID; /* 指令id */
  77. trigger_report_data_structer.placeholder_1 = 0;
  78. trigger_report_data_structer.placeholder_2 = 0;
  79. trigger_report_data_structer.encoder1 = 0;
  80. trigger_report_data_structer.encoder2 = 0;
  81. }
  82. static void active_report_data_structer_update(void)
  83. {
  84. /* 时间戳暂时先不管,后续完善 */
  85. encoder_read_with_encoder(CAMERA_ENCODER, &active_report_data_structer.encoder1);
  86. encoder_read_with_encoder(DRIVEN_ENCODER_GEAR, &active_report_data_structer.encoder2);
  87. }
  88. static void trigger_report_data_structer_update(void)
  89. {
  90. /* 时间戳暂时先不管,后续完善 */
  91. encoder_read_with_encoder(CAMERA_ENCODER, &trigger_report_data_structer.encoder1);
  92. encoder_read_with_encoder(DRIVEN_ENCODER_GEAR, &trigger_report_data_structer.encoder2);
  93. }
  94. /* 主动上报格式 */
  95. static void udp_client_active_report(void)
  96. {
  97. active_report_data_structer.checksum = computesum8((char *)&active_report_data_structer, sizeof(protocol_active_and_trigger_report_t) - 1);
  98. if (sendto(sock_Client, &active_report_data_structer, sizeof(protocol_active_and_trigger_report_t), 0, (struct sockaddr *)&addr_server, sizeof(struct sockaddr_in)) == SOCKET_ERROR)
  99. {
  100. printf("send basic_response error\r\n");
  101. }
  102. }
  103. /* 触发上报格式 */
  104. static void udp_client_trigger_report(void)
  105. {
  106. trigger_report_data_structer.checksum = computesum8((char *)&trigger_report_data_structer, sizeof(protocol_active_and_trigger_report_t) - 1);
  107. if (sendto(sock_Client, &trigger_report_data_structer, sizeof(protocol_active_and_trigger_report_t), 0, (struct sockaddr *)&addr_server, sizeof(struct sockaddr_in)) == SOCKET_ERROR)
  108. {
  109. printf("send basic_response error\r\n");
  110. }
  111. }
  112. /* 清除编码器数据指令回执 */
  113. static void udp_client_clear_encoder_cmd_receipt(protocol_clear_encoder_order_t *order, protocol_status_code_type state_code)
  114. {
  115. protocol_clear_encoder_receipt_t receipt;
  116. receipt.index = order->index;
  117. receipt.cmd_id = order->cmd_id + ORDER_RECEIPT_INTERCONVERSION;
  118. receipt.status_code = state_code;
  119. receipt.checksum = computesum8((char *)&receipt, sizeof(protocol_clear_encoder_receipt_t) - 1);
  120. if (sendto(sock_Client, &receipt, sizeof(protocol_clear_encoder_receipt_t), 0, (struct sockaddr *)&addr_server, sizeof(struct sockaddr_in)) == SOCKET_ERROR)
  121. {
  122. printf("send basic_response error\r\n");
  123. }
  124. }
  125. /* 读取编码器数据指令回执 */
  126. static void udp_client_read_encoder_cmd_receipt(protocol_read_encoder_order_t *order)
  127. {
  128. protocol_read_encoder_receipt_t receipt;
  129. receipt.index = order->index;
  130. receipt.cmd_id = order->cmd_id + ORDER_RECEIPT_INTERCONVERSION;
  131. active_report_data_structer_update();
  132. receipt.encoder1 = active_report_data_structer.encoder1;
  133. receipt.encoder2 = active_report_data_structer.encoder2;
  134. receipt.checksum = computesum8((char *)&receipt, sizeof(protocol_read_encoder_receipt_t) - 1);
  135. if (sendto(sock_Client, &receipt, sizeof(protocol_read_encoder_receipt_t), 0, (struct sockaddr *)&addr_server, sizeof(struct sockaddr_in)) == SOCKET_ERROR)
  136. {
  137. printf("send basic_response error\r\n");
  138. }
  139. }
  140. /* 设置主动上报指令回执 */
  141. static void udp_client_active_cmd_receipt(protocol_active_order_t *order, protocol_status_code_type state_code)
  142. {
  143. protocol_active_receipt_t receipt;
  144. receipt.index = order->index;
  145. receipt.cmd_id = order->cmd_id + ORDER_RECEIPT_INTERCONVERSION;
  146. receipt.active_report_flag = order->active_report_flag;
  147. receipt.report_cycle = order->report_cycle;
  148. receipt.status_code = state_code;
  149. receipt.checksum = computesum8((char *)&receipt, sizeof(protocol_active_receipt_t) - 1);
  150. if (sendto(sock_Client, &receipt, sizeof(protocol_active_receipt_t), 0, (struct sockaddr *)&addr_server, sizeof(struct sockaddr_in)) == SOCKET_ERROR)
  151. {
  152. printf("send basic_response error\r\n");
  153. }
  154. }
  155. /* 设置触发上报指令回执 */
  156. static void udp_client_trigger_cmd_receipt(protocol_trigger_order_t *order, protocol_status_code_type state_code)
  157. {
  158. protocol_trigger_receipt_t receipt;
  159. receipt.index = order->index;
  160. receipt.cmd_id = order->cmd_id + ORDER_RECEIPT_INTERCONVERSION;
  161. receipt.trigger_mode = order->trigger_mode;
  162. receipt.status_code = state_code;
  163. receipt.checksum = computesum8((char *)&receipt, sizeof(protocol_trigger_receipt_t) - 1);
  164. if (sendto(sock_Client, &receipt, sizeof(protocol_trigger_receipt_t), 0, (struct sockaddr *)&addr_server, sizeof(struct sockaddr_in)) == SOCKET_ERROR)
  165. {
  166. printf("send basic_response error\r\n");
  167. }
  168. }
  169. /* ===================================================================== */
  170. void udp_client_recv_data_dump(int recv_datalen)
  171. {
  172. /* debug使用 */
  173. for (size_t i = 0; i < recv_datalen; i++)
  174. {
  175. printf("%d ", s_receBuf[i]);
  176. }
  177. printf("\r\n");
  178. }
  179. void config_server(struct sockaddr_in *addr_server)
  180. {
  181. addr_server->sin_family = SERVER_FAMILY;
  182. addr_server->sin_port = htons(UDP_REMOTE_PORT);
  183. addr_server->sin_addr.s_addr = htonl(INADDR_BROADCAST);
  184. }
  185. void config_client(struct sockaddr_in *addr_client)
  186. {
  187. addr_client->sin_family = AF_INET;
  188. addr_client->sin_addr.s_addr = inet_addr("0.0.0.0");
  189. addr_client->sin_port = htons(UDP_LOCAL_PORT);
  190. }
  191. void udp_client_send_string(char *pData)
  192. {
  193. memcpy(s_sendBuf, pData, strlen(pData));
  194. if (sendto(sock_Client, s_sendBuf, strlen(pData), 0, (struct sockaddr *)&addr_server, sizeof(struct sockaddr_in)) == SOCKET_ERROR)
  195. {
  196. printf("send string error\n");
  197. }
  198. }
  199. void udp_client_init(void)
  200. {
  201. active_report_data_structer_init();
  202. trigger_report_data_structer_init();
  203. // bool bOpt = true;
  204. struct timeval tv = {0, 1000};
  205. config_server(&addr_server);
  206. config_client(&addr_client);
  207. // 创建客户端用于通信的Socket
  208. sock_Client = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  209. if (sock_Client == SOCKET_ERROR)
  210. {
  211. printf("create socket error...\n");
  212. }
  213. else
  214. {
  215. printf("create socket success!\n");
  216. }
  217. // /* 开启广播 */
  218. // if (lwip_setsockopt(sock_Client, SOL_SOCKET, SO_BROADCAST, (char *)&bOpt, sizeof(bOpt)) == SOCKET_ERROR)
  219. // {
  220. // printf("enable broadcast error...\n");
  221. // }
  222. // else
  223. // {
  224. // printf("enable broadcast success!\n");
  225. // }
  226. /* 设置超时 */
  227. if (lwip_setsockopt(sock_Client, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv)) == SOCKET_ERROR)
  228. {
  229. printf("enable receive timeout error...\n");
  230. }
  231. else
  232. {
  233. printf("enable receive timeout success!\n");
  234. }
  235. /* 绑定 */
  236. if (bind(sock_Client, (struct sockaddr *)&addr_client, sizeof(addr_client)) == SOCKET_ERROR)
  237. {
  238. printf("Bind failed");
  239. return;
  240. }
  241. }
  242. void udp_client_recv(void)
  243. {
  244. int recv_datalen = recvfrom(sock_Client, s_receBuf, sizeof(s_receBuf), 0, (struct sockaddr *)&sock, &sock_len);
  245. if (recv_datalen > 0)
  246. {
  247. printf("udp recv data len:%d\r\n", recv_datalen);
  248. udp_client_parse(recv_datalen);
  249. }
  250. }
  251. void udp_client_parse(int recv_datalen)
  252. {
  253. bool checksum_flag = true;
  254. if (recv_datalen >= adwin_config_protocol_size)
  255. {
  256. /* 时码相关逻辑暂时不处理 */
  257. // adwin_config_protocol_t *rxcmd = (adwin_config_protocol_t *)s_receBuf;
  258. // active_report_data_structer.time_stamp_s = rxcmd->time_stamp_s;
  259. // genlock_and_esync_active_flag = true;
  260. }
  261. else if (recv_datalen >= protocol_basic_size)
  262. {
  263. protocol_basic_t *protocol_basic_cmd = (protocol_basic_t *)s_receBuf;
  264. protocol_clear_encoder_order_t *protocol_clear_encoder_cmd = (protocol_clear_encoder_order_t *)s_receBuf;
  265. protocol_read_encoder_order_t *protocol_read_encoder_cmd = (protocol_read_encoder_order_t *)s_receBuf;
  266. protocol_active_order_t *protocol_active_cmd = (protocol_active_order_t *)s_receBuf;
  267. protocol_trigger_order_t *protocol_trigger_cmd = (protocol_trigger_order_t *)s_receBuf;
  268. // protocol_modify_network_configurations_order_t *protocol_modify_network_configurations_cmd = (protocol_modify_network_configurations_order_t *)s_receBuf;
  269. switch (protocol_basic_cmd->cmd_id)
  270. {
  271. case PROTOCOL_CMD_CLEAR_ENCODER: /* 清除编码器数据指令 */
  272. cmd_checksum(protocol_clear_encoder_cmd);
  273. if (checksum_flag)
  274. {
  275. /* 校验通过 */
  276. encoder_all_encoder_clear_counter_and_structer_count();
  277. udp_client_clear_encoder_cmd_receipt(protocol_clear_encoder_cmd, PROTOCOL_STATUS_SUCCESS);
  278. }
  279. else
  280. {
  281. /* 校验未通过 */
  282. udp_client_clear_encoder_cmd_receipt(protocol_clear_encoder_cmd, PROTOCOL_STATUS_PARAMETER_ERROR);
  283. }
  284. break;
  285. case PROTOCOL_CMD_READ_ENCODER: /* 读取编码器数据指令 */
  286. cmd_checksum(protocol_read_encoder_cmd);
  287. if (checksum_flag)
  288. {
  289. /* 校验通过 */
  290. udp_client_read_encoder_cmd_receipt(protocol_read_encoder_cmd);
  291. }
  292. else
  293. {
  294. /* 校验未通过 */
  295. }
  296. break;
  297. case PROTOCOL_CMD_ACTIVE: /* 配置主动上报指令 */
  298. cmd_checksum(protocol_active_cmd);
  299. if (checksum_flag)
  300. {
  301. /* 校验通过 */
  302. if ((protocol_active_cmd->active_report_flag == AVTIVE_DISABLE) || (protocol_active_cmd->active_report_flag == ACTIVE_ENABLE))
  303. {
  304. udp_client_active_flag = protocol_active_cmd->active_report_flag;
  305. if (udp_client_active_flag)
  306. {
  307. udp_client_all_encoder_light_set(WORKING);
  308. }
  309. else
  310. {
  311. udp_client_all_encoder_light_set(STANDBY);
  312. }
  313. }
  314. if (protocol_active_cmd->report_cycle >= ACTIVE_MIN_REPORT_CYCLE)
  315. {
  316. active_report_cycle = protocol_active_cmd->report_cycle;
  317. }
  318. else
  319. {
  320. active_report_cycle = ACTIVE_MIN_REPORT_CYCLE;
  321. }
  322. udp_client_active_cmd_receipt(protocol_active_cmd, PROTOCOL_STATUS_SUCCESS);
  323. }
  324. else
  325. {
  326. /* 校验未通过 */
  327. udp_client_active_cmd_receipt(protocol_active_cmd, PROTOCOL_STATUS_PARAMETER_ERROR);
  328. }
  329. break;
  330. case PROTOCOL_CMD_TRIGGER: /* 配置触发上报指令 */
  331. cmd_checksum(protocol_trigger_cmd);
  332. if (checksum_flag)
  333. {
  334. /* 校验通过 */
  335. if ((protocol_trigger_cmd->trigger_mode == TRIGGER_MOD_CLOSE) || (protocol_trigger_cmd->trigger_mode == TRIGGER_MOD_GENLOCK_OPEN))
  336. {
  337. s_trigger_mode = protocol_trigger_cmd->trigger_mode;
  338. }
  339. udp_client_trigger_cmd_receipt(protocol_trigger_cmd, PROTOCOL_STATUS_SUCCESS);
  340. }
  341. else
  342. {
  343. /* 校验未通过 */
  344. udp_client_trigger_cmd_receipt(protocol_trigger_cmd, PROTOCOL_STATUS_PARAMETER_ERROR);
  345. }
  346. break;
  347. case PROTOCOL_CMD_MODIFY_NETWORK_CONFIGURATIONS: /* 配置网络相关指令 */
  348. break;
  349. default:
  350. break;
  351. }
  352. }
  353. else
  354. {
  355. /* error */
  356. }
  357. }
  358. void udp_client_active(void)
  359. {
  360. if (udp_client_active_flag)
  361. {
  362. static uint32_t lastprocess = 0;
  363. if (sys_haspassedms(lastprocess) > active_report_cycle)
  364. {
  365. lastprocess = HAL_GetTick();
  366. active_report_data_structer_update();
  367. udp_client_active_report();
  368. active_report_data_structer.index += 1;
  369. }
  370. }
  371. }
  372. void udp_client_genlock_and_esync_active(void)
  373. {
  374. if (s_trigger_mode == TRIGGER_MOD_GENLOCK_OPEN)
  375. {
  376. if (genlock_and_esync_active_flag)
  377. {
  378. trigger_report_data_structer_update();
  379. udp_client_trigger_report();
  380. if (!udp_client_active_flag)
  381. {
  382. udp_client_all_encoder_light_set(STANDBY);
  383. }
  384. trigger_report_data_structer.index += 1;
  385. // active_report_data_structer.time_stamp_s = 0;
  386. genlock_and_esync_active_flag = false;
  387. }
  388. }
  389. }
  390. bool *udp_client_genlock_and_esync_active_flag_ret(void)
  391. {
  392. return &genlock_and_esync_active_flag;
  393. }
  394. protocol_active_and_trigger_report_t *udp_client_get_active_report_data_structer(void)
  395. {
  396. return &active_report_data_structer;
  397. }