From cfec9e59c8eaa9e6e88baaafde18c691cacac18d Mon Sep 17 00:00:00 2001 From: zhaohe Date: Wed, 3 Jan 2024 22:10:11 +0800 Subject: [PATCH] v1.0 --- iflytop_xsync/xs_delay.c | 11 +++- iflytop_xsync/xs_delay.h | 9 +-- iflytop_xsync/xs_udp.c | 4 +- iflytop_xsync/xs_udp.h | 3 +- iflytop_xsync_protocol/iflytop_xsync_protocol.h | 1 - usrc/main.cpp | 75 ++++++++++++++++++++++--- usrc/project_configs.h | 7 +++ usrc/service/extern_if_service.c | 2 +- 8 files changed, 94 insertions(+), 18 deletions(-) diff --git a/iflytop_xsync/xs_delay.c b/iflytop_xsync/xs_delay.c index 777fac0..d5f6b0b 100644 --- a/iflytop_xsync/xs_delay.c +++ b/iflytop_xsync/xs_delay.c @@ -48,4 +48,13 @@ void xs_delay_ms(int ms) { } void xs_os_delay_ms(int ms) { osDelay(ms); } -int32_t xs_get_ticket(void) { return HAL_GetTick(); } +uint32_t xs_get_ticket(void) { return HAL_GetTick(); } + +uint32_t xs_has_passedms(uint32_t ticket) { + uint32_t now = HAL_GetTick(); + if (now >= ticket) { + return now - ticket; + } else { + return 0xFFFFFFFF - ticket + now; + } +} diff --git a/iflytop_xsync/xs_delay.h b/iflytop_xsync/xs_delay.h index 41d10c1..3b5d2f1 100644 --- a/iflytop_xsync/xs_delay.h +++ b/iflytop_xsync/xs_delay.h @@ -1,6 +1,7 @@ #pragma once #include -void xs_delay_us(int us); -void xs_delay_ms(int ms); -void xs_os_delay_ms(int ms); -int32_t xs_get_ticket(void); +void xs_delay_us(int us); +void xs_delay_ms(int ms); +void xs_os_delay_ms(int ms); +uint32_t xs_get_ticket(void); +uint32_t xs_has_passedms(uint32_t ticket); diff --git a/iflytop_xsync/xs_udp.c b/iflytop_xsync/xs_udp.c index f957e8e..651efcd 100644 --- a/iflytop_xsync/xs_udp.c +++ b/iflytop_xsync/xs_udp.c @@ -16,6 +16,7 @@ static void udp_server_receive_thread(void const *argument) { // udp_t *udp_handler = (udp_t *)argument; + ZLOGI(TAG, "udp server receive thread start: %s", udp_handler->name); while (true) { struct sockaddr_in sock; socklen_t sock_len = sizeof(sock); @@ -26,13 +27,14 @@ static void udp_server_receive_thread(void const *argument) { // } } -bool xs_udp_init(udp_t *udp_handler, uint16_t port, udp_on_packet_t on_packet, int32_t rxbuf_size, void *data) { +bool xs_udp_init(udp_t *udp_handler, const char *name, uint16_t port, udp_on_packet_t on_packet, int32_t rxbuf_size, void *data) { memset(udp_handler, 0, sizeof(udp_t)); udp_handler->server.sin_family = AF_INET; udp_handler->server.sin_addr.s_addr = inet_addr("0.0.0.0"); udp_handler->server.sin_port = htons(port); udp_handler->on_packet = on_packet; udp_handler->data = data; + udp_handler->name = name; if (rxbuf_size == 0) { udp_handler->rxbuf_len = 1024; } else { diff --git a/iflytop_xsync/xs_udp.h b/iflytop_xsync/xs_udp.h index 606d89c..f4351d0 100644 --- a/iflytop_xsync/xs_udp.h +++ b/iflytop_xsync/xs_udp.h @@ -20,6 +20,7 @@ struct udp_s { int rxbuf_len; udp_on_packet_t on_packet; void *data; + const char *name; }; typedef struct { @@ -27,7 +28,7 @@ typedef struct { int sock_fd; } udp_broadcast_handler_t; -bool xs_udp_init(udp_t *udp_handler, uint16_t port, udp_on_packet_t on_packet, int32_t rxbuf_size, void *data); +bool xs_udp_init(udp_t *udp_handler, const char *name, uint16_t port, udp_on_packet_t on_packet, int32_t rxbuf_size, void *data); int xs_udp_send_message(udp_t *udp_handler, const char *remoteip, int remoteport, const char *data, int len); int xs_udp_send_message2(udp_t *udp_handler, struct sockaddr_in *add, const char *data, int len); diff --git a/iflytop_xsync_protocol/iflytop_xsync_protocol.h b/iflytop_xsync_protocol/iflytop_xsync_protocol.h index e1ef623..f609601 100644 --- a/iflytop_xsync_protocol/iflytop_xsync_protocol.h +++ b/iflytop_xsync_protocol/iflytop_xsync_protocol.h @@ -51,7 +51,6 @@ typedef struct { uint16_t cmd; uint16_t ndata; uint32_t data[]; // first is always checksum - /*uint8_t checksum*/ } iflytop_xsync_packet_header_t; typedef struct { diff --git a/usrc/main.cpp b/usrc/main.cpp index 3a0f00a..2bc904a 100644 --- a/usrc/main.cpp +++ b/usrc/main.cpp @@ -36,16 +36,75 @@ void StartDefaultTask(void const* argument) { umain(); } */ xs_gpio_t m_debug_led; +xs_gpio_t m_factory_reset_key; +xs_gpio_t m_power_led; extern "C" { void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { report_generator_service_irq_trigger(GPIO_Pin); } } +void debug_light_ctrl() { + static uint32_t lastcall = 0; + static bool light_status = false; + if (xs_has_passedms(lastcall) > 100) { + light_status = !light_status; + xs_gpio_write(&m_debug_led, light_status); + lastcall = xs_get_ticket(); + } +} + +void factory_reset_key_detect() { + static uint32_t reset_key_trigger_tp = 0; + static bool reset_key_triggered = false; + if (!reset_key_triggered) { + if (xs_gpio_read(&m_factory_reset_key)) { + reset_key_trigger_tp = xs_get_ticket(); + reset_key_triggered = true; + } + } + + if (reset_key_triggered) { + if (!xs_gpio_read(&m_factory_reset_key)) { + reset_key_triggered = false; + } else { + if (xs_has_passedms(reset_key_trigger_tp) > 3000) { + ZLOGI(TAG, "factory reset key triggered"); + config_factory_reset(); + + // m_power_led + while (xs_gpio_read(&m_factory_reset_key)) { + xs_gpio_write(&m_power_led, false); + osDelay(100); + xs_gpio_write(&m_power_led, true); + osDelay(100); + } + ZLOGI(TAG, "system reset"); + NVIC_SystemReset(); + } + } + // + } +} + void umain() { + /** + * @brief device_info init + */ + sn_t sn; + device_info_init(); + device_info_get_sn(&sn); XS_LOGI(TAG, "%s:%d", PC_PROJECT_NAME, PC_VERSION); + XS_LOGI(TAG, "sn: %x:%x:%x", sn.sn0, sn.sn1, sn.sn2); + /** - * @brief 调试指示灯初始化 + * @brief + * 1. 初始化调试指示灯 + * 2. 初始化电源指示灯 + * 3. 初始化工厂复位按键 */ xs_gpio_init_as_output(&m_debug_led, PC_DEBUG_LIGHT_GPIO, kxs_gpio_nopull, false, false); + xs_gpio_init_as_output(&m_power_led, POWER_LED_PIN, kxs_gpio_nopull, false, true); + xs_gpio_init_as_input(&m_factory_reset_key, FACTORY_RESET_KEY, kxs_gpio_nopull, kxs_gpio_no_irq, true); + // m_power_led /** * @brief 配置初始化 */ @@ -62,10 +121,7 @@ void umain() { * @brief report_generator init */ report_generator_service_init(fpga_if_get_instance()->timecode_irq_pin, fpga_if_get_instance()->camera_sync_code_irq_pin); - /** - * @brief device_info init - */ - device_info_init(); + /** * @brief reg_manager init */ @@ -77,10 +133,11 @@ void umain() { */ extern_if_service_init(); + ZLOGI(TAG, "system init done"); + while (true) { - xs_gpio_write(&m_debug_led, true); - xs_delay_ms(100); - xs_gpio_write(&m_debug_led, false); - xs_delay_ms(100); + osDelay(10); + debug_light_ctrl(); + factory_reset_key_detect(); } } diff --git a/usrc/project_configs.h b/usrc/project_configs.h index 5498d27..1e3cce8 100644 --- a/usrc/project_configs.h +++ b/usrc/project_configs.h @@ -18,3 +18,10 @@ #define PC_IRQ_PREEMPTPRIORITY_DEFAULT 5 #define PC_NVS_ENABLE 1 + +// ===================================================================== +// ===================================================================== +// ===================================================================== + +#define FACTORY_RESET_KEY PB1 +#define POWER_LED_PIN PB2 \ No newline at end of file diff --git a/usrc/service/extern_if_service.c b/usrc/service/extern_if_service.c index e65ad30..54ff873 100644 --- a/usrc/service/extern_if_service.c +++ b/usrc/service/extern_if_service.c @@ -110,7 +110,7 @@ static void udp_on_packet(udp_t *server, struct sockaddr_in *client, uint8_t *da } } -void extern_if_service_init() { ZASSERT(xs_udp_init(&m_udp_cmd_server, IFLYTOP_XSYNC_SERVICE_PORT, udp_on_packet, 1024, NULL)); } +void extern_if_service_init() { ZASSERT(xs_udp_init(&m_udp_cmd_server, "extern_if_udp", IFLYTOP_XSYNC_SERVICE_PORT, udp_on_packet, 1024, NULL)); } #if 0 void extern_if_service_send_timecode(struct sockaddr_in client, uint32_t timecode0, uint32_t timecode1) { create_and_send_timecode(client, timecode0, timecode1); } #endif