Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
lv_bevy_ecs
Safe Rust bindings to the LVGL library using bevy_ecs.
What is an ECS?
ECS stands for Entity Component System. You can think of it as a database with rows (entities), columns (components) and jobs (systems).
You have to move LVGL objects into this database, so that they don't go out of scope and get deallocated. Bevy's Observers will mirror these database operations to LVGL's world.
Usage
It is highly recommended to read Chapter 14 of the Unofficial Bevy Cheat Book before using this library.
-
Create a project with
cargo neworesp-generate, thencargo add lv_bevy_ecs -
This package depends on lightvgl-sys to generate the raw unsafe bindings. It needs an environment variable called
DEP_LV_CONFIG_PATHthat specifies the path to the folder containinglv_conf.hfile.It is recommended to put it into
.cargo/config.toml
[]
= { = true, = "." }
- You have to obtain a World instance with
LvglWorld::new();. This is a global variable, it can be stored in lazy_static! or passed around in an Arc<Mutex<>> if needed elsewhere than in main().
lazy_static!
- Last thing is a Schedule instance with
LvglSchedule::new(). Then call it in every loop cycle
let schedule = new;
// ...
loop
Check the respective module documentations and the examples for further usage.
Running the demo
Building for embedded
This package has been tested with ESP32 only.
You need three more env variables in config.toml and the PATH applied from ~/export-esp.sh
LIBCLANG_PATH="..."
CROSS_COMPILE="xtensa-esp32-elf"
BINDGEN_EXTRA_CLANG_ARGS="--sysroot ..."
LIBCLANG_PATH can be found in ~/export-esp.sh
BINDGEN_EXTRA_CLANG_ARGS sysroot can be found with xtensa-esp32-elf-ld --print-sysroot
LVGL Global Allocator
A global allocator for Rust leveraging the LVGL memory allocator is provided, but not enabled by default. Can be enabled by the feature lvgl-alloc. This will make all dynamic memory to be allocated by LVGL internal memory manager.
Partitions
It can happen that the project does not fit in the default main partition. To fix that you need to generate a partitions.csv with
and increase the factory partition size.
Then add this to espflash.toml:
[]
= "partitions.csv"
Upload speed
To increase upload speed set baudrate = 460800 in espflash.toml
Features
- Displays
- Widgets
- Events
- Styles
- Input devices
- Animations
- Timers
- Async calls
- Subjects
- Auto-generated enums
- Copy C docs to rustdoc
- #![no_std] compatibility
- File system
- Custom fonts
- Snapshots
- Some widget functions
- Layouts
- XML UI
Compatibility table
| lv_bevy_ecs | bevy_ecs | lightvgl-sys | LVGL |
|---|---|---|---|
| 0.2 | 0.16.0 | 9.2.0 | 9.2.2 |
Contributing
Feel free to open issues for features you find important and missing. I am not completely satisfied with the API, so open to API improvement ideas as well.
Troubleshooting
#[ctor]/#[dtor] is not supported on the current target
You are probably on RISC-V. Please help your architecture get upstreamed into rust-ctor.
Until then set default-features = false and manually call lv_init(); in the main function.
Thanks
This project heavily builds upon the work in the the original lv_binding_rust repo.