Linux版LVGL v8 底层输入配置

/**
 * @file evdev.c
 *
 */

/*********************
 *      INCLUDES
 *********************/
#include "evdev.h"
#if USE_EVDEV != 0 || USE_BSD_EVDEV

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#if USE_BSD_EVDEV
#include <dev/evdev/input.h>
#else
#include <linux/input.h>
#endif

/*********************
 *      DEFINES
 *********************/

/**********************
 *      TYPEDEFS
 **********************/

/**********************
 *  STATIC PROTOTYPES
 **********************/
int map(int x, int in_min, int in_max, int out_min, int out_max);

/**********************
 *  STATIC VARIABLES
 **********************/
int evdev_fd;
int evdev_root_x;
int evdev_root_y;
int evdev_button;

int evdev_key_val;

/**********************
 *      MACROS
 **********************/

/**********************
 *   GLOBAL FUNCTIONS
 **********************/

/**
 * Initialize the evdev interface
 */
void evdev_init(void)
{
#if USE_BSD_EVDEV
    evdev_fd = open(EVDEV_NAME, O_RDWR | O_NOCTTY);// #  define EVDEV_NAME 
  "/dev/input/event1" 
#else
    evdev_fd = open(EVDEV_NAME, O_RDWR | O_NOCTTY | O_NDELAY);
#endif
    if(evdev_fd == -1) {
        perror("unable open evdev interface:");
        return;
    }

#if USE_BSD_EVDEV
    fcntl(evdev_fd, F_SETFL, O_NONBLOCK);
#else
    fcntl(evdev_fd, F_SETFL, O_ASYNC | O_NONBLOCK);
#endif

    evdev_root_x = 0;
    evdev_root_y = 0;
    evdev_key_val = 0;
    evdev_button = LV_INDEV_STATE_REL;
}
/**
 * reconfigure the device file for evdev
 * @param dev_name set the evdev device filename
 * @return true: the device file set complete
 *         false: the device file doesn't exist current system
 */
bool evdev_set_file(char* dev_name)
{ 
     if(evdev_fd != -1) {
        close(evdev_fd);
     }
#if USE_BSD_EVDEV
     evdev_fd = open(dev_name, O_RDWR | O_NOCTTY);
#else
     evdev_fd = open(dev_name, O_RDWR | O_NOCTTY | O_NDELAY);
#endif

     if(evdev_fd == -1) {
        perror("unable open evdev interface:");
        return false;
     }

#if USE_BSD_EVDEV
     fcntl(evdev_fd, F_SETFL, O_NONBLOCK);
#else
     fcntl(evdev_fd, F_SETFL, O_ASYNC | O_NONBLOCK);
#endif

     evdev_root_x = 0;
     evdev_root_y = 0;
     evdev_key_val = 0;
     evdev_button = LV_INDEV_STATE_REL;

     return true;
}
/**
 * Get the current position and state of the evdev
 * @param data store the evdev data here
 * @return false: because the points are not buffered, so no more data to be read
 */
void evdev_read(lv_indev_drv_t * drv, lv_indev_data_t * data)
{
    struct input_event in;

    while(read(evdev_fd, &in, sizeof(struct input_event)) > 0) {
        if(in.type == EV_REL) {
            if(in.code == REL_X)
				#if EVDEV_SWAP_AXES
					evdev_root_y += in.value;
				#else
					evdev_root_x += in.value;
				#endif
            else if(in.code == REL_Y)
				#if EVDEV_SWAP_AXES
					evdev_root_x += in.value;
				#else
					evdev_root_y += in.value;
				#endif
        } else if(in.type == EV_ABS) {
            if(in.code == ABS_X)
				#if EVDEV_SWAP_AXES
					evdev_root_y = in.value;
				#else
					evdev_root_x = in.value;
				#endif
            else if(in.code == ABS_Y)
				#if EVDEV_SWAP_AXES
					evdev_root_x = in.value;
				#else
					evdev_root_y = in.value;
				#endif
            else if(in.code == ABS_MT_POSITION_X)
                                #if EVDEV_SWAP_AXES
                                        evdev_root_y = in.value;
                                #else
                                        evdev_root_x = in.value;
                                #endif
            else if(in.code == ABS_MT_POSITION_Y)
                                #if EVDEV_SWAP_AXES
                                        evdev_root_x = in.value;
                                #else
                                        evdev_root_y = in.value;
                                #endif
            else if(in.code == ABS_MT_TRACKING_ID)
                                if(in.value == -1)
                                    evdev_button = LV_INDEV_STATE_REL;
                                else if(in.value == 0)
                                    evdev_button = LV_INDEV_STATE_PR;
        } else if(in.type == EV_KEY) {
            if(in.code == BTN_MOUSE || in.code == BTN_TOUCH) {
                if(in.value == 0)
                    evdev_button = LV_INDEV_STATE_REL;
                else if(in.value == 1)
                    evdev_button = LV_INDEV_STATE_PR;
            } else if(drv->type == LV_INDEV_TYPE_KEYPAD) {
		data->state = (in.value) ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL;
		switch(in.code) {
			case KEY_BACKSPACE:
				data->key = LV_KEY_BACKSPACE;
				break;
			case KEY_ENTER:
				data->key = LV_KEY_ENTER;
				break;
			case KEY_UP:
				data->key = LV_KEY_UP;
				break;
			case KEY_LEFT:
				data->key = LV_KEY_PREV;
				break;
			case KEY_RIGHT:
				data->key = LV_KEY_NEXT;
				break;
			case KEY_DOWN:
				data->key = LV_KEY_DOWN;
				break;
			default:
				data->key = 0;
				break;
		}
		evdev_key_val = data->key;
		evdev_button = data->state;
		return ;
	    }
        }
    }

    if(drv->type == LV_INDEV_TYPE_KEYPAD) {
        /* No data retrieved */
        data->key = evdev_key_val;
	data->state = evdev_button;
	return ;
    }
    if(drv->type != LV_INDEV_TYPE_POINTER)
        return ;
    /*Store the collected data*/

#if EVDEV_CALIBRATE
    data->point.x = map(evdev_root_x, EVDEV_HOR_MIN, EVDEV_HOR_MAX, 0, drv->disp->driver->hor_res);
    data->point.y = map(evdev_root_y, EVDEV_VER_MIN, EVDEV_VER_MAX, 0, drv->disp->driver->ver_res);
#else
    data->point.x = evdev_root_x;
    data->point.y = evdev_root_y;
#endif

    data->state = evdev_button;

    if(data->point.x < 0)
      data->point.x = 0;
    if(data->point.y < 0)
      data->point.y = 0;
    if(data->point.x >= drv->disp->driver->hor_res)
      data->point.x = drv->disp->driver->hor_res - 1;
    if(data->point.y >= drv->disp->driver->ver_res)
      data->point.y = drv->disp->driver->ver_res - 1;

    return ;
}

/**********************
 *   STATIC FUNCTIONS
 **********************/
int map(int x, int in_min, int in_max, int out_min, int out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

#endif

 同时支持如下多个输入设备:

/** Possible input device types*/
typedef enum {
    LV_INDEV_TYPE_NONE,    /**< Uninitialized state*/
    LV_INDEV_TYPE_POINTER, /**< Touch pad, mouse, external button*/
    LV_INDEV_TYPE_KEYPAD,  /**< Keypad or keyboard*/
    LV_INDEV_TYPE_BUTTON,  /**< External (hardware button) which is assigned to a specific point of the screen*/
    LV_INDEV_TYPE_ENCODER, /**< Encoder with only Left, Right turn and a Button*/
} lv_indev_type_t;

在main函数下加入如下代码可以直接使用对应输入设备:

	evdev_init();
	
	lv_indev_drv_t indev_drv;
	
	lv_indev_drv_init(&indev_drv);
	
	indev_drv.type =LV_INDEV_TYPE_POINTER;
	
	indev_drv.read_cb =evdev_read;
	
	lv_indev_drv_register(&indev_drv);

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: LVGL V8 是一款高性能嵌入式图形库,它的中文手册对于中国开发者来说是一份非常重要的资料。LVGL V8 中文手册详细介绍了该库的各种特性、使用方法和实现原理。其中包括了 LVGL V8 的基础结构、对象、图元、样式等基础概念,还有详细的 API 参考和使用示例。 手册开头介绍了 LVGL V8 的基础知识,包括该库的基础设计、适用范围、适配平台等内容。接着,手册通过一个简单的 Hello World 项目介绍了如何在开发板上使用 LVGL V8,还介绍了如何使用 LVGL 的物理内存布局优化机制,避免使用较大的内存块。 在 LVGL V8 的中文手册中,对象是最核心的概念,手册详细介绍了各种对象的类型与用法,如基础对象、容器对象、文本对象、图像对象等。手册还介绍了 LVGL 的事件模型,解释了事件回调函数的使用方法和意义。除此之外,手册还介绍了 LVGL 的样式系统、动画框架等细节内容。 总体来说,LVGL V8 的中文手册非常详细,对于希望在嵌入式平台上使用 LVGL 开发界面的开发者来说,是一份非常重要的资料。手册详细介绍了该库的各种概念和细节,并提供了丰富的使用示例,非常适合初学者和专业开发人员使用。 ### 回答2: lvgl v8中文手册是一个相当详细、全面的用户手册,该手册主要是为了方便开发者在使用lvgl v8时可以快速入门,解决在实际开发过程中所遇到的各种问题。以下是本人对lvgl v8中文手册的一些了解和使用体验。 首先,lvgl v8中文手册的内容十分详细和系统,涉及的知识点涵盖了lvgl v8的核心概念、基础组件、布局、主题、动画、图像等方面的内容,而且每一章节都有大量的实例代码和图例,方便用户理解和学习。 其次,lvgl v8中文手册的组织结构十分清晰,每个章节都有明确的标题和目录,使得用户可以轻松找到所需的内容。而且,手册中的例子和代码片段也很详细,可以帮助用户更加深入地理解各个组件的使用方法和实现原理。 另外,lvgl v8中文手册还给出了各种样式、主题以及动画效果,这些都是使用lvgl v8时需要注意的一些方面,而且lvgl v8中文手册给出的解决方案和最佳实践也很实用,可以帮助用户在开发过程中避免一些常见的错误。 总之,lvgl v8中文手册是一个非常优秀的开发文档,对需要使用lvgl v8的开发者来说是一个不可或缺的参考工具,对于刚开始接触和了解lvgl v8的用户,这个手册更是一个非常好的教程,可以帮助他们顺利入门。 ### 回答3: LVGL v8是一款基于C语言开发的开源GUI库,具有轻量级、高效、可裁剪、跨平台等特点,适用于各种嵌入式应用的UI设计和开发。其中文手册详细介绍了LVGL v8库的使用方法、API接口、示例代码等内容,可以很好地帮助开发人员学习和掌握该库的使用。 手册的目录结构清晰、条理分明,涵盖了LVGL v8库的各个方面,包括库的概述、主循环、基本对象、容器对象、图形对象、矢量对象、特效、输入和操作、图像和字体、样式、动画、调试等内容。每个章节都以简洁明了的语言和示例代码的形式进行介绍,非常易于理解和实践。 在手册中,我们可以了解到LVGL v8库是如何创建窗口和控件、设置样式和属性、注册事件回调函数、处理输入事件等等。在对于各种对象的使用中,将以控件为主展示其使用方法。例如,对于文本框,手册详细介绍了其创建方式、风格设置、插入文本、删除文本、获取文本内容等相关功能。除此之外,手册中还介绍了LVGL v8库的特效、输入和操作、图像和字体、样式、动画等方面的内容。 总体上,LVGL v8中文手册内容丰富、详细全面、易于理解和操作。对于开发人员而言,该手册是一本不可多得的优秀参考书,可以帮助他们轻松地掌握LVGL v8的使用,并在实际项目中进行灵活高效的UI设计开发。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值