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.

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