doubao_chat/apps/common/example/system/event/main.c

127 lines
4.0 KiB
C

#include "app_config.h"
#include "system/includes.h"
#include "event/device_event.h"
#include "event/key_event.h"
#ifdef USE_EVENT_TEST_DEMO
int sys_event_recode(u16 type, u8 from, void *event, u8 len)/* event_nitify调用的库内弱函数,可以转义事件或者对特定事件处理*/
{
printf("sys_event_recode[in %s task] run %d\r\n", os_current_task(), type);
return 0;//返回0不做任何事情,继续发送事件
return 1;//返回1不再发送事件
}
/* 一个事件到来,首先遍历所有static_event_handler的prob_handler函数处理
一般用不到*/
static int static_event_prob_handler(struct sys_event *event)
{
printf("static_event_prob_handler[in %s task] run %d\r\n", os_current_task(), event->type);
return 0;
return -EINVAL; //如果返回-EINVAL则不再递交给其他所有地方处理这个事件
}
/* 一个事件递交到当前APP处理之前的钩子函数,库内弱函数,一般用不到*/
void app_event_prepare_handler(struct sys_event *event)
{
printf("app_event_prepare_handler[in %s task] run %d\r\n", os_current_task(), event->type);
}
/* 一个事件递交到当前APP处理,实际上最常用*/
static int app1_event_handler(struct application *app, struct sys_event *event)
{
if (event->type == SYS_DEVICE_EVENT) {
struct device_event *device_e = (struct device_event *)event->payload;
printf("app1_event_handler[in %s task] SYS_DEVICE_EVENT %s \r\n", os_current_task(), device_e->arg);
} else if (event->type == SYS_KEY_EVENT) {
struct key_event *key_e = (struct key_event *)event->payload;
printf("app1_event_handler[in %s task] SYS_KEY_EVENT %d \r\n", os_current_task(), key_e->value);
}
return true; //如果返回true则不再调用 app_default_event_handler
return false;
}
/*
* 库内弱函数,默认的系统事件处理函数
* 当所有活动的app的事件处理函数都返回false时此函数会被调用
* 通常用作多个APP的统一事件处理函数
*/
void app_default_event_handler(struct sys_event *event)
{
printf("app_default_event_handler[in %s task] run %d\r\n", os_current_task(), event->type);
}
/* 当前APP处理完事件之后,遍历所有static_event_handler的post_handler函数处理,一般用不到*/
static void static_event_post_handler(struct sys_event *event)
{
printf("static_event_post_handler[in %s task] run %d\r\n", os_current_task(), event->type);
}
static void app_event_test_task(void *p)
{
os_time_dly(100); //app_core_init初始化完成后才可以测试
struct intent it;
init_intent(&it);
it.name = "APP1";
it.action = ACTION_DO_NOTHING;
start_app(&it);
key_event_enable(); //针对按键事件,需要先使能开关
while (1) {
struct device_event event = {0};
event.arg = "event_arg";
event.event = DEVICE_EVENT_IN;
event.value = 0x12345678;
device_event_notify(DEVICE_EVENT_FROM_PC, &event);
os_time_dly(200);
puts("\n\n\n\n");
struct key_event key = {0};
key.action = KEY_EVENT_CLICK;
key.value = KEY_DOWN;
key.type = KEY_EVENT_USER;
key_event_notify(KEY_EVENT_FROM_USER, &key);
os_time_dly(200);
puts("\n\n\n\n");
}
}
static int app1_state_machine(struct application *app, enum app_state state, struct intent *it)
{
return 0;
}
static const struct application_operation app1_ops = {
.state_machine = app1_state_machine,
.event_handler = app1_event_handler,
};
REGISTER_APPLICATION(app1) = {
.name = "APP1",
.ops = &app1_ops,
.state = APP_STA_DESTROY,
};
//注意一个静态事件句柄
SYS_EVENT_STATIC_HANDLER_REGISTER(static_event_handler) = {
.event_type = SYS_ALL_EVENT,
.prob_handler = static_event_prob_handler,
.post_handler = static_event_post_handler,
};
static int c_main(void)
{
os_task_create(app_event_test_task, NULL, 10, 1000, 128, "app_event_test_task");
return 0;
}
late_initcall(c_main);
#endif