diff --git a/CMakeLists.txt b/CMakeLists.txt index 4541ccc..a0fb22b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,5 +3,4 @@ find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) project(new_kbd) -target_sources(app PRIVATE src/main.c - src/modules/led_module.c) +target_sources(app PRIVATE src/main.c) diff --git a/prj.conf b/prj.conf index 4c27504..09fa7b0 100644 --- a/prj.conf +++ b/prj.conf @@ -1,4 +1,14 @@ CONFIG_CAF=y CONFIG_HEAP_MEM_POOL_SIZE=2048 CONFIG_LOG=y -CONFIG_GPIO=y + +CONFIG_LED=y +CONFIG_LED_GPIO=y +CONFIG_CAF_LEDS=y +CONFIG_CAF_LEDS_GPIO=y +CONFIG_CAF_LEDS_PM_EVENTS=y + +CONFIG_CAF_POWER_MANAGER=y +CONFIG_CAF_POWER_MANAGER_TIMEOUT=20 +CONFIG_CAF_POWER_MANAGER_ERROR_TIMEOUT=10 +CONFIG_REBOOT=y diff --git a/src/main.c b/src/main.c index f162000..a2a2676 100644 --- a/src/main.c +++ b/src/main.c @@ -3,14 +3,33 @@ #define MODULE main #include +#include +#include #include LOG_MODULE_REGISTER(MODULE); +/* + * 通过 CAF leds 模块控制第 0 号 LED 常亮。 + * 颜色值在单色 LED 上会被折算为亮度,因此这里使用白色全亮。 + */ +static const struct led_effect startup_led_effect = + LED_EFFECT_LED_ON(LED_COLOR(255, 255, 255)); + int main(void) { if (app_event_manager_init()) { LOG_ERR("Application Event Manager not initialized"); } else { + /* + * 先提交 led_event,再上报 main ready。 + * CAF leds 模块会缓存 effect,并在收到 main ready 完成初始化后开始输出。 + */ + struct led_event *event = new_led_event(); + + event->led_id = 0; + event->led_effect = &startup_led_effect; + APP_EVENT_SUBMIT(event); + module_set_state(MODULE_STATE_READY); } diff --git a/src/modules/led_module.c b/src/modules/led_module.c deleted file mode 100644 index 5f2c33c..0000000 --- a/src/modules/led_module.c +++ /dev/null @@ -1,43 +0,0 @@ -#include -#define MODULE led -#include - -#include -#include -LOG_MODULE_REGISTER(MODULE); - -static const struct gpio_dt_spec status_led = GPIO_DT_SPEC_GET(DT_PATH(led_0, chan0), gpios); - -static void led_module_start(void) -{ - if (!gpio_is_ready_dt(&status_led)) { - LOG_ERR("LED GPIO controller is not ready"); - return; - } - - int err = gpio_pin_configure_dt(&status_led, GPIO_OUTPUT_ACTIVE); - if (err) { - LOG_ERR("Failed to turn on LED (err: %d)", err); - return; - } - - LOG_INF("LED is on"); -} - -static bool app_event_handler(const struct app_event_header *aeh) -{ - /* 仅处理 module_state_event,其他事件交给系统继续分发。 */ - if (is_module_state_event(aeh)) { - const struct module_state_event *event = cast_module_state_event(aeh); - - if (check_state(event, MODULE_ID(main), MODULE_STATE_READY)) { - led_module_start(); - } - } - - return false; -} - -APP_EVENT_LISTENER(led_module, app_event_handler); -APP_EVENT_SUBSCRIBE(led_module, module_state_event); -