From 153353b70cc64865829a62a91daa99e08bde8e93 Mon Sep 17 00:00:00 2001 From: Nia Espera Date: Wed, 1 Mar 2023 18:36:45 +0100 Subject: [PATCH 01/18] bump rust edition --- lvgl-codegen/Cargo.toml | 2 +- lvgl-sys/Cargo.toml | 2 +- lvgl/Cargo.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lvgl-codegen/Cargo.toml b/lvgl-codegen/Cargo.toml index e40fc212..310c5770 100644 --- a/lvgl-codegen/Cargo.toml +++ b/lvgl-codegen/Cargo.toml @@ -4,7 +4,7 @@ version = "0.5.2" description = "Code generation based on LVGL source code" authors = ["Rafael Caricio "] readme = "README.md" -edition = "2018" +edition = "2021" license = "MIT" repository = "https://github.com/rafaelcaricio/lvgl-rs" diff --git a/lvgl-sys/Cargo.toml b/lvgl-sys/Cargo.toml index f75e41ce..8536ee65 100644 --- a/lvgl-sys/Cargo.toml +++ b/lvgl-sys/Cargo.toml @@ -3,7 +3,7 @@ name = "lvgl-sys" description = "Raw bindings to the LVGL C library." version = "0.5.2" authors = ["Rafael Caricio "] -edition = "2018" +edition = "2021" license = "MIT" homepage = "https://github.com/rafaelcaricio/lvgl-rs" repository = "https://github.com/rafaelcaricio/lvgl-rs" diff --git a/lvgl/Cargo.toml b/lvgl/Cargo.toml index 2beeeda6..981866ae 100644 --- a/lvgl/Cargo.toml +++ b/lvgl/Cargo.toml @@ -3,7 +3,7 @@ name = "lvgl" description = "LVGL bindings for Rust. A powerful and easy-to-use embedded GUI with many widgets, advanced visual effects (opacity, antialiasing, animations) and low memory requirements (16K RAM, 64K Flash)." version = "0.5.2" authors = ["Rafael Caricio "] -edition = "2018" +edition = "2021" repository = "https://github.com/rafaelcaricio/lvgl-rs" license = "MIT" readme = "../README.md" From 9609ead388ace543c6db535c6e7b25483b6afdcd Mon Sep 17 00:00:00 2001 From: Nia Espera Date: Wed, 1 Mar 2023 20:46:07 +0100 Subject: [PATCH 02/18] this bugged me immensely and this is my chance --- lvgl-sys/build.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lvgl-sys/build.rs b/lvgl-sys/build.rs index aefe5bf1..72e6fc11 100644 --- a/lvgl-sys/build.rs +++ b/lvgl-sys/build.rs @@ -1,5 +1,5 @@ use cc::Build; -use std::{env, path::Path, path::PathBuf}; +use std::{env, path::{Path, PathBuf}}; static CONFIG_NAME: &str = "DEP_LV_CONFIG_PATH"; From 92932cededbdc876b30e2434cb4dc79409b82816 Mon Sep 17 00:00:00 2001 From: Nia Espera Date: Wed, 1 Mar 2023 21:42:31 +0100 Subject: [PATCH 03/18] skeleton for driver support --- .gitmodules | 4 + examples/include/lv_drv_conf.h | 398 ++++++++++++++++++++++++++ lvgl-sys/Cargo.toml | 2 + lvgl-sys/README.md | 2 +- lvgl-sys/build.rs | 36 ++- lvgl-sys/shims/lvgl_sys.h | 1 + lvgl-sys/vendor/include/lv_drv_conf.h | 398 ++++++++++++++++++++++++++ lvgl-sys/vendor/lv_drivers | 1 + 8 files changed, 836 insertions(+), 6 deletions(-) create mode 100644 examples/include/lv_drv_conf.h create mode 100644 lvgl-sys/vendor/include/lv_drv_conf.h create mode 160000 lvgl-sys/vendor/lv_drivers diff --git a/.gitmodules b/.gitmodules index 13afe4f6..ce15f8c1 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,7 @@ [submodule "lvgl-sys/vendor/lvgl"] path = lvgl-sys/vendor/lvgl url = https://github.com/lvgl/lvgl.git + +[submodule "lvgl-sys/vendor/lv_drivers"] + path = lvgl-sys/vendor/lv_drivers + url = https://github.com/lvgl/lv_drivers.git diff --git a/examples/include/lv_drv_conf.h b/examples/include/lv_drv_conf.h new file mode 100644 index 00000000..35591d4c --- /dev/null +++ b/examples/include/lv_drv_conf.h @@ -0,0 +1,398 @@ +/** + * @file lv_drv_conf.h + * Configuration file for v7.10.1 + */ + +/* + * COPY THIS FILE AS lv_drv_conf.h + */ + +#if 1 /*Set it to "1" to enable the content*/ + +#ifndef LV_DRV_CONF_H +#define LV_DRV_CONF_H + +#include "lv_conf.h" + +/********************* + * DELAY INTERFACE + *********************/ +#define LV_DRV_DELAY_INCLUDE /*Dummy include by default*/ +#define LV_DRV_DELAY_US(us) /*delay_us(us)*/ /*Delay the given number of microseconds*/ +#define LV_DRV_DELAY_MS(ms) /*delay_ms(ms)*/ /*Delay the given number of milliseconds*/ + +/********************* + * DISPLAY INTERFACE + *********************/ + +/*------------ + * Common + *------------*/ +#define LV_DRV_DISP_INCLUDE /*Dummy include by default*/ +#define LV_DRV_DISP_CMD_DATA(val) /*pin_x_set(val)*/ /*Set the command/data pin to 'val'*/ +#define LV_DRV_DISP_RST(val) /*pin_x_set(val)*/ /*Set the reset pin to 'val'*/ + +/*--------- + * SPI + *---------*/ +#define LV_DRV_DISP_SPI_CS(val) /*spi_cs_set(val)*/ /*Set the SPI's Chip select to 'val'*/ +#define LV_DRV_DISP_SPI_WR_BYTE(data) /*spi_wr(data)*/ /*Write a byte the SPI bus*/ +#define LV_DRV_DISP_SPI_WR_ARRAY(adr, n) /*spi_wr_mem(adr, n)*/ /*Write 'n' bytes to SPI bus from 'adr'*/ + +/*------------------ + * Parallel port + *-----------------*/ +#define LV_DRV_DISP_PAR_CS(val) /*par_cs_set(val)*/ /*Set the Parallel port's Chip select to 'val'*/ +#define LV_DRV_DISP_PAR_SLOW /*par_slow()*/ /*Set low speed on the parallel port*/ +#define LV_DRV_DISP_PAR_FAST /*par_fast()*/ /*Set high speed on the parallel port*/ +#define LV_DRV_DISP_PAR_WR_WORD(data) /*par_wr(data)*/ /*Write a word to the parallel port*/ +#define LV_DRV_DISP_PAR_WR_ARRAY(adr, n) /*par_wr_mem(adr,n)*/ /*Write 'n' bytes to Parallel ports from 'adr'*/ + +/*************************** + * INPUT DEVICE INTERFACE + ***************************/ + +/*---------- + * Common + *----------*/ +#define LV_DRV_INDEV_INCLUDE /*Dummy include by default*/ +#define LV_DRV_INDEV_RST(val) /*pin_x_set(val)*/ /*Set the reset pin to 'val'*/ +#define LV_DRV_INDEV_IRQ_READ 0 /*pn_x_read()*/ /*Read the IRQ pin*/ + +/*--------- + * SPI + *---------*/ +#define LV_DRV_INDEV_SPI_CS(val) /*spi_cs_set(val)*/ /*Set the SPI's Chip select to 'val'*/ +#define LV_DRV_INDEV_SPI_XCHG_BYTE(data) 0 /*spi_xchg(val)*/ /*Write 'val' to SPI and give the read value*/ + +/*--------- + * I2C + *---------*/ +#define LV_DRV_INDEV_I2C_START /*i2c_start()*/ /*Make an I2C start*/ +#define LV_DRV_INDEV_I2C_STOP /*i2c_stop()*/ /*Make an I2C stop*/ +#define LV_DRV_INDEV_I2C_RESTART /*i2c_restart()*/ /*Make an I2C restart*/ +#define LV_DRV_INDEV_I2C_WR(data) /*i2c_wr(data)*/ /*Write a byte to the I1C bus*/ +#define LV_DRV_INDEV_I2C_READ(last_read) 0 /*i2c_rd()*/ /*Read a byte from the I2C bud*/ + + +/********************* + * DISPLAY DRIVERS + *********************/ + +/*------------------- + * Monitor of PC + *-------------------*/ +#ifndef USE_MONITOR +# define USE_MONITOR 1 +#endif + +#if USE_MONITOR +# define MONITOR_HOR_RES LV_HOR_RES +# define MONITOR_VER_RES LV_VER_RES + +/* Scale window by this factor (useful when simulating small screens) */ +# define MONITOR_ZOOM 1 + +/* Used to test true double buffering with only address changing. + * Set LV_VDB_SIZE = (LV_HOR_RES * LV_VER_RES) and LV_VDB_DOUBLE = 1 and LV_COLOR_DEPTH = 32" */ +# define MONITOR_DOUBLE_BUFFERED 0 + +/*Eclipse: Visual Studio: */ +# define MONITOR_SDL_INCLUDE_PATH + +/*Open two windows to test multi display support*/ +# define MONITOR_DUAL 0 +#endif + +/*----------------------------------- + * Native Windows (including mouse) + *----------------------------------*/ +#ifndef USE_WINDOWS +# define USE_WINDOWS 0 +#endif + +#if USE_WINDOWS +# define WINDOW_HOR_RES 480 +# define WINDOW_VER_RES 320 +#endif + +/*---------------------------------------- + * GTK drivers (monitor, mouse, keyboard + *---------------------------------------*/ +#ifndef USE_GTK +# define USE_GTK 0 +#endif + +/*---------------- + * SSD1963 + *--------------*/ +#ifndef USE_SSD1963 +# define USE_SSD1963 0 +#endif + +#if USE_SSD1963 +# define SSD1963_HOR_RES LV_HOR_RES +# define SSD1963_VER_RES LV_VER_RES +# define SSD1963_HT 531 +# define SSD1963_HPS 43 +# define SSD1963_LPS 8 +# define SSD1963_HPW 10 +# define SSD1963_VT 288 +# define SSD1963_VPS 12 +# define SSD1963_FPS 4 +# define SSD1963_VPW 10 +# define SSD1963_HS_NEG 0 /*Negative hsync*/ +# define SSD1963_VS_NEG 0 /*Negative vsync*/ +# define SSD1963_ORI 0 /*0, 90, 180, 270*/ +# define SSD1963_COLOR_DEPTH 16 +#endif + +/*---------------- + * R61581 + *--------------*/ +#ifndef USE_R61581 +# define USE_R61581 0 +#endif + +#if USE_R61581 +# define R61581_HOR_RES LV_HOR_RES +# define R61581_VER_RES LV_VER_RES +# define R61581_HSPL 0 /*HSYNC signal polarity*/ +# define R61581_HSL 10 /*HSYNC length (Not Implemented)*/ +# define R61581_HFP 10 /*Horitontal Front poarch (Not Implemented)*/ +# define R61581_HBP 10 /*Horitontal Back poarch (Not Implemented */ +# define R61581_VSPL 0 /*VSYNC signal polarity*/ +# define R61581_VSL 10 /*VSYNC length (Not Implemented)*/ +# define R61581_VFP 8 /*Vertical Front poarch*/ +# define R61581_VBP 8 /*Vertical Back poarch */ +# define R61581_DPL 0 /*DCLK signal polarity*/ +# define R61581_EPL 1 /*ENABLE signal polarity*/ +# define R61581_ORI 0 /*0, 180*/ +# define R61581_LV_COLOR_DEPTH 16 /*Fix 16 bit*/ +#endif + +/*------------------------------ + * ST7565 (Monochrome, low res.) + *-----------------------------*/ +#ifndef USE_ST7565 +# define USE_ST7565 0 +#endif + +#if USE_ST7565 +/*No settings*/ +#endif /*USE_ST7565*/ + +/*------------------------------ + * GC9A01 (color, low res.) + *-----------------------------*/ +#ifndef USE_GC9A01 +# define USE_GC9A01 0 +#endif + +#if USE_GC9A01 +/*No settings*/ +#endif /*USE_GC9A01*/ + +/*------------------------------------------ + * UC1610 (4 gray 160*[104|128]) + * (EA DOGXL160 160x104 tested) + *-----------------------------------------*/ +#ifndef USE_UC1610 +# define USE_UC1610 0 +#endif + +#if USE_UC1610 +# define UC1610_HOR_RES LV_HOR_RES +# define UC1610_VER_RES LV_VER_RES +# define UC1610_INIT_CONTRAST 33 /* init contrast, values in [%] */ +# define UC1610_INIT_HARD_RST 0 /* 1 : hardware reset at init, 0 : software reset */ +# define UC1610_TOP_VIEW 0 /* 0 : Bottom View, 1 : Top View */ +#endif /*USE_UC1610*/ + +/*------------------------------------------------- + * SHARP memory in pixel monochrome display series + * LS012B7DD01 (184x38 pixels.) + * LS013B7DH03 (128x128 pixels.) + * LS013B7DH05 (144x168 pixels.) + * LS027B7DH01 (400x240 pixels.) (tested) + * LS032B7DD02 (336x536 pixels.) + * LS044Q7DH01 (320x240 pixels.) + *------------------------------------------------*/ +#ifndef USE_SHARP_MIP +# define USE_SHARP_MIP 0 +#endif + +#if USE_SHARP_MIP +# define SHARP_MIP_HOR_RES LV_HOR_RES +# define SHARP_MIP_VER_RES LV_VER_RES +# define SHARP_MIP_SOFT_COM_INVERSION 0 +# define SHARP_MIP_REV_BYTE(b) /*((uint8_t) __REV(__RBIT(b)))*/ /*Architecture / compiler dependent byte bits order reverse*/ +#endif /*USE_SHARP_MIP*/ + +/*------------------------------------------------- + * ILI9341 240X320 TFT LCD + *------------------------------------------------*/ +#ifndef USE_ILI9341 +# define USE_ILI9341 0 +#endif + +#if USE_ILI9341 +# define ILI9341_HOR_RES LV_HOR_RES +# define ILI9341_VER_RES LV_VER_RES +# define ILI9341_GAMMA 1 +# define ILI9341_TEARING 0 +#endif /*USE_ILI9341*/ + +/*----------------------------------------- + * Linux frame buffer device (/dev/fbx) + *-----------------------------------------*/ +#ifndef USE_FBDEV +# define USE_FBDEV 1 +#endif + +#if USE_FBDEV +# define FBDEV_PATH "/dev/fb0" +#endif + +/*----------------------------------------- + * FreeBSD frame buffer device (/dev/fbx) + *.........................................*/ +#ifndef USE_BSD_FBDEV +# define USE_BSD_FBDEV 0 +#endif + +#if USE_BSD_FBDEV +# define FBDEV_PATH "/dev/fb0" +#endif + +/*----------------------------------------- + * DRM/KMS device (/dev/dri/cardX) + *-----------------------------------------*/ +#ifndef USE_DRM +# define USE_DRM 0 +#endif + +#if USE_DRM +# define DRM_CARD "/dev/dri/card0" +# define DRM_CONNECTOR_ID -1 /* -1 for the first connected one */ +#endif + +/********************* + * INPUT DEVICES + *********************/ + +/*-------------- + * XPT2046 + *--------------*/ +#ifndef USE_XPT2046 +# define USE_XPT2046 0 +#endif + +#if USE_XPT2046 +# define XPT2046_HOR_RES 480 +# define XPT2046_VER_RES 320 +# define XPT2046_X_MIN 200 +# define XPT2046_Y_MIN 200 +# define XPT2046_X_MAX 3800 +# define XPT2046_Y_MAX 3800 +# define XPT2046_AVG 4 +# define XPT2046_X_INV 0 +# define XPT2046_Y_INV 0 +# define XPT2046_XY_SWAP 0 +#endif + +/*----------------- + * FT5406EE8 + *-----------------*/ +#ifndef USE_FT5406EE8 +# define USE_FT5406EE8 0 +#endif + +#if USE_FT5406EE8 +# define FT5406EE8_I2C_ADR 0x38 /*7 bit address*/ +#endif + +/*--------------- + * AD TOUCH + *--------------*/ +#ifndef USE_AD_TOUCH +# define USE_AD_TOUCH 0 +#endif + +#if USE_AD_TOUCH +/*No settings*/ +#endif + + +/*--------------------------------------- + * Mouse or touchpad on PC (using SDL) + *-------------------------------------*/ +#ifndef USE_MOUSE +# define USE_MOUSE 1 +#endif + +#if USE_MOUSE +/*No settings*/ +#endif + +/*------------------------------------------- + * Mousewheel as encoder on PC (using SDL) + *------------------------------------------*/ +#ifndef USE_MOUSEWHEEL +# define USE_MOUSEWHEEL 0 +#endif + +#if USE_MOUSEWHEEL +/*No settings*/ +#endif + +/*------------------------------------------------- + * Touchscreen as libinput interface (for Linux based systems) + *------------------------------------------------*/ +#ifndef USE_LIBINPUT +# define USE_LIBINPUT 0 +#endif + +#if USE_LIBINPUT +# define LIBINPUT_NAME "/dev/input/event0" /*You can use the "evtest" Linux tool to get the list of devices and test them*/ +#endif /*USE_LIBINPUT*/ + +/*------------------------------------------------- + * Mouse or touchpad as evdev interface (for Linux based systems) + *------------------------------------------------*/ +#ifndef USE_EVDEV +# define USE_EVDEV 0 +#endif + +#ifndef USE_BSD_EVDEV +# define USE_BSD_EVDEV 0 +#endif + +#if USE_EVDEV || USE_BSD_EVDEV +# define EVDEV_NAME "/dev/input/event0" /*You can use the "evtest" Linux tool to get the list of devices and test them*/ +# define EVDEV_SWAP_AXES 0 /*Swap the x and y axes of the touchscreen*/ + +# define EVDEV_CALIBRATE 0 /*Scale and offset the touchscreen coordinates by using maximum and minimum values for each axis*/ + +# if EVDEV_CALIBRATE +# define EVDEV_HOR_MIN 0 /*to invert axis swap EVDEV_XXX_MIN by EVDEV_XXX_MAX*/ +# define EVDEV_HOR_MAX 4096 /*"evtest" Linux tool can help to get the correct calibraion values>*/ +# define EVDEV_VER_MIN 0 +# define EVDEV_VER_MAX 4096 +# endif /*EVDEV_CALIBRATE*/ +#endif /*USE_EVDEV*/ + +/*------------------------------- + * Keyboard of a PC (using SDL) + *------------------------------*/ +#ifndef USE_KEYBOARD +# define USE_KEYBOARD 1 +#endif + +#if USE_KEYBOARD +/*No settings*/ +#endif + +#endif /*LV_DRV_CONF_H*/ + +#endif /*End of "Content enable"*/ diff --git a/lvgl-sys/Cargo.toml b/lvgl-sys/Cargo.toml index 8536ee65..493dca51 100644 --- a/lvgl-sys/Cargo.toml +++ b/lvgl-sys/Cargo.toml @@ -24,4 +24,6 @@ cc = "1.0.79" bindgen = "0.64.0" [features] +default = ["drivers"] use-vendored-config = [] +drivers = [] diff --git a/lvgl-sys/README.md b/lvgl-sys/README.md index 5c3ab3fe..93c05d98 100644 --- a/lvgl-sys/README.md +++ b/lvgl-sys/README.md @@ -1,5 +1,5 @@ # lvgl-sys -Rust raw bindings for LittlevGL library. +Rust raw bindings for LittlevGL library and drivers. ## Usage diff --git a/lvgl-sys/build.rs b/lvgl-sys/build.rs index 72e6fc11..e81cc1fc 100644 --- a/lvgl-sys/build.rs +++ b/lvgl-sys/build.rs @@ -7,7 +7,12 @@ fn main() { let project_dir = canonicalize(PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap())); let shims_dir = project_dir.join("shims"); let vendor = project_dir.join("vendor"); - let vendor_src = vendor.join("lvgl").join("src"); + let lvgl_src = vendor.join("lvgl").join("src"); + + #[cfg(feature = "drivers")] + let driver_display = vendor.join("lv_drivers").join("display"); + #[cfg(feature = "drivers")] + let driver_indev = vendor.join("lv_drivers").join("indev"); let lv_config_dir = { let conf_path = env::var(CONFIG_NAME) @@ -49,25 +54,46 @@ fn main() { CONFIG_NAME ); } + #[cfg(feature = "drivers")] + if !conf_path.join("lv_drv_conf.h").exists() { + panic!( + "Directory {} referenced by {} needs to contain a file called lv_drv_conf.h", + conf_path.to_string_lossy(), + CONFIG_NAME + ); + } println!( "cargo:rerun-if-changed={}", conf_path.join("lv_conf.h").to_str().unwrap() ); + #[cfg(feature = "drivers")] + println!( + "cargo:rerun-if-changed={}", + conf_path.join("lv_drv_conf.h").to_str().unwrap() + ); conf_path }; let mut cfg = Build::new(); - add_c_files(&mut cfg, &vendor_src); + add_c_files(&mut cfg, &lvgl_src); add_c_files(&mut cfg, &lv_config_dir); add_c_files(&mut cfg, &shims_dir); + #[cfg(feature = "drivers")] + add_c_files(&mut cfg, &driver_display); + #[cfg(feature = "drivers")] + add_c_files(&mut cfg, &driver_indev); cfg.define("LV_CONF_INCLUDE_SIMPLE", Some("1")) - .include(&vendor_src) + .include(&lvgl_src) .include(&vendor) .warnings(false) - .include(&lv_config_dir) - .compile("lvgl"); + .include(&lv_config_dir); + #[cfg(feature = "drivers")] + cfg.include(&driver_display) + .include(&driver_indev); + + cfg.compile("lvgl"); let mut cc_args = vec![ "-DLV_CONF_INCLUDE_SIMPLE=1", diff --git a/lvgl-sys/shims/lvgl_sys.h b/lvgl-sys/shims/lvgl_sys.h index 0b092ac2..05fe4e26 100644 --- a/lvgl-sys/shims/lvgl_sys.h +++ b/lvgl-sys/shims/lvgl_sys.h @@ -6,6 +6,7 @@ extern "C" { #endif #include "lvgl/lvgl.h" +#include "lv_drivers/win_drv.h" lv_color_t _LV_COLOR_MAKE(uint8_t r, uint8_t g, uint8_t b); uint16_t _LV_COLOR_GET_R(lv_color_t color); diff --git a/lvgl-sys/vendor/include/lv_drv_conf.h b/lvgl-sys/vendor/include/lv_drv_conf.h new file mode 100644 index 00000000..35591d4c --- /dev/null +++ b/lvgl-sys/vendor/include/lv_drv_conf.h @@ -0,0 +1,398 @@ +/** + * @file lv_drv_conf.h + * Configuration file for v7.10.1 + */ + +/* + * COPY THIS FILE AS lv_drv_conf.h + */ + +#if 1 /*Set it to "1" to enable the content*/ + +#ifndef LV_DRV_CONF_H +#define LV_DRV_CONF_H + +#include "lv_conf.h" + +/********************* + * DELAY INTERFACE + *********************/ +#define LV_DRV_DELAY_INCLUDE /*Dummy include by default*/ +#define LV_DRV_DELAY_US(us) /*delay_us(us)*/ /*Delay the given number of microseconds*/ +#define LV_DRV_DELAY_MS(ms) /*delay_ms(ms)*/ /*Delay the given number of milliseconds*/ + +/********************* + * DISPLAY INTERFACE + *********************/ + +/*------------ + * Common + *------------*/ +#define LV_DRV_DISP_INCLUDE /*Dummy include by default*/ +#define LV_DRV_DISP_CMD_DATA(val) /*pin_x_set(val)*/ /*Set the command/data pin to 'val'*/ +#define LV_DRV_DISP_RST(val) /*pin_x_set(val)*/ /*Set the reset pin to 'val'*/ + +/*--------- + * SPI + *---------*/ +#define LV_DRV_DISP_SPI_CS(val) /*spi_cs_set(val)*/ /*Set the SPI's Chip select to 'val'*/ +#define LV_DRV_DISP_SPI_WR_BYTE(data) /*spi_wr(data)*/ /*Write a byte the SPI bus*/ +#define LV_DRV_DISP_SPI_WR_ARRAY(adr, n) /*spi_wr_mem(adr, n)*/ /*Write 'n' bytes to SPI bus from 'adr'*/ + +/*------------------ + * Parallel port + *-----------------*/ +#define LV_DRV_DISP_PAR_CS(val) /*par_cs_set(val)*/ /*Set the Parallel port's Chip select to 'val'*/ +#define LV_DRV_DISP_PAR_SLOW /*par_slow()*/ /*Set low speed on the parallel port*/ +#define LV_DRV_DISP_PAR_FAST /*par_fast()*/ /*Set high speed on the parallel port*/ +#define LV_DRV_DISP_PAR_WR_WORD(data) /*par_wr(data)*/ /*Write a word to the parallel port*/ +#define LV_DRV_DISP_PAR_WR_ARRAY(adr, n) /*par_wr_mem(adr,n)*/ /*Write 'n' bytes to Parallel ports from 'adr'*/ + +/*************************** + * INPUT DEVICE INTERFACE + ***************************/ + +/*---------- + * Common + *----------*/ +#define LV_DRV_INDEV_INCLUDE /*Dummy include by default*/ +#define LV_DRV_INDEV_RST(val) /*pin_x_set(val)*/ /*Set the reset pin to 'val'*/ +#define LV_DRV_INDEV_IRQ_READ 0 /*pn_x_read()*/ /*Read the IRQ pin*/ + +/*--------- + * SPI + *---------*/ +#define LV_DRV_INDEV_SPI_CS(val) /*spi_cs_set(val)*/ /*Set the SPI's Chip select to 'val'*/ +#define LV_DRV_INDEV_SPI_XCHG_BYTE(data) 0 /*spi_xchg(val)*/ /*Write 'val' to SPI and give the read value*/ + +/*--------- + * I2C + *---------*/ +#define LV_DRV_INDEV_I2C_START /*i2c_start()*/ /*Make an I2C start*/ +#define LV_DRV_INDEV_I2C_STOP /*i2c_stop()*/ /*Make an I2C stop*/ +#define LV_DRV_INDEV_I2C_RESTART /*i2c_restart()*/ /*Make an I2C restart*/ +#define LV_DRV_INDEV_I2C_WR(data) /*i2c_wr(data)*/ /*Write a byte to the I1C bus*/ +#define LV_DRV_INDEV_I2C_READ(last_read) 0 /*i2c_rd()*/ /*Read a byte from the I2C bud*/ + + +/********************* + * DISPLAY DRIVERS + *********************/ + +/*------------------- + * Monitor of PC + *-------------------*/ +#ifndef USE_MONITOR +# define USE_MONITOR 1 +#endif + +#if USE_MONITOR +# define MONITOR_HOR_RES LV_HOR_RES +# define MONITOR_VER_RES LV_VER_RES + +/* Scale window by this factor (useful when simulating small screens) */ +# define MONITOR_ZOOM 1 + +/* Used to test true double buffering with only address changing. + * Set LV_VDB_SIZE = (LV_HOR_RES * LV_VER_RES) and LV_VDB_DOUBLE = 1 and LV_COLOR_DEPTH = 32" */ +# define MONITOR_DOUBLE_BUFFERED 0 + +/*Eclipse: Visual Studio: */ +# define MONITOR_SDL_INCLUDE_PATH + +/*Open two windows to test multi display support*/ +# define MONITOR_DUAL 0 +#endif + +/*----------------------------------- + * Native Windows (including mouse) + *----------------------------------*/ +#ifndef USE_WINDOWS +# define USE_WINDOWS 0 +#endif + +#if USE_WINDOWS +# define WINDOW_HOR_RES 480 +# define WINDOW_VER_RES 320 +#endif + +/*---------------------------------------- + * GTK drivers (monitor, mouse, keyboard + *---------------------------------------*/ +#ifndef USE_GTK +# define USE_GTK 0 +#endif + +/*---------------- + * SSD1963 + *--------------*/ +#ifndef USE_SSD1963 +# define USE_SSD1963 0 +#endif + +#if USE_SSD1963 +# define SSD1963_HOR_RES LV_HOR_RES +# define SSD1963_VER_RES LV_VER_RES +# define SSD1963_HT 531 +# define SSD1963_HPS 43 +# define SSD1963_LPS 8 +# define SSD1963_HPW 10 +# define SSD1963_VT 288 +# define SSD1963_VPS 12 +# define SSD1963_FPS 4 +# define SSD1963_VPW 10 +# define SSD1963_HS_NEG 0 /*Negative hsync*/ +# define SSD1963_VS_NEG 0 /*Negative vsync*/ +# define SSD1963_ORI 0 /*0, 90, 180, 270*/ +# define SSD1963_COLOR_DEPTH 16 +#endif + +/*---------------- + * R61581 + *--------------*/ +#ifndef USE_R61581 +# define USE_R61581 0 +#endif + +#if USE_R61581 +# define R61581_HOR_RES LV_HOR_RES +# define R61581_VER_RES LV_VER_RES +# define R61581_HSPL 0 /*HSYNC signal polarity*/ +# define R61581_HSL 10 /*HSYNC length (Not Implemented)*/ +# define R61581_HFP 10 /*Horitontal Front poarch (Not Implemented)*/ +# define R61581_HBP 10 /*Horitontal Back poarch (Not Implemented */ +# define R61581_VSPL 0 /*VSYNC signal polarity*/ +# define R61581_VSL 10 /*VSYNC length (Not Implemented)*/ +# define R61581_VFP 8 /*Vertical Front poarch*/ +# define R61581_VBP 8 /*Vertical Back poarch */ +# define R61581_DPL 0 /*DCLK signal polarity*/ +# define R61581_EPL 1 /*ENABLE signal polarity*/ +# define R61581_ORI 0 /*0, 180*/ +# define R61581_LV_COLOR_DEPTH 16 /*Fix 16 bit*/ +#endif + +/*------------------------------ + * ST7565 (Monochrome, low res.) + *-----------------------------*/ +#ifndef USE_ST7565 +# define USE_ST7565 0 +#endif + +#if USE_ST7565 +/*No settings*/ +#endif /*USE_ST7565*/ + +/*------------------------------ + * GC9A01 (color, low res.) + *-----------------------------*/ +#ifndef USE_GC9A01 +# define USE_GC9A01 0 +#endif + +#if USE_GC9A01 +/*No settings*/ +#endif /*USE_GC9A01*/ + +/*------------------------------------------ + * UC1610 (4 gray 160*[104|128]) + * (EA DOGXL160 160x104 tested) + *-----------------------------------------*/ +#ifndef USE_UC1610 +# define USE_UC1610 0 +#endif + +#if USE_UC1610 +# define UC1610_HOR_RES LV_HOR_RES +# define UC1610_VER_RES LV_VER_RES +# define UC1610_INIT_CONTRAST 33 /* init contrast, values in [%] */ +# define UC1610_INIT_HARD_RST 0 /* 1 : hardware reset at init, 0 : software reset */ +# define UC1610_TOP_VIEW 0 /* 0 : Bottom View, 1 : Top View */ +#endif /*USE_UC1610*/ + +/*------------------------------------------------- + * SHARP memory in pixel monochrome display series + * LS012B7DD01 (184x38 pixels.) + * LS013B7DH03 (128x128 pixels.) + * LS013B7DH05 (144x168 pixels.) + * LS027B7DH01 (400x240 pixels.) (tested) + * LS032B7DD02 (336x536 pixels.) + * LS044Q7DH01 (320x240 pixels.) + *------------------------------------------------*/ +#ifndef USE_SHARP_MIP +# define USE_SHARP_MIP 0 +#endif + +#if USE_SHARP_MIP +# define SHARP_MIP_HOR_RES LV_HOR_RES +# define SHARP_MIP_VER_RES LV_VER_RES +# define SHARP_MIP_SOFT_COM_INVERSION 0 +# define SHARP_MIP_REV_BYTE(b) /*((uint8_t) __REV(__RBIT(b)))*/ /*Architecture / compiler dependent byte bits order reverse*/ +#endif /*USE_SHARP_MIP*/ + +/*------------------------------------------------- + * ILI9341 240X320 TFT LCD + *------------------------------------------------*/ +#ifndef USE_ILI9341 +# define USE_ILI9341 0 +#endif + +#if USE_ILI9341 +# define ILI9341_HOR_RES LV_HOR_RES +# define ILI9341_VER_RES LV_VER_RES +# define ILI9341_GAMMA 1 +# define ILI9341_TEARING 0 +#endif /*USE_ILI9341*/ + +/*----------------------------------------- + * Linux frame buffer device (/dev/fbx) + *-----------------------------------------*/ +#ifndef USE_FBDEV +# define USE_FBDEV 1 +#endif + +#if USE_FBDEV +# define FBDEV_PATH "/dev/fb0" +#endif + +/*----------------------------------------- + * FreeBSD frame buffer device (/dev/fbx) + *.........................................*/ +#ifndef USE_BSD_FBDEV +# define USE_BSD_FBDEV 0 +#endif + +#if USE_BSD_FBDEV +# define FBDEV_PATH "/dev/fb0" +#endif + +/*----------------------------------------- + * DRM/KMS device (/dev/dri/cardX) + *-----------------------------------------*/ +#ifndef USE_DRM +# define USE_DRM 0 +#endif + +#if USE_DRM +# define DRM_CARD "/dev/dri/card0" +# define DRM_CONNECTOR_ID -1 /* -1 for the first connected one */ +#endif + +/********************* + * INPUT DEVICES + *********************/ + +/*-------------- + * XPT2046 + *--------------*/ +#ifndef USE_XPT2046 +# define USE_XPT2046 0 +#endif + +#if USE_XPT2046 +# define XPT2046_HOR_RES 480 +# define XPT2046_VER_RES 320 +# define XPT2046_X_MIN 200 +# define XPT2046_Y_MIN 200 +# define XPT2046_X_MAX 3800 +# define XPT2046_Y_MAX 3800 +# define XPT2046_AVG 4 +# define XPT2046_X_INV 0 +# define XPT2046_Y_INV 0 +# define XPT2046_XY_SWAP 0 +#endif + +/*----------------- + * FT5406EE8 + *-----------------*/ +#ifndef USE_FT5406EE8 +# define USE_FT5406EE8 0 +#endif + +#if USE_FT5406EE8 +# define FT5406EE8_I2C_ADR 0x38 /*7 bit address*/ +#endif + +/*--------------- + * AD TOUCH + *--------------*/ +#ifndef USE_AD_TOUCH +# define USE_AD_TOUCH 0 +#endif + +#if USE_AD_TOUCH +/*No settings*/ +#endif + + +/*--------------------------------------- + * Mouse or touchpad on PC (using SDL) + *-------------------------------------*/ +#ifndef USE_MOUSE +# define USE_MOUSE 1 +#endif + +#if USE_MOUSE +/*No settings*/ +#endif + +/*------------------------------------------- + * Mousewheel as encoder on PC (using SDL) + *------------------------------------------*/ +#ifndef USE_MOUSEWHEEL +# define USE_MOUSEWHEEL 0 +#endif + +#if USE_MOUSEWHEEL +/*No settings*/ +#endif + +/*------------------------------------------------- + * Touchscreen as libinput interface (for Linux based systems) + *------------------------------------------------*/ +#ifndef USE_LIBINPUT +# define USE_LIBINPUT 0 +#endif + +#if USE_LIBINPUT +# define LIBINPUT_NAME "/dev/input/event0" /*You can use the "evtest" Linux tool to get the list of devices and test them*/ +#endif /*USE_LIBINPUT*/ + +/*------------------------------------------------- + * Mouse or touchpad as evdev interface (for Linux based systems) + *------------------------------------------------*/ +#ifndef USE_EVDEV +# define USE_EVDEV 0 +#endif + +#ifndef USE_BSD_EVDEV +# define USE_BSD_EVDEV 0 +#endif + +#if USE_EVDEV || USE_BSD_EVDEV +# define EVDEV_NAME "/dev/input/event0" /*You can use the "evtest" Linux tool to get the list of devices and test them*/ +# define EVDEV_SWAP_AXES 0 /*Swap the x and y axes of the touchscreen*/ + +# define EVDEV_CALIBRATE 0 /*Scale and offset the touchscreen coordinates by using maximum and minimum values for each axis*/ + +# if EVDEV_CALIBRATE +# define EVDEV_HOR_MIN 0 /*to invert axis swap EVDEV_XXX_MIN by EVDEV_XXX_MAX*/ +# define EVDEV_HOR_MAX 4096 /*"evtest" Linux tool can help to get the correct calibraion values>*/ +# define EVDEV_VER_MIN 0 +# define EVDEV_VER_MAX 4096 +# endif /*EVDEV_CALIBRATE*/ +#endif /*USE_EVDEV*/ + +/*------------------------------- + * Keyboard of a PC (using SDL) + *------------------------------*/ +#ifndef USE_KEYBOARD +# define USE_KEYBOARD 1 +#endif + +#if USE_KEYBOARD +/*No settings*/ +#endif + +#endif /*LV_DRV_CONF_H*/ + +#endif /*End of "Content enable"*/ diff --git a/lvgl-sys/vendor/lv_drivers b/lvgl-sys/vendor/lv_drivers new file mode 160000 index 00000000..4154ef8e --- /dev/null +++ b/lvgl-sys/vendor/lv_drivers @@ -0,0 +1 @@ +Subproject commit 4154ef8ed018064f8be5598212e04a33c25aa637 From e32306eafac6e0c0b8692f47232415c38211a404 Mon Sep 17 00:00:00 2001 From: Nia Espera Date: Thu, 2 Mar 2023 00:34:13 +0100 Subject: [PATCH 04/18] conditionally include header, reexport functions --- lvgl-sys/build.rs | 38 +++++++++++++-- lvgl-sys/shims/lvgl_drv.h | 98 +++++++++++++++++++++++++++++++++++++++ lvgl-sys/shims/lvgl_sys.h | 1 - 3 files changed, 133 insertions(+), 4 deletions(-) create mode 100644 lvgl-sys/shims/lvgl_drv.h diff --git a/lvgl-sys/build.rs b/lvgl-sys/build.rs index e81cc1fc..dc1570fd 100644 --- a/lvgl-sys/build.rs +++ b/lvgl-sys/build.rs @@ -1,8 +1,23 @@ use cc::Build; -use std::{env, path::{Path, PathBuf}}; +use std::{env, path::{Path, PathBuf}, collections::HashSet}; static CONFIG_NAME: &str = "DEP_LV_CONFIG_PATH"; +// See https://github.com/rust-lang/rust-bindgen/issues/687#issuecomment-450750547 +#[cfg(feature = "drivers")] +#[derive(Debug)] +struct IgnoreMacros(HashSet); + +impl bindgen::callbacks::ParseCallbacks for IgnoreMacros { + fn will_parse_macro(&self, name: &str) -> bindgen::callbacks::MacroParsingBehavior { + if self.0.contains(name) { + bindgen::callbacks::MacroParsingBehavior::Ignore + } else { + bindgen::callbacks::MacroParsingBehavior::Default + } + } +} + fn main() { let project_dir = canonicalize(PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap())); let shims_dir = project_dir.join("shims"); @@ -133,10 +148,27 @@ fn main() { } } + #[cfg(feature = "drivers")] + let ignored_macros = IgnoreMacros( + vec![ + "FP_INFINITE".into(), + "FP_NAN".into(), + "FP_NORMAL".into(), + "FP_SUBNORMAL".into(), + "FP_ZERO".into(), + "IPPORT_RESERVED".into(), + ] + .into_iter() + .collect(), + ); + let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); let bindings = bindgen::Builder::default() - .header(shims_dir.join("lvgl_sys.h").to_str().unwrap()) - .generate_comments(false) + .header(shims_dir.join("lvgl_sys.h").to_str().unwrap()); + #[cfg(feature = "drivers")] + let bindings = bindings.header(shims_dir.join("lvgl_drv.h").to_str().unwrap()) + .parse_callbacks(Box::new(ignored_macros)); + let bindings = bindings.generate_comments(false) .derive_default(true) .layout_tests(false) .use_core() diff --git a/lvgl-sys/shims/lvgl_drv.h b/lvgl-sys/shims/lvgl_drv.h new file mode 100644 index 00000000..b7085cb5 --- /dev/null +++ b/lvgl-sys/shims/lvgl_drv.h @@ -0,0 +1,98 @@ +#ifndef LVGL_DRV_H +#define LVGL_DRV_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "lv_drv_conf.h" + +/* Displays */ + +#if USE_MONITOR +#include "lv_drivers/display/monitor.h" +#endif + +#if USE_WINDOWS +#include "lv_drivers/win_drv.h" +#endif + +#if USE_GTK +#include "lv_drivers/gtkdrv/gtkdrv.h" +#endif + +#if USE_SSD1963 +#include "lv_drivers/display/SSD1963.h" +#endif + +#if USE_R61581 +#include "lv_drivers/display/R61581.h" +#endif + +#if USE_ST7565 +#include "lv_drivers/display/ST7565.h" +#endif + +#if USE_GC9A01 +#include "lv_drivers/display/GC9A01.h" +#endif + +#if USE_UC1610 +#include "lv_drivers/display/UC1610.h" +#endif + +#if USE_SHARP_MIP +#include "lv_drivers/display/SHARP_MIP.h" +#endif + +#if USE_ILI9341 +#include "lv_drivers/display/ILI9341.h" +#endif + +#if USE_FBDEV || USE_BSD_FBDEV +#include "lv_drivers/display/fbdev.h" +#endif + +#if USE_DRM +#include "lv_drivers/display/drm.h" +#endif + +/* Input devices */ + +#if USE_XPT2046 +#include "lv_drivers/indev/XPT2046.h" +#endif + +#if USE_FT5406EE8 +#include "lv_drivers/indev/FT5406EE8.h" +#endif + +#if USE_AD_TOUCH +#include "lv_drivers/indev/AD_touch.h" +#endif + +#if USE_MOUSE +#include "lv_drivers/indev/mouse.h" +#endif + +#if USE_MOUSEWHEEL +#include "lv_drivers/indev/mousewheel.h" +#endif + +#if USE_LIBINPUT +#include "lv_drivers/indev/libinput_drv.h" +#endif + +#if USE_EVDEV || USE_BSD_EVDEV +#include "lv_drivers/indev/evdev.h" +#endif + +#if USE_KEYBOARD +#include "lv_drivers/indev/keyboard.h" +#endif + +#endif /* LVGL_DRV_H */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif diff --git a/lvgl-sys/shims/lvgl_sys.h b/lvgl-sys/shims/lvgl_sys.h index 05fe4e26..0b092ac2 100644 --- a/lvgl-sys/shims/lvgl_sys.h +++ b/lvgl-sys/shims/lvgl_sys.h @@ -6,7 +6,6 @@ extern "C" { #endif #include "lvgl/lvgl.h" -#include "lv_drivers/win_drv.h" lv_color_t _LV_COLOR_MAKE(uint8_t r, uint8_t g, uint8_t b); uint16_t _LV_COLOR_GET_R(lv_color_t color); From abc63f47194619bfddf9ee6d6891f565b026f12c Mon Sep 17 00:00:00 2001 From: Nia Espera Date: Thu, 2 Mar 2023 00:42:55 +0100 Subject: [PATCH 05/18] update readme --- README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8362a270..dbd50971 100644 --- a/README.md +++ b/README.md @@ -105,11 +105,15 @@ this section you can check what is implemented at the moment. List of LVGL features that impacts the library usage in general. - [x] Displays: We use [`embedded_graphics`](https://docs.rs/embedded-graphics/0.6.2/embedded_graphics/) library to - draw to the display. You can use `lvgl-rs` with any of the - [`embedded_graphics` supported displays](https://docs.rs/embedded-graphics/0.6.2/embedded_graphics/#supported-displays). + draw to the display, along with [`lv_drivers`](https://github.com/lvgl/lv_drivers). You can + use `lvgl-rs` with any of the [`embedded_graphics`](https://docs.rs/embedded-graphics/0.6.2/embedded_graphics/#supported-displays) supported + displays, and those supported by [`lv_drivers`](https://github.com/lvgl/lv_drivers). + **Note:** [`lv_drivers`](https://github.com/lvgl/lv_drivers) support is currently experimental. - [x] Events: You can listen and trigger events in widget objects. - [x] Styles: You can set styles in any exposed object. We are still missing the possibility of defining global base styles. -- [ ] Input Devices +- [x] Input Devices: Input devices supported by [`lv_drivers`](https://github.com/lvgl/lv_drivers) + can be used. + **Note:** [`lv_drivers`](https://github.com/lvgl/lv_drivers) support is currently experimental. - [ ] Fonts - [ ] Images - [ ] File system From 988fc57d5e4c6b4b65ec7e289909aab5e0a81bfe Mon Sep 17 00:00:00 2001 From: Nia Espera Date: Wed, 8 Mar 2023 20:31:03 +0100 Subject: [PATCH 06/18] update lv_drivers to 8.3 --- lvgl-sys/vendor/lv_drivers | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lvgl-sys/vendor/lv_drivers b/lvgl-sys/vendor/lv_drivers index 4154ef8e..71830257 160000 --- a/lvgl-sys/vendor/lv_drivers +++ b/lvgl-sys/vendor/lv_drivers @@ -1 +1 @@ -Subproject commit 4154ef8ed018064f8be5598212e04a33c25aa637 +Subproject commit 71830257710f430b6d8d1c324f89f2eab52488f1 From e7a0f9a58f3c519d1dfca5c3ca85cbe5fe2861af Mon Sep 17 00:00:00 2001 From: Nia Espera Date: Thu, 9 Mar 2023 17:19:30 +0100 Subject: [PATCH 07/18] begin driver integration, allow custom drop for displays --- examples/include/lv_drv_conf.h | 118 ++++++++++++++++++++--- lvgl-sys/Cargo.toml | 1 - lvgl-sys/build.rs | 19 ++-- lvgl-sys/vendor/include/lv_drv_conf.h | 118 ++++++++++++++++++++--- lvgl/Cargo.toml | 3 +- lvgl/src/display.rs | 134 ++++++++++++++++++++++++-- lvgl/src/drivers/lv_drv_display.rs | 30 ++++++ lvgl/src/drivers/lv_drv_input.rs | 1 + lvgl/src/drivers/mod.rs | 2 + lvgl/src/functions.rs | 3 + lvgl/src/lib.rs | 3 + 11 files changed, 395 insertions(+), 37 deletions(-) create mode 100644 lvgl/src/drivers/lv_drv_display.rs create mode 100644 lvgl/src/drivers/lv_drv_input.rs create mode 100644 lvgl/src/drivers/mod.rs diff --git a/examples/include/lv_drv_conf.h b/examples/include/lv_drv_conf.h index 35591d4c..fdb74bd1 100644 --- a/examples/include/lv_drv_conf.h +++ b/examples/include/lv_drv_conf.h @@ -1,12 +1,13 @@ /** * @file lv_drv_conf.h - * Configuration file for v7.10.1 + * Configuration file for v8.3.0 */ /* * COPY THIS FILE AS lv_drv_conf.h */ +/* clang-format off */ #if 1 /*Set it to "1" to enable the content*/ #ifndef LV_DRV_CONF_H @@ -79,22 +80,56 @@ * DISPLAY DRIVERS *********************/ +/*------------------- + * SDL + *-------------------*/ + +/* SDL based drivers for display, mouse, mousewheel and keyboard*/ +#ifndef USE_SDL +# define USE_SDL 0 +#endif + +/* Hardware accelerated SDL driver */ +#ifndef USE_SDL_GPU +# define USE_SDL_GPU 0 +#endif + +#if USE_SDL || USE_SDL_GPU +# define SDL_HOR_RES 480 +# define SDL_VER_RES 320 + +/* Scale window by this factor (useful when simulating small screens) */ +# define SDL_ZOOM 1 + +/* Used to test true double buffering with only address changing. + * Use 2 draw buffers, bith with SDL_HOR_RES x SDL_VER_RES size*/ +# define SDL_DOUBLE_BUFFERED 0 + +/*Eclipse: Visual Studio: */ +# define SDL_INCLUDE_PATH + +/*Open two windows to test multi display support*/ +# define SDL_DUAL_DISPLAY 0 +#endif + /*------------------- * Monitor of PC *-------------------*/ + +/*DEPRECATED: Use the SDL driver instead. */ #ifndef USE_MONITOR -# define USE_MONITOR 1 +# define USE_MONITOR 0 #endif #if USE_MONITOR -# define MONITOR_HOR_RES LV_HOR_RES -# define MONITOR_VER_RES LV_VER_RES +# define MONITOR_HOR_RES 480 +# define MONITOR_VER_RES 320 /* Scale window by this factor (useful when simulating small screens) */ # define MONITOR_ZOOM 1 /* Used to test true double buffering with only address changing. - * Set LV_VDB_SIZE = (LV_HOR_RES * LV_VER_RES) and LV_VDB_DOUBLE = 1 and LV_COLOR_DEPTH = 32" */ + * Use 2 draw buffers, bith with MONITOR_HOR_RES x MONITOR_VER_RES size*/ # define MONITOR_DOUBLE_BUFFERED 0 /*Eclipse: Visual Studio: */ @@ -116,11 +151,45 @@ # define WINDOW_VER_RES 320 #endif +/*---------------------------- + * Native Windows (win32drv) + *---------------------------*/ +#ifndef USE_WIN32DRV +# define USE_WIN32DRV 0 +#endif + +#if USE_WIN32DRV +/* Scale window by this factor (useful when simulating small screens) */ +# define WIN32DRV_MONITOR_ZOOM 1 +#endif + /*---------------------------------------- * GTK drivers (monitor, mouse, keyboard *---------------------------------------*/ #ifndef USE_GTK -# define USE_GTK 0 +# define USE_GTK 1 +#endif + +/*---------------------------------------- + * Wayland drivers (monitor, mouse, keyboard, touchscreen) + *---------------------------------------*/ +#ifndef USE_WAYLAND +# define USE_WAYLAND 0 +#endif + +#if USE_WAYLAND +/* Support for client-side decorations */ +# ifndef LV_WAYLAND_CLIENT_SIDE_DECORATIONS +# define LV_WAYLAND_CLIENT_SIDE_DECORATIONS 1 +# endif +/* Support for (deprecated) wl-shell protocol */ +# ifndef LV_WAYLAND_WL_SHELL +# define LV_WAYLAND_WL_SHELL 1 +# endif +/* Support for xdg-shell protocol */ +# ifndef LV_WAYLAND_XDG_SHELL +# define LV_WAYLAND_XDG_SHELL 0 +# endif #endif /*---------------- @@ -327,8 +396,9 @@ /*--------------------------------------- * Mouse or touchpad on PC (using SDL) *-------------------------------------*/ +/*DEPRECATED: Use the SDL driver instead. */ #ifndef USE_MOUSE -# define USE_MOUSE 1 +# define USE_MOUSE 0 #endif #if USE_MOUSE @@ -338,6 +408,7 @@ /*------------------------------------------- * Mousewheel as encoder on PC (using SDL) *------------------------------------------*/ +/*DEPRECATED: Use the SDL driver instead. */ #ifndef USE_MOUSEWHEEL # define USE_MOUSEWHEEL 0 #endif @@ -347,15 +418,22 @@ #endif /*------------------------------------------------- - * Touchscreen as libinput interface (for Linux based systems) + * Touchscreen, mouse/touchpad or keyboard as libinput interface (for Linux based systems) *------------------------------------------------*/ #ifndef USE_LIBINPUT # define USE_LIBINPUT 0 #endif -#if USE_LIBINPUT +#ifndef USE_BSD_LIBINPUT +# define USE_BSD_LIBINPUT 0 +#endif + +#if USE_LIBINPUT || USE_BSD_LIBINPUT +/*If only a single device of the same type is connected, you can also auto detect it, e.g.: + *#define LIBINPUT_NAME libinput_find_dev(LIBINPUT_CAPABILITY_TOUCH, false)*/ # define LIBINPUT_NAME "/dev/input/event0" /*You can use the "evtest" Linux tool to get the list of devices and test them*/ -#endif /*USE_LIBINPUT*/ + +#endif /*USE_LIBINPUT || USE_BSD_LIBINPUT*/ /*------------------------------------------------- * Mouse or touchpad as evdev interface (for Linux based systems) @@ -382,11 +460,29 @@ # endif /*EVDEV_CALIBRATE*/ #endif /*USE_EVDEV*/ +/*------------------------------------------------- + * Full keyboard support for evdev and libinput interface + *------------------------------------------------*/ +# ifndef USE_XKB +# define USE_XKB 0 +# endif + +#if USE_LIBINPUT || USE_BSD_LIBINPUT || USE_EVDEV || USE_BSD_EVDEV +# if USE_XKB +# define XKB_KEY_MAP { .rules = NULL, \ + .model = "pc101", \ + .layout = "us", \ + .variant = NULL, \ + .options = NULL } /*"setxkbmap -query" can help find the right values for your keyboard*/ +# endif /*USE_XKB*/ +#endif /*USE_LIBINPUT || USE_BSD_LIBINPUT || USE_EVDEV || USE_BSD_EVDEV*/ + /*------------------------------- * Keyboard of a PC (using SDL) *------------------------------*/ +/*DEPRECATED: Use the SDL driver instead. */ #ifndef USE_KEYBOARD -# define USE_KEYBOARD 1 +# define USE_KEYBOARD 0 #endif #if USE_KEYBOARD diff --git a/lvgl-sys/Cargo.toml b/lvgl-sys/Cargo.toml index 493dca51..227f6be5 100644 --- a/lvgl-sys/Cargo.toml +++ b/lvgl-sys/Cargo.toml @@ -24,6 +24,5 @@ cc = "1.0.79" bindgen = "0.64.0" [features] -default = ["drivers"] use-vendored-config = [] drivers = [] diff --git a/lvgl-sys/build.rs b/lvgl-sys/build.rs index dc1570fd..9d837ceb 100644 --- a/lvgl-sys/build.rs +++ b/lvgl-sys/build.rs @@ -1,5 +1,9 @@ use cc::Build; -use std::{env, path::{Path, PathBuf}, collections::HashSet}; +use std::{ + collections::HashSet, + env, + path::{Path, PathBuf}, +}; static CONFIG_NAME: &str = "DEP_LV_CONFIG_PATH"; @@ -105,8 +109,7 @@ fn main() { .warnings(false) .include(&lv_config_dir); #[cfg(feature = "drivers")] - cfg.include(&driver_display) - .include(&driver_indev); + cfg.include(&driver_display).include(&driver_indev); cfg.compile("lvgl"); @@ -163,12 +166,14 @@ fn main() { ); let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); - let bindings = bindgen::Builder::default() - .header(shims_dir.join("lvgl_sys.h").to_str().unwrap()); + let bindings = + bindgen::Builder::default().header(shims_dir.join("lvgl_sys.h").to_str().unwrap()); #[cfg(feature = "drivers")] - let bindings = bindings.header(shims_dir.join("lvgl_drv.h").to_str().unwrap()) + let bindings = bindings + .header(shims_dir.join("lvgl_drv.h").to_str().unwrap()) .parse_callbacks(Box::new(ignored_macros)); - let bindings = bindings.generate_comments(false) + let bindings = bindings + .generate_comments(false) .derive_default(true) .layout_tests(false) .use_core() diff --git a/lvgl-sys/vendor/include/lv_drv_conf.h b/lvgl-sys/vendor/include/lv_drv_conf.h index 35591d4c..fdb74bd1 100644 --- a/lvgl-sys/vendor/include/lv_drv_conf.h +++ b/lvgl-sys/vendor/include/lv_drv_conf.h @@ -1,12 +1,13 @@ /** * @file lv_drv_conf.h - * Configuration file for v7.10.1 + * Configuration file for v8.3.0 */ /* * COPY THIS FILE AS lv_drv_conf.h */ +/* clang-format off */ #if 1 /*Set it to "1" to enable the content*/ #ifndef LV_DRV_CONF_H @@ -79,22 +80,56 @@ * DISPLAY DRIVERS *********************/ +/*------------------- + * SDL + *-------------------*/ + +/* SDL based drivers for display, mouse, mousewheel and keyboard*/ +#ifndef USE_SDL +# define USE_SDL 0 +#endif + +/* Hardware accelerated SDL driver */ +#ifndef USE_SDL_GPU +# define USE_SDL_GPU 0 +#endif + +#if USE_SDL || USE_SDL_GPU +# define SDL_HOR_RES 480 +# define SDL_VER_RES 320 + +/* Scale window by this factor (useful when simulating small screens) */ +# define SDL_ZOOM 1 + +/* Used to test true double buffering with only address changing. + * Use 2 draw buffers, bith with SDL_HOR_RES x SDL_VER_RES size*/ +# define SDL_DOUBLE_BUFFERED 0 + +/*Eclipse: Visual Studio: */ +# define SDL_INCLUDE_PATH + +/*Open two windows to test multi display support*/ +# define SDL_DUAL_DISPLAY 0 +#endif + /*------------------- * Monitor of PC *-------------------*/ + +/*DEPRECATED: Use the SDL driver instead. */ #ifndef USE_MONITOR -# define USE_MONITOR 1 +# define USE_MONITOR 0 #endif #if USE_MONITOR -# define MONITOR_HOR_RES LV_HOR_RES -# define MONITOR_VER_RES LV_VER_RES +# define MONITOR_HOR_RES 480 +# define MONITOR_VER_RES 320 /* Scale window by this factor (useful when simulating small screens) */ # define MONITOR_ZOOM 1 /* Used to test true double buffering with only address changing. - * Set LV_VDB_SIZE = (LV_HOR_RES * LV_VER_RES) and LV_VDB_DOUBLE = 1 and LV_COLOR_DEPTH = 32" */ + * Use 2 draw buffers, bith with MONITOR_HOR_RES x MONITOR_VER_RES size*/ # define MONITOR_DOUBLE_BUFFERED 0 /*Eclipse: Visual Studio: */ @@ -116,11 +151,45 @@ # define WINDOW_VER_RES 320 #endif +/*---------------------------- + * Native Windows (win32drv) + *---------------------------*/ +#ifndef USE_WIN32DRV +# define USE_WIN32DRV 0 +#endif + +#if USE_WIN32DRV +/* Scale window by this factor (useful when simulating small screens) */ +# define WIN32DRV_MONITOR_ZOOM 1 +#endif + /*---------------------------------------- * GTK drivers (monitor, mouse, keyboard *---------------------------------------*/ #ifndef USE_GTK -# define USE_GTK 0 +# define USE_GTK 1 +#endif + +/*---------------------------------------- + * Wayland drivers (monitor, mouse, keyboard, touchscreen) + *---------------------------------------*/ +#ifndef USE_WAYLAND +# define USE_WAYLAND 0 +#endif + +#if USE_WAYLAND +/* Support for client-side decorations */ +# ifndef LV_WAYLAND_CLIENT_SIDE_DECORATIONS +# define LV_WAYLAND_CLIENT_SIDE_DECORATIONS 1 +# endif +/* Support for (deprecated) wl-shell protocol */ +# ifndef LV_WAYLAND_WL_SHELL +# define LV_WAYLAND_WL_SHELL 1 +# endif +/* Support for xdg-shell protocol */ +# ifndef LV_WAYLAND_XDG_SHELL +# define LV_WAYLAND_XDG_SHELL 0 +# endif #endif /*---------------- @@ -327,8 +396,9 @@ /*--------------------------------------- * Mouse or touchpad on PC (using SDL) *-------------------------------------*/ +/*DEPRECATED: Use the SDL driver instead. */ #ifndef USE_MOUSE -# define USE_MOUSE 1 +# define USE_MOUSE 0 #endif #if USE_MOUSE @@ -338,6 +408,7 @@ /*------------------------------------------- * Mousewheel as encoder on PC (using SDL) *------------------------------------------*/ +/*DEPRECATED: Use the SDL driver instead. */ #ifndef USE_MOUSEWHEEL # define USE_MOUSEWHEEL 0 #endif @@ -347,15 +418,22 @@ #endif /*------------------------------------------------- - * Touchscreen as libinput interface (for Linux based systems) + * Touchscreen, mouse/touchpad or keyboard as libinput interface (for Linux based systems) *------------------------------------------------*/ #ifndef USE_LIBINPUT # define USE_LIBINPUT 0 #endif -#if USE_LIBINPUT +#ifndef USE_BSD_LIBINPUT +# define USE_BSD_LIBINPUT 0 +#endif + +#if USE_LIBINPUT || USE_BSD_LIBINPUT +/*If only a single device of the same type is connected, you can also auto detect it, e.g.: + *#define LIBINPUT_NAME libinput_find_dev(LIBINPUT_CAPABILITY_TOUCH, false)*/ # define LIBINPUT_NAME "/dev/input/event0" /*You can use the "evtest" Linux tool to get the list of devices and test them*/ -#endif /*USE_LIBINPUT*/ + +#endif /*USE_LIBINPUT || USE_BSD_LIBINPUT*/ /*------------------------------------------------- * Mouse or touchpad as evdev interface (for Linux based systems) @@ -382,11 +460,29 @@ # endif /*EVDEV_CALIBRATE*/ #endif /*USE_EVDEV*/ +/*------------------------------------------------- + * Full keyboard support for evdev and libinput interface + *------------------------------------------------*/ +# ifndef USE_XKB +# define USE_XKB 0 +# endif + +#if USE_LIBINPUT || USE_BSD_LIBINPUT || USE_EVDEV || USE_BSD_EVDEV +# if USE_XKB +# define XKB_KEY_MAP { .rules = NULL, \ + .model = "pc101", \ + .layout = "us", \ + .variant = NULL, \ + .options = NULL } /*"setxkbmap -query" can help find the right values for your keyboard*/ +# endif /*USE_XKB*/ +#endif /*USE_LIBINPUT || USE_BSD_LIBINPUT || USE_EVDEV || USE_BSD_EVDEV*/ + /*------------------------------- * Keyboard of a PC (using SDL) *------------------------------*/ +/*DEPRECATED: Use the SDL driver instead. */ #ifndef USE_KEYBOARD -# define USE_KEYBOARD 1 +# define USE_KEYBOARD 0 #endif #if USE_KEYBOARD diff --git a/lvgl/Cargo.toml b/lvgl/Cargo.toml index 981866ae..8e34d8db 100644 --- a/lvgl/Cargo.toml +++ b/lvgl/Cargo.toml @@ -20,11 +20,12 @@ bitflags = "1.3.2" paste = "1.0.11" [features] -default = ["embedded_graphics"] +default = ["embedded_graphics", "drivers"] embedded_graphics = ["embedded-graphics"] alloc = ["cstr_core/alloc"] lvgl_alloc = ["alloc"] use-vendored-config = ["lvgl-sys/use-vendored-config"] +drivers = ["lvgl-sys/drivers"] [build-dependencies] quote = "1.0.23" diff --git a/lvgl/src/display.rs b/lvgl/src/display.rs index f8c20ae4..85167360 100644 --- a/lvgl/src/display.rs +++ b/lvgl/src/display.rs @@ -6,7 +6,6 @@ use core::convert::TryInto; use core::mem::MaybeUninit; use core::ptr::NonNull; use core::{ptr, result}; -use cty::c_void; use lvgl_sys::_lv_disp_draw_buf_t; /// Error in interacting with a `Display`. @@ -22,11 +21,15 @@ type Result = result::Result; /// An LVGL-registered display. Equivalent to an `lv_disp_t`. pub struct Display { pub(crate) disp: NonNull, + drop: Option, } impl<'a> Display { - pub(crate) fn from_raw(disp: NonNull) -> Self { - Self { disp } + pub(crate) fn from_raw( + disp: NonNull, + drop: Option, + ) -> Self { + Self { disp, drop } } /// Registers a given `DrawBuffer` with an associated update function to @@ -44,12 +47,63 @@ impl<'a> Display { let disp_p = &mut display_diver.disp_drv; disp_p.hor_res = hor_res.try_into().unwrap_or(240); disp_p.ver_res = ver_res.try_into().unwrap_or(240); - Ok(disp_drv_register(&mut display_diver)?) + Ok(disp_drv_register(&mut display_diver, None)?) } pub fn get_scr_act(&self) -> Result { Ok(get_str_act(Some(&self))?) } + + pub unsafe fn register_raw( + draw_buffer: DrawBuffer, + hor_res: u32, + ver_res: u32, + flush_cb: Option< + unsafe extern "C" fn( + *mut lvgl_sys::_lv_disp_drv_t, + *const lvgl_sys::lv_area_t, + *mut lvgl_sys::lv_color16_t, + ), + >, + rounder_cb: Option< + unsafe extern "C" fn(*mut lvgl_sys::_lv_disp_drv_t, *mut lvgl_sys::lv_area_t), + >, + set_px_cb: Option< + unsafe extern "C" fn( + *mut lvgl_sys::_lv_disp_drv_t, + *mut u8, + lvgl_sys::lv_coord_t, + lvgl_sys::lv_coord_t, + lvgl_sys::lv_coord_t, + lvgl_sys::lv_color_t, + lvgl_sys::lv_opa_t, + ), + >, + clear_cb: Option, + monitor_cb: Option, + wait_cb: Option, + clean_dcache_cb: Option, + drv_update_cb: Option, + render_start_cb: Option, + drop: Option, + ) -> Result { + let mut display_driver = DisplayDriver::new_raw( + draw_buffer, + flush_cb, + rounder_cb, + set_px_cb, + clear_cb, + monitor_cb, + wait_cb, + clean_dcache_cb, + drv_update_cb, + render_start_cb, + )?; + let disp_p = &mut display_driver.disp_drv; + disp_p.hor_res = hor_res.try_into().unwrap_or(240); + disp_p.ver_res = ver_res.try_into().unwrap_or(240); + Ok(disp_drv_register(&mut display_driver, drop)?) + } } impl Default for Display { @@ -58,6 +112,14 @@ impl Default for Display { } } +impl Drop for Display { + fn drop(&mut self) { + if let Some(drop) = self.drop { + unsafe { drop() } + } + } +} + #[derive(Copy, Clone)] pub(crate) struct DefaultDisplay {} @@ -96,7 +158,7 @@ impl DrawBuffer { let draw_buf = unsafe { lvgl_sys::lv_disp_draw_buf_init( inner.as_mut_ptr(), - primary_buffer_guard.borrow_mut().as_mut_ptr() as *mut _ as *mut cty::c_void, + primary_buffer_guard.borrow_mut().as_mut_ptr() as *mut _, ptr::null_mut(), N as u32, ); @@ -132,7 +194,7 @@ impl<'a, const N: usize> DisplayDriver { .ok_or(DisplayError::FailedToRegister)?, ) as *mut _; - disp_drv.user_data = Box::into_raw(Box::new(display_update_callback)) as *mut c_void; + disp_drv.user_data = Box::into_raw(Box::new(display_update_callback)) as *mut _; // Sets trampoline pointer to the function implementation that uses the `F` type for a // refresh buffer of size N specifically. @@ -144,6 +206,66 @@ impl<'a, const N: usize> DisplayDriver { _buffer: draw_buffer, }) } + + pub unsafe fn new_raw( + draw_buffer: DrawBuffer, + flush_cb: Option< + unsafe extern "C" fn( + *mut lvgl_sys::_lv_disp_drv_t, + *const lvgl_sys::lv_area_t, + *mut lvgl_sys::lv_color16_t, + ), + >, + rounder_cb: Option< + unsafe extern "C" fn(*mut lvgl_sys::_lv_disp_drv_t, *mut lvgl_sys::lv_area_t), + >, + set_px_cb: Option< + unsafe extern "C" fn( + *mut lvgl_sys::_lv_disp_drv_t, + *mut u8, + lvgl_sys::lv_coord_t, + lvgl_sys::lv_coord_t, + lvgl_sys::lv_coord_t, + lvgl_sys::lv_color_t, + lvgl_sys::lv_opa_t, + ), + >, + clear_cb: Option, + monitor_cb: Option, + wait_cb: Option, + clean_dcache_cb: Option, + drv_update_cb: Option, + render_start_cb: Option, + ) -> Result { + let mut disp_drv = unsafe { + let mut inner = MaybeUninit::uninit(); + lvgl_sys::lv_disp_drv_init(inner.as_mut_ptr()); + inner.assume_init() + }; + + disp_drv.draw_buf = Box::<_lv_disp_draw_buf_t>::into_raw( + draw_buffer + .get_ptr() + .ok_or(DisplayError::FailedToRegister)?, + ) as *mut _; + + //disp_drv.user_data = Box::into_raw(Box::new(display_update_callback)) as *mut _; + + disp_drv.flush_cb = flush_cb; + disp_drv.rounder_cb = rounder_cb; + disp_drv.set_px_cb = set_px_cb; + disp_drv.clear_cb = clear_cb; + disp_drv.monitor_cb = monitor_cb; + disp_drv.wait_cb = wait_cb; + disp_drv.clean_dcache_cb = clean_dcache_cb; + disp_drv.drv_update_cb = drv_update_cb; + disp_drv.render_start_cb = render_start_cb; + + Ok(Self { + disp_drv, + _buffer: draw_buffer, + }) + } } /// Represents a sub-area of the display that is being updated. diff --git a/lvgl/src/drivers/lv_drv_display.rs b/lvgl/src/drivers/lv_drv_display.rs new file mode 100644 index 00000000..1b3bf7bd --- /dev/null +++ b/lvgl/src/drivers/lv_drv_display.rs @@ -0,0 +1,30 @@ +use crate::{Display, DrawBuffer}; + +macro_rules! lv_drv_fbdev { + ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { + unsafe { + lvgl_sys::fbdev_init(); + Display::register_raw( + draw_buffer = $draw_buffer, + hor_res = $hor_res, + ver_res = $ver_res, + flush_cb = lvgl_sys::fbdev_flush, + rounder_cb = None, + set_px_cb = None, + clear_cb = None, + monitor_cb = None, + wait_cb = None, + clean_dcache_cb = None, + drv_update_cb = None, + render_start_cb = None, + drop = lvgl_sys::fbdev_exit, + ) + } + }; +} +/* +fn fbdev(buffer: DrawBuffer) { + //let disp = Display::register_raw(draw_buffer, hor_res, ver_res, flush_cb, rounder_cb, set_px_cb, clear_cb, monitor_cb, wait_cb, clean_dcache_cb, drv_update_cb, render_start_cb) + +} +*/ diff --git a/lvgl/src/drivers/lv_drv_input.rs b/lvgl/src/drivers/lv_drv_input.rs new file mode 100644 index 00000000..8dba0945 --- /dev/null +++ b/lvgl/src/drivers/lv_drv_input.rs @@ -0,0 +1 @@ +fn wee() {} diff --git a/lvgl/src/drivers/mod.rs b/lvgl/src/drivers/mod.rs new file mode 100644 index 00000000..97ed76ec --- /dev/null +++ b/lvgl/src/drivers/mod.rs @@ -0,0 +1,2 @@ +pub mod lv_drv_display; +pub mod lv_drv_input; diff --git a/lvgl/src/functions.rs b/lvgl/src/functions.rs index 2fd93123..0c96e040 100644 --- a/lvgl/src/functions.rs +++ b/lvgl/src/functions.rs @@ -17,10 +17,12 @@ type Result = result::Result; /// Register own buffer pub(crate) fn disp_drv_register( disp_drv: &mut DisplayDriver, + drop: Option, ) -> Result { let disp_ptr = unsafe { lvgl_sys::lv_disp_drv_register(&mut disp_drv.disp_drv as *mut _) }; Ok(Display::from_raw( NonNull::new(disp_ptr).ok_or(CoreError::OperationFailed)?, + drop, )) } @@ -28,6 +30,7 @@ pub(crate) fn disp_get_default() -> Result { let disp_ptr = unsafe { lvgl_sys::lv_disp_get_default() }; Ok(Display::from_raw( NonNull::new(disp_ptr).ok_or(CoreError::OperationFailed)?, + None, )) } diff --git a/lvgl/src/lib.rs b/lvgl/src/lib.rs index c712edfc..3d85817f 100644 --- a/lvgl/src/lib.rs +++ b/lvgl/src/lib.rs @@ -57,6 +57,9 @@ mod support; pub mod input_device; pub mod widgets; +#[cfg(feature = "drivers")] +#[macro_use] +pub mod drivers; struct RunOnce(AtomicBool); From bb503982b7a1e45a4d54a697143f2cf9d32bd6b3 Mon Sep 17 00:00:00 2001 From: Nia Espera Date: Thu, 9 Mar 2023 18:32:03 +0100 Subject: [PATCH 08/18] done with display driver macros :D --- lvgl/src/drivers/lv_drv_display.rs | 239 ++++++++++++++++++++++++++++- 1 file changed, 233 insertions(+), 6 deletions(-) diff --git a/lvgl/src/drivers/lv_drv_display.rs b/lvgl/src/drivers/lv_drv_display.rs index 1b3bf7bd..4c2e197d 100644 --- a/lvgl/src/drivers/lv_drv_display.rs +++ b/lvgl/src/drivers/lv_drv_display.rs @@ -1,6 +1,6 @@ use crate::{Display, DrawBuffer}; -macro_rules! lv_drv_fbdev { +macro_rules! lv_drv_disp_fbdev { ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { unsafe { lvgl_sys::fbdev_init(); @@ -20,11 +20,238 @@ macro_rules! lv_drv_fbdev { drop = lvgl_sys::fbdev_exit, ) } - }; + } } -/* -fn fbdev(buffer: DrawBuffer) { - //let disp = Display::register_raw(draw_buffer, hor_res, ver_res, flush_cb, rounder_cb, set_px_cb, clear_cb, monitor_cb, wait_cb, clean_dcache_cb, drv_update_cb, render_start_cb) +macro_rules! lv_drv_disp_drm { + ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { + unsafe { + lvgl_sys::drm_init(); + Display::register_raw( + draw_buffer = $draw_buffer, + hor_res = $hor_res, + ver_res = $ver_res, + flush_cb = lvgl_sys::drm_flush, + rounder_cb = None, + set_px_cb = None, + clear_cb = None, + monitor_cb = None, + wait_cb = lvgl_sys::drm_wait_vsync, + clean_dcache_cb = None, + drv_update_cb = None, + render_start_cb = None, + drop = lvgl_sys::drm_exit, + ) + } + } +} + +macro_rules! lv_drv_disp_gtk { + ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { + unsafe { + lvgl_sys::gtkdrv_init(); + Display::register_raw( + draw_buffer = $draw_buffer, + hor_res = $hor_res, + ver_res = $ver_res, + flush_cb = lvgl_sys::gtkdrv_flush_cb, + rounder_cb = None, + set_px_cb = None, + clear_cb = None, + monitor_cb = None, + wait_cb = None, + clean_dcache_cb = None, + drv_update_cb = None, + render_start_cb = None, + drop = None, + ) + } + } +} + +macro_rules! lv_drv_disp_monitor { + ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { + unsafe { + lvgl_sys::monitor_init(); + Display::register_raw( + draw_buffer = $draw_buffer, + hor_res = $hor_res, + ver_res = $ver_res, + flush_cb = lvgl_sys::monitor_flush, + rounder_cb = None, + set_px_cb = None, + clear_cb = None, + monitor_cb = None, + wait_cb = None, + clean_dcache_cb = None, + drv_update_cb = None, + render_start_cb = None, + drop = None, + ) + } + } +} + +macro_rules! lv_drv_disp_gc9a01 { + ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { + unsafe { + match lvgl_sys::GC9A01_init() { + 0 => (), + c = panic!("GC9A01_init() returned error code {c}") + }; + Display::register_raw( + draw_buffer = $draw_buffer, + hor_res = $hor_res, + ver_res = $ver_res, + flush_cb = lvgl_sys::GC9A01_flush, + rounder_cb = None, + set_px_cb = None, + clear_cb = None, + monitor_cb = None, + wait_cb = None, + clean_dcache_cb = None, + drv_update_cb = None, + render_start_cb = None, + drop = None, + ) + } + } +} + +macro_rules! lv_drv_disp_ili9341 { + ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { + unsafe { + lvgl_sys::ili9341_init(); + Display::register_raw( + draw_buffer = $draw_buffer, + hor_res = $hor_res, + ver_res = $ver_res, + flush_cb = lvgl_sys::ili9341_flush, + rounder_cb = None, + set_px_cb = None, + clear_cb = None, + monitor_cb = None, + wait_cb = None, + clean_dcache_cb = None, + drv_update_cb = None, + render_start_cb = None, + drop = None, + ) + } + } +} + +macro_rules! lv_drv_disp_r61581 { + ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { + unsafe { + lvgl_sys::r61581_init(); + Display::register_raw( + draw_buffer = $draw_buffer, + hor_res = $hor_res, + ver_res = $ver_res, + flush_cb = lvgl_sys::r61581_flush, + rounder_cb = None, + set_px_cb = None, + clear_cb = None, + monitor_cb = None, + wait_cb = None, + clean_dcache_cb = None, + drv_update_cb = None, + render_start_cb = None, + drop = None, + ) + } + } +} + +macro_rules! lv_drv_disp_sharp_mip { + ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { + unsafe { + lvgl_sys::sharp_mip_init(); + Display::register_raw( + draw_buffer = $draw_buffer, + hor_res = $hor_res, + ver_res = $ver_res, + flush_cb = lvgl_sys::sharp_mip_flush, + rounder_cb = lvgl_sys::sharp_mip_rounder, + set_px_cb = lvgl_sys::sharp_mip_set_px, + clear_cb = None, + monitor_cb = None, + wait_cb = None, + clean_dcache_cb = None, + drv_update_cb = None, + render_start_cb = None, + drop = None, + ) + } + } +} + +macro_rules! lv_drv_disp_ssd1963 { + ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { + unsafe { + lvgl_sys::ssd1963_init(); + Display::register_raw( + draw_buffer = $draw_buffer, + hor_res = $hor_res, + ver_res = $ver_res, + flush_cb = lvgl_sys::ssd1963_flush, + rounder_cb = None, + set_px_cb = None, + clear_cb = None, + monitor_cb = None, + wait_cb = None, + clean_dcache_cb = None, + drv_update_cb = None, + render_start_cb = None, + drop = None, + ) + } + } +} + +macro_rules! lv_drv_disp_st7565 { + ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { + unsafe { + lvgl_sys::st7565_init(); + Display::register_raw( + draw_buffer = $draw_buffer, + hor_res = $hor_res, + ver_res = $ver_res, + flush_cb = lvgl_sys::st7565_flush, + rounder_cb = None, + set_px_cb = None, + clear_cb = None, + monitor_cb = None, + wait_cb = None, + clean_dcache_cb = None, + drv_update_cb = None, + render_start_cb = None, + drop = None, + ) + } + } +} + +macro_rules! lv_drv_disp_uc1610 { + ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { + unsafe { + lvgl_sys::uc1610_init(); + Display::register_raw( + draw_buffer = $draw_buffer, + hor_res = $hor_res, + ver_res = $ver_res, + flush_cb = lvgl_sys::uc1610_flush_cb, + rounder_cb = lvgl_sys::uc1610_rounder_cb, + set_px_cb = lvgl_sys::uc1610_set_px_cb, + clear_cb = None, + monitor_cb = None, + wait_cb = None, + clean_dcache_cb = None, + drv_update_cb = None, + render_start_cb = None, + drop = None, + ) + } + } } -*/ From 17aba55717637bd5588d74442113a35c356931b5 Mon Sep 17 00:00:00 2001 From: Nia Espera Date: Thu, 9 Mar 2023 18:59:49 +0100 Subject: [PATCH 09/18] input devices done too woo --- lvgl/src/drivers/lv_drv_display.rs | 6 +-- lvgl/src/drivers/lv_drv_input.rs | 73 +++++++++++++++++++++++++++++- lvgl/src/input_device/generic.rs | 6 +++ lvgl/src/input_device/pointer.rs | 19 ++++++++ 4 files changed, 100 insertions(+), 4 deletions(-) diff --git a/lvgl/src/drivers/lv_drv_display.rs b/lvgl/src/drivers/lv_drv_display.rs index 4c2e197d..c4309213 100644 --- a/lvgl/src/drivers/lv_drv_display.rs +++ b/lvgl/src/drivers/lv_drv_display.rs @@ -69,15 +69,15 @@ macro_rules! lv_drv_disp_gtk { } } -macro_rules! lv_drv_disp_monitor { +macro_rules! lv_drv_disp_sdl { ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { unsafe { - lvgl_sys::monitor_init(); + lvgl_sys::sdl_init(); Display::register_raw( draw_buffer = $draw_buffer, hor_res = $hor_res, ver_res = $ver_res, - flush_cb = lvgl_sys::monitor_flush, + flush_cb = lvgl_sys::sdl_display_flush, rounder_cb = None, set_px_cb = None, clear_cb = None, diff --git a/lvgl/src/drivers/lv_drv_input.rs b/lvgl/src/drivers/lv_drv_input.rs index 8dba0945..32001ef4 100644 --- a/lvgl/src/drivers/lv_drv_input.rs +++ b/lvgl/src/drivers/lv_drv_input.rs @@ -1 +1,72 @@ -fn wee() {} +use crate::input_device::generic::InputDriver; +use crate::input_device::pointer::Pointer; + +macro_rules! lv_drv_input_pointer_evdev { + () => { + unsafe { + lvgl_sys::evdev_init(); + Pointer::new_raw( + read_cb = lvgl_sys::evdev_read, + feedback_cb = None, + ) + } + } +} + +macro_rules! lv_drv_input_pointer_gtk { + () => { + unsafe { + Pointer::new_raw( + read_cb = lvgl_sys::gtkdrv_mouse_read_cb, + feedback_cb = None, + ) + } + } +} + +macro_rules! lv_drv_input_pointer_sdl { + () => { + unsafe { + Pointer::new_raw( + read_cb = lvgl_sys::sdl_mouse_read, + feedback_cb = None, + ) + } + } +} + +macro_rules! lv_drv_input_ad_touch { + () => { + unsafe { + lvgl_sys::ad_touch_init(); + Pointer::new_raw( + read_cb = lvgl_sys::ad_touch_read, + feedback_cb = None, + ) + } + } +} + +macro_rules! lv_drv_input_ft5406ee8 { + () => { + unsafe { + lvgl_sys::ft5406ee8_init(); + Pointer::new_raw( + read_cb = lvgl_sys::ft5406ee8_read, + feedback_cb = None, + ) + } + } +} + +macro_rules! lv_drv_input_xpt2046 { + () => { + unsafe { + lvgl_sys::xpt2046_init(); + Pointer::new_raw( + read_cb = lvgl_sys::xpt2046_read, + feedback_cb = None, + ) + } + } +} diff --git a/lvgl/src/input_device/generic.rs b/lvgl/src/input_device/generic.rs index 5a707e87..d6277ef8 100644 --- a/lvgl/src/input_device/generic.rs +++ b/lvgl/src/input_device/generic.rs @@ -40,5 +40,11 @@ pub trait InputDriver { F: Fn() -> BufferStatus; fn get_driver(&mut self) -> &mut lvgl_sys::lv_indev_drv_t; + + unsafe fn new_raw( + read_cb: Option, + feedback_cb: Option, + ) -> D; + unsafe fn set_descriptor(&mut self, descriptor: *mut lvgl_sys::lv_indev_t) -> LvResult<()>; } diff --git a/lvgl/src/input_device/pointer.rs b/lvgl/src/input_device/pointer.rs index b80cd566..f44e899b 100644 --- a/lvgl/src/input_device/pointer.rs +++ b/lvgl/src/input_device/pointer.rs @@ -52,6 +52,25 @@ impl InputDriver for Pointer { self.driver.as_mut() } + unsafe fn new_raw( + read_cb: Option, + feedback_cb: Option, + ) -> Self { + let driver = unsafe { + let mut indev_drv = MaybeUninit::uninit(); + lvgl_sys::lv_indev_drv_init(indev_drv.as_mut_ptr()); + let mut indev_drv = Box::new(indev_drv.assume_init()); + indev_drv.type_ = lvgl_sys::lv_indev_type_t_LV_INDEV_TYPE_POINTER; + indev_drv.read_cb = read_cb; + indev_drv.feedback_cb = feedback_cb; + indev_drv + }; + Self { + driver, + descriptor: None, + } + } + unsafe fn set_descriptor(&mut self, descriptor: *mut lvgl_sys::lv_indev_t) -> LvResult<()> { if self.descriptor.is_none() { self.descriptor = Some(descriptor); From ee2a8471960467d4351a080a865b17aed964e50d Mon Sep 17 00:00:00 2001 From: Nia Espera Date: Thu, 9 Mar 2023 19:09:44 +0100 Subject: [PATCH 10/18] export macros --- lvgl/src/drivers/lv_drv_display.rs | 35 +++++++++++++++++++----------- lvgl/src/drivers/lv_drv_input.rs | 21 ++++++++++-------- lvgl/src/drivers/mod.rs | 2 ++ lvgl/src/input_device/generic.rs | 4 ++-- lvgl/src/input_device/pointer.rs | 4 ++-- lvgl/src/lib.rs | 1 - 6 files changed, 40 insertions(+), 27 deletions(-) diff --git a/lvgl/src/drivers/lv_drv_display.rs b/lvgl/src/drivers/lv_drv_display.rs index c4309213..306727b6 100644 --- a/lvgl/src/drivers/lv_drv_display.rs +++ b/lvgl/src/drivers/lv_drv_display.rs @@ -1,10 +1,9 @@ -use crate::{Display, DrawBuffer}; - +#[macro_export] macro_rules! lv_drv_disp_fbdev { ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { unsafe { lvgl_sys::fbdev_init(); - Display::register_raw( + lvgl::Display::register_raw( draw_buffer = $draw_buffer, hor_res = $hor_res, ver_res = $ver_res, @@ -23,11 +22,12 @@ macro_rules! lv_drv_disp_fbdev { } } +#[macro_export] macro_rules! lv_drv_disp_drm { ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { unsafe { lvgl_sys::drm_init(); - Display::register_raw( + lvgl::Display::register_raw( draw_buffer = $draw_buffer, hor_res = $hor_res, ver_res = $ver_res, @@ -46,11 +46,12 @@ macro_rules! lv_drv_disp_drm { } } +#[macro_export] macro_rules! lv_drv_disp_gtk { ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { unsafe { lvgl_sys::gtkdrv_init(); - Display::register_raw( + lvgl::Display::register_raw( draw_buffer = $draw_buffer, hor_res = $hor_res, ver_res = $ver_res, @@ -69,11 +70,12 @@ macro_rules! lv_drv_disp_gtk { } } +#[macro_export] macro_rules! lv_drv_disp_sdl { ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { unsafe { lvgl_sys::sdl_init(); - Display::register_raw( + lvgl::Display::register_raw( draw_buffer = $draw_buffer, hor_res = $hor_res, ver_res = $ver_res, @@ -92,6 +94,7 @@ macro_rules! lv_drv_disp_sdl { } } +#[macro_export] macro_rules! lv_drv_disp_gc9a01 { ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { unsafe { @@ -99,7 +102,7 @@ macro_rules! lv_drv_disp_gc9a01 { 0 => (), c = panic!("GC9A01_init() returned error code {c}") }; - Display::register_raw( + lvgl::Display::register_raw( draw_buffer = $draw_buffer, hor_res = $hor_res, ver_res = $ver_res, @@ -118,11 +121,12 @@ macro_rules! lv_drv_disp_gc9a01 { } } +#[macro_export] macro_rules! lv_drv_disp_ili9341 { ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { unsafe { lvgl_sys::ili9341_init(); - Display::register_raw( + lvgl::Display::register_raw( draw_buffer = $draw_buffer, hor_res = $hor_res, ver_res = $ver_res, @@ -141,11 +145,12 @@ macro_rules! lv_drv_disp_ili9341 { } } +#[macro_export] macro_rules! lv_drv_disp_r61581 { ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { unsafe { lvgl_sys::r61581_init(); - Display::register_raw( + lvgl::Display::register_raw( draw_buffer = $draw_buffer, hor_res = $hor_res, ver_res = $ver_res, @@ -164,11 +169,12 @@ macro_rules! lv_drv_disp_r61581 { } } +#[macro_export] macro_rules! lv_drv_disp_sharp_mip { ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { unsafe { lvgl_sys::sharp_mip_init(); - Display::register_raw( + lvgl::Display::register_raw( draw_buffer = $draw_buffer, hor_res = $hor_res, ver_res = $ver_res, @@ -187,11 +193,12 @@ macro_rules! lv_drv_disp_sharp_mip { } } +#[macro_export] macro_rules! lv_drv_disp_ssd1963 { ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { unsafe { lvgl_sys::ssd1963_init(); - Display::register_raw( + lvgl::Display::register_raw( draw_buffer = $draw_buffer, hor_res = $hor_res, ver_res = $ver_res, @@ -210,11 +217,12 @@ macro_rules! lv_drv_disp_ssd1963 { } } +#[macro_export] macro_rules! lv_drv_disp_st7565 { ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { unsafe { lvgl_sys::st7565_init(); - Display::register_raw( + lvgl::Display::register_raw( draw_buffer = $draw_buffer, hor_res = $hor_res, ver_res = $ver_res, @@ -233,11 +241,12 @@ macro_rules! lv_drv_disp_st7565 { } } +#[macro_export] macro_rules! lv_drv_disp_uc1610 { ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { unsafe { lvgl_sys::uc1610_init(); - Display::register_raw( + lvgl::Display::register_raw( draw_buffer = $draw_buffer, hor_res = $hor_res, ver_res = $ver_res, diff --git a/lvgl/src/drivers/lv_drv_input.rs b/lvgl/src/drivers/lv_drv_input.rs index 32001ef4..3086a68c 100644 --- a/lvgl/src/drivers/lv_drv_input.rs +++ b/lvgl/src/drivers/lv_drv_input.rs @@ -1,11 +1,9 @@ -use crate::input_device::generic::InputDriver; -use crate::input_device::pointer::Pointer; - +#[macro_export] macro_rules! lv_drv_input_pointer_evdev { () => { unsafe { lvgl_sys::evdev_init(); - Pointer::new_raw( + lvgl::input_device::pointer::PointerPointer::new_raw( read_cb = lvgl_sys::evdev_read, feedback_cb = None, ) @@ -13,10 +11,11 @@ macro_rules! lv_drv_input_pointer_evdev { } } +#[macro_export] macro_rules! lv_drv_input_pointer_gtk { () => { unsafe { - Pointer::new_raw( + lvgl::input_device::pointer::Pointer::new_raw( read_cb = lvgl_sys::gtkdrv_mouse_read_cb, feedback_cb = None, ) @@ -24,10 +23,11 @@ macro_rules! lv_drv_input_pointer_gtk { } } +#[macro_export] macro_rules! lv_drv_input_pointer_sdl { () => { unsafe { - Pointer::new_raw( + lvgl::input_device::pointer::Pointer::new_raw( read_cb = lvgl_sys::sdl_mouse_read, feedback_cb = None, ) @@ -35,11 +35,12 @@ macro_rules! lv_drv_input_pointer_sdl { } } +#[macro_export] macro_rules! lv_drv_input_ad_touch { () => { unsafe { lvgl_sys::ad_touch_init(); - Pointer::new_raw( + lvgl::input_device::pointer::Pointer::new_raw( read_cb = lvgl_sys::ad_touch_read, feedback_cb = None, ) @@ -47,11 +48,12 @@ macro_rules! lv_drv_input_ad_touch { } } +#[macro_export] macro_rules! lv_drv_input_ft5406ee8 { () => { unsafe { lvgl_sys::ft5406ee8_init(); - Pointer::new_raw( + lvgl::input_device::pointer::Pointer::new_raw( read_cb = lvgl_sys::ft5406ee8_read, feedback_cb = None, ) @@ -59,11 +61,12 @@ macro_rules! lv_drv_input_ft5406ee8 { } } +#[macro_export] macro_rules! lv_drv_input_xpt2046 { () => { unsafe { lvgl_sys::xpt2046_init(); - Pointer::new_raw( + lvgl::input_device::pointer::Pointer::new_raw( read_cb = lvgl_sys::xpt2046_read, feedback_cb = None, ) diff --git a/lvgl/src/drivers/mod.rs b/lvgl/src/drivers/mod.rs index 97ed76ec..a6bc96c2 100644 --- a/lvgl/src/drivers/mod.rs +++ b/lvgl/src/drivers/mod.rs @@ -1,2 +1,4 @@ +#[macro_use] pub mod lv_drv_display; +#[macro_use] pub mod lv_drv_input; diff --git a/lvgl/src/input_device/generic.rs b/lvgl/src/input_device/generic.rs index d6277ef8..98f0ca9e 100644 --- a/lvgl/src/input_device/generic.rs +++ b/lvgl/src/input_device/generic.rs @@ -42,8 +42,8 @@ pub trait InputDriver { fn get_driver(&mut self) -> &mut lvgl_sys::lv_indev_drv_t; unsafe fn new_raw( - read_cb: Option, - feedback_cb: Option, + read_cb: Option, + feedback_cb: Option, ) -> D; unsafe fn set_descriptor(&mut self, descriptor: *mut lvgl_sys::lv_indev_t) -> LvResult<()>; diff --git a/lvgl/src/input_device/pointer.rs b/lvgl/src/input_device/pointer.rs index f44e899b..0df936a6 100644 --- a/lvgl/src/input_device/pointer.rs +++ b/lvgl/src/input_device/pointer.rs @@ -53,8 +53,8 @@ impl InputDriver for Pointer { } unsafe fn new_raw( - read_cb: Option, - feedback_cb: Option, + read_cb: Option, + feedback_cb: Option, ) -> Self { let driver = unsafe { let mut indev_drv = MaybeUninit::uninit(); diff --git a/lvgl/src/lib.rs b/lvgl/src/lib.rs index 3d85817f..e2d2b174 100644 --- a/lvgl/src/lib.rs +++ b/lvgl/src/lib.rs @@ -58,7 +58,6 @@ mod support; pub mod input_device; pub mod widgets; #[cfg(feature = "drivers")] -#[macro_use] pub mod drivers; struct RunOnce(AtomicBool); From 338083fd55c634511691cf7dac36962dacbd122b Mon Sep 17 00:00:00 2001 From: Nia Espera Date: Thu, 9 Mar 2023 19:14:29 +0100 Subject: [PATCH 11/18] yikes --- lvgl-sys/shims/lvgl_drv.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lvgl-sys/shims/lvgl_drv.h b/lvgl-sys/shims/lvgl_drv.h index b7085cb5..3cf31c37 100644 --- a/lvgl-sys/shims/lvgl_drv.h +++ b/lvgl-sys/shims/lvgl_drv.h @@ -1,10 +1,10 @@ -#ifndef LVGL_DRV_H -#define LVGL_DRV_H - #ifdef __cplusplus extern "C" { #endif +#ifndef LVGL_DRV_H +#define LVGL_DRV_H + #include "lv_drv_conf.h" /* Displays */ From 51ae9f3d7d924ae8c4070953a65dab671468db65 Mon Sep 17 00:00:00 2001 From: Nia Espera Date: Thu, 9 Mar 2023 23:16:37 +0100 Subject: [PATCH 12/18] add test (broken, need to fix linking) --- lvgl/src/drivers/lv_drv_display.rs | 305 +++++++++++++++-------------- lvgl/src/drivers/lv_drv_input.rs | 24 +-- 2 files changed, 173 insertions(+), 156 deletions(-) diff --git a/lvgl/src/drivers/lv_drv_display.rs b/lvgl/src/drivers/lv_drv_display.rs index 306727b6..74d3dfec 100644 --- a/lvgl/src/drivers/lv_drv_display.rs +++ b/lvgl/src/drivers/lv_drv_display.rs @@ -4,19 +4,19 @@ macro_rules! lv_drv_disp_fbdev { unsafe { lvgl_sys::fbdev_init(); lvgl::Display::register_raw( - draw_buffer = $draw_buffer, - hor_res = $hor_res, - ver_res = $ver_res, - flush_cb = lvgl_sys::fbdev_flush, - rounder_cb = None, - set_px_cb = None, - clear_cb = None, - monitor_cb = None, - wait_cb = None, - clean_dcache_cb = None, - drv_update_cb = None, - render_start_cb = None, - drop = lvgl_sys::fbdev_exit, + $draw_buffer, + $hor_res, + $ver_res, + Some(lvgl_sys::fbdev_flush), + None, + None, + None, + None, + None, + None, + None, + None, + Some(lvgl_sys::fbdev_exit), ) } } @@ -28,19 +28,19 @@ macro_rules! lv_drv_disp_drm { unsafe { lvgl_sys::drm_init(); lvgl::Display::register_raw( - draw_buffer = $draw_buffer, - hor_res = $hor_res, - ver_res = $ver_res, - flush_cb = lvgl_sys::drm_flush, - rounder_cb = None, - set_px_cb = None, - clear_cb = None, - monitor_cb = None, - wait_cb = lvgl_sys::drm_wait_vsync, - clean_dcache_cb = None, - drv_update_cb = None, - render_start_cb = None, - drop = lvgl_sys::drm_exit, + $draw_buffer, + $hor_res, + $ver_res, + Some(lvgl_sys::drm_flush), + None, + None, + None, + None, + Some(lvgl_sys::drm_wait_vsync), + None, + None, + None, + Some(lvgl_sys::drm_exit), ) } } @@ -51,20 +51,20 @@ macro_rules! lv_drv_disp_gtk { ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { unsafe { lvgl_sys::gtkdrv_init(); - lvgl::Display::register_raw( - draw_buffer = $draw_buffer, - hor_res = $hor_res, - ver_res = $ver_res, - flush_cb = lvgl_sys::gtkdrv_flush_cb, - rounder_cb = None, - set_px_cb = None, - clear_cb = None, - monitor_cb = None, - wait_cb = None, - clean_dcache_cb = None, - drv_update_cb = None, - render_start_cb = None, - drop = None, + crate::Display::register_raw( + $draw_buffer, + $hor_res, + $ver_res, + Some(lvgl_sys::gtkdrv_flush_cb), + None, + None, + None, + None, + None, + None, + None, + None, + None, ) } } @@ -76,19 +76,19 @@ macro_rules! lv_drv_disp_sdl { unsafe { lvgl_sys::sdl_init(); lvgl::Display::register_raw( - draw_buffer = $draw_buffer, - hor_res = $hor_res, - ver_res = $ver_res, - flush_cb = lvgl_sys::sdl_display_flush, - rounder_cb = None, - set_px_cb = None, - clear_cb = None, - monitor_cb = None, - wait_cb = None, - clean_dcache_cb = None, - drv_update_cb = None, - render_start_cb = None, - drop = None, + $draw_buffer, + $hor_res, + $ver_res, + Some(lvgl_sys::sdl_display_flush), + None, + None, + None, + None, + None, + None, + None, + None, + None, ) } } @@ -103,19 +103,19 @@ macro_rules! lv_drv_disp_gc9a01 { c = panic!("GC9A01_init() returned error code {c}") }; lvgl::Display::register_raw( - draw_buffer = $draw_buffer, - hor_res = $hor_res, - ver_res = $ver_res, - flush_cb = lvgl_sys::GC9A01_flush, - rounder_cb = None, - set_px_cb = None, - clear_cb = None, - monitor_cb = None, - wait_cb = None, - clean_dcache_cb = None, - drv_update_cb = None, - render_start_cb = None, - drop = None, + $draw_buffer, + $hor_res, + $ver_res, + Some(lvgl_sys::GC9A01_flush), + None, + None, + None, + None, + None, + None, + None, + None, + None, ) } } @@ -127,19 +127,19 @@ macro_rules! lv_drv_disp_ili9341 { unsafe { lvgl_sys::ili9341_init(); lvgl::Display::register_raw( - draw_buffer = $draw_buffer, - hor_res = $hor_res, - ver_res = $ver_res, - flush_cb = lvgl_sys::ili9341_flush, - rounder_cb = None, - set_px_cb = None, - clear_cb = None, - monitor_cb = None, - wait_cb = None, - clean_dcache_cb = None, - drv_update_cb = None, - render_start_cb = None, - drop = None, + $draw_buffer, + $hor_res, + $ver_res, + Some(lvgl_sys::ili9341_flush), + None, + None, + None, + None, + None, + None, + None, + None, + None, ) } } @@ -151,19 +151,19 @@ macro_rules! lv_drv_disp_r61581 { unsafe { lvgl_sys::r61581_init(); lvgl::Display::register_raw( - draw_buffer = $draw_buffer, - hor_res = $hor_res, - ver_res = $ver_res, - flush_cb = lvgl_sys::r61581_flush, - rounder_cb = None, - set_px_cb = None, - clear_cb = None, - monitor_cb = None, - wait_cb = None, - clean_dcache_cb = None, - drv_update_cb = None, - render_start_cb = None, - drop = None, + $draw_buffer, + $hor_res, + $ver_res, + Some(lvgl_sys::r61581_flush), + None, + None, + None, + None, + None, + None, + None, + None, + None, ) } } @@ -175,19 +175,19 @@ macro_rules! lv_drv_disp_sharp_mip { unsafe { lvgl_sys::sharp_mip_init(); lvgl::Display::register_raw( - draw_buffer = $draw_buffer, - hor_res = $hor_res, - ver_res = $ver_res, - flush_cb = lvgl_sys::sharp_mip_flush, - rounder_cb = lvgl_sys::sharp_mip_rounder, - set_px_cb = lvgl_sys::sharp_mip_set_px, - clear_cb = None, - monitor_cb = None, - wait_cb = None, - clean_dcache_cb = None, - drv_update_cb = None, - render_start_cb = None, - drop = None, + $draw_buffer, + $hor_res, + $ver_res, + Some(lvgl_sys::sharp_mip_flush), + Some(lvgl_sys::sharp_mip_rounder), + Some(lvgl_sys::sharp_mip_set_px), + None, + None, + None, + None, + None, + None, + None, ) } } @@ -199,19 +199,19 @@ macro_rules! lv_drv_disp_ssd1963 { unsafe { lvgl_sys::ssd1963_init(); lvgl::Display::register_raw( - draw_buffer = $draw_buffer, - hor_res = $hor_res, - ver_res = $ver_res, - flush_cb = lvgl_sys::ssd1963_flush, - rounder_cb = None, - set_px_cb = None, - clear_cb = None, - monitor_cb = None, - wait_cb = None, - clean_dcache_cb = None, - drv_update_cb = None, - render_start_cb = None, - drop = None, + $draw_buffer, + $hor_res, + $ver_res, + Some(lvgl_sys::ssd1963_flush), + None, + None, + None, + None, + None, + None, + None, + None, + None, ) } } @@ -223,19 +223,19 @@ macro_rules! lv_drv_disp_st7565 { unsafe { lvgl_sys::st7565_init(); lvgl::Display::register_raw( - draw_buffer = $draw_buffer, - hor_res = $hor_res, - ver_res = $ver_res, - flush_cb = lvgl_sys::st7565_flush, - rounder_cb = None, - set_px_cb = None, - clear_cb = None, - monitor_cb = None, - wait_cb = None, - clean_dcache_cb = None, - drv_update_cb = None, - render_start_cb = None, - drop = None, + $draw_buffer, + $hor_res, + $ver_res, + Some(lvgl_sys::st7565_flush), + None, + None, + None, + None, + None, + None, + None, + None, + None, ) } } @@ -247,20 +247,37 @@ macro_rules! lv_drv_disp_uc1610 { unsafe { lvgl_sys::uc1610_init(); lvgl::Display::register_raw( - draw_buffer = $draw_buffer, - hor_res = $hor_res, - ver_res = $ver_res, - flush_cb = lvgl_sys::uc1610_flush_cb, - rounder_cb = lvgl_sys::uc1610_rounder_cb, - set_px_cb = lvgl_sys::uc1610_set_px_cb, - clear_cb = None, - monitor_cb = None, - wait_cb = None, - clean_dcache_cb = None, - drv_update_cb = None, - render_start_cb = None, - drop = None, + $draw_buffer, + $hor_res, + $ver_res, + Some(lvgl_sys::uc1610_flush_cb), + Some(lvgl_sys::uc1610_rounder_cb), + Some(lvgl_sys::uc1610_set_px_cb), + None, + None, + None, + None, + None, + None, + None, ) } } } + +#[cfg(test)] +mod tests { + #[macro_use] + use super::*; + use crate::tests; + use crate::DrawBuffer; + + #[test] + fn gtk_test() { + const HOR_RES: u32 = 240; + const VER_RES: u32 = 240; + tests::initialize_test(); + let buffer = DrawBuffer::<{ (HOR_RES * VER_RES) as usize }>::new(); + let _disp = lv_drv_disp_gtk!(buffer, HOR_RES, VER_RES); + } +} \ No newline at end of file diff --git a/lvgl/src/drivers/lv_drv_input.rs b/lvgl/src/drivers/lv_drv_input.rs index 3086a68c..2113bf39 100644 --- a/lvgl/src/drivers/lv_drv_input.rs +++ b/lvgl/src/drivers/lv_drv_input.rs @@ -4,8 +4,8 @@ macro_rules! lv_drv_input_pointer_evdev { unsafe { lvgl_sys::evdev_init(); lvgl::input_device::pointer::PointerPointer::new_raw( - read_cb = lvgl_sys::evdev_read, - feedback_cb = None, + Some(lvgl_sys::evdev_read), + None, ) } } @@ -16,8 +16,8 @@ macro_rules! lv_drv_input_pointer_gtk { () => { unsafe { lvgl::input_device::pointer::Pointer::new_raw( - read_cb = lvgl_sys::gtkdrv_mouse_read_cb, - feedback_cb = None, + Some(lvgl_sys::gtkdrv_mouse_read_cb), + None, ) } } @@ -28,8 +28,8 @@ macro_rules! lv_drv_input_pointer_sdl { () => { unsafe { lvgl::input_device::pointer::Pointer::new_raw( - read_cb = lvgl_sys::sdl_mouse_read, - feedback_cb = None, + Some(lvgl_sys::sdl_mouse_read), + None, ) } } @@ -41,8 +41,8 @@ macro_rules! lv_drv_input_ad_touch { unsafe { lvgl_sys::ad_touch_init(); lvgl::input_device::pointer::Pointer::new_raw( - read_cb = lvgl_sys::ad_touch_read, - feedback_cb = None, + Some(lvgl_sys::ad_touch_read), + None, ) } } @@ -54,8 +54,8 @@ macro_rules! lv_drv_input_ft5406ee8 { unsafe { lvgl_sys::ft5406ee8_init(); lvgl::input_device::pointer::Pointer::new_raw( - read_cb = lvgl_sys::ft5406ee8_read, - feedback_cb = None, + Some(lvgl_sys::ft5406ee8_read), + None, ) } } @@ -67,8 +67,8 @@ macro_rules! lv_drv_input_xpt2046 { unsafe { lvgl_sys::xpt2046_init(); lvgl::input_device::pointer::Pointer::new_raw( - read_cb = lvgl_sys::xpt2046_read, - feedback_cb = None, + Some(lvgl_sys::xpt2046_read), + None, ) } } From bba37775ff11862ea0c864ec4c3f31708ffa54e9 Mon Sep 17 00:00:00 2001 From: Nia Espera Date: Thu, 9 Mar 2023 23:39:12 +0100 Subject: [PATCH 13/18] grr --- examples/include/lv_drv_conf.h | 2 +- lvgl-sys/build.rs | 10 +++------- lvgl-sys/vendor/include/lv_drv_conf.h | 2 +- lvgl/src/drivers/lv_drv_display.rs | 2 +- lvgl/src/drivers/mod.rs | 2 -- 5 files changed, 6 insertions(+), 12 deletions(-) diff --git a/examples/include/lv_drv_conf.h b/examples/include/lv_drv_conf.h index fdb74bd1..23f280d6 100644 --- a/examples/include/lv_drv_conf.h +++ b/examples/include/lv_drv_conf.h @@ -167,7 +167,7 @@ * GTK drivers (monitor, mouse, keyboard *---------------------------------------*/ #ifndef USE_GTK -# define USE_GTK 1 +# define USE_GTK 0 #endif /*---------------------------------------- diff --git a/lvgl-sys/build.rs b/lvgl-sys/build.rs index 9d837ceb..ec957003 100644 --- a/lvgl-sys/build.rs +++ b/lvgl-sys/build.rs @@ -29,9 +29,7 @@ fn main() { let lvgl_src = vendor.join("lvgl").join("src"); #[cfg(feature = "drivers")] - let driver_display = vendor.join("lv_drivers").join("display"); - #[cfg(feature = "drivers")] - let driver_indev = vendor.join("lv_drivers").join("indev"); + let drivers = vendor.join("lv_drivers"); let lv_config_dir = { let conf_path = env::var(CONFIG_NAME) @@ -99,9 +97,7 @@ fn main() { add_c_files(&mut cfg, &lv_config_dir); add_c_files(&mut cfg, &shims_dir); #[cfg(feature = "drivers")] - add_c_files(&mut cfg, &driver_display); - #[cfg(feature = "drivers")] - add_c_files(&mut cfg, &driver_indev); + add_c_files(&mut cfg, &drivers); cfg.define("LV_CONF_INCLUDE_SIMPLE", Some("1")) .include(&lvgl_src) @@ -109,7 +105,7 @@ fn main() { .warnings(false) .include(&lv_config_dir); #[cfg(feature = "drivers")] - cfg.include(&driver_display).include(&driver_indev); + cfg.include(&drivers); cfg.compile("lvgl"); diff --git a/lvgl-sys/vendor/include/lv_drv_conf.h b/lvgl-sys/vendor/include/lv_drv_conf.h index fdb74bd1..23f280d6 100644 --- a/lvgl-sys/vendor/include/lv_drv_conf.h +++ b/lvgl-sys/vendor/include/lv_drv_conf.h @@ -167,7 +167,7 @@ * GTK drivers (monitor, mouse, keyboard *---------------------------------------*/ #ifndef USE_GTK -# define USE_GTK 1 +# define USE_GTK 0 #endif /*---------------------------------------- diff --git a/lvgl/src/drivers/lv_drv_display.rs b/lvgl/src/drivers/lv_drv_display.rs index 74d3dfec..1503beb3 100644 --- a/lvgl/src/drivers/lv_drv_display.rs +++ b/lvgl/src/drivers/lv_drv_display.rs @@ -278,6 +278,6 @@ mod tests { const VER_RES: u32 = 240; tests::initialize_test(); let buffer = DrawBuffer::<{ (HOR_RES * VER_RES) as usize }>::new(); - let _disp = lv_drv_disp_gtk!(buffer, HOR_RES, VER_RES); + //let _disp = lv_drv_disp_gtk!(buffer, HOR_RES, VER_RES); } } \ No newline at end of file diff --git a/lvgl/src/drivers/mod.rs b/lvgl/src/drivers/mod.rs index a6bc96c2..97ed76ec 100644 --- a/lvgl/src/drivers/mod.rs +++ b/lvgl/src/drivers/mod.rs @@ -1,4 +1,2 @@ -#[macro_use] pub mod lv_drv_display; -#[macro_use] pub mod lv_drv_input; From d6137299a1b229303fed0fa0820955a072023f85 Mon Sep 17 00:00:00 2001 From: Nia Espera Date: Fri, 10 Mar 2023 00:23:08 +0100 Subject: [PATCH 14/18] gtk drivers seem broken in upstream x.x --- lvgl-sys/build.rs | 5 +++++ lvgl-sys/vendor/lv_drivers | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lvgl-sys/build.rs b/lvgl-sys/build.rs index ec957003..305d9abf 100644 --- a/lvgl-sys/build.rs +++ b/lvgl-sys/build.rs @@ -28,6 +28,9 @@ fn main() { let vendor = project_dir.join("vendor"); let lvgl_src = vendor.join("lvgl").join("src"); + #[cfg(feature = "drivers")] + let incl_extra = env::var("LVGL_INCLUDE").unwrap_or("".to_string()); + #[cfg(feature = "drivers")] let drivers = vendor.join("lv_drivers"); @@ -106,6 +109,8 @@ fn main() { .include(&lv_config_dir); #[cfg(feature = "drivers")] cfg.include(&drivers); + #[cfg(feature = "drivers")] + cfg.includes(incl_extra.split(',')); cfg.compile("lvgl"); diff --git a/lvgl-sys/vendor/lv_drivers b/lvgl-sys/vendor/lv_drivers index 71830257..1413f5eb 160000 --- a/lvgl-sys/vendor/lv_drivers +++ b/lvgl-sys/vendor/lv_drivers @@ -1 +1 @@ -Subproject commit 71830257710f430b6d8d1c324f89f2eab52488f1 +Subproject commit 1413f5ebb6d21bc8ebb45448826dd7b4bbd3b7a3 From 1c981550e2d2f025e9d6e55049a4ab9e92c30923 Mon Sep 17 00:00:00 2001 From: Nia Espera Date: Sun, 12 Mar 2023 13:23:22 +0100 Subject: [PATCH 15/18] display drivers work :D --- .github/workflows/rust.yml | 2 ++ examples/include/lv_drv_conf.h | 6 +++--- lvgl-sys/build.rs | 19 ++++++++++++++++++- lvgl-sys/shims/lvgl_drv.h | 4 ++++ lvgl/src/drivers/lv_drv_display.rs | 24 ++++++++++++------------ 5 files changed, 39 insertions(+), 16 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 77d7f5db..15774185 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -9,6 +9,8 @@ on: env: CARGO_TERM_COLOR: always DEP_LV_CONFIG_PATH: /home/runner/work/lvgl-rs/lvgl-rs/examples/include + LVGL_INCLUDE: /usr/include,/usr/local/include + LVGL_LINK: SDL2 jobs: build: diff --git a/examples/include/lv_drv_conf.h b/examples/include/lv_drv_conf.h index 23f280d6..5c84efab 100644 --- a/examples/include/lv_drv_conf.h +++ b/examples/include/lv_drv_conf.h @@ -86,7 +86,7 @@ /* SDL based drivers for display, mouse, mousewheel and keyboard*/ #ifndef USE_SDL -# define USE_SDL 0 +# define USE_SDL 1 #endif /* Hardware accelerated SDL driver */ @@ -95,8 +95,8 @@ #endif #if USE_SDL || USE_SDL_GPU -# define SDL_HOR_RES 480 -# define SDL_VER_RES 320 +# define SDL_HOR_RES 240 +# define SDL_VER_RES 240 /* Scale window by this factor (useful when simulating small screens) */ # define SDL_ZOOM 1 diff --git a/lvgl-sys/build.rs b/lvgl-sys/build.rs index 305d9abf..23cca76d 100644 --- a/lvgl-sys/build.rs +++ b/lvgl-sys/build.rs @@ -11,7 +11,7 @@ static CONFIG_NAME: &str = "DEP_LV_CONFIG_PATH"; #[cfg(feature = "drivers")] #[derive(Debug)] struct IgnoreMacros(HashSet); - +#[cfg(feature = "drivers")] impl bindgen::callbacks::ParseCallbacks for IgnoreMacros { fn will_parse_macro(&self, name: &str) -> bindgen::callbacks::MacroParsingBehavior { if self.0.contains(name) { @@ -30,6 +30,8 @@ fn main() { #[cfg(feature = "drivers")] let incl_extra = env::var("LVGL_INCLUDE").unwrap_or("".to_string()); + #[cfg(feature = "drivers")] + let link_extra = env::var("LVGL_LINK").unwrap_or("".to_string()); #[cfg(feature = "drivers")] let drivers = vendor.join("lv_drivers"); @@ -95,6 +97,12 @@ fn main() { conf_path }; + #[cfg(feature = "drivers")] + { + println!("cargo:rerun-if-env-changed=LVGL_INCLUDE"); + println!("cargo:rerun-if-env-changed=LVGL_LINK"); + } + let mut cfg = Build::new(); add_c_files(&mut cfg, &lvgl_src); add_c_files(&mut cfg, &lv_config_dir); @@ -123,6 +131,9 @@ fn main() { "-fvisibility=default", ]; + //#[cfg(feature = "drivers")] + //incl_extra.split(',').for_each(|a| { cc_args.append(&mut vec!["-l"]); cc_args.append(&mut vec![a]) }); + // Set correct target triple for bindgen when cross-compiling let target = env::var("TARGET").expect("Cargo build scripts always have TARGET"); let host = env::var("HOST").expect("Cargo build scripts always have HOST"); @@ -188,6 +199,12 @@ fn main() { bindings .write_to_file(out_path.join("bindings.rs")) .expect("Can't write bindings!"); + + #[cfg(feature = "drivers")] + link_extra.split(',').for_each(|a| { + println!("cargo:rustc-link-lib={a}"); + //println!("cargo:rustc-link-search=") + }) } fn add_c_files(build: &mut cc::Build, path: impl AsRef) { diff --git a/lvgl-sys/shims/lvgl_drv.h b/lvgl-sys/shims/lvgl_drv.h index 3cf31c37..33a92e21 100644 --- a/lvgl-sys/shims/lvgl_drv.h +++ b/lvgl-sys/shims/lvgl_drv.h @@ -9,6 +9,10 @@ extern "C" { /* Displays */ +#if USE_SDL +#include "lv_drivers/sdl/sdl.h" +#endif + #if USE_MONITOR #include "lv_drivers/display/monitor.h" #endif diff --git a/lvgl/src/drivers/lv_drv_display.rs b/lvgl/src/drivers/lv_drv_display.rs index 1503beb3..5ae3393b 100644 --- a/lvgl/src/drivers/lv_drv_display.rs +++ b/lvgl/src/drivers/lv_drv_display.rs @@ -3,7 +3,7 @@ macro_rules! lv_drv_disp_fbdev { ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { unsafe { lvgl_sys::fbdev_init(); - lvgl::Display::register_raw( + $crate::Display::register_raw( $draw_buffer, $hor_res, $ver_res, @@ -27,7 +27,7 @@ macro_rules! lv_drv_disp_drm { ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { unsafe { lvgl_sys::drm_init(); - lvgl::Display::register_raw( + $crate::Display::register_raw( $draw_buffer, $hor_res, $ver_res, @@ -51,7 +51,7 @@ macro_rules! lv_drv_disp_gtk { ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { unsafe { lvgl_sys::gtkdrv_init(); - crate::Display::register_raw( + $crate::Display::register_raw( $draw_buffer, $hor_res, $ver_res, @@ -75,7 +75,7 @@ macro_rules! lv_drv_disp_sdl { ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { unsafe { lvgl_sys::sdl_init(); - lvgl::Display::register_raw( + $crate::Display::register_raw( $draw_buffer, $hor_res, $ver_res, @@ -102,7 +102,7 @@ macro_rules! lv_drv_disp_gc9a01 { 0 => (), c = panic!("GC9A01_init() returned error code {c}") }; - lvgl::Display::register_raw( + $crate::Display::register_raw( $draw_buffer, $hor_res, $ver_res, @@ -126,7 +126,7 @@ macro_rules! lv_drv_disp_ili9341 { ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { unsafe { lvgl_sys::ili9341_init(); - lvgl::Display::register_raw( + $crate::Display::register_raw( $draw_buffer, $hor_res, $ver_res, @@ -150,7 +150,7 @@ macro_rules! lv_drv_disp_r61581 { ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { unsafe { lvgl_sys::r61581_init(); - lvgl::Display::register_raw( + $crate::Display::register_raw( $draw_buffer, $hor_res, $ver_res, @@ -174,7 +174,7 @@ macro_rules! lv_drv_disp_sharp_mip { ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { unsafe { lvgl_sys::sharp_mip_init(); - lvgl::Display::register_raw( + $crate::Display::register_raw( $draw_buffer, $hor_res, $ver_res, @@ -198,7 +198,7 @@ macro_rules! lv_drv_disp_ssd1963 { ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { unsafe { lvgl_sys::ssd1963_init(); - lvgl::Display::register_raw( + $crate::Display::register_raw( $draw_buffer, $hor_res, $ver_res, @@ -222,7 +222,7 @@ macro_rules! lv_drv_disp_st7565 { ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { unsafe { lvgl_sys::st7565_init(); - lvgl::Display::register_raw( + $crate::Display::register_raw( $draw_buffer, $hor_res, $ver_res, @@ -246,7 +246,7 @@ macro_rules! lv_drv_disp_uc1610 { ($draw_buffer:ident, $hor_res:ident, $ver_res:ident) => { unsafe { lvgl_sys::uc1610_init(); - lvgl::Display::register_raw( + $crate::Display::register_raw( $draw_buffer, $hor_res, $ver_res, @@ -278,6 +278,6 @@ mod tests { const VER_RES: u32 = 240; tests::initialize_test(); let buffer = DrawBuffer::<{ (HOR_RES * VER_RES) as usize }>::new(); - //let _disp = lv_drv_disp_gtk!(buffer, HOR_RES, VER_RES); + let _disp = lv_drv_disp_sdl!(buffer, HOR_RES, VER_RES); } } \ No newline at end of file From 88cf2301efb91807f38fb6be39dbae61591543c1 Mon Sep 17 00:00:00 2001 From: Nia Espera Date: Sat, 18 Mar 2023 00:39:12 +0100 Subject: [PATCH 16/18] add input device tests --- lvgl/src/drivers/lv_drv_display.rs | 2 +- lvgl/src/drivers/lv_drv_input.rs | 32 ++++++++++++++++++++++++------ 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/lvgl/src/drivers/lv_drv_display.rs b/lvgl/src/drivers/lv_drv_display.rs index 5ae3393b..5157dcd7 100644 --- a/lvgl/src/drivers/lv_drv_display.rs +++ b/lvgl/src/drivers/lv_drv_display.rs @@ -278,6 +278,6 @@ mod tests { const VER_RES: u32 = 240; tests::initialize_test(); let buffer = DrawBuffer::<{ (HOR_RES * VER_RES) as usize }>::new(); - let _disp = lv_drv_disp_sdl!(buffer, HOR_RES, VER_RES); + let _disp = lv_drv_disp_sdl!(buffer, HOR_RES, VER_RES).unwrap(); } } \ No newline at end of file diff --git a/lvgl/src/drivers/lv_drv_input.rs b/lvgl/src/drivers/lv_drv_input.rs index 2113bf39..382711f9 100644 --- a/lvgl/src/drivers/lv_drv_input.rs +++ b/lvgl/src/drivers/lv_drv_input.rs @@ -3,7 +3,7 @@ macro_rules! lv_drv_input_pointer_evdev { () => { unsafe { lvgl_sys::evdev_init(); - lvgl::input_device::pointer::PointerPointer::new_raw( + $crate::input_device::pointer::PointerPointer::new_raw( Some(lvgl_sys::evdev_read), None, ) @@ -15,7 +15,7 @@ macro_rules! lv_drv_input_pointer_evdev { macro_rules! lv_drv_input_pointer_gtk { () => { unsafe { - lvgl::input_device::pointer::Pointer::new_raw( + $crate::input_device::pointer::Pointer::new_raw( Some(lvgl_sys::gtkdrv_mouse_read_cb), None, ) @@ -27,7 +27,7 @@ macro_rules! lv_drv_input_pointer_gtk { macro_rules! lv_drv_input_pointer_sdl { () => { unsafe { - lvgl::input_device::pointer::Pointer::new_raw( + $crate::input_device::pointer::Pointer::new_raw( Some(lvgl_sys::sdl_mouse_read), None, ) @@ -40,7 +40,7 @@ macro_rules! lv_drv_input_ad_touch { () => { unsafe { lvgl_sys::ad_touch_init(); - lvgl::input_device::pointer::Pointer::new_raw( + $crate::input_device::pointer::Pointer::new_raw( Some(lvgl_sys::ad_touch_read), None, ) @@ -53,7 +53,7 @@ macro_rules! lv_drv_input_ft5406ee8 { () => { unsafe { lvgl_sys::ft5406ee8_init(); - lvgl::input_device::pointer::Pointer::new_raw( + $crate::input_device::pointer::Pointer::new_raw( Some(lvgl_sys::ft5406ee8_read), None, ) @@ -66,10 +66,30 @@ macro_rules! lv_drv_input_xpt2046 { () => { unsafe { lvgl_sys::xpt2046_init(); - lvgl::input_device::pointer::Pointer::new_raw( + $crate::input_device::pointer::Pointer::new_raw( Some(lvgl_sys::xpt2046_read), None, ) } } } + +#[cfg(test)] +mod tests { + #[macro_use] + use super::*; + use crate::*; + use crate::tests; + use crate::DrawBuffer; + use crate::input_device::generic::InputDriver; + + #[test] + fn gtk_test() { + const HOR_RES: u32 = 240; + const VER_RES: u32 = 240; + tests::initialize_test(); + let buffer = DrawBuffer::<{ (HOR_RES * VER_RES) as usize }>::new(); + let _disp = lv_drv_disp_sdl!(buffer, HOR_RES, VER_RES).unwrap(); + let _input = lv_drv_input_pointer_sdl!(); + } +} \ No newline at end of file From 6d3bf4e55da1155335795c79dea086ab683f2cd1 Mon Sep 17 00:00:00 2001 From: Nia Espera Date: Sat, 18 Mar 2023 00:51:25 +0100 Subject: [PATCH 17/18] sdl example --- examples/sdl.rs | 61 ++++++++++++++++++++++++++++++ lvgl/Cargo.toml | 5 +++ lvgl/src/drivers/lv_drv_display.rs | 2 - lvgl/src/drivers/lv_drv_input.rs | 2 - 4 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 examples/sdl.rs diff --git a/examples/sdl.rs b/examples/sdl.rs new file mode 100644 index 00000000..f506bd06 --- /dev/null +++ b/examples/sdl.rs @@ -0,0 +1,61 @@ +// Still WIP +#![allow(unused_labels)] +#![allow(unused_variables)] +#![allow(unreachable_code)] + +use lvgl::LvResult; +use lvgl::lv_drv_disp_sdl; +use lvgl::lv_drv_input_pointer_sdl; +use lvgl::input_device::generic::InputDriver; +use lvgl::style::Style; +use lvgl::widgets::{Btn, Label}; +use lvgl::{Align, Color, DrawBuffer, Part, Widget}; +use std::time::Duration; +use cstr_core::CString; + +fn main() -> LvResult<()> { + const HOR_RES: u32 = 240; + const VER_RES: u32 = 240; + + lvgl::init(); + let buffer = DrawBuffer::<{ (HOR_RES * VER_RES) as usize }>::new(); + let display = lv_drv_disp_sdl!(buffer, HOR_RES, VER_RES)?; + let input = lv_drv_input_pointer_sdl!(); + + // Create screen and widgets + let mut screen = display.get_scr_act()?; + + let mut screen_style = Style::default(); + screen_style.set_bg_color(Color::from_rgb((0, 0, 0))); + screen.add_style(Part::Main, &mut screen_style)?; + // Create the button + let mut button = Btn::create(&mut screen)?; + button.set_align(Align::LeftMid, 30, 0)?; + button.set_size(180, 80)?; + let mut btn_lbl = Label::create(&mut button)?; + btn_lbl.set_text(CString::new("Click me!").unwrap().as_c_str())?; + + let mut btn_state = false; + button.on_event(|_btn, event| { + println!("Button received event: {:?}", event); + if let lvgl::Event::Clicked = event { + if btn_state { + let nt = CString::new("Click me!").unwrap(); + btn_lbl.set_text(nt.as_c_str()).unwrap(); + } else { + let nt = CString::new("Clicked!").unwrap(); + btn_lbl.set_text(nt.as_c_str()).unwrap(); + } + btn_state = !btn_state; + //btn.toggle().unwrap(); + } + })?; + + 'running: loop { + lvgl::task_handler(); + + lvgl::tick_inc(Duration::from_millis(15)); + } + + Ok(()) +} \ No newline at end of file diff --git a/lvgl/Cargo.toml b/lvgl/Cargo.toml index 8e34d8db..59d04e47 100644 --- a/lvgl/Cargo.toml +++ b/lvgl/Cargo.toml @@ -65,3 +65,8 @@ required-features = ["alloc", "embedded_graphics"] name = "arc" path = "../examples/arc.rs" required-features = ["alloc", "embedded_graphics"] + +[[example]] +name = "sdl" +path = "../examples/sdl.rs" +required-features = ["alloc", "drivers"] diff --git a/lvgl/src/drivers/lv_drv_display.rs b/lvgl/src/drivers/lv_drv_display.rs index 5157dcd7..0c0292f7 100644 --- a/lvgl/src/drivers/lv_drv_display.rs +++ b/lvgl/src/drivers/lv_drv_display.rs @@ -267,8 +267,6 @@ macro_rules! lv_drv_disp_uc1610 { #[cfg(test)] mod tests { - #[macro_use] - use super::*; use crate::tests; use crate::DrawBuffer; diff --git a/lvgl/src/drivers/lv_drv_input.rs b/lvgl/src/drivers/lv_drv_input.rs index 382711f9..507bda49 100644 --- a/lvgl/src/drivers/lv_drv_input.rs +++ b/lvgl/src/drivers/lv_drv_input.rs @@ -76,8 +76,6 @@ macro_rules! lv_drv_input_xpt2046 { #[cfg(test)] mod tests { - #[macro_use] - use super::*; use crate::*; use crate::tests; use crate::DrawBuffer; From f6491d34cfd983d1c040ec908e3a566961ff8daf Mon Sep 17 00:00:00 2001 From: Nia Espera Date: Mon, 20 Mar 2023 14:56:13 +0100 Subject: [PATCH 18/18] drivers work! like, properly! woo --- examples/app.rs | 2 -- examples/arc.rs | 6 +++++- examples/bar.rs | 7 +++++-- examples/button_click.rs | 6 +++++- examples/demo.rs | 6 ++++-- examples/include/lv_conf.h | 4 ++-- examples/sdl.rs | 17 +++++++++++------ 7 files changed, 32 insertions(+), 16 deletions(-) diff --git a/examples/app.rs b/examples/app.rs index 3bac0fdf..31e2512a 100644 --- a/examples/app.rs +++ b/examples/app.rs @@ -34,6 +34,4 @@ fn main() { .unwrap(); }) .unwrap(); - - let label: Label = "Nice!".into(); } diff --git a/examples/arc.rs b/examples/arc.rs index 01937059..96561e23 100644 --- a/examples/arc.rs +++ b/examples/arc.rs @@ -10,6 +10,8 @@ use lvgl::widgets::{Arc, Label}; use lvgl::{Align, Color, Display, DrawBuffer, LvError, Part, Widget}; use lvgl_sys; use std::time::Duration; +use std::time::Instant; +use std::thread::sleep; fn mem_info() -> lvgl_sys::lv_mem_monitor_t { let mut info = lvgl_sys::lv_mem_monitor_t { @@ -74,6 +76,7 @@ fn main() -> Result<(), LvError> { let mut i = 0; 'running: loop { + let start = Instant::now(); if i > 270 { forward = if forward { false } else { true }; i = 1; @@ -92,7 +95,8 @@ fn main() -> Result<(), LvError> { _ => {} } } - lvgl::tick_inc(Duration::from_millis(15)); + sleep(Duration::from_millis(15)); + lvgl::tick_inc(Instant::now().duration_since(start)); } println!("meminfo end: {:?}", mem_info()); diff --git a/examples/bar.rs b/examples/bar.rs index b8e120e8..4d3bb2ae 100644 --- a/examples/bar.rs +++ b/examples/bar.rs @@ -10,6 +10,8 @@ use lvgl::widgets::{Bar, Label}; use lvgl::{Align, Animation, Color, Display, DrawBuffer, Event, LvError, Part, Widget}; use std::cell::RefCell; use std::time::Duration; +use std::time::Instant; +use std::thread::sleep; fn main() -> Result<(), LvError> { const HOR_RES: u32 = 240; @@ -64,6 +66,7 @@ fn main() -> Result<(), LvError> { let mut i = 0; 'running: loop { + let start = Instant::now(); if i > 100 { i = 0; lvgl::event_send(&mut bar, Event::Clicked)?; @@ -80,8 +83,8 @@ fn main() -> Result<(), LvError> { _ => {} } } - - lvgl::tick_inc(Duration::from_millis(10)); + sleep(Duration::from_millis(15)); + lvgl::tick_inc(Instant::now().duration_since(start)); } Ok(()) diff --git a/examples/button_click.rs b/examples/button_click.rs index ea4926f1..37539c6a 100644 --- a/examples/button_click.rs +++ b/examples/button_click.rs @@ -14,6 +14,8 @@ use lvgl::style::Style; use lvgl::widgets::{Btn, Label}; use lvgl::{Align, Color, Display, DrawBuffer, LvError, Part, Widget}; use std::time::Duration; +use std::time::Instant; +use std::thread::sleep; #[allow(unused_assignments)] fn main() -> Result<(), LvError> { @@ -71,6 +73,7 @@ fn main() -> Result<(), LvError> { let mut latest_touch_point = Point::new(0, 0); 'running: loop { + let start = Instant::now(); lvgl::task_handler(); window.update(&sim_display); @@ -97,7 +100,8 @@ fn main() -> Result<(), LvError> { _ => {} } } - lvgl::tick_inc(Duration::from_millis(15)); + sleep(Duration::from_millis(15)); + lvgl::tick_inc(Instant::now().duration_since(start)); } Ok(()) diff --git a/examples/demo.rs b/examples/demo.rs index dcb602cf..a362db52 100644 --- a/examples/demo.rs +++ b/examples/demo.rs @@ -11,6 +11,7 @@ use lvgl::{Align, Color, Display, DrawBuffer, LvError, Part, TextAlign, Widget}; use lvgl_sys; use std::thread::sleep; use std::time::Duration; +use std::time::Instant; fn main() -> Result<(), LvError> { const HOR_RES: u32 = 240; @@ -53,7 +54,7 @@ fn main() -> Result<(), LvError> { style_time.set_text_align(TextAlign::Center); // Need to set font too time.add_style(Part::Main, &mut style_time)?; - time.set_align(Align::Center, 0, 0)?; + time.set_align(Align::Center, 0, 100)?; time.set_width(240)?; time.set_height(240)?; @@ -71,6 +72,7 @@ fn main() -> Result<(), LvError> { let mut i = 0; 'running: loop { + let start = Instant::now(); if i > 59 { i = 0; } @@ -89,7 +91,7 @@ fn main() -> Result<(), LvError> { } //println!("During run: {:?}", mem_info()); sleep(Duration::from_secs(1)); - lvgl::tick_inc(Duration::from_secs(1)); + lvgl::tick_inc(Instant::now().duration_since(start)); } //println!("Final part of demo app: {:?}", mem_info()); diff --git a/examples/include/lv_conf.h b/examples/include/lv_conf.h index 06455cc1..d7dd9ef0 100644 --- a/examples/include/lv_conf.h +++ b/examples/include/lv_conf.h @@ -222,7 +222,7 @@ *-----------*/ /*Enable the log module*/ -#define LV_USE_LOG 0 +#define LV_USE_LOG 1 #if LV_USE_LOG /*How important log should be added: @@ -232,7 +232,7 @@ *LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail *LV_LOG_LEVEL_USER Only logs added by the user *LV_LOG_LEVEL_NONE Do not log anything*/ - #define LV_LOG_LEVEL LV_LOG_LEVEL_WARN + #define LV_LOG_LEVEL LV_LOG_LEVEL_INFO /*1: Print the log with 'printf'; *0: User need to register a callback with `lv_log_register_print_cb()`*/ diff --git a/examples/sdl.rs b/examples/sdl.rs index f506bd06..7fe20685 100644 --- a/examples/sdl.rs +++ b/examples/sdl.rs @@ -1,7 +1,7 @@ // Still WIP -#![allow(unused_labels)] -#![allow(unused_variables)] -#![allow(unreachable_code)] +//#![allow(unused_labels)] +//#![allow(unused_variables)] +//#![allow(unreachable_code)] use lvgl::LvResult; use lvgl::lv_drv_disp_sdl; @@ -11,6 +11,8 @@ use lvgl::style::Style; use lvgl::widgets::{Btn, Label}; use lvgl::{Align, Color, DrawBuffer, Part, Widget}; use std::time::Duration; +use std::time::Instant; +use std::thread::sleep; use cstr_core::CString; fn main() -> LvResult<()> { @@ -20,7 +22,8 @@ fn main() -> LvResult<()> { lvgl::init(); let buffer = DrawBuffer::<{ (HOR_RES * VER_RES) as usize }>::new(); let display = lv_drv_disp_sdl!(buffer, HOR_RES, VER_RES)?; - let input = lv_drv_input_pointer_sdl!(); + let mut input = lv_drv_input_pointer_sdl!(); + lvgl::indev_drv_register(&mut input); // Create screen and widgets let mut screen = display.get_scr_act()?; @@ -52,9 +55,11 @@ fn main() -> LvResult<()> { })?; 'running: loop { + let start = Instant::now(); lvgl::task_handler(); - - lvgl::tick_inc(Duration::from_millis(15)); + //println!("Loop"); + sleep(Duration::from_millis(15)); + lvgl::tick_inc(Instant::now().duration_since(start)); } Ok(())