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.

197 lines
7.3 KiB

1 year ago
1 year ago
1 year ago
1 year ago
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. else if (rxpacket->cmd == kzaf_cmd_reg_read_regs) {
  82. static uint32_t regcache[MAX_REG_NUM + 1];
  83. uint32_t len = MAX_REG_NUM;
  84. reg_manager_read_regs(rxpacket->data[0], rxpacket->data[1], &regcache[0], &len);
  85. create_receipt(cx, 0, regcache, len);
  86. }
  87. /*******************************************************************************
  88. * µMAC *
  89. *******************************************************************************/
  90. else if (rxpacket->cmd == kzaf_cmd_generator_new_mac) {
  91. config_generate_random_mac();
  92. config_flush();
  93. create_receipt(cx, 0, NULL, 0);
  94. } else if (rxpacket->cmd == kzaf_cmd_factory_reset) {
  95. config_factory_reset();
  96. cx->resetBoard = true;
  97. create_receipt(cx, 0, NULL, 0);
  98. } else if (rxpacket->cmd == kzaf_cmd_reboot) {
  99. cx->resetBoard = true;
  100. create_receipt(cx, 0, NULL, 0);
  101. } else if (rxpacket->cmd == kzaf_cmd_storage_cfg) {
  102. config_flush();
  103. create_receipt(cx, 0, NULL, 0);
  104. } else if (rxpacket->cmd == kzaf_cmd_ping) {
  105. create_receipt(cx, 0, NULL, 0);
  106. }
  107. return true;
  108. }
  109. /*******************************************************************************
  110. * *
  111. *******************************************************************************/
  112. /**
  113. * @brief UDPϢϢ
  114. *
  115. * @param server
  116. * @param client
  117. * @param data
  118. * @param len
  119. */
  120. static void udp_on_packet(udp_t *server, struct sockaddr_in *client, uint8_t *data, uint16_t len) {
  121. extern_if_service_context_t cx = {0};
  122. bool ret = process_rx_packet(&cx, data, len);
  123. if (ret) {
  124. zaf_udp_send_message2(server, client, (const char *)cx.receipt.data, cx.receipt.len);
  125. m_last_rxpacket_client_valid = true;
  126. memcpy(&m_last_rxpacket_client, client, sizeof(struct sockaddr_in));
  127. osDelay(5);
  128. if (cx.resetBoard) NVIC_SystemReset();
  129. }
  130. }
  131. static void uart_on_packet(uint8_t *packet, uint32_t len) {
  132. extern_if_service_context_t cx = {0};
  133. bool ret = process_rx_packet(&cx, packet, len);
  134. if (ret) {
  135. HAL_UART_Transmit(&COMMAND_UART, (uint8_t *)cx.receipt.data, cx.receipt.len, 1000);
  136. osDelay(2);
  137. if (cx.resetBoard) NVIC_SystemReset();
  138. }
  139. }
  140. static uint8_t g_uart_rx_buf[128];
  141. static uint32_t g_uart_rx_buf_index = 0;
  142. bool uart_is_rxing(UART_HandleTypeDef *huart) { //
  143. uint32_t uartstate = HAL_UART_GetState(huart);
  144. if (uartstate & 0x02) {
  145. return true;
  146. }
  147. return false;
  148. }
  149. void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) { g_uart_rx_buf_index = Size; }
  150. static void uart_receiver_thread(const void *) {
  151. while (1) {
  152. if (!uart_is_rxing(&COMMAND_UART)) {
  153. if (g_uart_rx_buf_index != 0) {
  154. uart_on_packet(g_uart_rx_buf, g_uart_rx_buf_index);
  155. }
  156. g_uart_rx_buf_index = 0;
  157. memset(g_uart_rx_buf, 0, sizeof(g_uart_rx_buf));
  158. HAL_UARTEx_ReceiveToIdle_DMA(&COMMAND_UART, g_uart_rx_buf, sizeof(g_uart_rx_buf) - 1);
  159. }
  160. osDelay(1);
  161. }
  162. }
  163. void extern_if_service_init() { //
  164. ZASSERT(zaf_udp_init(&m_udp_cmd_server, "extern_if_udp", ZAF_SERVICE_DEVICE_PORT, udp_on_packet, 1024, NULL));
  165. osThreadDef(cmdUartReceiverThread, uart_receiver_thread, osPriorityNormal, 0, 512);
  166. m_cmd_uart_receiver_thread = osThreadCreate(osThread(cmdUartReceiverThread), NULL);
  167. ZASSERT(m_cmd_uart_receiver_thread != NULL);
  168. }