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.

377 lines
13 KiB

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