【RK2206】3. 处理迪文屏事件

1 前言

使用小凌派和迪文屏进行通信,有一些特殊的命令,为了方便识别及处理,我设计了迪文屏事件接收结构体,用于存放命令以及需要执行的函数。

2 基础

2.1 uart数据结构

迪文屏uart传输的数据结构是uint8_t,使用十六进制显示为0x5A A5 XX 83 YY YY ZZ ZZ 。

命令结构:

5AA5为标志位,默认起始
XX为字节长度,也就是XX后面又多少字节。比如该条指令,XX就是05。(83 YY YY ZZ ZZ共5个字节)
83/82为读写状态位
YYYY为地址,比如3000
ZZZZ为地址内存放的数据,注意迪文屏一个地址存放2字节数据。

为了方便处理,我尝试将uint8_t存储为字符串char。

处理方法也较为简单,使用sprintf(“%x”)函数。

char temp_c[3];
char * uint8_t2char(uint8_t value)
{
    memset(temp_c,0x00,3);
    sprintf(temp_c, "%02X", value);
    // printf("temp_c = [%s]\n",temp_c);
    return temp_c;
}

temp_c用于临时存储数据,后续使用strcat(XXX,temp_c);将其存储到指定的字符串数组中。

2.2 事件结构体

#define EVENT_FLAG_NAME_MAX 30
#define EVENT_KEY_VALUE_MAX 11 
typedef struct
{
    char key[EVENT_KEY_VALUE_MAX];   // key[0,3] addr key[4,7] value
    char event_name[EVENT_FLAG_NAME_MAX];
    void (*func)();
}dwin_event_key_spec;

这里包含三个数据

key是检索的命令内容,比如地址是1500,值是0001,那么key就是"15000001"。
event_name是事件的介绍信息,比如"cam_open",表示这个是camera事件。
func是函数指针,当匹配到这个key的时候就可以执行该函数。

#define EVENT_KEY_SPEC_VALUE "over"
#define EVENT_KEY_SPEC_NUM_MAX 20
dwin_event_key_spec event_key_spec[EVENT_KEY_SPEC_NUM_MAX]=
{
    {"1502010012",  "search",   func_search},
    /* ... */
    {EVENT_KEY_SPEC_VALUE,        "end",      func_spec_end}
};

void func_search()
{
    printf("--- func_search\n");

    printf("--- func_search\n");
    return;
}

这是我列的一个特殊事件组。存放了key为"1502010012",介绍为search,执行函数是func_search。

2.3 迪文命令结构体

获取到了uart的uint8_t指针,我将信息都解析存储到dwin_cmd结构体中,方便后续使用。

typedef struct
{
    uint8_t head[2];
    uint8_t len;
    uint8_t wr;
    uint8_t addr[2];
    uint8_t * value;
    // uint8_t cmd_u8[DWIN_CMD_LEN_U8_MAX];
    uint8_t * cmd_u8;
    char * cmd_char;
}dwin_cmd;

cmd_u8和cmd_char需要使用malloc分配对应的空间用于存放命令。

4 事件判断

事件添加步骤

  1. 在event_key_spec中添加自己需要的关键字、介绍、执行函数
  2. 获取到uart的u8数据,将其存储到字符串数组中
  3. 获取char指针指向该命令的value位置
  4. strcmp指针以及表中的key
void searc_spec_event(dwin_cmd * cmd)
{
    printf("search spec event\n");
    dwin_event_key_spec * temp_value ;
    temp_value = &event_key_spec[0];

    // printf("spec event key = %s\n",temp_value->key);

    for(int i = 0; strcmp(temp_value->key,EVENT_KEY_SPEC_VALUE) != 0 && i<EVENT_KEY_SPEC_NUM_MAX ; i++)
    {
        // printf("spec event key = %s\n",temp_value->key);
        // printf("spec event value = %s\n",cmd->cmd_char + DWIN_CMD_CHAR_ADDR_VALUE);
        if(strstr(cmd->cmd_char + DWIN_CMD_CHAR_ADDR_VALUE, temp_value->key ) != NULL)
        {
            temp_value->func();
            printf("find spec event, value = %s, name = %s\n",temp_value->key,temp_value->event_name);
            return;
        }
        temp_value = &event_key_spec[i];
    }

    printf("unfind spec key\n");
    return;
}

5 结果

在迪文屏按下检索图标,自动上报1502010012,事件监听到并执行对应的func_search函数。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值