feat(nuttx) : add mouse capabilities to applications (#8425)

This commit is contained in:
红桃六
2025-07-04 15:08:38 +08:00
committed by GitHub
parent f9442702d4
commit b68caaf7f9
7 changed files with 316 additions and 2 deletions
+13
View File
@@ -2033,6 +2033,19 @@ menu "LVGL configuration"
help
Set to 0 to disable cursor, or set to a value greater than 0 to set the cursor size in pixels.
config LV_USE_NUTTX_MOUSE
bool "Use NuttX mouse driver"
depends on LV_USE_NUTTX
default n
config LV_USE_NUTTX_MOUSE_MOVE_STEP
int "Mouse movement step (pixels)"
depends on LV_USE_NUTTX_MOUSE
range 1 10
default 1
help
Set the step size of the mouse movement in pixels.
config LV_USE_LINUX_DRM
bool "Use Linux DRM device"
default n
+7 -1
View File
@@ -1250,8 +1250,14 @@
/** Driver for /dev/input */
#define LV_USE_NUTTX_TOUCHSCREEN 0
/*Touchscreen cursor size in pixels(<=0: disable cursor)*/
/** Touchscreen cursor size in pixels(<=0: disable cursor) */
#define LV_NUTTX_TOUCHSCREEN_CURSOR_SIZE 0
/** Driver for /dev/mouse */
#define LV_USE_NUTTX_MOUSE 0
/** Mouse movement step (pixels) */
#define LV_USE_NUTTX_MOUSE_MOVE_STEP 1
#endif
/** Driver for /dev/dri/card */
+14
View File
@@ -19,6 +19,7 @@
#include "lv_nuttx_image_cache.h"
#include "../../core/lv_global.h"
#include "lv_nuttx_profiler.h"
#include "lv_nuttx_mouse.h"
#include "../../../lvgl.h"
@@ -106,6 +107,10 @@ void lv_nuttx_dsc_init(lv_nuttx_dsc_t * dsc)
#ifdef CONFIG_UINPUT_TOUCH
dsc->utouch_path = "/dev/utouch";
#endif
#if LV_USE_NUTTX_MOUSE
dsc->mouse_path = "/dev/mouse0";
#endif
}
void lv_nuttx_init(const lv_nuttx_dsc_t * dsc, lv_nuttx_result_t * result)
@@ -167,6 +172,15 @@ void lv_nuttx_init(const lv_nuttx_dsc_t * dsc, lv_nuttx_result_t * result)
}
}
#endif
#if LV_USE_NUTTX_MOUSE
if(dsc->mouse_path) {
lv_indev_t * indev = lv_nuttx_mouse_create(dsc->mouse_path);
if(result) {
result->mouse_indev = indev;
}
}
#endif
}
#else
+2
View File
@@ -35,12 +35,14 @@ typedef struct {
const char * fb_path;
const char * input_path;
const char * utouch_path;
const char * mouse_path;
} lv_nuttx_dsc_t;
typedef struct {
lv_display_t * disp;
lv_indev_t * indev;
lv_indev_t * utouch_indev;
lv_indev_t * mouse_indev;
} lv_nuttx_result_t;
typedef struct _lv_nuttx_ctx_t {
+200
View File
@@ -0,0 +1,200 @@
/**
* @file lv_nuttx_mouse.c
*
*/
/*********************
* INCLUDES
*********************/
#include "lv_nuttx_mouse.h"
#if LV_USE_NUTTX
#if LV_USE_NUTTX_MOUSE
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <debug.h>
#include <errno.h>
#include <fcntl.h>
#include <nuttx/input/mouse.h>
#include "../../lvgl_private.h"
/*********************
* DEFINES
*********************/
/**********************
* TYPEDEFS
**********************/
typedef struct {
int fd;
lv_indev_state_t last_state;
} lv_nuttx_mouse_t;
/**********************
* STATIC PROTOTYPES
**********************/
static void mouse_read(lv_indev_t * drv, lv_indev_data_t * data);
static void mouse_delete_cb(lv_event_t * e);
static lv_indev_t * mouse_init(int fd);
/**********************
* STATIC VARIABLES
**********************/
/**********************
* MACROS
**********************/
/**********************
* GLOBAL FUNCTIONS
**********************/
lv_indev_t * lv_nuttx_mouse_create(const char * dev_path)
{
lv_indev_t * indev;
int fd;
LV_ASSERT_NULL(dev_path);
LV_LOG_USER("mouse %s opening", dev_path);
fd = open(dev_path, O_RDONLY | O_NONBLOCK);
if(fd < 0) {
LV_LOG_ERROR("Error: cannot open mouse device");
return NULL;
}
LV_LOG_USER("mouse %s open success", dev_path);
indev = mouse_init(fd);
if(indev == NULL) {
close(fd);
}
return indev;
}
/**********************
* STATIC FUNCTIONS
**********************/
static void mouse_read(lv_indev_t * drv, lv_indev_data_t * data)
{
lv_nuttx_mouse_t * mouse = drv->driver_data;
struct mouse_report_s sample;
/* Read one sample */
int nbytes = read(mouse->fd, &sample, sizeof(struct mouse_report_s));
/* Handle unexpected return values */
if(nbytes == sizeof(struct mouse_report_s)) {
lv_display_t * disp = lv_indev_get_display(drv);
int32_t hor_max = lv_display_get_horizontal_resolution(disp) - 1;
int32_t ver_max = lv_display_get_vertical_resolution(disp) - 1;
data->point.x =
LV_CLAMP(0,
data->point.x + (sample.x * LV_USE_NUTTX_MOUSE_MOVE_STEP),
hor_max);
data->point.y =
LV_CLAMP(0,
data->point.y + (sample.y * LV_USE_NUTTX_MOUSE_MOVE_STEP),
ver_max);
uint8_t mouse_buttons = sample.buttons;
if(mouse_buttons & MOUSE_BUTTON_1 || mouse_buttons & MOUSE_BUTTON_2 ||
mouse_buttons & MOUSE_BUTTON_3) {
mouse->last_state = LV_INDEV_STATE_PRESSED;
}
else {
mouse->last_state = LV_INDEV_STATE_RELEASED;
}
}
else {
if(nbytes == -1) {
if(errno != EAGAIN) {
LV_LOG_WARN("Read error: %s", strerror(errno));
}
}
else if(nbytes != 0) {
LV_LOG_WARN("Unexpected read size: %d", nbytes);
}
}
data->state = mouse->last_state;
}
static void mouse_delete_cb(lv_event_t * e)
{
lv_indev_t * indev = lv_event_get_user_data(e);
lv_nuttx_mouse_t * mouse = lv_indev_get_driver_data(indev);
if(mouse) {
lv_indev_set_driver_data(indev, NULL);
lv_indev_set_read_cb(indev, NULL);
if(mouse->fd >= 0) {
close(mouse->fd);
mouse->fd = -1;
}
lv_free(mouse);
LV_LOG_USER("done");
}
}
static void mouse_set_cursor(lv_indev_t * indev)
{
lv_obj_t * cursor_obj = lv_obj_create(lv_layer_sys());
lv_obj_remove_style_all(cursor_obj);
int32_t size = 20;
lv_obj_set_size(cursor_obj, size, size);
lv_obj_set_style_translate_x(cursor_obj, -size / 2, 0);
lv_obj_set_style_translate_y(cursor_obj, -size / 2, 0);
lv_obj_set_style_radius(cursor_obj, LV_RADIUS_CIRCLE, 0);
lv_obj_set_style_bg_opa(cursor_obj, LV_OPA_50, 0);
lv_obj_set_style_bg_color(cursor_obj, lv_color_black(), 0);
lv_obj_set_style_border_width(cursor_obj, 2, 0);
lv_obj_set_style_border_color(cursor_obj,
lv_palette_main(LV_PALETTE_GREY), 0);
lv_indev_set_cursor(indev, cursor_obj);
}
static lv_indev_t * mouse_init(int fd)
{
lv_nuttx_mouse_t * mouse;
lv_indev_t * indev = NULL;
mouse = lv_malloc_zeroed(sizeof(lv_nuttx_mouse_t));
LV_ASSERT_MALLOC(mouse);
mouse->fd = fd;
mouse->last_state = LV_INDEV_STATE_RELEASED;
indev = lv_indev_create();
if(indev == NULL) {
LV_LOG_ERROR("indev create failed");
lv_free(mouse);
return NULL;
}
lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER);
lv_indev_set_read_cb(indev, mouse_read);
lv_indev_set_driver_data(indev, mouse);
lv_indev_add_event_cb(indev, mouse_delete_cb, LV_EVENT_DELETE, indev);
/* Set cursor icon */
mouse_set_cursor(indev);
return indev;
}
#endif /*LV_USE_NUTTX_MOUSE*/
#endif /* LV_USE_NUTTX*/
+57
View File
@@ -0,0 +1,57 @@
/**
* @file lv_nuttx_mouse.h
*
*/
/*********************
* INCLUDES
*********************/
#ifndef LV_NUTTX_MOUSE_H
#define LV_NUTTX_MOUSE_H
#ifdef __cplusplus
extern "C" {
#endif
/*********************
* INCLUDES
*********************/
#include "../../indev/lv_indev.h"
#if LV_USE_NUTTX
#if LV_USE_NUTTX_MOUSE
/*********************
* DEFINES
*********************/
/**********************
* TYPEDEFS
**********************/
/**********************
* GLOBAL PROTOTYPES
**********************/
/**
* Initialize indev with specified input device.
* @param dev_path path of input device
*/
lv_indev_t * lv_nuttx_mouse_create(const char * dev_path);
/**********************
* MACROS
**********************/
#endif /* LV_USE_NUTTX_MOUSE */
#endif /* LV_USE_NUTTX*/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* LV_NUTTX_MOUSE_H */
+23 -1
View File
@@ -4061,7 +4061,7 @@
#endif
#endif
/*Touchscreen cursor size in pixels(<=0: disable cursor)*/
/** Touchscreen cursor size in pixels(<=0: disable cursor) */
#ifndef LV_NUTTX_TOUCHSCREEN_CURSOR_SIZE
#ifdef CONFIG_LV_NUTTX_TOUCHSCREEN_CURSOR_SIZE
#define LV_NUTTX_TOUCHSCREEN_CURSOR_SIZE CONFIG_LV_NUTTX_TOUCHSCREEN_CURSOR_SIZE
@@ -4069,6 +4069,28 @@
#define LV_NUTTX_TOUCHSCREEN_CURSOR_SIZE 0
#endif
#endif
/** Driver for /dev/mouse */
#ifndef LV_USE_NUTTX_MOUSE
#ifdef CONFIG_LV_USE_NUTTX_MOUSE
#define LV_USE_NUTTX_MOUSE CONFIG_LV_USE_NUTTX_MOUSE
#else
#define LV_USE_NUTTX_MOUSE 0
#endif
#endif
/** Mouse movement step (pixels) */
#ifndef LV_USE_NUTTX_MOUSE_MOVE_STEP
#ifdef LV_KCONFIG_PRESENT
#ifdef CONFIG_LV_USE_NUTTX_MOUSE_MOVE_STEP
#define LV_USE_NUTTX_MOUSE_MOVE_STEP CONFIG_LV_USE_NUTTX_MOUSE_MOVE_STEP
#else
#define LV_USE_NUTTX_MOUSE_MOVE_STEP 0
#endif
#else
#define LV_USE_NUTTX_MOUSE_MOVE_STEP 1
#endif
#endif
#endif
/** Driver for /dev/dri/card */