Compare commits
244 Commits
master
...
release/v8
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d30df363ff | ||
|
|
b277c49361 | ||
|
|
acc30061f7 | ||
|
|
b55aad64f0 | ||
|
|
614bf9256e | ||
|
|
7a3322a487 | ||
|
|
03e01bdd3e | ||
|
|
7b85f2f623 | ||
|
|
a51128b0b9 | ||
|
|
6e65b960f4 | ||
|
|
c86cea34dd | ||
|
|
897ba9aa19 | ||
|
|
1ff3c20fd7 | ||
|
|
a1f1e9397b | ||
|
|
e84feeed3c | ||
|
|
6cee9ca5a8 | ||
|
|
3aac8cc848 | ||
|
|
b09c793967 | ||
|
|
d5a2ad1cd8 | ||
|
|
2409c8dfc6 | ||
|
|
c512eccb7b | ||
|
|
47633e3046 | ||
|
|
8b6ef9cc31 | ||
|
|
4495f42863 | ||
|
|
b4bdc9e482 | ||
|
|
20ac90dbc2 | ||
|
|
32966352ad | ||
|
|
31126be578 | ||
|
|
e91f5de63f | ||
|
|
39687e808f | ||
|
|
8588762572 | ||
|
|
949c2fdda0 | ||
|
|
099f0cd805 | ||
|
|
4e357b8f27 | ||
|
|
be08c2b4cf | ||
|
|
9d0942a117 | ||
|
|
f2c103260f | ||
|
|
e277114631 | ||
|
|
68a7beb5d8 | ||
|
|
6f75b41ade | ||
|
|
b1284c3107 | ||
|
|
6c66a491b8 | ||
|
|
b7a20df38f | ||
|
|
dba431a3d0 | ||
|
|
9ba2992582 | ||
|
|
74d0a816a4 | ||
|
|
8194d83226 | ||
|
|
1840decb41 | ||
|
|
ef76206c75 | ||
|
|
4fdc4c20b7 | ||
|
|
85776aeec3 | ||
|
|
d20bd1ca39 | ||
|
|
c16bfdc227 | ||
|
|
3b6f98a938 | ||
|
|
6c86969ee0 | ||
|
|
fdfff5c0b8 | ||
|
|
2791d5739f | ||
|
|
68d380eb90 | ||
|
|
20b6199ba9 | ||
|
|
7efcea6d08 | ||
|
|
7f894cf755 | ||
|
|
fa40b05191 | ||
|
|
17c580fad6 | ||
|
|
454e45429c | ||
|
|
9fbac7570b | ||
|
|
1e381f11bf | ||
|
|
d22cda3cdb | ||
|
|
869cc63003 | ||
|
|
73fa50afa0 | ||
|
|
7a8fcbfd34 | ||
|
|
7568df77d1 | ||
|
|
9a673e447d | ||
|
|
3b2d75be02 | ||
|
|
87ff746e21 | ||
|
|
14e21d27fb | ||
|
|
ff4f3f9769 | ||
|
|
a7a9d278c4 | ||
|
|
06e229cc76 | ||
|
|
9e388055ec | ||
|
|
eb87767cc6 | ||
|
|
01cd1fed9d | ||
|
|
28094404ad | ||
|
|
e2b19eb4ac | ||
|
|
bff1f22970 | ||
|
|
9787d47d0b | ||
|
|
6548ea0f29 | ||
|
|
1375ea85a1 | ||
|
|
a296456591 | ||
|
|
336f24127a | ||
|
|
1c5df6c665 | ||
|
|
7d314aab62 | ||
|
|
fd21ed0eb8 | ||
|
|
5fc488a088 | ||
|
|
f174589240 | ||
|
|
bcebafe4fb | ||
|
|
8063fac793 | ||
|
|
9ec3b8706b | ||
|
|
bdf5bfb88c | ||
|
|
4f102d7b6b | ||
|
|
810852b41b | ||
|
|
21e95bc1b3 | ||
|
|
dbcf56288e | ||
|
|
eee2dd1864 | ||
|
|
141f4b8ab3 | ||
|
|
f9ffcc9d8e | ||
|
|
385d999a4a | ||
|
|
29ed7c5717 | ||
|
|
65f1c9305e | ||
|
|
b1bbb95ceb | ||
|
|
223dc1cf9d | ||
|
|
416b26771b | ||
|
|
645006e351 | ||
|
|
375b3b5d3e | ||
|
|
1c5d4b02d7 | ||
|
|
e6d7be00bf | ||
|
|
15433d69b9 | ||
|
|
91038a99e8 | ||
|
|
9491c3ff6d | ||
|
|
3de61c76af | ||
|
|
09cc0de573 | ||
|
|
227ac02341 | ||
|
|
8b83fe7ea5 | ||
|
|
edd5ad28ad | ||
|
|
07bce7466d | ||
|
|
1713cd3fd8 | ||
|
|
cb602ea778 | ||
|
|
caf29ef0c5 | ||
|
|
a3199514ab | ||
|
|
78cbdfc151 | ||
|
|
75e6ef4e1d | ||
|
|
2376c57860 | ||
|
|
e3659c46b1 | ||
|
|
df96b57f4e | ||
|
|
67b3011f83 | ||
|
|
d87737612a | ||
|
|
6a89bd2d74 | ||
|
|
6843c191b7 | ||
|
|
1caafc55dd | ||
|
|
5ba90a5c41 | ||
|
|
630da9c6ca | ||
|
|
ee95e7dc25 | ||
|
|
45b13c378f | ||
|
|
2b56e04205 | ||
|
|
177900b033 | ||
|
|
203e7fc97d | ||
|
|
7345e62355 | ||
|
|
48d7878bac | ||
|
|
a0795b49e8 | ||
|
|
a150b15e45 | ||
|
|
a95714ba7c | ||
|
|
8536152d81 | ||
|
|
6314441839 | ||
|
|
88c51b22ad | ||
|
|
6b0092c0d9 | ||
|
|
aa313806d0 | ||
|
|
5e0e1c8c4e | ||
|
|
d0e19eb2d3 | ||
|
|
fd20fabfda | ||
|
|
399069b4a2 | ||
|
|
501230e0fc | ||
|
|
adcf166382 | ||
|
|
2f294aa76c | ||
|
|
9a870b34a9 | ||
|
|
0b7777f27a | ||
|
|
e8d8f399e0 | ||
|
|
0df09db23e | ||
|
|
e2386fd46d | ||
|
|
2944277f07 | ||
|
|
6af01798d8 | ||
|
|
77670fb1a5 | ||
|
|
f29514aa5c | ||
|
|
e7e8cf846d | ||
|
|
8b1270347f | ||
|
|
e6cd7063b6 | ||
|
|
34c545ef19 | ||
|
|
361ee79611 | ||
|
|
39f424767f | ||
|
|
1853cc5143 | ||
|
|
9faca8a8d4 | ||
|
|
8ea6f03fc3 | ||
|
|
c6c1b0b3d3 | ||
|
|
e529230f4b | ||
|
|
dbb15bb3ea | ||
|
|
47c8f8f982 | ||
|
|
2c0162b457 | ||
|
|
dec580b9f1 | ||
|
|
ad56dfaf70 | ||
|
|
c8e584f879 | ||
|
|
d2d886aae5 | ||
|
|
1e3ca25fed | ||
|
|
84cf05d8b2 | ||
|
|
2c17b28ac4 | ||
|
|
1ed026ca73 | ||
|
|
ae3825871e | ||
|
|
ae300acb2f | ||
|
|
41fa416134 | ||
|
|
68f6190f8e | ||
|
|
1173dcba96 | ||
|
|
716e5e2c8b | ||
|
|
bb2c2ac34a | ||
|
|
c4c400716e | ||
|
|
6825d4bd1d | ||
|
|
39d03a80f4 | ||
|
|
340a1cb60b | ||
|
|
e06f03db72 | ||
|
|
bd11ad8542 | ||
|
|
e050f5ca15 | ||
|
|
903e94b716 | ||
|
|
0732400e7b | ||
|
|
483b2a4322 | ||
|
|
5545ffc925 | ||
|
|
c8bee40410 | ||
|
|
755d363ecc | ||
|
|
dfd14fa778 | ||
|
|
1ab9aa5312 | ||
|
|
4d69cd865c | ||
|
|
832bef4346 | ||
|
|
d5b2a9b256 | ||
|
|
7640950216 | ||
|
|
8b605cc482 | ||
|
|
ece3495004 | ||
|
|
f6655c2aaf | ||
|
|
cba2aa95c8 | ||
|
|
660464c973 | ||
|
|
5156ee058d | ||
|
|
a0515ba30d | ||
|
|
1a46030918 | ||
|
|
f58dcd94fc | ||
|
|
d59bba12db | ||
|
|
5022476edc | ||
|
|
b884abae26 | ||
|
|
aa45d59852 | ||
|
|
55e95ed351 | ||
|
|
be485d7605 | ||
|
|
9024b72b48 | ||
|
|
9b998aa47d | ||
|
|
71913d300d | ||
|
|
284834e799 | ||
|
|
8544cc3806 | ||
|
|
62662f68e9 | ||
|
|
a283273bd2 | ||
|
|
9750c97aff | ||
|
|
2967172bee | ||
|
|
9e1b6166b0 |
14
.github/pull_request_template.md
vendored
@@ -1,8 +1,10 @@
|
||||
### Description of the feature or fix
|
||||
|
||||
A clear and concise description of what the bug or new feature is.
|
||||
|
||||
### Checkpoints
|
||||
- [ ] Follow the [styling guide](https://github.com/lvgl/lvgl/blob/master/docs/CODING_STYLE.md)
|
||||
- [ ] Run `code-format.py` from the `scripts` folder. [astyle](http://astyle.sourceforge.net/install.html) needs to be installed.
|
||||
- [ ] Update the documentation
|
||||
- Update the [Documentation](https://github.com/lvgl/lvgl/tree/master/docs) if needed.
|
||||
- Add [Examples](https://github.com/lvgl/lvgl/tree/master/examples) if relevant.
|
||||
- Add [Tests](https://github.com/lvgl/lvgl/blob/master/tests/README.md) if applicable.
|
||||
- If you added new options to `lv_conf_template.h` run [lv_conf_internal_gen.py](https://github.com/lvgl/lvgl/blob/master/scripts/lv_conf_internal_gen.py) and update [Kconfig](https://github.com/lvgl/lvgl/blob/master/Kconfig).
|
||||
- Run `scripts/code-format.py` (`astyle v3.4.12` needs to installed by running `cd scripts; ./install_astyle.sh`) and follow the [Code Conventions](https://docs.lvgl.io/master/CODING_STYLE.html).
|
||||
- Mark the Pull request as [Draft](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/changing-the-stage-of-a-pull-request) while you are working on the first version, and mark is as _Ready_ when it's ready for review.
|
||||
- When changes were requested, [re-request review](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/requesting-a-pull-request-review) to notify the maintainers.
|
||||
- Help us to review this Pull Request! Anyone can [approve or request changes](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/approving-a-pull-request-with-required-reviews).
|
||||
|
||||
4
.github/workflows/build_micropython.yml
vendored
@@ -8,7 +8,7 @@ jobs:
|
||||
build:
|
||||
if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }}
|
||||
name: Build ${{ matrix.port }} port
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-20.04
|
||||
continue-on-error: true
|
||||
strategy:
|
||||
matrix:
|
||||
@@ -23,7 +23,7 @@ jobs:
|
||||
- name: Clone lv_micropython
|
||||
run: |
|
||||
git clone https://github.com/lvgl/lv_micropython.git .
|
||||
git checkout master
|
||||
git checkout release/v8
|
||||
- name: Initialize lv_bindings submodule
|
||||
run: git submodule update --init --recursive lib/lv_bindings
|
||||
- name: Update ${{ matrix.port }} port submodules
|
||||
|
||||
13
.github/workflows/ccpp.yml
vendored
@@ -36,6 +36,11 @@ jobs:
|
||||
- uses: ammaraskar/gcc-problem-matcher@master
|
||||
- name: Install prerequisites
|
||||
run: scripts/install-prerequisites.sh
|
||||
- name: Fix kernel mmap rnd bits
|
||||
# Asan in llvm 14 provided in ubuntu 22.04 is incompatible with
|
||||
# high-entropy ASLR in much newer kernels that GitHub runners are
|
||||
# using leading to random crashes: https://reviews.llvm.org/D148280
|
||||
run: sudo sysctl vm.mmap_rnd_bits=28
|
||||
- name: Run tests
|
||||
run: python tests/main.py --report test
|
||||
- name: Upload coverage to Codecov
|
||||
@@ -93,4 +98,12 @@ jobs:
|
||||
echo 'export PATH="/usr/lib/ccache:$PATH"' | tee -a ~/.bashrc
|
||||
|
||||
run: |
|
||||
if [[ "${{ matrix.distro }}" == "ubuntu22.04" ]]; then
|
||||
# ASan in llvm 14 provided in ubuntu-22.04 is incompatible with
|
||||
# high-entropy ASLR configured in much newer kernels that GitHub
|
||||
# runners are using leading to random crashes:
|
||||
# https://github.com/actions/runner-images/issues/9491
|
||||
# can remove this once the issue is fixed.
|
||||
sysctl -w vm.mmap_rnd_bits=28
|
||||
fi
|
||||
env PATH="/usr/lib/ccache:$PATH" ASAN_OPTIONS=detect_leaks=0 python3 tests/main.py test
|
||||
|
||||
14
.github/workflows/check_style.yml
vendored
@@ -9,15 +9,21 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
fetch-depth: 0
|
||||
- name: Checkout astyle
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: lvgl/astyle
|
||||
path: astyle
|
||||
- name: Install astyle
|
||||
run: |
|
||||
sudo add-apt-repository -y "deb http://archive.ubuntu.com/ubuntu `lsb_release -sc` main universe restricted multiverse"
|
||||
sudo apt-get update -y -qq
|
||||
sudo apt-get install astyle
|
||||
cd astyle/build/gcc/
|
||||
make
|
||||
sudo make install
|
||||
astyle --version
|
||||
- name: Format code
|
||||
run: python code-format.py
|
||||
working-directory: scripts
|
||||
|
||||
46
.github/workflows/esp_upload_component.yml
vendored
@@ -1,23 +1,23 @@
|
||||
name: Push LVGL release to Espressif Component Service
|
||||
|
||||
# If the commit is tagged, it will be uploaded. Other scenario silently fail.
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
|
||||
jobs:
|
||||
upload_components:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@master
|
||||
with:
|
||||
submodules: "recursive"
|
||||
|
||||
- name: Upload component to component registry
|
||||
uses: espressif/github-actions/upload_components@master
|
||||
with:
|
||||
name: "lvgl"
|
||||
version: "git"
|
||||
namespace: "lvgl"
|
||||
api_token: ${{ secrets.ESP_IDF_COMPONENT_API_TOKEN }}
|
||||
name: Push LVGL release to Espressif Component Service
|
||||
|
||||
# If the commit is tagged, it will be uploaded. Other scenario silently fail.
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- v*
|
||||
|
||||
jobs:
|
||||
upload_components:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
submodules: "recursive"
|
||||
|
||||
- name: Upload component to component registry
|
||||
uses: espressif/upload-components-ci-action@v1
|
||||
with:
|
||||
name: "lvgl"
|
||||
version: ${{ github.ref_name }}
|
||||
namespace: "lvgl"
|
||||
api_token: ${{ secrets.ESP_IDF_COMPONENT_API_TOKEN }}
|
||||
|
||||
37
Kconfig
@@ -1,4 +1,4 @@
|
||||
# Kconfig file for LVGL v8.0
|
||||
# Kconfig file for LVGL v8.4
|
||||
|
||||
menu "LVGL configuration"
|
||||
|
||||
@@ -42,11 +42,9 @@ menu "LVGL configuration"
|
||||
|
||||
config LV_COLOR_SCREEN_TRANSP
|
||||
bool "Enable more complex drawing routines to manage screens transparency."
|
||||
depends on LV_COLOR_DEPTH_32
|
||||
help
|
||||
Can be used if the UI is above another layer, e.g. an OSD menu or video player.
|
||||
Requires `LV_COLOR_DEPTH = 32` colors and the screen's `bg_opa` should be set to
|
||||
non LV_OPA_COVER value
|
||||
The screen's `bg_opa` should be set to non LV_OPA_COVER value
|
||||
|
||||
config LV_COLOR_MIX_ROUND_OFS
|
||||
int "Adjust color mix functions rounding"
|
||||
@@ -230,6 +228,16 @@ menu "LVGL configuration"
|
||||
Must be defined to include path of CMSIS header of target processor
|
||||
e.g. "stm32f769xx.h" or "stm32f429xx.h"
|
||||
|
||||
config LV_USE_GPU_RA6M3_G2D
|
||||
bool "Enable RA6M3 G2D GPU."
|
||||
config LV_GPU_RA6M3_G2D_INCLUDE
|
||||
string "include path of target processor"
|
||||
depends on LV_USE_GPU_RA6M3_G2D
|
||||
default "hal_data.h"
|
||||
help
|
||||
Must be defined to include path of target processor
|
||||
e.g. "hal_data.h"
|
||||
|
||||
config LV_USE_GPU_SWM341_DMA2D
|
||||
bool "Enable SWM341 DMA2D GPU."
|
||||
config LV_GPU_SWM341_DMA2D_INCLUDE
|
||||
@@ -913,7 +921,8 @@ menu "LVGL configuration"
|
||||
string "Set the working directory"
|
||||
depends on LV_USE_FS_STDIO
|
||||
config LV_FS_STDIO_CACHE_SIZE
|
||||
string ">0 to cache this number of bytes in lv_fs_read()"
|
||||
int ">0 to cache this number of bytes in lv_fs_read()"
|
||||
default 0
|
||||
depends on LV_USE_FS_STDIO
|
||||
|
||||
config LV_USE_FS_POSIX
|
||||
@@ -955,6 +964,17 @@ menu "LVGL configuration"
|
||||
default 0
|
||||
depends on LV_USE_FS_FATFS
|
||||
|
||||
config LV_USE_FS_LITTLEFS
|
||||
bool "File system on top of LittleFS"
|
||||
config LV_FS_LITTLEFS_LETTER
|
||||
int "Set an upper cased letter on which the drive will accessible (e.g. 'A' i.e. 65)"
|
||||
default 0
|
||||
depends on LV_USE_FS_LITTLEFS
|
||||
config LV_FS_LITTLEFS_CACHE_SIZE
|
||||
int ">0 to cache this number of bytes in lv_fs_read()"
|
||||
default 0
|
||||
depends on LV_USE_FS_LITTLEFS
|
||||
|
||||
config LV_USE_PNG
|
||||
bool "PNG decoder library"
|
||||
|
||||
@@ -991,6 +1011,13 @@ menu "LVGL configuration"
|
||||
endmenu
|
||||
endif
|
||||
|
||||
config LV_USE_TINY_TTF
|
||||
bool "Tiny TTF library"
|
||||
config LV_TINY_TTF_FILE_SUPPORT
|
||||
bool "Load TTF data from files"
|
||||
depends on LV_USE_TINY_TTF
|
||||
default n
|
||||
|
||||
config LV_USE_RLOTTIE
|
||||
bool "Lottie library"
|
||||
|
||||
|
||||
@@ -16,10 +16,8 @@ LVGL provides everything you need to create an embedded GUI with easy-to-use gra
|
||||
<a href="https://docs.lvgl.io/master/examples.html">Interactive examples</a>
|
||||
</h4>
|
||||
|
||||
|
||||
**English** | [中文](./README_zh.md) | [Português do Brasil](./README_pt_BR.md)
|
||||
|
||||
|
||||
---
|
||||
|
||||
#### Table of content
|
||||
|
||||
@@ -1,9 +1,4 @@
|
||||
#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
|
||||
#include "lvgl.h"
|
||||
#else
|
||||
#include "lvgl/lvgl.h"
|
||||
#endif
|
||||
|
||||
#include "../../../lvgl.h"
|
||||
|
||||
#ifndef LV_ATTRIBUTE_MEM_ALIGN
|
||||
#define LV_ATTRIBUTE_MEM_ALIGN
|
||||
|
||||
@@ -89,7 +89,7 @@ LV_FONT_DECLARE(lv_font_benchmark_montserrat_16_compr_az);
|
||||
LV_FONT_DECLARE(lv_font_benchmark_montserrat_28_compr_az);
|
||||
|
||||
static void monitor_cb(lv_disp_drv_t * drv, uint32_t time, uint32_t px);
|
||||
static void scene_next_task_cb(lv_timer_t * timer);
|
||||
static void next_scene_timer_cb(lv_timer_t * timer);
|
||||
static void rect_create(lv_style_t * style);
|
||||
static void img_create(lv_style_t * style, const void * src, bool rotate, bool zoom, bool aa);
|
||||
static void txt_create(lv_style_t * style);
|
||||
@@ -226,7 +226,6 @@ static void shadow_small_ofs_cb(void)
|
||||
rect_create(&style_common);
|
||||
}
|
||||
|
||||
|
||||
static void shadow_large_cb(void)
|
||||
{
|
||||
lv_style_reset(&style_common);
|
||||
@@ -250,7 +249,6 @@ static void shadow_large_ofs_cb(void)
|
||||
rect_create(&style_common);
|
||||
}
|
||||
|
||||
|
||||
static void img_rgb_cb(void)
|
||||
{
|
||||
lv_style_reset(&style_common);
|
||||
@@ -293,7 +291,6 @@ static void img_alpha_cb(void)
|
||||
img_create(&style_common, &img_benchmark_cogwheel_alpha16, false, false, false);
|
||||
}
|
||||
|
||||
|
||||
static void img_rgb_recolor_cb(void)
|
||||
{
|
||||
lv_style_reset(&style_common);
|
||||
@@ -382,7 +379,6 @@ static void img_rgb_zoom_aa_cb(void)
|
||||
lv_style_set_img_opa(&style_common, opa_mode ? LV_OPA_50 : LV_OPA_COVER);
|
||||
img_create(&style_common, &img_benchmark_cogwheel_rgb, false, true, true);
|
||||
|
||||
|
||||
}
|
||||
|
||||
static void img_argb_zoom_cb(void)
|
||||
@@ -396,7 +392,6 @@ static void img_argb_zoom_cb(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
static void img_argb_zoom_aa_cb(void)
|
||||
{
|
||||
lv_style_reset(&style_common);
|
||||
@@ -462,7 +457,6 @@ static void txt_large_compr_cb(void)
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void line_cb(void)
|
||||
{
|
||||
lv_style_reset(&style_common);
|
||||
@@ -490,7 +484,6 @@ static void arc_thick_cb(void)
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void sub_rectangle_cb(void)
|
||||
{
|
||||
lv_style_reset(&style_common);
|
||||
@@ -563,8 +556,6 @@ static void sub_text_cb(void)
|
||||
txt_create(&style_common);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
@@ -636,7 +627,7 @@ static lv_obj_t * scene_bg;
|
||||
static lv_obj_t * title;
|
||||
static lv_obj_t * subtitle;
|
||||
static uint32_t rnd_act;
|
||||
|
||||
static lv_timer_t * next_scene_timer;
|
||||
|
||||
static const uint32_t rnd_map[] = {
|
||||
0xbd13204f, 0x67d8167f, 0x20211c99, 0xb0a7cc05,
|
||||
@@ -702,15 +693,26 @@ static void benchmark_init(void)
|
||||
lv_obj_update_layout(scr);
|
||||
}
|
||||
|
||||
|
||||
void lv_demo_benchmark(void)
|
||||
{
|
||||
benchmark_init();
|
||||
|
||||
/*Manually start scenes*/
|
||||
scene_next_task_cb(NULL);
|
||||
next_scene_timer_cb(NULL);
|
||||
}
|
||||
|
||||
void lv_demo_benchmark_close(void)
|
||||
{
|
||||
if(next_scene_timer) lv_timer_del(next_scene_timer);
|
||||
next_scene_timer = NULL;
|
||||
|
||||
lv_anim_del(NULL, NULL);
|
||||
|
||||
lv_style_reset(&style_common);
|
||||
|
||||
lv_obj_clean(lv_scr_act());
|
||||
|
||||
}
|
||||
|
||||
void lv_demo_benchmark_run_scene(int_fast16_t scene_no)
|
||||
{
|
||||
@@ -725,7 +727,8 @@ void lv_demo_benchmark_run_scene(int_fast16_t scene_no)
|
||||
scene_act = scene_no >> 1;
|
||||
|
||||
if(scenes[scene_act].create_cb) {
|
||||
lv_label_set_text_fmt(title, "%"LV_PRId32"/%d: %s%s", scene_act * 2 + (opa_mode ? 1 : 0), (int)(dimof(scenes) * 2) - 2,
|
||||
lv_label_set_text_fmt(title, "%"LV_PRId32"/%"LV_PRId32": %s%s", scene_act * 2 + (opa_mode ? 1 : 0),
|
||||
(int32_t)(dimof(scenes) * 2) - 2,
|
||||
scenes[scene_act].name, opa_mode ? " + opa" : "");
|
||||
lv_label_set_text(subtitle, "");
|
||||
|
||||
@@ -737,7 +740,6 @@ void lv_demo_benchmark_run_scene(int_fast16_t scene_no)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void lv_demo_benchmark_set_finished_cb(finished_cb_t * finished_cb)
|
||||
{
|
||||
benchmark_finished_cb = finished_cb;
|
||||
@@ -786,7 +788,6 @@ static void generate_report(void)
|
||||
weight_opa_sum += w;
|
||||
}
|
||||
|
||||
|
||||
fps_sum = fps_normal_sum + fps_opa_sum;
|
||||
weight_sum = weight_normal_sum + weight_opa_sum;
|
||||
|
||||
@@ -803,7 +804,6 @@ static void generate_report(void)
|
||||
lv_obj_clean(lv_scr_act());
|
||||
scene_bg = NULL;
|
||||
|
||||
|
||||
lv_obj_set_flex_flow(lv_scr_act(), LV_FLEX_FLOW_COLUMN);
|
||||
|
||||
title = lv_label_create(lv_scr_act());
|
||||
@@ -839,7 +839,6 @@ static void generate_report(void)
|
||||
// lv_obj_add_style(table, LV_TABLE_PART_CELL3, &style_cell_very_slow);
|
||||
// lv_obj_add_style(table, LV_TABLE_PART_CELL4, &style_cell_title);
|
||||
|
||||
|
||||
uint16_t row = 0;
|
||||
lv_table_add_cell_ctrl(table, row, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
|
||||
lv_table_set_cell_value(table, row, 0, "Slow but common cases");
|
||||
@@ -926,7 +925,6 @@ static void generate_report(void)
|
||||
lv_snprintf(buf, sizeof(buf), "%"LV_PRIu32, scenes[i].fps_opa);
|
||||
lv_table_set_cell_value(table, row, 1, buf);
|
||||
|
||||
|
||||
if(scenes[i].fps_opa < 10) {
|
||||
// lv_table_set_cell_type(table, row, 0, 3);
|
||||
// lv_table_set_cell_type(table, row, 1, 3);
|
||||
@@ -972,11 +970,13 @@ static void report_cb(lv_timer_t * timer)
|
||||
}
|
||||
}
|
||||
|
||||
static void scene_next_task_cb(lv_timer_t * timer)
|
||||
static void next_scene_timer_cb(lv_timer_t * timer)
|
||||
{
|
||||
LV_UNUSED(timer);
|
||||
lv_obj_clean(scene_bg);
|
||||
|
||||
next_scene_timer = NULL;
|
||||
|
||||
if(opa_mode) {
|
||||
if(scene_act >= 0) {
|
||||
if(scenes[scene_act].time_sum_opa == 0) scenes[scene_act].time_sum_opa = 1;
|
||||
@@ -995,8 +995,8 @@ static void scene_next_task_cb(lv_timer_t * timer)
|
||||
}
|
||||
|
||||
if(scenes[scene_act].create_cb) {
|
||||
lv_label_set_text_fmt(title, "%"LV_PRId32"/%d: %s%s", scene_act * 2 + (opa_mode ? 1 : 0),
|
||||
(int)(dimof(scenes) * 2) - 2, scenes[scene_act].name, opa_mode ? " + opa" : "");
|
||||
lv_label_set_text_fmt(title, "%"LV_PRId32"/%"LV_PRId32": %s%s", scene_act * 2 + (opa_mode ? 1 : 0),
|
||||
(int32_t)(dimof(scenes) * 2) - 2, scenes[scene_act].name, opa_mode ? " + opa" : "");
|
||||
if(opa_mode) {
|
||||
lv_label_set_text_fmt(subtitle, "Result of \"%s\": %"LV_PRId32" FPS", scenes[scene_act].name,
|
||||
scenes[scene_act].fps_normal);
|
||||
@@ -1013,8 +1013,8 @@ static void scene_next_task_cb(lv_timer_t * timer)
|
||||
|
||||
rnd_reset();
|
||||
scenes[scene_act].create_cb();
|
||||
lv_timer_t * t = lv_timer_create(scene_next_task_cb, SCENE_TIME, NULL);
|
||||
lv_timer_set_repeat_count(t, 1);
|
||||
next_scene_timer = lv_timer_create(next_scene_timer_cb, SCENE_TIME, NULL);
|
||||
lv_timer_set_repeat_count(next_scene_timer, 1);
|
||||
|
||||
}
|
||||
/*Ready*/
|
||||
@@ -1036,7 +1036,6 @@ static void scene_next_task_cb(lv_timer_t * timer)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void rect_create(lv_style_t * style)
|
||||
{
|
||||
uint32_t i;
|
||||
@@ -1054,7 +1053,6 @@ static void rect_create(lv_style_t * style)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void img_create(lv_style_t * style, const void * src, bool rotate, bool zoom, bool aa)
|
||||
{
|
||||
uint32_t i;
|
||||
@@ -1073,7 +1071,6 @@ static void img_create(lv_style_t * style, const void * src, bool rotate, bool z
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void txt_create(lv_style_t * style)
|
||||
{
|
||||
uint32_t i;
|
||||
@@ -1089,7 +1086,6 @@ static void txt_create(lv_style_t * style)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void line_create(lv_style_t * style)
|
||||
{
|
||||
static lv_point_t points[OBJ_NUM][LINE_POINT_NUM];
|
||||
@@ -1104,7 +1100,6 @@ static void line_create(lv_style_t * style)
|
||||
points[i][j].y = rnd_next(LINE_POINT_DIFF_MIN, LINE_POINT_DIFF_MAX);
|
||||
}
|
||||
|
||||
|
||||
lv_obj_t * obj = lv_line_create(scene_bg);
|
||||
lv_obj_remove_style_all(obj);
|
||||
lv_obj_add_style(obj, style, 0);
|
||||
@@ -1117,7 +1112,6 @@ static void line_create(lv_style_t * style)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void arc_anim_end_angle_cb(void * var, int32_t v)
|
||||
{
|
||||
lv_arc_set_end_angle(var, v);
|
||||
@@ -1151,7 +1145,6 @@ static void arc_create(lv_style_t * style)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void fall_anim_y_cb(void * var, int32_t v)
|
||||
{
|
||||
lv_obj_set_y(var, v);
|
||||
|
||||
@@ -24,12 +24,13 @@ extern "C" {
|
||||
**********************/
|
||||
typedef void finished_cb_t(void);
|
||||
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
void lv_demo_benchmark(void);
|
||||
|
||||
void lv_demo_benchmark_close(void);
|
||||
|
||||
void lv_demo_benchmark_run_scene(int_fast16_t scene_no);
|
||||
|
||||
void lv_demo_benchmark_set_finished_cb(finished_cb_t * finished_cb);
|
||||
|
||||
@@ -46,8 +46,11 @@ static lv_obj_t * t2;
|
||||
|
||||
void lv_demo_keypad_encoder(void)
|
||||
{
|
||||
g = lv_group_create();
|
||||
lv_group_set_default(g);
|
||||
g = lv_group_get_default();
|
||||
if(g == NULL) {
|
||||
g = lv_group_create();
|
||||
lv_group_set_default(g);
|
||||
}
|
||||
|
||||
lv_indev_t * cur_drv = NULL;
|
||||
for(;;) {
|
||||
@@ -76,6 +79,12 @@ void lv_demo_keypad_encoder(void)
|
||||
msgbox_create();
|
||||
}
|
||||
|
||||
void lv_demo_keypad_encoder_close(void)
|
||||
{
|
||||
lv_obj_clean(lv_scr_act());
|
||||
lv_obj_clean(lv_layer_top());
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
@@ -27,6 +27,7 @@ extern "C" {
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
void lv_demo_keypad_encoder(void);
|
||||
void lv_demo_keypad_encoder_close(void);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
|
||||
@@ -47,7 +47,6 @@ extern "C" {
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
BIN
demos/music/assets/272_png/btn_list_pause.png
Normal file
|
After Width: | Height: | Size: 4.8 KiB |
BIN
demos/music/assets/272_png/btn_list_play.png
Normal file
|
After Width: | Height: | Size: 3.5 KiB |
BIN
demos/music/assets/272_png/btn_loop.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
demos/music/assets/272_png/btn_next.png
Normal file
|
After Width: | Height: | Size: 3.6 KiB |
BIN
demos/music/assets/272_png/btn_pause.png
Normal file
|
After Width: | Height: | Size: 4.7 KiB |
BIN
demos/music/assets/272_png/btn_play.png
Normal file
|
After Width: | Height: | Size: 4.7 KiB |
BIN
demos/music/assets/272_png/btn_prev.png
Normal file
|
After Width: | Height: | Size: 3.6 KiB |
BIN
demos/music/assets/272_png/btn_rnd.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
demos/music/assets/272_png/corner_1.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
demos/music/assets/272_png/corner_2.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
demos/music/assets/272_png/cover_1.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
demos/music/assets/272_png/cover_2.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
demos/music/assets/272_png/cover_3.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
demos/music/assets/272_png/icn_chart.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
demos/music/assets/272_png/icn_chat.png
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
BIN
demos/music/assets/272_png/icn_download.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
demos/music/assets/272_png/icn_heart.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
demos/music/assets/272_png/icn_slider.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
demos/music/assets/272_png/list_border.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
demos/music/assets/272_png/wave_bottom.png
Normal file
|
After Width: | Height: | Size: 5.6 KiB |
BIN
demos/music/assets/272_png/wave_top.png
Normal file
|
After Width: | Height: | Size: 5.6 KiB |
BIN
demos/music/assets/480_png/btn_list_pause.png
Normal file
|
After Width: | Height: | Size: 8.0 KiB |
BIN
demos/music/assets/480_png/btn_list_play.png
Normal file
|
After Width: | Height: | Size: 5.5 KiB |
BIN
demos/music/assets/480_png/btn_loop.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
demos/music/assets/480_png/btn_next.png
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
demos/music/assets/480_png/btn_pause.png
Normal file
|
After Width: | Height: | Size: 8.2 KiB |
BIN
demos/music/assets/480_png/btn_play.png
Normal file
|
After Width: | Height: | Size: 8.3 KiB |
BIN
demos/music/assets/480_png/btn_prev.png
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
demos/music/assets/480_png/btn_rnd.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
demos/music/assets/480_png/corner_1.png
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
BIN
demos/music/assets/480_png/corner_2.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
demos/music/assets/480_png/cover_1.png
Normal file
|
After Width: | Height: | Size: 151 KiB |
BIN
demos/music/assets/480_png/cover_2.png
Normal file
|
After Width: | Height: | Size: 166 KiB |
BIN
demos/music/assets/480_png/cover_3.png
Normal file
|
After Width: | Height: | Size: 142 KiB |
BIN
demos/music/assets/480_png/icn_chart.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
demos/music/assets/480_png/icn_chat.png
Normal file
|
After Width: | Height: | Size: 3.0 KiB |
BIN
demos/music/assets/480_png/icn_download.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
demos/music/assets/480_png/icn_heart.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
demos/music/assets/480_png/icn_slider.png
Normal file
|
After Width: | Height: | Size: 3.7 KiB |
BIN
demos/music/assets/480_png/list_border.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
demos/music/assets/480_png/wave_bottom.png
Normal file
|
After Width: | Height: | Size: 9.3 KiB |
BIN
demos/music/assets/480_png/wave_top.png
Normal file
|
After Width: | Height: | Size: 9.4 KiB |
@@ -103,6 +103,12 @@ static const uint32_t time_list[] = {
|
||||
2 * 60 + 19,
|
||||
};
|
||||
|
||||
#if LV_DEMO_MUSIC_AUTO_PLAY
|
||||
static lv_timer_t * auto_step_timer;
|
||||
#endif
|
||||
|
||||
static lv_color_t original_screen_bg_color;
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
@@ -113,16 +119,33 @@ static const uint32_t time_list[] = {
|
||||
|
||||
void lv_demo_music(void)
|
||||
{
|
||||
original_screen_bg_color = lv_obj_get_style_bg_color(lv_scr_act(), 0);
|
||||
lv_obj_set_style_bg_color(lv_scr_act(), lv_color_hex(0x343247), 0);
|
||||
|
||||
list = _lv_demo_music_list_create(lv_scr_act());
|
||||
ctrl = _lv_demo_music_main_create(lv_scr_act());
|
||||
|
||||
#if LV_DEMO_MUSIC_AUTO_PLAY
|
||||
lv_timer_create(auto_step_cb, 1000, NULL);
|
||||
auto_step_timer = lv_timer_create(auto_step_cb, 1000, NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
void lv_demo_music_close(void)
|
||||
{
|
||||
/*Delete all aniamtions*/
|
||||
lv_anim_del(NULL, NULL);
|
||||
|
||||
#if LV_DEMO_MUSIC_AUTO_PLAY
|
||||
lv_timer_del(auto_step_timer);
|
||||
#endif
|
||||
_lv_demo_music_list_close();
|
||||
_lv_demo_music_main_close();
|
||||
|
||||
lv_obj_clean(lv_scr_act());
|
||||
|
||||
lv_obj_set_style_bg_color(lv_scr_act(), original_screen_bg_color, 0);
|
||||
}
|
||||
|
||||
const char * _lv_demo_music_get_title(uint32_t track_id)
|
||||
{
|
||||
if(track_id >= sizeof(title_list) / sizeof(title_list[0])) return NULL;
|
||||
|
||||
@@ -36,6 +36,8 @@ extern "C" {
|
||||
**********************/
|
||||
|
||||
void lv_demo_music(void);
|
||||
void lv_demo_music_close(void);
|
||||
|
||||
const char * _lv_demo_music_get_title(uint32_t track_id);
|
||||
const char * _lv_demo_music_get_artist(uint32_t track_id);
|
||||
const char * _lv_demo_music_get_genre(uint32_t track_id);
|
||||
|
||||
@@ -130,6 +130,18 @@ lv_obj_t * _lv_demo_music_list_create(lv_obj_t * parent)
|
||||
return list;
|
||||
}
|
||||
|
||||
void _lv_demo_music_list_close(void)
|
||||
{
|
||||
lv_style_reset(&style_scrollbar);
|
||||
lv_style_reset(&style_btn);
|
||||
lv_style_reset(&style_btn_pr);
|
||||
lv_style_reset(&style_btn_chk);
|
||||
lv_style_reset(&style_btn_dis);
|
||||
lv_style_reset(&style_title);
|
||||
lv_style_reset(&style_artist);
|
||||
lv_style_reset(&style_time);
|
||||
}
|
||||
|
||||
void _lv_demo_music_list_btn_check(uint32_t track_id, bool state)
|
||||
{
|
||||
lv_obj_t * btn = lv_obj_get_child(list, track_id);
|
||||
@@ -205,7 +217,6 @@ static lv_obj_t * add_list_btn(lv_obj_t * parent, uint32_t track_id)
|
||||
return btn;
|
||||
}
|
||||
|
||||
|
||||
static void btn_click_event_cb(lv_event_t * e)
|
||||
{
|
||||
lv_obj_t * btn = lv_event_get_target(e);
|
||||
@@ -215,4 +226,3 @@ static void btn_click_event_cb(lv_event_t * e)
|
||||
_lv_demo_music_play(idx);
|
||||
}
|
||||
#endif /*LV_USE_DEMO_MUSIC*/
|
||||
|
||||
|
||||
@@ -28,6 +28,8 @@ extern "C" {
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
lv_obj_t * _lv_demo_music_list_create(lv_obj_t * parent);
|
||||
void _lv_demo_music_list_close(void);
|
||||
|
||||
void _lv_demo_music_list_btn_check(uint32_t track_id, bool state);
|
||||
|
||||
/**********************
|
||||
|
||||
@@ -60,7 +60,7 @@ static void prev_click_event_cb(lv_event_t * e);
|
||||
static void next_click_event_cb(lv_event_t * e);
|
||||
static void timer_cb(lv_timer_t * t);
|
||||
static void track_load(uint32_t id);
|
||||
static void stop_start_anim(lv_timer_t * t);
|
||||
static void stop_start_anim_timer_cb(lv_timer_t * t);
|
||||
static void spectrum_end_cb(lv_anim_t * a);
|
||||
static void album_fade_anim_cb(void * var, int32_t v);
|
||||
static int32_t get_cos(int32_t deg, int32_t a);
|
||||
@@ -84,6 +84,7 @@ static uint32_t spectrum_lane_ofs_start = 0;
|
||||
static uint32_t bar_rot = 0;
|
||||
static uint32_t time_act;
|
||||
static lv_timer_t * sec_counter_timer;
|
||||
static lv_timer_t * stop_start_anim_timer;
|
||||
static const lv_font_t * font_small;
|
||||
static const lv_font_t * font_large;
|
||||
static uint32_t track_id;
|
||||
@@ -232,8 +233,8 @@ lv_obj_t * _lv_demo_music_main_create(lv_obj_t * parent)
|
||||
|
||||
start_anim = true;
|
||||
|
||||
lv_timer_t * timer = lv_timer_create(stop_start_anim, INTRO_TIME + 6000, NULL);
|
||||
lv_timer_set_repeat_count(timer, 1);
|
||||
stop_start_anim_timer = lv_timer_create(stop_start_anim_timer_cb, INTRO_TIME + 6000, NULL);
|
||||
lv_timer_set_repeat_count(stop_start_anim_timer, 1);
|
||||
|
||||
lv_anim_init(&a);
|
||||
lv_anim_set_path_cb(&a, lv_anim_path_bounce);
|
||||
@@ -292,6 +293,12 @@ lv_obj_t * _lv_demo_music_main_create(lv_obj_t * parent)
|
||||
return main_cont;
|
||||
}
|
||||
|
||||
void _lv_demo_music_main_close(void)
|
||||
{
|
||||
if(stop_start_anim_timer) lv_timer_del(stop_start_anim_timer);
|
||||
lv_timer_del(sec_counter_timer);
|
||||
}
|
||||
|
||||
void _lv_demo_music_album_next(bool next)
|
||||
{
|
||||
uint32_t id = track_id;
|
||||
@@ -762,7 +769,7 @@ static void spectrum_draw_event_cb(lv_event_t * e)
|
||||
lv_obj_t * obj = lv_event_get_target(e);
|
||||
lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e);
|
||||
|
||||
lv_opa_t opa = lv_obj_get_style_opa(obj, LV_PART_MAIN);
|
||||
lv_opa_t opa = lv_obj_get_style_opa_recursive(obj, LV_PART_MAIN);
|
||||
if(opa < LV_OPA_MIN) return;
|
||||
|
||||
lv_point_t poly[4];
|
||||
@@ -974,7 +981,6 @@ static void next_click_event_cb(lv_event_t * e)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void timer_cb(lv_timer_t * t)
|
||||
{
|
||||
LV_UNUSED(t);
|
||||
@@ -989,11 +995,11 @@ static void spectrum_end_cb(lv_anim_t * a)
|
||||
_lv_demo_music_album_next(true);
|
||||
}
|
||||
|
||||
|
||||
static void stop_start_anim(lv_timer_t * t)
|
||||
static void stop_start_anim_timer_cb(lv_timer_t * t)
|
||||
{
|
||||
LV_UNUSED(t);
|
||||
start_anim = false;
|
||||
stop_start_anim_timer = NULL;
|
||||
lv_obj_refresh_ext_draw_size(spectrum_obj);
|
||||
}
|
||||
|
||||
@@ -1002,4 +1008,3 @@ static void album_fade_anim_cb(void * var, int32_t v)
|
||||
lv_obj_set_style_img_opa(var, v, 0);
|
||||
}
|
||||
#endif /*LV_USE_DEMO_MUSIC*/
|
||||
|
||||
|
||||
@@ -28,6 +28,8 @@ extern "C" {
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
lv_obj_t * _lv_demo_music_main_create(lv_obj_t * parent);
|
||||
void _lv_demo_music_main_close(void);
|
||||
|
||||
void _lv_demo_music_play(uint32_t id);
|
||||
void _lv_demo_music_resume(void);
|
||||
void _lv_demo_music_pause(void);
|
||||
@@ -38,7 +40,6 @@ void _lv_demo_music_album_next(bool next);
|
||||
**********************/
|
||||
#endif /*LV_USE_DEMO_MUSIC*/
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
@@ -25,7 +25,7 @@ static void msgbox_del(lv_timer_t * tmr);
|
||||
static void set_y_anim(void * obj, int32_t v);
|
||||
static void set_width_anim(void * obj, int32_t v);
|
||||
static void arc_set_end_angle_anim(void * obj, int32_t v);
|
||||
static void obj_test_task_cb(lv_timer_t * tmr);
|
||||
static void obj_test_timer_cb(lv_timer_t * tmr);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
@@ -34,6 +34,10 @@ static lv_obj_t * main_page;
|
||||
static lv_obj_t * ta;
|
||||
static const char * mbox_btns[] = {"Ok", "Cancel", ""};
|
||||
static uint32_t mem_free_start = 0;
|
||||
static lv_timer_t * obj_test_timer;
|
||||
static int16_t state;
|
||||
static lv_timer_t * msgbox_tmr;
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
@@ -45,23 +49,34 @@ static uint32_t mem_free_start = 0;
|
||||
void lv_demo_stress(void)
|
||||
{
|
||||
LV_LOG_USER("Starting stress test. (< 100 bytes permanent memory leak is normal due to fragmentation)");
|
||||
lv_timer_create(obj_test_task_cb, LV_DEMO_STRESS_TIME_STEP, NULL);
|
||||
obj_test_timer = lv_timer_create(obj_test_timer_cb, LV_DEMO_STRESS_TIME_STEP, NULL);
|
||||
state = -1;
|
||||
}
|
||||
|
||||
void lv_demo_stress_close(void)
|
||||
{
|
||||
lv_timer_del(obj_test_timer);
|
||||
obj_test_timer = NULL;
|
||||
if(msgbox_tmr) {
|
||||
lv_timer_del(msgbox_tmr);
|
||||
msgbox_tmr = NULL;
|
||||
}
|
||||
|
||||
lv_obj_clean(lv_scr_act());
|
||||
lv_obj_clean(lv_layer_top());
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
static void obj_test_task_cb(lv_timer_t * tmr)
|
||||
static void obj_test_timer_cb(lv_timer_t * tmr)
|
||||
{
|
||||
(void) tmr; /*Unused*/
|
||||
static int16_t state = -1;
|
||||
|
||||
lv_anim_t a;
|
||||
lv_obj_t * obj;
|
||||
|
||||
// printf("step start: %d\n", state);
|
||||
|
||||
switch(state) {
|
||||
case -1: {
|
||||
lv_res_t res = lv_mem_test();
|
||||
@@ -83,7 +98,6 @@ static void obj_test_task_cb(lv_timer_t * tmr)
|
||||
lv_obj_set_size(main_page, LV_HOR_RES / 2, LV_VER_RES);
|
||||
lv_obj_set_flex_flow(main_page, LV_FLEX_FLOW_COLUMN);
|
||||
|
||||
|
||||
obj = lv_btn_create(main_page);
|
||||
lv_obj_set_size(obj, 100, 70);
|
||||
obj = lv_label_create(obj);
|
||||
@@ -246,8 +260,7 @@ static void obj_test_task_cb(lv_timer_t * tmr)
|
||||
|
||||
case 14:
|
||||
obj = lv_msgbox_create(NULL, "Title", "Some text on the message box with average length", mbox_btns, true);
|
||||
|
||||
lv_timer_t * msgbox_tmr = lv_timer_create(msgbox_del, LV_DEMO_STRESS_TIME_STEP * 5 + 30, obj);
|
||||
msgbox_tmr = lv_timer_create(msgbox_del, LV_DEMO_STRESS_TIME_STEP * 5 + 30, obj);
|
||||
lv_timer_set_repeat_count(msgbox_tmr, 1);
|
||||
lv_obj_align(obj, LV_ALIGN_RIGHT_MID, -10, 0);
|
||||
break;
|
||||
@@ -439,6 +452,7 @@ static void auto_del(lv_obj_t * obj, uint32_t delay)
|
||||
|
||||
static void msgbox_del(lv_timer_t * tmr)
|
||||
{
|
||||
msgbox_tmr = NULL;
|
||||
lv_msgbox_close(tmr->user_data);
|
||||
}
|
||||
|
||||
|
||||
@@ -30,6 +30,8 @@ extern "C" {
|
||||
**********************/
|
||||
void lv_demo_stress(void);
|
||||
|
||||
void lv_demo_stress_close(void);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
@@ -86,6 +86,8 @@ static uint32_t session_desktop = 1000;
|
||||
static uint32_t session_tablet = 1000;
|
||||
static uint32_t session_mobile = 1000;
|
||||
|
||||
static lv_timer_t * meter2_timer;
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
@@ -196,6 +198,22 @@ void lv_demo_widgets(void)
|
||||
color_changer_create(tv);
|
||||
}
|
||||
|
||||
void lv_demo_widgets_close(void)
|
||||
{
|
||||
/*Delete all animation*/
|
||||
lv_anim_del(NULL, NULL);
|
||||
|
||||
lv_timer_del(meter2_timer);
|
||||
meter2_timer = NULL;
|
||||
|
||||
lv_obj_clean(lv_scr_act());
|
||||
|
||||
lv_style_reset(&style_text_muted);
|
||||
lv_style_reset(&style_title);
|
||||
lv_style_reset(&style_icon);
|
||||
lv_style_reset(&style_bullet);
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
@@ -340,7 +358,6 @@ static void profile_create(lv_obj_t * parent)
|
||||
LV_GRID_TEMPLATE_LAST
|
||||
};
|
||||
|
||||
|
||||
lv_obj_set_grid_dsc_array(parent, grid_main_col_dsc, grid_main_row_dsc);
|
||||
|
||||
lv_obj_set_grid_cell(panel1, LV_GRID_ALIGN_STRETCH, 0, 2, LV_GRID_ALIGN_CENTER, 0, 1);
|
||||
@@ -368,7 +385,6 @@ static void profile_create(lv_obj_t * parent)
|
||||
lv_obj_set_grid_cell(gender, LV_GRID_ALIGN_STRETCH, 0, 1, LV_GRID_ALIGN_CENTER, 6, 1);
|
||||
lv_obj_set_grid_cell(gender_label, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 5, 1);
|
||||
|
||||
|
||||
lv_obj_set_grid_cell(panel3, LV_GRID_ALIGN_STRETCH, 1, 1, LV_GRID_ALIGN_STRETCH, 1, 1);
|
||||
lv_obj_set_grid_dsc_array(panel3, grid_2_col_dsc, grid_2_row_dsc);
|
||||
lv_obj_set_grid_cell(panel3_title, LV_GRID_ALIGN_START, 0, 2, LV_GRID_ALIGN_CENTER, 0, 1);
|
||||
@@ -383,7 +399,6 @@ static void profile_create(lv_obj_t * parent)
|
||||
static lv_coord_t grid_main_col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
|
||||
static lv_coord_t grid_main_row_dsc[] = {LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST};
|
||||
|
||||
|
||||
/*Create the top panel*/
|
||||
static lv_coord_t grid_1_col_dsc[] = {LV_GRID_CONTENT, 1, LV_GRID_CONTENT, LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
|
||||
static lv_coord_t grid_1_row_dsc[] = {
|
||||
@@ -411,7 +426,6 @@ static void profile_create(lv_obj_t * parent)
|
||||
LV_GRID_TEMPLATE_LAST
|
||||
};
|
||||
|
||||
|
||||
lv_obj_set_grid_dsc_array(parent, grid_main_col_dsc, grid_main_row_dsc);
|
||||
lv_obj_set_grid_cell(panel1, LV_GRID_ALIGN_STRETCH, 0, 2, LV_GRID_ALIGN_CENTER, 0, 1);
|
||||
|
||||
@@ -456,7 +470,6 @@ static void profile_create(lv_obj_t * parent)
|
||||
static lv_coord_t grid_main_row_dsc[] = {LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST};
|
||||
lv_obj_set_grid_dsc_array(parent, grid_main_col_dsc, grid_main_row_dsc);
|
||||
|
||||
|
||||
/*Create the top panel*/
|
||||
static lv_coord_t grid_1_col_dsc[] = {LV_GRID_CONTENT, LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
|
||||
static lv_coord_t grid_1_row_dsc[] = {LV_GRID_CONTENT, /*Avatar*/
|
||||
@@ -471,7 +484,6 @@ static void profile_create(lv_obj_t * parent)
|
||||
|
||||
lv_obj_set_grid_dsc_array(panel1, grid_1_col_dsc, grid_1_row_dsc);
|
||||
|
||||
|
||||
static lv_coord_t grid_2_col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
|
||||
static lv_coord_t grid_2_row_dsc[] = {
|
||||
LV_GRID_CONTENT, /*Title*/
|
||||
@@ -526,7 +538,6 @@ static void profile_create(lv_obj_t * parent)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void analytics_create(lv_obj_t * parent)
|
||||
{
|
||||
lv_obj_set_flex_flow(parent, LV_FLEX_FLOW_ROW_WRAP);
|
||||
@@ -698,7 +709,7 @@ static void analytics_create(lv_obj_t * parent)
|
||||
lv_meter_set_indicator_start_value(meter2, meter2_indic[2], 70);
|
||||
lv_meter_set_indicator_end_value(meter2, meter2_indic[2], 99);
|
||||
|
||||
lv_timer_create(meter2_timer_cb, 100, meter2_indic);
|
||||
meter2_timer = lv_timer_create(meter2_timer_cb, 100, meter2_indic);
|
||||
|
||||
meter3 = create_meter_box(parent, "Network Speed", "Low speed", "Normal Speed", "High Speed");
|
||||
if(disp_size < DISP_LARGE) lv_obj_add_flag(lv_obj_get_parent(meter3), LV_OBJ_FLAG_FLEX_IN_NEW_TRACK);
|
||||
@@ -840,7 +851,6 @@ void shop_create(lv_obj_t * parent)
|
||||
lv_obj_set_size(chart3, lv_pct(100), lv_pct(100));
|
||||
lv_obj_set_style_pad_column(chart3, LV_DPX(30), 0);
|
||||
|
||||
|
||||
lv_obj_set_grid_dsc_array(panel1, grid1_col_dsc, grid1_row_dsc);
|
||||
lv_obj_set_grid_cell(title, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 0, 1);
|
||||
lv_obj_set_grid_cell(date, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 1, 1);
|
||||
@@ -956,7 +966,6 @@ void shop_create(lv_obj_t * parent)
|
||||
cb = lv_checkbox_create(notifications);
|
||||
lv_checkbox_set_text(cb, "Out of stock");
|
||||
|
||||
|
||||
}
|
||||
|
||||
static void color_changer_create(lv_obj_t * parent)
|
||||
@@ -1162,7 +1171,6 @@ static lv_obj_t * create_meter_box(lv_obj_t * parent, const char * title, const
|
||||
lv_obj_set_grid_cell(label3, LV_GRID_ALIGN_STRETCH, 1, 1, LV_GRID_ALIGN_START, 4, 1);
|
||||
}
|
||||
|
||||
|
||||
return meter;
|
||||
|
||||
}
|
||||
@@ -1380,7 +1388,6 @@ static void chart_event_cb(lv_event_t * e)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
const lv_chart_series_t * ser = dsc->sub_part_ptr;
|
||||
|
||||
if(lv_chart_get_pressed_point(obj) == dsc->id) {
|
||||
@@ -1446,7 +1453,6 @@ static void chart_event_cb(lv_event_t * e)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void shop_chart_event_cb(lv_event_t * e)
|
||||
{
|
||||
lv_event_code_t code = lv_event_get_code(e);
|
||||
@@ -1498,7 +1504,6 @@ static void shop_chart_event_cb(lv_event_t * e)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void meter1_indic1_anim_cb(void * var, int32_t v)
|
||||
{
|
||||
lv_meter_set_indicator_end_value(meter1, var, v);
|
||||
@@ -1535,7 +1540,6 @@ static void meter2_timer_cb(lv_timer_t * timer)
|
||||
static bool down2 = false;
|
||||
static bool down3 = false;
|
||||
|
||||
|
||||
if(down1) {
|
||||
session_desktop -= 137;
|
||||
if(session_desktop < 1400) down1 = false;
|
||||
|
||||
@@ -27,6 +27,7 @@ extern "C" {
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
void lv_demo_widgets(void);
|
||||
void lv_demo_widgets_close(void);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
|
||||
1758
docs/CHANGELOG.md
43
docs/_static/js/custom.js
vendored
@@ -12,7 +12,46 @@ document.addEventListener('DOMContentLoaded', (event) => {
|
||||
cppListing.classList.toggle("unexpanded");
|
||||
cppListing.classList.toggle("expanded");
|
||||
});
|
||||
|
||||
|
||||
dt.insertBefore(button, dt.firstChild);
|
||||
});
|
||||
})
|
||||
|
||||
fetch('https://lvgl.io/home-banner.txt') // Replace with your URL
|
||||
.then(response => {
|
||||
// Check if the request was successful
|
||||
if (!response.ok) {
|
||||
throw new Error(`HTTP error! Status: ${response.status}`);
|
||||
}
|
||||
// Read the response as text
|
||||
return response.text();
|
||||
})
|
||||
.then(data => {
|
||||
|
||||
const section = document.querySelector('.wy-nav-content-wrap');
|
||||
|
||||
//Add a div
|
||||
const newDiv = document.createElement('div');
|
||||
newDiv.style="background-image: linear-gradient(45deg, black, #5e5e5e); color: white; border-bottom: 4px solid #e10010; padding-inline:3em"
|
||||
section.insertBefore(newDiv, section.firstChild);
|
||||
|
||||
|
||||
//Add a p to the div
|
||||
const newP = document.createElement('p');
|
||||
newP.style="padding-block:12px; margin-block:0px;align-content: center;align-items: center;"
|
||||
newP.innerHTML = data
|
||||
newDiv.insertBefore(newP, newDiv.firstChild);
|
||||
|
||||
const children = newDiv.querySelectorAll('*');
|
||||
|
||||
// Iterate over each child
|
||||
children.forEach(child => {
|
||||
// Check if the child has an id
|
||||
if (child.id) {
|
||||
// Prepend 'docs-' to the id
|
||||
child.id = 'docs-' + child.id;
|
||||
}
|
||||
})
|
||||
}) .catch(error => {
|
||||
console.error('Fetch error: ' + error.message);
|
||||
});
|
||||
})
|
||||
|
||||
@@ -52,9 +52,14 @@ In the INO file you can see how to register a display and a touchpad for LVGL an
|
||||
|
||||
Note that, there is no dedicated INO file for every example. Instead, you can load an example by calling an `lv_example_...` function. For example `lv_example_btn_1()`.
|
||||
|
||||
**IMPORTANT**
|
||||
**IMPORTANT NOTE 1**
|
||||
Due to some the limitations of Arduino's build system you need to copy `lvgl/examples` to `lvgl/src/examples`. Similarly for the demos `lvgl/demos` to `lvgl/src/demos`.
|
||||
|
||||
|
||||
**IMPORTANT NOTE 2**
|
||||
Note that the `lv_examples` library is for LVGL v7 and you shouldn't install it for this version (since LVGL v8)
|
||||
as the examples and demos are now part of the main LVGL library.
|
||||
|
||||
## Debugging and logging
|
||||
|
||||
LVGL can display debug information in case of trouble.
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
nxp
|
||||
stm32
|
||||
espressif
|
||||
renesas
|
||||
arduino
|
||||
tasmota-berry
|
||||
cmake
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# NXP
|
||||
NXP has integrated LVGL into the MCUXpresso SDK packages for several of their general purpose and crossover
|
||||
microcontrollers, allowing easy evaluation and migration into your product design.
|
||||
NXP has integrated LVGL into the MCUXpresso SDK packages for general purpose and crossover microcontrollers, allowing
|
||||
easy evaluation and migration into your product design.
|
||||
[Download an SDK for a supported board](https://www.nxp.com/design/software/embedded-software/littlevgl-open-source-graphics-library:LITTLEVGL-OPEN-SOURCE-GRAPHICS-LIBRARY?&tid=vanLITTLEVGL-OPEN-SOURCE-GRAPHICS-LIBRARY)
|
||||
today and get started with your next GUI application.
|
||||
|
||||
@@ -10,42 +10,40 @@ with PXP/VGLite support if the modules are present), no additional integration w
|
||||
|
||||
## HW acceleration for NXP iMX RT platforms
|
||||
Depending on the RT platform used, the acceleration can be done by NXP PXP (PiXel Pipeline) and/or the Verisilicon GPU
|
||||
through an API named VGLite. There is a single NXP draw context that covers both GPUs allowing to have enabled either
|
||||
one or even both at the same time. While enableing both 2D accelerators, the VGLite can be used to accelerate widget
|
||||
drawing while the PXP accelerated blit and fill operations.
|
||||
|
||||
Supported draw callbacks are available in "src/draw/nxp/lv_gpu_nxp.c":
|
||||
```c
|
||||
nxp_draw_ctx->base_draw.draw_arc = lv_draw_nxp_arc;
|
||||
nxp_draw_ctx->base_draw.draw_rect = lv_draw_nxp_rect;
|
||||
nxp_draw_ctx->base_draw.draw_img_decoded = lv_draw_nxp_img_decoded;
|
||||
nxp_draw_ctx->blend = lv_draw_nxp_blend;
|
||||
```
|
||||
|
||||
If enabled both GPUs, the PXP is the preffered one to be used for drawing operation. A fallback mechanism is
|
||||
implemented so that if the feature is not supported by PXP (or if PXP fails), the VGLite will take over to handle the
|
||||
task. At the end, the CPU will assure that every widget drawing is fully covered (if not already done by GPU).
|
||||
through an API named VGLite. Each accelerator has its own context that allows them to be used individually as well
|
||||
simultaneously (in LVGL multithreading mode).
|
||||
|
||||
### PXP accelerator
|
||||
Several drawing features in LVGL can be offloaded to the PXP engine. The VGLite (if supported) and CPU are available for
|
||||
other operations while the PXP is running. An RTOS is required to block the LVGL drawing thread and switch to another
|
||||
task or suspend the CPU for power savings.
|
||||
Several drawing features in LVGL can be offloaded to the PXP engine. The CPU is available for other operations while the
|
||||
PXP is running. RTOS is required to block the LVGL drawing thread and switch to another task or suspend the CPU for
|
||||
power savings.
|
||||
|
||||
Supported draw callbacks are available in "src/draw/nxp/pxp/lv_draw_pxp.c":
|
||||
```c
|
||||
pxp_draw_ctx->base_draw.draw_img_decoded = lv_draw_pxp_img_decoded;
|
||||
pxp_draw_ctx->blend = lv_draw_pxp_blend;
|
||||
pxp_draw_ctx->base_draw.wait_for_finish = lv_draw_pxp_wait_for_finish;
|
||||
pxp_draw_ctx->base_draw.buffer_copy = lv_draw_pxp_buffer_copy;
|
||||
```
|
||||
|
||||
#### Features supported:
|
||||
All operations can be used in conjunction with optional transparency.
|
||||
|
||||
- RGB565 and ARGB8888 color formats
|
||||
- Area fill + optional transparency
|
||||
- BLIT (BLock Image Transfer) + optional transparency
|
||||
- Color keying + optional transparency
|
||||
- Recoloring (color tint) + optional transparency
|
||||
- Image Rotation (90, 180, 270 degree) + optional transparency
|
||||
- Recoloring (color tint) + Image Rotation (90, 180, 270 degree) + optional transparency
|
||||
- Area fill with color
|
||||
- BLIT (BLock Image Transfer)
|
||||
- Screen Rotation (90, 180, 270 degree)
|
||||
- Color keying
|
||||
- Recoloring (color tint)
|
||||
- Image Rotation (90, 180, 270 degree)
|
||||
- Buffer copy
|
||||
- RTOS integration layer
|
||||
- Default FreeRTOS and bare metal code provided
|
||||
|
||||
- Combination of recolor and/or rotation + color key/alpha blend/transparency is supported but PXP needs two steps.
|
||||
First step is to recolor/rotate the image to a temporarly buffer (please check LV_MEM_SIZE value for allocation limit)
|
||||
and another step is required to handle color keying, alpha chanel or to apply transparency.
|
||||
- Combination of recolor and/or rotation + color key/alpha blend/transparency is supported.
|
||||
That is achieved by PXP in two steps:
|
||||
- First step is to recolor/rotate the image to a temporary buffer (statically allocated)
|
||||
- Second step is required to handle color keying, alpha channel or to apply transparency
|
||||
|
||||
#### Known limitations:
|
||||
- Rotation is not supported for images unaligned to blocks of 16x16 pixels.
|
||||
@@ -78,51 +76,71 @@ and the final output image can look shifted.
|
||||
|
||||
#### Project setup:
|
||||
- Add PXP related files to project:
|
||||
- src/draw/nxp/pxp/lv_gpu_nxp_pxp.c, src/draw/nxp/pxp/lv_gpu_nxp_pxp.h: init, uninit, run/wait PXP device, log/trace
|
||||
- src/draw/nxp/pxp/lv_draw_pxp_blend.c, src/draw/nxp/pxp/lv_draw_pxp_blend.h: fill and blit (w/o transformation)
|
||||
- src/draw/nxp/pxp/lv_gpu_nxp_osa.c, src/draw/nxp/pxp/lv_gpu_osa.h: default implementation of OS-specific functions
|
||||
(bare metal and FreeRTOS only)
|
||||
- src/draw/nxp/pxp/lv_draw_pxp.c[.h]: draw context callbacks
|
||||
- src/draw/nxp/pxp/lv_draw_pxp_blend.c[.h]: fill and blit (with optional transformation)
|
||||
- src/draw/nxp/pxp/lv_gpu_nxp_pxp.c[.h]: init, uninit, run/wait PXP device
|
||||
- src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c[.h]: OS abstraction (FreeRTOS or bare metal)
|
||||
- optional, required only if `LV_USE_GPU_NXP_PXP_AUTO_INIT` is set to 1
|
||||
- PXP related code depends on two drivers provided by MCU SDK. These drivers need to be added to project:
|
||||
- fsl_pxp.c, fsl_pxp.h: PXP driver
|
||||
- fsl_cache.c, fsl_cache.h: CPU cache handling functions
|
||||
- fsl_pxp.c[.h]: PXP driver
|
||||
- fsl_cache.c[.h]: CPU cache handling functions
|
||||
|
||||
#### Logging:
|
||||
- By default, LV_GPU_NXP_PXP_LOG_ERRORS is enabled so that any PXP error will be seen on LVGL output
|
||||
- For tracing logs about the PXP limitations or size thresholds, the user can enable LV_GPU_NXP_PXP_LOG_TRACES
|
||||
- By default, `LV_GPU_NXP_PXP_LOG_ERRORS` is enabled so that any PXP error will be seen on SDK debug console
|
||||
- By default, `LV_GPU_NXP_PXP_LOG_TRACES` is disabled. Enable it for tracing logs (like PXP limitations)
|
||||
|
||||
#### Advanced configuration:
|
||||
- Implementation depends on multiple OS-specific functions. The struct `lv_nxp_pxp_cfg_t` with callback pointers is
|
||||
used as a parameter for the `lv_gpu_nxp_pxp_init()` function. Default implementation for FreeRTOS and baremetal is
|
||||
provided in lv_gpu_nxp_osa.c
|
||||
used as a parameter for the `lv_gpu_nxp_pxp_init()` function. Default implementation for FreeRTOS and bare metal is
|
||||
provided in lv_gpu_nxp_pxp_osa.c
|
||||
- `pxp_interrupt_init()`: Initialize PXP interrupt (HW setup, OS setup)
|
||||
- `pxp_interrupt_deinit()`: Deinitialize PXP interrupt (HW setup, OS setup)
|
||||
- `pxp_run()`: Start PXP job. Use OS-specific mechanism to block drawing thread. PXP must finish drawing before
|
||||
leaving this function.
|
||||
- There are configurable area thresholds which are used to decide whether the area will be processed by CPU or by PXP.
|
||||
Areas smaller than a defined value will be processed by CPU and those bigger than the threshold will be processed by
|
||||
PXP. These thresholds may be defined as preprocessor variables. Default values are defined in lv_draw_pxp_blend.h
|
||||
- `LV_GPU_NXP_PXP_BLIT_SIZE_LIMIT`: size threshold for image BLIT, BLIT with color keying, BLIT with recolor and
|
||||
BLIT with rotation (OPA >= LV_OPA_MAX)
|
||||
- `LV_GPU_NXP_PXP_BLIT_OPA_SIZE_LIMIT`: size threshold for image BLIT, BLIT with color keying, BLIT with recolor
|
||||
and BLIT with rotation and transparency (OPA < LV_OPA_MAX)
|
||||
- `LV_GPU_NXP_PXP_FILL_SIZE_LIMIT`: size threshold for fill operation (OPA >= LV_OPA_MAX)
|
||||
- `LV_GPU_NXP_PXP_FILL_OPA_SIZE_LIMIT`: size threshold for fill operation with transparency (OPA < LV_OPA_MAX)
|
||||
- Area threshold (size limit) is configurable and used to decide whether the area will be processed by PXP or not.
|
||||
Areas smaller than the defined value will be processed by CPU and those bigger than the threshold will be processed by
|
||||
PXP. The threshold is defined as a macro in lv_draw_pxp.c
|
||||
- `LV_GPU_NXP_PXP_SIZE_LIMIT`: size threshold for fill/blit (with optional transformation)
|
||||
|
||||
### VGLite accelerator
|
||||
Extra drawing features in LVGL can be handled by the VGLite engine. The PXP (if supported) and CPU are available for
|
||||
other operations while the VGLite is running. An RTOS is required to block the LVGL drawing thread and switch to another
|
||||
task or suspend the CPU for power savings.
|
||||
Extra drawing features in LVGL can be handled by the VGLite engine. The CPU is available for other operations while the
|
||||
VGLite is running. An RTOS is required to block the LVGL drawing thread and switch to another task or suspend the CPU
|
||||
for power savings.
|
||||
|
||||
Supported draw callbacks are available in "src/draw/nxp/vglite/lv_draw_vglite.c":
|
||||
```c
|
||||
vglite_draw_ctx->base_draw.init_buf = lv_draw_vglite_init_buf;
|
||||
vglite_draw_ctx->base_draw.draw_line = lv_draw_vglite_line;
|
||||
vglite_draw_ctx->base_draw.draw_arc = lv_draw_vglite_arc;
|
||||
vglite_draw_ctx->base_draw.draw_rect = lv_draw_vglite_rect;
|
||||
vglite_draw_ctx->base_draw.draw_img_decoded = lv_draw_vglite_img_decoded;
|
||||
vglite_draw_ctx->blend = lv_draw_vglite_blend;
|
||||
vglite_draw_ctx->base_draw.wait_for_finish = lv_draw_vglite_wait_for_finish;
|
||||
vglite_draw_ctx->base_draw.buffer_copy = lv_draw_vglite_buffer_copy;
|
||||
```
|
||||
|
||||
#### Features supported:
|
||||
All operations can be used in conjunction with optional transparency.
|
||||
|
||||
- RGB565 and ARGB8888 color formats
|
||||
- Area fill + optional transparency
|
||||
- BLIT (BLock Image Transfer) + optional transparency
|
||||
- Image Rotation (any degree with decimal) + optional transparency
|
||||
- Image Scale + optional transparency
|
||||
- Draw background rectangle with radius or gradient
|
||||
- Draw arc
|
||||
- RTOS integration layer
|
||||
- Area fill with color
|
||||
- BLIT (BLock Image Transfer)
|
||||
- Image Rotation (any degree with decimal)
|
||||
- Image Scale
|
||||
- Draw rectangle background with optional radius or gradient
|
||||
- Blit rectangle background image
|
||||
- Draw rectangle border/outline with optional rounded corners
|
||||
- Draw arc with optional rounded ending
|
||||
- Draw line or dashed line with optional rounded ending
|
||||
- Buffer copy
|
||||
|
||||
#### Known limitations:
|
||||
- Source image alignment:
|
||||
The byte alignment requirement for a pixel depends on the specific pixel format. Both buffer address and buffer stride
|
||||
must be aligned. As general rule, the alignment is set to 16 pixels. This makes the buffer address alignment to be
|
||||
32 bytes for RGB565 and 64 bytes for ARGB8888.
|
||||
- For pixel engine (PE) destination, the alignment should be 64 bytes for all tiled (4x4) buffer layouts.
|
||||
The pixel engine has no additional alignment requirement for linear buffer layouts (`VG_LITE_LINEAR`).
|
||||
|
||||
#### Basic configuration:
|
||||
- Select NXP VGLite engine in lv_conf.h: Set `LV_USE_GPU_NXP_VG_LITE` to 1
|
||||
@@ -130,8 +148,8 @@ task or suspend the CPU for power savings.
|
||||
|
||||
#### Basic initialization:
|
||||
- Initialize VGLite before calling `lv_init()` by specifying the width/height of tessellation window. Value should be
|
||||
a multiple of 16; minimum value is 16 pixels, maximum cannot be greater than frame width. If less than or equal to 0,
|
||||
then no tessellation buffer is created, in which case the function is used for a blit init.
|
||||
a multiple of 16; minimum value is 16 pixels, maximum cannot be greater than the frame width. If less than or equal
|
||||
to 0, then no tessellation buffer is created, in which case VGLite is initialized only for blitting.
|
||||
```c
|
||||
#if LV_USE_GPU_NXP_VG_LITE
|
||||
#include "vg_lite.h"
|
||||
@@ -144,25 +162,21 @@ task or suspend the CPU for power savings.
|
||||
|
||||
#### Project setup:
|
||||
- Add VGLite related files to project:
|
||||
- src/draw/nxp/vglite/lv_gpu_nxp_vglite.c, src/draw/nxp/vglite/lv_gpu_nxp_vglite.h: buffer init, log/trace
|
||||
- src/draw/nxp/vglite/lv_draw_vglite_blend.c, src/draw/nxp/vglite/lv_draw_vglite_blend.h: fill and blit
|
||||
(w/o transformation)
|
||||
- src/draw/nxp/vglite/lv_draw_vglite_rect.c, src/draw/nxp/vglite/lv_draw_vglite_rect.h: rectangle draw
|
||||
- src/draw/nxp/vglite/lv_draw_vglite_arc.c, src/draw/nxp/vglite/lv_draw_vglite_arc.h: arc draw
|
||||
- src/draw/nxp/vglite/lv_draw_vglite.c[.h]: draw context callbacks
|
||||
- src/draw/nxp/vglite/lv_draw_vglite_blend.c[.h]: fill and blit (with optional transformation)
|
||||
- src/draw/nxp/vglite/lv_draw_vglite_rect.c[.h]: draw rectangle
|
||||
- src/draw/nxp/vglite/lv_draw_vglite_arc.c[.h]: draw arc
|
||||
- src/draw/nxp/vglite/lv_draw_vglite_line.c[.h]: draw line
|
||||
- src/draw/nxp/vglite/lv_vglite_buf.c[.h]: init/get vglite buffer
|
||||
- src/draw/nxp/vglite/lv_vglite_utils.c[.h]: function helpers
|
||||
|
||||
#### Logging:
|
||||
- By default, LV_GPU_NXP_VG_LITE_LOG_ERRORS is enabled so that any VGLite error will be seen on LVGL output
|
||||
- For tracing logs about the VGLite limitations, size thresholds or stride alignment, the user can enable
|
||||
LV_GPU_NXP_VG_LITE_LOG_TRACES
|
||||
- By default, `LV_GPU_NXP_VG_LITE_LOG_ERRORS` is enabled so that any VGLite error will be seen on SDK debug console
|
||||
- By default, `LV_GPU_NXP_VG_LITE_LOG_TRACES` is disabled. Enable it for tracing logs (like blit split workaround or
|
||||
VGLite fallback to CPU due to any error on the driver)
|
||||
|
||||
#### Advanced configuration:
|
||||
- There are configurable area thresholds which are used to decide whether the area will be processed by CPU or by
|
||||
VGLite. Areas smaller than a defined value will be processed by CPU and those bigger than the threshold will be
|
||||
processed by VGLite. These thresholds may be defined as preprocessor variables. Default values are defined in
|
||||
lv_draw_vglite_blend.h
|
||||
- `LV_GPU_NXP_VG_LITE_BLIT_SIZE_LIMIT`: size threshold for image BLIT, BLIT with scale and BLIT with rotation
|
||||
(OPA >= LV_OPA_MAX)
|
||||
- `LV_GPU_NXP_VG_LITE_BLIT_OPA_SIZE_LIMIT`: size threshold for image BLIT, BLIT with scale and BLIT with rotation
|
||||
and transparency (OPA < LV_OPA_MAX)
|
||||
- `LV_GPU_NXP_VG_LITE_FILL_SIZE_LIMIT`: size threshold for fill operation (OPA >= LV_OPA_MAX)
|
||||
- `LV_GPU_NXP_VG_LITE_FILL_OPA_SIZE_LIMIT`: size threshold for fill operation with transparency (OPA < LV_OPA_MAX)
|
||||
- Area threshold (size limit) is configurable and used to decide whether the area will be processed by VGLite or not.
|
||||
Areas smaller than the defined value will be processed by CPU and those bigger than the threshold will be processed by
|
||||
VGLite. The threshold is defined as a macro in lv_draw_vglite.c
|
||||
- `LV_GPU_NXP_VG_LITE_SIZE_LIMIT`: size threshold for fill/blit (with optional transformation)
|
||||
|
||||
@@ -15,7 +15,7 @@ The simulator is ported to various IDEs (Integrated Development Environments). C
|
||||
|
||||
- [Eclipse with SDL driver](https://github.com/lvgl/lv_sim_eclipse_sdl): Recommended on Linux and Mac
|
||||
- [CodeBlocks](https://github.com/lvgl/lv_sim_codeblocks_win): Recommended on Windows
|
||||
- [VisualStudio with SDL driver](https://github.com/lvgl/lv_sim_visual_studio_sdl): For Windows
|
||||
- [VisualStudio](https://github.com/lvgl/lv_sim_visual_studio_sdl): For Windows
|
||||
- [VSCode with SDL driver](https://github.com/lvgl/lv_sim_vscode_sdl): Recommended on Linux and Mac
|
||||
- [PlatformIO with SDL driver](https://github.com/lvgl/lv_platformio): Recommended on Linux and Mac
|
||||
- [MDK with FastModel](https://github.com/lvgl/lv_port_an547_cm55_sim): For Windows
|
||||
|
||||
129
docs/get-started/platforms/renesas.md
Normal file
@@ -0,0 +1,129 @@
|
||||
# Renesas
|
||||
The [HMI-Board](https://bit.ly/3I9nfUo) development board SDK now comes with LVGL integration for quick evaluation. Simply download the [SDK](https://github.com/RT-Thread-Studio/sdk-bsp-ra6m3-hmi-board/tree/main/projects/hmi-board-lvgl) for the supported motherboard and you’ll be on your way to creating your next GUI application in no time. For more information, check out the [Software design description](https://github.com/RT-Thread-Studio/sdk-bsp-ra6m3-hmi-board/blob/main/projects/hmi-board-lvgl/README.md).
|
||||
|
||||
## Creating new project with LVGL
|
||||
It is recommended to start your project by downloading the HMI-Board SDK example project. It comes fully equipped with LVGL and dave-2d support (if the modules are present), so you won’t need to do any additional integration work.
|
||||
|
||||
## HW acceleration for Renesas RA6M3 platforms
|
||||
For RA6M3 platforms, hardware acceleration can be achieved using the dave-2d GPU, depending on the platform used. Each accelerator has its own context, allowing them to be used individually or simultaneously in LVGL’s multithreading mode.
|
||||
|
||||
### Dave-2d accelerator
|
||||
LVGL can offload several drawing features to the dave-2d engine, freeing up the CPU for other operations while dave-2d runs. An RTOS is required to block the LVGL drawing thread and switch to another task or suspend the CPU for power savings. Supported draw callbacks can be found in “src/draw/renesas/lv_gpu_d2_ra6m3.c”.
|
||||
|
||||
LVGL can offload several drawing features to the dave-2d engine, freeing up the CPU for other operations while dave-2d runs. An RTOS is required to block the LVGL drawing thread and switch to another task or suspend the CPU for power savings. Supported draw callbacks can be found in “src/draw/renesas/lv_gpu_d2_ra6m3.c”.
|
||||
|
||||
```c
|
||||
ra_2d_draw_ctx->blend = lv_draw_ra6m3_2d_blend;
|
||||
ra_2d_draw_ctx->base_draw.draw_img_decoded = lv_port_gpu_img_decoded;
|
||||
ra_2d_draw_ctx->base_draw.wait_for_finish = lv_port_gpu_wait;
|
||||
ra_2d_draw_ctx->base_draw.draw_letter = lv_draw_gpu_letter;
|
||||
```
|
||||
|
||||
### Features supported:
|
||||
All operations can be used in conjunction with optional transparency.
|
||||
|
||||
- RGB565 and ARGB8888 color formats
|
||||
- Area fill with color
|
||||
- BLIT (BLock Image Transfer)
|
||||
- Color conversion
|
||||
- Rotate and scale
|
||||
- Alpha blending
|
||||
- Bilinear filtering
|
||||
- RTOS integration layer
|
||||
- Default RT-Thread code provided
|
||||
- Subpixel exact placement
|
||||
|
||||
### Basic configuration:
|
||||
- Select Renesas dave-2d engine in lv_conf.h: Set `LV_USE_GPU_RA6M3_G2D` to 1
|
||||
- Set referenced header file in lv_conf.h: `#define LV_GPU_RA6M3_G2D_INCLUDE "hal_data.h"`
|
||||
|
||||
### RT-Thread Example:
|
||||
|
||||
```c
|
||||
#define COLOR_BUFFER (LV_HOR_RES_MAX * LV_VER_RES_MAX)
|
||||
|
||||
static lv_disp_drv_t disp_drv;
|
||||
|
||||
/*A static or global variable to store the buffers*/
|
||||
static lv_color_t buf_1[COLOR_BUFFER];
|
||||
```
|
||||
|
||||
- After initializing your peripherals (such as SPI, GPIOs, and LCD) in the `lv_port_disp_init()` function, you can initialize LVGL using [`lv_init()`.](https://docs.lvgl.io/master/API/core/lv_obj.html#_CPPv47lv_initv) Next, register the frame buffers using `lv_disp_draw_buf_init()` and create a new display driver using `lv_disp_drv_init()`.
|
||||
|
||||
```c
|
||||
/*Initialize `disp_buf` with the buffer(s). With only one buffer use NULL instead buf_2 */
|
||||
lv_disp_draw_buf_init(&disp_buf, buf_1, RT_NULL, COLOR_BUFFER);
|
||||
lv_disp_drv_init(&disp_drv); /*Basic initialization*/
|
||||
|
||||
/*Set the resolution of the display*/
|
||||
disp_drv.hor_res = LV_HOR_RES_MAX;
|
||||
disp_drv.ver_res = LV_VER_RES_MAX;
|
||||
|
||||
/*Set a display buffer*/
|
||||
disp_drv.draw_buf = &disp_buf;
|
||||
|
||||
/*Used to copy the buffer's content to the display*/
|
||||
disp_drv.flush_cb = disp_flush;
|
||||
|
||||
/* Initialize GPU module */
|
||||
lv_port_gpu_hw_init();
|
||||
|
||||
/*Finally register the driver*/
|
||||
lv_disp_drv_register(&disp_drv);
|
||||
```
|
||||
|
||||
* To run LVGL, you’ll need to create a thread. You can find examples of how to do this using RT-Thread in the `env_support/rt-thread/lv_rt_thread_port.c` file.
|
||||
|
||||
```c
|
||||
static void lvgl_thread_entry(void *parameter)
|
||||
{
|
||||
#if LV_USE_LOG
|
||||
lv_log_register_print_cb(lv_rt_log);
|
||||
#endif /* LV_USE_LOG */
|
||||
lv_init();
|
||||
lv_port_disp_init();
|
||||
lv_port_indev_init();
|
||||
lv_user_gui_init();
|
||||
|
||||
/* handle the tasks of LVGL */
|
||||
while(1)
|
||||
{
|
||||
lv_task_handler();
|
||||
rt_thread_mdelay(LV_DISP_DEF_REFR_PERIOD);
|
||||
}
|
||||
}
|
||||
|
||||
static int lvgl_thread_init(void)
|
||||
{
|
||||
rt_err_t err;
|
||||
|
||||
/* create lvgl thread */
|
||||
err = rt_thread_init(&lvgl_thread, "LVGL", lvgl_thread_entry, RT_NULL,
|
||||
&lvgl_thread_stack[0], sizeof(lvgl_thread_stack), PKG_LVGL_THREAD_PRIO, 10);
|
||||
if(err != RT_EOK)
|
||||
{
|
||||
LOG_E("Failed to create LVGL thread");
|
||||
return -1;
|
||||
}
|
||||
rt_thread_startup(&lvgl_thread);
|
||||
|
||||
return 0;
|
||||
}
|
||||
INIT_ENV_EXPORT(lvgl_thread_init);
|
||||
```
|
||||
|
||||
- The last step is to create a function to output the frame buffer to your LCD. The specifics of this function will depend on the features of your MCU. Here’s an example for a typical MCU interface: `my_flush_cb`.
|
||||
|
||||
```c
|
||||
static void my_flush_cb(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p)
|
||||
{
|
||||
#ifdef PKG_USING_ILI9341
|
||||
lcd_fill_array_spi(area->x1, area->y1, area->x2, area->y2, color_p);
|
||||
#elif LV_USE_GPU_RA6M3_G2D
|
||||
lv_port_gpu_blit(area->x1, area->y1, color_p, area);
|
||||
#else
|
||||
......
|
||||
#endif
|
||||
lv_disp_flush_ready(disp_drv);
|
||||
}
|
||||
```
|
||||
@@ -31,7 +31,7 @@ In 2021, Tasmota added full support of LVGL for ESP32 based devices. It also int
|
||||
|
||||
A comprehensive mapping of LVGL in Berry language is now available, similar to the mapping of Micropython. It allows to use +98% of all LVGL features. It is also possible to write custom widgets in Berry.
|
||||
|
||||
Versions supported: LVGL v8.0.2, LodePNG v20201017, Freetype 2.10.4
|
||||
Versions supported: LVGL v8.3.0, LodePNG v20201017, Freetype 2.10.4
|
||||
|
||||
### Tasmota + Berry + LVGL could be used for:
|
||||
|
||||
|
||||
@@ -132,7 +132,7 @@ LVGL needs just one simple driver function to copy an array of pixels into a giv
|
||||
If you can do this with your display then you can use it with LVGL.
|
||||
|
||||
Some examples of the supported display types:
|
||||
- TFTs with 16 or 24 bit color depth
|
||||
- TFTs with 16 or 32 bit color depth
|
||||
- Monitors with an HDMI port
|
||||
- Small monochrome displays
|
||||
- Gray-scale displays
|
||||
|
||||
@@ -2,14 +2,38 @@
|
||||
# File System Interfaces
|
||||
|
||||
LVGL has a [File system](https://docs.lvgl.io/master/overview/file-system.html) module to provide an abstraction layer for various file system drivers.
|
||||
You still need to provide the drivers and libraries, this extension provides only the bridge between FATFS, LittleFS, STDIO, POSIX, WIN32 and LVGL.
|
||||
|
||||
LVG has built in support for:
|
||||
- [FATFS](http://elm-chan.org/fsw/ff/00index_e.html)
|
||||
- STDIO (Linux and Windows using C standard function .e.g fopen, fread)
|
||||
- POSIX (Linux and Windows using POSIX function .e.g open, read)
|
||||
- WIN32 (Windows using Win32 API function .e.g CreateFileA, ReadFile)
|
||||
## Built in wrappers
|
||||
|
||||
You still need to provide the drivers and libraries, this extension provides only the bridge between FATFS, STDIO, POSIX, WIN32 and LVGL.
|
||||
### FATFS
|
||||
|
||||
Bridge for [FatFS](http://elm-chan.org/fsw/ff/00index_e.html). FatFS itself is not part of LVGL, but can be added and initialized externally.
|
||||
|
||||
|
||||
### LittleFS
|
||||
|
||||
Though `lv_fs_littlefs` uses [LittleFS]((https://github.com/littlefs-project/littlefs)) API, the LittleFS library needs other external libraries that handle the mounting of partitions and low-level accesses, according to the given architecture. The functions for the latter are given to the lfs_t structure as pointers by an external low-level library.
|
||||
|
||||
There's a convenience function called `lv_fs_littlefs_set_driver(LV_FS_LITTLEFS_LETTER, my_lfs)`, specific to `lv_fs_littlefs`, to attach a `lfs_t` object's pointer to a registered driver-letter. See its comments for more info.
|
||||
|
||||
|
||||
[esp_littlefs](https://components.espressif.com/components/joltwallet/littlefs) is a wrapper for LittleFS to be used in Espressif ESP-devices. It handles the mounting and has the low-level `littlefs_api` functions to read/write/erase blocks that LittleFS library needs. On mounting by `esp_littlefs` the `lfs_t` structures are created. You need to get a handle to these to use ESP with `lv_fs_littlefs`, as all functions use that `lfs_t` in LittleFS to identify the mounted partition.
|
||||
|
||||
|
||||
In case you don't find a special function in the `lv_fs_littlefs` wrapper, you can look for it in the `esp_littlefs` API and use it directly, as `lv_fs_littlefs` and the `esp_littlefs` APIs can be used side-by-side.
|
||||
|
||||
### STDIO
|
||||
|
||||
Bride to C standard functions on Linux and Windows. For example `fopen`, `fread`, etc.
|
||||
|
||||
### POSIX
|
||||
|
||||
Bride to POSIX functions on Linux and Windows. For example `open`, `read`, etc.
|
||||
|
||||
### WIN32
|
||||
|
||||
Bride to Win32 API function. For example `CreateFileA`, `ReadFile`, etc.
|
||||
|
||||
## Usage
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
png
|
||||
gif
|
||||
freetype
|
||||
tiny_ttf
|
||||
qrcode
|
||||
rlottie
|
||||
ffmpeg
|
||||
|
||||
@@ -12,7 +12,6 @@ Allow the use of JPG images in LVGL. Besides that it also allows the use of a cu
|
||||
- File read from file and c-array are implemented.
|
||||
- SJPEG frame fragment cache enables fast fetching of lines if available in cache.
|
||||
- By default the sjpg image cache will be image width * 2 * 16 bytes (can be modified)
|
||||
- Currently only 16 bit image format is supported (TODO)
|
||||
- Only the required partion of the JPG and SJPG images are decoded, therefore they can't be zoomed or rotated.
|
||||
|
||||
## Usage
|
||||
|
||||
35
docs/libs/tiny_ttf.md
Normal file
@@ -0,0 +1,35 @@
|
||||
# Tiny TTF font engine
|
||||
|
||||
## Usage
|
||||
|
||||
Use https://github.com/nothings/stb to render TrueType fonts in LVGL.
|
||||
|
||||
When enabled in `lv_conf.h` with `LV_USE_TINY_TTF`
|
||||
`lv_tiny_ttf_create_data(data, data_size, font_size)` can be used to
|
||||
create a TTF font instance at the specified font size. You can then
|
||||
use that font anywhere `lv_font_t` is accepted.
|
||||
|
||||
By default, the TTF or OTF file must be embedded as an array, either in
|
||||
a header, or loaded into RAM in order to function.
|
||||
|
||||
However, if `LV_TINY_TTF_FILE_SUPPORT` is enabled,
|
||||
`lv_tiny_ttf_create_file(path, font_size)` will also be available,
|
||||
allowing tiny_ttf to stream from a file. The file must remain open the
|
||||
entire time the font is being used, and streaming on demand may be
|
||||
considerably slower.
|
||||
|
||||
After a font is created, you can change the font size in pixels by using
|
||||
`lv_tiny_ttf_set_size(font, font_size)`.
|
||||
|
||||
By default, a font will use up to 4KB of cache to speed up rendering
|
||||
glyphs. This maximum can be changed by using
|
||||
`lv_tiny_ttf_create_data_ex(data, data_size, font_size, cache_size)`
|
||||
or `lv_tiny_ttf_create_file_ex(path, font_size, cache_size)` (when
|
||||
available). The cache size is indicated in bytes.
|
||||
|
||||
## API
|
||||
|
||||
```eval_rst
|
||||
.. doxygenfile:: lv_tiny_ttf.h
|
||||
:project: lvgl
|
||||
```
|
||||
@@ -37,7 +37,7 @@ void update_snapshot(lv_obj_t * obj, lv_obj_t * img_snapshot)
|
||||
```
|
||||
|
||||
### Use Existing Buffer
|
||||
If the snapshot needs update now and then, or simply caller provides memory, use API `lv_res_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_img_cf_t cf, lv_img_dsc_t * dsc, void * buf, uint32_t buff_size);` for this case. It's caller's responsibility to alloc/free the memory.
|
||||
If the snapshot needs update now and then, or simply caller provides memory, use API `lv_res_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_img_cf_t cf, lv_img_dsc_t * dsc, void * buf, uint32_t buf_size);` for this case. It's caller's responsibility to alloc/free the memory.
|
||||
|
||||
|
||||
If snapshot is generated successfully, the image descriptor is updated and image data will be stored to provided `buf`.
|
||||
|
||||
@@ -63,12 +63,11 @@ See the [Display background](#display-background) section for more details. If t
|
||||
This configuration (transparent screen and display) could be used to create for example OSD menus where a video is played on a lower layer, and a menu is overlayed on an upper layer.
|
||||
|
||||
To handle transparent displays, special (slower) color mixing algorithms need to be used by LVGL so this feature needs to enabled with `LV_COLOR_SCREEN_TRANSP` in `lv_conf.h`.
|
||||
As this mode operates on the Alpha channel of the pixels `LV_COLOR_DEPTH = 32` is also required. The Alpha channel of 32-bit colors will be 0 where there are no objects and 255 where there are solid objects.
|
||||
The Alpha channel of 32-bit colors will be 0 where there are no objects and 255 where there are solid objects.
|
||||
|
||||
In summary, to enable transparent screens and displays for OSD menu-like UIs:
|
||||
- Enable `LV_COLOR_SCREEN_TRANSP` in `lv_conf.h`
|
||||
- Be sure to use `LV_COLOR_DEPTH 32`
|
||||
- Set the screen's opacity to `LV_OPA_TRANSP` e.g. with `lv_obj_set_style_local_bg_opa(lv_scr_act(), LV_OBJMASK_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP)`
|
||||
- Set the screen's opacity to `LV_OPA_TRANSP` e.g. with `lv_obj_set_style_bg_opa(lv_scr_act(), LV_OPA_TRANSP, LV_PART_MAIN)`
|
||||
- Set the display opacity to `LV_OPA_TRANSP` with `lv_disp_set_bg_opa(NULL, LV_OPA_TRANSP);`
|
||||
|
||||
## Features of displays
|
||||
|
||||
@@ -99,11 +99,12 @@ This means it's enough to set the base direction of a screen and every object wi
|
||||
|
||||
The default base direction for screens can be set by `LV_BIDI_BASE_DIR_DEF` in *lv_conf.h* and other objects inherit the base direction from their parent.
|
||||
|
||||
To set an object's base direction use `lv_obj_set_base_dir(obj, base_dir)`. The possible base directions are:
|
||||
- `LV_BIDI_DIR_LTR`: Left to Right base direction
|
||||
- `LV_BIDI_DIR_RTL`: Right to Left base direction
|
||||
- `LV_BIDI_DIR_AUTO`: Auto detect base direction
|
||||
- `LV_BIDI_DIR_INHERIT`: Inherit base direction from the parent (or a default value for non-screen objects)
|
||||
To set an object's base direction use `lv_obj_set_style_base_dir(obj, base_dir,selector)`. The possible base directions are:
|
||||
- `LV_BASE_DIR_LTR`: Left to Right base direction
|
||||
- `LV_BASE_DIR_RTL`: Right to Left base direction
|
||||
- `LV_BASE_DIR_AUTO`: Auto detect base direction
|
||||
- `LV_BASE_DIR_NEUTRAL`
|
||||
- `LV_BASE_DIR_WEAK`
|
||||
|
||||
This list summarizes the effect of RTL base direction on objects:
|
||||
- Create objects by default on the right
|
||||
@@ -112,6 +113,7 @@ This list summarizes the effect of RTL base direction on objects:
|
||||
- `lv_btnmatrix`: Shows buttons from right to left
|
||||
- `lv_list`: Shows icons on the right
|
||||
- `lv_dropdown`: Aligns options to the right
|
||||
- `lv_bar`: Shows progress from right to left
|
||||
- The texts in `lv_table`, `lv_btnmatrix`, `lv_keyboard`, `lv_tabview`, `lv_dropdown`, `lv_roller` are "BiDi processed" to be displayed correctly
|
||||
|
||||
### Arabic and Persian support
|
||||
|
||||
@@ -34,11 +34,11 @@ lv_label_set_text(label2, "Button 2"); /*Set the text of the label*/
|
||||
lv_obj_del(label2);
|
||||
```
|
||||
|
||||
## Bring to the foreground
|
||||
## Change order
|
||||
|
||||
There are four explicit ways to bring an object to the foreground:
|
||||
- Use `lv_obj_move_foreground(obj)` to bring an object to the foreground. Similarly, use `lv_obj_move_background(obj)` to move it to the background.
|
||||
- Use `lv_obj_move_up(obj)` to move an object one position up in the hierarchy, Similarly, use `lv_obj_move_down(obj)` to move an object one position down in the hierarchy.
|
||||
- Use `lv_obj_move_to_index(obj, idx)` to move an object to a given index in the order of children. (0: backgroud, child_num - 1: foreground, <0: count from the top, to move forward (up): `lv_obj_move_to_index(obj, lv_obj_get_index(obj) - 1)`)
|
||||
- Use `lv_obj_swap(obj1, obj2)` to swap the relative layer position of two objects.
|
||||
- When `lv_obj_set_parent(obj, new_parent)` is used, `obj` will be on the foreground of the `new_parent`.
|
||||
|
||||
|
||||
@@ -173,7 +173,7 @@ All inputs are disabled during the screen animation.
|
||||
Screens are created on the currently selected *default display*.
|
||||
The *default display* is the last registered display with `lv_disp_drv_register`. You can also explicitly select a new default display using `lv_disp_set_default(disp)`.
|
||||
|
||||
`lv_scr_act()`, `lv_scr_load()` and `lv_scr_load_anim()` operate on the default screen.
|
||||
`lv_scr_act()`, `lv_scr_load()` and `lv_scr_load_anim()` operate on the default display.
|
||||
|
||||
Visit [Multi-display support](/overview/display) to learn more.
|
||||
|
||||
|
||||
@@ -1,4 +1,32 @@
|
||||
# ARM-2D GPU
|
||||
# Arm-2D GPU
|
||||
|
||||
TODO
|
||||
Arm-2D is not a GPU but **an abstraction layer for 2D GPUs dedicated to Microcontrollers**. It supports all Cortex-M processors ranging from Cortex-M0 to the latest Cortex-M85.
|
||||
|
||||
Arm-2D is an open-source project on Github. For more, please refer to: https://github.com/ARM-software/Arm-2D.
|
||||
|
||||
|
||||
|
||||
## How to Use
|
||||
|
||||
In general, you can set the macro `LV_USE_GPU_ARM2D` to `1`in `lv_conf.h` to enable Arm-2D acceleration for LVGL.
|
||||
|
||||
If you are using **[CMSIS-Pack](https://github.com/lvgl/lvgl/tree/master/env_support/cmsis-pack)** to deploy the LVGL. You don't have to define the macro `LV_USE_GPU_ARM2D` manually, instead, please select the component `GPU Arm-2D` in the **RTE** dialog. This step will define the macro for us.
|
||||
|
||||
|
||||
|
||||
## Design Considerations
|
||||
|
||||
As mentioned before, Arm-2D is an abstraction layer for 2D GPU; hence if there is no accelerator or dedicated instruction set (such as Helium or ACI) available for Arm-2D, it provides negligible performance boost for LVGL (sometimes worse) for regular Cortex-M processors.
|
||||
|
||||
**We highly recommend you enable Arm-2D acceleration for LVGL** when:
|
||||
|
||||
- The target processors are **Cortex-M55** and/or **Cortex-M85**
|
||||
- The target processors support **[Helium](https://developer.arm.com/documentation/102102/0103/?lang=en)**.
|
||||
- The device vendor provides an arm-2d compliant driver for their propriotory 2D accelerators and/or customized instruction set.
|
||||
- The target device contains [DMA-350](https://community.arm.com/arm-community-blogs/b/internet-of-things-blog/posts/arm-corelink-dma-350-next-generation-direct-memory-access-for-endpoint-ai)
|
||||
|
||||
|
||||
|
||||
## Examples
|
||||
|
||||
- [A Cortex-M55 (supports Helium) based MDK Project, PC emulation is available.](https://github.com/lvgl/lv_port_an547_cm55_sim)
|
||||
|
||||
@@ -355,7 +355,7 @@ Set the opacity of the border. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means full
|
||||
</ul>
|
||||
|
||||
### border_width
|
||||
Set hte width of the border. Only pixel values can be used.
|
||||
Set the width of the border. Only pixel values can be used.
|
||||
<ul>
|
||||
<li style='display:inline; margin-right: 20px; margin-left: 0px'><strong>Default</strong> 0</li>
|
||||
<li style='display:inline; margin-right: 20px; margin-left: 0px'><strong>Inherited</strong> No</li>
|
||||
@@ -708,6 +708,15 @@ Scale down all opacity values of the object by this factor. Value 0, `LV_OPA_0`
|
||||
<li style='display:inline; margin-right: 20px; margin-left: 0px'><strong>Ext. draw</strong> No</li>
|
||||
</ul>
|
||||
|
||||
### opa_layered
|
||||
First draw the object on the layer, then scale down layer opacity factor. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values or LV_OPA_10, LV_OPA_20, etc means semi transparency.
|
||||
<ul>
|
||||
<li style='display:inline; margin-right: 20px; margin-left: 0px'><strong>Default</strong> `LV_OPA_COVER`</li>
|
||||
<li style='display:inline; margin-right: 20px; margin-left: 0px'><strong>Inherited</strong> Yes</li>
|
||||
<li style='display:inline; margin-right: 20px; margin-left: 0px'><strong>Layout</strong> No</li>
|
||||
<li style='display:inline; margin-right: 20px; margin-left: 0px'><strong>Ext. draw</strong> No</li>
|
||||
</ul>
|
||||
|
||||
### color_filter_dsc
|
||||
Mix a color to all colors of the object.
|
||||
<ul>
|
||||
@@ -772,7 +781,7 @@ Describes how to blend the colors to the background. The possible values are `LV
|
||||
</ul>
|
||||
|
||||
### layout
|
||||
Set the layout if the object. The children will be repositioned and resized according to the policies set for the layout. For the possible values see the documentation of the layouts.
|
||||
Set the layout of the object. The children will be repositioned and resized according to the policies set for the layout. For the possible values see the documentation of the layouts.
|
||||
<ul>
|
||||
<li style='display:inline; margin-right: 20px; margin-left: 0px'><strong>Default</strong> 0</li>
|
||||
<li style='display:inline; margin-right: 20px; margin-left: 0px'><strong>Inherited</strong> No</li>
|
||||
|
||||
@@ -204,6 +204,10 @@ The default rotation of your display when it is initialized can be set using the
|
||||
|
||||
Display rotation can also be changed at runtime using the `lv_disp_set_rotation(disp, rot)` API.
|
||||
|
||||
If you enable rotation the coordinates of the pointer input devices (e.g. touchpad) will be rotated too.
|
||||
|
||||
Note that when using software rotation, you cannot use neither `direct_mode` nor `full_refresh` in the driver. When using either of these, you will have to rotate the pixels yourself e.g. in the `flush_cb`.
|
||||
|
||||
Support for software rotation is a new feature, so there may be some glitches/bugs depending on your configuration. If you encounter a problem please open an issue on [GitHub](https://github.com/lvgl/lvgl/issues).
|
||||
|
||||
### Decoupling the display refresh timer
|
||||
|
||||
@@ -114,7 +114,7 @@ You need to have 3 buttons available:
|
||||
- `LV_KEY_RIGHT` will simulate turning encoder right
|
||||
- other keys will be passed to the focused widget
|
||||
|
||||
If you hold the keys it will simulate an encoder advance with period specified in `indev_drv.long_press_rep_time`.
|
||||
If you hold the keys it will simulate an encoder advance with period specified in `indev_drv.long_press_repeat_time`.
|
||||
|
||||
```c
|
||||
indev_drv.type = LV_INDEV_TYPE_ENCODER;
|
||||
@@ -172,7 +172,7 @@ The default value of the following parameters can be changed in `lv_indev_drv_t`
|
||||
- `scroll_limit` Number of pixels to slide before actually scrolling the object.
|
||||
- `scroll_throw` Scroll throw (momentum) slow-down in [%]. Greater value means faster slow-down.
|
||||
- `long_press_time` Press time to send `LV_EVENT_LONG_PRESSED` (in milliseconds)
|
||||
- `long_press_rep_time` Interval of sending `LV_EVENT_LONG_PRESSED_REPEAT` (in milliseconds)
|
||||
- `long_press_repeat_time` Interval of sending `LV_EVENT_LONG_PRESSED_REPEAT` (in milliseconds)
|
||||
- `read_timer` pointer to the `lv_timer` which reads the input device. Its parameters can be changed by `lv_timer_...()` functions. `LV_INDEV_DEF_READ_PERIOD` in `lv_conf.h` sets the default read period.
|
||||
|
||||
### Feedback
|
||||
|
||||
@@ -25,7 +25,7 @@ So in the example the first row will have 2 buttons each with 50% width and a se
|
||||
The buttons' width can be set relative to the other button in the same row with `lv_btnmatrix_set_btn_width(btnm, btn_id, width)`
|
||||
E.g. in a line with two buttons: *btnA, width = 1* and *btnB, width = 2*, *btnA* will have 33 % width and *btnB* will have 66 % width.
|
||||
It's similar to how the [`flex-grow`](https://developer.mozilla.org/en-US/docs/Web/CSS/flex-grow) property works in CSS.
|
||||
The width must be in the \[1..7\] range and the default width is 1.
|
||||
The width must be in the \[1..15\] range and the default width is 1.
|
||||
|
||||
In addition to the width, each button can be customized with the following parameters:
|
||||
- `LV_BTNMATRIX_CTRL_HIDDEN` Makes a button hidden (hidden buttons still take up space in the layout, they are just not visible or clickable)
|
||||
|
||||
@@ -43,7 +43,7 @@ Options are passed to the drop-down list as a string with `lv_dropdown_set_optio
|
||||
|
||||
The `lv_dropdown_add_option(dropdown, "New option", pos)` function inserts a new option to `pos` index.
|
||||
|
||||
To save memory the options can set from a static(constant) string too with `lv_dropdown_set_static_options(dropdown, options)`.
|
||||
To save memory the options can set from a static(constant) string too with `lv_dropdown_set_options_static(dropdown, options)`.
|
||||
In this case the options string should be alive while the drop-down list exists and `lv_dropdown_add_option` can't be used
|
||||
|
||||
You can select an option manually with `lv_dropdown_set_selected(dropdown, id)`, where `id` is the index of an option.
|
||||
|
||||
@@ -44,7 +44,9 @@ This is not the case with `lv_label_set_text_static`. The buffer you pass to `lv
|
||||
|
||||
### Text recolor
|
||||
In the text, you can use commands to recolor parts of the text. For example: `"Write a #ff0000 red# word"`.
|
||||
This feature can be enabled individually for each label by `lv_label_set_recolor()` function.
|
||||
This feature can be enabled individually for each label by `lv_label_set_recolor()` function,
|
||||
recoloring is only supported when the text wrapped with `##ff0000 ... #`sintax is in one line,
|
||||
it is not supported in wrapped text, see example `Line wrap, recoloring and scrolling`.
|
||||
|
||||
### Text selection
|
||||
If enabled by `LV_LABEL_TEXT_SELECTION` part of the text can be selected. It's similar to when you use your mouse on a PC to select a text.
|
||||
|
||||
@@ -18,6 +18,8 @@ Options are passed to the Roller as a string with `lv_roller_set_options(roller,
|
||||
|
||||
You can select an option manually with `lv_roller_set_selected(roller, id, LV_ANIM_ON/OFF)`, where *id* is the index of an option.
|
||||
|
||||
If the roller has a lot of options then especially in infinite mode the rendered options of the display might look scrambled. In this case `LV_USE_LARGE_COORD` should be enabled in `lv_conf.h`
|
||||
|
||||
### Get selected option
|
||||
To get the *index* of the currently selected option use `lv_roller_get_selected(roller)`.
|
||||
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
# Calendar (lv_calendar)
|
||||
|
||||
**From v8.1 the header is added directly into the Calendar widget and the API of the headers has been changed.**
|
||||
|
||||
## Overview
|
||||
|
||||
The Calendar object is a classic calendar which can:
|
||||
@@ -13,13 +15,16 @@ The Calendar is added to the default group (if it is set). Calendar is an editab
|
||||
To make the Calendar flexible, by default it doesn't show the current year or month. Instead, there are optional "headers" that can be attached to the calendar.
|
||||
|
||||
## Parts and Styles
|
||||
The calendar object uses the [Button matrix](/widgets/core/btnmatrix) object under the hood to arrange the days into a matrix.
|
||||
- `LV_PART_MAIN` The background of the calendar. Uses all the background related style properties.
|
||||
- `LV_PART_ITEMS` Refers to the dates and day names. Button matrix control flags are set to differentiate the buttons and a custom drawer event is added modify the properties of the buttons as follows:
|
||||
- day names have no border, no background and drawn with a gray color
|
||||
- days of the previous and next month have `LV_BTNMATRIX_CTRL_DISABLED` flag
|
||||
- today has a thicker border with the theme's primary color
|
||||
- highlighted days have some opacity with the theme's primary color.
|
||||
The Calendar is composed of 3 widegets
|
||||
- Container: A rectangle which is a container for the *Header* and the *Days*. Uses only `LV_PART_MAIN` where all the background related style properties are working.
|
||||
- Days: It's a [Button matrix](/widgets/core/btnmatrix) object under the hood to arrange the days into a matrix. `lv_calendar_get_btnmatrix(calendar)` can be used to get it.
|
||||
- `LV_PART_MAIN` The background of the calendar. Uses all the background related style properties.
|
||||
- `LV_PART_ITEMS` Refers to the dates and day names. Button matrix control flags are set to differentiate the buttons and a custom drawer event is added modify the properties of the buttons as follows:
|
||||
- day names have no border, no background and drawn with a gray color
|
||||
- days of the previous and next month have `LV_BTNMATRIX_CTRL_DISABLED` flag
|
||||
- today has a thicker border with the theme's primary color
|
||||
- highlighted days have some opacity with the theme's primary color.
|
||||
- Header: Not created by default, the details are up to the given header.
|
||||
|
||||
## Usage
|
||||
|
||||
@@ -40,6 +45,13 @@ Only the array's pointer will be saved so the array should be a static or global
|
||||
The name of the days can be adjusted with `lv_calendar_set_day_names(calendar, day_names)` where `day_names` looks like `const char * day_names[7] = {"Su", "Mo", ...};`
|
||||
Only the pointer of the day names is saved so the elements should be static, global or constant variables.
|
||||
|
||||
### Custom year list
|
||||
|
||||
Sets a custom year list with `lv_calendar_header_dropdown_set_year_list(calendar, years_list)`
|
||||
where ``years_list`` is a pointer to the custom years list. It can be a constant string
|
||||
like ``static const char * years = "2023\n2022\n2021\n2020\n2019";``,
|
||||
or can be generated dynamically into a buffer as well.
|
||||
|
||||
## Events
|
||||
- `LV_EVENT_VALUE_CHANGED` Sent if a date is clicked. `lv_calendar_get_pressed_date(calendar, &date)` set `date` to the date currently being pressed. Returns `LV_RES_OK` if there is a valid pressed date, else `LV_RES_INV`.
|
||||
|
||||
@@ -53,8 +65,6 @@ Learn more about [Keys](/overview/indev).
|
||||
|
||||
## Headers
|
||||
|
||||
**From v8.1 the header is added directly into the Calendar widget and the API of the headers has been changed.**
|
||||
|
||||
### Arrow buttons
|
||||
|
||||
`lv_calendar_header_arrow_create(calendar)` creates a header that contains a left and right arrow on the sides and a text with the current year and month between them.
|
||||
|
||||
@@ -67,7 +67,7 @@ The keyboard has a **default event handler** callback called `lv_keyboard_def_ev
|
||||
Learn more about [Events](/overview/event).
|
||||
|
||||
## Keys
|
||||
- `LV_KEY_RIGHT/UP/LEFT/RIGHT` To navigate among the buttons and select one.
|
||||
- `LV_KEY_DOWN/UP/LEFT/RIGHT` To navigate among the buttons and select one.
|
||||
- `LV_KEY_ENTER` To press/release the selected button.
|
||||
|
||||
Learn more about [Keys](/overview/indev).
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
# Meter (lv_meter)
|
||||
|
||||
## Overview
|
||||
The Meter widget can visualize data in very flexible ways. In can show arcs, needles, ticks lines and labels.
|
||||
The Meter widget can visualize data in very flexible ways. It can show arcs, needles, ticks lines and labels.
|
||||
|
||||
## Parts and Styles
|
||||
- `LV_PART_MAIN` The background of the Meter. Uses the typical background properties.
|
||||
- `LV_PART_TICK` The tick lines a labels using the *line* and *text* style properties.
|
||||
- `LV_PART_TICKS` The tick lines a labels using the *line* and *text* style properties.
|
||||
- `LV_PART_INDICATOR` The needle line or image using the *line* and *img* style properties, as well as the background properties to draw a square (or circle) on the pivot of the needles. Padding makes the square larger.
|
||||
- `LV_PART_ITEMS` The arcs using the *arc* properties.
|
||||
|
||||
@@ -18,7 +18,7 @@ The Scale has minor and major ticks and labels on the major ticks. Later indicat
|
||||
|
||||
Any number of scales can be added to Meter.
|
||||
|
||||
The minor tick lines can be configured with: `lv_meter_set_scale_ticks(meter, scale, tick_count, line_width, tick_length, ctick_olor)`.
|
||||
The minor tick lines can be configured with: `lv_meter_set_scale_ticks(meter, scale, tick_count, line_width, tick_length, tick_color)`.
|
||||
|
||||
To add major tick lines use `lv_meter_set_scale_major_ticks(meter, scale, nth_major, tick_width, tick_length, tick_color, label_gap)`. `nth_major` to specify how many minor ticks to skip to draw a major tick.
|
||||
|
||||
@@ -46,7 +46,7 @@ All the indicator add functions return `lv_meter_indicator_t *`.
|
||||
`lv_meter_set_indicator_value(meter, inidicator, value)` sets the value of the indicator.
|
||||
|
||||
#### Arc
|
||||
`indic = lv_meter_add_arc(meter, scale, arc_width, arc_color, r_mod)` adds and arc indicator. . By default, the radius of the arc is the same as the scale's radius but `r_mod` changes the radius.
|
||||
`indic = lv_meter_add_arc(meter, scale, arc_width, arc_color, r_mod)` adds an arc indicator. By default, the radius of the arc is the same as the scale's radius but `r_mod` changes the radius.
|
||||
|
||||
`lv_meter_set_indicator_start_value(meter, indic, value)` and `lv_meter_set_indicator_end_value(meter, inidicator, value)` sets the value of the indicator.
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ like label object, the spangroup can be set to one the following modes:
|
||||
use function `lv_spangroup_set_align(spangroup, LV_TEXT_ALIGN_CENTER)` to set text align.
|
||||
|
||||
### Modes
|
||||
The spangroup can be set to one the following modes:
|
||||
The spangroup can be set to one of the following modes:
|
||||
- `LV_SPAN_MODE_FIXED` fixes the object size.
|
||||
- `LV_SPAN_MODE_EXPAND` Expand the object size to the text size but stay on a single line.
|
||||
- `LV_SPAN_MODE_BREAK` Keep width, break the too long lines and auto expand height.
|
||||
@@ -45,14 +45,14 @@ The spangroup can be set to one the following modes:
|
||||
Use `lv_spangroup_set_mode(spangroup, LV_SPAN_MODE_BREAK)` to set object mode.
|
||||
|
||||
### Overflow
|
||||
The spangroup can be set to one the following modes:
|
||||
The spangroup can be set to one of the following modes:
|
||||
- `LV_SPAN_OVERFLOW_CLIP` truncates the text at the limit of the area.
|
||||
- `LV_SPAN_OVERFLOW_ELLIPSIS` will display an ellipsis(`...`) when text overflows the area.
|
||||
|
||||
Use `lv_spangroup_set_overflow(spangroup, LV_SPAN_OVERFLOW_CLIP)` to set object overflow mode.
|
||||
|
||||
### first line indent
|
||||
Use `lv_spangroup_set_indent(spangroup, 20)` to set the indent of the first line. all modes support pixel units, in addition to LV_SPAN_MODE_FIXED and LV_SPAN_MODE_BREAK mode supports percentage units too.
|
||||
Use `lv_spangroup_set_indent(spangroup, 20)` to set the indent of the first line. All modes support pixel units, in addition to LV_SPAN_MODE_FIXED and LV_SPAN_MODE_BREAK mode supports percentage units too.
|
||||
|
||||
### lines
|
||||
Use `lv_spangroup_set_lines(spangroup, 10)` to set the maximum number of lines to be displayed in LV_SPAN_MODE_BREAK mode, negative values indicate no limit.
|
||||
|
||||
@@ -38,7 +38,7 @@ Learn more about [Events](/overview/event).
|
||||
## Keys
|
||||
- `LV_KEY_LEFT/RIGHT` With *Keypad* move the cursor left/right. With *Encoder* decrement/increment the selected digit.
|
||||
- `LV_KEY_UP/DOWN` With *Keypad* and *Encoder* increment/decrement the value.
|
||||
- `LV_KEY_ENTER` With *Encoder* got the net digit. Jump to the first after the last.
|
||||
- `LV_KEY_ENTER` With *Encoder* got the next digit. Jump to the first after the last.
|
||||
|
||||
## Example
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ The parts are identical to the parts of [lv_arc](/widgets/core/arc).
|
||||
To create a spinner use `lv_spinner_create(parent, spin_time, arc_length)`. `spin time` sets the spin time in milliseconds, `arc_length` sets the length of the spinning arc in degrees.
|
||||
|
||||
## Events
|
||||
No special events are sent to the Spinner.
|
||||
No special events are sent by the Spinner.
|
||||
|
||||
See the events of the [Arc](/widgets/core/arc) too.
|
||||
|
||||
|
||||
@@ -63,6 +63,18 @@ install(
|
||||
FILES_MATCHING
|
||||
PATTERN "*.h")
|
||||
|
||||
install(
|
||||
FILES "${LV_CONF_PATH}"
|
||||
DESTINATION "${CMAKE_INSTALL_PREFIX}/${INC_INSTALL_DIR}/../"
|
||||
RENAME "lv_conf.h"
|
||||
OPTIONAL)
|
||||
|
||||
configure_file("${LVGL_ROOT_DIR}/lvgl.pc.in" lvgl.pc @ONLY)
|
||||
|
||||
install(
|
||||
FILES "${CMAKE_BINARY_DIR}/lvgl.pc"
|
||||
DESTINATION "${LIB_INSTALL_DIR}/pkgconfig/")
|
||||
|
||||
set_target_properties(
|
||||
lvgl
|
||||
PROPERTIES OUTPUT_NAME lvgl
|
||||
|
||||
@@ -12,22 +12,43 @@ if(LV_MICROPYTHON)
|
||||
${LVGL_ROOT_DIR}/../
|
||||
REQUIRES
|
||||
main)
|
||||
|
||||
target_compile_definitions(${COMPONENT_LIB}
|
||||
INTERFACE "-DLV_CONF_INCLUDE_SIMPLE")
|
||||
|
||||
if(CONFIG_LV_ATTRIBUTE_FAST_MEM_USE_IRAM)
|
||||
target_compile_definitions(${COMPONENT_LIB}
|
||||
INTERFACE "-DLV_ATTRIBUTE_FAST_MEM=IRAM_ATTR")
|
||||
endif()
|
||||
else()
|
||||
idf_component_register(SRCS ${SOURCES} INCLUDE_DIRS ${LVGL_ROOT_DIR}
|
||||
${LVGL_ROOT_DIR}/src ${LVGL_ROOT_DIR}/../)
|
||||
|
||||
target_compile_definitions(${COMPONENT_LIB} PUBLIC "-DLV_CONF_INCLUDE_SIMPLE")
|
||||
|
||||
if(CONFIG_LV_ATTRIBUTE_FAST_MEM_USE_IRAM)
|
||||
target_compile_definitions(${COMPONENT_LIB}
|
||||
PUBLIC "-DLV_ATTRIBUTE_FAST_MEM=IRAM_ATTR")
|
||||
if(CONFIG_LV_BUILD_EXAMPLES)
|
||||
file(GLOB_RECURSE EXAMPLE_SOURCES ${LVGL_ROOT_DIR}/examples/*.c)
|
||||
set_source_files_properties(${EXAMPLE_SOURCES} COMPILE_FLAGS "-Wno-unused-variable -Wno-format")
|
||||
endif()
|
||||
|
||||
if(CONFIG_LV_USE_DEMO_WIDGETS)
|
||||
file(GLOB_RECURSE DEMO_WIDGETS_SOURCES ${LVGL_ROOT_DIR}/demos/widgets/*.c)
|
||||
list(APPEND DEMO_SOURCES ${DEMO_WIDGETS_SOURCES})
|
||||
endif()
|
||||
if(CONFIG_LV_USE_DEMO_KEYPAD_AND_ENCODER)
|
||||
file(GLOB_RECURSE DEMO_KEYPAD_AND_ENCODER_SOURCES ${LVGL_ROOT_DIR}/demos/keypad_encoder/*.c)
|
||||
list(APPEND DEMO_SOURCES ${DEMO_KEYPAD_AND_ENCODER_SOURCES})
|
||||
endif()
|
||||
if(CONFIG_LV_USE_DEMO_BENCHMARK)
|
||||
file(GLOB_RECURSE DEMO_BENCHMARK_SOURCES ${LVGL_ROOT_DIR}/demos/benchmark/*.c)
|
||||
list(APPEND DEMO_SOURCES ${DEMO_BENCHMARK_SOURCES})
|
||||
endif()
|
||||
if(CONFIG_LV_USE_DEMO_STRESS)
|
||||
file(GLOB_RECURSE DEMO_STRESS_SOURCES ${LVGL_ROOT_DIR}/demos/stress/*.c)
|
||||
list(APPEND DEMO_SOURCES ${DEMO_STRESS_SOURCES})
|
||||
endif()
|
||||
if(CONFIG_LV_USE_DEMO_MUSIC)
|
||||
file(GLOB_RECURSE DEMO_MUSIC_SOURCES ${LVGL_ROOT_DIR}/demos/music/*.c)
|
||||
list(APPEND DEMO_SOURCES ${DEMO_MUSIC_SOURCES})
|
||||
set_source_files_properties(${DEMO_MUSIC_SOURCES} COMPILE_FLAGS "-Wno-format")
|
||||
endif()
|
||||
|
||||
idf_component_register(SRCS ${SOURCES} ${EXAMPLE_SOURCES} ${DEMO_SOURCES}
|
||||
INCLUDE_DIRS ${LVGL_ROOT_DIR} ${LVGL_ROOT_DIR}/src ${LVGL_ROOT_DIR}/../
|
||||
${LVGL_ROOT_DIR}/examples ${LVGL_ROOT_DIR}/demos
|
||||
REQUIRES esp_timer)
|
||||
endif()
|
||||
|
||||
target_compile_definitions(${COMPONENT_LIB} PUBLIC "-DLV_CONF_INCLUDE_SIMPLE")
|
||||
|
||||
if(CONFIG_LV_ATTRIBUTE_FAST_MEM_USE_IRAM)
|
||||
target_compile_definitions(${COMPONENT_LIB}
|
||||
PUBLIC "-DLV_ATTRIBUTE_FAST_MEM=IRAM_ATTR")
|
||||
endif()
|
||||
|
||||