事件对接

一、概述

1.说明

页面交互行为的处理流程已经搭建完成,用户可以根据自己的需求以及实际的接口修改每个事件行为下的处理内容,控件和框架部分的预设处理请勿修改。
所有的数据处理均放在文件app_tool_event.c中。

2.交互类型

触发交互的触发类型主要分为5类:屏幕触控、硬件按键、硬件滚轮、控件事件、控制命令。
交互执行的行为类型主要分为5类:UI页面跳转、设置控件、设置数据、调用系统接口、调用脚本 交互行为id和触发源id的具体定义可以查看《SiFli GUI Builder事件源对照表》、《SiFli GUI Builder事件行为对照表》。

二、事件行为处理

1.事件行为的数据

大部分的事件行为都会带有数据作为行为参数,不同的行为类型对应不同的行为数据:

typedef struct
{
    char id[SFAT_ID_LENGTH_COMM];
} event_id_t;		//当efunc_id为UI页面跳转

typedef struct
{
    uint32_t record_uid;
    uint32_t value;
    struct
    {
        uint32_t value_mode : 1;    /*1: value is used as data record UID */
        uint32_t reserved : 31;
    } flag;    
} event_property_t;	//当efunc_id为设置控件

typedef struct
{
    uint32_t data_uid;
    int32_t value;
} event_data_t;		//当efunc_id为设置数据

typedef struct
{
    int32_t value;
} event_value_t;	//当efunc_id为调用系统接口

2.事件行为的处理

固件处理事件行为的接口函数:

/*
*param: efunc_id 事件行为id
*param: event_data 行为数据
*/
void sfat_handle_event_func(sfat_manager_node_t *node, sfat_theme_t *theme, uint32_t efunc_id, void *data);

通过解析efunc_id,获取要执行的行为类型,然后解析event_data获取对应的行为参数。

2.1 页面跳转

typedef struct
{
    char id[16];
} event_id_t;		//当efunc_id为UI页面跳转

event_data_t *event_data = (event_data_t *)data;

从data中获取到要跳转的页面的ID。

2.2 设置控件

typedef struct
{
    uint32_t record_uid;            /* obj 's record uid , use this can find the obj */
    union
    {
        int32_t value;              /* property value */
        uint32_t data_uid;          /* property resource uid */
    };                              /* use which depends on value_mode in flag */

    int32_t state;                  /* property state */
    struct
    {
        uint32_t value_mode : 1;    /* 1: value, 2:data_uid */
        uint32_t reserved : 31;
    } flag;
} event_property_t;
event_property_t *event_property = (event_property_t *)data;;

从data中获取要设置控件的信息。

2.3 设置数据

typedef struct
{
    uint32_t data_uid;              /* data record uid */
    int32_t value;                  /* data value */
    struct
    {
        uint32_t value_mode : 1;    /* 0: value is target, 1:value is add or reduce on from the original data */
        uint32_t reserved : 31;
    } flag;
} event_data_t;
event_data_t *event_data = (event_data_t *)data;

从data中获取要设置的数据源的信息。

2.4 调用系统接口

根据不同的系统接口,所需参数不同。以播放音频为例:

typedef struct
{
    uint8_t loop;                   /* loop times, 0:forever */
    uint8_t name_len;               /* audio name length */
    uint16_t reserved;

    struct
    {
        char *name;
    } dynamic;
} event_audio_t;
event_audio_t *event_id = (event_audio_t *)data;

从data中获取要播放的音频的名称。

2.5 调用脚本

event_id_t *event_id = (event_id_t *)data;

从data中获取要脚本的名称。

三、外部按键与滚轮

1.按键和滚轮的处理

当工具中的某一页配置了外部按键和滚轮的事件处理以后,在固件运行此页面时,会修改默认的按键和滚轮处理回调函数: 注意:由于固件的限制,现在只能配置按下状态触发事件。(抬起事件会一直上报导致一直触发)

static int32_t sfat_keypad_handler(lv_key_t key, lv_indev_state_t state);
static void sfat_encoder_cb(lv_obj_t *encoder, lv_key_t key);

通过此功能配置,可以实现外部滚轮切换选中UI上的按键,再通过外部按键按下是触发UI页面上的按键事件。