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.

186 lines
7.0 KiB

1 year ago
  1. #include "project_configs.h"
  2. #include "project_dep.h"
  3. //
  4. #include "base_service/config_service.h"
  5. #include "cmsis_os.h"
  6. #include "reg_manager.h"
  7. #define TAG "extern_if_service"
  8. typedef struct {
  9. zaf_packet_header_t *rxpacket;
  10. zaf_buf_t receipt;
  11. bool resetBoard;
  12. } extern_if_service_context_t;
  13. static udp_t m_udp_cmd_server; //
  14. osThreadId m_cmd_uart_receiver_thread; //
  15. extern DMA_HandleTypeDef COMMAND_UART_DMA_HANDLER;
  16. extern UART_HandleTypeDef COMMAND_UART;
  17. // static udp_broadcast_handler_t m_udp_camera_sync_sender; //
  18. static struct sockaddr_in m_last_rxpacket_client;
  19. static bool m_last_rxpacket_client_valid = false;
  20. static uint8_t txbuf[2048];
  21. /*******************************************************************************
  22. * *
  23. *******************************************************************************/
  24. static void create_receipt(extern_if_service_context_t *context, uint32_t ecode, uint32_t *data, size_t ndata) {
  25. zaf_packet_header_t *txpacket = (zaf_packet_header_t *)txbuf;
  26. uint32_t txpacklen = sizeof(zaf_packet_header_t) + (ndata + 1) * sizeof(uint32_t) + 1 /*checksum*/ + 2 /*tail*/;
  27. txpacket->packet_header = PACKET_HEADER;
  28. txpacket->packet_type = kzaf_packet_type_receipt;
  29. txpacket->index = context->rxpacket->index;
  30. txpacket->cmd = context->rxpacket->cmd;
  31. txpacket->ndata = ndata + 1;
  32. txpacket->data[0] = ecode;
  33. memcpy(&txpacket->data[1], data, ndata * sizeof(uint32_t));
  34. uint8_t checksum = 0;
  35. for (int i = 2; i < txpacklen - 3; i++) {
  36. checksum += txbuf[i];
  37. }
  38. txbuf[txpacklen - 3] = checksum;
  39. txbuf[txpacklen - 2] = PACKET_TAIL & 0xFF;
  40. txbuf[txpacklen - 1] = (PACKET_TAIL >> 8) & 0xFF;
  41. zaf_buf_t buf;
  42. buf.data = txbuf;
  43. buf.len = txpacklen;
  44. context->receipt = buf;
  45. }
  46. /*******************************************************************************
  47. * Ϣ *
  48. *******************************************************************************/
  49. static bool process_rx_packet(extern_if_service_context_t *cx, uint8_t *data, uint16_t len) {
  50. // ZLOGI(TAG, "process_rx_packet %d:", len);
  51. // for (int i = 0; i < len; i++) {
  52. // printf("%02x ", data[i]);
  53. // }
  54. // printf("\n");
  55. zaf_packet_header_t *rxpacket = (zaf_packet_header_t *)data;
  56. cx->rxpacket = rxpacket;
  57. if (rxpacket->packet_type != kzaf_packet_type_cmd) return false;
  58. /*******************************************************************************
  59. * Ĵ *
  60. *******************************************************************************/
  61. if (rxpacket->cmd == kzaf_cmd_reg_read) {
  62. uint32_t readbak_regval = reg_manager_read_reg(rxpacket->data[0]); // regdata
  63. create_receipt(cx, 0, &readbak_regval, 1);
  64. }
  65. /*******************************************************************************
  66. * Ĵд *
  67. *******************************************************************************/
  68. else if (rxpacket->cmd == kzaf_cmd_reg_write) {
  69. uint32_t readbak_regval = reg_manager_write_reg(rxpacket->data[0], rxpacket->data[1]);
  70. create_receipt(cx, 0, &readbak_regval, 1);
  71. }
  72. /*******************************************************************************
  73. * Ĵ *
  74. *******************************************************************************/
  75. else if (rxpacket->cmd == kzaf_cmd_reg_read_regs) {
  76. static uint32_t regcache[MAX_REG_NUM + 1];
  77. uint32_t len = MAX_REG_NUM;
  78. reg_manager_read_regs(rxpacket->data[0], rxpacket->data[1], &regcache[0], &len);
  79. create_receipt(cx, 0, regcache, len);
  80. }
  81. /*******************************************************************************
  82. * µMAC *
  83. *******************************************************************************/
  84. else if (rxpacket->cmd == kzaf_cmd_generator_new_mac) {
  85. config_generate_random_mac();
  86. config_flush();
  87. create_receipt(cx, 0, NULL, 0);
  88. } else if (rxpacket->cmd == kzaf_cmd_factory_reset) {
  89. config_factory_reset();
  90. cx->resetBoard = true;
  91. create_receipt(cx, 0, NULL, 0);
  92. } else if (rxpacket->cmd == kzaf_cmd_reboot) {
  93. cx->resetBoard = true;
  94. create_receipt(cx, 0, NULL, 0);
  95. } else if (rxpacket->cmd == kzaf_cmd_storage_cfg) {
  96. config_flush();
  97. create_receipt(cx, 0, NULL, 0);
  98. }
  99. return true;
  100. }
  101. /*******************************************************************************
  102. * *
  103. *******************************************************************************/
  104. /**
  105. * @brief UDPϢϢ
  106. *
  107. * @param server
  108. * @param client
  109. * @param data
  110. * @param len
  111. */
  112. static void udp_on_packet(udp_t *server, struct sockaddr_in *client, uint8_t *data, uint16_t len) {
  113. extern_if_service_context_t cx = {0};
  114. bool ret = process_rx_packet(&cx, data, len);
  115. if (ret) {
  116. zaf_udp_send_message2(server, client, (const char *)cx.receipt.data, cx.receipt.len);
  117. m_last_rxpacket_client_valid = true;
  118. memcpy(&m_last_rxpacket_client, client, sizeof(struct sockaddr_in));
  119. osDelay(5);
  120. if (cx.resetBoard) NVIC_SystemReset();
  121. }
  122. }
  123. static void uart_on_packet(uint8_t *packet, uint32_t len) {
  124. extern_if_service_context_t cx = {0};
  125. bool ret = process_rx_packet(&cx, packet, len);
  126. if (ret) {
  127. HAL_UART_Transmit(&COMMAND_UART, (uint8_t *)cx.receipt.data, cx.receipt.len, 1000);
  128. osDelay(2);
  129. if (cx.resetBoard) NVIC_SystemReset();
  130. }
  131. }
  132. static uint8_t g_uart_rx_buf[128];
  133. static uint32_t g_uart_rx_buf_index = 0;
  134. bool uart_is_rxing(UART_HandleTypeDef *huart) { //
  135. uint32_t uartstate = HAL_UART_GetState(huart);
  136. if (uartstate & 0x02) {
  137. return true;
  138. }
  139. return false;
  140. }
  141. void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) { g_uart_rx_buf_index = Size; }
  142. static void uart_receiver_thread(const void *) {
  143. while (1) {
  144. if (!uart_is_rxing(&COMMAND_UART)) {
  145. if (g_uart_rx_buf_index != 0) {
  146. uart_on_packet(g_uart_rx_buf, g_uart_rx_buf_index);
  147. }
  148. g_uart_rx_buf_index = 0;
  149. memset(g_uart_rx_buf, 0, sizeof(g_uart_rx_buf));
  150. HAL_UARTEx_ReceiveToIdle_DMA(&COMMAND_UART, g_uart_rx_buf, sizeof(g_uart_rx_buf) - 1);
  151. }
  152. osDelay(1);
  153. }
  154. }
  155. void extern_if_service_init() { //
  156. ZASSERT(zaf_udp_init(&m_udp_cmd_server, "extern_if_udp", ZAF_SERVICE_DEVICE_PORT, udp_on_packet, 1024, NULL));
  157. osThreadDef(cmdUartReceiverThread, uart_receiver_thread, osPriorityNormal, 0, 512);
  158. m_cmd_uart_receiver_thread = osThreadCreate(osThread(cmdUartReceiverThread), NULL);
  159. ZASSERT(m_cmd_uart_receiver_thread != NULL);
  160. }