From 353f9aca134b6eeb35ba03f662e392588d3b8a24 Mon Sep 17 00:00:00 2001 From: pNexus Date: Mon, 11 May 2026 14:23:05 +0800 Subject: [PATCH] =?UTF-8?q?feat(button):=20=E6=B7=BB=E5=8A=A0=E6=8C=89?= =?UTF-8?q?=E9=94=AE=E6=A8=A1=E5=9D=97=E5=8F=8A=E5=88=9D=E5=A7=8B=E5=8C=96?= =?UTF-8?q?=E6=8C=89=E9=94=AE=E5=8E=BB=E7=9A=AE=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inc/button.h | 7 +++++ src/button.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.c | 11 +++++++- 3 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 inc/button.h create mode 100644 src/button.c diff --git a/inc/button.h b/inc/button.h new file mode 100644 index 0000000..76c467d --- /dev/null +++ b/inc/button.h @@ -0,0 +1,7 @@ +#pragma once + +/** + * @brief 初始化按键模块:Button1 按下触发去皮 + LED1 闪烁反馈。 + * @return 0 成功,负 errno 失败。 + */ +int button_init(void); diff --git a/src/button.c b/src/button.c new file mode 100644 index 0000000..9407485 --- /dev/null +++ b/src/button.c @@ -0,0 +1,75 @@ +#include "button.h" +#include "sensor.h" + +#include +#include +#include + +LOG_MODULE_REGISTER(button, LOG_LEVEL_INF); + +/* DK Button1 = sw0, LED1 = led0 */ +static const struct gpio_dt_spec btn1 = GPIO_DT_SPEC_GET(DT_ALIAS(sw0), gpios); +static const struct gpio_dt_spec led1 = GPIO_DT_SPEC_GET(DT_ALIAS(led0), gpios); + +static struct gpio_callback btn_cb_data; +static struct k_work_delayable led_off_work; + +#define LED_FLASH_MS 200 +#define LED_BLINK_COUNT 3 + +static struct k_work tare_work; +static volatile int blink_remaining; + +static void led_off_handler(struct k_work *work) { + if (blink_remaining <= 0) return; + + blink_remaining--; + /* 奇数次:点亮;偶数次:熄灭 */ + gpio_pin_set_dt(&led1, blink_remaining & 1); + if (blink_remaining > 0) { + k_work_schedule(&led_off_work, K_MSEC(LED_FLASH_MS)); + } +} + +static void tare_work_handler(struct k_work *work) { + LOG_INF("Button1 pressed → tare"); + sensor_perform_tare(); + + /* LED1 闪烁 3 次:亮-灭-亮-灭-亮-灭 = 6 个状态翻转 */ + blink_remaining = LED_BLINK_COUNT * 2; + gpio_pin_set_dt(&led1, 1); + k_work_schedule(&led_off_work, K_MSEC(LED_FLASH_MS)); +} + +static void btn1_isr(const struct device *dev, struct gpio_callback *cb, uint32_t pins) { + k_work_submit(&tare_work); +} + +int button_init(void) { + if (!gpio_is_ready_dt(&btn1) || !gpio_is_ready_dt(&led1)) { + LOG_ERR("GPIO device not ready"); + return -ENODEV; + } + + int err; + + err = gpio_pin_configure_dt(&btn1, GPIO_INPUT); + if (err) return err; + + err = gpio_pin_interrupt_configure_dt(&btn1, GPIO_INT_EDGE_TO_ACTIVE); + if (err) return err; + + err = gpio_pin_configure_dt(&led1, GPIO_OUTPUT_INACTIVE); + if (err) return err; + + gpio_init_callback(&btn_cb_data, btn1_isr, BIT(btn1.pin)); + + err = gpio_add_callback(btn1.port, &btn_cb_data); + if (err) return err; + + k_work_init(&tare_work, tare_work_handler); + k_work_init_delayable(&led_off_work, led_off_handler); + + LOG_INF("Button1 → tare + LED1 flash initialized"); + return 0; +} diff --git a/src/main.c b/src/main.c index ed97819..8a28311 100644 --- a/src/main.c +++ b/src/main.c @@ -8,6 +8,7 @@ */ #include "ble_transport.h" +#include "button.h" #include "sensor.h" #include @@ -22,7 +23,15 @@ int main(void) { ble_transport_init(); ble_transport_adv_start(); - if (sensor_init()) return 0; + if (button_init()) { + LOG_ERR("Failed to initialize buttons"); + return -1; + } + + if (sensor_init()) { + LOG_ERR("Failed to initialize sensor"); + return -1; + } k_sleep(K_FOREVER);