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.

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