Compare commits
2456 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
17111843a0 | ||
|
|
1f4f333a01 | ||
|
|
3eeb104463 | ||
|
|
6bb86f0963 | ||
|
|
8ad5aa36dd | ||
|
|
ec63826d53 | ||
|
|
ff853105d9 | ||
|
|
8361a9c23d | ||
|
|
f5dca830c4 | ||
|
|
6a65f6e5d9 | ||
|
|
4f0393f704 | ||
|
|
7a73cb00a5 | ||
|
|
786e793634 | ||
|
|
a9ec60b5cd | ||
|
|
3cfe72c0fb | ||
|
|
a4c6d511b7 | ||
|
|
fd6d7119f5 | ||
|
|
0ab5e6e65c | ||
|
|
6d2bbf2862 | ||
|
|
bf2453ce0e | ||
|
|
c519b73ae2 | ||
|
|
5d44e66d42 | ||
|
|
04be7cc6a6 | ||
|
|
c5f69ca3b1 | ||
|
|
465bd3edd9 | ||
|
|
639409b881 | ||
|
|
9401353ccb | ||
|
|
196da100b1 | ||
|
|
24c17a9e5f | ||
|
|
d1bc187ec6 | ||
|
|
884b0b8025 | ||
|
|
9f333d50d7 | ||
|
|
1c859fc3d6 | ||
|
|
cd0d311531 | ||
|
|
33b4072138 | ||
|
|
da3785240a | ||
|
|
27db08eb23 | ||
|
|
93357446a4 | ||
|
|
a421547774 | ||
|
|
4a036d8c28 | ||
|
|
362378b4e4 | ||
|
|
2cead48cd5 | ||
|
|
5312875972 | ||
|
|
fca1a1d434 | ||
|
|
1618930f9b | ||
|
|
014850e73a | ||
|
|
f984c35875 | ||
|
|
dec310a78d | ||
|
|
40c86ea34e | ||
|
|
df91d5bcad | ||
|
|
2f29a9f361 | ||
|
|
7bacac488e | ||
|
|
e792352f45 | ||
|
|
1d53e5eaec | ||
|
|
91f8755690 | ||
|
|
5ae4b62f4d | ||
|
|
8e9764532d | ||
|
|
03f18260a9 | ||
|
|
9023588fef | ||
|
|
89bc24a7d9 | ||
|
|
c021de5968 | ||
|
|
2dce4407c7 | ||
|
|
6989a9c797 | ||
|
|
6c59216b46 | ||
|
|
3a8a004e8b | ||
|
|
a78d0489f5 | ||
|
|
507c220d3f | ||
|
|
f2f024b610 | ||
|
|
4f77d8fc1a | ||
|
|
3eb14e198a | ||
|
|
63b070164f | ||
|
|
6eb9975966 | ||
|
|
0f24ef3666 | ||
|
|
50d134fa8c | ||
|
|
5b9d969fa4 | ||
|
|
90a3edd218 | ||
|
|
0dde2937d7 | ||
|
|
b0870156c8 | ||
|
|
f7b8e5d415 | ||
|
|
7b0b28f5a7 | ||
|
|
38cbc2fdea | ||
|
|
86c28355ab | ||
|
|
135c119b20 | ||
|
|
3e77e0de8b | ||
|
|
a77b2ab408 | ||
|
|
9af89dd1b3 | ||
|
|
3c539d5751 | ||
|
|
683545f5f0 | ||
|
|
f91479470b | ||
|
|
c1072a6289 | ||
|
|
e2147d4be5 | ||
|
|
d3d83f4991 | ||
|
|
72cf43a176 | ||
|
|
b4dfa5678f | ||
|
|
0e71a34128 | ||
|
|
2ecd0c4166 | ||
|
|
bbc9c886c6 | ||
|
|
fc42d02e97 | ||
|
|
03ac0284ae | ||
|
|
925e1f9adf | ||
|
|
d433114cc2 | ||
|
|
a2e6589529 | ||
|
|
c15f7135cd | ||
|
|
7d278b1c09 | ||
|
|
0bd3a9f4d0 | ||
|
|
f8924511d6 | ||
|
|
d8745e3050 | ||
|
|
a6b81d3da8 | ||
|
|
4c85125a87 | ||
|
|
9dcc47ec33 | ||
|
|
8f962a0464 | ||
|
|
e1989c5706 | ||
|
|
e1a4590fe3 | ||
|
|
ac8e4af167 | ||
|
|
d99bd91fe6 | ||
|
|
b04367c702 | ||
|
|
47bc4c91b7 | ||
|
|
ce29102dcf | ||
|
|
f806f8c526 | ||
|
|
5b150e57ab | ||
|
|
977b74332c | ||
|
|
071bf4cc4c | ||
|
|
25c5c54b3b | ||
|
|
d823194378 | ||
|
|
cba7dfc51b | ||
|
|
fda41d62a1 | ||
|
|
5168b5c44f | ||
|
|
1ae0a68e55 | ||
|
|
f62f839a25 | ||
|
|
b71b1f1e3a | ||
|
|
9d6cf5d2d8 | ||
|
|
08101e6d6b | ||
|
|
cd3d7248c5 | ||
|
|
721d056803 | ||
|
|
5e4bd1fd0c | ||
|
|
4891f803fc | ||
|
|
ff657882bc | ||
|
|
c54003f014 | ||
|
|
f56cd37f65 | ||
|
|
ab4c2bcd93 | ||
|
|
bba22bfa55 | ||
|
|
00008879b7 | ||
|
|
d66ff20df5 | ||
|
|
b856391c96 | ||
|
|
d67f84bc1a | ||
|
|
189ca15d7c | ||
|
|
d85efb9926 | ||
|
|
a88cacb71e | ||
|
|
2f95d4a0ca | ||
|
|
2f5ec6befe | ||
|
|
44b2197721 | ||
|
|
3227a2c780 | ||
|
|
7f7034f50f | ||
|
|
58ce1460d8 | ||
|
|
3c2accacb6 | ||
|
|
cd6f99c718 | ||
|
|
d79df213a1 | ||
|
|
bc030e7a2e | ||
|
|
65d9dc503d | ||
|
|
1bba2a803f | ||
|
|
ce7b183f50 | ||
|
|
8e8271ffe6 | ||
|
|
ecd21d512d | ||
|
|
76e392edd5 | ||
|
|
4c1dbc63d2 | ||
|
|
ca1f21ad04 | ||
|
|
a9c818a6ef | ||
|
|
a63c5eb968 | ||
|
|
68f28d1fda | ||
|
|
d25650f561 | ||
|
|
f5de02ad5a | ||
|
|
7a0ccd74a8 | ||
|
|
e72ba9f11b | ||
|
|
d84e977218 | ||
|
|
e48e0d8026 | ||
|
|
1c0f24cfbd | ||
|
|
1b33667642 | ||
|
|
8173c427aa | ||
|
|
c630493fc0 | ||
|
|
b0b27515bd | ||
|
|
625aaa25ff | ||
|
|
1844d060ab | ||
|
|
d80cc562d4 | ||
|
|
6cfcc3fa55 | ||
|
|
b9081cacef | ||
|
|
22e8ec2b01 | ||
|
|
c46f64c6d5 | ||
|
|
648e2c4f17 | ||
|
|
b9692ee798 | ||
|
|
eacf2e5b93 | ||
|
|
3088849b63 | ||
|
|
7fe458229d | ||
|
|
abae15ab7c | ||
|
|
51878e65dc | ||
|
|
760359fd5a | ||
|
|
b8c35308f2 | ||
|
|
622c5deada | ||
|
|
728c221986 | ||
|
|
a92ffe7cde | ||
|
|
5bb1653991 | ||
|
|
021420775f | ||
|
|
4f07e9b4ab | ||
|
|
9e34000dfc | ||
|
|
10c46e73a8 | ||
|
|
dd8fdafe3e | ||
|
|
89fae4458e | ||
|
|
71f00017af | ||
|
|
7cbc2d0e7f | ||
|
|
f69dfce051 | ||
|
|
c52d8e8120 | ||
|
|
0e41e9aacb | ||
|
|
3abcf52ad7 | ||
|
|
bceb46b813 | ||
|
|
ed69452c45 | ||
|
|
4139cd619b | ||
|
|
a2c9c72186 | ||
|
|
56b9893854 | ||
|
|
288b972ce0 | ||
|
|
857d1734fd | ||
|
|
a1d2d631f0 | ||
|
|
8254ee6661 | ||
|
|
5cc1548b83 | ||
|
|
f2ca0b15f3 | ||
|
|
dbb5f23cd6 | ||
|
|
23f842e462 | ||
|
|
dba4cebfea | ||
|
|
81729dfd51 | ||
|
|
48e1efb6ef | ||
|
|
9396b097ab | ||
|
|
b4d54c71d3 | ||
|
|
9139b58abc | ||
|
|
0ef39ed144 | ||
|
|
b29c84cc88 | ||
|
|
3a2def1e76 | ||
|
|
62c531eec3 | ||
|
|
c54d2d2fd7 | ||
|
|
e01577845a | ||
|
|
e8c14961df | ||
|
|
b0de5b9c0d | ||
|
|
33bb0d8004 | ||
|
|
366698bba3 | ||
|
|
ff65ecd102 | ||
|
|
4075a7adfc | ||
|
|
ca01b558f7 | ||
|
|
f692e00ffe | ||
|
|
30419b3881 | ||
|
|
a94866a115 | ||
|
|
df4aecc4c2 | ||
|
|
2dfaef4668 | ||
|
|
23dc884f35 | ||
|
|
cd8bfa49e2 | ||
|
|
cf124e60ad | ||
|
|
7884636b7c | ||
|
|
8c6ef82947 | ||
|
|
23e7e4e8e2 | ||
|
|
56d7b986d4 | ||
|
|
f173875310 | ||
|
|
4cffb73357 | ||
|
|
b174398cb5 | ||
|
|
7189a60866 | ||
|
|
d94075ac92 | ||
|
|
0acabe460c | ||
|
|
a5bbb5e651 | ||
|
|
005a7954ca | ||
|
|
bf667f747b | ||
|
|
0aeff32442 | ||
|
|
5ebed4f24e | ||
|
|
eba910be40 | ||
|
|
b6a86f31d7 | ||
|
|
d1e59483b4 | ||
|
|
f2afc18d6b | ||
|
|
72347d4bc1 | ||
|
|
1ed8207b5c | ||
|
|
ceff78476b | ||
|
|
62ffe5ab94 | ||
|
|
d2e28abb79 | ||
|
|
6093053240 | ||
|
|
7cfbf5ed64 | ||
|
|
01f990061f | ||
|
|
b0fffaa55b | ||
|
|
2c7cdea1ee | ||
|
|
5ef94e395d | ||
|
|
6bde219324 | ||
|
|
d3d9fde245 | ||
|
|
225c2f727c | ||
|
|
a3e88e1ecd | ||
|
|
0f1e260155 | ||
|
|
8efb91d51d | ||
|
|
5803fa6214 | ||
|
|
9cb633981f | ||
|
|
d066004783 | ||
|
|
037e828c8a | ||
|
|
5652a163c5 | ||
|
|
f42e6b82c4 | ||
|
|
6212d0a507 | ||
|
|
cd1ad6eb3a | ||
|
|
cbb9c3f73b | ||
|
|
40576b5445 | ||
|
|
9b38d455ab | ||
|
|
3cc2043fd7 | ||
|
|
a6f0afde4c | ||
|
|
ba3e7d1da6 | ||
|
|
9d70ccc226 | ||
|
|
d658eef2a0 | ||
|
|
22c2bc4453 | ||
|
|
0d2b61f0f3 | ||
|
|
45a29c1b88 | ||
|
|
1c2d71a0f8 | ||
|
|
ba9f0cf9bb | ||
|
|
fd834ae60f | ||
|
|
e8605a52ed | ||
|
|
7bbe91512a | ||
|
|
aed05f26e4 | ||
|
|
87979b5645 | ||
|
|
22195f3455 | ||
|
|
b0a4fd7dad | ||
|
|
b6d24040bf | ||
|
|
0be212c26c | ||
|
|
90b8bc9597 | ||
|
|
8c5c8ed82a | ||
|
|
f28efdd9f3 | ||
|
|
62ea055785 | ||
|
|
89a2856d6e | ||
|
|
80760c4669 | ||
|
|
b1622166b4 | ||
|
|
f7bc8c2328 | ||
|
|
83d64fed42 | ||
|
|
234fa34254 | ||
|
|
d8edbb8a41 | ||
|
|
077a645a92 | ||
|
|
432e87bfdf | ||
|
|
f16561295b | ||
|
|
d197ae53e5 | ||
|
|
42b546a6d7 | ||
|
|
eb1e28e1f5 | ||
|
|
cb6a4527a9 | ||
|
|
2f4654b009 | ||
|
|
ca19c7d92f | ||
|
|
1ef0c197cd | ||
|
|
b842db91aa | ||
|
|
1f334ba88b | ||
|
|
c136382be3 | ||
|
|
e525c08a0c | ||
|
|
b926fd4966 | ||
|
|
4c623cae44 | ||
|
|
c5ba739627 | ||
|
|
e421e08c2f | ||
|
|
bd15b805db | ||
|
|
292ca72c03 | ||
|
|
322211b1ed | ||
|
|
04df148f0c | ||
|
|
8273499a8c | ||
|
|
c1b8c2f522 | ||
|
|
6cba2fbab0 | ||
|
|
5a712931ef | ||
|
|
de824833a0 | ||
|
|
78c527ee4f | ||
|
|
c46ff018ed | ||
|
|
862a4c3496 | ||
|
|
569bbdf058 | ||
|
|
648d42ec94 | ||
|
|
c8d1413ece | ||
|
|
6a265896a2 | ||
|
|
eebe04bd95 | ||
|
|
fe8157cc88 | ||
|
|
5af101a1eb | ||
|
|
e31b6a156e | ||
|
|
f706de5517 | ||
|
|
72fb15c3fb | ||
|
|
5afe9c119a | ||
|
|
3a78360b62 | ||
|
|
d58c8663d4 | ||
|
|
85ead39b6a | ||
|
|
a3bfdb240e | ||
|
|
dab545e770 | ||
|
|
7f30fb0058 | ||
|
|
1489629b61 | ||
|
|
77d43069e0 | ||
|
|
5b1f0caa8d | ||
|
|
1cd4ac4aef | ||
|
|
8b29a88b58 | ||
|
|
3079d2c6e6 | ||
|
|
7631d41c88 | ||
|
|
523170297e | ||
|
|
0442ffe6cb | ||
|
|
aa4897cdc5 | ||
|
|
512eb05a22 | ||
|
|
424bff48f5 | ||
|
|
c31ab099f7 | ||
|
|
0f6f2accb6 | ||
|
|
1ddf659631 | ||
|
|
861e090023 | ||
|
|
e7e24697ea | ||
|
|
0b31110d3e | ||
|
|
be84581bbc | ||
|
|
45c4970fc6 | ||
|
|
1a70d98ba4 | ||
|
|
f4c0055c5a | ||
|
|
18d59bef01 | ||
|
|
f6c60b8204 | ||
|
|
73ef86f9a9 | ||
|
|
0c7d9b96f7 | ||
|
|
469157ebd9 | ||
|
|
cc97e114c2 | ||
|
|
864c970ba3 | ||
|
|
ed1632f464 | ||
|
|
b7850e2584 | ||
|
|
9f216a55be | ||
|
|
1e4fd8fdfb | ||
|
|
12ee3b3504 | ||
|
|
d8a17c483a | ||
|
|
c7e6af03e6 | ||
|
|
cc48391333 | ||
|
|
0892cbadc4 | ||
|
|
5243d235a6 | ||
|
|
15c27c8a9b | ||
|
|
630199d9a3 | ||
|
|
b623eabb0a | ||
|
|
5321b9b62e | ||
|
|
926490502b | ||
|
|
8745d16ba9 | ||
|
|
8dc2b36bf7 | ||
|
|
4b657eb07b | ||
|
|
2edf8f4aab | ||
|
|
dc9f8baf0e | ||
|
|
4e6aac2157 | ||
|
|
1e5f690a45 | ||
|
|
ef0f8b29cf | ||
|
|
514e2baaca | ||
|
|
d7661e8bbc | ||
|
|
abd081da30 | ||
|
|
9cd7de8ccd | ||
|
|
5e60002a9b | ||
|
|
3860c115d4 | ||
|
|
4a663c42d4 | ||
|
|
2fbc082633 | ||
|
|
ca19f8f4ff | ||
|
|
9e3162080f | ||
|
|
56fcd2d151 | ||
|
|
e2cfba7c9f | ||
|
|
2d5183b05d | ||
|
|
4b43adaad1 | ||
|
|
b4a632116e | ||
|
|
ac89e880a7 | ||
|
|
c9c635ca3a | ||
|
|
e49de22941 | ||
|
|
9c708d6f4d | ||
|
|
e9d2191463 | ||
|
|
95fc629aa5 | ||
|
|
8675a345b4 | ||
|
|
b5898a750e | ||
|
|
1b1df9f931 | ||
|
|
755f68c87b | ||
|
|
cdb6f1fdd7 | ||
|
|
d6ef684867 | ||
|
|
7419900508 | ||
|
|
4454683ff0 | ||
|
|
5353dae027 | ||
|
|
850693a840 | ||
|
|
9fc1423ef7 | ||
|
|
a983dfa80a | ||
|
|
5d65def464 | ||
|
|
0ad121865c | ||
|
|
8f7e01fc1a | ||
|
|
82c57e0ceb | ||
|
|
a2cb299c0c | ||
|
|
702ca86879 | ||
|
|
beeedfc1b2 | ||
|
|
dfb12a31f9 | ||
|
|
a3c08e9985 | ||
|
|
b477a14fdf | ||
|
|
2abf55f4c4 | ||
|
|
d0550b7feb | ||
|
|
1181c07b76 | ||
|
|
6446f78aeb | ||
|
|
a9036eb6b1 | ||
|
|
b75688b317 | ||
|
|
857a4e1406 | ||
|
|
ad1162922f | ||
|
|
5a88709a5c | ||
|
|
41fc80e96b | ||
|
|
9a711d9e88 | ||
|
|
cf21115029 | ||
|
|
84d79bcf56 | ||
|
|
2e0c8ca8f5 | ||
|
|
1ba23100f6 | ||
|
|
b9af3b0383 | ||
|
|
6148d498a9 | ||
|
|
0811096f21 | ||
|
|
de0037e7fe | ||
|
|
ff6b6725a5 | ||
|
|
d7b193d3fc | ||
|
|
c401481509 | ||
|
|
eb70f39e42 | ||
|
|
2c5b3fe223 | ||
|
|
619403ce48 | ||
|
|
b3f60153cf | ||
|
|
30dcf68351 | ||
|
|
3d77137178 | ||
|
|
50edf4e1f8 | ||
|
|
f40ee380c8 | ||
|
|
522d59861e | ||
|
|
991f892a98 | ||
|
|
9603ddfbe5 | ||
|
|
2b26b9dc51 | ||
|
|
29daec0caf | ||
|
|
bbb93d315e | ||
|
|
610499c278 | ||
|
|
1cbbd1c59b | ||
|
|
ff6fb2611a | ||
|
|
6284e3a21b | ||
|
|
3764d7a6ba | ||
|
|
cf943b16e1 | ||
|
|
a4d4d59346 | ||
|
|
580d1e111d | ||
|
|
b6df62a62a | ||
|
|
e6b7afccd2 | ||
|
|
5ccf31793e | ||
|
|
6a3c7d2b95 | ||
|
|
84ea78c1c1 | ||
|
|
2b0cdc853f | ||
|
|
0dd723183f | ||
|
|
00f2df74dc | ||
|
|
3606ea2588 | ||
|
|
12125248c6 | ||
|
|
2f0921161f | ||
|
|
6c9ed1969f | ||
|
|
2345e0073d | ||
|
|
de12c95a80 | ||
|
|
e3244b7a37 | ||
|
|
0bffba11d6 | ||
|
|
9af730c6cb | ||
|
|
b59e058f8d | ||
|
|
3d4c784c3b | ||
|
|
fb1ca3fb87 | ||
|
|
427d11e7f5 | ||
|
|
d3b494b030 | ||
|
|
b0f3949b3c | ||
|
|
c4f8e5f8be | ||
|
|
c2653174f5 | ||
|
|
28d24a3d4d | ||
|
|
ea7c82f478 | ||
|
|
5edb1dd38a | ||
|
|
ef0e0f812f | ||
|
|
b5c7960255 | ||
|
|
e8b081b015 | ||
|
|
67ff40afd0 | ||
|
|
3d7641733e | ||
|
|
d691e72b40 | ||
|
|
fc7c7ec619 | ||
|
|
36d4807a69 | ||
|
|
e5c699ba23 | ||
|
|
75f42fde2f | ||
|
|
0c3a18e1fe | ||
|
|
e47750864e | ||
|
|
8976b118f8 | ||
|
|
dff8eb9a3c | ||
|
|
c7d582e403 | ||
|
|
65b83dd1c1 | ||
|
|
2b0e378c73 | ||
|
|
231ad935f4 | ||
|
|
9c8296edf9 | ||
|
|
cbd32d9f28 | ||
|
|
5db6b73725 | ||
|
|
b3f4bd1c46 | ||
|
|
912b014b03 | ||
|
|
c58fd97cf7 | ||
|
|
31ff0fd3ff | ||
|
|
6df6614016 | ||
|
|
264eacd0bc | ||
|
|
248521da53 | ||
|
|
0cff8c7963 | ||
|
|
789e7a3a12 | ||
|
|
d85c138137 | ||
|
|
5f76d98311 | ||
|
|
d6088f2b06 | ||
|
|
1eca54616a | ||
|
|
3f2b6bb685 | ||
|
|
2794b786d7 | ||
|
|
bc8cd2068e | ||
|
|
d4bfeb2bed | ||
|
|
66585f508f | ||
|
|
ba2160042a | ||
|
|
80e2a1d5d5 | ||
|
|
a8c8b6b7a2 | ||
|
|
18809da818 | ||
|
|
f19f8a9b5c | ||
|
|
41ee89e6d2 | ||
|
|
889c21b639 | ||
|
|
aec671dc67 | ||
|
|
6e047e6d27 | ||
|
|
787dd591c1 | ||
|
|
1d986e13df | ||
|
|
c55c36c366 | ||
|
|
75f5849a73 | ||
|
|
08722f5f8d | ||
|
|
84ace67720 | ||
|
|
38c55377c6 | ||
|
|
af61c96802 | ||
|
|
bb20b8ca1a | ||
|
|
103f6c3041 | ||
|
|
09f362a1ed | ||
|
|
9515e800d4 | ||
|
|
eb6daa51d7 | ||
|
|
438ae64502 | ||
|
|
e902f0955f | ||
|
|
a4a5bef8ca | ||
|
|
1cd983941e | ||
|
|
272ee1b466 | ||
|
|
5919cf5613 | ||
|
|
97089da7f5 | ||
|
|
f5609b6bce | ||
|
|
e63e1f230a | ||
|
|
3b747718ea | ||
|
|
0a4e8979ec | ||
|
|
b14ed6288a | ||
|
|
82a095b94a | ||
|
|
87d27a5665 | ||
|
|
b8fece6e0a | ||
|
|
6468d925ed | ||
|
|
c1e98d3f37 | ||
|
|
cd47fd72f6 | ||
|
|
ed9a1f3df5 | ||
|
|
881d6c060f | ||
|
|
20961a4dda | ||
|
|
5be450a3aa | ||
|
|
41754236f8 | ||
|
|
0464444502 | ||
|
|
e8a3f3dd6a | ||
|
|
0f43ee23de | ||
|
|
cf05e2c336 | ||
|
|
9347165a5a | ||
|
|
21eab152a6 | ||
|
|
e575d4728b | ||
|
|
5456418d54 | ||
|
|
dccdf1e5a4 | ||
|
|
a979a445ac | ||
|
|
516a69e218 | ||
|
|
b262381c58 | ||
|
|
aaad794085 | ||
|
|
8890589dc1 | ||
|
|
37e873fa09 | ||
|
|
347f7db20d | ||
|
|
770d1e08e1 | ||
|
|
06da93f43b | ||
|
|
d4559a0f39 | ||
|
|
a402f8258d | ||
|
|
f7f1b5c5ea | ||
|
|
221e269ccb | ||
|
|
ec787b92ba | ||
|
|
fa3947576d | ||
|
|
298cf31340 | ||
|
|
13e7f162a0 | ||
|
|
7cf2b8f1c2 | ||
|
|
7c2abad471 | ||
|
|
2cbffaeaea | ||
|
|
36b47ba98d | ||
|
|
81696b85d0 | ||
|
|
db4f4f0360 | ||
|
|
5565516e96 | ||
|
|
d479927e96 | ||
|
|
9c71696373 | ||
|
|
e22beaea22 | ||
|
|
a8dc1afe2c | ||
|
|
f0e423a71e | ||
|
|
25539b6606 | ||
|
|
f2af4b725a | ||
|
|
e1e6813eb1 | ||
|
|
13033c28d8 | ||
|
|
e1f9462818 | ||
|
|
6e48776abc | ||
|
|
de04b39165 | ||
|
|
e32b40ecf1 | ||
|
|
5149d36c1f | ||
|
|
0150586db7 | ||
|
|
36b212d4dc | ||
|
|
22f84314a4 | ||
|
|
03b3070871 | ||
|
|
73ab6b3e2f | ||
|
|
2f86a67e71 | ||
|
|
1b12ee50bb | ||
|
|
ee4e61ed68 | ||
|
|
46d5debc7a | ||
|
|
087ab979d6 | ||
|
|
f972eb54aa | ||
|
|
0005f4c88e | ||
|
|
f5aa26f7e1 | ||
|
|
e7b4bef8ac | ||
|
|
47093d057e | ||
|
|
c9cf1edc07 | ||
|
|
e8a05aaa65 | ||
|
|
12a5e16a75 | ||
|
|
a7735b85e9 | ||
|
|
fe4e95af2b | ||
|
|
11faf1df5f | ||
|
|
a83fdb39a8 | ||
|
|
efe4845923 | ||
|
|
5218a5f8b8 | ||
|
|
58d375bc93 | ||
|
|
ee04c41da8 | ||
|
|
4d8ec83866 | ||
|
|
1927376fe5 | ||
|
|
627383fd0d | ||
|
|
02689fceab | ||
|
|
615186c5d6 | ||
|
|
795f5772b6 | ||
|
|
4dabad3d6e | ||
|
|
7560f01745 | ||
|
|
9f37a9803d | ||
|
|
7af6818897 | ||
|
|
d965db9fe6 | ||
|
|
cc8119d0a7 | ||
|
|
fd26209b16 | ||
|
|
a9f807ac99 | ||
|
|
53b720cff7 | ||
|
|
9f29289afd | ||
|
|
abfdfd1b20 | ||
|
|
3198340451 | ||
|
|
85442c25c0 | ||
|
|
b222fa3744 | ||
|
|
fc5f86d696 | ||
|
|
b84358dc7f | ||
|
|
6c1152ed0c | ||
|
|
5cbdde7729 | ||
|
|
f51bf17e39 | ||
|
|
2db846d5e0 | ||
|
|
efd647f853 | ||
|
|
03b7bb72ea | ||
|
|
0ab28f623c | ||
|
|
3964f3b843 | ||
|
|
5a297777c0 | ||
|
|
80738425f6 | ||
|
|
5916f1f5c4 | ||
|
|
d7b3aeba66 | ||
|
|
de9119a27d | ||
|
|
96f227e7e1 | ||
|
|
87117be081 | ||
|
|
6d1be4cc11 | ||
|
|
9c499bdeae | ||
|
|
dc7ba94b06 | ||
|
|
855832b574 | ||
|
|
240744f9c9 | ||
|
|
a624019943 | ||
|
|
edb58cc61b | ||
|
|
1e763e6c5e | ||
|
|
51824b4316 | ||
|
|
92149e11a6 | ||
|
|
5e41a28dcf | ||
|
|
2819b30716 | ||
|
|
43371a4980 | ||
|
|
8264492f87 | ||
|
|
abf8cbfb92 | ||
|
|
c9703af47e | ||
|
|
0b53f0f9ed | ||
|
|
15baa59a8f | ||
|
|
ee5976ce12 | ||
|
|
c3156db6b9 | ||
|
|
a0b6136dcf | ||
|
|
e0aeed2e97 | ||
|
|
22ad2e0ec1 | ||
|
|
02e5ed8b16 | ||
|
|
3a49ece938 | ||
|
|
250ef8b136 | ||
|
|
e8fdac41a9 | ||
|
|
b8f598112f | ||
|
|
98d43daa5d | ||
|
|
095a159005 | ||
|
|
2be9e67697 | ||
|
|
89d56e5723 | ||
|
|
ec6598ccfb | ||
|
|
6967a8e52f | ||
|
|
3458b1bfb1 | ||
|
|
4e66afc65b | ||
|
|
4b3859f949 | ||
|
|
a1ca0bd796 | ||
|
|
c74e48249d | ||
|
|
92b79cf3a8 | ||
|
|
2bf4e080e4 | ||
|
|
2640727b29 | ||
|
|
52ee38d7c9 | ||
|
|
74a9f5b18e | ||
|
|
2eaa579121 | ||
|
|
fcd06e4c1c | ||
|
|
245a6ccae6 | ||
|
|
e263dddde9 | ||
|
|
4ab2e505fd | ||
|
|
bef17224e4 | ||
|
|
a59a6880f0 | ||
|
|
363304f53e | ||
|
|
bff65c217d | ||
|
|
14b03df174 | ||
|
|
93e2b9e0b9 | ||
|
|
15007e9071 | ||
|
|
b882174bf9 | ||
|
|
370f8223b6 | ||
|
|
d5dd1c4b10 | ||
|
|
bc1d71a1d1 | ||
|
|
702fb9565d | ||
|
|
210de388d9 | ||
|
|
c4ca9870b0 | ||
|
|
3d4f823884 | ||
|
|
d9874ae0f4 | ||
|
|
66e70afbb4 | ||
|
|
0bce1876c1 | ||
|
|
fc375fd115 | ||
|
|
cc190bbb29 | ||
|
|
4c8015541e | ||
|
|
9d0f68880a | ||
|
|
78574541e3 | ||
|
|
b30ca0da76 | ||
|
|
13a3364656 | ||
|
|
cabbe414a5 | ||
|
|
c2e3e9d494 | ||
|
|
e298f493ce | ||
|
|
69b07acc4e | ||
|
|
9d72ced2b6 | ||
|
|
b8c6783207 | ||
|
|
c713c4135b | ||
|
|
2c4ea022b9 | ||
|
|
961d8e0350 | ||
|
|
6f53e4616a | ||
|
|
e788907d9c | ||
|
|
2b4185ec23 | ||
|
|
f509d8fa4f | ||
|
|
13f0b61953 | ||
|
|
e50410ffb1 | ||
|
|
cae61d4e3e | ||
|
|
86d7f4c888 | ||
|
|
4743e11967 | ||
|
|
2ffeef667f | ||
|
|
2ffb0a83b0 | ||
|
|
4608f72098 | ||
|
|
c318a7fc37 | ||
|
|
25df5347aa | ||
|
|
148cb16cd4 | ||
|
|
13fff73bdb | ||
|
|
fbeb1d785c | ||
|
|
d992a71513 | ||
|
|
672626f225 | ||
|
|
513a7e0a4e | ||
|
|
4e9df1679e | ||
|
|
4a54b6e4fa | ||
|
|
a7338085ec | ||
|
|
7ac2009f16 | ||
|
|
00ef778c7c | ||
|
|
fbe838730f | ||
|
|
55197a2934 | ||
|
|
205c791e00 | ||
|
|
b0d3164ecf | ||
|
|
551eadc1d5 | ||
|
|
409a998df2 | ||
|
|
c9a58a8a8c | ||
|
|
aa4b17900b | ||
|
|
3f4c1fe91b | ||
|
|
b2e07d858b | ||
|
|
dfbcec2f0d | ||
|
|
53b8056502 | ||
|
|
e323924176 | ||
|
|
1efb3d87c8 | ||
|
|
591e02c71b | ||
|
|
e85e4a8eb9 | ||
|
|
dc0ce46b0c | ||
|
|
50e69bab6b | ||
|
|
cc3ef640da | ||
|
|
f7d6604b9b | ||
|
|
a6821a6cb8 | ||
|
|
f386101e82 | ||
|
|
2aa5f67381 | ||
|
|
eb33596d02 | ||
|
|
663b8d6c89 | ||
|
|
ca2a2e9c49 | ||
|
|
54778eb303 | ||
|
|
72288f4450 | ||
|
|
c59c71b5c9 | ||
|
|
e7a14993c7 | ||
|
|
408ba8d574 | ||
|
|
054e43e6e9 | ||
|
|
65685a0da6 | ||
|
|
0bab902753 | ||
|
|
9141d95865 | ||
|
|
ddbd8386d2 | ||
|
|
285ff7d3b4 | ||
|
|
5f94480bfb | ||
|
|
7cfa099ec3 | ||
|
|
a374baa376 | ||
|
|
7e60fcb298 | ||
|
|
02c95e8fed | ||
|
|
9264cd9d56 | ||
|
|
c34d5a4f6b | ||
|
|
56f54d864a | ||
|
|
465f8fa96a | ||
|
|
a7260bbfa9 | ||
|
|
4a6e34dcbd | ||
|
|
7f6131d440 | ||
|
|
374dfcd60a | ||
|
|
457f667cab | ||
|
|
4b6e78cf78 | ||
|
|
1f25bfb60b | ||
|
|
a1e062bc49 | ||
|
|
438e665c6d | ||
|
|
fd6e5ae3ef | ||
|
|
b9ed89a976 | ||
|
|
07e9fc4ccf | ||
|
|
000cc9d92f | ||
|
|
a39d617ac9 | ||
|
|
69456cd3f5 | ||
|
|
d27dfbd6d7 | ||
|
|
0ccaac4e00 | ||
|
|
030fe60b34 | ||
|
|
be8db0719f | ||
|
|
f4498fd0a4 | ||
|
|
28b97582b6 | ||
|
|
236f9291be | ||
|
|
fcf1d52e4a | ||
|
|
f2bd701927 | ||
|
|
8581a249bd | ||
|
|
688cd79a55 | ||
|
|
d5f7f3d51c | ||
|
|
1b519cd104 | ||
|
|
a6d8d1cbc5 | ||
|
|
a494521d7b | ||
|
|
245d81ee92 | ||
|
|
99825aa29f | ||
|
|
d05ec536fd | ||
|
|
153f16fc05 | ||
|
|
2e0b8e10ae | ||
|
|
df88e319a8 | ||
|
|
5dfac5a92b | ||
|
|
62195b7cc7 | ||
|
|
9572c7d4ed | ||
|
|
20282ce89f | ||
|
|
62e58a25c9 | ||
|
|
19ea8ac55f | ||
|
|
2af6ca8833 | ||
|
|
f9d8269274 | ||
|
|
3c7b6ae94c | ||
|
|
8ec60fbe3e | ||
|
|
79dc8b2ace | ||
|
|
e3bbe0a4fd | ||
|
|
96adbe3827 | ||
|
|
ef8563c9bd | ||
|
|
533d39b4c2 | ||
|
|
48bd4fecc6 | ||
|
|
92babea8c8 | ||
|
|
3425f29130 | ||
|
|
673892cd80 | ||
|
|
f5b8dd17b8 | ||
|
|
cfa7d22d33 | ||
|
|
fabd551e2a | ||
|
|
327d7c84ca | ||
|
|
2b67dcd2cf | ||
|
|
7571bedc46 | ||
|
|
b15ffa3d89 | ||
|
|
5addccc270 | ||
|
|
c94fb96bb2 | ||
|
|
9ac933fb9e | ||
|
|
44c2397804 | ||
|
|
8c4e4c3861 | ||
|
|
fa736411e3 | ||
|
|
728cd17275 | ||
|
|
caa2064c90 | ||
|
|
6f47dd6522 | ||
|
|
c71047f359 | ||
|
|
6871e0252a | ||
|
|
56cfcc693a | ||
|
|
a87f4388e5 | ||
|
|
44e5cc446c | ||
|
|
f686243f64 | ||
|
|
d64902b2a5 | ||
|
|
5b92b4d01b | ||
|
|
0733885a73 | ||
|
|
c42f378184 | ||
|
|
ad74d32f51 | ||
|
|
321a08b42e | ||
|
|
b7d5537961 | ||
|
|
32017ff659 | ||
|
|
e2c0e58af9 | ||
|
|
1c67d07dc3 | ||
|
|
e72589c6d4 | ||
|
|
e2e6479fb0 | ||
|
|
89e8995dc4 | ||
|
|
b0b1174564 | ||
|
|
57a542fcac | ||
|
|
fb1a7fc0fc | ||
|
|
4f50a5a147 | ||
|
|
2692100bb1 | ||
|
|
e7fcb58bec | ||
|
|
2752b51d50 | ||
|
|
a71964f0b2 | ||
|
|
43b20179ed | ||
|
|
0d76cc4ef3 | ||
|
|
cfe0c14e56 | ||
|
|
1e6dc74c5a | ||
|
|
e1afa61128 | ||
|
|
b5bcede82f | ||
|
|
23dfc37171 | ||
|
|
148539d242 | ||
|
|
8acc122ab0 | ||
|
|
4e61a2da33 | ||
|
|
dc9cffec5d | ||
|
|
86b34460dd | ||
|
|
b66e8410f6 | ||
|
|
9a272039d3 | ||
|
|
dc69cf82eb | ||
|
|
17c19fc35a | ||
|
|
4cd13016d3 | ||
|
|
84781c62c2 | ||
|
|
378453c954 | ||
|
|
40709625cc | ||
|
|
77f6844340 | ||
|
|
68083fa15a | ||
|
|
cbab184002 | ||
|
|
0819688f50 | ||
|
|
6770e1ab32 | ||
|
|
078bc96b77 | ||
|
|
ed8ec4a4c2 | ||
|
|
4fbf1401fa | ||
|
|
5f2f6b6617 | ||
|
|
e3c2a7db67 | ||
|
|
ace5acea0b | ||
|
|
8511c6b9cf | ||
|
|
3ef4a73db5 | ||
|
|
2274ca348b | ||
|
|
e9fca9cad6 | ||
|
|
96eba5f877 | ||
|
|
3db41c327f | ||
|
|
6de1ad36dc | ||
|
|
635ca1ab90 | ||
|
|
215cdda238 | ||
|
|
ffbabfc8fe | ||
|
|
5a62ac79e9 | ||
|
|
846a470717 | ||
|
|
f6f8f09bce | ||
|
|
6ffd1475c5 | ||
|
|
5bbc3e69e9 | ||
|
|
f1d5e9c4a2 | ||
|
|
68f25fa999 | ||
|
|
ef7aa132a6 | ||
|
|
f41ce51bf9 | ||
|
|
ed38f7dcb5 | ||
|
|
cc77d78d5a | ||
|
|
159e07a8ea | ||
|
|
cf434828dc | ||
|
|
649a21ad86 | ||
|
|
dd5f66e125 | ||
|
|
c8920b0c06 | ||
|
|
09bcf9dd12 | ||
|
|
d1b593be66 | ||
|
|
3acd6c3cd0 | ||
|
|
aca2a2d428 | ||
|
|
d3dc1f8bf1 | ||
|
|
a91c142b3c | ||
|
|
fa28cee957 | ||
|
|
93ec0a512a | ||
|
|
1bf36221f4 | ||
|
|
0e3f95c1a9 | ||
|
|
01e2bf2374 | ||
|
|
34bcab34d8 | ||
|
|
fceaf167a4 | ||
|
|
950fb33206 | ||
|
|
7b23f7a8fd | ||
|
|
43e852d43a | ||
|
|
0bef3ab1bf | ||
|
|
967d3b54a3 | ||
|
|
ec31125af3 | ||
|
|
84d44b2487 | ||
|
|
9f2f89163f | ||
|
|
d29536673a | ||
|
|
8283fcc2d7 | ||
|
|
5e33e5574e | ||
|
|
dd41f411e6 | ||
|
|
92be58d1d8 | ||
|
|
fd1e8483a5 | ||
|
|
855dc44e32 | ||
|
|
9185e1c4a6 | ||
|
|
08007aa4d5 | ||
|
|
3b7a468c6a | ||
|
|
fba3337925 | ||
|
|
811f3c0834 | ||
|
|
31d0a7f3ae | ||
|
|
4adbdad9b3 | ||
|
|
120a431766 | ||
|
|
9cecebfe0a | ||
|
|
514511c15a | ||
|
|
610548ba3d | ||
|
|
dd3c65df7a | ||
|
|
195a3d3768 | ||
|
|
65236ede89 | ||
|
|
0e8984d121 | ||
|
|
9f84fb1749 | ||
|
|
b6046a8e23 | ||
|
|
af3cb73fbc | ||
|
|
c816847a3c | ||
|
|
652809d005 | ||
|
|
8bfa8ff721 | ||
|
|
a6c89ee54f | ||
|
|
0935110284 | ||
|
|
f5bd68fa77 | ||
|
|
d44a618169 | ||
|
|
ae3eca803d | ||
|
|
b087c1153c | ||
|
|
e12a8b06f0 | ||
|
|
fce445e464 | ||
|
|
5bb66ef268 | ||
|
|
eca9245382 | ||
|
|
aaa969dc8a | ||
|
|
28414505bc | ||
|
|
ac8ce1f643 | ||
|
|
5ed73c1918 | ||
|
|
79e973bfeb | ||
|
|
64c87e0e4a | ||
|
|
6af285adb8 | ||
|
|
d962e36dbb | ||
|
|
7713b5f941 | ||
|
|
8764388033 | ||
|
|
2ae3733cd9 | ||
|
|
2762222fcc | ||
|
|
a337e25fb1 | ||
|
|
fe5eab8f9a | ||
|
|
bdb3bb778e | ||
|
|
98b6e446f0 | ||
|
|
c8f5638780 | ||
|
|
c6bafdf203 | ||
|
|
1bbc482f1a | ||
|
|
a89fc9460b | ||
|
|
fd2e78965c | ||
|
|
10f3928169 | ||
|
|
bf01817ab8 | ||
|
|
b58e526a0b | ||
|
|
fe479fe261 | ||
|
|
473c2276dd | ||
|
|
1e8ea6b15b | ||
|
|
a883f0b39a | ||
|
|
848939683e | ||
|
|
6cd62851bb | ||
|
|
97b9fce748 | ||
|
|
c18be9809d | ||
|
|
68a860b958 | ||
|
|
a6ead395a0 | ||
|
|
e0fe252b90 | ||
|
|
0a673294c8 | ||
|
|
15d08b6692 | ||
|
|
b500f0c8f3 | ||
|
|
5c33fb67e5 | ||
|
|
50dc23f42c | ||
|
|
10b86cea37 | ||
|
|
7c6d92ec10 | ||
|
|
4a39e2b731 | ||
|
|
ce94a1ad5b | ||
|
|
264f630467 | ||
|
|
9711cf9d9a | ||
|
|
a005c62d17 | ||
|
|
7b193a40ef | ||
|
|
6718decbb7 | ||
|
|
87e262f27a | ||
|
|
a7207af953 | ||
|
|
d0f42c26cc | ||
|
|
6d449962ff | ||
|
|
8ddc9f21fe | ||
|
|
3ab541949f | ||
|
|
b9e61de4d2 | ||
|
|
38d0e5b6e7 | ||
|
|
bb4b37c6b3 | ||
|
|
6f12166af2 | ||
|
|
eec348132f | ||
|
|
623fc13407 | ||
|
|
a3f50c61f9 | ||
|
|
da01b4dd31 | ||
|
|
ae0ceee8f6 | ||
|
|
088936e7f8 | ||
|
|
d76b9c5b17 | ||
|
|
645eeae16c | ||
|
|
84bcf11d57 | ||
|
|
6d8b8a878d | ||
|
|
bd30245492 | ||
|
|
48cd728693 | ||
|
|
1a4a35f5a1 | ||
|
|
5b8e2cb6e1 | ||
|
|
8a3b60e0c5 | ||
|
|
6c55ba5d31 | ||
|
|
440c6415bc | ||
|
|
fcb95272b9 | ||
|
|
ff21f5a590 | ||
|
|
ec19c8c87e | ||
|
|
d25f0db948 | ||
|
|
62d7b3b034 | ||
|
|
d8aa9bfa1d | ||
|
|
56fd6d944c | ||
|
|
a4d6c628e3 | ||
|
|
9bbdd5840c | ||
|
|
52bb50550d | ||
|
|
1468da5c33 | ||
|
|
d3fab62f8f | ||
|
|
c64a7f1f9c | ||
|
|
db219daeda | ||
|
|
ee2ddf26f3 | ||
|
|
ced3903100 | ||
|
|
b5e40a44b1 | ||
|
|
5f11d67812 | ||
|
|
4b2cd9030c | ||
|
|
239ed85889 | ||
|
|
61bb01e06d | ||
|
|
666136851c | ||
|
|
a6714bbe47 | ||
|
|
167e26a243 | ||
|
|
7c322c36ed | ||
|
|
752e752dbd | ||
|
|
ab1a9b41e6 | ||
|
|
b7c08e8aed | ||
|
|
9c675a8e82 | ||
|
|
22e1ccdfa9 | ||
|
|
a4bfd51401 | ||
|
|
10b648c96e | ||
|
|
d109f409fb | ||
|
|
83cadc8abe | ||
|
|
31d18a21b2 | ||
|
|
20150c1418 | ||
|
|
9610d914e9 | ||
|
|
0a0df60f77 | ||
|
|
b4960b19fb | ||
|
|
3922c18054 | ||
|
|
53c19167f3 | ||
|
|
20464832da | ||
|
|
73ecaefde8 | ||
|
|
2ab274542a | ||
|
|
280cba0c54 | ||
|
|
bbe78633a2 | ||
|
|
c20af89a11 | ||
|
|
72fa6f092d | ||
|
|
db26a60320 | ||
|
|
e6126bc218 | ||
|
|
29200c8814 | ||
|
|
5bbb83c68b | ||
|
|
8ec482fdbd | ||
|
|
f2c4aadfe1 | ||
|
|
75f3198c3d | ||
|
|
d3101f8e96 | ||
|
|
1927a4cf47 | ||
|
|
0bd55a1fa1 | ||
|
|
cda531fc56 | ||
|
|
8b3786db40 | ||
|
|
639edca434 | ||
|
|
bf43316942 | ||
|
|
9c7c200048 | ||
|
|
ceab2ac138 | ||
|
|
6322798b61 | ||
|
|
a9921c78e8 | ||
|
|
7ac12cd071 | ||
|
|
d7ae21ce85 | ||
|
|
31468efc8e | ||
|
|
f25dec516b | ||
|
|
8bca90a40b | ||
|
|
62b3b2c578 | ||
|
|
ae68e0a449 | ||
|
|
6536a30b03 | ||
|
|
0dcaa505fa | ||
|
|
963d91f07d | ||
|
|
65cfdd1bf6 | ||
|
|
67972f787b | ||
|
|
d78c2f0ef5 | ||
|
|
a114a42b74 | ||
|
|
3e8e94d49c | ||
|
|
fa89846ee3 | ||
|
|
bffa23c4b2 | ||
|
|
d19792289d | ||
|
|
2bfcce40e2 | ||
|
|
9cf4cc1533 | ||
|
|
60ee852587 | ||
|
|
9531f04abf | ||
|
|
6f5c1ba629 | ||
|
|
4c2df29808 | ||
|
|
bfba1c477f | ||
|
|
8c74a23ec1 | ||
|
|
fd5ca1e52b | ||
|
|
f46958bb3f | ||
|
|
1787b63599 | ||
|
|
f80c6ab178 | ||
|
|
7947a991a4 | ||
|
|
391fda7ba6 | ||
|
|
19a5f5cd54 | ||
|
|
8cd0fcefef | ||
|
|
a4a98617c7 | ||
|
|
222ef3a76a | ||
|
|
4fbfbc3dd7 | ||
|
|
693ab86a6c | ||
|
|
837cb2b695 | ||
|
|
cc20e4cb7d | ||
|
|
789775d8d7 | ||
|
|
1314eff237 | ||
|
|
47f507ff62 | ||
|
|
e32c35905a | ||
|
|
61caef8e94 | ||
|
|
e6c4845983 | ||
|
|
e5f449e74f | ||
|
|
93781909bb | ||
|
|
60c07120c7 | ||
|
|
4c0cd82d9c | ||
|
|
f0aa7abf21 | ||
|
|
35901db2cd | ||
|
|
0fa3fecfe4 | ||
|
|
8a0868e2e0 | ||
|
|
59151b375c | ||
|
|
5e080ad61d | ||
|
|
ea224d409e | ||
|
|
37761540d0 | ||
|
|
b4d4759383 | ||
|
|
52ffa29ebe | ||
|
|
c74f4656fc | ||
|
|
92747ec37a | ||
|
|
3b81dc2a55 | ||
|
|
47bdf497b6 | ||
|
|
b1712325a7 | ||
|
|
9817e050e0 | ||
|
|
001f788631 | ||
|
|
6f1d0ef97b | ||
|
|
964965be9d | ||
|
|
4919f24985 | ||
|
|
1e23df926c | ||
|
|
dea81daa79 | ||
|
|
1ccec72f8c | ||
|
|
bd38e5a7f2 | ||
|
|
6c552e8447 | ||
|
|
86de6f5fbc | ||
|
|
a7bc41b528 | ||
|
|
49b136191f | ||
|
|
e68c3ab725 | ||
|
|
a2a03d8d53 | ||
|
|
d712a12db1 | ||
|
|
e60482ca0e | ||
|
|
42a8c59886 | ||
|
|
b1499cd954 | ||
|
|
f504d01644 | ||
|
|
e084fb022b | ||
|
|
3fc3c9d0cf | ||
|
|
e5dabf716a | ||
|
|
739b0d4399 | ||
|
|
92d1e5cefd | ||
|
|
429dca127d | ||
|
|
303f55f3a3 | ||
|
|
648c3430ef | ||
|
|
50fe1ba14d | ||
|
|
c7846c827b | ||
|
|
be8d241e06 | ||
|
|
545b97de65 | ||
|
|
64a2a85077 | ||
|
|
efa9f0a5d1 | ||
|
|
546262df38 | ||
|
|
6eb9a636d1 | ||
|
|
33f0900ab7 | ||
|
|
cde5f31135 | ||
|
|
7da01d8683 | ||
|
|
ccea31d3ab | ||
|
|
aebe5c1dfc | ||
|
|
1efd06ef56 | ||
|
|
7d7a85c78f | ||
|
|
28c4599436 | ||
|
|
7933435ffc | ||
|
|
1baaf560c5 | ||
|
|
0002d6f833 | ||
|
|
0c8782c0ff | ||
|
|
23a0b28326 | ||
|
|
8e10f79075 | ||
|
|
1e19574645 | ||
|
|
e7058e9135 | ||
|
|
c1140ec6a7 | ||
|
|
47127e9e4e | ||
|
|
04e42a8d70 | ||
|
|
1d7dd0a227 | ||
|
|
63b86cab2e | ||
|
|
9bd7847afb | ||
|
|
097a0c4a90 | ||
|
|
916c6b3b2f | ||
|
|
e82638fa03 | ||
|
|
dd26bcb22b | ||
|
|
47ec7141ac | ||
|
|
b42cc9f4ad | ||
|
|
4bde73d7a9 | ||
|
|
a9eb9f9ea5 | ||
|
|
2cda0fc1fe | ||
|
|
c62cd4dfcb | ||
|
|
c37cd19a23 | ||
|
|
dd8f1c7b38 | ||
|
|
3785fc4887 | ||
|
|
f6fb219ab2 | ||
|
|
6a2b4a81b5 | ||
|
|
15dae7dcbc | ||
|
|
e8013a4252 | ||
|
|
f6bc6a0bf6 | ||
|
|
57dc4ed476 | ||
|
|
9d3f6dacb8 | ||
|
|
cc651d0b4c | ||
|
|
f30f3ea8ed | ||
|
|
f317ff6d43 | ||
|
|
d277e80d81 | ||
|
|
cc801277ce | ||
|
|
45cf22ebf5 | ||
|
|
ce1a1f749a | ||
|
|
d797d10376 | ||
|
|
e04a3e7fce | ||
|
|
b8009d7c9a | ||
|
|
be783a65e0 | ||
|
|
6dc8b2f9f7 | ||
|
|
e37846bdcb | ||
|
|
9b4e5e57d6 | ||
|
|
e68969daa6 | ||
|
|
c584586985 | ||
|
|
c255e4bf8d | ||
|
|
c1c7cfd234 | ||
|
|
dc436a66cc | ||
|
|
699f40c9b2 | ||
|
|
84d20442a4 | ||
|
|
5416c2b778 | ||
|
|
5d09a25abc | ||
|
|
74f8c0e06a | ||
|
|
892f2be487 | ||
|
|
bf557a1bb0 | ||
|
|
073e99e538 | ||
|
|
ee544893f6 | ||
|
|
2c8cf7d7ea | ||
|
|
2c74944566 | ||
|
|
042147b010 | ||
|
|
0d3cc14c5e | ||
|
|
07f2e18dfc | ||
|
|
938819a8b8 | ||
|
|
4de708b5ad | ||
|
|
65d6c82f81 | ||
|
|
1da612e8a0 | ||
|
|
e6214480c4 | ||
|
|
6de61f3f5b | ||
|
|
81634d410b | ||
|
|
7528e2a9b2 | ||
|
|
a9a55321c7 | ||
|
|
4cbd8ea8c9 | ||
|
|
91f250d4d2 | ||
|
|
5102e71e84 | ||
|
|
7b9710aa4e | ||
|
|
624939f6ba | ||
|
|
16aaa93e76 | ||
|
|
7897500c1e | ||
|
|
64558e138b | ||
|
|
cc995b625b | ||
|
|
c81d1b5dd0 | ||
|
|
9ae58caadb | ||
|
|
f2f7681be2 | ||
|
|
970d8e813a | ||
|
|
4007834f15 | ||
|
|
96cd245463 | ||
|
|
6742d626e7 | ||
|
|
e1bde8c730 | ||
|
|
b44da3c27f | ||
|
|
8e70d18a32 | ||
|
|
f6ce901132 | ||
|
|
4637f4085d | ||
|
|
134b887adc | ||
|
|
4a4d7209ba | ||
|
|
e159e1a8bd | ||
|
|
ac9ee5d1f8 | ||
|
|
54435fce60 | ||
|
|
4092adbe28 | ||
|
|
06f81e8a61 | ||
|
|
e94774ccec | ||
|
|
a4d950a2f2 | ||
|
|
63bc66c40d | ||
|
|
2a053b86bf | ||
|
|
d643219ee8 | ||
|
|
74015d6d18 | ||
|
|
224bd55d50 | ||
|
|
4f51940274 | ||
|
|
d2263c121a | ||
|
|
075f8740d4 | ||
|
|
8fd442531f | ||
|
|
4f49061084 | ||
|
|
d02cdc2fec | ||
|
|
29a695b4a6 | ||
|
|
9504cb8531 | ||
|
|
8a341d78b1 | ||
|
|
63075b73bd | ||
|
|
2a27c469fe | ||
|
|
b3c159d968 | ||
|
|
fa25d7c428 | ||
|
|
ba769623be | ||
|
|
82ff19092b | ||
|
|
e5f59799ee | ||
|
|
88392f9bd3 | ||
|
|
0a3621cdee | ||
|
|
7c32c9c6e7 | ||
|
|
3f059575ee | ||
|
|
d4fb9b1343 | ||
|
|
9c2b0ac5ea | ||
|
|
5088e903cb | ||
|
|
5e8a6924b6 | ||
|
|
7c76a46cbc | ||
|
|
fbf44f1991 | ||
|
|
e37e0079be | ||
|
|
96c0050cb8 | ||
|
|
2c7b51ca56 | ||
|
|
d5747a0379 | ||
|
|
b0962095f3 | ||
|
|
77162e7784 | ||
|
|
6e116d9e59 | ||
|
|
a81b735016 | ||
|
|
e5464f5be7 | ||
|
|
d86f8a8981 | ||
|
|
deb8048da5 | ||
|
|
a88ad62af3 | ||
|
|
8cafd07e0a | ||
|
|
46309f7333 | ||
|
|
612c618240 | ||
|
|
e2bbbefb04 | ||
|
|
f1b59388bb | ||
|
|
c083150072 | ||
|
|
3353a74e1d | ||
|
|
79b5b0f1fc | ||
|
|
ed53728010 | ||
|
|
0fceadc529 | ||
|
|
404c52e3c2 | ||
|
|
9b5ec3572e | ||
|
|
46b4186216 | ||
|
|
bcf0a42674 | ||
|
|
029d0af946 | ||
|
|
f5e397341d | ||
|
|
32843f9f91 | ||
|
|
6ecd3f1f8a | ||
|
|
17bc493612 | ||
|
|
34f8013465 | ||
|
|
5b05afe948 | ||
|
|
686c6c9033 | ||
|
|
04239f9287 | ||
|
|
e163a796b2 | ||
|
|
63f1bf2d45 | ||
|
|
0e7d25ba85 | ||
|
|
b7792f0aa2 | ||
|
|
429a188318 | ||
|
|
0ff6026df8 | ||
|
|
984b35e2b0 | ||
|
|
fc319a4502 | ||
|
|
4f11ad7adb | ||
|
|
436c09aa51 | ||
|
|
cd3f6340da | ||
|
|
78428b523f | ||
|
|
f259b56e67 | ||
|
|
e0afb3b8b4 | ||
|
|
e2ddaf7577 | ||
|
|
63b9c5265f | ||
|
|
88b8e982b4 | ||
|
|
bf00102f83 | ||
|
|
4751cb16c9 | ||
|
|
c9111563b1 | ||
|
|
f7d25a8ee9 | ||
|
|
be24c90532 | ||
|
|
3c5093f3cb | ||
|
|
dd7072c875 | ||
|
|
6610929eaf | ||
|
|
39395465a2 | ||
|
|
071b10f3f4 | ||
|
|
5a8fb4651c | ||
|
|
eab7a961df | ||
|
|
23166f43d7 | ||
|
|
7427e01b60 | ||
|
|
7e4187e89a | ||
|
|
603e9336d4 | ||
|
|
03e6b1bff7 | ||
|
|
d833a65d1e | ||
|
|
e315170c8d | ||
|
|
c444d43fe8 | ||
|
|
c6d8f8ee28 | ||
|
|
108278c4b5 | ||
|
|
556306a269 | ||
|
|
49b1fe421e | ||
|
|
def0169dda | ||
|
|
a482132652 | ||
|
|
4cf6a4c22e | ||
|
|
10dddd85c5 | ||
|
|
fe24ce53b7 | ||
|
|
0ee104d155 | ||
|
|
b6b77f4b45 | ||
|
|
0fdfa32d4a | ||
|
|
7d1e1e6147 | ||
|
|
a4b4ebaf7d | ||
|
|
4677c5955d | ||
|
|
ca7f8e66bb | ||
|
|
0a6151ade9 | ||
|
|
039deed864 | ||
|
|
83cef11a78 | ||
|
|
0825819586 | ||
|
|
2d0c21f8a8 | ||
|
|
41695bf9ac | ||
|
|
23b65ca454 | ||
|
|
96f8392555 | ||
|
|
6df5de17c6 | ||
|
|
a539909972 | ||
|
|
85c022e1e7 | ||
|
|
dd60df83a1 | ||
|
|
e42605590f | ||
|
|
1a28d8d5d2 | ||
|
|
b945fc01dd | ||
|
|
85bd5a9933 | ||
|
|
63be4a3dd1 | ||
|
|
fbff08080a | ||
|
|
1e37afc49d | ||
|
|
23f72ac774 | ||
|
|
5c1a1d6e94 | ||
|
|
cef6b09b68 | ||
|
|
789532a95f | ||
|
|
be2174b1d2 | ||
|
|
f4449d1c9d | ||
|
|
7c52aa6932 | ||
|
|
76f663d31c | ||
|
|
e18e14f779 | ||
|
|
0a7d5b8e32 | ||
|
|
675715a917 | ||
|
|
590ca9c7a6 | ||
|
|
0d07a7be65 | ||
|
|
d3af29fada | ||
|
|
522d20d9e4 | ||
|
|
f38ac2cc7d | ||
|
|
d7654190f7 | ||
|
|
36369325e7 | ||
|
|
0835e0584a | ||
|
|
0ef64fde73 | ||
|
|
0bebaf410a | ||
|
|
8712598ca1 | ||
|
|
258e1f2348 | ||
|
|
ad553f3782 | ||
|
|
2b15c6f204 | ||
|
|
0bf87e554c | ||
|
|
64d1fcbe9c | ||
|
|
224550a50c | ||
|
|
60231ca8d9 | ||
|
|
92acc6d991 | ||
|
|
d2dfabee3f | ||
|
|
a9df82a0af | ||
|
|
fa683200b5 | ||
|
|
044194c64e | ||
|
|
651fd7b133 | ||
|
|
f4ac890a3c | ||
|
|
f7d8cfd5c8 | ||
|
|
5f14079695 | ||
|
|
fa2a36311f | ||
|
|
18988f0059 | ||
|
|
6fce22c555 | ||
|
|
71fb5185a4 | ||
|
|
fc3b3d5c96 | ||
|
|
839757e6c8 | ||
|
|
589e7f28e0 | ||
|
|
bf8eb078ca | ||
|
|
25bd7b13b6 | ||
|
|
f726622241 | ||
|
|
b5806968cb | ||
|
|
602332a97c | ||
|
|
3d95d9a8ee | ||
|
|
745c6e57c2 | ||
|
|
21f21dbe75 | ||
|
|
faeb4b9cd3 | ||
|
|
071343da5e | ||
|
|
91f4b8f504 | ||
|
|
1391df3948 | ||
|
|
5a301bff76 | ||
|
|
c8ac841fbb | ||
|
|
9c601ef49b | ||
|
|
4c2ccf1d6b | ||
|
|
16e7e4403e | ||
|
|
47dacc09ef | ||
|
|
4479080864 | ||
|
|
73695aa413 | ||
|
|
d6793e792d | ||
|
|
89e946cc51 | ||
|
|
17785070a4 | ||
|
|
0cd6c6eb08 | ||
|
|
9780277e48 | ||
|
|
a6b3addb4f | ||
|
|
17d2782182 | ||
|
|
086dac4444 | ||
|
|
9777cf3416 | ||
|
|
a89548ed48 | ||
|
|
7abfa7609e | ||
|
|
e332e8586f | ||
|
|
d06c2f93da | ||
|
|
4b25f24175 | ||
|
|
b894c423d3 | ||
|
|
c84f114dd6 | ||
|
|
61a2540ed4 | ||
|
|
4db5e54737 | ||
|
|
59464fa41b | ||
|
|
6d2a69113b | ||
|
|
467fd77a28 | ||
|
|
54f6e42a44 | ||
|
|
b9a295afaf | ||
|
|
f49dcdd62a | ||
|
|
42722d0fd6 | ||
|
|
aa83d9109b | ||
|
|
8db4e97d65 | ||
|
|
657a3b76c5 | ||
|
|
cafdce69fe | ||
|
|
298cba3c01 | ||
|
|
f6173cdb0d | ||
|
|
025b829638 | ||
|
|
a50b6f56d5 | ||
|
|
4e70bbc49f | ||
|
|
32805d8e36 | ||
|
|
20ab09a1d5 | ||
|
|
225afe0d6d | ||
|
|
c335e46384 | ||
|
|
fe7971759c | ||
|
|
d4b8fab303 | ||
|
|
55ae32362e | ||
|
|
db6d15624d | ||
|
|
4e6c0b6976 | ||
|
|
87fd28f0c2 | ||
|
|
8e0dc2055f | ||
|
|
d8d583ee57 | ||
|
|
f0753a82b5 | ||
|
|
372605440c | ||
|
|
b39a802336 | ||
|
|
bc430db812 | ||
|
|
6f308aba11 | ||
|
|
1714caae58 | ||
|
|
1ec7d264cf | ||
|
|
27a082c325 | ||
|
|
25a6b0cde6 | ||
|
|
415a176f6b | ||
|
|
9d844ef113 | ||
|
|
40c70cf06b | ||
|
|
9337cb591d | ||
|
|
91385e13eb | ||
|
|
1bf8ad6366 | ||
|
|
507235a681 | ||
|
|
e96bbdd31a | ||
|
|
ad79620983 | ||
|
|
1b800e2499 | ||
|
|
eaef1c70d6 | ||
|
|
f12c24ce0a | ||
|
|
e9eeb767e4 | ||
|
|
37f38b3211 | ||
|
|
0297bb1870 | ||
|
|
e33f3e31bc | ||
|
|
1e20118645 | ||
|
|
1ece6c1612 | ||
|
|
d8c88fa510 | ||
|
|
e9abfe3cc8 | ||
|
|
1fa580f6f0 | ||
|
|
a4812c4706 | ||
|
|
b521c8b97e | ||
|
|
b0f7aeabbb | ||
|
|
604ee63096 | ||
|
|
8fbf1267a5 | ||
|
|
31ad141f7e | ||
|
|
e7f55612b0 | ||
|
|
9b2097e5e4 | ||
|
|
73bc138b70 | ||
|
|
58134f78dc | ||
|
|
8105bced11 | ||
|
|
bcba74d0e7 | ||
|
|
b352e67088 | ||
|
|
1561b7a08a | ||
|
|
586fbbe925 | ||
|
|
c4e26724a4 | ||
|
|
5931c23695 | ||
|
|
7a2693e4f1 | ||
|
|
f968792286 | ||
|
|
fbf0303b2d | ||
|
|
390ef3b2ba | ||
|
|
c2712963d6 | ||
|
|
769c7b28ff | ||
|
|
a005d832cb | ||
|
|
c9508d9b7e | ||
|
|
39ba305f73 | ||
|
|
857becbd66 | ||
|
|
412710884c | ||
|
|
15fa3beb6d | ||
|
|
81a20ef328 | ||
|
|
bcd583914f | ||
|
|
a1abe14414 | ||
|
|
7cc8e74d1a | ||
|
|
678cbdc23d | ||
|
|
2d5fa3b9dc | ||
|
|
c4aec5ae33 | ||
|
|
69434c8b7d | ||
|
|
2d8b3b2b6e | ||
|
|
2e17562e51 | ||
|
|
405acfcbba | ||
|
|
e6516c3a90 | ||
|
|
1b9845e38f | ||
|
|
818cd278b2 | ||
|
|
1fa77fa5d7 | ||
|
|
6d9888462c | ||
|
|
d7c9193662 | ||
|
|
de3ef5fc1f | ||
|
|
97f3ed08c0 | ||
|
|
d0b5c705bf | ||
|
|
d094d0262b | ||
|
|
8b70eccca6 | ||
|
|
8005f1bb28 | ||
|
|
dc4541f267 | ||
|
|
edf94bf1b2 | ||
|
|
f4a66c4b22 | ||
|
|
4e2f371fc9 | ||
|
|
3fec97db45 | ||
|
|
6e7cc4414a | ||
|
|
8746d3de45 | ||
|
|
f803f8b92a | ||
|
|
0a4c00c5f2 | ||
|
|
4773dfd53f | ||
|
|
fecc974ade | ||
|
|
43ec140124 | ||
|
|
d483d14c8e | ||
|
|
9a28e559a4 | ||
|
|
29e810dd2a | ||
|
|
cfc811900d | ||
|
|
43cfd5fea5 | ||
|
|
bac918d4c8 | ||
|
|
e0c600eb14 | ||
|
|
d67096f58c | ||
|
|
fde3ee73af | ||
|
|
9c0bb3d392 | ||
|
|
8a7a966a7b | ||
|
|
4b44e07188 | ||
|
|
9676c2e486 | ||
|
|
5e8c1d0221 | ||
|
|
08a17fd5b2 | ||
|
|
a78df87f8e | ||
|
|
ddd2b740c8 | ||
|
|
87de768af4 | ||
|
|
a23a6f7c90 | ||
|
|
2c1255ffb6 | ||
|
|
bcab0ffcc6 | ||
|
|
dbc7957a50 | ||
|
|
41dbff4d76 | ||
|
|
a6ee4a680c | ||
|
|
90679c2cf5 | ||
|
|
dd9324ac05 | ||
|
|
94702f63ff | ||
|
|
b65b03765d | ||
|
|
c4eaa1359d | ||
|
|
48375bb780 | ||
|
|
70d5e5a012 | ||
|
|
8083432925 | ||
|
|
a4a210c9e5 | ||
|
|
7bd4775b01 | ||
|
|
75878b96e6 | ||
|
|
3379467484 | ||
|
|
930673c2f2 | ||
|
|
dd7c562c96 | ||
|
|
46ae9146d8 | ||
|
|
7503242a6a | ||
|
|
7db7482ac5 | ||
|
|
a659d40202 | ||
|
|
11dcf5b970 | ||
|
|
3484cb7964 | ||
|
|
880171aa08 | ||
|
|
ab0b60c584 | ||
|
|
76bc18cb12 | ||
|
|
12237142da | ||
|
|
3c2dca13ab | ||
|
|
383ce0599e | ||
|
|
175f06a7f9 | ||
|
|
c33a26b2f9 | ||
|
|
dc918930ab | ||
|
|
a7d616c224 | ||
|
|
df598675fb | ||
|
|
5ff4125c56 | ||
|
|
8e9335d49f | ||
|
|
6038064e71 | ||
|
|
4ac1c29ca9 | ||
|
|
31b3a2a350 | ||
|
|
2e2f5bc165 | ||
|
|
49a54e0978 | ||
|
|
bf366ea075 | ||
|
|
1cf5d5db9e | ||
|
|
73c83cbd25 | ||
|
|
001fcb43e7 | ||
|
|
75ea3b9edb | ||
|
|
2a15cffbb9 | ||
|
|
1eb3e1711a | ||
|
|
1cac01280a | ||
|
|
3d315a891b | ||
|
|
bed22463dc | ||
|
|
90f97f14ee | ||
|
|
c092fb3303 | ||
|
|
a30b117c60 | ||
|
|
f6e054ba73 | ||
|
|
cb79f816a0 | ||
|
|
bd0d0eead7 | ||
|
|
e4a12b22b4 | ||
|
|
df226053cf | ||
|
|
ebac219ba3 | ||
|
|
c858a13aa3 | ||
|
|
bfe1760904 | ||
|
|
ea323d260e | ||
|
|
f2d380ce96 | ||
|
|
f9f542e7e3 | ||
|
|
e241e4334f | ||
|
|
8826892b00 | ||
|
|
cc1c20d6fe | ||
|
|
3890e85527 | ||
|
|
e4dea6da91 | ||
|
|
d08c0953fb | ||
|
|
ceae0c539e | ||
|
|
25b978126e | ||
|
|
5189991b53 | ||
|
|
ae10bd8332 | ||
|
|
8d87846907 | ||
|
|
098267f942 | ||
|
|
b92705f414 | ||
|
|
8937ae9073 | ||
|
|
fb6b2c7d23 | ||
|
|
bc9473a439 | ||
|
|
47412da33a | ||
|
|
7d563b8789 | ||
|
|
4d617a1aab | ||
|
|
d0d73ca2c0 | ||
|
|
32b0170c3b | ||
|
|
d7904efccf | ||
|
|
8441f8bff7 | ||
|
|
47cafb52b5 | ||
|
|
20c8e12e09 | ||
|
|
61645fe5a9 | ||
|
|
bc917a33b6 | ||
|
|
9751a9c8cb | ||
|
|
ad22d4b9b5 | ||
|
|
e5bba0529a | ||
|
|
c17df70f8e | ||
|
|
5d37d87cf1 | ||
|
|
6a610949e9 | ||
|
|
eba3105cae | ||
|
|
47fb0afe79 | ||
|
|
bf6d114893 | ||
|
|
f5d4bf8fc4 | ||
|
|
1254020b8b | ||
|
|
7f03c17a08 | ||
|
|
4440506858 | ||
|
|
01b4820b93 | ||
|
|
6bf1a8ffda | ||
|
|
fc8ee11955 | ||
|
|
fe30f9739b | ||
|
|
6be0089cac | ||
|
|
80cb93f8e1 | ||
|
|
a3ad4b3616 | ||
|
|
5fedbdf414 | ||
|
|
125555afcf | ||
|
|
89b5907eb6 | ||
|
|
68d262ba93 | ||
|
|
ee3a44388c | ||
|
|
5ae4ebccba | ||
|
|
51e15ced3f | ||
|
|
aac716d497 | ||
|
|
420fe9710b | ||
|
|
e57954ef2e | ||
|
|
2353ca0621 | ||
|
|
8bc5770c28 | ||
|
|
913517f19d | ||
|
|
0d385c237a | ||
|
|
94bf21b9be | ||
|
|
a4b697f41e | ||
|
|
b047c1318f | ||
|
|
a5d6881e9e | ||
|
|
eddbbc58b1 | ||
|
|
908db3cd59 | ||
|
|
8a42ab14ad | ||
|
|
c2f70d1cc7 | ||
|
|
89452a9d8e | ||
|
|
563411a33a | ||
|
|
d1889b77e5 | ||
|
|
e8a9d1bdc7 | ||
|
|
9b2de5f215 | ||
|
|
779cac9b77 | ||
|
|
a4d77bec6b | ||
|
|
dd6bad1b6e | ||
|
|
0d93816827 | ||
|
|
ca95d76659 | ||
|
|
d58a83cda7 | ||
|
|
5256656efa | ||
|
|
bb1e00a263 | ||
|
|
b2f0ed0cb9 | ||
|
|
75a43a536c | ||
|
|
0263c2cf68 | ||
|
|
69c5373db0 | ||
|
|
a55d02dd31 | ||
|
|
02d318e66d | ||
|
|
9f72ca2329 | ||
|
|
2d12ad9251 | ||
|
|
09c072bda6 | ||
|
|
9909a4123f | ||
|
|
63c59b6570 | ||
|
|
ee4cd4756b | ||
|
|
bd0c6c9ce3 | ||
|
|
213e621412 | ||
|
|
2d9056aa78 | ||
|
|
5d53a9edaf | ||
|
|
c2fb0fffbd | ||
|
|
fc05fad277 | ||
|
|
1466d2b97e | ||
|
|
13351c0091 | ||
|
|
19f98ce8ea | ||
|
|
4b5fefa521 | ||
|
|
f8b4dc3a2d | ||
|
|
4d571290c7 | ||
|
|
3a35da8f27 | ||
|
|
1b1efbd0f0 | ||
|
|
d068c85e80 | ||
|
|
145ea416be | ||
|
|
0b6be3a0f6 | ||
|
|
7cf2cf0756 | ||
|
|
69eb3a9756 | ||
|
|
7b20da2276 | ||
|
|
eb376899ce | ||
|
|
2123ee0218 | ||
|
|
6e94c70fbb | ||
|
|
80b181293a | ||
|
|
fb59508ad1 | ||
|
|
9e20b3a18e | ||
|
|
505c44a4d3 | ||
|
|
c0d55112b4 | ||
|
|
e246db4604 | ||
|
|
2d5e41d566 | ||
|
|
c3e248ec79 | ||
|
|
7da60e219d | ||
|
|
8978f27145 | ||
|
|
a6749c0a26 | ||
|
|
d20fe1f4ee | ||
|
|
05fe9b6b81 | ||
|
|
e4b677be3d | ||
|
|
05a98a0107 | ||
|
|
769f864360 | ||
|
|
af3012abff | ||
|
|
cdebffe462 | ||
|
|
5b9c9c4833 | ||
|
|
9605a6b712 | ||
|
|
6f304736c5 | ||
|
|
dbe7ef7a0c | ||
|
|
f0a705595b | ||
|
|
076540752b | ||
|
|
5bc8f819f0 | ||
|
|
f3e1df3997 | ||
|
|
465ce80e41 | ||
|
|
b2f72d3f70 | ||
|
|
a676590e30 | ||
|
|
7688535204 | ||
|
|
7310a2c6cc | ||
|
|
3bbc052794 | ||
|
|
d57749ec98 | ||
|
|
5b637c68ee | ||
|
|
3e8ca224a8 | ||
|
|
6e6a7de1a8 | ||
|
|
ff2e425b48 | ||
|
|
f7ee864709 | ||
|
|
93330eaf1d | ||
|
|
c4503cb8f8 | ||
|
|
a11957d0b4 | ||
|
|
2177e51857 | ||
|
|
ff3bbc56bc | ||
|
|
3e5d43fd8b | ||
|
|
fada3aabfa | ||
|
|
7a09086c6b | ||
|
|
890829aa93 | ||
|
|
88096cbbfe | ||
|
|
c56f5421f0 | ||
|
|
fa6eb2fc22 | ||
|
|
c547d2cf67 | ||
|
|
2f5f63ed13 | ||
|
|
2237ebd46e | ||
|
|
f4679bffc3 | ||
|
|
133bfe161c | ||
|
|
39961a686f | ||
|
|
dfedda8e28 | ||
|
|
7e17d38754 | ||
|
|
9f7e091aba | ||
|
|
55a276ff9a | ||
|
|
5f5c5f3d42 | ||
|
|
83aab8f825 | ||
|
|
d5bc4c0522 | ||
|
|
e5133e27e6 | ||
|
|
bbbf822561 | ||
|
|
b0e26d865c | ||
|
|
0bf1d14756 | ||
|
|
e5676aaf9b | ||
|
|
acc4d77fe9 | ||
|
|
241c2e5d38 | ||
|
|
cab6ce93d6 | ||
|
|
aad9f76a39 | ||
|
|
ec19ceb22f | ||
|
|
1689a121e5 | ||
|
|
120a694324 | ||
|
|
90c67d8f64 | ||
|
|
a2db424eb1 | ||
|
|
bff582d5ed | ||
|
|
8bc9868705 | ||
|
|
7b46bfa0d1 | ||
|
|
2770752813 | ||
|
|
2d83b6edb2 | ||
|
|
39e76b0e4f | ||
|
|
e9805c98d5 | ||
|
|
177af6cae7 | ||
|
|
cb1bbeaf3a | ||
|
|
46a1a8dfde | ||
|
|
4b4ac7c706 | ||
|
|
ad0ad2c4e1 | ||
|
|
df2204d50f | ||
|
|
fa883a0220 | ||
|
|
436833f138 | ||
|
|
4ecee47caa | ||
|
|
5db75661cf | ||
|
|
64b5010b15 | ||
|
|
0733018ba5 | ||
|
|
6f43efde23 | ||
|
|
fb75153d29 | ||
|
|
339227877a | ||
|
|
7710b1df43 | ||
|
|
c0a8460575 | ||
|
|
7027c7486b | ||
|
|
a42b56c7c7 | ||
|
|
c331659026 | ||
|
|
01088f77ab | ||
|
|
7d302574cc | ||
|
|
ee4a419019 | ||
|
|
1173b33715 | ||
|
|
0fe5a3ba5e | ||
|
|
6c06bfbf41 | ||
|
|
6bab1d2840 | ||
|
|
89044a8649 | ||
|
|
94e686ba44 | ||
|
|
86110cf1de | ||
|
|
9b664e2944 | ||
|
|
78ff568dfb | ||
|
|
e1d2709431 | ||
|
|
47556f2290 | ||
|
|
531eb4b417 | ||
|
|
7f8b1e920a | ||
|
|
2f084d204e | ||
|
|
a93fedf945 | ||
|
|
8fd88300ce | ||
|
|
d3f0331e8e | ||
|
|
9fb0da69cc | ||
|
|
4675bf9ae8 | ||
|
|
da631cd441 | ||
|
|
fd40f53d2e | ||
|
|
9f420af5e2 | ||
|
|
9ff4b0e5b2 | ||
|
|
901cb1fab0 | ||
|
|
809c93a19e | ||
|
|
62c307d6f2 | ||
|
|
31488478c1 | ||
|
|
59fa14f989 | ||
|
|
1c34777024 | ||
|
|
dc3bc9f30d | ||
|
|
96692bfc3b | ||
|
|
4aa3927b55 | ||
|
|
6eea879a14 | ||
|
|
c7862fd701 | ||
|
|
e1f4426f76 | ||
|
|
cc37769c91 | ||
|
|
337d533dd5 | ||
|
|
bc4a62da96 | ||
|
|
4a58c778e4 | ||
|
|
866e9e73b1 | ||
|
|
3582f6501a | ||
|
|
dfa0970585 | ||
|
|
33f2d2fbd8 | ||
|
|
85bb30a19d | ||
|
|
90ee83fb3e | ||
|
|
bb30cac9df | ||
|
|
d8ecb4afec | ||
|
|
9d097c7cc1 | ||
|
|
e7356bfbb6 | ||
|
|
b0d84a4a3d | ||
|
|
ee795362ba | ||
|
|
e5e76f163c | ||
|
|
d47db72584 | ||
|
|
cde8738f0e | ||
|
|
925a174ae2 | ||
|
|
5654c97c6b | ||
|
|
d9590baf4c | ||
|
|
dda1a38143 | ||
|
|
d239b319ef | ||
|
|
8164e8eac3 | ||
|
|
60cbe5ec4c | ||
|
|
b9b735ce9f | ||
|
|
65032619e2 | ||
|
|
da581072b4 | ||
|
|
f242eba9c1 | ||
|
|
7dad802981 | ||
|
|
3f54e37143 | ||
|
|
ad3c0ebbfe | ||
|
|
4fce2f394d | ||
|
|
ce61609900 | ||
|
|
ae23300c07 | ||
|
|
e7055bedf8 | ||
|
|
dffc613d46 | ||
|
|
7fb2974259 | ||
|
|
4138785a4e | ||
|
|
91b788dc57 | ||
|
|
0bfb73b632 | ||
|
|
893475ad89 | ||
|
|
8bd9ab7b84 | ||
|
|
266487fdab | ||
|
|
76902e00eb | ||
|
|
2cf7ed0d26 | ||
|
|
1060e3c25a | ||
|
|
562486c14e | ||
|
|
acd0a98641 | ||
|
|
92e75fe05d | ||
|
|
43646b78ef | ||
|
|
03d076197f | ||
|
|
596b15799d | ||
|
|
d6e1705a1a | ||
|
|
525c8d3dd9 | ||
|
|
defa3a0922 | ||
|
|
15c2187c57 | ||
|
|
cabf623e11 | ||
|
|
47f2e0a8f7 | ||
|
|
b5af497aad | ||
|
|
514d2b38b4 | ||
|
|
2f5a09bc99 | ||
|
|
11c2d5dce4 | ||
|
|
bfc735a004 | ||
|
|
b26bb2e5b7 | ||
|
|
366ac0c03c | ||
|
|
617438d770 | ||
|
|
dfb0789191 | ||
|
|
8db441d6a8 | ||
|
|
1a1840ae11 | ||
|
|
cc7128ce4c | ||
|
|
9d87a82210 | ||
|
|
d6692e3ead | ||
|
|
80b408f9a6 | ||
|
|
7f486ac48f | ||
|
|
1ea356688f | ||
|
|
193ca45248 | ||
|
|
6678e48ccc | ||
|
|
1eab2ccba3 | ||
|
|
2d09b3dbdf | ||
|
|
83b01aa627 | ||
|
|
0a3ff11223 | ||
|
|
c9b28c7692 | ||
|
|
c890dc8d43 | ||
|
|
84477fccee | ||
|
|
1d103f11c3 | ||
|
|
c157f0cdad | ||
|
|
8e1f54a213 | ||
|
|
17a691ad39 | ||
|
|
2ff3c37a54 | ||
|
|
c48a521882 | ||
|
|
a8ceb6bcaf | ||
|
|
1fcda8092e | ||
|
|
c3471fd04e | ||
|
|
c5b9a4eb17 | ||
|
|
b90f3c7d32 | ||
|
|
38663e1365 | ||
|
|
d8d49d1835 | ||
|
|
25f9500d5a | ||
|
|
7de9b97c6c | ||
|
|
bd60d7cd3b | ||
|
|
eaacc34c6e | ||
|
|
b2ef660b3a | ||
|
|
22f9c69fc1 | ||
|
|
2f896ab068 | ||
|
|
9d2d7ee869 | ||
|
|
b749236724 | ||
|
|
fc6f7ceba4 | ||
|
|
d4aba14fea | ||
|
|
cff1c299ab | ||
|
|
8fd12c53d2 | ||
|
|
68133801d8 | ||
|
|
79e3951ac8 | ||
|
|
4ca6a04ce3 | ||
|
|
cc687c8ead | ||
|
|
1e139dc86c | ||
|
|
552e7a8cf1 | ||
|
|
dc9b619307 | ||
|
|
1f6855f085 | ||
|
|
fef902f1da | ||
|
|
ec8deaad69 | ||
|
|
f66a45ba8b | ||
|
|
40f8a12c40 | ||
|
|
3ca4aa6858 | ||
|
|
4004153a5a | ||
|
|
a006082a47 | ||
|
|
7753257842 | ||
|
|
63d54b0212 | ||
|
|
feb445d558 | ||
|
|
b973dd342a | ||
|
|
e3378d23d4 | ||
|
|
38c799e27e | ||
|
|
350ceddf3f | ||
|
|
86daac1424 | ||
|
|
39075fe06d | ||
|
|
b8b0869a54 | ||
|
|
eb0383ea89 | ||
|
|
cab8e4e7f5 | ||
|
|
f03efd9460 | ||
|
|
8f715434ac | ||
|
|
4ecd589d84 | ||
|
|
0a5bd40430 | ||
|
|
6862cbdec2 | ||
|
|
72605cac51 | ||
|
|
a2ab0cde79 | ||
|
|
d6739192fd | ||
|
|
410ea1f8f1 | ||
|
|
e42d63c7be | ||
|
|
f7baf2716a | ||
|
|
0671556002 | ||
|
|
36f236bc44 | ||
|
|
b160b1d1d5 | ||
|
|
1246878f00 | ||
|
|
27237acc88 | ||
|
|
8eb4317e37 | ||
|
|
4412b13928 | ||
|
|
9497090093 | ||
|
|
8175e4e723 | ||
|
|
a256f58de1 | ||
|
|
44818d3527 | ||
|
|
c517d73a71 | ||
|
|
4076c8ddaf | ||
|
|
5325a93990 | ||
|
|
a1afdc5f3c | ||
|
|
6e5db9e44e | ||
|
|
2b6a69068c | ||
|
|
21475e86f2 | ||
|
|
c13507ae0c | ||
|
|
0646509b9a | ||
|
|
0dbc0f0442 | ||
|
|
919a8e81ea | ||
|
|
5608bf868e | ||
|
|
df238e2f44 | ||
|
|
f0080b944d | ||
|
|
a1b4da6a30 | ||
|
|
816327f4f7 | ||
|
|
964499a06f | ||
|
|
866f53658e | ||
|
|
8707f3f122 | ||
|
|
09c51d1a6a | ||
|
|
bf1903d17b | ||
|
|
2ea1af59b9 | ||
|
|
8c9d4b58ed | ||
|
|
0856790760 | ||
|
|
d9205adc60 | ||
|
|
2b44c68794 | ||
|
|
c9b1d0c75f | ||
|
|
7a65dca973 | ||
|
|
bfb3a105ac | ||
|
|
c96b1d4db3 | ||
|
|
dbe741da12 | ||
|
|
49547a33f8 | ||
|
|
49a50152cc | ||
|
|
f1ba07eab7 | ||
|
|
7b24b47adf | ||
|
|
bf8cf9fb81 | ||
|
|
a7a6812a19 | ||
|
|
af2b6f8034 | ||
|
|
9aac004c2c | ||
|
|
7f6bdbe6eb | ||
|
|
f06534eb2e | ||
|
|
e42fe2fead | ||
|
|
a78ea8f2e8 | ||
|
|
dcf50104f0 | ||
|
|
57619fca06 | ||
|
|
748009735c | ||
|
|
577fc7b528 | ||
|
|
d6fe59bf73 | ||
|
|
dedad11102 | ||
|
|
d32692922b | ||
|
|
7b3c0009f6 | ||
|
|
a5c85244a7 | ||
|
|
aea3154b3b | ||
|
|
f7c8fe9857 | ||
|
|
eb067af098 | ||
|
|
71c5c5814c | ||
|
|
73b042cc82 | ||
|
|
4d2714facc | ||
|
|
d27d8fd087 | ||
|
|
e468f0d5fc | ||
|
|
c0715b4c63 | ||
|
|
445b5ad231 | ||
|
|
315bf64ccb | ||
|
|
d6ccc48963 | ||
|
|
1544f6b6ed | ||
|
|
d1dcc41f69 | ||
|
|
0777561390 | ||
|
|
0c473c6ccb | ||
|
|
974540cc63 | ||
|
|
fc3b967f33 | ||
|
|
b1abcb9310 | ||
|
|
3d38150563 | ||
|
|
380c0b1408 | ||
|
|
5dabd945bd | ||
|
|
9cd49f1554 | ||
|
|
c72bb4502a | ||
|
|
ebfe8fbfd4 | ||
|
|
5a6350df2a | ||
|
|
0afd6cee46 | ||
|
|
a6f5141f42 | ||
|
|
fbb88452fb | ||
|
|
af11110e0f | ||
|
|
d07d4f5300 | ||
|
|
b557331d63 | ||
|
|
280e039e19 | ||
|
|
4935b88588 | ||
|
|
d950ae0ee4 | ||
|
|
1bbe6e1068 | ||
|
|
6e3445c2d6 | ||
|
|
569edb7685 | ||
|
|
d610872ee7 | ||
|
|
8414b1de2b | ||
|
|
0b8daf5283 | ||
|
|
cb6824755d | ||
|
|
1782af2abb | ||
|
|
45f4b64cd4 | ||
|
|
cf69a7ae33 | ||
|
|
637a41d392 | ||
|
|
45b8364b0e | ||
|
|
f55d6fa640 | ||
|
|
ecc8c8af8f | ||
|
|
0c45e9eac4 | ||
|
|
b6820e7e79 | ||
|
|
024d776d2c | ||
|
|
7148f377c4 | ||
|
|
9cefda4f7b | ||
|
|
f78046acce | ||
|
|
9405abb3fd | ||
|
|
eaf7a123d4 | ||
|
|
fce6d2982e | ||
|
|
99dbf35953 | ||
|
|
892745a592 | ||
|
|
922d0ab150 | ||
|
|
ed8df15de4 | ||
|
|
ad2a9a4cea | ||
|
|
ce50c08e91 | ||
|
|
64852194ea | ||
|
|
0ef1fa0627 | ||
|
|
fea552511e | ||
|
|
7c90b4630b | ||
|
|
90d8a11917 | ||
|
|
1bdc650635 | ||
|
|
d0d46d482e | ||
|
|
af0c8d57b5 | ||
|
|
dc7ac427b5 | ||
|
|
ebf7fd20ae | ||
|
|
6d68aabc41 | ||
|
|
8ad9b481a8 | ||
|
|
e6028a913c | ||
|
|
53b7ef0429 | ||
|
|
14cd444f8d | ||
|
|
525a9e381f | ||
|
|
3a4463d2e4 | ||
|
|
2aab61b91d | ||
|
|
4b59ae0976 | ||
|
|
fa5edfb53e | ||
|
|
3980f08440 | ||
|
|
237edae7df | ||
|
|
61c5777a6b | ||
|
|
6852f6ee80 | ||
|
|
2965b351a5 | ||
|
|
798e021803 | ||
|
|
def6cb2c92 | ||
|
|
a053641ea5 | ||
|
|
c6bf07973e |
97
.clang-format
Normal file
97
.clang-format
Normal file
@@ -0,0 +1,97 @@
|
||||
---
|
||||
Language: Cpp
|
||||
# BasedOnStyle: LLVM
|
||||
AccessModifierOffset: -2
|
||||
AlignAfterOpenBracket: Align
|
||||
AlignConsecutiveAssignments: true
|
||||
AlignConsecutiveDeclarations: false
|
||||
AlignEscapedNewlinesLeft: false
|
||||
AlignOperands: true
|
||||
AlignTrailingComments: true
|
||||
AllowAllParametersOfDeclarationOnNextLine: true
|
||||
AllowShortBlocksOnASingleLine: false
|
||||
AllowShortCaseLabelsOnASingleLine: true
|
||||
AllowShortFunctionsOnASingleLine: None
|
||||
AllowShortIfStatementsOnASingleLine: true
|
||||
AllowShortLoopsOnASingleLine: true
|
||||
AlwaysBreakAfterDefinitionReturnType: None
|
||||
AlwaysBreakAfterReturnType: None
|
||||
AlwaysBreakBeforeMultilineStrings: false
|
||||
AlwaysBreakTemplateDeclarations: false
|
||||
BinPackArguments: true
|
||||
BinPackParameters: true
|
||||
BreakBeforeBraces: Custom
|
||||
BraceWrapping:
|
||||
AfterClass: false
|
||||
AfterControlStatement: false
|
||||
AfterEnum: false
|
||||
AfterFunction: true
|
||||
AfterNamespace: false
|
||||
AfterObjCDeclaration: false
|
||||
AfterStruct: true
|
||||
AfterUnion: true
|
||||
BeforeCatch: false
|
||||
BeforeElse: false
|
||||
IndentBraces: false
|
||||
SplitEmptyFunction: false
|
||||
BreakBeforeBinaryOperators: None
|
||||
BreakBeforeTernaryOperators: true
|
||||
BreakConstructorInitializersBeforeComma: false
|
||||
BreakAfterJavaFieldAnnotations: false
|
||||
BreakStringLiterals: true
|
||||
ColumnLimit: 120
|
||||
CommentPragmas: '^ IWYU pragma:'
|
||||
ConstructorInitializerAllOnOneLineOrOnePerLine: false
|
||||
ConstructorInitializerIndentWidth: 4
|
||||
ContinuationIndentWidth: 4
|
||||
Cpp11BracedListStyle: true
|
||||
DerivePointerAlignment: false
|
||||
DisableFormat: false
|
||||
ExperimentalAutoDetectBinPacking: false
|
||||
ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ]
|
||||
IncludeCategories:
|
||||
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
|
||||
Priority: 2
|
||||
- Regex: '^(<|"(gtest|isl|json)/)'
|
||||
Priority: 3
|
||||
- Regex: '.*'
|
||||
Priority: 1
|
||||
IncludeIsMainRegex: '$'
|
||||
IndentCaseLabels: true
|
||||
IndentWidth: 4
|
||||
IndentWrappedFunctionNames: false
|
||||
JavaScriptQuotes: Leave
|
||||
JavaScriptWrapImports: true
|
||||
KeepEmptyLinesAtTheStartOfBlocks: true
|
||||
MacroBlockBegin: ''
|
||||
MacroBlockEnd: ''
|
||||
MaxEmptyLinesToKeep: 1
|
||||
NamespaceIndentation: None
|
||||
ObjCBlockIndentWidth: 2
|
||||
ObjCSpaceAfterProperty: false
|
||||
ObjCSpaceBeforeProtocolList: true
|
||||
PenaltyBreakBeforeFirstCallParameter: 19
|
||||
PenaltyBreakComment: 300
|
||||
PenaltyBreakFirstLessLess: 120
|
||||
PenaltyBreakString: 1000
|
||||
PenaltyExcessCharacter: 1000000
|
||||
PenaltyReturnTypeOnItsOwnLine: 60
|
||||
PointerAlignment: Middle
|
||||
ReflowComments: true
|
||||
SortIncludes: false
|
||||
SpaceAfterCStyleCast: false
|
||||
SpaceAfterTemplateKeyword: true
|
||||
SpaceBeforeAssignmentOperators: true
|
||||
SpaceBeforeParens: Never
|
||||
SpaceInEmptyParentheses: false
|
||||
SpacesBeforeTrailingComments: 1
|
||||
SpacesInAngles: false
|
||||
SpacesInContainerLiterals: false
|
||||
SpacesInCStyleCastParentheses: false
|
||||
SpacesInParentheses: false
|
||||
SpacesInSquareBrackets: false
|
||||
Standard: Cpp11
|
||||
TabWidth: 4
|
||||
UseTab: Never
|
||||
...
|
||||
|
||||
7
.editorconfig
Normal file
7
.editorconfig
Normal file
@@ -0,0 +1,7 @@
|
||||
[*.{c,h}]
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
14
.github/ISSUE_TEMPLATE/all-other-issues.md
vendored
Normal file
14
.github/ISSUE_TEMPLATE/all-other-issues.md
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
---
|
||||
name: All other issues
|
||||
about: Questions and enhancement requests should go to the forum.
|
||||
title: ''
|
||||
labels: not-template
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
# All enhancement requests or questions should be directed to the Forum.
|
||||
|
||||
|
||||
We use GitHub issues for development related discussions.
|
||||
Please use the [forum](https://forum.littlevgl.com/) to ask questions.
|
||||
29
.github/ISSUE_TEMPLATE/bug-report.md
vendored
Normal file
29
.github/ISSUE_TEMPLATE/bug-report.md
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
> # Important: issues that don't use this template will be ignored/closed.
|
||||
|
||||
**Describe the bug**
|
||||
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**To Reproduce**
|
||||
|
||||
Please provide a small, independent code sample that can be used to reproduce the issue. Ideally this should work in the PC simulator unless the problem is specific to one platform.
|
||||
|
||||
**Expected behavior**
|
||||
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Additional context**
|
||||
|
||||
Add any other context about the problem here.
|
||||
17
.github/stale.yml
vendored
Normal file
17
.github/stale.yml
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
# Number of days of inactivity before an issue becomes stale
|
||||
daysUntilStale: 21
|
||||
# Number of days of inactivity before a stale issue is closed
|
||||
daysUntilClose: 7
|
||||
# Issues with these labels will never be considered stale
|
||||
exemptLabels:
|
||||
- architecture
|
||||
- pinned
|
||||
# Label to use when marking an issue as stale
|
||||
staleLabel: stale
|
||||
# Comment to post when marking an issue as stale. Set to `false` to disable
|
||||
markComment: >
|
||||
This issue or pull request has been automatically marked as stale because it has not had
|
||||
recent activity. It will be closed if no further activity occurs. Thank you
|
||||
for your contributions.
|
||||
# Comment to post when closing a stale issue. Set to `false` to disable
|
||||
closeComment: false
|
||||
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
**/*.o
|
||||
**/*.swp
|
||||
**/*.swo
|
||||
tags
|
||||
docs/api_doc
|
||||
396
README.md
Normal file
396
README.md
Normal file
@@ -0,0 +1,396 @@
|
||||
<h1 align="center"> LittlevGL - Open-source Embedded GUI Library</h1>
|
||||
<p align="center">
|
||||
<a href="https://github.com/littlevgl/lvgl/blob/master/LICENCE.txt"><img src="https://img.shields.io/badge/licence-MIT-blue.svg"></a>
|
||||
<a href="https://github.com/littlevgl/lvgl/releases/tag/v6.0"><img src="https://img.shields.io/badge/version-6.0-blue.svg"></a>
|
||||
<br>
|
||||
<img src="https://littlevgl.com/github/cover_ori_reduced_2.gif">
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
LittlevGL provides everything you need to create a Graphical User Interface (GUI) on embedded systems with easy-to-use graphical elements, beautiful visual effects and low memory footprint.
|
||||
</p>
|
||||
|
||||
<h4 align="center">
|
||||
<a href="https://littlevgl.com">Website </a> ·
|
||||
<a href="https://littlevgl.com/live-demo">Live demo</a> ·
|
||||
<a href="https://docs.littlevgl.com/en/html/get-started/pc-simulator.html">Simulator</a> ·
|
||||
<a href="https://forum.littlevgl.com">Forum</a> ·
|
||||
<a href="https://docs.littlevgl.com/">Docs</a> ·
|
||||
<a href="https://blog.littlevgl.com/">Blog</a>
|
||||
</h4>
|
||||
|
||||
---
|
||||
|
||||
- [Features](#features)
|
||||
- [Supported devices](#supported-devices)
|
||||
- [Quick start in a simulator](#quick-start-in-a-simulator)
|
||||
- [Add LittlevGL to your project](#add-littlevgl-to-your-project)
|
||||
- [Learn the basics](#learn-the-basics)
|
||||
- [Examples](#examples)
|
||||
- [Contributing](#contributing)
|
||||
- [Donate](#donate)
|
||||
|
||||
|
||||
## Features
|
||||
* **Powerful building blocks** buttons, charts, lists, sliders, images, etc.
|
||||
* **Advanced graphics** with animations, anti-aliasing, opacity, smooth scrolling
|
||||
* **Simultaneously use various input devices** touchscreen, mouse, keyboard, encoder, buttons, etc.
|
||||
* **Simultaneously use multiple displays** i.e. monochrome and color display
|
||||
* **Multi-language support** with UTF-8 encoding
|
||||
* **Fully customizable** graphical elements
|
||||
* **Hardware independent** to use with any microcontroller or display
|
||||
* **Scalable** to operate with little memory (64 kB Flash, 10 kB RAM)
|
||||
* **OS, External memory and GPU** supported but not required
|
||||
* **Single frame buffer** operation even with advances graphical effects
|
||||
* **Written in C** for maximal compatibility
|
||||
* **Micropython Binding** exposes [LittlevGL API in Micropython](https://blog.littlevgl.com/2019-02-20/micropython-bindings)
|
||||
* **Simulator** to develop on PC without embedded hardware
|
||||
* **Tutorials, examples, themes** for rapid development
|
||||
* **Documentation** and API references
|
||||
|
||||
## Supported devices
|
||||
Basically, every modern controller - which is able to drive a display - is suitable to run LittlevGL. The minimal requirements:
|
||||
- 16, 32 or 64 bit microcontroller or processor
|
||||
- > 16 MHz clock speed is recommended
|
||||
- Flash/ROM: > 64 kB for the very essential components (> 180 kB is recommended)
|
||||
- RAM:
|
||||
- Static RAM usage: ~8..16 kB depending on the used features and objects types
|
||||
- Stack: > 2kB (> 4 kB is recommended)
|
||||
- Dynamic data (heap): > 4 KB (> 16 kB is recommended if using several objects).
|
||||
Set by `LV_MEM_SIZE` in *lv_conf.h*.
|
||||
- Display buffer: > *"Horizontal resolution"* pixels (> 10 × *"Horizontal resolution"* is recommended)
|
||||
- C99 or newer compiler
|
||||
|
||||
*Note that the memory usage might vary depending on the architecture, compiler and build options.*
|
||||
|
||||
Just to mention some **platforms**:
|
||||
- STM32F1, STM32F3, [STM32F4](https://blog.littlevgl.com/2017-07-15/stm32f429_disco_port), [STM32F7](https://github.com/littlevgl/stm32f746_disco_no_os_sw4stm32)
|
||||
- Microchip dsPIC33, PIC24, PIC32MX, PIC32MZ
|
||||
- NXP Kinetis, LPC, iMX
|
||||
- [Linux frame buffer](https://blog.littlevgl.com/2018-01-03/linux_fb) (/dev/fb)
|
||||
- [Raspberry PI](http://www.vk3erw.com/index.php/16-software/63-raspberry-pi-official-7-touchscreen-and-littlevgl)
|
||||
- [Espressif ESP32](https://github.com/littlevgl/esp32_ili9431)
|
||||
- Nordic nrf52
|
||||
- Quectell M66
|
||||
|
||||
## Quick start in a simulator
|
||||
The easiest way to get started with LittlevGL is to run it in a simulator on your PC without any embedded hardware.
|
||||
|
||||
Choose a project with your favourite IDE:
|
||||
|
||||
| Eclipse | CodeBlocks | Visual Studio | PlatformIO | Qt Creator |
|
||||
|-------------|-------------|---------------|-----------|------------|
|
||||
| [](https://github.com/littlevgl/pc_simulator_sdl_eclipse) | [](https://github.com/littlevgl/pc_simulator_win_codeblocks) | [](https://github.com/littlevgl/visual_studio_2017_sdl_x64) | [](https://github.com/littlevgl/pc_simulator_sdl_platformio) | [](https://blog.littlevgl.com/2019-01-03/qt-creator) |
|
||||
| Cross-platform<br>with SDL | Native Windows | Cross-platform<br>with SDL | Cross-platform<br>with SDL | Cross-platform<br>with SDL |
|
||||
|
||||
|
||||
## Add LittlevGL to your project
|
||||
|
||||
The steps below show how to setup LittlevGL on an embedded system with a display and a touchpad.
|
||||
You can use the [Simulators](https://docs.littlevgl.com/en/html/get-started/pc-simulator) to get ready to use projects which can be run on your PC.
|
||||
|
||||
1. [Download](https://littlevgl.com/download) or [Clone](https://github.com/littlevgl/lvgl) the library
|
||||
2. Copy the `lvgl` folder into your project
|
||||
3. Copy `lvgl/lv_conf_templ.h` as `lv_conf.h` next to the `lvgl` folder and set at least `LV_HOR_RES_MAX`, `LV_VER_RES_MAX` and `LV_COLOR_DEPTH`.
|
||||
4. Include `lvgl/lvgl.h` where you need to use LittlevGL related functions.
|
||||
5. Call `lv_tick_inc(x)` every `x` milliseconds **in a Timer or Task** (`x` should be between 1 and 10). It is required for the internal timing of LittlevGL.
|
||||
6. Call `lv_init()`
|
||||
7. Create a display buffer for LittlevGL
|
||||
```c
|
||||
static lv_disp_buf_t disp_buf;
|
||||
static lv_color_t buf[LV_HOR_RES_MAX * 10]; /*Declare a buffer for 10 lines*/
|
||||
lv_disp_buf_init(&disp_buf, buf, NULL, LV_HOR_RES_MAX * 10); /*Initialize the display buffer*/
|
||||
```
|
||||
8. Implement and register a function which can **copy a pixel array** to an area of your display:
|
||||
```c
|
||||
lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/
|
||||
lv_disp_drv_init(&disp_drv); /*Basic initialization*/
|
||||
disp_drv.flush_cb = my_disp_flush; /*Set your driver function*/
|
||||
disp_drv.buffer = &disp_buf; /*Assign the buffer to the display*/
|
||||
lv_disp_drv_register(&disp_drv); /*Finally register the driver*/
|
||||
|
||||
void my_disp_flush(lv_disp_t * disp, const lv_area_t * area, lv_color_t * color_p)
|
||||
{
|
||||
int32_t x, y;
|
||||
for(y = area->y1; y <= area->y2; y++) {
|
||||
for(x = area->x1; x <= area->x2; x++) {
|
||||
set_pixel(x, y, *color_p); /* Put a pixel to the display.*/
|
||||
color_p++;
|
||||
}
|
||||
}
|
||||
|
||||
lv_disp_flush_ready(disp); /* Indicate you are ready with the flushing*/
|
||||
}
|
||||
|
||||
```
|
||||
9. Implement and register a function which can **read an input device**. E.g. for a touch pad:
|
||||
```c
|
||||
lv_indev_drv_init(&indev_drv); /*Descriptor of a input device driver*/
|
||||
indev_drv.type = LV_INDEV_TYPE_POINTER; /*Touch pad is a pointer-like device*/
|
||||
indev_drv.read_cb = my_touchpad_read; /*Set your driver function*/
|
||||
lv_indev_drv_register(&indev_drv); /*Finally register the driver*/
|
||||
|
||||
bool my_touchpad_read(lv_indev_t * indev, lv_indev_data_t * data)
|
||||
{
|
||||
static lv_coord_t last_x = 0;
|
||||
static lv_coord_t last_y = 0;
|
||||
|
||||
/*Save the state and save the pressed coordinate*/
|
||||
data->state = touchpad_is_pressed() ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL;
|
||||
if(data->state == LV_INDEV_STATE_PR) touchpad_get_xy(&last_x, &last_y);
|
||||
|
||||
/*Set the coordinates (if released use the last pressed coordinates)*/
|
||||
data->point.x = last_x;
|
||||
data->point.y = last_y;
|
||||
|
||||
return false; /*Return `false` because we are not buffering and no more data to read*/
|
||||
}
|
||||
```
|
||||
10. Call `lv_task_handler()` periodically every few milliseconds in the main `while(1)` loop, in Timer interrupt or in an Operation system task.
|
||||
It will redraw the screen if required, handle input devices etc.
|
||||
|
||||
|
||||
## Learn the basics
|
||||
|
||||
### Objects (Widgets)
|
||||
|
||||
The graphical elements like Buttons, Labels, Sliders, Charts etc are called objects in LittelvGL. Go to [Object types](https://docs.littlevgl.com/en/html/object-types/index) to see the full list of available types.
|
||||
|
||||
Every object has a parent object. The child object moves with the parent and if you delete the parent the children will be deleted too. Children can be visible only on their parent.
|
||||
|
||||
The *screen* are the "root" parents. To get the current screen call `lv_scr_act()`.
|
||||
|
||||
You can create a new object with `lv_<type>_create(parent, obj_to_copy)`. It will return an `lv_obj_t *` variable which should be used as a reference to the object to set its parameters.
|
||||
The first parameter is the desired *parent*, te second parameters can be an object to copy (`NULL` is unused).
|
||||
For example:
|
||||
```c
|
||||
lv_obj_t * slider1 = lv_slider_create(lv_scr_act(), NULL);
|
||||
```
|
||||
|
||||
To set some basic attribute `lv_obj_set_<paramters_name>(obj, <value>)` function can be used. For example:
|
||||
```c
|
||||
lv_obj_set_x(btn1, 30);
|
||||
lv_obj_set_y(btn1, 10);
|
||||
lv_obj_set_size(btn1, 200, 50);
|
||||
```
|
||||
|
||||
The objects has type specific parameters too which can be set by `lv_<type>_set_<paramters_name>(obj, <value>)` functions. For example:
|
||||
```c
|
||||
lv_slider_set_value(slider1, 70, LV_ANIM_ON);
|
||||
```
|
||||
|
||||
To see the full API visit the documentation of the object types or the related header file (e.g. `lvgl/src/lv_objx/lv_slider.h`).
|
||||
|
||||
### Styles
|
||||
Styles can be assigned to the objects to changed their appearance. A style describes the appearance of rectangle-like objects (like a button or slider), texts, images and lines at once.
|
||||
|
||||
You can create a new style like this:
|
||||
```c
|
||||
static lv_style_t style1; /*Declare a new style. Should be `static`*/
|
||||
lv_style_copy(&style1, &lv_style_plain); /*Copy a buil-in style*/
|
||||
style1.body.main_color = LV_COLOR_RED; /*Main color*/
|
||||
style1.body.grad_color = lv_color_hex(0xffd83c) /*Gradient color (orange)*/
|
||||
style1.body.radius = 3;
|
||||
style1.text.color = lv_color_hex3(0x0F0) /*Label color (green)*/
|
||||
style1.text.font = &lv_font_dejavu_22; /*Change font*/
|
||||
...
|
||||
```
|
||||
|
||||
To set a new style for an object use the `lv_<type>set_style(obj, LV_<TYPE>_STYLE_<NAME>, &my_style)` functions. For example:
|
||||
```c
|
||||
lv_slider_set_style(slider1, LV_SLIDER_STYLE_BG, &slider_bg_style);
|
||||
lv_slider_set_style(slider1, LV_SLIDER_STYLE_INDIC, &slider_indic_style);
|
||||
lv_slider_set_style(slider1, LV_SLIDER_STYLE_KNOB, &slider_knob_style);
|
||||
```
|
||||
|
||||
If an object's style is `NULL` then it will inherit its parent's style. For example, the labels' style are `NULL` by default. If you place them on a button then they will use the `style.text` properties from the button's style.
|
||||
|
||||
Learn more in [Style overview](https://docs.littlevgl.com/en/html/overview/style) section.
|
||||
|
||||
### Events
|
||||
Events are used to inform the user if something has happened with an object. You can assign a callback to an object which will be called if the object is clicked, released, dragged, being deleted etc. It should look like this:
|
||||
|
||||
```c
|
||||
lv_obj_set_event_cb(btn, btn_event_cb); /*Assign a callback to the button*/
|
||||
|
||||
...
|
||||
|
||||
void btn_event_cb(lv_obj_t * btn, lv_event_t event)
|
||||
{
|
||||
if(event == LV_EVENT_CLICKED) {
|
||||
printf("Clicked\n");
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Learn more about the events in the [Event overview](https://docs.littlevgl.com/en/html/overview/event) section.
|
||||
|
||||
|
||||
## Examples
|
||||
|
||||
### Button with label
|
||||
```c
|
||||
lv_obj_t * btn = lv_btn_create(lv_scr_act(), NULL); /*Add a button the current screen*/
|
||||
lv_obj_set_pos(btn, 10, 10); /*Set its position*/
|
||||
lv_obj_set_size(btn, 100, 50); /*Set its size*/
|
||||
lv_obj_set_event_cb(btn, btn_event_cb); /*Assign a callback to the button*/
|
||||
|
||||
lv_obj_t * label = lv_label_create(btn, NULL); /*Add a label to the button*/
|
||||
lv_label_set_text(label, "Button"); /*Set the labels text*/
|
||||
|
||||
...
|
||||
|
||||
void btn_event_cb(lv_obj_t * btn, lv_event_t event)
|
||||
{
|
||||
if(event == LV_EVENT_CLICKED) {
|
||||
printf("Clicked\n");
|
||||
}
|
||||
}
|
||||
```
|
||||

|
||||
|
||||
### Button with styles
|
||||
Add styles to the previously button from the previous example
|
||||
```c
|
||||
static lv_style_t style_btn_rel; /*A variable to store the released style*/
|
||||
lv_style_copy(&style_btn_rel, &lv_style_plain); /*Initialize from a built-in style*/
|
||||
style_btn_rel.body.border.color = lv_color_hex3(0x269);
|
||||
style_btn_rel.body.border.width = 1;
|
||||
style_btn_rel.body.main_color = lv_color_hex3(0xADF);
|
||||
style_btn_rel.body.grad_color = lv_color_hex3(0x46B);
|
||||
style_btn_rel.body.shadow.width = 4;
|
||||
style_btn_rel.body.shadow.type = LV_SHADOW_BOTTOM;
|
||||
style_btn_rel.body.radius = LV_RADIUS_CIRCLE;
|
||||
style_btn_rel.text.color = lv_color_hex3(0xDEF);
|
||||
|
||||
static lv_style_t style_btn_pr; /*A variable to store the pressed style*/
|
||||
lv_style_copy(&style_btn_pr, &style_btn_rel); /*Initialize from the released style*/
|
||||
style_btn_pr.body.border.color = lv_color_hex3(0x46B);
|
||||
style_btn_pr.body.main_color = lv_color_hex3(0x8BD);
|
||||
style_btn_pr.body.grad_color = lv_color_hex3(0x24A);
|
||||
style_btn_pr.body.shadow.width = 2;
|
||||
style_btn_pr.text.color = lv_color_hex3(0xBCD);
|
||||
|
||||
lv_btn_set_style(btn, LV_BTN_STYLE_REL, &style_btn_rel); /*Set the button's released style*/
|
||||
lv_btn_set_style(btn, LV_BTN_STYLE_PR, &style_btn_pr); /*Set the button's pressed style*/
|
||||
```
|
||||
|
||||

|
||||
|
||||
### Slider and object alignment
|
||||
```c
|
||||
lv_obj_t * label;
|
||||
|
||||
...
|
||||
|
||||
/* Create a slider in the center of the display */
|
||||
lv_obj_t * slider = lv_slider_create(lv_scr_act(), NULL);
|
||||
lv_obj_set_width(slider, 200); /*Set the width*/
|
||||
lv_obj_align(slider, NULL, LV_ALIGN_CENTER, 0, 0); /*Align to the center of the parent (screen)*/
|
||||
lv_obj_set_event_cb(slider, slider_event_cb); /*Assign an event function*/
|
||||
|
||||
/* Create a label below the slider */
|
||||
label = lv_label_create(lv_scr_act(), NULL);
|
||||
lv_label_set_text(label, "0");
|
||||
lv_obj_set_auto_realign(slider, true);
|
||||
lv_obj_align(label, slider, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
|
||||
|
||||
...
|
||||
|
||||
void slider_event_cb(lv_obj_t * slider, lv_event_t event)
|
||||
{
|
||||
if(event == LV_EVENT_VALUE_CHANGED) {
|
||||
static char buf[4]; /* max 3 bytes for number plus 1 null terminating byte */
|
||||
snprintf(buf, 4, "%u", lv_slider_get_value(slider));
|
||||
lv_label_set_text(slider_label, buf); /*Refresh the text*/
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||

|
||||
|
||||
### List and themes
|
||||
```c
|
||||
/*Texts of the list elements*/
|
||||
const char * txts[] = {"First", "Second", "Third", "Forth", "Fifth", "Sixth", NULL};
|
||||
|
||||
/* Initialize and set a theme. `LV_THEME_NIGHT` needs to enabled in lv_conf.h. */
|
||||
lv_theme_t * th = lv_theme_night_init(20, NULL);
|
||||
lv_theme_set_current(th);
|
||||
|
||||
/*Create a list*/
|
||||
lv_obj_t* list = lv_list_create(lv_scr_act(), NULL);
|
||||
lv_obj_set_size(list, 120, 180);
|
||||
lv_obj_set_pos(list, 10, 10);
|
||||
|
||||
/*Add buttons*/
|
||||
uint8_t i;
|
||||
for(i = 0; txts[i]; i++) {
|
||||
lv_obj_t * btn = lv_list_add_btn(list, LV_SYMBOL_FILE, txts[i]);
|
||||
lv_obj_set_event_cb(btn, list_event); /*Assign event function*/
|
||||
lv_btn_set_toggle(btn, true); /*Enable on/off states*/
|
||||
}
|
||||
|
||||
/* Initialize and set an other theme. `LV_THEME_MATERIAL` needs to enabled in lv_conf.h.
|
||||
* If `LV_TEHE_LIVE_UPDATE 1` then the previous list's style will be updated too.*/
|
||||
th = lv_theme_material_init(210, NULL);
|
||||
lv_theme_set_current(th);
|
||||
|
||||
/*Create an other list*/
|
||||
list = lv_list_create(lv_scr_act(), NULL);
|
||||
lv_obj_set_size(list, 120, 180);
|
||||
lv_obj_set_pos(list, 150, 10);
|
||||
|
||||
/*Add buttons with the same texts*/
|
||||
for(i = 0; txts[i]; i++) {
|
||||
lv_obj_t * btn = lv_list_add_btn(list, LV_SYMBOL_FILE, txts[i]);
|
||||
lv_obj_set_event_cb(btn, list_event);
|
||||
lv_btn_set_toggle(btn, true);
|
||||
}
|
||||
|
||||
...
|
||||
|
||||
static void list_event(lv_obj_t * btn, lv_event_t e)
|
||||
{
|
||||
if(e == LV_EVENT_CLICKED) {
|
||||
printf("%s\n", lv_list_get_btn_text(btn));
|
||||
}
|
||||
|
||||
}
|
||||
```
|
||||

|
||||
|
||||
### Use LittlevGL from Micropython
|
||||
Learn more about [Micropython](https://docs.littlevgl.com/en/html/get-started/micropython).
|
||||
```python
|
||||
# Create a Button and a Label
|
||||
scr = lv.obj()
|
||||
btn = lv.btn(scr)
|
||||
btn.align(lv.scr_act(), lv.ALIGN.CENTER, 0, 0)
|
||||
label = lv.label(btn)
|
||||
label.set_text("Button")
|
||||
|
||||
# Load the screen
|
||||
lv.scr_load(scr)
|
||||
```
|
||||
|
||||
## Contributing
|
||||
To ask questions please use the [Forum](https://forum.littlevgl.com).
|
||||
For development-related things (bug reports, feature suggestions) use [GitHub's Issue tracker](https://github.com/littlevgl/lvgl/issues).
|
||||
|
||||
If you are interested in contributing to LittlevGL you can
|
||||
- **Help others** in the [Forum](https://forum.littlevgl.com).
|
||||
- **Inspire people** by speaking about your project in [My project](https://forum.littlevgl.com/c/my-projects) category in the Forum or add it to the [References](https://blog.littlevgl.com/2018-12-26/references) post
|
||||
- **Improve and/or translate the documentation.** Go to the [Documentation](https://github.com/littlevgl/docs) repository to learn more
|
||||
- **Write a blog post** about your experiences. See how to do it in the [Blog](https://github.com/littlevgl/blog) repository
|
||||
- **Report and/or fix bugs** in [GitHub's issue tracker](https://github.com/littlevgl/lvgl/issues)
|
||||
- **Help in the developement**. Check the [Open issues](https://github.com/littlevgl/lvgl/issues) especially the ones with [Help wanted](https://github.com/littlevgl/lvgl/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) label and tell your ideas about a topic or implement a feature.
|
||||
|
||||
It should be useful to read the
|
||||
- [Contributing guide](https://blog.littlevgl.com/2018-12-06/contributing)
|
||||
- [Coding style guide](https://github.com/littlevgl/lvgl/blob/master/docs/CODING_STYLE.md)
|
||||
|
||||
## Donate
|
||||
If you are pleased with the library, found it useful, or you are happy with the support you got, please help its further development:
|
||||
|
||||
[](https://littlevgl.com/donate)
|
||||
94
docs/CODING_STYLE.md
Normal file
94
docs/CODING_STYLE.md
Normal file
@@ -0,0 +1,94 @@
|
||||
|
||||
## File format
|
||||
Use [lv_misc/lv_templ.c](https://github.com/littlevgl/lvgl/blob/master/lv_misc/lv_templ.c) and [lv_misc/lv_templ.h](https://github.com/littlevgl/lvgl/blob/master/lv_misc/lv_templ.h)
|
||||
|
||||
## Naming conventions
|
||||
* Words are separated by '_'
|
||||
* In variable and function names use only lower case letters (e.g. *height_tmp*)
|
||||
* In enums and defines use only upper case letters (e.g. *e.g. MAX_LINE_NUM*)
|
||||
* Global names (API):
|
||||
* starts with *lv*
|
||||
* followed by module name: *btn*, *label*, *style* etc.
|
||||
* followed by the action (for functions): *set*, *get*, *refr* etc.
|
||||
* closed with the subject: *name*, *size*, *state* etc.
|
||||
* Typedefs
|
||||
* prefer `typedef struct` and `typedef enum` instead of `struct name` and `enum name`
|
||||
* always end `typedef struct` and `typedef enum` type names with `_t`
|
||||
* Abbreviations:
|
||||
* Use abbreviations on public names only if they become longer than 32 characters
|
||||
* Use only very straightforward (e.g. pos: position) or well-established (e.g. pr: press) abbreviations
|
||||
|
||||
## Coding guide
|
||||
* Functions:
|
||||
* Try to write function shorter than is 50 lines
|
||||
* Always shorter than 100 lines (except very straightforwards)
|
||||
* Variables:
|
||||
* One line, one declaration (BAD: char x, y;)
|
||||
* Use `<stdint.h>` (*uint8_t*, *int32_t* etc)
|
||||
* Declare variables when needed (not all at function start)
|
||||
* Use the smallest required scope
|
||||
* Variables in a file (outside functions) are always *static*
|
||||
* Do not use global variables (use functions to set/get static variables)
|
||||
|
||||
## Comments
|
||||
Before every function have a comment like this:
|
||||
|
||||
```c
|
||||
/**
|
||||
* Return with the screen of an object
|
||||
* @param obj pointer to an object
|
||||
* @return pointer to a screen
|
||||
*/
|
||||
lv_obj_t * lv_obj_get_scr(lv_obj_t * obj);
|
||||
```
|
||||
|
||||
Always use `/* Something */` format and NOT `//Something`
|
||||
|
||||
Write readable code to avoid descriptive comments like:
|
||||
`x++; /* Add 1 to x */`.
|
||||
The code should show clearly what you are doing.
|
||||
|
||||
You should write **why** have you done this:
|
||||
`x++; /*Because of closing '\0' of the string */`
|
||||
|
||||
Short "code summaries" of a few lines are accepted. E.g. `/*Calculate the new coordinates*/`
|
||||
|
||||
In comments use \` \` when referring to a variable. E.g. ``/*Update the value of `x_act`*/``
|
||||
|
||||
### Formatting
|
||||
Here is example to show bracket placing and using of white spaces:
|
||||
```c
|
||||
/**
|
||||
* Set a new text for a label. Memory will be allocated to store the text by the label.
|
||||
* @param label pointer to a label object
|
||||
* @param text '\0' terminated character string. NULL to refresh with the current text.
|
||||
*/
|
||||
void lv_label_set_text(lv_obj_t * label, const char * text)
|
||||
{ /* Main brackets of functions in new line*/
|
||||
|
||||
if(label == NULL) return; /*No bracket only if the command is inline with the if statement*/
|
||||
|
||||
lv_obj_inv(label);
|
||||
|
||||
lv_label_ext_t * ext = lv_obj_get_ext(label);
|
||||
|
||||
/*Comment before a section */
|
||||
if(text == ext->txt || text == NULL) { /*Bracket of statements start inline*/
|
||||
lv_label_refr_text(label);
|
||||
return;
|
||||
}
|
||||
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
Use 4 spaces indentation instead of tab.
|
||||
|
||||
You can use **astyle** to format the code. The required config flies are: `docs/astyle_c` and `docs/astyle_h`.
|
||||
To format the source files:
|
||||
`$ find . -type f -name "*.c" | xargs astyle --options=docs/astyle_c`
|
||||
|
||||
To format the header files:
|
||||
`$ find . -type f -name "*.h" | xargs astyle --options=docs/astyle_h`
|
||||
|
||||
Append `-n` to the end to skip creation of backup file OR use `$ find . -type f -name "*.bak" -delete` (for source file's backups) and `find . -type f -name "*.orig" -delete` (for header file's backups)
|
||||
@@ -1,180 +1,111 @@
|
||||
# Contributing to Littlev Graphics Library
|
||||
First of all thank you for reading these guide before contributing!
|
||||
|
||||
In this guide you can read how can you help in developing the Littlev Graphic Library. These are not strict rules rather just suggestions. If you have a constructive idea just create pull request on this document!
|
||||
**Do you have some free time to spend with programming?
|
||||
Are you working on an Embedded GUI project with LittlevGL?
|
||||
See how can you help to improve the graphics library!**
|
||||
|
||||
### Table Of Content
|
||||
* [Who can contribute?](#who-can-contribute)
|
||||
* [How to report an issue?](#how-to-report-an-issue)
|
||||
* [Simple issue](#simple-issue)
|
||||
* [Complex issue](#complex-issue)
|
||||
* [How to suggest a feature?](#how-to-suggest-a-feature)
|
||||
* [How to implement a feature?](#how-to-implement-a-feature)
|
||||
* [Styling guide](#styling-guide)
|
||||
* [Git Commit Messages](#Git-commit-messages)
|
||||
* [File format](#file-format)
|
||||
* [Functions](#functions)
|
||||
* [Variables](#variables)
|
||||
* [Defines](#defines)
|
||||
* [Comments](#comments)
|
||||
* [Formatting](#formatting)
|
||||
There are many ways to join the community. If you have some time to work with us I'm sure you will find something that fits you! You can:
|
||||
- help others in the [Forum](https://forum.littlevgl.com/)
|
||||
- improve and/or translate the documentation
|
||||
- write a blog post about your experiences
|
||||
- report and/or fix bugs
|
||||
- suggest and/or implement new features
|
||||
|
||||
But first, start with the most Frequently Asked Questions.
|
||||
|
||||
# FAQ about contributing
|
||||
|
||||
## Where can I write my question and remarks?
|
||||
|
||||
We use the [Forum](https://forum.littlevgl.com/) to ask and answer questions and [GitHub's issue tracker](https://github.com/littlevgl/lvgl/issues) for development-related discussion.
|
||||
|
||||
But there are some simple rules:
|
||||
- Be kind and friendly.
|
||||
- Speak about one thing in one issue/topic.
|
||||
- Give feedback and close the issue or mark the topic as solved if your question is answered.
|
||||
- Tell what you experience or expect. _"The button is not working"_ is not enough info to get help.
|
||||
- If possible send an absolute minimal code example in order to reproduce the issue
|
||||
- Use [Markdown](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) to format your post.
|
||||
|
||||
## How can I send fixes and improvements?
|
||||
|
||||
Merging new code happens via Pull Requests. If you are still not familiar with the Pull Requests (PR for short) here is a quick guide:
|
||||
1. **Fork** the [lvgl repository](https://github.com/littlevgl/lvgl). To do this click the "Fork" button in the top right corner. It will "copy" the `lvgl` repository to your GitHub account (`https://github.com/your_name?tab=repositories`)
|
||||
2. **Clone** the forked repository and add your changes
|
||||
3. **Create a PR** on GitHub from the page of your `lvgl` repository (`https://github.com/your_name/lvgl`) by hitting the "New pull request" button
|
||||
4. **Set the base branch**. It means where you want to merge your update. Fixes go to `master`, new features to the actual `dev-x.y` branch.
|
||||
5. **Describe** what is in the update. An example code is welcome if applicable.
|
||||
|
||||
Some advice:
|
||||
- If you are not sure about your fix or feature it's better to open an issue first and discuss the details there.
|
||||
- Maybe your fix or update won't be perfect at first. Don't be afraid, just improve it and push the new commits. The PR will be updated accordingly.
|
||||
- If your update needs some extra work it's okay to say: _"I'm busy now and I will improve it soon"_ or _"Sorry, I don't have time to improve it, I hope it helps in this form too"_.
|
||||
So it's better to say don't have time to continue than saying nothing.
|
||||
- Please read and follow this [guide about the coding style](https://github.com/littlevgl/lvgl/blob/master/docs/CODING_STYLE.md)
|
||||
|
||||
|
||||
## Who can contribute?
|
||||
Everybody is welcome in contributing independently from skills, programming level or any personal attribute.
|
||||
## Where is the documentation?
|
||||
|
||||
There are several ways to contribute in the graphics library like:
|
||||
* Report an issue
|
||||
* Suggest feature
|
||||
* Fix an issue
|
||||
* Implement a feature
|
||||
You can read the documentation here: <https://docs.littlevgl.com/>
|
||||
You can edit the documentation here: <https://github.com/littlevgl/doc>
|
||||
|
||||
Please, take a look at [CODE_OF_CONDUCT](https://github.com/littlevgl/lvgl/blob/master/docs/CODE_OF_CONDUCT.md)
|
||||
## Where is the blog?
|
||||
|
||||
## How to report an issue?
|
||||
There are 3 permanent branches:
|
||||
* `master` for stable, released versions
|
||||
* `beta` for developers, all feature branches merged here first
|
||||
* `bugfix` for hotfixes, not new features
|
||||
You can read the blog here: <https://blog.littlevgl.com/>
|
||||
You can edit the blog here: <https://github.com/littlevgl/blog>
|
||||
|
||||
### Simple issue
|
||||
If you find an issue which is very simple to fix, and you fixed it, please send a pull request against `beta` branch.
|
||||
A simple issue could be:
|
||||
* Misspelled names
|
||||
* Comment: misspelling or grammatical error in comments
|
||||
* Variable: misspelled variable name (e.g. ***ojb**_next* instead of ***obj**_next*)
|
||||
* Define: only local defines in files because global defines affect API
|
||||
* Function: only static function name because global functions affect API
|
||||
* Not handled error case:
|
||||
* A parameter can be NULL (during normal usage)
|
||||
* Negative index in array or over indexing
|
||||
* Overflow in variable
|
||||
* Anything which is local an can be fixed with a few lines of code
|
||||
# So how and where can you contribute?
|
||||
|
||||
### Complex issue
|
||||
If you find a complex issue which:
|
||||
* might be simple but you don't know its origin
|
||||
* affects a whole file, module or even the architecture
|
||||
* needs deeper discussion
|
||||
## Help others in the Forum
|
||||
|
||||
please create a **new issue** and describe
|
||||
* what you experience
|
||||
* how to reproduce the issue (maybe with example code)
|
||||
* version you are using (lvgl.h)
|
||||
* misc library version (misc.h)
|
||||
It's a great way to contribute to the library if you already use it.
|
||||
Just go to [https://forum.littlevgl.com/](https://forum.littlevgl.com/) a register (Google and GitHub login also works).
|
||||
Log in, read the titles and if you are already familiar with a topic, don't be shy, and write your suggestion.
|
||||
|
||||
## How to suggest a feature?
|
||||
If you have a good and useful idea you can use GitHub issues to suggest a new feature. Please note the followings on feature requests:
|
||||
* What the new feature is about?
|
||||
* Why/Where/In which case is it useful/helpful/relevant?
|
||||
* Can you help in implementing it?
|
||||
## Improving and/or translating the documentation
|
||||
|
||||
After a discussion we figure out the specification of the new feature and the technical details/implementation possibilities.
|
||||
With the knowledge of how to do it somebody can implement the new feature.
|
||||
If you would like to contribute to LittlevGL the documentation is the best place to start.
|
||||
|
||||
The new feature should be in a new branch.
|
||||
### Fix typos, add missing parts
|
||||
|
||||
Keep in mind if you wouldn't like to do the implementation there is no guarantee that it will be ready in the new future.
|
||||
However if you would like to force it, take a look at this page: [Feature request service](http://www.gl.littlev.hu/services#feature)
|
||||
If you find a typo, an obscure sentence or something which is not explained well enough in the [English documentation](https://docs.littlevgl.com/en/html/index.html)
|
||||
click the *"Edit on GitHub"* button in the top right corner and fix the issue by sending a Pull Request.
|
||||
|
||||
## How to implement a feature?
|
||||
In [docs/TODO_MINOR.md](https://github.com/littlevgl/lvgl/blob/master/docs/TODO_MINOR.md) and [docs/TODO_PATCH.md](https://github.com/littlevgl/lvgl/blob/master/docs/TODO_PATCH.md) you can see some ideas which are waiting for somebody to realize them! If want to deal with a feature from this files, please start an issue and discusse the details.
|
||||
### Translate the documentation
|
||||
|
||||
## Styling guide
|
||||
If you have time and interest you can translate the documentation to your native language or any language you speak.
|
||||
You can join others to work on an already existing language or you can start a new one.
|
||||
|
||||
### Git Commit Messages
|
||||
* Use the present tense ("Add feature" not "Added feature")
|
||||
* Use the imperative mood ("Move cursor to..." not "Moves cursor to...")
|
||||
* Limit the first line to 72 characters or less
|
||||
* Reference issues and pull requests liberally after the first line
|
||||
To translate the documentation we use [Zanata](https://zanata.org) which is an online translation platform.
|
||||
You will find the LittlevGL project here: [LittlevGL on Zanata](https://translate.zanata.org/iteration/view/littlevgl-docs/v6.0-doc1?dswid=3430)
|
||||
|
||||
### File format
|
||||
Use [misc/templ/templ.c](https://github.com/littlevgl/misc/blob/master/templ/templ.c) and [misc/templ/templ.h](https://github.com/littlevgl/misc/blob/master/templ/templ.h)
|
||||
To get started you need to:
|
||||
- register at [Zanata](https://zanata.org) which is an online translation platform.
|
||||
- comment to [this post](https://forum.littlevgl.com/t/translate-the-documentation/238?u=kisvegabor)
|
||||
- tell your username at *Zanata* and your selected language(s) to get permission the edit the translations
|
||||
|
||||
### Functions
|
||||
* try to write function shorter then is 40 lines
|
||||
* always shorter then 100 lines (except very straightforwards)
|
||||
* in function names:
|
||||
* words sparated by '_'
|
||||
* only lower case letters
|
||||
* only clear abbreviation (OK: *lv_xy_get_title_txt*, BAD: *lv_xy_get_ttxt*)
|
||||
Note that a translation will be added to the documentation only if at least the [Porting section](https://docs.littlevgl.com/en/html/porting/index.html) is translated.
|
||||
|
||||
#### Global functions names (API)
|
||||
An example: *lv_btn_set_state()*
|
||||
* starts with *lv*
|
||||
* followed by module name: *btn*, *label*, *style* etc.
|
||||
* followed by the action: *set*, *get*, *refr* etc.
|
||||
* closed with subject: *name*, *size*, *state* etc.
|
||||
* optional like in *lv_obj_del()* it is missing
|
||||
* could contain more words: *long_mode*, *point_all*
|
||||
|
||||
#### Static functions names
|
||||
Names can be used freely.
|
||||
## Writing a blog post about your experiences
|
||||
|
||||
### Variables
|
||||
* words sparated by '_'
|
||||
* always lower case
|
||||
* one line one declaration (BAD: char x, y;)
|
||||
* use `<stdint.h>` (*uint8_t*, *int32_t* etc)
|
||||
* declare variables when needed (not all at function start)
|
||||
* use the smallest required scope
|
||||
* variables in a file (outside functions) are always *static*
|
||||
* do not use global variables (use functions to set/get static variables)
|
||||
Have you ported LittlevGL to a new platform? Have you created a fancy GUI? Do you know a great trick?
|
||||
You can share your knowledge on LittlevGL's blog! It's super easy to add your own post:
|
||||
- Fork and clone the [blog repository](https://github.com/littlevgl/blog)
|
||||
- Add your post in Markdown to the `_posts` folder.
|
||||
- Store the images and other resources in a dedicated folder in `assets`
|
||||
- Create a Pull Request
|
||||
|
||||
### Defines
|
||||
* always upper case
|
||||
* starts with *LV_*
|
||||
* followed by the modul: *OBJ*, *BTN* etc.
|
||||
* closed by the subject: *ANIM_TIME*, *VALUE_MIN*, *WIDTH_DEF*
|
||||
The blog uses [Jekyll](https://jekyllrb.com/) to convert the `.md` files to a webpage. You can easily [run Jekyll offline](https://jekyllrb.com/docs/) to check your post before creating the Pull request
|
||||
|
||||
### Comments
|
||||
Before every function have a comment like this:
|
||||
## Reporting and/or fixing bugs
|
||||
For simple bugfixes (typos, missing error handling, fixing a warning) is fine to send a Pull request directly. However, for more complex bugs it's better to open an issue first. In the issue, you should describe how to reproduce the bug and even add the minimal code snippet.
|
||||
|
||||
```
|
||||
/**
|
||||
* Return with the screen of an object
|
||||
* @param obj pointer to an object
|
||||
* @return pointer to a screen
|
||||
*/
|
||||
lv_obj_t * lv_obj_get_scr(lv_obj_t * obj);
|
||||
```
|
||||
## Suggesting and/or implementing new features
|
||||
If you have a good idea don't hesitate to share with us. It's even better if you have time to deal with its implementation. Don't be afraid if you still don't know LittlevGL well enough. We will help you to get started.
|
||||
|
||||
Always use `/* Something */` format and NOT `//Something`
|
||||
During the implementation don't forget the [Code style guide](https://github.com/littlevgl/lvgl/blob/master/docs/CODING_STYLE.md).
|
||||
|
||||
Write readable code to avoid descriptive comments like:
|
||||
`x++; /* Add 1 to x */`.
|
||||
The code should show clearly what you are doing.
|
||||
# Summary
|
||||
|
||||
You should write **why** have you done this:
|
||||
`x++; /*Because of closing '\0' of the string */`
|
||||
|
||||
### Formatting
|
||||
Here is example to show bracket placing and using of white spaces:
|
||||
```
|
||||
/**
|
||||
* Set a new text for a label. Memory will be allocated to store the text by the label.
|
||||
* @param label pointer to a label object
|
||||
* @param text '\0' terminated character string. NULL to refresh with the current text.
|
||||
*/
|
||||
void lv_label_set_text(lv_obj_t * label, const char * text)
|
||||
{ /*Main bracket in new line*/
|
||||
|
||||
if(label == NULL) return; /*No bracket only if the command is inline with the if statement*/
|
||||
|
||||
lv_obj_inv(label);
|
||||
|
||||
lv_label_ext_t * ext = lv_obj_get_ext(label);
|
||||
|
||||
/*Comment before a section */
|
||||
if(text == ext->txt || text == NULL) { /*Bracket start inline*/
|
||||
lv_label_refr_text(label);
|
||||
return;
|
||||
}
|
||||
|
||||
.
|
||||
.
|
||||
.
|
||||
}
|
||||
```
|
||||
|
||||
Use 4 spaces indentation instead of tab.
|
||||
I hope you have taken a liking to contribute to LittlevGL. A helpful and friendly community is waiting for you! :)
|
||||
|
||||
@@ -1,83 +0,0 @@
|
||||
# LittleV Graphics Libraray
|
||||
|
||||

|
||||
|
||||
LittlevGL is a graphics library to create Graphical User Interfaces (GUI) on TFT, LCD or monochrome displays using microcontroller based embedded systems.
|
||||
|
||||
Transparency, anti-aliassing and smooth animations can be used with no double buffering so typically no external memories are required.
|
||||
|
||||
The graphics library is written in C and it is completely hardware independent. You can even run it in a PC simulator without any embedded hardware.
|
||||
|
||||
Homepage: http://gl.littlev.hu
|
||||
|
||||
## Key features
|
||||
* Hardware independent, support any modern microcontroller
|
||||
* High resolution TFTs, monochrome or any type of display supported (24/16/8/1 bit color depth)
|
||||
* External RAM, FPU or GPU not required just optional
|
||||
* Build GUI from simple graphical objects
|
||||
* Buttons, Labels, Images
|
||||
* Charts, Lists, Bars, Sliders, Text areas etc.
|
||||
* High level graphical features without double buffering
|
||||
* Antialiassing (font or full screen)
|
||||
* Animations
|
||||
* Transparency
|
||||
* Gradient colors
|
||||
* Smooth dragging and scrolling
|
||||
* Layers
|
||||
* Customizable appearance with styles
|
||||
* Applications for complex tasks
|
||||
* Can run in a PC simulator
|
||||
* Modular and well-structured source code
|
||||
* Actively developed
|
||||
|
||||
## Porting
|
||||
The following functions has to be provided
|
||||
* hal/disp `disp_fill(x1, y1, x2, y2, color)` to fill area with a color
|
||||
* hal/disp `disp_map(x1, y1, x2, y2, &color_array)` copy a color map to an area
|
||||
* hal/disp `disp_color_cpy(dest, src, length, opa)` copy pixel, optional for GPU
|
||||
* hal/indev `indev_get(id, &x, &y)` get the *x* and *y* coordinates from an input device (e.g. touch pad)
|
||||
* hal/systick `systick_get()` get a system tick with 1 ms resolution
|
||||
* hal/systick `systick_elapse(prev_time)` get the elapsed milliseconds sience *prev_time*
|
||||
|
||||
See the [example HAL](https://github.com/littlevgl/hal) repository!
|
||||
|
||||
## Requirements
|
||||
* [Misc. library](https://github.com/littlevgl/misc) is used by the graphics library
|
||||
|
||||
## Project set-up
|
||||
1. Clone or download the following repositories:
|
||||
* lvgl:`git clone https://github.com/littlevgl/lvgl.git`
|
||||
* misc: `git clone https://github.com/littlevgl/misc.git`
|
||||
* hal: `git clone https://github.com/littlevgl/hal.git`
|
||||
2. Create project with your prefered IDE and add the **lvgl**, **misc** and **hal** folders
|
||||
3. Add your projects **root directory as include path**
|
||||
4. Write your display, touch pad and system tick **drivers in hal**
|
||||
5. Copy *lvgl/lv_conf_templ.h* as **lv_conf.h** and *misc/misc_conf_templ.h* as **misc_conf.h** to the projects root folder
|
||||
6. In the *_conf.h files delete the first `#if 0` and its `#endif`. Let the default configurations at first.
|
||||
7. In your *main.c* include:
|
||||
* #include "misc/misc.h"
|
||||
* #include "misc/os/ptask.h"
|
||||
* #include "lvgl/lvgl.h"
|
||||
8. In your *main.c* intialize:
|
||||
* **misc_init()**;
|
||||
* your_systick_init();
|
||||
* your_disp_init();
|
||||
* your_indev_init();
|
||||
* **lv_init()**;
|
||||
10. To **test** create a label: `lv_obj_t * label = lv_label_create(lv_scr_act(), NULL);`
|
||||
11. In the main *while(1)* call `ptask_handler();` and make a few milliseconds delay (e.g. `your_delay_ms(5);`)
|
||||
12. Compile the code and load it to your embedded hardware
|
||||
|
||||
## PC Simulator
|
||||
If you don't have got an embedded hardware you can test the graphics library in a PC simulator. The simulator uses [SDL2](https://www.libsdl.org/) to emulate a display on your monitor and a touch pad with your mouse.
|
||||
|
||||
There is a pre-configured PC project for **Eclipse CDT** in this repository: https://github.com/littlevgl/proj_pc
|
||||
|
||||
## Contributing
|
||||
See [CONTRIBUTING.md](https://github.com/littlevgl/lvgl/blob/master/docs/CONTRIBUTING.md)
|
||||
|
||||
## Donate
|
||||
If you are pleased with the graphics library and found it useful please support its further development:
|
||||
|
||||
[](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=GJV3SC5EHDANS)
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
# TODOs for major versions
|
||||
Major versions released typically when API changes are required
|
||||
|
||||
## Contributing
|
||||
Please create an issue to suggest a new feature instead of adding pull request to this file.
|
||||
|
||||
## v5
|
||||
- [ ] rename repository from *lvgl* to *littlevgl*
|
||||
- [ ] define renames: e.g. *USE_LV_BTN* to *LV_BTN_USE*
|
||||
- [ ] Remove LV_DOWNSCALE (LV_ANTIALIAS will be used instead)
|
||||
- [ ] *lv_ta_get_txt* rename to *lv_ta_get_text*
|
||||
- [ ] btnm_action pass text instead of text_id
|
||||
@@ -1,30 +0,0 @@
|
||||
# TODOs for minor versions
|
||||
Minor versions (x.1.0, x.2.0 ...) released when one or more new feature is addded without changing the API. New features can be added with major versions (1.0.0, 2.0.0 ...) too.
|
||||
|
||||
## Contributing
|
||||
Please create an issue to suggest a new feature instead of adding pull request to this file.
|
||||
|
||||
## Ideas
|
||||
Here are ideas which are not assigned to a minor version yet:
|
||||
- label: add a horzintal line (e.g. underline or line through).
|
||||
- label long mode: dot begin
|
||||
- music player app
|
||||
- files app update: show content as text
|
||||
- GUI remote control
|
||||
- automatically build GUI from file (e.g. XML, JSON or HTML)
|
||||
- lv_split: new object type, a hor. or ver. line for decoration purpose
|
||||
- lv_valset: new object type, a label with "+" and "-" buttons
|
||||
- lv_tabview: new object type to organise content with tabs
|
||||
- lv_btngrp: new object type to display more buttons to choose an option from them
|
||||
- lv_switch: new object type, turn on/off by tap (a little slider)
|
||||
- lv_roller: new object type, a roller to select a value (like on smartphones)
|
||||
|
||||
## v4.2
|
||||
- [x] Double VDB support: one for rendering, another to transfer former rendered image to frame buffer in the background (e.g. with DMA) [#15](https://github.com/littlevgl/lvgl/issues/15)
|
||||
- [x] lv_group: to control without touch pad. Issue [#14](https://github.com/littlevgl/lvgl/issues/14)
|
||||
- [x] lv_page: scrl def fit modification: hor:false, ver:true, and always set width to parent width
|
||||
- [x] lv_btn: add lv_btn_get_..._action
|
||||
- [x] lv_list: add lv_list_get_element_label/img
|
||||
- [x] lv_ta: lv_ta_set_one_line to configure the Text area to one lined input field
|
||||
- [x] style animations add
|
||||
- [x] lv_btnm: besides 0. byte (width dsc) 1. byte: hidden (\177, 0x7F, delete)
|
||||
@@ -1,13 +0,0 @@
|
||||
# TODOs for patch versions
|
||||
Patch versions (x.y.1, x.y.2) contain bugfixes without changing the API but they can apppear in minor (x.1.0, x.2.0) or major (1.0.0, 2.0.0) versions too.
|
||||
|
||||
Bugfixes are done in `bugfix` branche.
|
||||
|
||||
The bugfixes of the still not released version are in `beta` branche.
|
||||
|
||||
## Contributing
|
||||
Please create an issue to introduce a bug instead of adding pull request to this file.
|
||||
|
||||
## Next release
|
||||
- [x] lv_slider: don't let indicator or bar to disappear because of hpad/vpad
|
||||
- [x] lv_ta: memory leak if deleted in password mode
|
||||
@@ -1,41 +0,0 @@
|
||||
/**
|
||||
* @file img_conf.h
|
||||
*
|
||||
*/
|
||||
|
||||
#if 0 /*Remove this to enable the content (Delete the last #endif too!)*/
|
||||
|
||||
#ifndef IMG_CONF_H
|
||||
#define IMG_CONF_H
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/* Enable here the used images
|
||||
* For example:
|
||||
* #define USE_IMG_EXAMPLE 1
|
||||
*
|
||||
* This is compatible with the images
|
||||
* generated by the image converter utility
|
||||
* For more information see: www.littlev.hu */
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif
|
||||
|
||||
#endif /*Remove this to enable the content*/
|
||||
13
library.json
Normal file
13
library.json
Normal file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"name": "lvgl",
|
||||
"keywords": "graphics, gui, embedded, littlevgl",
|
||||
"description": "Graphics library to create embedded GUI with easy-to-use graphical elements, beautiful visual effects and low memory footprint. It offers anti-aliasing, opacity, and animations using only one frame buffer.",
|
||||
"repository":
|
||||
{
|
||||
"type": "git",
|
||||
"url": "https://github.com/littlevgl/lvgl.git"
|
||||
},
|
||||
"build": {
|
||||
"includeDir": "."
|
||||
}
|
||||
}
|
||||
1136
lv_app/lv_app.c
1136
lv_app/lv_app.c
File diff suppressed because it is too large
Load Diff
270
lv_app/lv_app.h
270
lv_app/lv_app.h
@@ -1,270 +0,0 @@
|
||||
/**
|
||||
* @file lv_app.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LV_APP_H
|
||||
#define LV_APP_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
|
||||
#include "lvgl/lvgl.h"
|
||||
|
||||
#if LV_APP_ENABLE != 0
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
/*Check dependencies*/
|
||||
#if LV_OBJ_FREE_P == 0
|
||||
#error "lv_app: Free pointer is required for application. Enable it lv_conf.h: LV_OBJ_FREE_P 1"
|
||||
#endif
|
||||
|
||||
#if LV_OBJ_FREE_NUM == 0
|
||||
#error "lv_app: Free number is required for application. Enable it lv_conf.h: LV_OBJ_FREE_NUM 1"
|
||||
#endif
|
||||
|
||||
#if DM_CUSTOM == 0 && DM_MEM_SIZE < (2 * 1024)
|
||||
#error "lv_app: not enough dynamic memory. Increase it in misc_conf.h: DM_MEM_SIZE"
|
||||
#endif
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
typedef enum
|
||||
{
|
||||
LV_APP_MODE_NONE = 0x0000,
|
||||
LV_APP_MODE_NOT_LIST = 0x0001, /*Do not list the application*/
|
||||
LV_APP_MODE_NO_SC_TITLE = 0x0002, /*No short cut title*/
|
||||
}lv_app_mode_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
LV_APP_COM_TYPE_CHAR, /*Stream of characters. Not '\0' terminated*/
|
||||
LV_APP_COM_TYPE_INT, /*Stream of 'int32_t' numbers*/
|
||||
LV_APP_COM_TYPE_LOG, /*String about an event to log*/
|
||||
LV_APP_COM_TYPE_TRIG, /*A trigger to do some specific action (data is ignored)*/
|
||||
LV_APP_COM_TYPE_INV, /*Invalid type*/
|
||||
LV_APP_COM_TYPE_NUM, /*Indicates the number of com. types*/
|
||||
}lv_app_com_type_t;
|
||||
|
||||
struct __LV_APP_DSC_T;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
const struct __LV_APP_DSC_T * dsc;
|
||||
char * name;
|
||||
lv_obj_t * sc;
|
||||
lv_obj_t * sc_title;
|
||||
lv_obj_t * win;
|
||||
lv_obj_t * conf_win;
|
||||
void * app_data;
|
||||
void * sc_data;
|
||||
void * win_data;
|
||||
}lv_app_inst_t;
|
||||
|
||||
typedef struct __LV_APP_DSC_T
|
||||
{
|
||||
const char * name;
|
||||
lv_app_mode_t mode;
|
||||
void (*app_run)(lv_app_inst_t *, void *);
|
||||
void (*app_close) (lv_app_inst_t *);
|
||||
void (*com_rec) (lv_app_inst_t *, lv_app_inst_t *, lv_app_com_type_t, const void *, uint32_t);
|
||||
void (*sc_open) (lv_app_inst_t *, lv_obj_t *);
|
||||
void (*sc_close) (lv_app_inst_t *);
|
||||
void (*win_open) (lv_app_inst_t *, lv_obj_t *);
|
||||
void (*win_close) (lv_app_inst_t *);
|
||||
void (*conf_open) (lv_app_inst_t *, lv_obj_t * );
|
||||
uint16_t app_data_size;
|
||||
uint16_t sc_data_size;
|
||||
uint16_t win_data_size;
|
||||
}lv_app_dsc_t;
|
||||
|
||||
typedef struct {
|
||||
lv_style_t menu;
|
||||
lv_style_t menu_btn_rel;
|
||||
lv_style_t menu_btn_pr;
|
||||
lv_style_t sc_rel;
|
||||
lv_style_t sc_pr;
|
||||
lv_style_t sc_send_rel;
|
||||
lv_style_t sc_send_pr;
|
||||
lv_style_t sc_rec_rel;
|
||||
lv_style_t sc_rec_pr;
|
||||
lv_style_t sc_title;
|
||||
lv_style_t win_header;
|
||||
lv_style_t win_scrl;
|
||||
lv_style_t win_cbtn_rel;
|
||||
lv_style_t win_cbtn_pr;
|
||||
}lv_app_style_t;
|
||||
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the application system
|
||||
*/
|
||||
void lv_app_init(void);
|
||||
|
||||
/**
|
||||
* Get screen of the applications
|
||||
*/
|
||||
lv_obj_t * lv_scr_app(void);
|
||||
|
||||
/**
|
||||
* Allocate a new application descriptor
|
||||
* @return pointer to an lv_app_dsc_t pointer. Save here a pointer to an app. dsc.
|
||||
* E.g. *dsc = &my_app_dsc;
|
||||
*/
|
||||
lv_app_dsc_t ** lv_app_add_dsc(void);
|
||||
|
||||
/**
|
||||
* Run an application according to 'app_dsc'
|
||||
* @param app_dsc pointer to an application descriptor
|
||||
* @param conf pointer to an application specific configuration structure or NULL if unused
|
||||
* @return pointer to the opened application or NULL if any error occurred
|
||||
*/
|
||||
lv_app_inst_t * lv_app_run(const lv_app_dsc_t * app_dsc, void * conf);
|
||||
|
||||
/**
|
||||
* Close a running application. Close the Window and the Shortcut too if opened.
|
||||
* @param app pointer to an application
|
||||
*/
|
||||
void lv_app_close(lv_app_inst_t * app);
|
||||
|
||||
/**
|
||||
* Open a shortcut for an application
|
||||
* @param app pointer to an application
|
||||
* @return pointer to the shortcut
|
||||
*/
|
||||
lv_obj_t * lv_app_sc_open(lv_app_inst_t * app);
|
||||
|
||||
/**
|
||||
* Close the shortcut of an application
|
||||
* @param app pointer to an application
|
||||
*/
|
||||
void lv_app_sc_close(lv_app_inst_t * app);
|
||||
|
||||
/**
|
||||
* Open the application in a window
|
||||
* @param app pointer to an application
|
||||
* @return pointer to the shortcut
|
||||
*/
|
||||
lv_obj_t * lv_app_win_open(lv_app_inst_t * app);
|
||||
|
||||
/**
|
||||
* Close the window of an application
|
||||
* @param app pointer to an application
|
||||
*/
|
||||
void lv_app_win_close(lv_app_inst_t * app);
|
||||
|
||||
/**
|
||||
* Send data to other applications
|
||||
* @param app_send pointer to the application which is sending the message
|
||||
* @param type type of data from 'lv_app_com_type_t' enum
|
||||
* @param data pointer to the sent data
|
||||
* @param size length of 'data' in bytes
|
||||
* @return number application which were received the message
|
||||
*/
|
||||
uint16_t lv_app_com_send(lv_app_inst_t * app_send, lv_app_com_type_t type , const void * data, uint32_t size);
|
||||
|
||||
/**
|
||||
* Test an application communication connection
|
||||
* @param sender pointer to an application which sends data
|
||||
* @param receiver pointer to an application which receives data
|
||||
* @return false: no connection, true: there is connection
|
||||
*/
|
||||
bool lv_app_con_check(lv_app_inst_t * sender, lv_app_inst_t * receiver);
|
||||
|
||||
/**
|
||||
* Create a new connection between two applications
|
||||
* @param sender pointer to a data sender application
|
||||
* @param receiver pointer to a data receiver application
|
||||
*/
|
||||
void lv_app_con_set(lv_app_inst_t * sender, lv_app_inst_t * receiver);
|
||||
|
||||
/**
|
||||
* Delete a communication connection
|
||||
* @param sender pointer to a data sender application or NULL to be true for all sender
|
||||
* @param receiver pointer to a data receiver application or NULL to be true for all receiver
|
||||
*/
|
||||
void lv_app_con_del(lv_app_inst_t * sender, lv_app_inst_t * receiver);
|
||||
|
||||
/**
|
||||
* Get the application descriptor from its name
|
||||
* @param name name of the app. dsc.
|
||||
* @return pointer to the app. dsc.
|
||||
*/
|
||||
const lv_app_dsc_t * lv_app_dsc_get(const char * name);
|
||||
|
||||
/**
|
||||
* Rename an application
|
||||
* @param app pointer to an application
|
||||
* @param name a string with the new name
|
||||
*/
|
||||
void lv_app_rename(lv_app_inst_t * app, const char * name);
|
||||
|
||||
/**
|
||||
* Get the window object from an object located on the window
|
||||
* @param obj pointer to an object on the window
|
||||
* @return pointer to the window of 'obj'
|
||||
*/
|
||||
lv_obj_t * lv_app_win_get_from_obj(lv_obj_t * obj);
|
||||
|
||||
/**
|
||||
* Read the list of the running applications. (Get he next element)
|
||||
* @param prev the previous application (at the first call give NULL to get the first application)
|
||||
* @param dsc pointer to an application descriptor to filer the applications (NULL to do not filter)
|
||||
* @return pointer to the next running application or NULL if no more
|
||||
*/
|
||||
lv_app_inst_t * lv_app_get_next(lv_app_inst_t * prev, lv_app_dsc_t * dsc);
|
||||
|
||||
/**
|
||||
* Read the list of applications descriptors. (Get he next element)
|
||||
* @param prev the previous application descriptors(at the first call give NULL to get the first)
|
||||
* @return pointer to the next application descriptors or NULL if no more
|
||||
*/
|
||||
lv_app_dsc_t ** lv_app_dsc_get_next(lv_app_dsc_t ** prev);
|
||||
|
||||
|
||||
/**
|
||||
* Get a pointer to the application style structure. If modified then 'lv_app_refr_style' should be called
|
||||
* @return pointer to the application style structure
|
||||
*/
|
||||
lv_app_style_t * lv_app_style_get(void);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* POST-INCLUDES
|
||||
*********************/
|
||||
#include "lvgl/lv_app/lv_app_util/lv_app_kb.h"
|
||||
#include "lvgl/lv_app/lv_app_util/lv_app_fsel.h"
|
||||
#include "lvgl/lv_app/lv_app_util/lv_app_notice.h"
|
||||
|
||||
#include "lvgl/lv_appx/lv_app_example.h"
|
||||
#include "lvgl/lv_appx/lv_app_phantom.h"
|
||||
#include "lvgl/lv_appx/lv_app_sysmon.h"
|
||||
#include "lvgl/lv_appx/lv_app_terminal.h"
|
||||
#include "lvgl/lv_appx/lv_app_files.h"
|
||||
#include "lvgl/lv_appx/lv_app_wifi.h"
|
||||
#include "lvgl/lv_appx/lv_app_gsm.h"
|
||||
#include "lvgl/lv_appx/lv_app_ethernet.h"
|
||||
#include "lvgl/lv_appx/lv_app_benchmark.h"
|
||||
|
||||
#endif /*LV_APP_ENABLE*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /*LV_APP_H*/
|
||||
@@ -1,381 +0,0 @@
|
||||
/**
|
||||
* @file lv_app_fsel.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_app_fsel.h"
|
||||
#if USE_LV_APP_FSEL != 0
|
||||
|
||||
#include <stdio.h>
|
||||
#include "lv_app_notice.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static void fsel_refr(void);
|
||||
static lv_action_res_t fsel_close_action(lv_obj_t * close, lv_dispi_t * dispi);
|
||||
static lv_action_res_t fsel_up_action(lv_obj_t * up, lv_dispi_t * dispi);
|
||||
static lv_action_res_t fsel_next_action(lv_obj_t * next, lv_dispi_t * dispi);
|
||||
static lv_action_res_t fsel_prev_action(lv_obj_t * prev, lv_dispi_t * dispi);
|
||||
static lv_action_res_t fsel_drv_action(lv_obj_t * drv, lv_dispi_t * dispi);
|
||||
static lv_action_res_t fsel_drv_lpr_action(lv_obj_t * drv, lv_dispi_t * dispi);
|
||||
static lv_action_res_t fsel_folder_action(lv_obj_t * folder, lv_dispi_t * dispi);
|
||||
static lv_action_res_t fsel_folder_lpr_action(lv_obj_t * folder, lv_dispi_t * dispi);
|
||||
static lv_action_res_t fsel_file_action(lv_obj_t * file, lv_dispi_t * dispi);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
static const char * fsel_filter;
|
||||
static char fsel_path[LV_APP_FSEL_PATH_MAX_LEN];
|
||||
static uint16_t fsel_file_cnt;
|
||||
static lv_obj_t * fsel_win;
|
||||
static lv_obj_t * fsel_list;
|
||||
static void * fsel_param;
|
||||
static void (*fsel_ok_action)(void *, const char *);
|
||||
static lv_style_t style_btn_symbol;
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the File selector utility
|
||||
*/
|
||||
void lv_app_fsel_init(void)
|
||||
{
|
||||
lv_style_get(LV_STYLE_BTN_REL, &style_btn_symbol);
|
||||
style_btn_symbol.font = font_get(LV_IMG_DEF_SYMBOL_FONT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Open the File selector
|
||||
* @param path start path
|
||||
* @param filter show only files with a specific extension, e.g. "wav".
|
||||
* "/" means filter to folders.
|
||||
* @param param a free parameter which will be added to 'ok_action'
|
||||
* @param ok_action an action to call when a file or folder is chosen
|
||||
*/
|
||||
void lv_app_fsel_open(const char * path, const char * filter, void * param, void (*ok_action)(void *, const char *))
|
||||
{
|
||||
/*Save the parameters*/
|
||||
strcpy(fsel_path, path);
|
||||
fsel_filter = filter;
|
||||
fsel_file_cnt = 0;
|
||||
fsel_param = param;
|
||||
fsel_ok_action = ok_action;
|
||||
|
||||
/*Trim the extra '\' or '/' from the end of path*/
|
||||
uint16_t i;
|
||||
for(i = strlen(fsel_path) -1 ; fsel_path[i] == '/' || fsel_path[i] == '\\'; i--) {
|
||||
fsel_path[i] = '\0';
|
||||
}
|
||||
|
||||
/*Check filter: NULL and "" mean no filtering*/
|
||||
if(fsel_filter == NULL) fsel_filter = "";
|
||||
|
||||
lv_app_style_t * app_style = lv_app_style_get();
|
||||
|
||||
/*Create a window for the File selector*/
|
||||
fsel_win = lv_win_create(lv_scr_act(), NULL);
|
||||
lv_obj_set_size(fsel_win, LV_HOR_RES, LV_VER_RES);
|
||||
lv_win_set_styles_cbtn(fsel_win, &app_style->win_cbtn_rel, &app_style->win_cbtn_pr);
|
||||
lv_obj_set_style(lv_win_get_header(fsel_win), &app_style->menu);
|
||||
|
||||
lv_win_add_cbtn(fsel_win, SYMBOL_CLOSE, fsel_close_action);
|
||||
|
||||
fsel_refr(); /*Refresh the list*/
|
||||
|
||||
/*Show instruction when first open with folder filter*/
|
||||
static bool first_folder_call = false;
|
||||
if(first_folder_call == false && fsel_filter[0] == '/') {
|
||||
lv_app_notice_add("Press a folder long\nto choose it!");
|
||||
first_folder_call = true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Close the File selector
|
||||
*/
|
||||
void lv_app_fsel_close(void)
|
||||
{
|
||||
if(fsel_win != NULL) {
|
||||
lv_obj_del(fsel_win);
|
||||
}
|
||||
|
||||
fsel_win = NULL;
|
||||
fsel_list = NULL;
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Refresh the file list according to the current path and filter
|
||||
*/
|
||||
static void fsel_refr(void)
|
||||
{
|
||||
/*Delete the previous list*/
|
||||
if(fsel_list != NULL) {
|
||||
lv_obj_del(fsel_list);
|
||||
}
|
||||
|
||||
lv_win_set_title(fsel_win, fsel_path);
|
||||
|
||||
/*Create a new list*/
|
||||
fsel_list = lv_list_create(fsel_win, NULL);
|
||||
lv_obj_set_width(fsel_list, lv_win_get_width(fsel_win));
|
||||
lv_list_set_style_img(fsel_list, &style_btn_symbol);
|
||||
lv_obj_set_style(lv_page_get_scrl(fsel_list), lv_style_get(LV_STYLE_TRANSP_TIGHT, NULL));
|
||||
lv_obj_set_drag_parent(fsel_list, true);
|
||||
lv_obj_set_drag_parent(lv_page_get_scrl(fsel_list), true);
|
||||
lv_cont_set_fit(fsel_list, false, true);
|
||||
|
||||
fs_res_t res = FS_RES_OK;
|
||||
lv_obj_t * liste;
|
||||
|
||||
/*At empty path show the drivers */
|
||||
if(fsel_path[0] == '\0') {
|
||||
char drv[16];
|
||||
char buf[2];
|
||||
fs_get_letters(drv);
|
||||
uint8_t i;
|
||||
for(i = 0; drv[i] != '\0'; i++) {
|
||||
buf[0] = drv[i];
|
||||
buf[1] = '\0';
|
||||
liste = lv_list_add(fsel_list, SYMBOL_DRIVE, buf, fsel_drv_action);
|
||||
/*Add long press action to choose the driver as a folder*/
|
||||
if(fsel_filter[0] == '/') lv_btn_set_lpr_action(liste, fsel_drv_lpr_action);
|
||||
}
|
||||
}
|
||||
/*List the files/folders with fs interface*/
|
||||
else {
|
||||
liste = lv_list_add(fsel_list, SYMBOL_UP, "Up", fsel_up_action);
|
||||
|
||||
fs_readdir_t rd;
|
||||
res = fs_readdir_init(&rd, fsel_path);
|
||||
if(res != FS_RES_OK) {
|
||||
lv_app_notice_add("Can not read the path\nin File selector");
|
||||
return;
|
||||
}
|
||||
|
||||
/*At not first page add prev. page button */
|
||||
if(fsel_file_cnt != 0) {
|
||||
liste = lv_list_add(fsel_list, SYMBOL_LEFT, "Previous page", fsel_prev_action);
|
||||
}
|
||||
|
||||
char fn[LV_APP_FSEL_FN_MAX_LEN];
|
||||
|
||||
/*Read the files from the previous pages*/
|
||||
uint16_t file_cnt = 0;
|
||||
while(file_cnt <= fsel_file_cnt) {
|
||||
res = fs_readdir(&rd, fn);
|
||||
if(res != FS_RES_OK){
|
||||
lv_app_notice_add("Can not read the path\nin File selector");
|
||||
return;
|
||||
}
|
||||
file_cnt ++;
|
||||
}
|
||||
|
||||
/*Add list elements from the files and folders*/
|
||||
while(res == FS_RES_OK && fn[0] != '\0') {
|
||||
if(fn[0] == '/') { /*Add a folder*/
|
||||
lv_obj_t * liste;
|
||||
liste = lv_list_add(fsel_list, SYMBOL_FOLDER, &fn[1], fsel_folder_action);
|
||||
/*Add long press action to choose a folder*/
|
||||
if(fsel_filter[0] == '/') lv_btn_set_lpr_action(liste, fsel_folder_lpr_action);
|
||||
|
||||
fsel_file_cnt ++;
|
||||
file_cnt ++;
|
||||
}
|
||||
/*Add a file if it is not filtered*/
|
||||
else if(fsel_filter[0] == '\0' || /*No filtering or ...*/
|
||||
(strcmp(fs_get_ext(fn), fsel_filter) == 0 && /*.. the filter matches*/
|
||||
fsel_filter[0] != '/')) {
|
||||
liste = lv_list_add(fsel_list, SYMBOL_FILE, fn, fsel_file_action);
|
||||
fsel_file_cnt ++;
|
||||
file_cnt ++;
|
||||
}
|
||||
|
||||
/*Get the next element*/
|
||||
res = fs_readdir(&rd, fn);
|
||||
|
||||
/*Show only LV_APP_FSEL_MAX_FILE elements and add a Next page button*/
|
||||
if(fsel_file_cnt != 0 && fsel_file_cnt % LV_APP_FSEL_PAGE_SIZE == 0) {
|
||||
liste = lv_list_add(fsel_list, SYMBOL_RIGHT, "Next page", fsel_next_action);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*Close the read directory*/
|
||||
fs_readdir_close(&rd);
|
||||
}
|
||||
|
||||
if(res != FS_RES_OK) {
|
||||
lv_app_notice_add("Can not read the path\nin File selector");
|
||||
}
|
||||
|
||||
/*Focus to the top of the list*/
|
||||
lv_obj_set_y(lv_page_get_scrl(fsel_list), 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the File selector window close button is released
|
||||
* @param close pointer to the close button
|
||||
* @param dispi pointer to the caller display input
|
||||
* @return LV_ACTION_RES_INV because the window is deleted in the function
|
||||
*/
|
||||
static lv_action_res_t fsel_close_action(lv_obj_t * close, lv_dispi_t * dispi)
|
||||
{
|
||||
lv_app_fsel_close();
|
||||
return LV_ACTION_RES_INV;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the Up list element is released to step one level
|
||||
* @param up pointer to the Up button
|
||||
* @param dispi pointer to the caller display input
|
||||
* @return LV_ACTION_RES_INV because the list is deleted in the function
|
||||
*/
|
||||
static lv_action_res_t fsel_up_action(lv_obj_t * up, lv_dispi_t * dispi)
|
||||
{
|
||||
fs_up(fsel_path);
|
||||
fsel_file_cnt = 0;
|
||||
fsel_refr();
|
||||
return LV_ACTION_RES_INV;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the Next list element is released to go to the next page
|
||||
* @param next pointer to the Next button
|
||||
* @param dispi pointer to the caller display input
|
||||
* @return LV_ACTION_RES_INV because the list is deleted in the function
|
||||
*/
|
||||
static lv_action_res_t fsel_next_action(lv_obj_t * next, lv_dispi_t * dispi)
|
||||
{
|
||||
fsel_refr();
|
||||
return LV_ACTION_RES_INV;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the Prev list element is released to previous page
|
||||
* @param prev pointer to the Prev button
|
||||
* @param dispi pointer to the caller display input
|
||||
* @return LV_ACTION_RES_INV because the list is deleted in the function
|
||||
*/
|
||||
static lv_action_res_t fsel_prev_action(lv_obj_t * prev, lv_dispi_t * dispi)
|
||||
{
|
||||
if(fsel_file_cnt <= 2 * LV_APP_FSEL_PAGE_SIZE) fsel_file_cnt = 0;
|
||||
else if(fsel_file_cnt % LV_APP_FSEL_PAGE_SIZE == 0) {
|
||||
fsel_file_cnt -= 2 * LV_APP_FSEL_PAGE_SIZE;
|
||||
} else {
|
||||
fsel_file_cnt = ((fsel_file_cnt / LV_APP_FSEL_PAGE_SIZE) - 1) * LV_APP_FSEL_PAGE_SIZE;
|
||||
}
|
||||
|
||||
fsel_refr();
|
||||
return LV_ACTION_RES_INV;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Called when the Driver list element is released to step into a driver
|
||||
* @param drv pointer to the Driver button
|
||||
* @param dispi pointer to the caller display input
|
||||
* @return LV_ACTION_RES_INV because the list is deleted in the function
|
||||
*/
|
||||
static lv_action_res_t fsel_drv_action(lv_obj_t * drv, lv_dispi_t * dispi)
|
||||
{
|
||||
sprintf(fsel_path, "%s:", lv_list_get_element_text(drv));
|
||||
fsel_file_cnt = 0;
|
||||
fsel_refr();
|
||||
return LV_ACTION_RES_INV;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the Driver list element is long pressed to choose it
|
||||
* @param drv pointer to the Driver button
|
||||
* @param dispi pointer to the caller display input
|
||||
* @return LV_ACTION_RES_INV because the list is deleted in the function
|
||||
*/
|
||||
static lv_action_res_t fsel_drv_lpr_action(lv_obj_t * drv, lv_dispi_t * dispi)
|
||||
{
|
||||
sprintf(fsel_path, "%s:", lv_list_get_element_text(drv));
|
||||
|
||||
if(fsel_ok_action != NULL) {
|
||||
fsel_ok_action(fsel_param, fsel_path);
|
||||
}
|
||||
|
||||
lv_app_fsel_close();
|
||||
|
||||
return LV_ACTION_RES_INV;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when a folder list element is released to enter into it
|
||||
* @param folder pointer to a folder button
|
||||
* @param dispi pointer to the caller display input
|
||||
* @return LV_ACTION_RES_INV because the list is deleted in the function
|
||||
*/
|
||||
static lv_action_res_t fsel_folder_action(lv_obj_t * folder, lv_dispi_t * dispi)
|
||||
{
|
||||
sprintf(fsel_path, "%s/%s", fsel_path, lv_list_get_element_text(folder));
|
||||
fsel_file_cnt = 0;
|
||||
fsel_refr();
|
||||
return LV_ACTION_RES_INV;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when a folder list element is long pressed to choose it
|
||||
* @param folder pointer to a folder button
|
||||
* @param dispi pointer to the caller display input
|
||||
* @return LV_ACTION_RES_INV because the list is deleted in the function
|
||||
*/
|
||||
static lv_action_res_t fsel_folder_lpr_action(lv_obj_t * folder, lv_dispi_t * dispi)
|
||||
{
|
||||
sprintf(fsel_path, "%s/%s", fsel_path, lv_list_get_element_text(folder));
|
||||
|
||||
if(fsel_ok_action != NULL) {
|
||||
fsel_ok_action(fsel_param, fsel_path);
|
||||
}
|
||||
|
||||
lv_app_fsel_close();
|
||||
|
||||
return LV_ACTION_RES_INV;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when a file list element is released to choose it
|
||||
* @param file pointer to a file button
|
||||
* @param dispi pointer to the caller display input
|
||||
* @return LV_ACTION_RES_INV because the list is deleted in the function
|
||||
*/
|
||||
static lv_action_res_t fsel_file_action(lv_obj_t * file, lv_dispi_t * dispi)
|
||||
{
|
||||
sprintf(fsel_path, "%s/%s", fsel_path, lv_list_get_element_text(file));
|
||||
|
||||
if(fsel_ok_action != NULL) {
|
||||
fsel_ok_action(fsel_param, fsel_path);
|
||||
}
|
||||
|
||||
lv_app_fsel_close();
|
||||
|
||||
return LV_ACTION_RES_INV;
|
||||
}
|
||||
|
||||
#endif /*LV_APP_ENABLE != 0*/
|
||||
@@ -1,75 +0,0 @@
|
||||
/**
|
||||
* @file lv_app_fsel.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LV_APP_FSEL_H
|
||||
#define LV_APP_FSEL_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "../lv_app.h"
|
||||
#if USE_LV_APP_FSEL != 0
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
/*Add the required configurations*/
|
||||
#ifndef LV_APP_FSEL_FN_MAX_LEN
|
||||
#define LV_APP_FSEL_FN_MAX_LEN 128
|
||||
#endif
|
||||
|
||||
#ifndef LV_APP_FSEL_PATH_MAX_LEN
|
||||
#define LV_APP_FSEL_PATH_MAX_LEN 256
|
||||
#endif
|
||||
|
||||
#ifndef LV_APP_FSEL_PAGE_SIZE
|
||||
#define LV_APP_FSEL_PAGE_SIZE 8
|
||||
#endif
|
||||
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the File selector utility
|
||||
*/
|
||||
void lv_app_fsel_init(void);
|
||||
|
||||
/**
|
||||
* Open the File selector
|
||||
* @param path start path
|
||||
* @param filter show only files with a specific extension, e.g. "wav".
|
||||
* "/" means filter to folders.
|
||||
* @param param a free parameter which will be added to 'ok_action'
|
||||
* @param ok_action an action to call when a file or folder is chosen (give 'param' and the path as parameters)
|
||||
*/
|
||||
void lv_app_fsel_open(const char * path, const char * filter, void * param,
|
||||
void (*ok_action)(void *, const char *));
|
||||
|
||||
/**
|
||||
* Close the File selector
|
||||
*/
|
||||
void lv_app_fsel_close(void);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /*LV_APP_ENABLE*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /*LV_APP_FSEL_H*/
|
||||
@@ -1,278 +0,0 @@
|
||||
/**
|
||||
* @file lv_app_kb.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_app_kb.h"
|
||||
#if USE_LV_APP_KB != 0
|
||||
|
||||
#include "lvgl/lv_objx/lv_btnm.h"
|
||||
#include "lvgl/lv_objx/lv_ta.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#ifndef LV_APP_KB_ANIM_TIME
|
||||
#define LV_APP_KB_ANIM_TIME 300 /*ms*/
|
||||
#endif
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static lv_action_res_t lv_app_kb_action(lv_obj_t * btnm, uint16_t i);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
static lv_obj_t * kb_btnm;
|
||||
static lv_obj_t * kb_win;
|
||||
static lv_obj_t * kb_ta;
|
||||
static const char * kb_map_lc[] = {
|
||||
"\0051#", "\004q", "\004w", "\004e", "\004r", "\004t", "\004y", "\004u", "\004i", "\004o", "\004p", "\007Del", "\n",
|
||||
"\006ABC", "\003a", "\003s", "\003d", "\003f", "\003g", "\003h", "\003j", "\003k", "\003l", "\010Enter", "\n",
|
||||
"_", "-", "z", "x", "c", "v", "b", "n", "m", ".", ",", ":", "\n",
|
||||
"\003Hide", "\003Left", "\006 ", "\003Right", "\003Ok", ""
|
||||
};
|
||||
|
||||
static const char * kb_map_uc[] = {
|
||||
"\0051#", "\004Q", "\004W", "\004E", "\004R", "\004T", "\004Y", "\004U", "\004I", "\004O", "\004P", "\007Del", "\n",
|
||||
"\006abc", "\003A", "\003S", "\003D", "\003F", "\003G", "\003H", "\003J", "\003K", "\003L", "\010Enter", "\n",
|
||||
"_", "-", "Z", "X", "C", "V", "B", "N", "M", ".", ",", ":", "\n",
|
||||
"\003Hide", "\003Left", "\006 ", "\003Right", "\003Ok", ""
|
||||
};
|
||||
|
||||
static const char * kb_map_spec[] = {
|
||||
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "\002Del", "\n",
|
||||
"\002abc", "+", "-", "/", "*", "=", "%", "!", "?", "#", "<", ">", "\n",
|
||||
"\\", "@", "$", "(", ")", "{", "}", "[", "]", ";", "\"", "'", "\n",
|
||||
"\003Hide", "\003Left", "\006 ", "\003Right", "\003Ok", ""
|
||||
};
|
||||
|
||||
static const char * kb_map_num[] = {
|
||||
"1", "2", "3", "\002Hide","\n",
|
||||
"4", "5", "6", "\002Ok", "\n",
|
||||
"7", "8", "9", "\002Del", "\n",
|
||||
"+/-", "0", ".", "Left", "Right", ""
|
||||
};
|
||||
|
||||
static cord_t kb_ta_ori_size;
|
||||
static uint8_t kb_mode;
|
||||
static void (*kb_close_action)(lv_obj_t *);
|
||||
static void (*kb_ok_action)(lv_obj_t *);
|
||||
static lv_style_t style_bg;
|
||||
static lv_style_t style_btn_rel;
|
||||
static lv_style_t style_btn_pr;
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the application keyboard
|
||||
*/
|
||||
void lv_app_kb_init(void)
|
||||
{
|
||||
lv_app_style_t * app_style = lv_app_style_get();
|
||||
|
||||
memcpy(&style_bg, &app_style->menu, sizeof(lv_style_t));
|
||||
style_bg.opa = OPA_COVER;
|
||||
style_bg.hpad = 0;
|
||||
style_bg.vpad = 0;
|
||||
style_bg.opad = 0;
|
||||
|
||||
memcpy(&style_btn_rel, &app_style->menu_btn_rel, sizeof(lv_style_t));
|
||||
style_btn_rel.radius = 0;
|
||||
style_btn_rel.bwidth = 1;
|
||||
|
||||
memcpy(&style_btn_pr, &app_style->menu_btn_pr, sizeof(lv_style_t));
|
||||
style_btn_pr.radius = 0;
|
||||
style_btn_pr.bwidth = 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Open a keyboard for a text area object
|
||||
* @param ta pointer to a text area object
|
||||
* @param mode 'OR'd values of 'lv_app_kb_mode_t' enum
|
||||
* @param close a function to call when the keyboard is closed
|
||||
* @param ok a function to called when the "Ok" button is pressed
|
||||
* @return the created button matrix objects
|
||||
*/
|
||||
lv_obj_t * lv_app_kb_open(lv_obj_t * ta, lv_app_kb_mode_t mode, void (*close)(lv_obj_t *), void (*ok)(lv_obj_t *))
|
||||
{
|
||||
/*Close the previous keyboard*/
|
||||
if(kb_btnm != NULL) {
|
||||
lv_app_kb_close(false);
|
||||
}
|
||||
|
||||
/*Save some parameters*/
|
||||
kb_ta = ta;
|
||||
kb_mode = mode;
|
||||
kb_close_action = close;
|
||||
kb_ok_action = ok;
|
||||
|
||||
/*Create a button matrix for the keyboard */
|
||||
kb_btnm = lv_btnm_create(lv_scr_act(), NULL);
|
||||
lv_obj_set_style(kb_btnm, &style_bg);
|
||||
lv_obj_set_size(kb_btnm, LV_HOR_RES, LV_VER_RES / 2);
|
||||
lv_obj_align(kb_btnm, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, 0);
|
||||
lv_btnm_set_action(kb_btnm, lv_app_kb_action);
|
||||
if(mode & LV_APP_KB_MODE_TXT) {
|
||||
style_btn_rel.font = font_get(LV_APP_FONT_MEDIUM);
|
||||
style_btn_pr.font = font_get(LV_APP_FONT_MEDIUM);
|
||||
lv_btnm_set_map(kb_btnm, kb_map_lc);
|
||||
}
|
||||
else if(mode & LV_APP_KB_MODE_NUM) {
|
||||
style_btn_rel.font = font_get(LV_APP_FONT_LARGE);
|
||||
style_btn_pr.font = font_get(LV_APP_FONT_LARGE);
|
||||
lv_btnm_set_map(kb_btnm, kb_map_num);
|
||||
}
|
||||
lv_btnm_set_styles_btn(kb_btnm, &style_btn_rel, &style_btn_pr);
|
||||
|
||||
kb_win = NULL;
|
||||
kb_ta_ori_size = 0;
|
||||
if(mode & LV_APP_KB_MODE_WIN_RESIZE) {
|
||||
/*Reduce the size of the window and align it to the top*/
|
||||
kb_win = lv_app_win_get_from_obj(kb_ta);
|
||||
lv_obj_set_height(kb_win, LV_VER_RES / 2);
|
||||
lv_obj_set_y(kb_win, 0);
|
||||
|
||||
/*If the text area is higher then the new size of the window reduce its size too*/
|
||||
cord_t cont_h = lv_obj_get_height(kb_win) - lv_obj_get_height(lv_win_get_header(kb_win));
|
||||
kb_ta_ori_size = lv_obj_get_height(kb_ta);
|
||||
if(lv_obj_get_height(kb_ta) > cont_h - LV_DPI / 10) {
|
||||
lv_obj_set_height(kb_ta, cont_h - LV_DPI / 10);
|
||||
}
|
||||
lv_page_focus(lv_win_get_page(kb_win), kb_ta, 0);
|
||||
}
|
||||
|
||||
lv_ta_set_cursor_pos(kb_ta, LV_TA_CUR_LAST);
|
||||
if(kb_mode & LV_APP_KB_MODE_CUR_MANAGE) {
|
||||
lv_ta_set_cursor_show(kb_ta, true);
|
||||
}
|
||||
|
||||
if(kb_mode & LV_APP_KB_MODE_ANIM_IN) {
|
||||
lv_obj_anim(kb_btnm, LV_ANIM_FLOAT_BOTTOM | ANIM_IN, LV_APP_KB_ANIM_TIME, 0, NULL);
|
||||
}
|
||||
|
||||
|
||||
return kb_btnm;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Close the keyboard
|
||||
* @param ok true: call the ok function, false: call the close function
|
||||
*/
|
||||
void lv_app_kb_close(bool ok)
|
||||
{
|
||||
if(kb_btnm == NULL) return;
|
||||
|
||||
if(ok == false) {
|
||||
if(kb_close_action != NULL) kb_close_action(kb_ta);
|
||||
} else {
|
||||
if(kb_ok_action != NULL) kb_ok_action(kb_ta);
|
||||
}
|
||||
|
||||
/*Reset the modified sizes*/
|
||||
if((kb_mode & LV_APP_KB_MODE_WIN_RESIZE) && kb_win != NULL) {
|
||||
lv_obj_set_height(kb_ta, kb_ta_ori_size);
|
||||
lv_obj_set_size(kb_win, LV_HOR_RES, LV_VER_RES);
|
||||
kb_win = NULL;
|
||||
}
|
||||
|
||||
if(kb_mode & LV_APP_KB_MODE_CUR_MANAGE) {
|
||||
lv_ta_set_cursor_show(kb_ta, false);
|
||||
}
|
||||
|
||||
if(kb_mode & LV_APP_KB_MODE_ANIM_OUT) {
|
||||
lv_obj_anim(kb_btnm, LV_ANIM_FLOAT_BOTTOM | ANIM_OUT, LV_APP_KB_ANIM_TIME, 0, lv_obj_del);
|
||||
} else {
|
||||
lv_obj_del(kb_btnm);
|
||||
}
|
||||
|
||||
kb_btnm = NULL;
|
||||
kb_ta = NULL;
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Called when a button of 'kb_btnm' is released
|
||||
* @param btnm pointer to 'kb_btnm'
|
||||
* @param i the index of the released button from the current btnm map
|
||||
* @return LV_ACTION_RES_INV if the btnm is deleted else LV_ACTION_RES_OK
|
||||
*/
|
||||
static lv_action_res_t lv_app_kb_action(lv_obj_t * btnm, uint16_t i)
|
||||
{
|
||||
const char ** map = lv_btnm_get_map(btnm);
|
||||
const char * txt = map[i];
|
||||
|
||||
/*Ignore the unit size number of the text*/
|
||||
if(txt[0] <= '\011') txt++;
|
||||
|
||||
/*Do the corresponding action according to the text of the button*/
|
||||
if(strcmp(txt, "abc") == 0) {
|
||||
lv_btnm_set_map(btnm, kb_map_lc);
|
||||
} else if(strcmp(txt, "ABC") == 0) {
|
||||
lv_btnm_set_map(btnm, kb_map_uc);
|
||||
} else if(strcmp(txt, "1#") == 0) {
|
||||
lv_btnm_set_map(btnm, kb_map_spec);
|
||||
} else if(strcmp(txt, "Enter") == 0) {
|
||||
lv_ta_add_char(kb_ta, '\n');
|
||||
} else if(strcmp(txt, "Left") == 0) {
|
||||
lv_ta_cursor_left(kb_ta);
|
||||
} else if(strcmp(txt, "Right") == 0) {
|
||||
lv_ta_cursor_right(kb_ta);
|
||||
} else if(strcmp(txt, "Del") == 0) {
|
||||
lv_ta_del(kb_ta);
|
||||
} else if(strcmp(txt, "+/-") == 0) {
|
||||
uint16_t cur = lv_ta_get_cursor_pos(kb_ta);
|
||||
const char * ta_txt = lv_ta_get_txt(kb_ta);
|
||||
if(ta_txt[0] == '-') {
|
||||
lv_ta_set_cursor_pos(kb_ta, 1);
|
||||
lv_ta_del(kb_ta);
|
||||
lv_ta_add_char(kb_ta, '+');
|
||||
lv_ta_set_cursor_pos(kb_ta, cur);
|
||||
} else if(ta_txt[0] == '+') {
|
||||
lv_ta_set_cursor_pos(kb_ta, 1);
|
||||
lv_ta_del(kb_ta);
|
||||
lv_ta_add_char(kb_ta, '-');
|
||||
lv_ta_set_cursor_pos(kb_ta, cur);
|
||||
} else {
|
||||
lv_ta_set_cursor_pos(kb_ta, 0);
|
||||
lv_ta_add_char(kb_ta, '-');
|
||||
lv_ta_set_cursor_pos(kb_ta, cur + 1);
|
||||
}
|
||||
} else if(strcmp(txt, "Hide") == 0) {
|
||||
lv_app_kb_close(false);
|
||||
return LV_ACTION_RES_INV;
|
||||
} else if(strcmp(txt, "Ok") == 0) {
|
||||
lv_app_kb_close(true);
|
||||
return LV_ACTION_RES_INV;
|
||||
} else {
|
||||
lv_ta_add_text(kb_ta, txt);
|
||||
}
|
||||
|
||||
if(kb_mode & LV_APP_KB_MODE_WIN_RESIZE) {
|
||||
#if LV_APP_ANIM_LEVEL != 0
|
||||
lv_page_focus(lv_win_get_content(kb_win), kb_ta, true);
|
||||
#else
|
||||
lv_page_focus(lv_win_get_page(kb_win), kb_ta, 0);
|
||||
#endif
|
||||
}
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
#endif /*LV_APP_ENABLE != 0*/
|
||||
@@ -1,71 +0,0 @@
|
||||
/**
|
||||
* @file lv_app_kb.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LV_APP_KB_H
|
||||
#define LV_APP_KB_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "../lv_app.h"
|
||||
#if USE_LV_APP_KB != 0
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
typedef enum
|
||||
{
|
||||
LV_APP_KB_MODE_TXT = 0x0001,
|
||||
LV_APP_KB_MODE_NUM = 0x0002,
|
||||
LV_APP_KB_MODE_WIN_RESIZE = 0x0004,
|
||||
LV_APP_KB_MODE_CUR_MANAGE = 0x0008,
|
||||
LV_APP_KB_MODE_ANIM_IN = 0x0010,
|
||||
LV_APP_KB_MODE_ANIM_OUT = 0x0020,
|
||||
}lv_app_kb_mode_t;
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the application keyboard
|
||||
*/
|
||||
void lv_app_kb_init(void);
|
||||
|
||||
/**
|
||||
* Open a keyboard for a text area object
|
||||
* @param ta pointer to a text area object
|
||||
* @param mode 'OR'd values of 'lv_app_kb_mode_t' enum
|
||||
* @param close a function to call when the keyboard is closed
|
||||
* @param ok a function to called when the "Ok" button is pressed
|
||||
* @return the created button matrix objects
|
||||
*/
|
||||
lv_obj_t * lv_app_kb_open(lv_obj_t * ta, lv_app_kb_mode_t mode, void (*close)(lv_obj_t *), void (*ok)(lv_obj_t *));
|
||||
|
||||
/**
|
||||
* Close the keyboard
|
||||
* @param ok true: call the ok function, false: call the close function
|
||||
*/
|
||||
void lv_app_kb_close(bool ok);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /*LV_APP_ENABLE*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /*LV_APP_KB_H*/
|
||||
@@ -1,95 +0,0 @@
|
||||
/**
|
||||
* @file lv_app_notice.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_app_notice.h"
|
||||
#if USE_LV_APP_NOTICE != 0
|
||||
|
||||
#include <lvgl/lv_objx/lv_cont.h>
|
||||
#include "lvgl/lv_objx/lv_label.h"
|
||||
|
||||
#include "misc/gfx/anim.h"
|
||||
#include <stdio.h>
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
static lv_obj_t * notice_h;
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
/**
|
||||
* Initialize the Notifications
|
||||
*/
|
||||
void lv_app_notice_init(void)
|
||||
{
|
||||
notice_h = lv_cont_create(lv_scr_act(), NULL);
|
||||
lv_obj_set_size(notice_h, LV_HOR_RES, LV_VER_RES - LV_DPI / 8);
|
||||
lv_obj_set_y(notice_h, LV_DPI / 8);
|
||||
lv_obj_set_click(notice_h, false);
|
||||
lv_obj_set_style(notice_h, lv_style_get(LV_STYLE_TRANSP, NULL));
|
||||
lv_cont_set_layout(notice_h, LV_CONT_LAYOUT_COL_R);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a notification with a given text
|
||||
* @param format pritntf-like format string
|
||||
* @return pointer the notice which is a message box (lv_mbox) object
|
||||
*/
|
||||
lv_obj_t * lv_app_notice_add(const char * format, ...)
|
||||
{
|
||||
char txt[LV_APP_NOTICE_MAX_LEN];
|
||||
|
||||
va_list va;
|
||||
va_start(va, format);
|
||||
vsprintf(txt,format, va);
|
||||
va_end(va);
|
||||
|
||||
lv_obj_t * mbox;
|
||||
mbox = lv_mbox_create(notice_h, NULL);
|
||||
lv_mbox_set_text(mbox, txt);
|
||||
lv_mbox_set_anim_close_time(mbox, LV_APP_NOTICE_CLOSE_ANIM_TIME);
|
||||
|
||||
#if LV_APP_NOTICE_SHOW_TIME != 0
|
||||
lv_mbox_start_auto_close(mbox, LV_APP_NOTICE_SHOW_TIME);
|
||||
#endif
|
||||
|
||||
/*Delete the last children if there are too many*/
|
||||
uint32_t child_num = lv_obj_get_child_num(notice_h);
|
||||
if(child_num > LV_APP_NOTICE_MAX_NUM) {
|
||||
lv_obj_t * last_child = ll_get_tail(¬ice_h->child_ll);
|
||||
lv_obj_del(last_child);
|
||||
}
|
||||
|
||||
/*make sure the notices are on the top*/
|
||||
lv_obj_set_parent(notice_h, lv_scr_act());
|
||||
|
||||
return mbox;
|
||||
|
||||
}
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
#endif
|
||||
@@ -1,72 +0,0 @@
|
||||
/**
|
||||
* @file lv_app_notice.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LV_APP_NOTICE_H
|
||||
#define LV_APP_NOTICE_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "../lv_app.h"
|
||||
#include <stdarg.h>
|
||||
#if USE_LV_APP_NOTICE != 0
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
/*Add the required configurations*/
|
||||
#ifndef LV_APP_NOTICE_SHOW_TIME
|
||||
#define LV_APP_NOTICE_SHOW_TIME 4000
|
||||
#endif
|
||||
|
||||
#ifndef LV_APP_NOTICE_CLOSE_ANIM_TIME
|
||||
#define LV_APP_NOTICE_CLOSE_ANIM_TIME 300
|
||||
#endif
|
||||
|
||||
#ifndef LV_APP_NOTICE_MAX_NUM
|
||||
#define LV_APP_NOTICE_MAX_NUM 6
|
||||
#endif
|
||||
|
||||
#ifndef LV_APP_NOTICE_MAX_LEN
|
||||
#define LV_APP_NOTICE_MAX_LEN 256
|
||||
#endif
|
||||
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the Notifications
|
||||
*/
|
||||
void lv_app_notice_init(void);
|
||||
|
||||
/**
|
||||
* Add a notification with a given text
|
||||
* @param format pritntf-like format string
|
||||
* @return pointer the notice which is a message box (lv_mbox) object
|
||||
*/
|
||||
lv_obj_t * lv_app_notice_add(const char * format, ...);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /*LV_APP_ENABLE*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /*LV_APP_NOTICE_H*/
|
||||
|
||||
@@ -1,698 +0,0 @@
|
||||
/**
|
||||
* @file lv_app_benchmark.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_app_benchmark.h"
|
||||
#if LV_APP_ENABLE != 0 && USE_LV_APP_BENCHMARK != 0
|
||||
|
||||
#include "../lv_app/lv_app_util/lv_app_kb.h"
|
||||
#include "lvgl/lv_obj/lv_refr.h"
|
||||
#include <stdio.h>
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define SHADOW_WIDTH (LV_DPI / 8)
|
||||
#define IMG_RECOLOR OPA_30
|
||||
#define OPACITY OPA_60
|
||||
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/*Application specific data for an instance of this application*/
|
||||
typedef struct
|
||||
{
|
||||
uint8_t wp :1;
|
||||
uint8_t recolor :1;
|
||||
uint8_t upscalse :1;
|
||||
uint8_t shdw :1;
|
||||
uint8_t opa :1;
|
||||
}my_app_data_t;
|
||||
|
||||
/*Application specific data a window of this application*/
|
||||
typedef struct
|
||||
{
|
||||
lv_obj_t * wp;
|
||||
lv_obj_t * value_l;
|
||||
lv_style_t style_wp;
|
||||
lv_style_t style_value_l;
|
||||
lv_style_t style_btn_rel;
|
||||
lv_style_t style_btn_pr;
|
||||
lv_style_t style_btn_trel;
|
||||
lv_style_t style_btn_tpr;
|
||||
lv_style_t style_btn_ina;
|
||||
}my_win_data_t;
|
||||
|
||||
/*Application specific data for a shortcut of this application*/
|
||||
typedef struct
|
||||
{
|
||||
lv_obj_t * label;
|
||||
}my_sc_data_t;
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static void my_app_run(lv_app_inst_t * app, void * conf);
|
||||
static void my_app_close(lv_app_inst_t * app);
|
||||
static void my_com_rec(lv_app_inst_t * app_send, lv_app_inst_t * app_rec, lv_app_com_type_t type , const void * data, uint32_t size);
|
||||
static void my_sc_open(lv_app_inst_t * app, lv_obj_t * sc);
|
||||
static void my_sc_close(lv_app_inst_t * app);
|
||||
static void my_win_open(lv_app_inst_t * app, lv_obj_t * win);
|
||||
static void my_win_close(lv_app_inst_t * app);
|
||||
|
||||
static void refr_monitor(uint32_t time_ms, uint32_t px_num);
|
||||
static lv_action_res_t run_rel_action(lv_obj_t * btn, lv_dispi_t * dispi);
|
||||
static lv_action_res_t wp_rel_action(lv_obj_t * btn, lv_dispi_t * dispi);
|
||||
static lv_action_res_t recolor_rel_action(lv_obj_t * btn, lv_dispi_t * dispi);
|
||||
static lv_action_res_t upscale_rel_action(lv_obj_t * btn, lv_dispi_t * dispi);
|
||||
static lv_action_res_t shadow_rel_action(lv_obj_t * btn, lv_dispi_t * dispi);
|
||||
static lv_action_res_t opa_rel_action(lv_obj_t * btn, lv_dispi_t * dispi);
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
static lv_app_dsc_t my_app_dsc =
|
||||
{
|
||||
.name = "Benchmark",
|
||||
.mode = LV_APP_MODE_NONE,
|
||||
.app_run = my_app_run,
|
||||
.app_close = my_app_close,
|
||||
.com_rec = my_com_rec,
|
||||
.win_open = my_win_open,
|
||||
.win_close = my_win_close,
|
||||
.sc_open = my_sc_open,
|
||||
.sc_close = my_sc_close,
|
||||
.app_data_size = sizeof(my_app_data_t),
|
||||
.sc_data_size = sizeof(my_sc_data_t),
|
||||
.win_data_size = sizeof(my_win_data_t),
|
||||
};
|
||||
|
||||
static lv_style_t style_win_scrl;
|
||||
static lv_style_t style_sc_btn_rel;
|
||||
static lv_style_t style_sc_btn_pr;
|
||||
|
||||
static bool caputre_next;
|
||||
|
||||
static const color_int_t img_benchmark_bg[];
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the application
|
||||
* @return pointer to the application descriptor of this application
|
||||
*/
|
||||
const lv_app_dsc_t * lv_app_benchmark_init(void)
|
||||
{
|
||||
lv_refr_set_monitor_cb(refr_monitor);
|
||||
|
||||
lv_img_create_file("app_bm_wp", img_benchmark_bg);
|
||||
|
||||
lv_style_get(LV_STYLE_TRANSP, &style_win_scrl);
|
||||
style_win_scrl.opad = 2 * SHADOW_WIDTH + SHADOW_WIDTH / 8 ;
|
||||
style_win_scrl.hpad = SHADOW_WIDTH;
|
||||
style_win_scrl.vpad = SHADOW_WIDTH;
|
||||
|
||||
lv_style_get(LV_STYLE_BTN_REL, &style_sc_btn_rel);
|
||||
style_sc_btn_rel.font = font_get(LV_IMG_DEF_SYMBOL_FONT);
|
||||
|
||||
|
||||
lv_style_get(LV_STYLE_BTN_PR, &style_sc_btn_pr);
|
||||
style_sc_btn_pr.font = font_get(LV_IMG_DEF_SYMBOL_FONT);
|
||||
|
||||
return &my_app_dsc;
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Run an application according to 'app_dsc'
|
||||
* @param app_dsc pointer to an application descriptor
|
||||
* @param conf pointer to a lv_app_benchmark_conf_t structure with configuration data or NULL if unused
|
||||
* @return pointer to the opened application or NULL if any error occurred
|
||||
*/
|
||||
static void my_app_run(lv_app_inst_t * app, void * conf)
|
||||
{
|
||||
/*Initialize the application*/
|
||||
my_app_data_t * ad = app->app_data;
|
||||
ad->opa = 0;
|
||||
ad->recolor = 0;
|
||||
ad->shdw = 0;
|
||||
ad->upscalse = 0;
|
||||
ad->wp = 0;
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Close a running application.
|
||||
* Close the Window and the Shortcut too if opened.
|
||||
* Free all the allocated memory by this application.
|
||||
* @param app pointer to an application
|
||||
*/
|
||||
static void my_app_close(lv_app_inst_t * app)
|
||||
{
|
||||
/*No dynamically allocated data in 'my_app_data'*/
|
||||
}
|
||||
|
||||
/**
|
||||
* Read the data have been sent to this application
|
||||
* @param app_send pointer to an application which sent the message
|
||||
* @param app_rec pointer to an application which is receiving the message
|
||||
* @param type type of data from 'lv_app_com_type_t' enum
|
||||
* @param data pointer to the sent data
|
||||
* @param size length of 'data' in bytes
|
||||
*/
|
||||
static void my_com_rec(lv_app_inst_t * app_send, lv_app_inst_t * app_rec,
|
||||
lv_app_com_type_t type , const void * data, uint32_t size)
|
||||
{
|
||||
if(type == LV_APP_COM_TYPE_CHAR) { /*data: string*/
|
||||
my_sc_data_t * sc_data = app_rec->sc_data;
|
||||
if (sc_data->label != NULL) {
|
||||
lv_label_set_text_array(sc_data->label, data, size);
|
||||
lv_obj_align(sc_data->label , NULL,LV_ALIGN_CENTER, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Open a shortcut for an application
|
||||
* @param app pointer to an application
|
||||
* @param sc pointer to an object where the application
|
||||
* can create content of the shortcut
|
||||
*/
|
||||
static void my_sc_open(lv_app_inst_t * app, lv_obj_t * sc)
|
||||
{
|
||||
my_sc_data_t * sc_data = app->sc_data;
|
||||
|
||||
lv_cont_set_layout(sc, LV_CONT_LAYOUT_CENTER);
|
||||
|
||||
sc_data->label = lv_label_create(sc, NULL);
|
||||
lv_label_set_text(sc_data->label, "N/A ms");
|
||||
|
||||
lv_obj_t * btn = lv_btn_create(sc, NULL);
|
||||
lv_btn_set_rel_action(btn, run_rel_action);
|
||||
lv_cont_set_fit(btn, true, true);
|
||||
lv_btn_set_styles(btn, &style_sc_btn_rel, &style_sc_btn_pr, NULL, NULL, NULL);
|
||||
|
||||
lv_obj_t * btn_l = lv_label_create(btn, NULL);
|
||||
lv_label_set_text(btn_l, SYMBOL_PLAY);
|
||||
}
|
||||
|
||||
/**
|
||||
* Close the shortcut of an application
|
||||
* @param app pointer to an application
|
||||
*/
|
||||
static void my_sc_close(lv_app_inst_t * app)
|
||||
{
|
||||
/*No dynamically allocated data in 'my_sc_data'*/
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Open the application in a window
|
||||
* @param app pointer to an application
|
||||
* @param win pointer to a window object where
|
||||
* the application can create content
|
||||
*/
|
||||
static void my_win_open(lv_app_inst_t * app, lv_obj_t * win)
|
||||
{
|
||||
my_win_data_t * wdata = app->win_data;
|
||||
my_app_data_t * adata = app->app_data;
|
||||
|
||||
lv_style_get(LV_STYLE_BTN_INA, &wdata->style_value_l);
|
||||
wdata->style_value_l.ccolor = COLOR_BLACK;
|
||||
lv_style_get(LV_STYLE_BTN_REL, &wdata->style_btn_rel);
|
||||
lv_style_get(LV_STYLE_BTN_PR, &wdata->style_btn_pr);
|
||||
lv_style_get(LV_STYLE_BTN_TREL, &wdata->style_btn_trel);
|
||||
lv_style_get(LV_STYLE_BTN_TPR, &wdata->style_btn_tpr);
|
||||
lv_style_get(LV_STYLE_BTN_INA, &wdata->style_btn_ina);
|
||||
lv_style_get(LV_STYLE_PLAIN, &wdata->style_wp);
|
||||
wdata->style_wp.ccolor = COLOR_RED;//MAKE(0x10, 0x20, 0x30);
|
||||
|
||||
if(adata->opa == 0) {
|
||||
wdata->style_btn_rel.opa = OPA_COVER;
|
||||
wdata->style_btn_pr.opa = OPA_COVER;
|
||||
wdata->style_btn_trel.opa =OPA_COVER;
|
||||
wdata->style_btn_tpr.opa = OPA_COVER;
|
||||
wdata->style_btn_ina.opa = OPA_COVER;
|
||||
} else {
|
||||
wdata->style_btn_rel.opa = OPACITY;
|
||||
wdata->style_btn_pr.opa = OPACITY;
|
||||
wdata->style_btn_trel.opa =OPACITY;
|
||||
wdata->style_btn_tpr.opa = OPACITY;
|
||||
wdata->style_btn_ina.opa = OPACITY;
|
||||
}
|
||||
|
||||
if(adata->shdw == 0) {
|
||||
wdata->style_btn_rel.swidth = 0;
|
||||
wdata->style_btn_pr.swidth = 0;
|
||||
wdata->style_btn_trel.swidth = 0;
|
||||
wdata->style_btn_tpr.swidth = 0;
|
||||
wdata->style_btn_ina.swidth = 0;
|
||||
} else {
|
||||
wdata->style_btn_rel.swidth = SHADOW_WIDTH;
|
||||
wdata->style_btn_pr.swidth = SHADOW_WIDTH;
|
||||
wdata->style_btn_trel.swidth = SHADOW_WIDTH;
|
||||
wdata->style_btn_tpr.swidth = SHADOW_WIDTH;
|
||||
wdata->style_btn_ina.swidth = SHADOW_WIDTH;
|
||||
}
|
||||
|
||||
if(adata->recolor == 0) {
|
||||
wdata->style_wp.img_recolor = OPA_TRANSP;
|
||||
} else {
|
||||
wdata->style_wp.img_recolor = IMG_RECOLOR;
|
||||
}
|
||||
|
||||
lv_obj_set_style(lv_page_get_scrl(lv_win_get_page(win)), &style_win_scrl);
|
||||
|
||||
wdata->wp = lv_img_create(win, NULL);
|
||||
lv_obj_set_protect(wdata->wp, LV_PROTECT_PARENT);
|
||||
lv_obj_set_parent(wdata->wp, lv_win_get_page(win));
|
||||
lv_img_set_file(wdata->wp, "U:/app_bm_wp");
|
||||
lv_obj_set_size(wdata->wp, LV_HOR_RES, LV_VER_RES - lv_obj_get_height(lv_win_get_header(win)));
|
||||
lv_obj_set_pos(wdata->wp, 0, 0);
|
||||
lv_obj_set_style(wdata->wp, &wdata->style_wp);
|
||||
lv_img_set_auto_size(wdata->wp, false);
|
||||
if(adata->wp == 0) lv_obj_set_hidden(wdata->wp, true);
|
||||
if(adata->upscalse != 0) lv_img_set_upscale(wdata->wp, true);
|
||||
|
||||
/* The order is changed because the wallpaper's parent change
|
||||
* Therefore add the scrollable again */
|
||||
lv_obj_set_parent(lv_page_get_scrl(lv_win_get_page(win)), lv_win_get_page(win));
|
||||
|
||||
lv_cont_set_layout(lv_page_get_scrl(lv_win_get_page(win)), LV_CONT_LAYOUT_PRETTY);
|
||||
|
||||
lv_obj_t * holder;
|
||||
|
||||
holder = lv_cont_create(win, NULL);
|
||||
lv_cont_set_fit(holder, true, true);
|
||||
lv_obj_set_style(holder, &wdata->style_btn_ina);
|
||||
lv_page_glue_obj(holder, true);
|
||||
|
||||
wdata->value_l = lv_label_create(holder, NULL);
|
||||
lv_obj_set_style(wdata->value_l, &wdata->style_value_l);
|
||||
lv_label_set_text(wdata->value_l, "Screen load: N/A ms\nN/A px/ms");
|
||||
|
||||
lv_obj_t * btn;
|
||||
btn = lv_btn_create(win, NULL);
|
||||
lv_obj_set_free_p(btn, app);
|
||||
lv_page_glue_obj(btn, true);
|
||||
lv_cont_set_fit(btn, true, true);
|
||||
lv_btn_set_styles(btn, &wdata->style_btn_rel, &wdata->style_btn_pr, &wdata->style_btn_trel, &wdata->style_btn_tpr, NULL);
|
||||
lv_btn_set_rel_action(btn, run_rel_action);
|
||||
|
||||
lv_obj_t * btn_l;
|
||||
btn_l = lv_label_create(btn, NULL);
|
||||
lv_label_set_text(btn_l, "Run\ntest!");
|
||||
lv_obj_set_protect(btn, LV_PROTECT_FOLLOW);
|
||||
|
||||
btn = lv_btn_create(win, btn);
|
||||
lv_btn_set_tgl(btn, true);
|
||||
lv_obj_clr_protect(btn, LV_PROTECT_FOLLOW);
|
||||
if(adata->wp != 0) lv_btn_set_state(btn, LV_BTN_STATE_TREL);
|
||||
else lv_btn_set_state(btn, LV_BTN_STATE_REL);
|
||||
lv_btn_set_rel_action(btn, wp_rel_action);
|
||||
btn_l = lv_label_create(btn, btn_l);
|
||||
lv_label_set_text(btn_l, "Wallpaper");
|
||||
|
||||
|
||||
btn = lv_btn_create(win, btn);
|
||||
if(adata->recolor != 0) lv_btn_set_state(btn, LV_BTN_STATE_TREL);
|
||||
else lv_btn_set_state(btn, LV_BTN_STATE_REL);
|
||||
lv_btn_set_rel_action(btn, recolor_rel_action);
|
||||
btn_l = lv_label_create(btn, btn_l);
|
||||
lv_label_set_text(btn_l, "Wp. recolor!");
|
||||
|
||||
|
||||
btn = lv_btn_create(win, btn);
|
||||
if(adata->upscalse != 0) lv_btn_set_state(btn, LV_BTN_STATE_TREL);
|
||||
else lv_btn_set_state(btn, LV_BTN_STATE_REL);
|
||||
lv_btn_set_rel_action(btn, upscale_rel_action);
|
||||
btn_l = lv_label_create(btn, btn_l);
|
||||
lv_label_set_text(btn_l, "Wp. upscalse!");
|
||||
|
||||
|
||||
btn = lv_btn_create(win, btn);
|
||||
if(adata->shdw != 0) lv_btn_set_state(btn, LV_BTN_STATE_TREL);
|
||||
else lv_btn_set_state(btn, LV_BTN_STATE_REL);
|
||||
lv_btn_set_rel_action(btn, shadow_rel_action);
|
||||
btn_l = lv_label_create(btn, btn_l);
|
||||
lv_label_set_text(btn_l, "Shadow");
|
||||
|
||||
btn = lv_btn_create(win, btn);
|
||||
if(adata->opa != 0) lv_btn_set_state(btn, LV_BTN_STATE_TREL);
|
||||
else lv_btn_set_state(btn, LV_BTN_STATE_REL);
|
||||
lv_btn_set_rel_action(btn, opa_rel_action);
|
||||
btn_l = lv_label_create(btn, btn_l);
|
||||
lv_label_set_text(btn_l, "Opacity");
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Close the window of an application
|
||||
* @param app pointer to an application
|
||||
*/
|
||||
static void my_win_close(lv_app_inst_t * app)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/*--------------------
|
||||
* OTHER FUNCTIONS
|
||||
---------------------*/
|
||||
|
||||
static void refr_monitor(uint32_t time_ms, uint32_t px_num)
|
||||
{
|
||||
if(caputre_next != false) {
|
||||
lv_app_inst_t * app = NULL;
|
||||
app = lv_app_get_next(app, &my_app_dsc);
|
||||
|
||||
char w_buf[256];
|
||||
if(time_ms != 0) sprintf(w_buf, "Screen load: %d ms\n%d px/ms", time_ms, px_num/time_ms);
|
||||
else sprintf(w_buf, "Screen load: %d ms\nN/A px/ms", time_ms);
|
||||
|
||||
char s_buf[16];
|
||||
sprintf(s_buf, "%d ms", time_ms);
|
||||
|
||||
while(app != NULL) {
|
||||
if(app->win_data != NULL) {
|
||||
my_win_data_t * wdata = app->win_data;
|
||||
lv_label_set_text(wdata->value_l, w_buf);
|
||||
}
|
||||
|
||||
if(app->sc_data != NULL) {
|
||||
my_sc_data_t * sdata = app->sc_data;
|
||||
lv_label_set_text(sdata->label, s_buf);
|
||||
}
|
||||
|
||||
app = lv_app_get_next(app, &my_app_dsc);
|
||||
}
|
||||
|
||||
|
||||
caputre_next = false;
|
||||
}
|
||||
}
|
||||
|
||||
static lv_action_res_t run_rel_action(lv_obj_t * btn, lv_dispi_t * dispi)
|
||||
{
|
||||
lv_obj_inv(lv_scr_act());
|
||||
caputre_next = true;
|
||||
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
static lv_action_res_t wp_rel_action(lv_obj_t * btn, lv_dispi_t * dispi)
|
||||
{
|
||||
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(btn);
|
||||
my_win_data_t * wdata = app->win_data;
|
||||
my_app_data_t * adata = app->app_data;
|
||||
|
||||
if(lv_btn_get_state(btn) == LV_BTN_STATE_TREL) {
|
||||
adata->wp = 1;
|
||||
lv_obj_set_hidden(wdata->wp, false);
|
||||
} else {
|
||||
adata->wp = 0;
|
||||
lv_obj_set_hidden(wdata->wp, true);
|
||||
}
|
||||
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
static lv_action_res_t recolor_rel_action(lv_obj_t * btn, lv_dispi_t * dispi)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(btn);
|
||||
my_win_data_t * wdata = app->win_data;
|
||||
my_app_data_t * adata = app->app_data;
|
||||
|
||||
if(lv_btn_get_state(btn) == LV_BTN_STATE_TREL) {
|
||||
adata->recolor = 1;
|
||||
wdata->style_wp.img_recolor = IMG_RECOLOR;
|
||||
} else {
|
||||
adata->recolor = 0;
|
||||
wdata->style_wp.img_recolor = OPA_TRANSP;
|
||||
}
|
||||
|
||||
lv_obj_refr_style(wdata->wp);
|
||||
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
static lv_action_res_t upscale_rel_action(lv_obj_t * btn, lv_dispi_t * dispi)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(btn);
|
||||
my_win_data_t * wdata = app->win_data;
|
||||
my_app_data_t * adata = app->app_data;
|
||||
|
||||
if(lv_btn_get_state(btn) == LV_BTN_STATE_TREL) {
|
||||
adata->upscalse = 1;
|
||||
lv_img_set_upscale(wdata->wp, true);
|
||||
} else {
|
||||
adata->upscalse = 0;
|
||||
lv_img_set_upscale(wdata->wp, false);
|
||||
}
|
||||
|
||||
lv_obj_set_size(wdata->wp, LV_HOR_RES, LV_VER_RES - lv_obj_get_height(lv_win_get_header(app->win)));
|
||||
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
static lv_action_res_t shadow_rel_action(lv_obj_t * btn, lv_dispi_t * dispi)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(btn);
|
||||
my_win_data_t * wdata = app->win_data;
|
||||
my_app_data_t * adata = app->app_data;
|
||||
|
||||
if(lv_btn_get_state(btn) == LV_BTN_STATE_TREL) {
|
||||
adata->shdw = 1;
|
||||
wdata->style_btn_rel.swidth = SHADOW_WIDTH;
|
||||
wdata->style_btn_pr.swidth = SHADOW_WIDTH;
|
||||
wdata->style_btn_trel.swidth = SHADOW_WIDTH;
|
||||
wdata->style_btn_tpr.swidth = SHADOW_WIDTH;
|
||||
wdata->style_btn_ina.swidth = SHADOW_WIDTH;
|
||||
} else {
|
||||
adata->shdw = 0;
|
||||
wdata->style_btn_rel.swidth = 0;
|
||||
wdata->style_btn_pr.swidth = 0;
|
||||
wdata->style_btn_trel.swidth =0;
|
||||
wdata->style_btn_tpr.swidth = 0;
|
||||
wdata->style_btn_ina.swidth = 0;
|
||||
}
|
||||
|
||||
lv_style_refr_objs(&wdata->style_btn_rel);
|
||||
lv_style_refr_objs(&wdata->style_btn_pr);
|
||||
lv_style_refr_objs(&wdata->style_btn_trel);
|
||||
lv_style_refr_objs(&wdata->style_btn_tpr);
|
||||
lv_style_refr_objs(&wdata->style_btn_ina);
|
||||
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
static lv_action_res_t opa_rel_action(lv_obj_t * btn, lv_dispi_t * dispi)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(btn);
|
||||
my_win_data_t * wdata = app->win_data;
|
||||
my_app_data_t * adata = app->app_data;
|
||||
|
||||
if(lv_btn_get_state(btn) == LV_BTN_STATE_TREL) {
|
||||
adata->opa = 1;
|
||||
wdata->style_btn_rel.opa = OPACITY;
|
||||
wdata->style_btn_pr.opa = OPACITY;
|
||||
wdata->style_btn_trel.opa =OPACITY;
|
||||
wdata->style_btn_tpr.opa = OPACITY;
|
||||
wdata->style_btn_ina.opa = OPACITY;
|
||||
} else {
|
||||
adata->opa = 0;
|
||||
wdata->style_btn_rel.opa = OPA_COVER;
|
||||
wdata->style_btn_pr.opa = OPA_COVER;
|
||||
wdata->style_btn_trel.opa =OPA_COVER;
|
||||
wdata->style_btn_tpr.opa = OPA_COVER;
|
||||
wdata->style_btn_ina.opa = OPA_COVER;
|
||||
}
|
||||
|
||||
lv_style_refr_objs(&wdata->style_btn_rel);
|
||||
lv_style_refr_objs(&wdata->style_btn_pr);
|
||||
lv_style_refr_objs(&wdata->style_btn_trel);
|
||||
lv_style_refr_objs(&wdata->style_btn_tpr);
|
||||
lv_style_refr_objs(&wdata->style_btn_ina);
|
||||
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
|
||||
/*Exceptionally store the data because the big array would be bothering*/
|
||||
|
||||
#if COLOR_DEPTH == 8
|
||||
static const color_int_t img_benchmark_bg[] = {
|
||||
/*HEADER
|
||||
Width = 40
|
||||
Height = 40
|
||||
Transp: 0
|
||||
Color depth: 8*/
|
||||
40, 128, 2, 2,
|
||||
|
||||
/*IMAGE DATA*/
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 5, 0, 5, 5, 5, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 5, 5, 0, 5, 5, 0, 0, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 5, 0, 0, 0, 5, 5, 5, 5, 5, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 5, 5, 5, 5, 5, 5, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 0, 0, 0, 5, 5, 5, 0, 5, 5, 5, 5, 0, 0, 5, 5, 5, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 0, 5, 5, 5, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 0, 0, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 5, 5, 5, 0, 5, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 0, 0, 0, 0, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 5, 5, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 5, 5, 5, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
};
|
||||
#endif /*COLOR_DEPTH*/
|
||||
|
||||
#if COLOR_DEPTH == 16
|
||||
static const color_int_t img_benchmark_bg[] = {
|
||||
/*HEADER
|
||||
Width = 40
|
||||
Height = 40
|
||||
Transp: 0
|
||||
Color depth: 16*/
|
||||
32808, 1026,
|
||||
|
||||
/*IMAGE DATA*/
|
||||
32, 32, 32, 2113, 2113, 4258, 6339, 4258, 4258, 4226, 4226, 2145, 4226, 2113, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 2145, 2145, 4226, 4226, 4226, 4226, 4226, 2145, 32, 32, 32, 32,
|
||||
0, 32, 2113, 32, 6339, 10565, 8452, 4258, 4226, 4226, 2145, 4226, 6339, 4226, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 2145, 4226, 2145, 2145, 4226, 4226, 4226, 6371, 6339, 4226, 32, 32, 32,
|
||||
32, 32, 2113, 4226, 8484, 8484, 8452, 6371, 4226, 2145, 4226, 4258, 4258, 4258, 2145, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 2145, 4226, 4226, 4226, 4226, 2145, 2145, 4226, 6339, 4258, 4258, 4226, 32, 32,
|
||||
32, 32, 4258, 6371, 8452, 6371, 6371, 6339, 4226, 2145, 4226, 4226, 2145, 4226, 4226, 2113, 32, 0, 0, 0, 0, 32, 0, 0, 32, 2113, 2145, 2145, 2145, 4226, 4226, 4226, 2145, 4226, 6339, 4226, 6371, 6339, 2145, 32,
|
||||
2113, 2145, 6371, 6339, 4226, 4226, 4226, 4226, 4258, 4258, 4226, 2145, 4226, 2145, 2145, 4226, 4258, 32, 0, 0, 0, 0, 0, 2113, 6339, 4226, 2113, 2145, 2145, 2145, 4226, 4226, 4258, 4226, 4258, 4258, 4258, 6339, 6339, 2145,
|
||||
4226, 4258, 6339, 4226, 4226, 2145, 2145, 2145, 4226, 4226, 4226, 2145, 2145, 2145, 4226, 6339, 8452, 6339, 32, 0, 0, 0, 2113, 6339, 6371, 6339, 2145, 2113, 2145, 2145, 4226, 4226, 4226, 4226, 4226, 4226, 4226, 4258, 4258, 4226,
|
||||
4226, 4226, 2145, 4226, 2145, 2145, 4226, 4226, 2145, 4226, 4226, 4226, 2145, 4226, 6371, 6371, 6371, 8452, 4258, 32, 0, 2113, 6371, 6371, 6371, 6339, 6339, 2145, 2145, 4226, 2145, 2145, 2145, 4226, 4258, 4226, 4226, 4226, 2145, 4226,
|
||||
4226, 2145, 4226, 2145, 2145, 4226, 4226, 4226, 4226, 4226, 2145, 2145, 4258, 6371, 8452, 6371, 6371, 6371, 8452, 6339, 2145, 6339, 8452, 6371, 6339, 6371, 6371, 6339, 4226, 2145, 2145, 2145, 2145, 2145, 4258, 4258, 2145, 2145, 2145, 2145,
|
||||
4226, 2145, 4226, 2113, 2145, 4226, 4258, 4226, 2145, 2145, 2145, 4258, 6371, 8452, 6371, 6339, 6371, 6371, 8452, 8452, 6339, 8452, 8452, 8452, 6371, 6371, 8452, 8452, 6339, 4226, 2145, 2145, 2145, 2145, 4226, 4258, 2145, 2113, 2145, 2145,
|
||||
2145, 2145, 2113, 2145, 4226, 4226, 4226, 2145, 2145, 2113, 4226, 6339, 6371, 6371, 6371, 6371, 6371, 8452, 6371, 8452, 8452, 6371, 8452, 8452, 6339, 6371, 8452, 8452, 8452, 6371, 4226, 2145, 4226, 4226, 4226, 4226, 4226, 4226, 2145, 4226,
|
||||
4226, 4226, 2145, 4226, 4226, 2145, 4226, 2145, 2113, 2145, 6339, 6371, 6371, 8452, 8452, 8452, 8484, 8452, 6371, 6371, 6371, 6371, 6371, 6371, 6371, 6371, 6371, 6371, 8452, 8452, 6339, 2145, 2145, 4226, 4226, 2145, 4226, 4226, 2145, 4226,
|
||||
2145, 4226, 4258, 2145, 2145, 2145, 2113, 2145, 4226, 6339, 6371, 6371, 6371, 8452, 8484, 8484, 8452, 6371, 6371, 6371, 6371, 6371, 6371, 8452, 6371, 6339, 6371, 6371, 6371, 8452, 8452, 6339, 4226, 2145, 2145, 4226, 4226, 2145, 4226, 2145,
|
||||
32, 2113, 4226, 4226, 2145, 2145, 2113, 2145, 8452, 8452, 6371, 6371, 6339, 8484, 8484, 8484, 8484, 8452, 6371, 6339, 6371, 6371, 6371, 6371, 6371, 6371, 6339, 6339, 6339, 6339, 8452, 8484, 6371, 2145, 2145, 4226, 2145, 4226, 4226, 2113,
|
||||
0, 0, 2145, 4226, 4226, 4226, 4258, 6371, 6371, 8452, 6371, 6339, 6339, 8452, 8484, 8452, 8452, 8452, 6371, 6371, 8452, 8452, 8452, 6371, 6371, 6339, 6371, 6339, 6371, 6371, 8452, 8452, 8484, 8452, 4226, 4226, 4258, 4258, 2113, 32,
|
||||
0, 0, 32, 2113, 2145, 6339, 8452, 8452, 6339, 6339, 8452, 6371, 6339, 6371, 10565, 8484, 8452, 8484, 8452, 6371, 6339, 8452, 8452, 6371, 6371, 6339, 6371, 6371, 6371, 8452, 8452, 8452, 8484, 10565, 6371, 4258, 4226, 2145, 32, 0,
|
||||
0, 0, 0, 0, 2113, 6339, 8452, 6371, 6371, 6339, 6371, 8452, 6371, 6371, 8452, 8484, 8452, 8452, 8484, 8452, 4258, 8452, 8452, 6339, 6339, 6339, 6339, 6371, 6371, 6371, 6371, 8452, 8452, 8452, 8484, 8452, 2113, 0, 0, 32,
|
||||
0, 0, 0, 0, 0, 4258, 6371, 6371, 6371, 6371, 6371, 6371, 6371, 6371, 8452, 8452, 8452, 8484, 8452, 2145, 32, 4226, 6371, 6371, 6371, 6339, 6371, 6371, 6371, 6371, 6371, 6371, 8452, 8452, 8452, 4226, 32, 0, 0, 32,
|
||||
0, 0, 0, 0, 0, 0, 4226, 8452, 6371, 6371, 6371, 6339, 6371, 8452, 8452, 8452, 8484, 8452, 2145, 0, 0, 0, 4226, 8452, 6371, 6371, 6371, 6339, 6339, 6371, 6371, 6371, 8452, 8484, 4258, 0, 32, 32, 32, 0,
|
||||
0, 0, 0, 0, 0, 0, 32, 4258, 6371, 6371, 6371, 6371, 6371, 8452, 8452, 8452, 8452, 2145, 0, 0, 32, 0, 0, 4226, 6371, 6371, 6339, 6339, 6371, 6371, 6371, 6371, 6371, 2145, 0, 0, 32, 32, 32, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 32, 6339, 6371, 6371, 6371, 6371, 8452, 8484, 8452, 4226, 32, 0, 0, 0, 0, 0, 0, 4226, 6339, 6339, 6339, 6371, 6371, 6371, 6371, 4226, 0, 32, 32, 32, 32, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 2113, 6339, 6371, 6371, 6371, 6371, 8452, 8484, 8484, 4258, 32, 0, 0, 0, 0, 0, 32, 4258, 6339, 6339, 6371, 6371, 6371, 8452, 8452, 4258, 32, 32, 32, 32, 32, 0, 32,
|
||||
0, 0, 0, 32, 0, 0, 2113, 6339, 8484, 8452, 6371, 6371, 8452, 8484, 8484, 8484, 8452, 4226, 0, 0, 0, 0, 32, 6339, 8452, 6371, 6371, 6371, 6371, 6371, 8452, 8452, 8484, 6371, 2113, 32, 32, 32, 32, 32,
|
||||
0, 0, 0, 0, 0, 2113, 6339, 8452, 8484, 8484, 8452, 6371, 8452, 10597, 8452, 8452, 8452, 6371, 4226, 0, 0, 32, 4258, 8452, 8452, 8452, 8452, 6371, 6339, 6371, 6371, 6371, 8484, 8484, 6339, 2113, 0, 32, 32, 32,
|
||||
0, 0, 0, 0, 2113, 6371, 8452, 8452, 8452, 8452, 8452, 8452, 8484, 10597, 8452, 8452, 6371, 8452, 8452, 4258, 2113, 6339, 8452, 8452, 8452, 6371, 8452, 8452, 8452, 8452, 6371, 6371, 8452, 8484, 8484, 6371, 2113, 32, 32, 32,
|
||||
0, 0, 0, 32, 2145, 6339, 8484, 8452, 8452, 8452, 8452, 8452, 8484, 8484, 8452, 8452, 6371, 8452, 8452, 10565, 8484, 8452, 8484, 8452, 8452, 6371, 8452, 8484, 8452, 8484, 8452, 6371, 8484, 8484, 10597, 6371, 6339, 2145, 0, 32,
|
||||
0, 0, 0, 2145, 4226, 2145, 6339, 8452, 8452, 8452, 8452, 8452, 8452, 8452, 8452, 8452, 8452, 8452, 8452, 8484, 8452, 8452, 8452, 8452, 8452, 6371, 8452, 8452, 8452, 8484, 8484, 8484, 8484, 12678, 6371, 4226, 6371, 4258, 32, 0,
|
||||
0, 32, 2145, 4226, 4226, 2145, 2145, 6339, 8484, 10565, 8452, 8452, 8452, 8452, 8484, 8484, 8452, 8452, 6371, 6371, 6371, 6339, 8452, 8452, 8452, 8452, 6371, 8452, 8484, 8484, 8452, 8484, 10565, 8484, 4258, 4226, 6339, 6339, 2145, 32,
|
||||
2113, 4226, 4258, 4226, 4226, 4226, 2145, 2145, 8452, 8484, 8452, 6371, 8452, 8452, 8484, 8452, 8452, 6371, 6339, 6339, 6339, 6371, 6371, 8452, 8452, 8452, 6371, 6371, 6339, 8452, 8484, 8484, 6371, 4226, 4258, 6339, 4226, 4258, 6339, 4226,
|
||||
2145, 2145, 4226, 4226, 4226, 4226, 2145, 2145, 2145, 10565, 8452, 8452, 8452, 6371, 8452, 8452, 8452, 6371, 8452, 6371, 6339, 6371, 6371, 6371, 8452, 6371, 6371, 6339, 6339, 6371, 6371, 6339, 4226, 4258, 4226, 6339, 6339, 4258, 6339, 4226,
|
||||
2145, 2145, 2113, 4226, 4226, 4226, 4226, 4226, 2145, 4226, 6339, 6371, 6371, 8452, 8452, 8452, 8452, 8452, 6371, 6371, 6371, 6339, 8452, 8452, 8452, 8452, 8452, 8452, 6371, 6371, 4258, 2145, 4226, 4258, 6339, 4258, 4258, 4226, 4226, 4258,
|
||||
2145, 2145, 2145, 2145, 2145, 4226, 4226, 4226, 4226, 2145, 2145, 6371, 8484, 8452, 8452, 8452, 8452, 8452, 8452, 6371, 6371, 6371, 8452, 8484, 8452, 8452, 8452, 8484, 8484, 6339, 2145, 2145, 4226, 4226, 4258, 6339, 4226, 2145, 4226, 4226,
|
||||
2145, 2145, 4226, 4226, 4226, 4258, 4226, 4258, 4258, 4226, 2145, 4226, 6371, 8452, 8452, 6371, 8452, 8452, 8452, 8452, 6339, 8452, 8452, 8452, 8484, 10565, 8452, 8484, 6371, 4226, 4226, 4258, 6339, 6339, 6339, 6339, 4226, 2145, 2145, 4226,
|
||||
2145, 2145, 2145, 4226, 4226, 6339, 6339, 6339, 4226, 4226, 4226, 2145, 4258, 6339, 8452, 8452, 8452, 8452, 8484, 4258, 2113, 6339, 8452, 8452, 8452, 8484, 8452, 6339, 4258, 4226, 6339, 6339, 6339, 6339, 6339, 6339, 4226, 2145, 2145, 4258,
|
||||
2145, 4226, 4226, 4226, 4258, 4226, 6371, 6339, 4226, 4226, 4226, 4226, 2145, 4226, 6339, 8452, 8452, 8452, 4258, 32, 0, 2113, 6339, 8484, 10565, 8484, 6339, 4226, 4258, 6339, 6339, 6339, 6339, 4258, 4226, 2145, 4258, 4226, 4226, 4258,
|
||||
2145, 4226, 4258, 4258, 4226, 4226, 4226, 4258, 6339, 4258, 4226, 2145, 2145, 2145, 4226, 6371, 8452, 4226, 32, 0, 0, 0, 32, 6371, 10565, 8452, 4226, 4226, 4258, 4258, 6339, 6339, 6371, 4226, 2145, 4226, 4226, 4226, 4258, 4226,
|
||||
32, 2113, 6339, 4258, 4258, 4226, 4226, 4226, 4258, 4258, 4226, 4226, 4226, 4226, 4226, 4226, 4226, 32, 0, 0, 0, 0, 0, 2113, 8452, 6339, 4258, 4226, 4226, 4226, 4258, 6339, 4258, 4258, 4226, 4258, 6339, 4258, 4226, 2113,
|
||||
0, 0, 2113, 4258, 4258, 4258, 4258, 4226, 2145, 2145, 4226, 4226, 4226, 4258, 4258, 2113, 32, 32, 32, 32, 32, 0, 32, 2113, 2145, 4258, 6371, 6339, 4258, 6339, 4258, 4226, 4258, 8484, 6371, 8452, 8484, 6339, 2113, 0,
|
||||
0, 0, 0, 2113, 6339, 6339, 4258, 4226, 2145, 2145, 2145, 4226, 6339, 4258, 2145, 32, 32, 32, 32, 32, 0, 0, 32, 32, 2113, 2145, 6339, 8452, 8452, 4258, 4226, 4258, 6339, 8484, 10565, 10597, 8452, 2145, 32, 0,
|
||||
0, 0, 0, 0, 4258, 6371, 6339, 4226, 4226, 2145, 2145, 4226, 4258, 4226, 32, 0, 32, 32, 32, 32, 0, 32, 0, 32, 32, 32, 2145, 8452, 8452, 4258, 4226, 4226, 4258, 8484, 8452, 8484, 4226, 0, 0, 0,
|
||||
0, 0, 0, 0, 32, 4226, 4258, 6339, 4226, 4226, 4226, 4226, 2145, 32, 32, 0, 0, 32, 32, 32, 0, 0, 0, 0, 32, 2113, 2113, 2145, 4226, 4226, 4226, 4226, 6339, 6371, 4226, 2145, 32, 0, 0, 0,
|
||||
};
|
||||
#endif /*COLOR_DEPTH == 16*/
|
||||
|
||||
#if COLOR_DEPTH == 24
|
||||
static const color_int_t img_benchmark_bg[] = {
|
||||
/*HEADER
|
||||
Width = 40
|
||||
Height = 40
|
||||
Transp: 0
|
||||
Color depth: 24*/
|
||||
100827176,
|
||||
|
||||
/*IMAGE DATA*/
|
||||
|
||||
263172, 460551, 460551, 526344, 723723, 1447446, 1644825, 1447446, 1447446, 1052688, 1052688, 921102, 1052688, 723723, 263172, 197379, 131586, 65793, 65793, 0, 65793, 0, 65793, 65793, 65793, 65793, 65793, 328965, 789516, 855309, 1250067, 1052688, 1052688, 1184274, 1184274, 986895, 394758, 394758, 394758, 328965,
|
||||
131586, 460551, 526344, 394758, 1776411, 2631720, 2105376, 1447446, 1250067, 1052688, 855309, 1052688, 1579032, 1250067, 460551, 65793, 65793, 65793, 65793, 65793, 0, 65793, 65793, 0, 0, 0, 328965, 986895, 1184274, 789516, 921102, 1250067, 1052688, 1052688, 1842204, 1644825, 1052688, 328965, 263172, 328965,
|
||||
394758, 460551, 526344, 1052688, 2434341, 2434341, 2236962, 1907997, 1052688, 855309, 1052688, 1315860, 1381653, 1447446, 855309, 263172, 0, 0, 131586, 131586, 131586, 131586, 131586, 65793, 0, 263172, 855309, 1052688, 1052688, 1052688, 1118481, 921102, 986895, 1052688, 1579032, 1513239, 1513239, 1118481, 394758, 328965,
|
||||
263172, 460551, 1447446, 1842204, 2171169, 1973790, 1973790, 1776411, 1052688, 986895, 1184274, 1250067, 921102, 1118481, 1118481, 723723, 263172, 0, 65793, 131586, 197379, 263172, 131586, 131586, 328965, 657930, 921102, 855309, 921102, 1052688, 1052688, 1052688, 855309, 1250067, 1579032, 1250067, 1842204, 1710618, 986895, 263172,
|
||||
657930, 921102, 1842204, 1776411, 1250067, 1118481, 1052688, 1118481, 1315860, 1381653, 1052688, 855309, 1052688, 855309, 921102, 1184274, 1381653, 394758, 65793, 131586, 131586, 131586, 65793, 526344, 1579032, 1052688, 723723, 789516, 855309, 921102, 1052688, 1184274, 1315860, 1052688, 1315860, 1447446, 1513239, 1710618, 1644825, 855309,
|
||||
1052688, 1315860, 1710618, 1250067, 1052688, 986895, 921102, 921102, 1052688, 1052688, 1184274, 855309, 855309, 921102, 1052688, 1776411, 2302755, 1644825, 394758, 0, 131586, 131586, 657930, 1776411, 1907997, 1710618, 855309, 723723, 855309, 986895, 1052688, 1052688, 1184274, 1184274, 1052688, 1184274, 1250067, 1513239, 1447446, 1184274,
|
||||
1184274, 1052688, 986895, 1052688, 921102, 986895, 1184274, 1052688, 921102, 1052688, 1052688, 1052688, 986895, 1118481, 1907997, 1907997, 1973790, 2171169, 1513239, 394758, 65793, 657930, 1973790, 1973790, 1842204, 1776411, 1579032, 855309, 789516, 1052688, 986895, 986895, 986895, 1250067, 1315860, 1118481, 1250067, 1118481, 986895, 1118481,
|
||||
1250067, 986895, 1052688, 855309, 986895, 1250067, 1184274, 1052688, 1052688, 1052688, 986895, 921102, 1315860, 1973790, 2105376, 1842204, 1842204, 1973790, 2171169, 1579032, 789516, 1710618, 2105376, 1973790, 1776411, 1907997, 1973790, 1710618, 1118481, 855309, 855309, 855309, 921102, 986895, 1315860, 1381653, 986895, 855309, 789516, 986895,
|
||||
1250067, 855309, 1052688, 657930, 986895, 1118481, 1315860, 1118481, 986895, 986895, 855309, 1381653, 1907997, 2105376, 1842204, 1776411, 1842204, 1907997, 2105376, 2171169, 1776411, 2105376, 2236962, 2105376, 1842204, 1973790, 2171169, 2236962, 1776411, 1052688, 855309, 986895, 921102, 921102, 1118481, 1513239, 921102, 657930, 921102, 855309,
|
||||
986895, 855309, 657930, 855309, 1052688, 1118481, 1118481, 986895, 855309, 657930, 1052688, 1776411, 1907997, 1907997, 1973790, 1907997, 1907997, 2171169, 1973790, 2236962, 2171169, 1973790, 2105376, 2105376, 1776411, 1973790, 2236962, 2236962, 2302755, 1842204, 1118481, 855309, 1052688, 1052688, 1052688, 1184274, 1118481, 1052688, 921102, 1052688,
|
||||
1250067, 1250067, 855309, 1052688, 1052688, 986895, 1052688, 855309, 657930, 855309, 1710618, 1907997, 1907997, 2105376, 2171169, 2302755, 2368548, 2105376, 1973790, 1907997, 1842204, 1842204, 1907997, 1907997, 1842204, 1907997, 1973790, 1973790, 2171169, 2302755, 1776411, 855309, 855309, 1052688, 1052688, 986895, 1184274, 1184274, 855309, 1052688,
|
||||
986895, 1052688, 1315860, 855309, 855309, 855309, 723723, 789516, 1052688, 1710618, 1973790, 1842204, 1973790, 2302755, 2434341, 2434341, 2302755, 1973790, 1842204, 1842204, 1842204, 1973790, 1907997, 2236962, 1907997, 1776411, 1907997, 1907997, 1973790, 2105376, 2236962, 1776411, 1052688, 855309, 855309, 1184274, 1052688, 986895, 1184274, 986895,
|
||||
328965, 657930, 1052688, 1052688, 855309, 855309, 723723, 921102, 2105376, 2236962, 1907997, 1973790, 1710618, 2368548, 2434341, 2434341, 2368548, 2236962, 1842204, 1710618, 1842204, 1842204, 1907997, 1973790, 1907997, 1842204, 1776411, 1710618, 1776411, 1776411, 2171169, 2368548, 1907997, 855309, 986895, 1052688, 986895, 1118481, 1052688, 723723,
|
||||
131586, 131586, 855309, 1118481, 1052688, 1118481, 1447446, 1907997, 1842204, 2105376, 1907997, 1776411, 1776411, 2171169, 2500134, 2171169, 2171169, 2236962, 1907997, 1907997, 2105376, 2105376, 2171169, 1973790, 1842204, 1776411, 1842204, 1776411, 1842204, 1842204, 2171169, 2105376, 2434341, 2105376, 1118481, 1052688, 1381653, 1315860, 657930, 328965,
|
||||
65793, 131586, 263172, 657930, 855309, 1579032, 2236962, 2171169, 1776411, 1776411, 2105376, 1842204, 1776411, 1973790, 2631720, 2434341, 2302755, 2368548, 2105376, 1842204, 1776411, 2236962, 2171169, 1842204, 1842204, 1776411, 1842204, 1842204, 1842204, 2105376, 2105376, 2105376, 2500134, 2631720, 1907997, 1381653, 1052688, 789516, 263172, 197379,
|
||||
65793, 131586, 131586, 131586, 526344, 1644825, 2105376, 1842204, 1907997, 1776411, 1907997, 2105376, 1842204, 1973790, 2105376, 2368548, 2236962, 2302755, 2368548, 2171169, 1513239, 2105376, 2171169, 1776411, 1644825, 1710618, 1644825, 1842204, 1973790, 1973790, 1842204, 2105376, 2236962, 2236962, 2565927, 2105376, 657930, 131586, 131586, 328965,
|
||||
65793, 131586, 197379, 131586, 197379, 1315860, 1973790, 1973790, 1907997, 1907997, 1907997, 1842204, 1842204, 1973790, 2171169, 2236962, 2302755, 2434341, 2302755, 855309, 263172, 1184274, 1842204, 1973790, 1842204, 1710618, 1907997, 1842204, 1842204, 1973790, 1973790, 1842204, 2105376, 2302755, 2105376, 1184274, 328965, 197379, 131586, 263172,
|
||||
65793, 131586, 131586, 65793, 0, 197379, 1250067, 2105376, 1973790, 1907997, 1973790, 1776411, 1842204, 2236962, 2171169, 2105376, 2500134, 2171169, 789516, 131586, 197379, 197379, 1184274, 2171169, 1907997, 1907997, 1842204, 1710618, 1710618, 1842204, 1907997, 1842204, 2171169, 2368548, 1315860, 65793, 263172, 394758, 263172, 197379,
|
||||
65793, 131586, 131586, 131586, 65793, 0, 263172, 1315860, 1907997, 1907997, 1842204, 1907997, 1973790, 2302755, 2302755, 2236962, 2171169, 855309, 131586, 131586, 263172, 131586, 197379, 1052688, 1973790, 1907997, 1710618, 1710618, 1907997, 1842204, 1907997, 1973790, 1973790, 986895, 131586, 197379, 394758, 394758, 263172, 131586,
|
||||
65793, 197379, 65793, 131586, 131586, 131586, 65793, 394758, 1579032, 1907997, 1907997, 1907997, 1973790, 2171169, 2565927, 2171169, 1118481, 263172, 131586, 197379, 197379, 131586, 131586, 197379, 1118481, 1776411, 1776411, 1776411, 1842204, 1907997, 1973790, 1973790, 1052688, 131586, 263172, 328965, 394758, 328965, 197379, 197379,
|
||||
131586, 131586, 131586, 197379, 131586, 131586, 131586, 592137, 1644825, 1973790, 1842204, 1973790, 1973790, 2236962, 2500134, 2368548, 1447446, 263172, 65793, 197379, 197379, 131586, 131586, 394758, 1447446, 1776411, 1776411, 1842204, 1907997, 1973790, 2105376, 2171169, 1513239, 394758, 328965, 460551, 460551, 328965, 197379, 263172,
|
||||
197379, 197379, 197379, 328965, 197379, 131586, 592137, 1710618, 2368548, 2302755, 1907997, 1907997, 2236962, 2434341, 2368548, 2434341, 2236962, 1052688, 131586, 65793, 197379, 131586, 328965, 1579032, 2302755, 1973790, 1842204, 1842204, 1842204, 1907997, 2105376, 2302755, 2500134, 1907997, 657930, 394758, 394758, 394758, 394758, 328965,
|
||||
131586, 131586, 131586, 197379, 131586, 526344, 1776411, 2302755, 2434341, 2368548, 2171169, 1842204, 2302755, 2894892, 2302755, 2236962, 2171169, 1907997, 1118481, 197379, 131586, 394758, 1513239, 2236962, 2171169, 2105376, 2105376, 1842204, 1710618, 1842204, 1907997, 1907997, 2368548, 2565927, 1644825, 592137, 197379, 394758, 328965, 328965,
|
||||
65793, 131586, 131586, 65793, 526344, 1842204, 2302755, 2236962, 2302755, 2302755, 2105376, 2105376, 2434341, 2894892, 2302755, 2105376, 1973790, 2105376, 2105376, 1381653, 592137, 1644825, 2236962, 2302755, 2105376, 1973790, 2171169, 2171169, 2105376, 2105376, 1973790, 1973790, 2171169, 2565927, 2565927, 1973790, 657930, 460551, 460551, 263172,
|
||||
0, 65793, 65793, 263172, 855309, 1776411, 2434341, 2105376, 2236962, 2105376, 2302755, 2302755, 2368548, 2368548, 2105376, 2105376, 1973790, 2171169, 2302755, 2829099, 2565927, 2302755, 2500134, 2105376, 2105376, 1842204, 2171169, 2368548, 2302755, 2368548, 2171169, 1907997, 2368548, 2500134, 2894892, 1842204, 1579032, 789516, 197379, 263172,
|
||||
0, 0, 197379, 789516, 1052688, 921102, 1710618, 2302755, 2105376, 2171169, 2302755, 2236962, 2105376, 2105376, 2302755, 2171169, 2171169, 2302755, 2105376, 2434341, 2302755, 2171169, 2302755, 2105376, 2105376, 1973790, 2105376, 2302755, 2302755, 2368548, 2434341, 2368548, 2500134, 3158064, 1973790, 1118481, 1907997, 1315860, 328965, 131586,
|
||||
65793, 263172, 986895, 1184274, 1052688, 855309, 921102, 1644825, 2368548, 2631720, 2302755, 2236962, 2171169, 2302755, 2565927, 2368548, 2105376, 2105376, 1907997, 1907997, 1973790, 1776411, 2105376, 2171169, 2171169, 2105376, 1907997, 2302755, 2500134, 2434341, 2236962, 2434341, 2829099, 2434341, 1513239, 1184274, 1644825, 1776411, 921102, 394758,
|
||||
657930, 1052688, 1381653, 1184274, 1052688, 1052688, 855309, 855309, 2105376, 2368548, 2105376, 1973790, 2171169, 2302755, 2565927, 2302755, 2171169, 1907997, 1776411, 1710618, 1776411, 1973790, 1842204, 2105376, 2236962, 2105376, 1907997, 1842204, 1776411, 2236962, 2368548, 2500134, 1973790, 1184274, 1513239, 1710618, 1250067, 1381653, 1776411, 1118481,
|
||||
855309, 921102, 1118481, 1118481, 1184274, 1052688, 986895, 855309, 855309, 2631720, 2105376, 2105376, 2105376, 1973790, 2236962, 2302755, 2105376, 1907997, 2171169, 1907997, 1710618, 1842204, 1842204, 1842204, 2236962, 1842204, 1842204, 1710618, 1776411, 1842204, 1842204, 1579032, 1118481, 1513239, 1250067, 1579032, 1579032, 1513239, 1644825, 1052688,
|
||||
986895, 855309, 723723, 1052688, 1052688, 1052688, 1250067, 1052688, 986895, 1052688, 1644825, 1907997, 1973790, 2302755, 2236962, 2236962, 2236962, 2236962, 1973790, 1907997, 1907997, 1710618, 2105376, 2302755, 2105376, 2105376, 2105376, 2105376, 1973790, 1973790, 1315860, 789516, 1118481, 1513239, 1579032, 1381653, 1513239, 1118481, 1052688, 1315860,
|
||||
855309, 855309, 855309, 855309, 986895, 1184274, 1052688, 1118481, 1052688, 921102, 855309, 1842204, 2368548, 2302755, 2236962, 2105376, 2105376, 2236962, 2171169, 1973790, 1907997, 1842204, 2105376, 2434341, 2236962, 2171169, 2302755, 2434341, 2500134, 1776411, 986895, 855309, 1118481, 1250067, 1513239, 1776411, 1184274, 855309, 1052688, 1118481,
|
||||
855309, 789516, 1052688, 1052688, 1052688, 1381653, 1250067, 1315860, 1447446, 1052688, 855309, 1052688, 1973790, 2302755, 2105376, 1973790, 2105376, 2171169, 2302755, 2171169, 1710618, 2105376, 2171169, 2171169, 2500134, 2631720, 2105376, 2434341, 1907997, 1052688, 1118481, 1513239, 1579032, 1579032, 1776411, 1776411, 1184274, 789516, 986895, 1184274,
|
||||
986895, 855309, 789516, 1052688, 1250067, 1644825, 1776411, 1579032, 1184274, 1052688, 1052688, 986895, 1315860, 1776411, 2171169, 2171169, 2105376, 2302755, 2368548, 1315860, 592137, 1710618, 2236962, 2236962, 2171169, 2500134, 2171169, 1710618, 1315860, 1184274, 1644825, 1776411, 1776411, 1776411, 1644825, 1579032, 1184274, 921102, 855309, 1315860,
|
||||
921102, 1052688, 1052688, 1184274, 1315860, 1250067, 1842204, 1776411, 1250067, 1184274, 1118481, 1052688, 986895, 1052688, 1710618, 2302755, 2302755, 2302755, 1315860, 263172, 65793, 526344, 1644825, 2368548, 2631720, 2434341, 1644825, 1052688, 1315860, 1644825, 1579032, 1710618, 1579032, 1447446, 1052688, 921102, 1315860, 1118481, 1118481, 1315860,
|
||||
855309, 1184274, 1513239, 1315860, 1052688, 1118481, 1184274, 1513239, 1579032, 1381653, 1118481, 986895, 986895, 986895, 1052688, 1907997, 2302755, 1184274, 263172, 131586, 131586, 131586, 460551, 1973790, 2829099, 2171169, 1052688, 1184274, 1315860, 1381653, 1644825, 1644825, 1842204, 1250067, 986895, 1184274, 1052688, 1250067, 1513239, 1250067,
|
||||
394758, 657930, 1644825, 1381653, 1315860, 1184274, 1184274, 1184274, 1315860, 1381653, 1052688, 1052688, 1052688, 1184274, 1118481, 1118481, 1052688, 328965, 131586, 197379, 131586, 131586, 197379, 592137, 2105376, 1710618, 1447446, 1184274, 1052688, 1250067, 1447446, 1579032, 1513239, 1513239, 1250067, 1513239, 1579032, 1513239, 1118481, 592137,
|
||||
197379, 197379, 657930, 1381653, 1513239, 1315860, 1315860, 1250067, 789516, 855309, 1250067, 1250067, 1052688, 1513239, 1315860, 657930, 328965, 328965, 328965, 263172, 263172, 197379, 328965, 526344, 855309, 1513239, 1973790, 1710618, 1315860, 1579032, 1381653, 1184274, 1447446, 2368548, 1907997, 2105376, 2500134, 1644825, 657930, 131586,
|
||||
197379, 131586, 131586, 657930, 1710618, 1776411, 1447446, 1052688, 855309, 855309, 921102, 1118481, 1579032, 1447446, 855309, 328965, 328965, 394758, 328965, 263172, 131586, 197379, 263172, 460551, 657930, 789516, 1710618, 2236962, 2105376, 1447446, 1250067, 1381653, 1776411, 2368548, 2631720, 3026478, 2236962, 789516, 263172, 131586,
|
||||
197379, 197379, 131586, 197379, 1381653, 1973790, 1579032, 1184274, 1052688, 921102, 855309, 1052688, 1447446, 1052688, 328965, 131586, 328965, 460551, 460551, 328965, 131586, 263172, 197379, 328965, 460551, 460551, 921102, 2236962, 2105376, 1447446, 1118481, 1250067, 1513239, 2434341, 2302755, 2565927, 1052688, 131586, 131586, 131586,
|
||||
197379, 131586, 131586, 131586, 328965, 1052688, 1447446, 1644825, 1250067, 1052688, 1184274, 1052688, 855309, 394758, 263172, 197379, 131586, 263172, 328965, 263172, 197379, 131586, 197379, 197379, 263172, 592137, 657930, 921102, 1118481, 1250067, 1118481, 1118481, 1710618, 1973790, 1250067, 855309, 263172, 131586, 197379, 131586,
|
||||
};
|
||||
#endif /*COLOR_DEPTH == 24*/
|
||||
|
||||
#endif /*LV_APP_ENABLE != 0 && USE_LV_APP_BENCHMARK != 0*/
|
||||
@@ -1,47 +0,0 @@
|
||||
/**
|
||||
* @file lv_app_benchmark.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LV_APP_BENCHMARK_H
|
||||
#define LV_APP_BENCHMARK_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lvgl/lv_app/lv_app.h"
|
||||
|
||||
#if LV_APP_ENABLE != 0 && USE_LV_APP_BENCHMARK != 0
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
typedef struct
|
||||
{
|
||||
|
||||
}lv_app_benchmark_conf_t;
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
const lv_app_dsc_t * lv_app_benchmark_init(void);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /*LV_APP_ENABLE != 0 && USE_LV_APP_BENCHMARK != 0*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* LV_APP_BENCHMARK_H */
|
||||
@@ -1,227 +0,0 @@
|
||||
/**
|
||||
* @file lv_app_ethernet.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_app_ethernet.h"
|
||||
#if LV_APP_ENABLE != 0 && USE_LV_APP_ETHERNET != 0
|
||||
|
||||
#include "../lv_app/lv_app_util/lv_app_kb.h"
|
||||
#include "hal/eth/eth.h"
|
||||
#include "misc/os/ptask.h"
|
||||
#include "hal/systick/systick.h"
|
||||
#include <stdio.h>
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define ETH_MONITOR_PERIOD 1000 /*ms*/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/*Application specific data for an instance of this application*/
|
||||
typedef struct
|
||||
{
|
||||
uint8_t * last_msg_dp;
|
||||
uint16_t last_msg_size;
|
||||
}my_app_data_t;
|
||||
|
||||
/*Application specific data a window of this application*/
|
||||
typedef struct
|
||||
{
|
||||
|
||||
}my_win_data_t;
|
||||
|
||||
/*Application specific data for a shortcut of this application*/
|
||||
typedef struct
|
||||
{
|
||||
lv_obj_t * label;
|
||||
}my_sc_data_t;
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static void my_app_run(lv_app_inst_t * app, void * conf);
|
||||
static void my_app_close(lv_app_inst_t * app);
|
||||
static void my_com_rec(lv_app_inst_t * app_send, lv_app_inst_t * app_rec, lv_app_com_type_t type , const void * data, uint32_t size);
|
||||
static void my_sc_open(lv_app_inst_t * app, lv_obj_t * sc);
|
||||
static void my_sc_close(lv_app_inst_t * app);
|
||||
static void my_win_open(lv_app_inst_t * app, lv_obj_t * win);
|
||||
static void my_win_close(lv_app_inst_t * app);
|
||||
|
||||
static void eth_state_monitor_task(void * param);
|
||||
static void tcp_transf_cb(eth_state_t state, const char * txt);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
static lv_app_dsc_t my_app_dsc =
|
||||
{
|
||||
.name = "Ethernet",
|
||||
.mode = LV_APP_MODE_NONE,
|
||||
.app_run = my_app_run,
|
||||
.app_close = my_app_close,
|
||||
.com_rec = my_com_rec,
|
||||
.win_open = my_win_open,
|
||||
.win_close = my_win_close,
|
||||
.sc_open = my_sc_open,
|
||||
.sc_close = my_sc_close,
|
||||
.app_data_size = sizeof(my_app_data_t),
|
||||
.sc_data_size = sizeof(my_sc_data_t),
|
||||
.win_data_size = sizeof(my_win_data_t),
|
||||
};
|
||||
|
||||
static lv_app_inst_t * app_act_com = NULL;
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the application
|
||||
* @return pointer to the application descriptor of this application
|
||||
*/
|
||||
const lv_app_dsc_t * lv_app_ethernet_init(void)
|
||||
{
|
||||
ptask_create(eth_state_monitor_task, ETH_MONITOR_PERIOD, PTASK_PRIO_LOW, NULL);
|
||||
return &my_app_dsc;
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Run an application according to 'app_dsc'
|
||||
* @param app_dsc pointer to an application descriptor
|
||||
* @param conf pointer to a lv_app_ethernet_conf_t structure with configuration data or NULL if unused
|
||||
* @return pointer to the opened application or NULL if any error occurred
|
||||
*/
|
||||
static void my_app_run(lv_app_inst_t * app, void * conf)
|
||||
{
|
||||
/*Initialize the application*/
|
||||
}
|
||||
|
||||
/**
|
||||
* Close a running application.
|
||||
* Close the Window and the Shortcut too if opened.
|
||||
* Free all the allocated memory by this application.
|
||||
* @param app pointer to an application
|
||||
*/
|
||||
static void my_app_close(lv_app_inst_t * app)
|
||||
{
|
||||
/*No dynamically allocated data in 'my_app_data'*/
|
||||
}
|
||||
|
||||
/**
|
||||
* Read the data have been sent to this application
|
||||
* @param app_send pointer to an application which sent the message
|
||||
* @param app_rec pointer to an application which is receiving the message
|
||||
* @param type type of data from 'lv_app_com_type_t' enum
|
||||
* @param data pointer to the sent data
|
||||
* @param size length of 'data' in bytes
|
||||
*/
|
||||
static void my_com_rec(lv_app_inst_t * app_send, lv_app_inst_t * app_rec,
|
||||
lv_app_com_type_t type , const void * data, uint32_t size)
|
||||
{
|
||||
if(type == LV_APP_COM_TYPE_CHAR) { /*data: string*/
|
||||
eth_tcp_transf(data, size, tcp_transf_cb);
|
||||
app_act_com = app_rec;
|
||||
my_app_data_t * adata = app_act_com->app_data;
|
||||
if(adata->last_msg_dp != NULL) dm_free(adata->last_msg_dp);
|
||||
|
||||
adata->last_msg_dp = dm_alloc(size);
|
||||
memcpy(adata->last_msg_dp, data, size);
|
||||
adata->last_msg_size = size;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Open a shortcut for an application
|
||||
* @param app pointer to an application
|
||||
* @param sc pointer to an object where the application
|
||||
* can create content of the shortcut
|
||||
*/
|
||||
static void my_sc_open(lv_app_inst_t * app, lv_obj_t * sc)
|
||||
{
|
||||
my_sc_data_t * sc_data = app->sc_data;
|
||||
|
||||
sc_data->label = lv_label_create(sc, NULL);
|
||||
lv_label_set_text(sc_data->label, "Empty");
|
||||
lv_obj_align(sc_data->label, NULL, LV_ALIGN_CENTER, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Close the shortcut of an application
|
||||
* @param app pointer to an application
|
||||
*/
|
||||
static void my_sc_close(lv_app_inst_t * app)
|
||||
{
|
||||
/*No dynamically allocated data in 'my_sc_data'*/
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Open the application in a window
|
||||
* @param app pointer to an application
|
||||
* @param win pointer to a window object where
|
||||
* the application can create content
|
||||
*/
|
||||
static void my_win_open(lv_app_inst_t * app, lv_obj_t * win)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Close the window of an application
|
||||
* @param app pointer to an application
|
||||
*/
|
||||
static void my_win_close(lv_app_inst_t * app)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/*--------------------
|
||||
* OTHER FUNCTIONS
|
||||
---------------------*/
|
||||
|
||||
static void eth_state_monitor_task(void * param)
|
||||
{
|
||||
/* The eth. should be busy if there is sg. to send.
|
||||
* It means fail during last send. Try again*/
|
||||
if(app_act_com != NULL && eth_busy() == false) {
|
||||
/*Try to send the message again*/
|
||||
lv_app_notice_add("Resend Ethernet message");
|
||||
my_app_data_t * adata = app_act_com->app_data;
|
||||
eth_tcp_transf(adata->last_msg_dp, adata->last_msg_size, tcp_transf_cb);
|
||||
}
|
||||
}
|
||||
|
||||
static void tcp_transf_cb(eth_state_t state, const char * txt)
|
||||
{
|
||||
if(state == ETH_STATE_OK) {
|
||||
uint16_t size = txt[0] + ((txt[1] << 8) & 0xFF00);
|
||||
char buf[256];
|
||||
memcpy(buf, &txt[2], size);
|
||||
buf[size] = '\0';
|
||||
lv_app_com_send(app_act_com, LV_APP_COM_TYPE_CHAR, &txt[2], size);
|
||||
my_app_data_t * adata = app_act_com->app_data;
|
||||
dm_free(adata->last_msg_dp);
|
||||
adata->last_msg_dp = NULL;
|
||||
adata->last_msg_size = 0;
|
||||
app_act_com = NULL;
|
||||
}else if(state == ETH_STATE_ERROR) {
|
||||
lv_app_notice_add("Ethernet TCP transfer error\n%s", txt);
|
||||
}
|
||||
|
||||
}
|
||||
#endif /*LV_APP_ENABLE != 0 && USE_LV_APP_ETHERNET != 0*/
|
||||
@@ -1,48 +0,0 @@
|
||||
/**
|
||||
* @file lv_app_ethernet.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LV_APP_ETHERNET_H
|
||||
#define LV_APP_ETHERNET_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lvgl/lv_app/lv_app.h"
|
||||
|
||||
#if LV_APP_ENABLE != 0 && USE_LV_APP_ETHERNET != 0
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
typedef struct
|
||||
{
|
||||
|
||||
}lv_app_ethernet_conf_t;
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
const lv_app_dsc_t * lv_app_ethernet_init(void);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /*LV_APP_ENABLE != 0 && USE_LV_APP_ETHERNET != 0*/
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* LV_APP_ETHERNET_H */
|
||||
@@ -1,216 +0,0 @@
|
||||
/**
|
||||
* @file lv_app_example.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_app_example.h"
|
||||
#if LV_APP_ENABLE != 0 && USE_LV_APP_EXAMPLE != 0
|
||||
|
||||
#include "../lv_app/lv_app_util/lv_app_kb.h"
|
||||
#include <stdio.h>
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/*Application specific data for an instance of this application*/
|
||||
typedef struct
|
||||
{
|
||||
|
||||
}my_app_data_t;
|
||||
|
||||
/*Application specific data a window of this application*/
|
||||
typedef struct
|
||||
{
|
||||
|
||||
}my_win_data_t;
|
||||
|
||||
/*Application specific data for a shortcut of this application*/
|
||||
typedef struct
|
||||
{
|
||||
lv_obj_t * label;
|
||||
}my_sc_data_t;
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static void my_app_run(lv_app_inst_t * app, void * conf);
|
||||
static void my_app_close(lv_app_inst_t * app);
|
||||
static void my_com_rec(lv_app_inst_t * app_send, lv_app_inst_t * app_rec, lv_app_com_type_t type , const void * data, uint32_t size);
|
||||
static void my_sc_open(lv_app_inst_t * app, lv_obj_t * sc);
|
||||
static void my_sc_close(lv_app_inst_t * app);
|
||||
static void my_win_open(lv_app_inst_t * app, lv_obj_t * win);
|
||||
static void my_win_close(lv_app_inst_t * app);
|
||||
|
||||
static lv_action_res_t ta_rel_action(lv_obj_t * ta, lv_dispi_t * dispi);
|
||||
static void kb_ok_action(lv_obj_t * ta);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
static lv_app_dsc_t my_app_dsc =
|
||||
{
|
||||
.name = "Example",
|
||||
.mode = LV_APP_MODE_NONE,
|
||||
.app_run = my_app_run,
|
||||
.app_close = my_app_close,
|
||||
.com_rec = my_com_rec,
|
||||
.win_open = my_win_open,
|
||||
.win_close = my_win_close,
|
||||
.sc_open = my_sc_open,
|
||||
.sc_close = my_sc_close,
|
||||
.app_data_size = sizeof(my_app_data_t),
|
||||
.sc_data_size = sizeof(my_sc_data_t),
|
||||
.win_data_size = sizeof(my_win_data_t),
|
||||
};
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the application
|
||||
* @return pointer to the application descriptor of this application
|
||||
*/
|
||||
const lv_app_dsc_t * lv_app_example_init(void)
|
||||
{
|
||||
return &my_app_dsc;
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Run an application according to 'app_dsc'
|
||||
* @param app_dsc pointer to an application descriptor
|
||||
* @param conf pointer to a lv_app_example_conf_t structure with configuration data or NULL if unused
|
||||
* @return pointer to the opened application or NULL if any error occurred
|
||||
*/
|
||||
static void my_app_run(lv_app_inst_t * app, void * conf)
|
||||
{
|
||||
/*Initialize the application*/
|
||||
}
|
||||
|
||||
/**
|
||||
* Close a running application.
|
||||
* Close the Window and the Shortcut too if opened.
|
||||
* Free all the allocated memory by this application.
|
||||
* @param app pointer to an application
|
||||
*/
|
||||
static void my_app_close(lv_app_inst_t * app)
|
||||
{
|
||||
/*No dynamically allocated data in 'my_app_data'*/
|
||||
}
|
||||
|
||||
/**
|
||||
* Read the data have been sent to this application
|
||||
* @param app_send pointer to an application which sent the message
|
||||
* @param app_rec pointer to an application which is receiving the message
|
||||
* @param type type of data from 'lv_app_com_type_t' enum
|
||||
* @param data pointer to the sent data
|
||||
* @param size length of 'data' in bytes
|
||||
*/
|
||||
static void my_com_rec(lv_app_inst_t * app_send, lv_app_inst_t * app_rec,
|
||||
lv_app_com_type_t type , const void * data, uint32_t size)
|
||||
{
|
||||
if(type == LV_APP_COM_TYPE_CHAR) { /*data: string*/
|
||||
my_sc_data_t * sc_data = app_rec->sc_data;
|
||||
if (sc_data->label != NULL) {
|
||||
lv_label_set_text_array(sc_data->label, data, size);
|
||||
lv_obj_align(sc_data->label , NULL,LV_ALIGN_CENTER, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Open a shortcut for an application
|
||||
* @param app pointer to an application
|
||||
* @param sc pointer to an object where the application
|
||||
* can create content of the shortcut
|
||||
*/
|
||||
static void my_sc_open(lv_app_inst_t * app, lv_obj_t * sc)
|
||||
{
|
||||
my_sc_data_t * sc_data = app->sc_data;
|
||||
|
||||
sc_data->label = lv_label_create(sc, NULL);
|
||||
lv_label_set_text(sc_data->label, "Empty");
|
||||
lv_obj_align(sc_data->label, NULL, LV_ALIGN_CENTER, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Close the shortcut of an application
|
||||
* @param app pointer to an application
|
||||
*/
|
||||
static void my_sc_close(lv_app_inst_t * app)
|
||||
{
|
||||
/*No dynamically allocated data in 'my_sc_data'*/
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Open the application in a window
|
||||
* @param app pointer to an application
|
||||
* @param win pointer to a window object where
|
||||
* the application can create content
|
||||
*/
|
||||
static void my_win_open(lv_app_inst_t * app, lv_obj_t * win)
|
||||
{
|
||||
lv_obj_t * ta;
|
||||
ta = lv_ta_create(win, NULL);
|
||||
lv_obj_set_size_us(ta, 200, 100);
|
||||
lv_obj_set_pos_us(ta, 0, 0);
|
||||
lv_obj_set_free_p(ta, app);
|
||||
lv_page_set_rel_action(ta, ta_rel_action);
|
||||
lv_ta_set_text(ta, "Write a text to send to the other applications");
|
||||
}
|
||||
|
||||
/**
|
||||
* Close the window of an application
|
||||
* @param app pointer to an application
|
||||
*/
|
||||
static void my_win_close(lv_app_inst_t * app)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/*--------------------
|
||||
* OTHER FUNCTIONS
|
||||
---------------------*/
|
||||
|
||||
/**
|
||||
* Called when the text area on the window is released to open the app. keyboard
|
||||
* @param ta pointer to the text area on the window
|
||||
* @param dispi pointer to the caller display input
|
||||
* @return LV_ACTION_RES_OK because the text area is not deleted
|
||||
*/
|
||||
static lv_action_res_t ta_rel_action(lv_obj_t * ta, lv_dispi_t * dispi)
|
||||
{
|
||||
lv_ta_set_text(ta, ""); /*Clear the ta*/
|
||||
lv_app_kb_open(ta, LV_APP_KB_MODE_TXT | LV_APP_KB_MODE_WIN_RESIZE, NULL, kb_ok_action);
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the "Ok" button is pressed on the app. keyboard
|
||||
* @param ta pointer to the text area assigned to the app. kexboard
|
||||
*/
|
||||
static void kb_ok_action(lv_obj_t * ta)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(ta);
|
||||
const char * txt = lv_ta_get_txt(ta);
|
||||
lv_app_com_send(app, LV_APP_COM_TYPE_CHAR, txt, strlen(txt));
|
||||
}
|
||||
|
||||
#endif /*LV_APP_ENABLE != 0 && USE_LV_APP_EXAMPLE != 0*/
|
||||
@@ -1,48 +0,0 @@
|
||||
/**
|
||||
* @file lv_app_example.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LV_APP_EXAMPLE_H
|
||||
#define LV_APP_EXAMPLE_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lvgl/lv_app/lv_app.h"
|
||||
|
||||
#if LV_APP_ENABLE != 0 && USE_LV_APP_EXAMPLE != 0
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
typedef struct
|
||||
{
|
||||
|
||||
}lv_app_example_conf_t;
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
const lv_app_dsc_t * lv_app_example_init(void);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /*LV_APP_ENABLE != 0 && USE_LV_APP_EXAMPLE != 0*/
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* LV_APP_EXAMPLE_H */
|
||||
@@ -1,897 +0,0 @@
|
||||
/**
|
||||
* @file lv_app_example.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_app_files.h"
|
||||
#if LV_APP_ENABLE != 0 && USE_LV_APP_FILES != 0
|
||||
|
||||
#include <stdio.h>
|
||||
#include "misc/os/ptask.h"
|
||||
#include "../lv_app/lv_app_util/lv_app_kb.h"
|
||||
#include "../lv_app/lv_app_util/lv_app_notice.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define LV_APP_FILES_CHUNK_MIN_SIZE 32
|
||||
#define LV_APP_FILES_CHUNK_MIN_TIME 10
|
||||
#define LV_APP_FILES_CHUNK_MAX_TIME 10000
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/*Application specific data for an instance of this application*/
|
||||
typedef struct
|
||||
{
|
||||
char path[LV_APP_FILES_PATH_MAX_LEN];
|
||||
char fn[LV_APP_FILES_FN_MAX_LEN];
|
||||
fs_file_t file;
|
||||
uint8_t file_cnt;
|
||||
uint16_t chunk_delay;
|
||||
uint16_t chunk_size;
|
||||
uint8_t send_fn :1;
|
||||
uint8_t send_size :1;
|
||||
uint8_t send_crc :1;
|
||||
uint8_t send_in_prog :1;
|
||||
ptask_t * send_task;
|
||||
}my_app_data_t;
|
||||
|
||||
/*Application specific data a window of this application*/
|
||||
typedef struct
|
||||
{
|
||||
lv_obj_t * file_list;
|
||||
}my_win_data_t;
|
||||
|
||||
/*Application specific data for a shortcut of this application*/
|
||||
typedef struct
|
||||
{
|
||||
lv_obj_t * label;
|
||||
}my_sc_data_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
SEND_SETTINGS_FN,
|
||||
SEND_SETTINGS_SIZE,
|
||||
SEND_SETTINGS_CRC,
|
||||
SEND_SETTINGS_CHUNK_SIZE,
|
||||
SEND_SETTINGS_CHUNK_DELAY,
|
||||
}send_settings_id_t;
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static void my_app_run(lv_app_inst_t * app, void * conf);
|
||||
static void my_app_close(lv_app_inst_t * app);
|
||||
static void my_com_rec(lv_app_inst_t * app_send, lv_app_inst_t * app_rec, lv_app_com_type_t type , const void * data, uint32_t size);
|
||||
static void my_sc_open(lv_app_inst_t * app, lv_obj_t * sc);
|
||||
static void my_sc_close(lv_app_inst_t * app);
|
||||
static void my_win_open(lv_app_inst_t * app, lv_obj_t * win);
|
||||
static void my_win_close(lv_app_inst_t * app);
|
||||
static void my_conf_open(lv_app_inst_t * app, lv_obj_t * conf_win);
|
||||
|
||||
static void win_load_file_list(lv_app_inst_t * app);
|
||||
static void win_create_list(lv_app_inst_t * app);
|
||||
static lv_action_res_t win_up_action(lv_obj_t * up, lv_dispi_t * dispi);
|
||||
static lv_action_res_t win_next_action(lv_obj_t * next, lv_dispi_t * dispi);
|
||||
static lv_action_res_t win_prev_action(lv_obj_t * prev, lv_dispi_t * dispi);
|
||||
static lv_action_res_t win_drv_action(lv_obj_t * drv, lv_dispi_t * dispi);
|
||||
static lv_action_res_t win_folder_action(lv_obj_t * folder, lv_dispi_t * dispi);
|
||||
static lv_action_res_t win_file_action(lv_obj_t * file, lv_dispi_t * dispi);
|
||||
static lv_action_res_t win_send_rel_action(lv_obj_t * send, lv_dispi_t * dispi);
|
||||
static lv_action_res_t win_send_settings_element_rel_action(lv_obj_t * element, lv_dispi_t * dispi);
|
||||
static lv_action_res_t win_back_action(lv_obj_t * back, lv_dispi_t * dispi);
|
||||
static lv_action_res_t win_del_rel_action(lv_obj_t * del, lv_dispi_t * dispi);
|
||||
static lv_action_res_t win_del_lpr_action(lv_obj_t * del, lv_dispi_t * dispi);
|
||||
static void send_settings_kb_close_action(lv_obj_t * ta);
|
||||
static void send_settings_kb_ok_action(lv_obj_t * ta);
|
||||
static void start_send(lv_app_inst_t * app, const char * path);
|
||||
static void send_task(void * param);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
static lv_app_dsc_t my_app_dsc =
|
||||
{
|
||||
.name = "Files",
|
||||
.mode = LV_APP_MODE_NONE,
|
||||
.app_run = my_app_run,
|
||||
.app_close = my_app_close,
|
||||
.com_rec = my_com_rec,
|
||||
.win_open = my_win_open,
|
||||
.win_close = my_win_close,
|
||||
.sc_open = my_sc_open,
|
||||
.sc_close = my_sc_close,
|
||||
.conf_open = my_conf_open,
|
||||
.app_data_size = sizeof(my_app_data_t),
|
||||
.sc_data_size = sizeof(my_sc_data_t),
|
||||
.win_data_size = sizeof(my_win_data_t),
|
||||
};
|
||||
|
||||
static lv_style_t style_sc_label;
|
||||
static lv_style_t style_btn_symbol;
|
||||
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the application
|
||||
* @return pointer to the application descriptor of this application
|
||||
*/
|
||||
const lv_app_dsc_t * lv_app_files_init(void)
|
||||
{
|
||||
lv_app_style_t * app_style = lv_app_style_get();
|
||||
memcpy(&style_sc_label, &app_style->sc_rec_rel, sizeof(lv_style_t));
|
||||
style_sc_label.font = font_get(LV_APP_FONT_LARGE);
|
||||
|
||||
lv_style_get(LV_STYLE_BTN_REL, &style_btn_symbol);
|
||||
style_btn_symbol.font = font_get(LV_IMG_DEF_SYMBOL_FONT);
|
||||
return &my_app_dsc;
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Run an application according to 'app_dsc'
|
||||
* @param app_dsc pointer to an application descriptor
|
||||
* @param conf pointer to a lv_app_example_conf_t structure with configuration data or NULL if unused
|
||||
* @return pointer to the opened application or NULL if any error occurred
|
||||
*/
|
||||
static void my_app_run(lv_app_inst_t * app, void * conf)
|
||||
{
|
||||
/*Initialize the application*/
|
||||
my_app_data_t * app_data = app->app_data;
|
||||
app_data->file_cnt = 0;
|
||||
app_data->path[0] = '\0';
|
||||
app_data->fn[0] = '\0';
|
||||
app_data->send_fn = 0;
|
||||
app_data->send_size = 0;
|
||||
app_data->send_crc = 0;
|
||||
app_data->chunk_size = LV_APP_FILES_CHUNK_DEF_SIZE;
|
||||
app_data->chunk_delay = LV_APP_FILES_CHUNK_DEF_TIME;
|
||||
app_data->send_in_prog = 0;
|
||||
|
||||
app_data->send_task = ptask_create(send_task, LV_APP_FILES_CHUNK_DEF_TIME, PTASK_PRIO_OFF, app);
|
||||
}
|
||||
|
||||
/**
|
||||
* Close a running application.
|
||||
* Close the Window and the Shortcut too if opened.
|
||||
* Free all the allocated memory by this application.
|
||||
* @param app pointer to an application
|
||||
*/
|
||||
static void my_app_close(lv_app_inst_t * app)
|
||||
{
|
||||
/*No dynamically allocated data in 'my_app_data'*/
|
||||
my_app_data_t * app_data = app->app_data;
|
||||
ptask_del(app_data->send_task);
|
||||
if(app_data->send_in_prog != 0) fs_close(&app_data->file);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Read the data have been sent to this application
|
||||
* @param app_send pointer to an application which sent the message
|
||||
* @param app_rec pointer to an application which is receiving the message
|
||||
* @param type type of data from 'lv_app_com_type_t' enum
|
||||
* @param data pointer to the sent data
|
||||
* @param size length of 'data' in bytes
|
||||
*/
|
||||
static void my_com_rec(lv_app_inst_t * app_send, lv_app_inst_t * app_rec,
|
||||
lv_app_com_type_t type , const void * data, uint32_t size)
|
||||
{
|
||||
if(type == LV_APP_COM_TYPE_CHAR) {
|
||||
/*Check for file query. E.g. "U:/file.txt?"*/
|
||||
const char * path = data;
|
||||
if(path[size - 1] == '?') {
|
||||
if(size > LV_APP_FILES_PATH_MAX_LEN + LV_APP_FILES_FN_MAX_LEN) {
|
||||
lv_app_notice_add("Can not send file:\ntoo long path");
|
||||
}
|
||||
|
||||
char path_fn[LV_APP_FILES_PATH_MAX_LEN + LV_APP_FILES_FN_MAX_LEN];
|
||||
memcpy(path_fn, data, size - 1); /*-1 to ignore the '?' at the end*/
|
||||
path_fn[size - 1] = '\0';
|
||||
start_send(app_rec, path_fn);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Open a shortcut for an application
|
||||
* @param app pointer to an application
|
||||
* @param sc pointer to an object where the application
|
||||
* can create content of the shortcut
|
||||
*/
|
||||
static void my_sc_open(lv_app_inst_t * app, lv_obj_t * sc)
|
||||
{
|
||||
my_sc_data_t * sc_data = app->sc_data;
|
||||
my_app_data_t * app_data = app->app_data;
|
||||
|
||||
|
||||
sc_data->label = lv_label_create(sc, NULL);
|
||||
lv_obj_set_style(sc_data->label, &style_sc_label);
|
||||
lv_label_set_text(sc_data->label, fs_get_last(app_data->path));
|
||||
lv_obj_align(sc_data->label, NULL, LV_ALIGN_CENTER, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Close the shortcut of an application
|
||||
* @param app pointer to an application
|
||||
*/
|
||||
static void my_sc_close(lv_app_inst_t * app)
|
||||
{
|
||||
/*No dynamically allocated data in 'my_sc_data'*/
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Open the application in a window
|
||||
* @param app pointer to an application
|
||||
* @param win pointer to a window object where
|
||||
* the application can create content
|
||||
*/
|
||||
static void my_win_open(lv_app_inst_t * app, lv_obj_t * win)
|
||||
{
|
||||
my_win_data_t * win_data = app->win_data;
|
||||
my_app_data_t * app_data = app->app_data;
|
||||
|
||||
app_data->file_cnt = 0;
|
||||
win_data->file_list = NULL;
|
||||
|
||||
lv_win_set_title(win, app_data->path);
|
||||
|
||||
win_load_file_list(app);
|
||||
}
|
||||
|
||||
/**
|
||||
* Close the window of an application
|
||||
* @param app pointer to an application
|
||||
*/
|
||||
static void my_win_close(lv_app_inst_t * app)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Create objects to configure the applications
|
||||
* @param app pointer to an application which settings should be created
|
||||
* @param conf_win pointer to a window where the objects can be created
|
||||
* (the window has the proper layout)
|
||||
*/
|
||||
static void my_conf_open(lv_app_inst_t * app, lv_obj_t * conf_win)
|
||||
{
|
||||
my_app_data_t * app_data = app->app_data;
|
||||
|
||||
/*Create check boxes*/
|
||||
lv_obj_t * cb;
|
||||
|
||||
/*Send file name check box*/
|
||||
cb = lv_cb_create(conf_win, NULL);
|
||||
lv_cb_set_text(cb, "Send file name");
|
||||
lv_obj_set_free_num(cb, SEND_SETTINGS_FN);
|
||||
lv_obj_set_free_p(cb, app);
|
||||
lv_btn_set_rel_action(cb, win_send_settings_element_rel_action);
|
||||
if(app_data->send_fn != 0) lv_btn_set_state(cb, LV_BTN_STATE_TREL);
|
||||
else lv_btn_set_state(cb, LV_BTN_STATE_REL);
|
||||
|
||||
/*Send size check box*/
|
||||
cb = lv_cb_create(conf_win, cb);
|
||||
lv_cb_set_text(cb, "Send size");
|
||||
lv_obj_set_free_num(cb, SEND_SETTINGS_SIZE);
|
||||
if(app_data->send_size != 0) lv_btn_set_state(cb, LV_BTN_STATE_TREL);
|
||||
else lv_btn_set_state(cb, LV_BTN_STATE_REL);
|
||||
|
||||
/*Send CRC check box*/
|
||||
cb = lv_cb_create(conf_win, cb);
|
||||
lv_cb_set_text(cb, "Send CRC");
|
||||
lv_obj_set_free_num(cb, SEND_SETTINGS_CRC);
|
||||
if(app_data->send_crc != 0) lv_btn_set_state(cb, LV_BTN_STATE_TREL);
|
||||
else lv_btn_set_state(cb, LV_BTN_STATE_REL);
|
||||
|
||||
/*Create a text area to type chunk size*/
|
||||
lv_obj_t * val_set_h;
|
||||
val_set_h = lv_cont_create(conf_win, NULL);
|
||||
lv_obj_set_style(val_set_h, lv_style_get(LV_STYLE_PLAIN_COLOR, NULL));
|
||||
lv_obj_set_click(val_set_h, false);
|
||||
lv_cont_set_fit(val_set_h, true, true);
|
||||
lv_cont_set_layout(val_set_h, LV_CONT_LAYOUT_ROW_M);
|
||||
|
||||
lv_obj_t * label;
|
||||
label = lv_label_create(val_set_h, NULL);
|
||||
lv_label_set_text(label, "Chunk size");
|
||||
|
||||
lv_obj_t * ta;
|
||||
char buf[32];
|
||||
ta = lv_ta_create(val_set_h, NULL);
|
||||
lv_cont_set_fit(ta, false, true);
|
||||
lv_obj_set_free_num(ta, SEND_SETTINGS_CHUNK_SIZE);
|
||||
lv_obj_set_free_p(ta, app);
|
||||
lv_page_set_rel_action(ta, win_send_settings_element_rel_action);
|
||||
sprintf(buf, "%d", app_data->chunk_size);
|
||||
lv_ta_set_text(ta, buf);
|
||||
|
||||
/*Create a text area to type the chunk delay*/
|
||||
val_set_h = lv_cont_create(conf_win, val_set_h);
|
||||
|
||||
label = lv_label_create(val_set_h, NULL);
|
||||
lv_label_set_text(label, "Inter-chunk delay");
|
||||
|
||||
ta = lv_ta_create(val_set_h, ta);
|
||||
lv_obj_set_free_num(ta, SEND_SETTINGS_CHUNK_DELAY);
|
||||
sprintf(buf, "%d", app_data->chunk_delay);
|
||||
lv_ta_set_text(ta, buf);
|
||||
}
|
||||
|
||||
/*--------------------
|
||||
* OTHER FUNCTIONS
|
||||
---------------------*/
|
||||
/**
|
||||
* Create an mpty list on the window. 'win_load_file_list' will fill it.
|
||||
* @param app pointer to a Files application
|
||||
*/
|
||||
static void win_create_list(lv_app_inst_t * app)
|
||||
{
|
||||
my_win_data_t * win_data = app->win_data;
|
||||
|
||||
/*Delete the previous list*/
|
||||
if(win_data->file_list != NULL) {
|
||||
lv_obj_del(win_data->file_list);
|
||||
}
|
||||
|
||||
/*Create a new list*/
|
||||
win_data->file_list = lv_list_create(app->win, NULL);
|
||||
lv_obj_set_width(win_data->file_list, lv_win_get_width(app->win));
|
||||
lv_list_set_style_img(win_data->file_list, &style_btn_symbol);
|
||||
lv_obj_set_style(lv_page_get_scrl(win_data->file_list), lv_style_get(LV_STYLE_TRANSP_TIGHT, NULL));
|
||||
lv_obj_set_drag_parent(win_data->file_list, true);
|
||||
lv_obj_set_drag_parent(lv_page_get_scrl(win_data->file_list), true);
|
||||
lv_cont_set_fit(win_data->file_list, false, true);
|
||||
lv_cont_set_layout(lv_page_get_scrl(win_data->file_list), LV_CONT_LAYOUT_COL_L);
|
||||
}
|
||||
|
||||
/**
|
||||
* Load the file list from the current path on the window
|
||||
* @param app pointer to a Files application
|
||||
*/
|
||||
static void win_load_file_list(lv_app_inst_t * app)
|
||||
{
|
||||
my_app_data_t * app_data = app->app_data;
|
||||
my_win_data_t * win_data = app->win_data;
|
||||
|
||||
/*Create a new list*/
|
||||
win_create_list(app);
|
||||
|
||||
fs_res_t res = FS_RES_OK;
|
||||
|
||||
/*At empty path show the drivers */
|
||||
lv_obj_t * liste;
|
||||
if(app_data->path[0] == '\0') {
|
||||
char drv[16];
|
||||
char buf[2];
|
||||
fs_get_letters(drv);
|
||||
uint8_t i;
|
||||
for(i = 0; drv[i] != '\0'; i++) {
|
||||
buf[0] = drv[i];
|
||||
buf[1] = '\0';
|
||||
liste = lv_list_add(win_data->file_list, SYMBOL_DRIVE, buf, win_drv_action);
|
||||
lv_obj_set_free_p(liste, app);
|
||||
}
|
||||
}
|
||||
/*List the files/folders with fs interface*/
|
||||
else {
|
||||
liste = lv_list_add(win_data->file_list, SYMBOL_UP, "Up", win_up_action);
|
||||
lv_obj_set_free_p(liste, app);
|
||||
|
||||
fs_readdir_t rd;
|
||||
res = fs_readdir_init(&rd, app_data->path);
|
||||
if(res != FS_RES_OK) {
|
||||
lv_app_notice_add("Can not read the\npath in Files");
|
||||
return;
|
||||
}
|
||||
|
||||
/*At not first page add prev. page button */
|
||||
if(app_data->file_cnt != 0) {
|
||||
liste = lv_list_add(win_data->file_list, SYMBOL_LEFT, "Previous page", win_prev_action);
|
||||
lv_obj_set_free_p(liste, app);
|
||||
}
|
||||
|
||||
char fn[LV_APP_FILES_FN_MAX_LEN];
|
||||
|
||||
/*Read the files from the previous pages*/
|
||||
uint16_t file_cnt = 0;
|
||||
while(file_cnt <= app_data->file_cnt) {
|
||||
res = fs_readdir(&rd, fn);
|
||||
if(res != FS_RES_OK ){
|
||||
lv_app_notice_add("Can not read\nthe path in Files");
|
||||
return;
|
||||
}
|
||||
file_cnt ++;
|
||||
}
|
||||
|
||||
/*Add list elements from the files and folders*/
|
||||
while(res == FS_RES_OK && fn[0] != '\0') {
|
||||
if(fn[0] == '/') { /*Add a folder*/
|
||||
lv_obj_t * liste;
|
||||
liste = lv_list_add(win_data->file_list, SYMBOL_FOLDER, &fn[1], win_folder_action);
|
||||
lv_obj_set_free_p(liste, app);
|
||||
app_data->file_cnt ++;
|
||||
}
|
||||
/*Add a file*/
|
||||
else {
|
||||
liste = lv_list_add(win_data->file_list, SYMBOL_FILE, fn, win_file_action);
|
||||
lv_obj_set_free_p(liste, app);
|
||||
app_data->file_cnt ++;
|
||||
}
|
||||
|
||||
/*Get the next element*/
|
||||
res = fs_readdir(&rd, fn);
|
||||
|
||||
/*Show only LV_APP_FSEL_MAX_FILE elements and add a Next page button*/
|
||||
if(app_data->file_cnt != 0 && app_data->file_cnt % LV_APP_FILES_PAGE_SIZE == 0) {
|
||||
liste = lv_list_add(win_data->file_list, SYMBOL_RIGHT, "Next page", win_next_action);
|
||||
lv_obj_set_free_p(liste, app);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*Close the read directory*/
|
||||
fs_readdir_close(&rd);
|
||||
}
|
||||
|
||||
if(res != FS_RES_OK) {
|
||||
lv_app_notice_add("Can not read\nthe path in Files");
|
||||
}
|
||||
|
||||
/*Focus to the top of the list*/
|
||||
lv_obj_set_y(lv_page_get_scrl(win_data->file_list), 0);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Called when the Up list element is released to step one level
|
||||
* @param up pointer to the Up button
|
||||
* @param dispi pointer to the caller display input
|
||||
* @return LV_ACTION_RES_INV because the list is deleted in the function
|
||||
*/
|
||||
static lv_action_res_t win_up_action(lv_obj_t * up, lv_dispi_t * dispi)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(up);
|
||||
my_app_data_t * app_data = app->app_data;
|
||||
fs_up(app_data->path);
|
||||
app_data->file_cnt = 0;
|
||||
lv_win_set_title(app->win, app_data->path);
|
||||
|
||||
my_sc_data_t * sc_data = app->sc_data;
|
||||
if(sc_data != NULL) {
|
||||
lv_label_set_text(sc_data->label, fs_get_last(app_data->path));
|
||||
lv_obj_align(sc_data->label, NULL, LV_ALIGN_CENTER, 0, 0);
|
||||
}
|
||||
|
||||
win_load_file_list(app);
|
||||
return LV_ACTION_RES_INV;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the Next list element is released to go to the next page
|
||||
* @param next pointer to the Next button
|
||||
* @param dispi pointer to the caller display input
|
||||
* @return LV_ACTION_RES_INV because the list is deleted in the function
|
||||
*/
|
||||
static lv_action_res_t win_next_action(lv_obj_t * next, lv_dispi_t * dispi)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(next);
|
||||
win_load_file_list(app);
|
||||
return LV_ACTION_RES_INV;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the Prev list element is released to previous page
|
||||
* @param prev pointer to the Prev button
|
||||
* @param dispi pointer to the caller display input
|
||||
* @return LV_ACTION_RES_INV because the list is deleted in the function
|
||||
*/
|
||||
static lv_action_res_t win_prev_action(lv_obj_t * prev, lv_dispi_t * dispi)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(prev);
|
||||
my_app_data_t * app_data = app->app_data;
|
||||
if(app_data->file_cnt <= 2 * LV_APP_FILES_PAGE_SIZE) app_data->file_cnt = 0;
|
||||
else if(app_data->file_cnt % LV_APP_FILES_PAGE_SIZE == 0) {
|
||||
app_data->file_cnt -= 2 * LV_APP_FILES_PAGE_SIZE;
|
||||
} else {
|
||||
app_data->file_cnt = ((app_data->file_cnt / LV_APP_FILES_PAGE_SIZE) - 1) * LV_APP_FILES_PAGE_SIZE;
|
||||
}
|
||||
|
||||
win_load_file_list(app);
|
||||
return LV_ACTION_RES_INV;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Called when the Driver list element is released to step into a driver
|
||||
* @param drv pointer to the Driver button
|
||||
* @param dispi pointer to the caller display input
|
||||
* @return LV_ACTION_RES_INV because the list is deleted in the function
|
||||
*/
|
||||
static lv_action_res_t win_drv_action(lv_obj_t * drv, lv_dispi_t * dispi)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(drv);
|
||||
my_app_data_t * app_data = app->app_data;
|
||||
sprintf(app_data->path, "%s:", lv_list_get_element_text(drv));
|
||||
app_data->file_cnt = 0;
|
||||
lv_win_set_title(app->win, app_data->path);
|
||||
my_sc_data_t * sc_data = app->sc_data;
|
||||
if(sc_data != NULL) {
|
||||
lv_label_set_text(sc_data->label, fs_get_last(app_data->path));
|
||||
lv_obj_align(sc_data->label, NULL, LV_ALIGN_CENTER, 0, 0);
|
||||
}
|
||||
|
||||
win_load_file_list(app);
|
||||
return LV_ACTION_RES_INV;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Called when a folder list element is released to enter into it
|
||||
* @param folder pointer to a folder button
|
||||
* @param dispi pointer to the caller display input
|
||||
* @return LV_ACTION_RES_INV because the list is deleted in the function
|
||||
*/
|
||||
static lv_action_res_t win_folder_action(lv_obj_t * folder, lv_dispi_t * dispi)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(folder);
|
||||
my_app_data_t * app_data = app->app_data;
|
||||
sprintf(app_data->path, "%s/%s", app_data->path, lv_list_get_element_text(folder));
|
||||
app_data->file_cnt = 0;
|
||||
|
||||
lv_win_set_title(app->win, app_data->path);
|
||||
my_sc_data_t * sc_data = app->sc_data;
|
||||
if(sc_data != NULL) {
|
||||
lv_label_set_text(sc_data->label, fs_get_last(app_data->path));
|
||||
lv_obj_align(sc_data->label, NULL, LV_ALIGN_CENTER, 0, 0);
|
||||
}
|
||||
|
||||
|
||||
win_load_file_list(app);
|
||||
return LV_ACTION_RES_INV;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Called when a file list element is released to show the list of operation on it
|
||||
* @param file pointer to a file button
|
||||
* @param dispi pointer to the caller display input
|
||||
* @return LV_ACTION_RES_INV because the list is deleted in the function
|
||||
*/
|
||||
static lv_action_res_t win_file_action(lv_obj_t * file, lv_dispi_t * dispi)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(file);
|
||||
my_app_data_t * app_data = app->app_data;
|
||||
my_win_data_t * win_data = app->win_data;
|
||||
|
||||
sprintf(app_data->fn, "%s", lv_list_get_element_text(file));
|
||||
|
||||
win_create_list(app);
|
||||
|
||||
/*Create the list of operations*/
|
||||
lv_obj_t * liste;
|
||||
liste = lv_list_add(win_data->file_list, SYMBOL_LEFT, "Back", win_back_action);
|
||||
lv_obj_set_free_p(liste, app);
|
||||
|
||||
/*Send button*/
|
||||
liste = lv_list_add(win_data->file_list, NULL, "Send", win_send_rel_action);
|
||||
lv_obj_set_free_p(liste, app);
|
||||
|
||||
/*Delete button*/
|
||||
liste = lv_list_add(win_data->file_list, NULL, "Delete", win_del_rel_action);
|
||||
lv_btn_set_lpr_action(liste, win_del_lpr_action);
|
||||
lv_obj_set_free_p(liste, app);
|
||||
|
||||
return LV_ACTION_RES_INV;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the Back list element is released to when a file chosen to
|
||||
* go back to the file list from file operation
|
||||
* @param back pointer to the back button
|
||||
* @param dispi pointer to the caller display input
|
||||
* @return LV_ACTION_RES_INV because the list is deleted in the function
|
||||
*/
|
||||
static lv_action_res_t win_back_action(lv_obj_t * up, lv_dispi_t * dispi)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(up);
|
||||
my_app_data_t * app_data = app->app_data;
|
||||
|
||||
app_data->file_cnt = 0;
|
||||
win_load_file_list(app);
|
||||
return LV_ACTION_RES_INV;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the Send list element is released to send the file
|
||||
* @param sed pointer to the Up button
|
||||
* @param dispi pointer to the caller display input
|
||||
* @return LV_ACTION_RES_OK because the list is NOT deleted in the function
|
||||
*/
|
||||
static lv_action_res_t win_send_rel_action(lv_obj_t * send, lv_dispi_t * dispi)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(send);
|
||||
my_app_data_t * app_data = app->app_data;
|
||||
|
||||
if(app_data->send_in_prog != 0) {
|
||||
lv_app_notice_add("File sending\nin progress");
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
char path_fn[LV_APP_FILES_PATH_MAX_LEN + LV_APP_FILES_FN_MAX_LEN];
|
||||
sprintf(path_fn, "%s/%s", app_data->path, app_data->fn);
|
||||
start_send(app, path_fn);
|
||||
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when a send settings element is released
|
||||
* @param element pointer to a chekbox or text area
|
||||
* @param dispi pointer to the caller display input
|
||||
* @return LV_ACTION_RES_OK because the list is NOT deleted in the function
|
||||
*/
|
||||
static lv_action_res_t win_send_settings_element_rel_action(lv_obj_t * element, lv_dispi_t * dispi)
|
||||
{
|
||||
send_settings_id_t id = lv_obj_get_free_num(element);
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(element);
|
||||
my_app_data_t * app_data = app->app_data;
|
||||
|
||||
if(id == SEND_SETTINGS_FN) {
|
||||
app_data->send_fn = lv_btn_get_state(element) == LV_BTN_STATE_REL ? 0 : 1;
|
||||
} else if(id == SEND_SETTINGS_SIZE) {
|
||||
app_data->send_size = lv_btn_get_state(element) == LV_BTN_STATE_REL ? 0 : 1;
|
||||
} else if(id == SEND_SETTINGS_CRC) {
|
||||
app_data->send_crc = lv_btn_get_state(element) == LV_BTN_STATE_REL ? 0 : 1;
|
||||
|
||||
/*TODO CRC sending is not supported yet*/
|
||||
if(app_data->send_crc != 0) {
|
||||
lv_app_notice_add("CRC sending is\nnot supported yet");
|
||||
}
|
||||
} else if(id == SEND_SETTINGS_CHUNK_SIZE) {
|
||||
lv_app_kb_open(element, LV_APP_KB_MODE_NUM | LV_APP_KB_MODE_WIN_RESIZE, send_settings_kb_close_action, send_settings_kb_ok_action);
|
||||
} else if(id == SEND_SETTINGS_CHUNK_DELAY) {
|
||||
lv_app_kb_open(element, LV_APP_KB_MODE_NUM | LV_APP_KB_MODE_WIN_RESIZE, send_settings_kb_close_action, send_settings_kb_ok_action);
|
||||
}
|
||||
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Called when the Delete list element is released.
|
||||
* It will show a notification to long press the Delete button to remove the file
|
||||
* @param del pointer to the back button
|
||||
* @param dispi pointer to the caller display input
|
||||
* @return LV_ACTION_RES_OK because the list is NOT deleted in the function
|
||||
*/
|
||||
static lv_action_res_t win_del_rel_action(lv_obj_t * del, lv_dispi_t * dispi)
|
||||
{
|
||||
lv_app_notice_add("Press long the Delete button\n"
|
||||
"to remove the file");
|
||||
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
/**
|
||||
* Called when the Delete list element is long pressed to remove a file
|
||||
* @param del pointer to the Delete button
|
||||
* @param dispi pointer to the caller display input
|
||||
* @return LV_ACTION_RES_OK because the list is NOT deleted in the function
|
||||
*/
|
||||
static lv_action_res_t win_del_lpr_action(lv_obj_t * del, lv_dispi_t * dispi)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(del);
|
||||
my_app_data_t * app_data = app->app_data;
|
||||
|
||||
char path_fn[LV_APP_FILES_PATH_MAX_LEN + LV_APP_FILES_FN_MAX_LEN];
|
||||
sprintf(path_fn, "%s/%s", app_data->path, app_data->fn);
|
||||
|
||||
fs_res_t res = fs_remove(path_fn);
|
||||
if(res == FS_RES_OK) lv_app_notice_add("%s deleted", app_data->fn);
|
||||
else lv_app_notice_add("Can not delete\n%s", app_data->fn);
|
||||
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when a send setting is typed and 'Close' pressed on the App. keyboard.
|
||||
* The function reverts the original value in the text area.
|
||||
* @param ta pointer to a text area
|
||||
*/
|
||||
static void send_settings_kb_close_action(lv_obj_t * ta)
|
||||
{
|
||||
send_settings_id_t id = lv_obj_get_free_num(ta);
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(ta);
|
||||
my_app_data_t * app_data = app->app_data;
|
||||
|
||||
char buf[32];
|
||||
buf[0] = '\0';
|
||||
|
||||
if(id == SEND_SETTINGS_CHUNK_DELAY) {
|
||||
sprintf(buf, "%d", app_data->chunk_size);
|
||||
} else if(id == SEND_SETTINGS_CHUNK_SIZE) {
|
||||
sprintf(buf, "%d", app_data->chunk_size);
|
||||
}
|
||||
lv_ta_set_text(ta, buf);
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when a send setting is typed and 'Ok' pressed on the App. keyboard.
|
||||
* The function saves teh new value.
|
||||
* @param ta pointer to a text area
|
||||
*/
|
||||
static void send_settings_kb_ok_action(lv_obj_t * ta)
|
||||
{
|
||||
send_settings_id_t id = lv_obj_get_free_num(ta);
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(ta);
|
||||
my_app_data_t * app_data = app->app_data;
|
||||
|
||||
int num;
|
||||
sscanf(lv_ta_get_txt(ta), "%d", &num);
|
||||
|
||||
if(id == SEND_SETTINGS_CHUNK_DELAY) {
|
||||
if(num > LV_APP_FILES_CHUNK_MAX_TIME) num = LV_APP_FILES_CHUNK_MAX_TIME;
|
||||
if(num < LV_APP_FILES_CHUNK_MIN_TIME) num = LV_APP_FILES_CHUNK_MIN_TIME;
|
||||
app_data->chunk_delay = (uint16_t) num;
|
||||
} else if(id == SEND_SETTINGS_CHUNK_SIZE) {
|
||||
if(num > LV_APP_FILES_CHUNK_MAX_SIZE) num = LV_APP_FILES_CHUNK_MAX_SIZE;
|
||||
if(num < LV_APP_FILES_CHUNK_MIN_SIZE) num = LV_APP_FILES_CHUNK_MIN_SIZE;
|
||||
app_data->chunk_size= (uint16_t) num;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Start the sending of a file
|
||||
* @param app pointer to a Files application
|
||||
* @param path path of the file to send
|
||||
*/
|
||||
static void start_send(lv_app_inst_t * app, const char * path)
|
||||
{
|
||||
my_app_data_t * app_data = app->app_data;
|
||||
|
||||
/*Open the file*/
|
||||
fs_res_t res = fs_open(&app_data->file, path, FS_MODE_RD);
|
||||
if(res == FS_RES_OK) {
|
||||
app_data->send_in_prog = 1;
|
||||
|
||||
/*Send the header*/
|
||||
if(app_data->send_fn != 0) {
|
||||
lv_app_com_send(app, LV_APP_COM_TYPE_CHAR, app_data->path, strlen(app_data->path));
|
||||
lv_app_com_send(app, LV_APP_COM_TYPE_CHAR, "/", 1);
|
||||
lv_app_com_send(app, LV_APP_COM_TYPE_CHAR, app_data->fn, strlen(app_data->fn));
|
||||
lv_app_com_send(app, LV_APP_COM_TYPE_CHAR, "\n", 1);
|
||||
}
|
||||
|
||||
if(app_data->send_size != 0) {
|
||||
char buf[64];
|
||||
uint32_t size;
|
||||
fs_size(&app_data->file, &size);
|
||||
sprintf(buf,"%d", (int) size);
|
||||
lv_app_com_send(app, LV_APP_COM_TYPE_CHAR, buf, strlen(buf));
|
||||
lv_app_com_send(app, LV_APP_COM_TYPE_CHAR, "\n", 1);
|
||||
}
|
||||
if(app_data->send_crc != 0) {
|
||||
lv_app_com_send(app, LV_APP_COM_TYPE_CHAR, "0x0000", 6);
|
||||
lv_app_com_send(app, LV_APP_COM_TYPE_CHAR, "\n", 1);
|
||||
}
|
||||
|
||||
/*Add an extra \n to separate the header from the file data*/
|
||||
if(app_data->send_fn != 0 || app_data->send_size != 0 || app_data->send_crc != 0) {
|
||||
lv_app_com_send(app, LV_APP_COM_TYPE_CHAR, "\n", 1);
|
||||
}
|
||||
}
|
||||
|
||||
/*If an error occurred close the file*/
|
||||
if(res != FS_RES_OK) {
|
||||
fs_close(&app_data->file);
|
||||
ptask_set_prio(app_data->send_task, PTASK_PRIO_OFF);
|
||||
app_data->send_in_prog = 0;
|
||||
lv_app_notice_add("Can not send\nthe file in Files");
|
||||
}
|
||||
/*If no error show notification, start the sender task and refresh the shortcut*/
|
||||
else {
|
||||
/*Start the sender task*/
|
||||
ptask_set_period(app_data->send_task, app_data->chunk_delay);
|
||||
ptask_reset(app_data->send_task);
|
||||
ptask_set_prio(app_data->send_task, PTASK_PRIO_HIGH);
|
||||
lv_app_notice_add("Sending\n%s", fs_get_last(path));
|
||||
|
||||
/*Refresh the shortcut with the percentage of the sending*/
|
||||
if(app->sc_data != NULL) {
|
||||
my_sc_data_t * sc_data = app->sc_data;
|
||||
|
||||
uint32_t size;
|
||||
fs_size(&app_data->file, &size);
|
||||
uint32_t pos;
|
||||
fs_tell(&app_data->file, &pos);
|
||||
|
||||
int pct = (uint32_t) (pos * 100) / size;
|
||||
|
||||
char buf[256];
|
||||
sprintf(buf, "Sending\n%d%%", pct);
|
||||
lv_label_set_text(sc_data->label, buf);
|
||||
lv_obj_align(sc_data->label, NULL, LV_ALIGN_CENTER, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Periodically send the next chunk of the file
|
||||
* @param app pointer to a Files application
|
||||
*/
|
||||
static void send_task(void * param)
|
||||
{
|
||||
lv_app_inst_t * app = param;
|
||||
my_app_data_t * app_data = app->app_data;
|
||||
|
||||
if(app_data->send_in_prog == 0) return;
|
||||
|
||||
/*Read a chunk*/
|
||||
uint32_t rn;
|
||||
char rd_buf[LV_APP_FILES_CHUNK_MAX_SIZE];
|
||||
fs_res_t res = fs_read(&app_data->file, rd_buf, app_data->chunk_size, &rn);
|
||||
if(res == FS_RES_OK) {
|
||||
app_data->send_in_prog = 1;
|
||||
lv_app_com_send(app, LV_APP_COM_TYPE_CHAR, rd_buf, rn);
|
||||
}
|
||||
|
||||
/*If the read failed close the file and show an error*/
|
||||
if(res != FS_RES_OK) {
|
||||
fs_close(&app_data->file);
|
||||
app_data->send_in_prog = 0;
|
||||
lv_app_notice_add("Can not send\nthe file in Files");
|
||||
}
|
||||
/*If the read was successful*/
|
||||
else {
|
||||
my_sc_data_t * sc_data = app->sc_data;
|
||||
|
||||
/*If the file is read close it a show a notification*/
|
||||
if(rn < app_data->chunk_size) {
|
||||
lv_app_notice_add("File sent");
|
||||
fs_close(&app_data->file);
|
||||
app_data->send_in_prog = 0;
|
||||
|
||||
/*Refresh the shortut*/
|
||||
if(sc_data != NULL) {
|
||||
lv_label_set_text(sc_data->label, fs_get_last(app_data->path));
|
||||
lv_obj_align(sc_data->label, NULL, LV_ALIGN_CENTER, 0, 0);
|
||||
}
|
||||
}
|
||||
/*If the file is not sent yet refresh the shortcut with percentage of sending*/
|
||||
else {
|
||||
if(sc_data != NULL) {
|
||||
uint32_t size;
|
||||
fs_size(&app_data->file, &size);
|
||||
uint32_t pos;
|
||||
fs_tell(&app_data->file, &pos);
|
||||
|
||||
uint8_t pct = (uint32_t) (pos * 100) / size;
|
||||
|
||||
char buf[256];
|
||||
sprintf(buf, "Sending\n%d%%", pct);
|
||||
lv_label_set_text(sc_data->label, buf);
|
||||
lv_obj_align(sc_data->label, NULL, LV_ALIGN_CENTER, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif /*LV_APP_ENABLE != 0 && USE_LV_APP_FILES != 0*/
|
||||
@@ -1,477 +0,0 @@
|
||||
/**
|
||||
* @file lv_app_gsm.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_app_gsm.h"
|
||||
#if LV_APP_ENABLE != 0 && USE_LV_APP_GSM != 0
|
||||
|
||||
#include "../lv_app/lv_app_util/lv_app_kb.h"
|
||||
#include "hal/gsm/gsm.h"
|
||||
#include "misc/os/ptask.h"
|
||||
#include "hal/systick/systick.h"
|
||||
#include "misc/comm/gsmmng.h"
|
||||
#include <stdio.h>
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define GSM_MONITOR_PERIOD 1000 /*ms*/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/*Application specific data for an instance of this application*/
|
||||
typedef struct
|
||||
{
|
||||
char set_apn[128];
|
||||
char set_ip[32];
|
||||
char set_port[16];
|
||||
uint8_t * last_msg_dp;
|
||||
uint16_t last_msg_size;
|
||||
}my_app_data_t;
|
||||
|
||||
/*Application specific data a window of this application*/
|
||||
typedef struct
|
||||
{
|
||||
lv_obj_t * title;
|
||||
lv_obj_t * netw_apn_ta;
|
||||
lv_obj_t * tcp_ip_ta;
|
||||
lv_obj_t * tcp_port_ta;
|
||||
}my_win_data_t;
|
||||
|
||||
/*Application specific data for a shortcut of this application*/
|
||||
typedef struct
|
||||
{
|
||||
lv_obj_t * label;
|
||||
}my_sc_data_t;
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static void my_app_run(lv_app_inst_t * app, void * conf);
|
||||
static void my_app_close(lv_app_inst_t * app);
|
||||
static void my_com_rec(lv_app_inst_t * app_send, lv_app_inst_t * app_rec, lv_app_com_type_t type , const void * data, uint32_t size);
|
||||
static void my_sc_open(lv_app_inst_t * app, lv_obj_t * sc);
|
||||
static void my_sc_close(lv_app_inst_t * app);
|
||||
static void my_win_open(lv_app_inst_t * app, lv_obj_t * win);
|
||||
static void my_win_close(lv_app_inst_t * app);
|
||||
|
||||
static void gsm_state_monitor_task(void * param);
|
||||
|
||||
static lv_action_res_t netw_con_rel_action(lv_obj_t * btn, lv_dispi_t * dispi);
|
||||
static lv_action_res_t netw_apn_rel_action( lv_obj_t * ta, lv_dispi_t * dispi);
|
||||
static lv_action_res_t tcp_ip_rel_action( lv_obj_t * ta, lv_dispi_t * dispi);
|
||||
static lv_action_res_t tcp_port_rel_action( lv_obj_t * ta, lv_dispi_t * dispi);
|
||||
|
||||
static void netw_apn_kb_ok(lv_obj_t * ta);
|
||||
static void netw_apn_kb_close(lv_obj_t * ta);
|
||||
static void tcp_ip_kb_ok(lv_obj_t * ta);
|
||||
static void tcp_ip_kb_close(lv_obj_t * ta);
|
||||
static void tcp_port_kb_ok(lv_obj_t * ta);
|
||||
static void tcp_port_kb_close(lv_obj_t * ta);
|
||||
|
||||
static void tcp_transf_cb(gsm_state_t state, const char * txt);
|
||||
|
||||
static void win_title_refr(void);
|
||||
|
||||
static void save_conf(lv_app_inst_t * app);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
static lv_app_dsc_t my_app_dsc =
|
||||
{
|
||||
.name = "GSM",
|
||||
.mode = LV_APP_MODE_NONE,
|
||||
.app_run = my_app_run,
|
||||
.app_close = my_app_close,
|
||||
.com_rec = my_com_rec,
|
||||
.win_open = my_win_open,
|
||||
.win_close = my_win_close,
|
||||
.sc_open = my_sc_open,
|
||||
.sc_close = my_sc_close,
|
||||
.app_data_size = sizeof(my_app_data_t),
|
||||
.sc_data_size = sizeof(my_sc_data_t),
|
||||
.win_data_size = sizeof(my_win_data_t),
|
||||
};
|
||||
|
||||
static lv_app_inst_t * app_act_com;
|
||||
|
||||
static char def_apn[128];
|
||||
static char def_ip[32];
|
||||
static char def_port[16];
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the application
|
||||
* @return pointer to the application descriptor of this application
|
||||
*/
|
||||
const lv_app_dsc_t * lv_app_gsm_init(void)
|
||||
{
|
||||
#ifdef LV_APP_GSM_CONF_PATH
|
||||
fs_file_t f;
|
||||
fs_res_t res;
|
||||
|
||||
res = fs_open(&f, LV_APP_GSM_CONF_PATH, FS_MODE_RD);
|
||||
if(res == FS_RES_NOT_EX) {
|
||||
res = fs_open(&f, LV_APP_GSM_CONF_PATH, FS_MODE_WR | FS_MODE_RD);
|
||||
if(res == FS_RES_OK) {
|
||||
const char * def_conf = "apn\n100.101.102.103\n1234";
|
||||
fs_write(&f, def_conf, strlen(def_conf) + 1, NULL);
|
||||
fs_seek(&f, 0);
|
||||
}
|
||||
}
|
||||
|
||||
if(res == FS_RES_OK) {
|
||||
volatile char buf[256];
|
||||
volatile uint32_t rn;
|
||||
fs_read(&f, (char *)buf, sizeof(buf) - 1, (uint32_t *)&rn);
|
||||
|
||||
volatile uint16_t i;
|
||||
volatile uint16_t j = 0;
|
||||
volatile uint8_t line_cnt = 0;
|
||||
for(i = 0; i < rn; i++) {
|
||||
if(buf[i] != '\n') {
|
||||
if(line_cnt == 0) def_apn[j] = buf[i];
|
||||
if(line_cnt == 1) def_ip[j] = buf[i];
|
||||
if(line_cnt == 2) def_port[j] = buf[i];
|
||||
j++;
|
||||
} else {
|
||||
if(line_cnt == 0) def_apn[j] = '\0';
|
||||
if(line_cnt == 1) def_ip[j] = '\0';
|
||||
if(line_cnt == 2) def_port[j] = '\0';
|
||||
j = 0;
|
||||
line_cnt ++;
|
||||
}
|
||||
}
|
||||
|
||||
fs_close(&f);
|
||||
|
||||
} else {
|
||||
lv_app_notice_add("SD card error");
|
||||
}
|
||||
#else
|
||||
strcpy(def_apn, LV_APP_GSM_APN_DEF);
|
||||
strcpy(def_ip, LV_APP_GSM_IP_DEF);
|
||||
strcpy(def_port, LV_APP_GSM_PORT_DEF);
|
||||
#endif
|
||||
|
||||
#if LV_APP_GSM_AUTO_CONNECT != 0
|
||||
gsmmng_set_last_apn(def_apn);
|
||||
gsmmng_set_last_tcp(def_ip, def_port);
|
||||
#endif
|
||||
ptask_create(gsm_state_monitor_task, GSM_MONITOR_PERIOD, PTASK_PRIO_LOW, NULL);
|
||||
|
||||
return &my_app_dsc;
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Run an application according to 'app_dsc'
|
||||
* @param app_dsc pointer to an application descriptor
|
||||
* @param conf pointer to a lv_app_example_conf_t structure with configuration data or NULL if unused
|
||||
* @return pointer to the opened application or NULL if any error occurred
|
||||
*/
|
||||
static void my_app_run(lv_app_inst_t * app, void * conf)
|
||||
{
|
||||
/*Initialize the application*/
|
||||
my_app_data_t * adata = app->app_data;
|
||||
strcpy(adata->set_apn, def_apn);
|
||||
strcpy(adata->set_ip, def_ip);
|
||||
strcpy(adata->set_port, def_port);
|
||||
}
|
||||
|
||||
/**
|
||||
* Close a running application.
|
||||
* Close the Window and the Shortcut too if opened.
|
||||
* Free all the allocated memory by this application.
|
||||
* @param app pointer to an application
|
||||
*/
|
||||
static void my_app_close(lv_app_inst_t * app)
|
||||
{
|
||||
/*No dynamically allocated data in 'my_app_data'*/
|
||||
}
|
||||
|
||||
/**
|
||||
* Read the data have been sent to this application
|
||||
* @param app_send pointer to an application which sent the message
|
||||
* @param app_rec pointer to an application which is receiving the message
|
||||
* @param type type of data from 'lv_app_com_type_t' enum
|
||||
* @param data pointer to the sent data
|
||||
* @param size length of 'data' in bytes
|
||||
*/
|
||||
static void my_com_rec(lv_app_inst_t * app_send, lv_app_inst_t * app_rec,
|
||||
lv_app_com_type_t type , const void * data, uint32_t size)
|
||||
{
|
||||
if(type == LV_APP_COM_TYPE_CHAR) { /*data: string*/
|
||||
app_act_com = app_rec;
|
||||
gsm_tcp_transf(data, size, tcp_transf_cb);
|
||||
my_app_data_t * adata = app_act_com->app_data;
|
||||
if(adata->last_msg_dp != NULL) dm_free(adata->last_msg_dp);
|
||||
|
||||
adata->last_msg_dp = dm_alloc(size);
|
||||
memcpy(adata->last_msg_dp, data, size);
|
||||
adata->last_msg_size = size;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Open a shortcut for an application
|
||||
* @param app pointer to an application
|
||||
* @param sc pointer to an object where the application
|
||||
* can create content of the shortcut
|
||||
*/
|
||||
static void my_sc_open(lv_app_inst_t * app, lv_obj_t * sc)
|
||||
{
|
||||
my_sc_data_t * sc_data = app->sc_data;
|
||||
|
||||
sc_data->label = lv_label_create(sc, NULL);
|
||||
lv_label_set_text(sc_data->label, "Empty");
|
||||
lv_obj_align(sc_data->label, NULL, LV_ALIGN_CENTER, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Close the shortcut of an application
|
||||
* @param app pointer to an application
|
||||
*/
|
||||
static void my_sc_close(lv_app_inst_t * app)
|
||||
{
|
||||
/*No dynamically allocated data in 'my_sc_data'*/
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Open the application in a window
|
||||
* @param app pointer to an application
|
||||
* @param win pointer to a window object where
|
||||
* the application can create content
|
||||
*/
|
||||
static void my_win_open(lv_app_inst_t * app, lv_obj_t * win)
|
||||
{
|
||||
my_app_data_t * adata = app->app_data;
|
||||
my_win_data_t * wdata = app->win_data;
|
||||
|
||||
wdata->title = lv_label_create(win, NULL);
|
||||
|
||||
lv_obj_t * ta_cont = lv_cont_create(win, NULL);
|
||||
lv_cont_set_fit(ta_cont, true, true);
|
||||
lv_cont_set_layout(ta_cont, LV_CONT_LAYOUT_COL_L);
|
||||
lv_obj_set_style(ta_cont, lv_style_get(LV_STYLE_TRANSP_TIGHT, NULL));
|
||||
|
||||
wdata->netw_apn_ta = lv_ta_create(ta_cont, NULL);
|
||||
lv_cont_set_fit(wdata->netw_apn_ta, false, true);
|
||||
lv_obj_set_free_p(wdata->netw_apn_ta, app);
|
||||
lv_obj_set_width(wdata->netw_apn_ta, LV_DPI * 3);
|
||||
lv_page_set_rel_action(wdata->netw_apn_ta, netw_apn_rel_action);
|
||||
lv_ta_set_text(wdata->netw_apn_ta, adata->set_apn);
|
||||
lv_ta_set_cursor_show(wdata->netw_apn_ta, false);
|
||||
|
||||
wdata->tcp_ip_ta = lv_ta_create(ta_cont, wdata->netw_apn_ta);
|
||||
lv_page_set_rel_action(wdata->tcp_ip_ta, tcp_ip_rel_action);
|
||||
lv_ta_set_text(wdata->tcp_ip_ta, adata->set_ip);
|
||||
|
||||
wdata->tcp_port_ta = lv_ta_create(ta_cont, wdata->netw_apn_ta);
|
||||
lv_page_set_rel_action(wdata->tcp_port_ta, tcp_port_rel_action);
|
||||
lv_ta_set_text(wdata->tcp_port_ta, adata->set_port);
|
||||
|
||||
lv_obj_t * con_btn = lv_btn_create(win, NULL);
|
||||
lv_obj_set_free_p(con_btn, app);
|
||||
lv_btn_set_rel_action(con_btn, netw_con_rel_action);
|
||||
lv_obj_t * label = lv_label_create(con_btn, NULL);
|
||||
lv_label_set_text(label, "Connect");
|
||||
|
||||
lv_cont_set_layout(lv_page_get_scrl(lv_win_get_page(win)), LV_CONT_LAYOUT_PRETTY);
|
||||
|
||||
win_title_refr();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Close the window of an application
|
||||
* @param app pointer to an application
|
||||
*/
|
||||
static void my_win_close(lv_app_inst_t * app)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/*--------------------
|
||||
* OTHER FUNCTIONS
|
||||
---------------------*/
|
||||
|
||||
static void gsm_state_monitor_task(void * param)
|
||||
{
|
||||
static gsmmng_state_t state_prev = GSMMNG_STATE_WAIT;
|
||||
gsmmng_state_t state_act = gsmmng_get_state();
|
||||
|
||||
if(state_prev != state_act && state_act == GSMMNG_STATE_READY) {
|
||||
lv_app_notice_add("GSM connected to:\n%s\n%s:%s",
|
||||
gsmmng_get_last_apn(), gsmmng_get_last_ip(), gsmmng_get_last_port());
|
||||
win_title_refr();
|
||||
}
|
||||
|
||||
/* The GSM should be busy if there is sg. to send.
|
||||
* It means fail during last send. Try again*/
|
||||
if(app_act_com != NULL) {
|
||||
if(gsm_busy() == false && state_act == GSMMNG_STATE_READY) {
|
||||
/*Try to send the message again*/
|
||||
lv_app_notice_add("Resend GSM message");
|
||||
my_app_data_t * adata = app_act_com->app_data;
|
||||
gsm_tcp_transf(adata->last_msg_dp, adata->last_msg_size, tcp_transf_cb);
|
||||
}
|
||||
}
|
||||
|
||||
state_prev = state_act;
|
||||
}
|
||||
|
||||
static lv_action_res_t netw_con_rel_action(lv_obj_t * btn, lv_dispi_t* dispi)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(btn);
|
||||
my_app_data_t * adata = app->app_data;
|
||||
|
||||
gsmmng_set_last_apn(adata->set_apn);
|
||||
gsmmng_set_last_tcp(adata->set_ip, adata->set_port);
|
||||
gsmmng_reconnect();
|
||||
save_conf(app);
|
||||
lv_app_notice_add("Connecting to GSM network\n%s\n %s:%s",
|
||||
adata->set_apn, adata->set_ip, adata->set_port);
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
static lv_action_res_t netw_apn_rel_action( lv_obj_t * ta, lv_dispi_t* dispi)
|
||||
{
|
||||
lv_app_kb_open(ta, LV_APP_KB_MODE_TXT | LV_APP_KB_MODE_WIN_RESIZE | LV_APP_KB_MODE_CUR_MANAGE, netw_apn_kb_close ,netw_apn_kb_ok);
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
static lv_action_res_t tcp_ip_rel_action( lv_obj_t * ta, lv_dispi_t* dispi)
|
||||
{
|
||||
lv_app_kb_open(ta, LV_APP_KB_MODE_TXT | LV_APP_KB_MODE_WIN_RESIZE | LV_APP_KB_MODE_CUR_MANAGE, tcp_ip_kb_close ,tcp_ip_kb_ok);
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
static lv_action_res_t tcp_port_rel_action( lv_obj_t * ta, lv_dispi_t* dispi)
|
||||
{
|
||||
lv_app_kb_open(ta, LV_APP_KB_MODE_NUM | LV_APP_KB_MODE_WIN_RESIZE | LV_APP_KB_MODE_CUR_MANAGE, tcp_port_kb_close ,tcp_port_kb_ok);
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
static void netw_apn_kb_ok(lv_obj_t * ta)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(ta);
|
||||
my_app_data_t * adata = app->app_data;
|
||||
strcpy(adata->set_apn, lv_ta_get_txt(ta));
|
||||
}
|
||||
|
||||
static void netw_apn_kb_close(lv_obj_t * ta)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(ta);
|
||||
my_app_data_t * adata = app->app_data;
|
||||
lv_ta_set_text(ta, adata->set_apn);
|
||||
}
|
||||
|
||||
static void tcp_ip_kb_ok(lv_obj_t * ta)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(ta);
|
||||
my_app_data_t * adata = app->app_data;
|
||||
strcpy(adata->set_ip, lv_ta_get_txt(ta));
|
||||
}
|
||||
|
||||
static void tcp_ip_kb_close(lv_obj_t * ta)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(ta);
|
||||
my_app_data_t * adata = app->app_data;
|
||||
lv_ta_set_text(ta, adata->set_ip);
|
||||
}
|
||||
|
||||
static void tcp_port_kb_ok(lv_obj_t * ta)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(ta);
|
||||
my_app_data_t * adata = app->app_data;
|
||||
strcpy(adata->set_port, lv_ta_get_txt(ta));
|
||||
}
|
||||
|
||||
static void tcp_port_kb_close(lv_obj_t * ta)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(ta);
|
||||
my_app_data_t * adata = app->app_data;
|
||||
lv_ta_set_text(ta, adata->set_port);
|
||||
}
|
||||
|
||||
static void tcp_transf_cb(gsm_state_t state, const char * txt)
|
||||
{
|
||||
if(state == GSM_STATE_OK) {
|
||||
uint16_t size = txt[0] + ((txt[1] << 8) & 0xFF00);
|
||||
char buf[256];
|
||||
memcpy(buf, &txt[2], size);
|
||||
buf[size] = '\0';
|
||||
lv_app_com_send(app_act_com, LV_APP_COM_TYPE_CHAR, &txt[2], size);
|
||||
my_app_data_t * adata = app_act_com->app_data;
|
||||
dm_free(adata->last_msg_dp);
|
||||
adata->last_msg_dp = NULL;
|
||||
adata->last_msg_size = 0;
|
||||
app_act_com = NULL;
|
||||
}else if(state == GSM_STATE_ERROR) {
|
||||
lv_app_notice_add("GSM TCP transfer error\n%s", txt);
|
||||
lv_app_notice_add("Reconnecting to GSM...");
|
||||
gsmmng_reconnect();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void win_title_refr(void)
|
||||
{
|
||||
lv_app_inst_t * app;
|
||||
app = lv_app_get_next(NULL, &my_app_dsc);
|
||||
while(app != NULL) {
|
||||
if(app->win != NULL) {
|
||||
my_win_data_t * wdata = app->win_data;
|
||||
|
||||
if(gsmmng_get_state() == GSMMNG_STATE_IDLE) {
|
||||
lv_label_set_text(wdata->title, "Not connected");
|
||||
} else if(gsmmng_get_state() == GSMMNG_STATE_READY) {
|
||||
lv_label_set_text(wdata->title, "Connecting ...");
|
||||
} else {
|
||||
char buf[256];
|
||||
sprintf(buf, "%s - %s:%s", gsmmng_get_last_apn(), gsmmng_get_last_ip(), gsmmng_get_last_port());
|
||||
lv_label_set_text(wdata->title, buf);
|
||||
}
|
||||
lv_obj_set_width(wdata->title, lv_win_get_width(app->win));
|
||||
}
|
||||
app = lv_app_get_next(app, &my_app_dsc);
|
||||
}
|
||||
}
|
||||
|
||||
static void save_conf(lv_app_inst_t * app)
|
||||
{
|
||||
#ifdef LV_APP_GSM_CONF_PATH
|
||||
my_app_data_t * adata = app->app_data;
|
||||
|
||||
fs_file_t f;
|
||||
fs_res_t res;
|
||||
res = fs_open(&f, LV_APP_GSM_CONF_PATH, FS_MODE_WR);
|
||||
if(res == FS_RES_OK) {
|
||||
char buf[256];
|
||||
sprintf(buf,"%s\n%s\n%s", adata->set_apn, adata->set_ip, adata->set_port);
|
||||
fs_write(&f, buf, strlen(buf) + 1, NULL);
|
||||
fs_close(&f);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /*LV_APP_ENABLE != 0 && USE_LV_APP_EXAMPLE != 0*/
|
||||
@@ -1,47 +0,0 @@
|
||||
/**
|
||||
* @file lv_app_gsm.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LV_APP_GSM_H
|
||||
#define LV_APP_GSM_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lvgl/lv_app/lv_app.h"
|
||||
|
||||
#if LV_APP_ENABLE != 0 && USE_LV_APP_GSM != 0
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
typedef struct
|
||||
{
|
||||
|
||||
}lv_app_gsm_conf_t;
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
const lv_app_dsc_t * lv_app_gsm_init(void);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /*LV_APP_ENABLE != 0 && USE_LV_APP_EXAMPLE != 0*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* LV_APP_EXAMPLE_H */
|
||||
@@ -1,143 +0,0 @@
|
||||
/**
|
||||
* @file lv_app_example.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_app_phantom.h"
|
||||
#if LV_APP_ENABLE != 0 && USE_LV_APP_PHANTOM != 0
|
||||
|
||||
#include "../lv_app/lv_app_util/lv_app_kb.h"
|
||||
#include <stdio.h>
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/*Application specific data for an instance of this application*/
|
||||
typedef struct
|
||||
{
|
||||
void (*com_listen)(lv_app_inst_t * app_send, lv_app_inst_t * app_rec,
|
||||
lv_app_com_type_t type , const void * data, uint32_t size);
|
||||
}my_app_data_t;
|
||||
|
||||
/*Application specific data a window of this application*/
|
||||
typedef struct
|
||||
{
|
||||
|
||||
}my_win_data_t;
|
||||
|
||||
/*Application specific data for a shortcut of this application*/
|
||||
typedef struct
|
||||
{
|
||||
lv_obj_t * label;
|
||||
}my_sc_data_t;
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static void my_app_run(lv_app_inst_t * app, void * conf);
|
||||
static void my_app_close(lv_app_inst_t * app);
|
||||
static void my_com_rec(lv_app_inst_t * app_send, lv_app_inst_t * app_rec,
|
||||
lv_app_com_type_t type , const void * data, uint32_t size);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
static lv_app_dsc_t my_app_dsc =
|
||||
{
|
||||
.name = "Phantom",
|
||||
.mode = LV_APP_MODE_NONE,
|
||||
.app_run = my_app_run,
|
||||
.app_close = my_app_close,
|
||||
.com_rec = my_com_rec,
|
||||
.win_open = NULL,
|
||||
.win_close = NULL,
|
||||
.sc_open = NULL,
|
||||
.sc_close = NULL,
|
||||
.app_data_size = sizeof(my_app_data_t),
|
||||
.sc_data_size = sizeof(my_sc_data_t),
|
||||
.win_data_size = sizeof(my_win_data_t),
|
||||
};
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the application
|
||||
* @return pointer to the application descriptor of this application
|
||||
*/
|
||||
const lv_app_dsc_t * lv_app_phantom_init(void)
|
||||
{
|
||||
|
||||
return &my_app_dsc;
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Run an application according to 'app_dsc'
|
||||
* @param app_dsc pointer to an application descriptor
|
||||
* @param conf pointer to a lv_app_phantom_conf_t structure with configuration data or NULL if unused
|
||||
* @return pointer to the opened application or NULL if any error occurred
|
||||
*/
|
||||
static void my_app_run(lv_app_inst_t * app, void * conf)
|
||||
{
|
||||
/*Initialize the application*/
|
||||
my_app_data_t * app_data = app->app_data;
|
||||
app_data->com_listen = NULL;
|
||||
|
||||
if(conf != NULL) {
|
||||
lv_app_phantom_conf_t * my_conf = conf;
|
||||
app_data->com_listen = my_conf->com_listen;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Close a running application.
|
||||
* Close the Window and the Shortcut too if opened.
|
||||
* Free all the allocated memory by this application.
|
||||
* @param app pointer to an application
|
||||
*/
|
||||
static void my_app_close(lv_app_inst_t * app)
|
||||
{
|
||||
/*No dynamically allocated data in 'my_app_data'*/
|
||||
}
|
||||
|
||||
/**
|
||||
* Read the data have been sent to this application
|
||||
* @param app_send pointer to an application which sent the message
|
||||
* @param app_rec pointer to an application which is receiving the message
|
||||
* @param type type of data from 'lv_app_com_type_t' enum
|
||||
* @param data pointer to the sent data
|
||||
* @param size length of 'data' in bytes
|
||||
*/
|
||||
static void my_com_rec(lv_app_inst_t * app_send, lv_app_inst_t * app_rec,
|
||||
lv_app_com_type_t type , const void * data, uint32_t size)
|
||||
{
|
||||
|
||||
my_app_data_t * app_data = app_rec->app_data;
|
||||
|
||||
if(app_data->com_listen != NULL) {
|
||||
app_data->com_listen(app_send, app_rec, type, data, size);
|
||||
}
|
||||
}
|
||||
|
||||
/*--------------------
|
||||
* OTHER FUNCTIONS
|
||||
---------------------*/
|
||||
|
||||
#endif /*LV_APP_ENABLE != 0 && USE_LV_APP_EXAMPLE != 0*/
|
||||
@@ -1,50 +0,0 @@
|
||||
/**
|
||||
* @file lv_app_phantom.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LV_APP_PHANTOM_H
|
||||
#define LV_APP_PHANTOM_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lvgl/lv_app/lv_app.h"
|
||||
|
||||
#if LV_APP_ENABLE != 0 && USE_LV_APP_PHANTOM != 0
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
typedef struct
|
||||
{
|
||||
void (*com_listen)(lv_app_inst_t * app_send,
|
||||
lv_app_inst_t * app_rec,
|
||||
lv_app_com_type_t type ,
|
||||
const void * data, uint32_t size);
|
||||
}lv_app_phantom_conf_t;
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
const lv_app_dsc_t * lv_app_phantom_init(void);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /*LV_APP_ENABLE != 0 && USE_LV_APP_PHANTOM != 0*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* LV_APP_PHANTOM_H */
|
||||
@@ -1,399 +0,0 @@
|
||||
/**
|
||||
* @file lv_app_sysmon.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_app_sysmon.h"
|
||||
#if LV_APP_ENABLE != 0 && USE_LV_APP_SYSMON != 0
|
||||
|
||||
#include <stdio.h>
|
||||
#include "misc/os/ptask.h"
|
||||
#include "misc/os/idle.h"
|
||||
#include "lvgl/lv_objx/lv_chart.h"
|
||||
#include "lvgl/lv_app/lv_app_util/lv_app_notice.h"
|
||||
#include "hal/systick/systick.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define CPU_LABEL_COLOR "FF0000"
|
||||
#define MEM_LABEL_COLOR "0000FF"
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/*Application specific data for an instance of this application*/
|
||||
typedef struct
|
||||
{
|
||||
|
||||
}my_app_data_t;
|
||||
|
||||
/*Application specific data a window of this application*/
|
||||
typedef struct
|
||||
{
|
||||
lv_obj_t * chart;
|
||||
lv_chart_dl_t * cpu_dl;
|
||||
lv_chart_dl_t * mem_dl;
|
||||
lv_obj_t * label;
|
||||
}my_win_data_t;
|
||||
|
||||
/*Application specific data for a shortcut of this application*/
|
||||
typedef struct
|
||||
{
|
||||
lv_obj_t * bar_cpu;
|
||||
lv_obj_t * bar_mem;
|
||||
}my_sc_data_t;
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static void my_app_run(lv_app_inst_t * app, void * conf);
|
||||
static void my_app_close(lv_app_inst_t * app);
|
||||
static void my_com_rec(lv_app_inst_t * app_send, lv_app_inst_t * app_rec, lv_app_com_type_t type , const void * data, uint32_t size);
|
||||
static void my_sc_open(lv_app_inst_t * app, lv_obj_t * sc);
|
||||
static void my_sc_close(lv_app_inst_t * app);
|
||||
static void my_win_open(lv_app_inst_t * app, lv_obj_t * win);
|
||||
static void my_win_close(lv_app_inst_t * app);
|
||||
|
||||
static void sysmon_task(void * param);
|
||||
static void lv_app_sysmon_refr(void);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
static lv_app_dsc_t my_app_dsc =
|
||||
{
|
||||
.name = "Sys. monitor",
|
||||
.mode = LV_APP_MODE_NONE,
|
||||
.app_run = my_app_run,
|
||||
.app_close = my_app_close,
|
||||
.com_rec = my_com_rec,
|
||||
.win_open = my_win_open,
|
||||
.win_close = my_win_close,
|
||||
.sc_open = my_sc_open,
|
||||
.sc_close = my_sc_close,
|
||||
.app_data_size = sizeof(my_app_data_t),
|
||||
.sc_data_size = sizeof(my_sc_data_t),
|
||||
.win_data_size = sizeof(my_win_data_t),
|
||||
};
|
||||
|
||||
static uint8_t mem_pct[LV_APP_SYSMON_PNUM];
|
||||
static uint8_t cpu_pct[LV_APP_SYSMON_PNUM];
|
||||
static lv_style_t cpu_bar_bg;
|
||||
static lv_style_t mem_bar_bg;
|
||||
static lv_style_t cpu_bar_indic;
|
||||
static lv_style_t mem_bar_indic;
|
||||
#if USE_DYN_MEM != 0 && DM_CUSTOM == 0
|
||||
static dm_mon_t mem_mon;
|
||||
#endif
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the application
|
||||
* @return pointer to the application descriptor of this application
|
||||
*/
|
||||
const lv_app_dsc_t * lv_app_sysmon_init(void)
|
||||
{
|
||||
ptask_create(sysmon_task, LV_APP_SYSMON_REFR_TIME, PTASK_PRIO_LOW, NULL);
|
||||
|
||||
memset(mem_pct, 0, sizeof(mem_pct));
|
||||
memset(cpu_pct, 0, sizeof(cpu_pct));
|
||||
|
||||
/*Create bar styles for the shortcut*/
|
||||
lv_style_get(LV_STYLE_PRETTY, &cpu_bar_bg);
|
||||
cpu_bar_bg.ccolor = COLOR_MAKE(0x40, 0x00, 0x00);
|
||||
cpu_bar_bg.font = font_get(LV_APP_FONT_MEDIUM);
|
||||
cpu_bar_bg.line_space = 0;
|
||||
cpu_bar_bg.txt_align = 1;
|
||||
cpu_bar_bg.hpad = 0;
|
||||
cpu_bar_bg.vpad = 0;
|
||||
|
||||
memcpy(&mem_bar_bg, &cpu_bar_bg, sizeof(lv_style_t));
|
||||
mem_bar_bg.ccolor = COLOR_MAKE(0x00, 0x40, 0x00);
|
||||
|
||||
lv_style_get(LV_STYLE_PRETTY_COLOR, &cpu_bar_indic);
|
||||
cpu_bar_indic.gcolor = COLOR_MARRON;
|
||||
cpu_bar_indic.mcolor = COLOR_RED;
|
||||
cpu_bar_indic.bcolor = COLOR_BLACK;
|
||||
//cpu_bar_indic.bwidth = 1 * LV_DOWNSCALE;
|
||||
cpu_bar_indic.bopa = OPA_50;
|
||||
cpu_bar_indic.hpad = 0 * LV_DOWNSCALE;
|
||||
cpu_bar_indic.vpad = 0 * LV_DOWNSCALE;
|
||||
|
||||
|
||||
memcpy(&mem_bar_indic, &cpu_bar_indic, sizeof(lv_style_t));
|
||||
mem_bar_indic.gcolor = COLOR_GREEN;
|
||||
mem_bar_indic.mcolor = COLOR_LIME;
|
||||
|
||||
return &my_app_dsc;
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Run an application according to 'app_dsc'
|
||||
* @param app_dsc pointer to an application descriptor
|
||||
* @param conf pointer to a lv_app_sysmon_conf_t structure with configuration data or NULL if unused
|
||||
* @return pointer to the opened application or NULL if any error occurred
|
||||
*/
|
||||
static void my_app_run(lv_app_inst_t * app, void * conf)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Close a running application.
|
||||
* Close the Window and the Shortcut too if opened.
|
||||
* Free all the allocated memory by this application.
|
||||
* @param app pointer to an application
|
||||
*/
|
||||
static void my_app_close(lv_app_inst_t * app)
|
||||
{
|
||||
/*No dynamically allocated data in 'my_app_data'*/
|
||||
}
|
||||
|
||||
/**
|
||||
* Read the data have been sent to this application
|
||||
* @param app_send pointer to an application which sent the message
|
||||
* @param app_rec pointer to an application which is receiving the message
|
||||
* @param type type of data from 'lv_app_com_type_t' enum
|
||||
* @param data pointer to the sent data
|
||||
* @param size length of 'data' in bytes
|
||||
*/
|
||||
static void my_com_rec(lv_app_inst_t * app_send, lv_app_inst_t * app_rec,
|
||||
lv_app_com_type_t type , const void * data, uint32_t size)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Open a shortcut for an application
|
||||
* @param app pointer to an application
|
||||
* @param sc pointer to an object where the application
|
||||
* can create content of the shortcut
|
||||
*/
|
||||
static void my_sc_open(lv_app_inst_t * app, lv_obj_t * sc)
|
||||
{
|
||||
my_sc_data_t * sc_data = app->sc_data;
|
||||
|
||||
cord_t w = lv_obj_get_width(sc) / 5;
|
||||
|
||||
/*Create 2 bars for the CPU and the Memory*/
|
||||
sc_data->bar_cpu = lv_bar_create(sc, NULL);
|
||||
lv_obj_set_size(sc_data->bar_cpu, w, 5 * lv_obj_get_height(sc) / 8);
|
||||
lv_obj_align(sc_data->bar_cpu, NULL, LV_ALIGN_IN_BOTTOM_LEFT, w, - lv_obj_get_height(sc) / 8);
|
||||
lv_obj_set_style(sc_data->bar_cpu, &cpu_bar_bg);
|
||||
lv_bar_set_style_indic(sc_data->bar_cpu, &cpu_bar_indic);
|
||||
lv_obj_set_click(sc_data->bar_cpu, false);
|
||||
lv_bar_set_range(sc_data->bar_cpu, 0, 100);
|
||||
lv_obj_t * label = lv_label_create(sc_data->bar_cpu, NULL);
|
||||
lv_label_set_text(label, "C\nP\nU");
|
||||
lv_obj_align(label, NULL, LV_ALIGN_CENTER, 0, 0);
|
||||
|
||||
sc_data->bar_mem = lv_bar_create(sc, sc_data->bar_cpu);
|
||||
lv_obj_align(sc_data->bar_mem, sc_data->bar_cpu, LV_ALIGN_OUT_RIGHT_MID, w, 0);
|
||||
lv_obj_set_style(sc_data->bar_mem, &mem_bar_bg);
|
||||
lv_bar_set_style_indic(sc_data->bar_mem, &mem_bar_indic);
|
||||
label = lv_label_create(sc_data->bar_mem, NULL);
|
||||
lv_label_set_text(label, "M\nE\nM");
|
||||
lv_obj_align(label, NULL, LV_ALIGN_CENTER, 0, 0);
|
||||
|
||||
lv_app_sysmon_refr();
|
||||
}
|
||||
|
||||
/**
|
||||
* Close the shortcut of an application
|
||||
* @param app pointer to an application
|
||||
*/
|
||||
static void my_sc_close(lv_app_inst_t * app)
|
||||
{
|
||||
/*No dynamically allocated data in 'my_sc_data'*/
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Open the application in a window
|
||||
* @param app pointer to an application
|
||||
* @param win pointer to a window object where
|
||||
* the application can create content
|
||||
*/
|
||||
static void my_win_open(lv_app_inst_t * app, lv_obj_t * win)
|
||||
{
|
||||
my_win_data_t * win_data = app->win_data;
|
||||
|
||||
/*Make the window content responsive*/
|
||||
lv_cont_set_layout(lv_page_get_scrl(lv_win_get_page(win)), LV_CONT_LAYOUT_PRETTY);
|
||||
|
||||
/*Create a chart with two data lines*/
|
||||
win_data->chart = lv_chart_create(win, NULL);
|
||||
lv_obj_set_size(win_data->chart, LV_HOR_RES / 2, LV_VER_RES / 2);
|
||||
lv_obj_set_pos(win_data->chart, LV_DPI / 10, LV_DPI / 10);
|
||||
lv_chart_set_pnum(win_data->chart, LV_APP_SYSMON_PNUM);
|
||||
lv_chart_set_range(win_data->chart, 0, 100);
|
||||
lv_chart_set_type(win_data->chart, LV_CHART_LINE);
|
||||
lv_chart_set_dl_width(win_data->chart, 2 * LV_DOWNSCALE);
|
||||
win_data->cpu_dl = lv_chart_add_data_line(win_data->chart, COLOR_RED);
|
||||
win_data->mem_dl = lv_chart_add_data_line(win_data->chart, COLOR_BLUE);
|
||||
|
||||
uint16_t i;
|
||||
for(i = 0; i < LV_APP_SYSMON_PNUM; i ++) {
|
||||
win_data->cpu_dl->points[i] = cpu_pct[i];
|
||||
win_data->mem_dl->points[i] = mem_pct[i];
|
||||
}
|
||||
|
||||
/*Create a label for the details of Memory and CPU usage*/
|
||||
win_data->label = lv_label_create(win, NULL);
|
||||
lv_label_set_recolor(win_data->label, true);
|
||||
lv_obj_align(win_data->label, win_data->chart, LV_ALIGN_OUT_RIGHT_TOP, LV_DPI / 4, 0);
|
||||
|
||||
|
||||
lv_app_sysmon_refr();
|
||||
}
|
||||
|
||||
/**
|
||||
* Close the window of an application
|
||||
* @param app pointer to an application
|
||||
*/
|
||||
static void my_win_close(lv_app_inst_t * app)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/*--------------------
|
||||
* OTHER FUNCTIONS
|
||||
---------------------*/
|
||||
|
||||
/**
|
||||
* Called periodically to monitor the CPU and memory usage.
|
||||
* It refreshes the shortcuts and windows and also add notifications if there is any problem.
|
||||
* @param param unused
|
||||
*/
|
||||
static void sysmon_task(void * param)
|
||||
{
|
||||
/*Shift out the oldest data*/
|
||||
uint16_t i;
|
||||
for(i = 1; i < LV_APP_SYSMON_PNUM; i++) {
|
||||
mem_pct[i - 1] = mem_pct[i];
|
||||
cpu_pct[i - 1] = cpu_pct[i];
|
||||
}
|
||||
|
||||
/*Get CPU and memory information */
|
||||
uint8_t cpu_busy = 0;
|
||||
#if USE_IDLE != 0 /*Use the more precise idle module if enabled*/
|
||||
cpu_busy = 100 - idle_get();
|
||||
#else
|
||||
cpu_busy = 100 - ptask_get_idle();
|
||||
#endif
|
||||
|
||||
uint8_t mem_used_pct = 0;
|
||||
#if USE_DYN_MEM != 0 && DM_CUSTOM == 0
|
||||
dm_monitor(&mem_mon);
|
||||
mem_used_pct = mem_mon.pct_used;
|
||||
#endif
|
||||
|
||||
/*Add the CPU and memory data*/
|
||||
cpu_pct[LV_APP_SYSMON_PNUM - 1] = cpu_busy;
|
||||
mem_pct[LV_APP_SYSMON_PNUM - 1] = mem_used_pct;
|
||||
|
||||
/*Refresh the shortcuts and windows*/
|
||||
lv_app_sysmon_refr();
|
||||
|
||||
#if USE_DYN_MEM != 0 && DM_CUSTOM == 0
|
||||
|
||||
/*Handle periodic defrag. if enabled*/
|
||||
#if LV_APP_SYSMON_DEFRAG_PERIOD != 0
|
||||
static uint32_t last_defrag = 0;
|
||||
|
||||
if(systick_elaps(last_defrag) > LV_APP_SYSMON_DEFRAG_PERIOD) {
|
||||
dm_defrag();
|
||||
last_defrag = systick_get();
|
||||
}
|
||||
#endif
|
||||
/*Add notifications if something is critical*/
|
||||
static bool mem_warn_report = false;
|
||||
if(mem_mon.size_free < LV_APP_SYSMON_MEM_WARN && mem_warn_report == false) {
|
||||
mem_warn_report = true;
|
||||
lv_app_notice_add("Critically low memory");
|
||||
}
|
||||
|
||||
if(mem_mon.size_free > LV_APP_SYSMON_MEM_WARN) mem_warn_report = false;
|
||||
|
||||
static bool frag_warn_report = false;
|
||||
if(mem_mon.pct_frag > LV_APP_SYSMON_FRAG_WARN) {
|
||||
if(frag_warn_report == false) {
|
||||
frag_warn_report = true;
|
||||
lv_app_notice_add("Critical memory\nfragmentation");
|
||||
|
||||
dm_defrag(); /*Defrag. if the fragmentation is critical*/
|
||||
}
|
||||
}
|
||||
|
||||
if(mem_mon.pct_frag < LV_APP_SYSMON_FRAG_WARN) frag_warn_report = false;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Refresh the shortcuts and windows.
|
||||
*/
|
||||
static void lv_app_sysmon_refr(void)
|
||||
{
|
||||
|
||||
char buf_long[256];
|
||||
char buf_short[128];
|
||||
sprintf(buf_long, "%c%s CPU: %d %%%c\n\n",TXT_RECOLOR_CMD, CPU_LABEL_COLOR, cpu_pct[LV_APP_SYSMON_PNUM - 1], TXT_RECOLOR_CMD);
|
||||
sprintf(buf_short, "CPU: %d %%\n", cpu_pct[LV_APP_SYSMON_PNUM - 1]);
|
||||
|
||||
#if USE_DYN_MEM != 0 && DM_CUSTOM == 0
|
||||
sprintf(buf_long, "%s%c%s MEMORY: %d %%%c\nTotal: %d bytes\nUsed: %d bytes\nFree: %d bytes\nFrag: %d %%",
|
||||
buf_long,
|
||||
TXT_RECOLOR_CMD,
|
||||
MEM_LABEL_COLOR,
|
||||
mem_pct[LV_APP_SYSMON_PNUM - 1],
|
||||
TXT_RECOLOR_CMD,
|
||||
(int)mem_mon.size_total,
|
||||
(int)mem_mon.size_total - mem_mon.size_free, mem_mon.size_free, mem_mon.pct_frag);
|
||||
|
||||
sprintf(buf_short, "%sMem: %d %%\nFrag: %d %%\n",
|
||||
buf_short, mem_pct[LV_APP_SYSMON_PNUM - 1], mem_mon.pct_frag);
|
||||
#else
|
||||
sprintf(buf_long, "%s%c%s MEMORY: N/A%c", buf_long, TXT_RECOLOR_CMD, MEM_LABEL_COLOR, TXT_RECOLOR_CMD);
|
||||
sprintf(buf_short, "%sMem: N/A\nFrag: N/A", buf_short);
|
||||
#endif
|
||||
lv_app_inst_t * app;
|
||||
app = lv_app_get_next(NULL, &my_app_dsc);
|
||||
while(app != NULL) {
|
||||
/*Refresh the windows*/
|
||||
my_win_data_t * win_data = app->win_data;
|
||||
if(win_data != NULL) {
|
||||
lv_label_set_text(win_data->label, buf_long);
|
||||
|
||||
lv_chart_set_next(win_data->chart, win_data->mem_dl, mem_pct[LV_APP_SYSMON_PNUM - 1]);
|
||||
lv_chart_set_next(win_data->chart, win_data->cpu_dl, cpu_pct[LV_APP_SYSMON_PNUM - 1]);
|
||||
|
||||
}
|
||||
/*Refresh the shortcut*/
|
||||
my_sc_data_t * sc_data = app->sc_data;
|
||||
if(sc_data != NULL) {
|
||||
lv_bar_set_value(sc_data->bar_cpu, cpu_pct[LV_APP_SYSMON_PNUM - 1]);
|
||||
lv_bar_set_value(sc_data->bar_mem, mem_pct[LV_APP_SYSMON_PNUM - 1]);
|
||||
}
|
||||
|
||||
lv_app_com_send(app, LV_APP_COM_TYPE_CHAR, buf_short, strlen(buf_short));
|
||||
|
||||
app = lv_app_get_next(app, &my_app_dsc);
|
||||
}
|
||||
}
|
||||
#endif /*LV_APP_ENABLE != 0 && USE_LV_APP_SYSMON != 0*/
|
||||
@@ -1,47 +0,0 @@
|
||||
/**
|
||||
* @file lv_app_example.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LV_APP_SYSMON_H
|
||||
#define LV_APP_SYSMON_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lvgl/lv_app/lv_app.h"
|
||||
|
||||
#if LV_APP_ENABLE != 0 && USE_LV_APP_SYSMON != 0
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
typedef struct
|
||||
{
|
||||
|
||||
}lv_app_sysmon_conf_t;
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
const lv_app_dsc_t * lv_app_sysmon_init(void);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /*LV_APP_ENABLE != 0 && USE_LV_APP_SYSMON != 0*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* LV_APP_SYSMON_H */
|
||||
@@ -1,498 +0,0 @@
|
||||
/**
|
||||
* @file lv_app_terminal.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
|
||||
#include <lv_conf.h>
|
||||
#include <misc/gfx/area.h>
|
||||
#include <lvgl/lv_obj/lv_dispi.h>
|
||||
#include <lvgl/lv_obj/lv_obj.h>
|
||||
#include <lvgl/lv_objx/lv_btn.h>
|
||||
#include <lvgl/lv_objx/lv_cont.h>
|
||||
#include <lvgl/lv_objx/lv_ddlist.h>
|
||||
#include <lvgl/lv_objx/lv_label.h>
|
||||
#include <lvgl/lv_objx/lv_page.h>
|
||||
#include <lvgl/lv_objx/lv_ta.h>
|
||||
#include <misc/gfx/color.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include "lv_app_terminal.h"
|
||||
|
||||
#if LV_APP_ENABLE != 0 && USE_LV_APP_TERMINAL != 0
|
||||
|
||||
#include "lvgl/lv_app/lv_app_util/lv_app_kb.h"
|
||||
#include <stdio.h>
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define OBJ_PAD (LV_DPI / 12)
|
||||
#define AUTO_CONNECT_TCP_DELAY 5000 /*Wait before TCS server connect when the WiFi connect is ready*/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
|
||||
/*Application specific data for an instance of this application*/
|
||||
typedef struct
|
||||
{
|
||||
char txt[LV_APP_TERMINAL_LENGTH + 1];
|
||||
lv_app_com_type_t com_type;
|
||||
lv_app_terminal_format_t format;
|
||||
lv_app_inst_t * last_sender;
|
||||
}my_app_data_t;
|
||||
|
||||
/*Application specific data a window of this application*/
|
||||
typedef struct
|
||||
{
|
||||
lv_obj_t * label;
|
||||
lv_obj_t * ta;
|
||||
lv_obj_t * clear_btn;
|
||||
}my_win_data_t;
|
||||
|
||||
/*Application specific data for a shortcut of this application*/
|
||||
typedef struct
|
||||
{
|
||||
lv_obj_t * label;
|
||||
}my_sc_data_t;
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static void my_app_run(lv_app_inst_t * app, void * conf);
|
||||
static void my_app_close(lv_app_inst_t * app);
|
||||
static void my_com_rec(lv_app_inst_t * app_send, lv_app_inst_t * app_rec, lv_app_com_type_t type , const void * data, uint32_t size);
|
||||
static void my_sc_open(lv_app_inst_t * app, lv_obj_t * sc);
|
||||
static void my_sc_close(lv_app_inst_t * app);
|
||||
static void my_win_open(lv_app_inst_t * app, lv_obj_t * win);
|
||||
static void my_win_close(lv_app_inst_t * app);
|
||||
static void my_conf_open(lv_app_inst_t * app, lv_obj_t * conf_win);
|
||||
|
||||
static void add_data(lv_app_inst_t * app, const void * data, uint16_t data_len);
|
||||
static lv_action_res_t win_ta_rel_action(lv_obj_t * ta, lv_dispi_t * dispi);
|
||||
static lv_action_res_t win_comtype_action(lv_obj_t * ddlist, lv_dispi_t * dispi);
|
||||
static lv_action_res_t win_format_action(lv_obj_t * ddlist, lv_dispi_t * dispi);
|
||||
static lv_action_res_t win_clear_rel_action(lv_obj_t * btn, lv_dispi_t * dispi);
|
||||
static void win_ta_kb_ok_action(lv_obj_t * ta);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
static lv_app_dsc_t my_app_dsc =
|
||||
{
|
||||
.name = "Terminal",
|
||||
.mode = LV_APP_MODE_NONE,
|
||||
.app_run = my_app_run,
|
||||
.app_close = my_app_close,
|
||||
.com_rec = my_com_rec,
|
||||
.win_open = my_win_open,
|
||||
.win_close = my_win_close,
|
||||
.sc_open = my_sc_open,
|
||||
.sc_close = my_sc_close,
|
||||
.conf_open = my_conf_open,
|
||||
.app_data_size = sizeof(my_app_data_t),
|
||||
.sc_data_size = sizeof(my_sc_data_t),
|
||||
.win_data_size = sizeof(my_win_data_t),
|
||||
};
|
||||
|
||||
static const char * com_type_list_txt[] = {"Character", "Integer", "Log", "None", ""};
|
||||
static lv_app_com_type_t com_type_list[] = {LV_APP_COM_TYPE_CHAR, LV_APP_COM_TYPE_INT, LV_APP_COM_TYPE_LOG, LV_APP_COM_TYPE_INV};
|
||||
static const char * txt_format_list_txt[] = {"ASCII", "Hexadecimal", ""};
|
||||
static lv_style_t style_sc_term;
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the application
|
||||
* @return pointer to the application descriptor of this application
|
||||
*/
|
||||
const lv_app_dsc_t * lv_app_terminal_init(void)
|
||||
{
|
||||
lv_style_get(LV_STYLE_PLAIN, &style_sc_term);
|
||||
style_sc_term.line_space = 0;
|
||||
style_sc_term.letter_space = 0;
|
||||
style_sc_term.txt_align = 0;
|
||||
style_sc_term.ccolor = COLOR_WHITE;
|
||||
style_sc_term.mcolor = COLOR_MAKE(0x20, 0x20, 0x20);
|
||||
style_sc_term.gcolor = COLOR_MAKE(0x20, 0x20, 0x20);
|
||||
|
||||
return &my_app_dsc;
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Run an application according to 'app_dsc'
|
||||
* @param app_dsc pointer to an application descriptor
|
||||
* @param conf pointer to a lv_app_example_conf_t structure with configuration data or NULL if unused
|
||||
* @return pointer to the opened application or NULL if any error occurred
|
||||
*/
|
||||
static void my_app_run(lv_app_inst_t * app, void * conf)
|
||||
{
|
||||
/*Initialize the application*/
|
||||
my_app_data_t * app_data = app->app_data;
|
||||
|
||||
if(conf != NULL) {
|
||||
app_data->com_type = ((lv_app_terminal_conf_t * ) conf)->com_type;
|
||||
app_data->format = ((lv_app_terminal_conf_t * ) conf)->format;
|
||||
} else {
|
||||
app_data->com_type = LV_APP_COM_TYPE_CHAR;
|
||||
app_data->format = LV_APP_TERMINAL_FORMAT_ASCII;
|
||||
}
|
||||
|
||||
app_data->last_sender = NULL;
|
||||
|
||||
memset(app_data->txt, 0, sizeof(app_data->txt));
|
||||
}
|
||||
|
||||
/**
|
||||
* Close a running application.
|
||||
* Close the Window and the Shortcut too if opened.
|
||||
* Free all the allocated memory by this application.
|
||||
* @param app pointer to an application
|
||||
*/
|
||||
static void my_app_close(lv_app_inst_t * app)
|
||||
{
|
||||
/*No dynamically allocated data in 'my_app_data'*/
|
||||
}
|
||||
|
||||
/**
|
||||
* Read the data have been sent to this applicationstring
|
||||
* @param app_send pointer to an application which sent the message
|
||||
* @param app_rec pointer to an application which is receiving the message
|
||||
* @param type type of data from 'lv_app_com_type_t' enum
|
||||
* @param data pointer to the sent data
|
||||
* @param size length of 'data' in bytes
|
||||
*/
|
||||
static void my_com_rec(lv_app_inst_t * app_send, lv_app_inst_t * app_rec,
|
||||
lv_app_com_type_t type , const void * data, uint32_t size)
|
||||
{
|
||||
my_app_data_t * app_data = app_rec->app_data;
|
||||
|
||||
/*Add the received data if the type is matches*/
|
||||
if(type == app_data->com_type) {
|
||||
|
||||
/*Insert the name of the sender application if it is not the last*/
|
||||
if(app_data->last_sender != app_send) {
|
||||
add_data(app_rec, "\n@", 2);
|
||||
add_data(app_rec, app_send->name, strlen(app_send->name));
|
||||
add_data(app_rec, "\n", 1);
|
||||
}
|
||||
|
||||
if(app_data->format == LV_APP_TERMINAL_FORMAT_HEX) {
|
||||
char hex_buf[8];
|
||||
const char * data_buf = data;
|
||||
uint32_t i;
|
||||
for(i = 0; i < size; i++) {
|
||||
sprintf(hex_buf, "%02x", data_buf[i]);
|
||||
add_data(app_rec, hex_buf, 2);
|
||||
}
|
||||
} else {
|
||||
add_data(app_rec, data, size);
|
||||
}
|
||||
}
|
||||
|
||||
app_data->last_sender = app_send;
|
||||
}
|
||||
|
||||
/**
|
||||
* Open a shortcut for an application
|
||||
* @param app pointer to an application
|
||||
* @param sc pointer to an object where the application
|
||||
* can create content of the shortcut
|
||||
*/
|
||||
static void my_sc_open(lv_app_inst_t * app, lv_obj_t * sc)
|
||||
{
|
||||
my_sc_data_t * sc_data = app->sc_data;
|
||||
my_app_data_t * app_data = app->app_data;
|
||||
|
||||
/*Create a dark background*/
|
||||
lv_obj_t * txt_bg = lv_obj_create(sc, NULL);
|
||||
lv_obj_set_size(txt_bg, 7 * LV_APP_SC_WIDTH / 8 , app->sc->cords.y2 - app->sc_title->cords.y2 - 10 * LV_DOWNSCALE);
|
||||
lv_obj_set_style(txt_bg, &style_sc_term);
|
||||
lv_obj_align(txt_bg, app->sc_title, LV_ALIGN_OUT_BOTTOM_MID, 0, 3 * LV_DOWNSCALE);
|
||||
lv_obj_set_click(txt_bg, false);
|
||||
|
||||
/*Add a text with the text of the terminal*/
|
||||
sc_data->label = lv_label_create(txt_bg, NULL);
|
||||
lv_label_set_long_mode(sc_data->label, LV_LABEL_LONG_BREAK);
|
||||
lv_obj_set_width(sc_data->label, lv_obj_get_width(txt_bg) - LV_APP_SC_WIDTH / 8);
|
||||
lv_label_set_text_static(sc_data->label, app_data->txt);
|
||||
lv_obj_align(sc_data->label, txt_bg, LV_ALIGN_IN_BOTTOM_MID, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Close the shortcut of an application
|
||||
* @param app pointer to an application
|
||||
*/
|
||||
static void my_sc_close(lv_app_inst_t * app)
|
||||
{
|
||||
/*No dynamically allocated data in 'my_sc_data'*/
|
||||
}
|
||||
|
||||
/**
|
||||
* Open the application in a window
|
||||
* @param app pointer to an application
|
||||
* @param win pointer to a window object where
|
||||
* the application can create content
|
||||
*/
|
||||
static void my_win_open(lv_app_inst_t * app, lv_obj_t * win)
|
||||
{
|
||||
my_win_data_t * win_data = app->win_data;
|
||||
my_app_data_t * app_data = app->app_data;
|
||||
|
||||
/*Make the window content responsive*/
|
||||
lv_cont_set_layout(lv_page_get_scrl(lv_win_get_page(win)), LV_CONT_LAYOUT_PRETTY);
|
||||
|
||||
/*Create a label for the text of the terminal*/
|
||||
win_data->label = lv_label_create(win, NULL);
|
||||
lv_label_set_long_mode(win_data->label, LV_LABEL_LONG_BREAK);
|
||||
lv_obj_set_width(win_data->label, lv_win_get_width(win));
|
||||
lv_label_set_text_static(win_data->label, app_data->txt); /*Use the app. data text directly*/
|
||||
|
||||
/*Create a text area. Text can be added to the terminal from here by app. keyboard.*/
|
||||
win_data->ta = lv_ta_create(win, NULL);
|
||||
lv_obj_set_size(win_data->ta, 3 * LV_HOR_RES / 5, LV_VER_RES / 4);
|
||||
lv_obj_set_free_p(win_data->ta, app);
|
||||
lv_page_set_rel_action(win_data->ta, win_ta_rel_action);
|
||||
lv_page_glue_obj(win_data->ta, true);
|
||||
lv_ta_set_text(win_data->ta, "");
|
||||
|
||||
/*Create a clear button*/
|
||||
win_data->clear_btn = lv_btn_create(win, NULL);
|
||||
lv_cont_set_fit(win_data->clear_btn, true, true);
|
||||
lv_obj_set_free_p(win_data->clear_btn, app);
|
||||
lv_page_glue_obj(win_data->ta, true);
|
||||
lv_btn_set_rel_action(win_data->clear_btn, win_clear_rel_action);
|
||||
lv_obj_t * btn_label = lv_label_create(win_data->clear_btn, NULL);
|
||||
lv_label_set_text(btn_label, "Clear");
|
||||
|
||||
/*Align the window to see the text area on the bottom*/
|
||||
lv_obj_t * page = lv_win_get_page(app->win);
|
||||
lv_obj_align(lv_page_get_scrl(page), NULL, LV_ALIGN_IN_BOTTOM_LEFT, 0, - LV_VER_RES);
|
||||
}
|
||||
|
||||
/**
|
||||
* Close the window of an application
|
||||
* @param app pointer to an application
|
||||
*/
|
||||
static void my_win_close(lv_app_inst_t * app)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Create objects to configure the applications
|
||||
* @param app pointer to an application which settings should be created
|
||||
* @param conf_win pointer to a window where the objects can be created
|
||||
* (the window has the proper layout)
|
||||
*/
|
||||
static void my_conf_open(lv_app_inst_t * app, lv_obj_t * conf_win)
|
||||
{
|
||||
my_app_data_t * app_data = app->app_data;
|
||||
|
||||
lv_obj_t * label;
|
||||
label = lv_label_create(conf_win, NULL);
|
||||
lv_label_set_text(label, "Communication type");
|
||||
|
||||
lv_obj_t * ddl;
|
||||
ddl = lv_ddlist_create(conf_win, NULL);
|
||||
lv_obj_set_free_p(ddl, app);
|
||||
lv_ddlist_set_options(ddl, com_type_list_txt);
|
||||
lv_ddlist_set_action(ddl, win_comtype_action);
|
||||
lv_ddlist_set_selected(ddl, app_data->com_type);
|
||||
|
||||
label = lv_label_create(conf_win, label);
|
||||
lv_label_set_text(label, "\nText format"); /*First '\n' keeps space from the list above*/
|
||||
ddl = lv_ddlist_create(conf_win, ddl);
|
||||
lv_ddlist_set_options(ddl, txt_format_list_txt);
|
||||
lv_ddlist_set_selected(ddl, app_data->format);
|
||||
lv_ddlist_set_action(ddl, win_format_action);
|
||||
}
|
||||
|
||||
/*--------------------
|
||||
* OTHER FUNCTIONS
|
||||
---------------------*/
|
||||
|
||||
/**
|
||||
* Called when the Text area is released to open the app. keybard
|
||||
* @param ta pointer to the text area
|
||||
* @param dispi pointer to the caller display input
|
||||
* @return LV_ACTION_RES_OK because the text area is not deleted
|
||||
*/
|
||||
static lv_action_res_t win_ta_rel_action(lv_obj_t * ta, lv_dispi_t * dispi)
|
||||
{
|
||||
lv_app_kb_open(ta, LV_APP_KB_MODE_TXT | LV_APP_KB_MODE_WIN_RESIZE, NULL, win_ta_kb_ok_action);
|
||||
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when an option is chosen in the communication type drop down list on the configuration window
|
||||
* @param ddl pointer to the drop down list
|
||||
* @param dispi pointer to the caller display input
|
||||
* @return LV_ACTION_RES_OK because the list is not deleted
|
||||
*/
|
||||
static lv_action_res_t win_comtype_action(lv_obj_t * ddlist, lv_dispi_t * dispi)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(ddlist);
|
||||
my_app_data_t * app_data = app->app_data;
|
||||
|
||||
app_data->com_type = com_type_list[lv_ddlist_get_selected(ddlist)];
|
||||
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when an option is chosen in the format drop down list on the configuration window
|
||||
* @param ddl pointer to the drop down list
|
||||
* @param dispi pointer to the caller display input
|
||||
* @return LV_ACTION_RES_OK because the list is not deleted
|
||||
*/
|
||||
static lv_action_res_t win_format_action(lv_obj_t * ddlist, lv_dispi_t * dispi)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(ddlist);
|
||||
my_app_data_t * app_data = app->app_data;
|
||||
uint16_t opt = lv_ddlist_get_selected(ddlist);
|
||||
if(strcmp(txt_format_list_txt[opt], "Hexadecimal") == 0) {
|
||||
app_data->format = LV_APP_TERMINAL_FORMAT_HEX;
|
||||
} else if (strcmp(txt_format_list_txt[opt], "ASCII") == 0) {
|
||||
app_data->format = LV_APP_TERMINAL_FORMAT_ASCII;
|
||||
}
|
||||
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Called when the Clear button is released to clear the text of the terminal
|
||||
* @param btn pointer to the clear button
|
||||
* @param dispi pointer to the caller display input
|
||||
* @return LV_ACTION_RES_OK because the button is not deleted
|
||||
*/
|
||||
static lv_action_res_t win_clear_rel_action(lv_obj_t * btn, lv_dispi_t * dispi)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(btn);
|
||||
my_app_data_t * app_data = app->app_data;
|
||||
my_win_data_t * win_data = app->win_data;
|
||||
my_sc_data_t * sc_data = app->sc_data;
|
||||
|
||||
app_data->txt[0] = '\0';
|
||||
|
||||
if(sc_data != NULL) {
|
||||
lv_label_set_text_static(sc_data->label, app_data->txt);
|
||||
lv_obj_align(sc_data->label, NULL, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0);
|
||||
}
|
||||
|
||||
if(win_data != NULL) {
|
||||
lv_label_set_text_static(win_data->label, app_data->txt);
|
||||
lv_obj_t * page = lv_win_get_page(app->win);
|
||||
lv_obj_align(lv_page_get_scrl(page), NULL, LV_ALIGN_IN_BOTTOM_LEFT, 0, - LV_VER_RES);
|
||||
}
|
||||
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the 'Ok' button of the keyboard in the window
|
||||
* is pressed to write to the Terminal
|
||||
* @param ta pointer to the Text area in the window
|
||||
*/
|
||||
static void win_ta_kb_ok_action(lv_obj_t * ta)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(ta);
|
||||
my_app_data_t * app_data = app->app_data;
|
||||
const char * ta_txt = lv_ta_get_txt(ta);
|
||||
uint32_t ta_txt_len = strlen(ta_txt);
|
||||
if(app_data->txt[0] != '\0') add_data(app, "\n", 1);
|
||||
add_data(app, ">", 1);
|
||||
add_data(app, ta_txt, ta_txt_len);
|
||||
|
||||
lv_app_com_send(app, app_data->com_type, ta_txt, ta_txt_len);
|
||||
|
||||
lv_ta_set_text(ta, "");
|
||||
app_data->last_sender = NULL; /*Now the least data in the terminal is from this app*/
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Add data to the terminal
|
||||
* @param app pointer to a Terminal application
|
||||
* @param data pointer to the data
|
||||
* @param data_len length of 'data' in bytes
|
||||
*/
|
||||
static void add_data(lv_app_inst_t * app, const void * data, uint16_t data_len)
|
||||
{
|
||||
my_app_data_t * app_data = app->app_data;
|
||||
uint16_t old_len = strlen(app_data->txt);
|
||||
const char * txt = data;
|
||||
|
||||
/*IF the data is longer then the terminal ax size show the last part of data*/
|
||||
if(data_len > LV_APP_TERMINAL_LENGTH) {
|
||||
txt += (data_len - LV_APP_TERMINAL_LENGTH);
|
||||
data_len = LV_APP_TERMINAL_LENGTH;
|
||||
old_len = 0;
|
||||
}
|
||||
/*If the text become too long 'forget' the oldest lines*/
|
||||
else if(old_len + data_len > LV_APP_TERMINAL_LENGTH) {
|
||||
uint16_t new_start;
|
||||
for(new_start = 0; new_start < old_len; new_start++) {
|
||||
if(app_data->txt[new_start] == '\n') {
|
||||
/*If there is enough space break*/
|
||||
if(new_start >= data_len) {
|
||||
/*Ignore line breaks*/
|
||||
while(app_data->txt[new_start] == '\n' || app_data->txt[new_start] == '\r') new_start++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* If it wasn't able to make enough space on line breaks
|
||||
* simply forget the oldest characters*/
|
||||
if(new_start == old_len) {
|
||||
new_start = old_len - (LV_APP_TERMINAL_LENGTH - data_len);
|
||||
}
|
||||
/*Move the remaining text to the beginning*/
|
||||
uint16_t j;
|
||||
for(j = new_start; j < old_len; j++) {
|
||||
app_data->txt[j - new_start] = app_data->txt[j];
|
||||
}
|
||||
old_len = old_len - new_start;
|
||||
app_data->txt[old_len] = '\0';
|
||||
|
||||
}
|
||||
|
||||
memcpy(&app_data->txt[old_len], txt, data_len);
|
||||
app_data->txt[old_len + data_len] = '\0';
|
||||
|
||||
my_win_data_t * win_data = app->win_data;
|
||||
my_sc_data_t * sc_data = app->sc_data;
|
||||
|
||||
if(win_data != NULL) {
|
||||
lv_label_set_text_static(win_data->label, app_data->txt);
|
||||
lv_obj_t * page = lv_win_get_page(app->win);
|
||||
lv_obj_align(lv_page_get_scrl(page), NULL, LV_ALIGN_IN_BOTTOM_LEFT, 0, - LV_VER_RES);
|
||||
}
|
||||
|
||||
/*Set the last line on the shortcut*/
|
||||
if(sc_data != NULL) {
|
||||
lv_label_set_text_static(sc_data->label, app_data->txt);
|
||||
lv_obj_align(sc_data->label, NULL, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /*LV_APP_ENABLE != 0 && USE_LV_APP_TERMINAL != 0*/
|
||||
@@ -1,54 +0,0 @@
|
||||
/**
|
||||
* @file lv_app_terminal.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LV_APP_TERMINAL_H
|
||||
#define LV_APP_TERMINAL_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lvgl/lv_app/lv_app.h"
|
||||
|
||||
#if LV_APP_ENABLE != 0 && USE_LV_APP_TERMINAL != 0
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
typedef enum
|
||||
{
|
||||
LV_APP_TERMINAL_FORMAT_ASCII,
|
||||
LV_APP_TERMINAL_FORMAT_HEX,
|
||||
}lv_app_terminal_format_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
lv_app_terminal_format_t format; /*Data display format*/
|
||||
lv_app_com_type_t com_type; /*The listened communication type (channel) */
|
||||
}lv_app_terminal_conf_t;
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
const lv_app_dsc_t * lv_app_terminal_init(void);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /*LV_APP_ENABLE != 0 && USE_LV_APP_TERMINAL != 0*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* LV_APP_TERMINAL_H */
|
||||
@@ -1,593 +0,0 @@
|
||||
/**
|
||||
* @file lv_app_wifi.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_app_wifi.h"
|
||||
#if LV_APP_ENABLE != 0 && USE_LV_APP_WIFI != 0
|
||||
|
||||
#include "../lv_app/lv_app_util/lv_app_kb.h"
|
||||
#include "hal/wifi/wifi.h"
|
||||
#include "misc/os/ptask.h"
|
||||
#include "hal/systick/systick.h"
|
||||
#include "misc/comm/wifimng.h"
|
||||
#include "misc/fs/fat32/integer.h"
|
||||
#include <stdio.h>
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define SSID_LIST_MAX_LENGTH 512
|
||||
#define WIFI_MONITOR_PERIOD 1000 /*ms*/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/*Application specific data for an instance of this application*/
|
||||
typedef struct
|
||||
{
|
||||
char set_ssid[64];
|
||||
char set_pwd[64];
|
||||
char set_ip[32];
|
||||
char set_port[16];
|
||||
uint8_t * last_msg_dp;
|
||||
uint16_t last_msg_size;
|
||||
}my_app_data_t;
|
||||
|
||||
/*Application specific data a window of this application*/
|
||||
typedef struct
|
||||
{
|
||||
lv_obj_t * list;
|
||||
lv_obj_t * title;
|
||||
lv_obj_t * netw_ssid_ta;
|
||||
lv_obj_t * netw_pwd_ta;
|
||||
lv_obj_t * tcp_ip_ta;
|
||||
lv_obj_t * tcp_port_ta;
|
||||
}my_win_data_t;
|
||||
|
||||
/*Application specific data for a shortcut of this application*/
|
||||
typedef struct
|
||||
{
|
||||
lv_obj_t * label;
|
||||
}my_sc_data_t;
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static void my_app_run(lv_app_inst_t * app, void * conf);
|
||||
static void my_app_close(lv_app_inst_t * app);
|
||||
static void my_com_rec(lv_app_inst_t * app_send, lv_app_inst_t * app_rec, lv_app_com_type_t type , const void * data, uint32_t size);
|
||||
static void my_sc_open(lv_app_inst_t * app, lv_obj_t * sc);
|
||||
static void my_sc_close(lv_app_inst_t * app);
|
||||
static void my_win_open(lv_app_inst_t * app, lv_obj_t * win);
|
||||
static void my_win_close(lv_app_inst_t * app);
|
||||
|
||||
static void wifi_state_monitor_task(void * param);
|
||||
|
||||
static lv_action_res_t netw_list_rel_action(lv_obj_t * btn, lv_dispi_t * dispi);
|
||||
static lv_action_res_t netw_con_rel_action(lv_obj_t * btn, lv_dispi_t* dispi);
|
||||
static lv_action_res_t netw_ssid_rel_action( lv_obj_t * ta, lv_dispi_t* dispi);
|
||||
static lv_action_res_t netw_pwd_rel_action( lv_obj_t * ta, lv_dispi_t* dispi);
|
||||
static lv_action_res_t tcp_ip_rel_action( lv_obj_t * ta, lv_dispi_t* dispi);
|
||||
static lv_action_res_t tcp_port_rel_action( lv_obj_t * ta, lv_dispi_t* dispi);
|
||||
static lv_action_res_t wifi_ap_select_action( lv_obj_t * ddlist, lv_dispi_t* dispi);
|
||||
|
||||
static void netw_ssid_kb_ok(lv_obj_t * ta);
|
||||
static void netw_ssid_kb_close(lv_obj_t * ta);
|
||||
static void netw_pwd_kb_ok(lv_obj_t * ta);
|
||||
static void netw_pwd_kb_close(lv_obj_t * ta);
|
||||
static void tcp_ip_kb_ok(lv_obj_t * ta);
|
||||
static void tcp_ip_kb_close(lv_obj_t * ta);
|
||||
static void tcp_port_kb_ok(lv_obj_t * ta);
|
||||
static void tcp_port_kb_close(lv_obj_t * ta);
|
||||
|
||||
static void list_cb(wifi_state_t state, const char * txt);
|
||||
static void tcp_transf_cb(wifi_state_t state, const char * txt);
|
||||
|
||||
static void win_title_refr(void);
|
||||
|
||||
static void save_conf(lv_app_inst_t * app);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
static lv_app_dsc_t my_app_dsc =
|
||||
{
|
||||
.name = "WiFi",
|
||||
.mode = LV_APP_MODE_NONE,
|
||||
.app_run = my_app_run,
|
||||
.app_close = my_app_close,
|
||||
.com_rec = my_com_rec,
|
||||
.win_open = my_win_open,
|
||||
.win_close = my_win_close,
|
||||
.sc_open = my_sc_open,
|
||||
.sc_close = my_sc_close,
|
||||
.app_data_size = sizeof(my_app_data_t),
|
||||
.sc_data_size = sizeof(my_sc_data_t),
|
||||
.win_data_size = sizeof(my_win_data_t),
|
||||
};
|
||||
|
||||
static char def_ssid[64];
|
||||
static char def_pwd[64];
|
||||
static char def_ip[32];
|
||||
static char def_port[16];
|
||||
|
||||
static char ssid_list[SSID_LIST_MAX_LENGTH];
|
||||
static lv_app_inst_t * app_act_com;
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the application
|
||||
* @return pointer to the application descriptor of this application
|
||||
*/
|
||||
const lv_app_dsc_t * lv_app_wifi_init(void)
|
||||
{
|
||||
strcpy(ssid_list, "");
|
||||
#ifdef LV_APP_WIFI_CONF_PATH
|
||||
fs_file_t f;
|
||||
fs_res_t res;
|
||||
|
||||
res = fs_open(&f, LV_APP_WIFI_CONF_PATH, FS_MODE_RD);
|
||||
if(res == FS_RES_NOT_EX) {
|
||||
res = fs_open(&f, LV_APP_WIFI_CONF_PATH, FS_MODE_WR | FS_MODE_RD);
|
||||
if(res == FS_RES_OK) {
|
||||
const char * def_conf = "ssid\npwd\n100.101.102.103\n1234";
|
||||
fs_write(&f, def_conf, strlen(def_conf) + 1, NULL);
|
||||
fs_seek(&f, 0);
|
||||
}
|
||||
}
|
||||
|
||||
if(res == FS_RES_OK) {
|
||||
volatile char buf[256];
|
||||
volatile uint32_t rn;
|
||||
fs_read(&f, (char *)buf, sizeof(buf) - 1, (uint32_t *)&rn);
|
||||
|
||||
volatile uint16_t i;
|
||||
volatile uint16_t j = 0;
|
||||
volatile uint8_t line_cnt = 0;
|
||||
for(i = 0; i < rn; i++) {
|
||||
if(buf[i] != '\n') {
|
||||
if(line_cnt == 0) def_ssid[j] = buf[i];
|
||||
if(line_cnt == 1) def_pwd[j] = buf[i];
|
||||
if(line_cnt == 2) def_ip[j] = buf[i];
|
||||
if(line_cnt == 3) def_port[j] = buf[i];
|
||||
j++;
|
||||
} else {
|
||||
if(line_cnt == 0) def_ssid[j] = '\0';
|
||||
if(line_cnt == 1) def_pwd[j] = '\0';
|
||||
if(line_cnt == 2) def_ip[j] = '\0';
|
||||
if(line_cnt == 3) def_port[j] = '\0';
|
||||
j = 0;
|
||||
line_cnt ++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fs_close(&f);
|
||||
|
||||
} else {
|
||||
lv_app_notice_add("SD card error");
|
||||
}
|
||||
#else
|
||||
strcpy(def_ssid, LV_APP_WIFI_SSID_DEF);
|
||||
strcpy(def_pwd, LV_APP_WIFI_PWD_DEF);
|
||||
strcpy(def_ip, LV_APP_WIFI_IP_DEF);
|
||||
strcpy(def_port, LV_APP_WIFI_PORT_DEF);
|
||||
#endif
|
||||
|
||||
#if LV_APP_WIFI_AUTO_CONNECT != 0
|
||||
wifimng_set_last_netw(def_ssid, def_pwd);
|
||||
wifimng_set_last_tcp(def_ip, def_port);
|
||||
#endif
|
||||
|
||||
ptask_create(wifi_state_monitor_task, WIFI_MONITOR_PERIOD, PTASK_PRIO_LOW, NULL);
|
||||
|
||||
return &my_app_dsc;
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Run an application according to 'app_dsc'
|
||||
* @param app_dsc pointer to an application descriptor
|
||||
* @param conf pointer to a lv_app_example_conf_t structure with configuration data or NULL if unused
|
||||
* @return pointer to the opened application or NULL if any error occurred
|
||||
*/
|
||||
static void my_app_run(lv_app_inst_t * app, void * conf)
|
||||
{
|
||||
/*Initialize the application*/
|
||||
my_app_data_t * adata = app->app_data;
|
||||
strcpy(adata->set_ssid, def_ssid);
|
||||
strcpy(adata->set_pwd, def_pwd);
|
||||
strcpy(adata->set_ip, def_ip);
|
||||
strcpy(adata->set_port, def_port);
|
||||
adata->last_msg_dp = NULL;
|
||||
adata->last_msg_size = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Close a running application.
|
||||
* Close the Window and the Shortcut too if opened.
|
||||
* Free all the allocated memory by this application.
|
||||
* @param app pointer to an application
|
||||
*/
|
||||
static void my_app_close(lv_app_inst_t * app)
|
||||
{
|
||||
/*No dynamically allocated data in 'my_app_data'*/
|
||||
}
|
||||
|
||||
/**
|
||||
* Read the data have been sent to this application
|
||||
* @param app_send pointer to an application which sent the message
|
||||
* @param app_rec pointer to an application which is receiving the message
|
||||
* @param type type of data from 'lv_app_com_type_t' enum
|
||||
* @param data pointer to the sent data
|
||||
* @param size length of 'data' in bytes
|
||||
*/
|
||||
static void my_com_rec(lv_app_inst_t * app_send, lv_app_inst_t * app_rec,
|
||||
lv_app_com_type_t type , const void * data, uint32_t size)
|
||||
{
|
||||
if(type == LV_APP_COM_TYPE_CHAR) { /*data: string*/
|
||||
app_act_com = app_rec;
|
||||
my_app_data_t * adata = app_act_com->app_data;
|
||||
if(adata->last_msg_dp != NULL) dm_free(adata->last_msg_dp);
|
||||
|
||||
adata->last_msg_dp = dm_alloc(size);
|
||||
memcpy(adata->last_msg_dp, data, size);
|
||||
adata->last_msg_size = size;
|
||||
|
||||
wifi_tcp_transf(data, size, tcp_transf_cb);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Open a shortcut for an application
|
||||
* @param app pointer to an application
|
||||
* @param sc pointer to an object where the application
|
||||
* can create content of the shortcut
|
||||
*/
|
||||
static void my_sc_open(lv_app_inst_t * app, lv_obj_t * sc)
|
||||
{
|
||||
my_sc_data_t * sc_data = app->sc_data;
|
||||
|
||||
sc_data->label = lv_label_create(sc, NULL);
|
||||
lv_label_set_text(sc_data->label, "Empty");
|
||||
lv_obj_align(sc_data->label, NULL, LV_ALIGN_CENTER, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Close the shortcut of an application
|
||||
* @param app pointer to an application
|
||||
*/
|
||||
static void my_sc_close(lv_app_inst_t * app)
|
||||
{
|
||||
/*No dynamically allocated data in 'my_sc_data'*/
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Open the application in a window
|
||||
* @param app pointer to an application
|
||||
* @param win pointer to a window object where
|
||||
* the application can create content
|
||||
*/
|
||||
static void my_win_open(lv_app_inst_t * app, lv_obj_t * win)
|
||||
{
|
||||
my_app_data_t * adata = app->app_data;
|
||||
my_win_data_t * wdata = app->win_data;
|
||||
|
||||
wdata->title = lv_label_create(win, NULL);
|
||||
|
||||
wdata->list = lv_ddlist_create(win, NULL);
|
||||
lv_obj_set_free_p(wdata->list, app);
|
||||
lv_ddlist_set_options_str(wdata->list, ssid_list);
|
||||
lv_ddlist_set_action(wdata->list, wifi_ap_select_action);
|
||||
|
||||
lv_obj_t * list_btn = lv_btn_create(win, NULL);
|
||||
lv_obj_set_free_p(list_btn, app);
|
||||
lv_btn_set_rel_action(list_btn, netw_list_rel_action);
|
||||
lv_obj_t * label = lv_label_create(list_btn, NULL);
|
||||
lv_label_set_text(label, "List\nrefresh");
|
||||
|
||||
lv_obj_t * ta_cont = lv_cont_create(win, NULL);
|
||||
lv_cont_set_fit(ta_cont, true, true);
|
||||
lv_cont_set_layout(ta_cont, LV_CONT_LAYOUT_COL_L);
|
||||
lv_obj_set_style(ta_cont, lv_style_get(LV_STYLE_TRANSP_TIGHT, NULL));
|
||||
|
||||
wdata->netw_ssid_ta = lv_ta_create(ta_cont, NULL);
|
||||
lv_cont_set_fit(wdata->netw_ssid_ta, false, true);
|
||||
lv_obj_set_free_p(wdata->netw_ssid_ta, app);
|
||||
lv_page_set_rel_action(wdata->netw_ssid_ta, netw_ssid_rel_action);
|
||||
lv_ta_set_text(wdata->netw_ssid_ta, adata->set_ssid);
|
||||
lv_ta_set_cursor_show(wdata->netw_ssid_ta, false);
|
||||
|
||||
wdata->netw_pwd_ta = lv_ta_create(ta_cont, wdata->netw_ssid_ta);
|
||||
lv_page_set_rel_action(wdata->netw_pwd_ta, netw_pwd_rel_action);
|
||||
lv_ta_set_text(wdata->netw_pwd_ta, adata->set_pwd);
|
||||
|
||||
wdata->tcp_ip_ta = lv_ta_create(ta_cont, wdata->netw_ssid_ta);
|
||||
lv_page_set_rel_action(wdata->tcp_ip_ta, tcp_ip_rel_action);
|
||||
lv_ta_set_text(wdata->tcp_ip_ta, adata->set_ip);
|
||||
|
||||
wdata->tcp_port_ta = lv_ta_create(ta_cont, wdata->netw_ssid_ta);
|
||||
lv_page_set_rel_action(wdata->tcp_port_ta, tcp_port_rel_action);
|
||||
lv_ta_set_text(wdata->tcp_port_ta, adata->set_port);
|
||||
|
||||
|
||||
lv_obj_t * con_btn = lv_btn_create(win, NULL);
|
||||
lv_obj_set_free_p(con_btn, app);
|
||||
lv_btn_set_rel_action(con_btn, netw_con_rel_action);
|
||||
label = lv_label_create(con_btn, NULL);
|
||||
lv_label_set_text(label, "Connect");
|
||||
|
||||
|
||||
lv_cont_set_layout(lv_page_get_scrl(lv_win_get_page(win)), LV_CONT_LAYOUT_PRETTY);
|
||||
|
||||
win_title_refr();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Close the window of an application
|
||||
* @param app pointer to an application
|
||||
*/
|
||||
static void my_win_close(lv_app_inst_t * app)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/*--------------------
|
||||
* OTHER FUNCTIONS
|
||||
---------------------*/
|
||||
|
||||
static void wifi_state_monitor_task(void * param)
|
||||
{
|
||||
static wifimng_state_t state_prev = WIFIMNG_STATE_WAIT;
|
||||
wifimng_state_t state_act = wifimng_get_state();
|
||||
|
||||
if(state_prev != state_act && state_act == WIFIMNG_STATE_READY) {
|
||||
lv_app_notice_add("WiFi connected to:\n%s\n%s:%s",
|
||||
wifimng_get_last_ssid(), wifimng_get_last_ip(), wifimng_get_last_port());
|
||||
win_title_refr();
|
||||
}
|
||||
|
||||
/* The wifi should be busy if there is sg. to send.
|
||||
* It means fail during last send. Try again*/
|
||||
if(app_act_com != NULL) {
|
||||
if(wifi_busy() == false && state_act == WIFIMNG_STATE_READY) {
|
||||
/*Try to send the message again*/
|
||||
lv_app_notice_add("Resend WiFi message");
|
||||
my_app_data_t * adata = app_act_com->app_data;
|
||||
wifi_tcp_transf(adata->last_msg_dp, adata->last_msg_size, tcp_transf_cb);
|
||||
}
|
||||
}
|
||||
state_prev = state_act;
|
||||
}
|
||||
|
||||
static lv_action_res_t netw_list_rel_action(lv_obj_t * btn, lv_dispi_t* dispi)
|
||||
{
|
||||
wifi_state_t ret;
|
||||
ret = wifi_netw_list(list_cb);
|
||||
|
||||
if(ret == WIFI_STATE_OK) {
|
||||
lv_app_notice_add("Listing WiFi networks");
|
||||
} else {
|
||||
lv_app_notice_add("Cannot list networks\nWiFi was busy. Try again");
|
||||
|
||||
}
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
static lv_action_res_t netw_con_rel_action(lv_obj_t * btn, lv_dispi_t* dispi)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(btn);
|
||||
my_app_data_t * adata = app->app_data;
|
||||
|
||||
wifimng_set_last_netw(adata->set_ssid, adata->set_pwd);
|
||||
wifimng_set_last_tcp(adata->set_ip, adata->set_port);
|
||||
wifimng_reconnect();
|
||||
save_conf(app);
|
||||
lv_app_notice_add("Connecting to WiFi network\n%s, %s:%s",
|
||||
adata->set_ssid, adata->set_ip, adata->set_port);
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
static lv_action_res_t netw_ssid_rel_action( lv_obj_t * ta, lv_dispi_t* dispi)
|
||||
{
|
||||
lv_app_kb_open(ta, LV_APP_KB_MODE_TXT | LV_APP_KB_MODE_WIN_RESIZE | LV_APP_KB_MODE_CUR_MANAGE, netw_ssid_kb_close ,netw_ssid_kb_ok);
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
static lv_action_res_t netw_pwd_rel_action( lv_obj_t * ta, lv_dispi_t* dispi)
|
||||
{
|
||||
lv_app_kb_open(ta, LV_APP_KB_MODE_TXT | LV_APP_KB_MODE_WIN_RESIZE | LV_APP_KB_MODE_CUR_MANAGE, netw_pwd_kb_close ,netw_pwd_kb_ok);
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
static lv_action_res_t tcp_ip_rel_action( lv_obj_t * ta, lv_dispi_t* dispi)
|
||||
{
|
||||
lv_app_kb_open(ta, LV_APP_KB_MODE_TXT | LV_APP_KB_MODE_WIN_RESIZE | LV_APP_KB_MODE_CUR_MANAGE, tcp_ip_kb_close ,tcp_ip_kb_ok);
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
static lv_action_res_t tcp_port_rel_action( lv_obj_t * ta, lv_dispi_t* dispi)
|
||||
{
|
||||
lv_app_kb_open(ta, LV_APP_KB_MODE_NUM | LV_APP_KB_MODE_WIN_RESIZE | LV_APP_KB_MODE_CUR_MANAGE, tcp_port_kb_close ,tcp_port_kb_ok);
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
static lv_action_res_t wifi_ap_select_action( lv_obj_t * ddlist, lv_dispi_t* dispi)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(ddlist);
|
||||
my_app_data_t * adata = app->app_data;
|
||||
|
||||
char ssid[256];
|
||||
lv_ddlist_get_selected_str(ddlist, ssid);
|
||||
|
||||
my_win_data_t * wdata = app->win_data;
|
||||
lv_ta_set_text(wdata->netw_ssid_ta, ssid);
|
||||
strcpy(adata->set_ssid, ssid);
|
||||
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
static void netw_ssid_kb_ok(lv_obj_t * ta)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(ta);
|
||||
my_app_data_t * adata = app->app_data;
|
||||
strcpy(adata->set_ssid, lv_ta_get_txt(ta));
|
||||
}
|
||||
|
||||
static void netw_ssid_kb_close(lv_obj_t * ta)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(ta);
|
||||
my_app_data_t * adata = app->app_data;
|
||||
lv_ta_set_text(ta, adata->set_ssid);
|
||||
}
|
||||
|
||||
static void netw_pwd_kb_ok(lv_obj_t * ta)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(ta);
|
||||
my_app_data_t * adata = app->app_data;
|
||||
strcpy(adata->set_pwd, lv_ta_get_txt(ta));
|
||||
}
|
||||
|
||||
static void netw_pwd_kb_close(lv_obj_t * ta)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(ta);
|
||||
my_app_data_t * adata = app->app_data;
|
||||
lv_ta_set_text(ta, adata->set_pwd);
|
||||
}
|
||||
|
||||
static void tcp_ip_kb_ok(lv_obj_t * ta)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(ta);
|
||||
my_app_data_t * adata = app->app_data;
|
||||
strcpy(adata->set_ip, lv_ta_get_txt(ta));
|
||||
}
|
||||
|
||||
static void tcp_ip_kb_close(lv_obj_t * ta)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(ta);
|
||||
my_app_data_t * adata = app->app_data;
|
||||
lv_ta_set_text(ta, adata->set_ip);
|
||||
}
|
||||
|
||||
static void tcp_port_kb_ok(lv_obj_t * ta)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(ta);
|
||||
my_app_data_t * adata = app->app_data;
|
||||
strcpy(adata->set_port, lv_ta_get_txt(ta));
|
||||
}
|
||||
|
||||
static void tcp_port_kb_close(lv_obj_t * ta)
|
||||
{
|
||||
lv_app_inst_t * app = lv_obj_get_free_p(ta);
|
||||
my_app_data_t * adata = app->app_data;
|
||||
lv_ta_set_text(ta, adata->set_port);
|
||||
}
|
||||
|
||||
static void list_cb(wifi_state_t state, const char * txt)
|
||||
{
|
||||
if(state == WIFI_STATE_OK) {
|
||||
if(txt[0] == '\0') {
|
||||
lv_app_notice_add("WiFi network list ready");
|
||||
return;
|
||||
}
|
||||
if(strlen(ssid_list) + strlen(txt) + 4 < sizeof(ssid_list)) {
|
||||
sprintf(ssid_list, "%s\n%s", ssid_list, txt);
|
||||
}
|
||||
|
||||
lv_app_inst_t * app = lv_app_get_next(NULL, &my_app_dsc);
|
||||
while(app != NULL) {
|
||||
if(app->win_data != NULL) {
|
||||
my_win_data_t * wdata = app->win_data;
|
||||
lv_ddlist_set_options_str(wdata->list, ssid_list);
|
||||
|
||||
}
|
||||
app = lv_app_get_next(app, &my_app_dsc);
|
||||
}
|
||||
} else if(state == WIFI_STATE_ERROR) {
|
||||
lv_app_notice_add("WiFi network list error\n%s", txt);
|
||||
}
|
||||
}
|
||||
|
||||
static void tcp_transf_cb(wifi_state_t state, const char * txt)
|
||||
{
|
||||
if(state == WIFI_STATE_OK) {
|
||||
uint16_t size = txt[0] + ((txt[1] << 8) & 0xFF00);
|
||||
char buf[256];
|
||||
memcpy(buf, &txt[2], size);
|
||||
buf[size] = '\0';
|
||||
lv_app_com_send(app_act_com, LV_APP_COM_TYPE_CHAR, &txt[2], size);
|
||||
my_app_data_t * adata = app_act_com->app_data;
|
||||
dm_free(adata->last_msg_dp);
|
||||
adata->last_msg_dp = NULL;
|
||||
adata->last_msg_size = 0;
|
||||
app_act_com = NULL;
|
||||
}else if(state == WIFI_STATE_ERROR) {
|
||||
lv_app_notice_add("WiFi TCP transfer error\n%s", txt);
|
||||
lv_app_notice_add("Reconnecting to WiFi...");
|
||||
wifimng_reconnect();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void win_title_refr(void)
|
||||
{
|
||||
lv_app_inst_t * app;
|
||||
app = lv_app_get_next(NULL, &my_app_dsc);
|
||||
while(app != NULL) {
|
||||
if(app->win != NULL) {
|
||||
my_win_data_t * wdata = app->win_data;
|
||||
|
||||
if(wifimng_get_state() == WIFIMNG_STATE_IDLE) {
|
||||
lv_label_set_text(wdata->title, "Not connected");
|
||||
}
|
||||
else if(wifimng_get_state() == WIFIMNG_STATE_READY) {
|
||||
|
||||
char buf[256];
|
||||
sprintf(buf, "%s - %s:%s", wifimng_get_last_ssid(), wifimng_get_last_ip(), wifimng_get_last_port());
|
||||
lv_label_set_text(wdata->title, buf);
|
||||
}
|
||||
else {
|
||||
lv_label_set_text(wdata->title, "Connecting ...");
|
||||
}
|
||||
|
||||
lv_obj_set_width(wdata->title, lv_win_get_width(app->win));
|
||||
}
|
||||
app = lv_app_get_next(app, &my_app_dsc);
|
||||
}
|
||||
}
|
||||
|
||||
static void save_conf(lv_app_inst_t * app)
|
||||
{
|
||||
#ifdef LV_APP_WIFI_CONF_PATH
|
||||
my_app_data_t * adata = app->app_data;
|
||||
|
||||
fs_file_t f;
|
||||
fs_res_t res;
|
||||
res = fs_open(&f, LV_APP_WIFI_CONF_PATH, FS_MODE_WR);
|
||||
if(res == FS_RES_OK) {
|
||||
char buf[256];
|
||||
sprintf(buf,"%s\n%s\n%s\n%s", adata->set_ssid, adata->set_pwd, adata->set_ip, adata->set_port);
|
||||
fs_write(&f, buf, strlen(buf) + 1, NULL);
|
||||
fs_close(&f);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /*LV_APP_ENABLE != 0 && USE_LV_APP_EXAMPLE != 0*/
|
||||
@@ -1,47 +0,0 @@
|
||||
/**
|
||||
* @file lv_app_example.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LV_APP_WIFI_H
|
||||
#define LV_APP_WIFI_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lvgl/lv_app/lv_app.h"
|
||||
|
||||
#if LV_APP_ENABLE != 0 && USE_LV_APP_WIFI != 0
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
typedef struct
|
||||
{
|
||||
|
||||
}lv_app_wifi_conf_t;
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
const lv_app_dsc_t * lv_app_wifi_init(void);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /*LV_APP_ENABLE != 0 && USE_LV_APP_EXAMPLE != 0*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* LV_APP_EXAMPLE_H */
|
||||
296
lv_conf_templ.h
296
lv_conf_templ.h
@@ -1,296 +0,0 @@
|
||||
/**
|
||||
* @file lv_conf.h
|
||||
*
|
||||
*/
|
||||
|
||||
#if 0 /*Remove this to enable the content (Delete the last #endif too!)*/
|
||||
|
||||
#ifndef LV_CONF_H
|
||||
#define LV_CONF_H
|
||||
|
||||
/*===================
|
||||
Graphical settings
|
||||
*=====================*/
|
||||
|
||||
/* Horizontal and vertical resolution of the library.
|
||||
* Screen resolution multiplied by LV_DOWN_SCALE*/
|
||||
#define LV_HOR_RES (320 * LV_DOWNSCALE)
|
||||
#define LV_VER_RES (240 * LV_DOWNSCALE)
|
||||
#define LV_DPI (80 * LV_DOWNSCALE)
|
||||
/* Enable anti-aliasing
|
||||
* If enabled everything will half-sized
|
||||
* Use LV_DOWNSCALE to compensate he down scaling effect of anti-aliasing*/
|
||||
#define LV_ANTIALIAS 1
|
||||
#define LV_DOWNSCALE (1 << LV_ANTIALIAS) /*Set the downscaling value*/
|
||||
|
||||
/* Buffered rendering: >= LV_DOWNSCALE * LV_HOR_RES or 0 to disable buffering*/
|
||||
#define LV_VDB_SIZE (LV_HOR_RES * LV_VER_RES / 20)
|
||||
#if LV_VDB_SIZE
|
||||
/* Double virtual buffering
|
||||
* One for rendering another to transfer former rendered image to frame buffer in the background*/
|
||||
#define LV_VDB_DOUBLE 0
|
||||
#endif
|
||||
|
||||
#define LV_REFR_PERIOD 40 /*Screen refresh period in milliseconds*/
|
||||
#define LV_INV_FIFO_SIZE 32 /*The average number of objects on a screen */
|
||||
|
||||
/*=================
|
||||
Misc. setting
|
||||
*=================*/
|
||||
/*Display Input settings*/
|
||||
#define LV_DISPI_READ_PERIOD 50 /*Input device read period milliseconds*/
|
||||
#define LV_DISPI_TP_MARKER 0 /*Mark the pressed points (Value means marker point size)*/
|
||||
#define LV_DISPI_DRAG_LIMIT (10 * LV_DOWNSCALE) /*Drag threshold in pixels */
|
||||
#define LV_DISPI_DRAG_THROW 20 /*Drag throw slow-down in [%]. Greater value means faster slow-down */
|
||||
#define LV_DISPI_LONG_PRESS_TIME 400 /*Long press time in milliseconds*/
|
||||
#define LV_DISPI_LONG_PRESS_REP_TIME 100 /*Repeated trigger period in long press [ms] */
|
||||
|
||||
/*lv_obj (base object) settings*/
|
||||
#define LV_OBJ_FREE_NUM 1 /*Enable the free number attribute*/
|
||||
#define LV_OBJ_FREE_P 1 /*Enable the free pointer attribute*/
|
||||
#define LV_OBJ_GROUP 1 /*Enable object groups*/
|
||||
|
||||
/*Others*/
|
||||
#define LV_COLOR_TRANSP COLOR_LIME /*This could mean transparent pixel*/
|
||||
#define USE_LV_EXAMPLE 1 /*Enable examples (lvgl/lv_examples/). Disable to save memory*/
|
||||
|
||||
/*==================
|
||||
* LV OBJ X USAGE
|
||||
* ================*/
|
||||
|
||||
/*****************
|
||||
* Simple object
|
||||
*****************/
|
||||
|
||||
/*Label (dependencies: -*/
|
||||
#define USE_LV_LABEL 1
|
||||
#if USE_LV_LABEL != 0
|
||||
#define LV_LABEL_SCROLL_SPEED (25 * LV_DOWNSCALE) /*Hor, or ver. scroll speed (px/sec) in 'LV_LABEL_LONG_SCROLL' mode*/
|
||||
#define LV_LABEL_SCROLL_SPEED_VER (10 * LV_DOWNSCALE) /*Ver. scroll speed if hor. scroll is applied too*/
|
||||
#define LV_LABEL_SCROLL_PLAYBACK_PAUSE 500 /*Wait before the scroll turns back in ms*/
|
||||
#define LV_LABEL_SCROLL_REPEAT_PAUSE 500 /*Wait before the scroll begins again in ms*/
|
||||
#endif
|
||||
|
||||
/*Image (dependencies: lv_label (if symbols are enabled) from misc: FSINT, UFS)*/
|
||||
#define USE_LV_IMG 1
|
||||
#if USE_LV_IMG != 0
|
||||
//#define LV_IMG_DEF_WALLPAPER img_square_x1 /*Comment this line to NOT use wallpaper*/
|
||||
/* 1: enables to interpret the file names as symbol name
|
||||
* from symbol_def.h if they begin with a lower case letter.
|
||||
* (driver letters are always upper case)*/
|
||||
#define LV_IMG_ENABLE_SYMBOLS 1
|
||||
#if LV_IMG_ENABLE_SYMBOLS != 0
|
||||
#define LV_IMG_DEF_SYMBOL_FONT FONT_SYMBOL_30
|
||||
#endif /*LV_IMG_ENABLE_SYMBOLS*/
|
||||
#endif /*USE_LV_IMG*/
|
||||
|
||||
/*Line (dependencies: -*/
|
||||
#define USE_LV_LINE 1
|
||||
|
||||
/*******************
|
||||
* Container object
|
||||
*******************/
|
||||
|
||||
/*Container (dependencies: -*/
|
||||
#define USE_LV_CONT 1
|
||||
|
||||
/*Page (dependencies: lv_cont)*/
|
||||
#define USE_LV_PAGE 1
|
||||
|
||||
/*Window (dependencies: lv_cont, lv_btn, lv_label, lv_img, lv_page)*/
|
||||
#define USE_LV_WIN 1
|
||||
|
||||
/*************************
|
||||
* Data visualizer object
|
||||
*************************/
|
||||
|
||||
/*Bar (dependencies: -)*/
|
||||
#define USE_LV_BAR 1
|
||||
|
||||
/*Line meter (dependencies: bar; misc: trigo)*/
|
||||
#define USE_LV_LMETER 1
|
||||
|
||||
/*Gauge (dependencies:bar, lmeter; misc: trigo)*/
|
||||
#define USE_LV_GAUGE 1
|
||||
#if USE_LV_GAUGE != 0
|
||||
#define LV_GAUGE_MAX_NEEDLE 4 /*Max number of needles. Used in the style.*/
|
||||
#endif
|
||||
|
||||
/*Chart (dependencies: -)*/
|
||||
#define USE_LV_CHART 1
|
||||
|
||||
/*LED (dependencies: -)*/
|
||||
#define USE_LV_LED 1
|
||||
|
||||
/*Message box (dependencies: lv_rect, lv_btn, lv_label)*/
|
||||
#define USE_LV_MBOX 1
|
||||
|
||||
/*Text area (dependencies: lv_label, lv_page)*/
|
||||
#define USE_LV_TA 1
|
||||
#if USE_LV_TA != 0
|
||||
#define LV_TA_MAX_LENGTH 256
|
||||
#define LV_TA_CUR_BLINK_TIME 400 /*ms*/
|
||||
#define LV_TA_PWD_SHOW_TIME 1500 /*ms*/
|
||||
#endif
|
||||
|
||||
/*************************
|
||||
* User input object
|
||||
*************************/
|
||||
|
||||
/*Button (dependencies: lv_cont*/
|
||||
#define USE_LV_BTN 1
|
||||
|
||||
/*Button matrix (dependencies: -)*/
|
||||
#define USE_LV_BTNM 1
|
||||
|
||||
/*Check box (dependencies: lv_btn, lv_label)*/
|
||||
#define USE_LV_CB 1
|
||||
|
||||
/*List (dependencies: lv_page, lv_btn, lv_label, lv_img)*/
|
||||
#define USE_LV_LIST 1
|
||||
#if USE_LV_LIST != 0
|
||||
#define LV_LIST_FOCUS_TIME 100 /*Animation time of focusing to the a list element [ms] (0: no animation) */
|
||||
#endif
|
||||
|
||||
/*Drop down list (dependencies: lv_page, lv_label)*/
|
||||
#define USE_LV_DDLIST 1
|
||||
|
||||
/*Slider (dependencies: lv_bar)*/
|
||||
#define USE_LV_SLIDER 1
|
||||
|
||||
/*==================
|
||||
* LV APP SETTINGS
|
||||
* =================*/
|
||||
|
||||
/*Enable the application system*/
|
||||
#define LV_APP_ENABLE 0
|
||||
#if LV_APP_ENABLE != 0
|
||||
|
||||
/****************************
|
||||
* Basic application settings
|
||||
*****************************/
|
||||
#define LV_APP_DESKTOP 1 /*Create a desktop-like environment*/
|
||||
|
||||
#define LV_APP_SC_WIDTH (LV_DPI * 2) /*Shortcut width*/
|
||||
#define LV_APP_SC_HEIGHT (3 * LV_DPI / 2) /*Shortcut height*/
|
||||
#define LV_APP_FONT_SMALL FONT_DEJAVU_20 /*A small font*/
|
||||
#define LV_APP_FONT_MEDIUM FONT_DEFAULT /*A medium font*/
|
||||
#define LV_APP_FONT_LARGE FONT_DEJAVU_40 /*A large font*/
|
||||
|
||||
/***********************
|
||||
* Animation settings
|
||||
***********************/
|
||||
#define LV_APP_ANIM_WIN 200 /*Animation time of windows [ms] (0: turn off animations)*/
|
||||
#define LV_APP_ANIM_DESKTOP 200 /*Animation time the desktop [ms] (0: turn off animations)*/
|
||||
|
||||
/************************
|
||||
* App. utility settings
|
||||
************************/
|
||||
|
||||
/*Notice*/
|
||||
#define USE_LV_APP_NOTICE 1
|
||||
#if USE_LV_APP_NOTICE != 0
|
||||
#define LV_APP_NOTICE_SHOW_TIME 4000 /*Notices will be shown for this time [ms]*/
|
||||
#define LV_APP_NOTICE_CLOSE_ANIM_TIME 300 /*Notice close animation time. [ms] 0: no animation */
|
||||
#define LV_APP_NOTICE_MAX_NUM 6 /*Max. number of notices*/
|
||||
#define LV_APP_NOTICE_MAX_LEN 256 /*Max. number of characters on a notice*/
|
||||
#endif
|
||||
|
||||
/*File selector*/
|
||||
#define USE_LV_APP_FSEL 1
|
||||
#if USE_LV_APP_FSEL != 0
|
||||
#define LV_APP_FSEL_PAGE_SIZE 8 /*Max. number of files/folder on a page*/
|
||||
#define LV_APP_FSEL_FN_MAX_LEN 32 /*Max file name length*/
|
||||
#define LV_APP_FSEL_PATH_MAX_LEN 256 /*Max path length*/
|
||||
#endif
|
||||
|
||||
/*Keyboard*/
|
||||
#define USE_LV_APP_KB 1
|
||||
#if USE_LV_APP_KB != 0
|
||||
#define LV_APP_KB_ANIM_TIME 300 /*ms*/
|
||||
#endif
|
||||
|
||||
/*==================
|
||||
* LV APP X USAGE
|
||||
* ================*/
|
||||
|
||||
/*Example application*/
|
||||
#define USE_LV_APP_EXAMPLE 1
|
||||
|
||||
/*Phantom application*/
|
||||
#define USE_LV_APP_PHANTOM 1
|
||||
#if USE_LV_APP_PHANTOM != 0
|
||||
/*No settings*/
|
||||
#endif
|
||||
|
||||
/*System monitor*/
|
||||
#define USE_LV_APP_SYSMON 1
|
||||
#if USE_LV_APP_SYSMON != 0
|
||||
#define LV_APP_SYSMON_REFR_TIME 500 /*Mem. and CPU usage read period [ms]*/
|
||||
#define LV_APP_SYSMON_PNUM 64 /*Number of point on the window's chart*/
|
||||
#define LV_APP_SYSMON_MEM_WARN (2 * 1024) /*Make a notice less then this remaining memory [bytes]*/
|
||||
#define LV_APP_SYSMON_FRAG_WARN (70) /*Make a notice above this fragmentation level [%]*/
|
||||
#define LV_APP_SYSMON_DEFRAG_PERIOD (5000) /*Auto-defrag period [ms]*/
|
||||
#endif /*USE_LV_APP_SYSMON != 0*/
|
||||
|
||||
/*Terminal*/
|
||||
#define USE_LV_APP_TERMINAL 1
|
||||
#if USE_LV_APP_TERMINAL != 0
|
||||
#define LV_APP_TERMINAL_LENGTH 512 /*Memory of the terminal [character number]*/
|
||||
#endif /*USE_LV_APP_TERMINAL != 0*/
|
||||
|
||||
/*Files*/
|
||||
#define USE_LV_APP_FILES 1
|
||||
#if USE_LV_APP_FILES != 0
|
||||
#define LV_APP_FILES_PAGE_SIZE 8 /*Max. number of files/folder on a page*/
|
||||
#define LV_APP_FILES_FN_MAX_LEN 32 /*Max file name length*/
|
||||
#define LV_APP_FILES_PATH_MAX_LEN 256 /*Max path length*/
|
||||
#define LV_APP_FILES_CHUNK_DEF_SIZE 256 /*Chunk size when sending a file*/
|
||||
#define LV_APP_FILES_CHUNK_DEF_TIME 100 /*Delay between sent chunks*/
|
||||
#define LV_APP_FILES_CHUNK_MAX_SIZE 1024 /*Max chunk size when the user sets it*/
|
||||
#endif /*USE_LV_APP_FILES != 0*/
|
||||
|
||||
/*Benchmark*/
|
||||
#define USE_LV_APP_BENCHMARK 1
|
||||
#if USE_LV_APP_BENCHMARK != 0
|
||||
/*No settings*/
|
||||
#endif
|
||||
|
||||
/*WiFi*/
|
||||
#define USE_LV_APP_WIFI 0
|
||||
#if USE_LV_APP_WIFI != 0
|
||||
#define LV_APP_WIFI_CONF_PATH "S:/wifi_conf.txt" /*Save config. here. Comment to use def. value*/
|
||||
#ifndef LV_APP_WIFI_CONF_PATH
|
||||
#define LV_APP_WIFI_SSID_DEF "ssid"
|
||||
#define LV_APP_WIFI_PWD_DEF "pwd"
|
||||
#define LV_APP_WIFI_IP_DEF "100.101.102.103"
|
||||
#define LV_APP_WIFI_PORT_DEF "1234"
|
||||
#endif /*LV_APP_WIFI_CONF_PATH*/
|
||||
#define LV_APP_WIFI_AUTO_CONNECT 1 /*Try to connect at start up to the deafult SSID and IP:PORT*/
|
||||
#endif /*USE_LV_APP_WIFI != 0*/
|
||||
|
||||
/*GSM*/
|
||||
#define USE_LV_APP_GSM 0
|
||||
#if USE_LV_APP_GSM != 0
|
||||
#define LV_APP_GSM_CONF_PATH "S:/gsm_conf.txt" /*Save config. here. Comment to use def. value*/
|
||||
#ifndef LV_APP_GSM_CONF_PATH
|
||||
#define LV_APP_GSM_APN_DEF "apn"
|
||||
#define LV_APP_GSM_IP_DEF "101.102.103.104"
|
||||
#define LV_APP_GSM_PORT_DEF "1234"
|
||||
#endif /*LV_APP_GSM_CONF_PATH*/
|
||||
#define LV_APP_GSM_AUTO_CONNECT 1 /*Try to connect at start up with the deafult APN and IP:PORT*/
|
||||
#endif /*USE_LV_APP_GSM != 0*/
|
||||
|
||||
/*Ethernet*/
|
||||
#define USE_LV_APP_ETHERNET 0
|
||||
#if USE_LV_APP_ETHERNET != 0
|
||||
/*No settings*/
|
||||
#endif /*USE_LV_APP_ETHERNET != 0*/
|
||||
|
||||
#endif /*LV_APP_ENABLE != 0*/
|
||||
|
||||
#endif /*LV_CONF_H*/
|
||||
|
||||
|
||||
#endif /*Remove this to enable the content*/
|
||||
|
||||
495
lv_conf_template.h
Normal file
495
lv_conf_template.h
Normal file
@@ -0,0 +1,495 @@
|
||||
/**
|
||||
* @file lv_conf.h
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* COPY THIS FILE AS `lv_conf.h` NEXT TO the `lvgl` FOLDER
|
||||
*/
|
||||
|
||||
#if 0 /*Set it to "1" to enable content*/
|
||||
|
||||
#ifndef LV_CONF_H
|
||||
#define LV_CONF_H
|
||||
/* clang-format off */
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/*====================
|
||||
Graphical settings
|
||||
*====================*/
|
||||
|
||||
/* Maximal horizontal and vertical resolution to support by the library.*/
|
||||
#define LV_HOR_RES_MAX (480)
|
||||
#define LV_VER_RES_MAX (320)
|
||||
|
||||
/* Color depth:
|
||||
* - 1: 1 byte per pixel
|
||||
* - 8: RGB233
|
||||
* - 16: RGB565
|
||||
* - 32: ARGB8888
|
||||
*/
|
||||
#define LV_COLOR_DEPTH 16
|
||||
|
||||
/* Swap the 2 bytes of RGB565 color.
|
||||
* Useful if the display has a 8 bit interface (e.g. SPI)*/
|
||||
#define LV_COLOR_16_SWAP 0
|
||||
|
||||
/* 1: Enable screen transparency.
|
||||
* Useful for OSD or other overlapping GUIs.
|
||||
* Requires `LV_COLOR_DEPTH = 32` colors and the screen's style should be modified: `style.body.opa = ...`*/
|
||||
#define LV_COLOR_SCREEN_TRANSP 0
|
||||
|
||||
/*Images pixels with this color will not be drawn (with chroma keying)*/
|
||||
#define LV_COLOR_TRANSP LV_COLOR_LIME /*LV_COLOR_LIME: pure green*/
|
||||
|
||||
/* Enable anti-aliasing (lines, and radiuses will be smoothed) */
|
||||
#define LV_ANTIALIAS 1
|
||||
|
||||
/* Default display refresh period.
|
||||
* Can be changed in the display driver (`lv_disp_drv_t`).*/
|
||||
#define LV_DISP_DEF_REFR_PERIOD 30 /*[ms]*/
|
||||
|
||||
/* Dot Per Inch: used to initialize default sizes.
|
||||
* E.g. a button with width = LV_DPI / 2 -> half inch wide
|
||||
* (Not so important, you can adjust it to modify default sizes and spaces)*/
|
||||
#define LV_DPI 100 /*[px]*/
|
||||
|
||||
/* Type of coordinates. Should be `int16_t` (or `int32_t` for extreme cases) */
|
||||
typedef int16_t lv_coord_t;
|
||||
|
||||
/*=========================
|
||||
Memory manager settings
|
||||
*=========================*/
|
||||
|
||||
/* LittelvGL's internal memory manager's settings.
|
||||
* The graphical objects and other related data are stored here. */
|
||||
|
||||
/* 1: use custom malloc/free, 0: use the built-in `lv_mem_alloc` and `lv_mem_free` */
|
||||
#define LV_MEM_CUSTOM 0
|
||||
#if LV_MEM_CUSTOM == 0
|
||||
/* Size of the memory used by `lv_mem_alloc` in bytes (>= 2kB)*/
|
||||
# define LV_MEM_SIZE (32U * 1024U)
|
||||
|
||||
/* Complier prefix for a big array declaration */
|
||||
# define LV_MEM_ATTR
|
||||
|
||||
/* Set an address for the memory pool instead of allocating it as an array.
|
||||
* Can be in external SRAM too. */
|
||||
# define LV_MEM_ADR 0
|
||||
|
||||
/* Automatically defrag. on free. Defrag. means joining the adjacent free cells. */
|
||||
# define LV_MEM_AUTO_DEFRAG 1
|
||||
#else /*LV_MEM_CUSTOM*/
|
||||
# define LV_MEM_CUSTOM_INCLUDE <stdlib.h> /*Header for the dynamic memory function*/
|
||||
# define LV_MEM_CUSTOM_ALLOC malloc /*Wrapper to malloc*/
|
||||
# define LV_MEM_CUSTOM_FREE free /*Wrapper to free*/
|
||||
#endif /*LV_MEM_CUSTOM*/
|
||||
|
||||
/* Garbage Collector settings
|
||||
* Used if lvgl is binded to higher level language and the memory is managed by that language */
|
||||
#define LV_ENABLE_GC 0
|
||||
#if LV_ENABLE_GC != 0
|
||||
# define LV_GC_INCLUDE "gc.h" /*Include Garbage Collector related things*/
|
||||
# define LV_MEM_CUSTOM_REALLOC your_realloc /*Wrapper to realloc*/
|
||||
# define LV_MEM_CUSTOM_GET_SIZE your_mem_get_size /*Wrapper to lv_mem_get_size*/
|
||||
#endif /* LV_ENABLE_GC */
|
||||
|
||||
/*=======================
|
||||
Input device settings
|
||||
*=======================*/
|
||||
|
||||
/* Input device default settings.
|
||||
* Can be changed in the Input device driver (`lv_indev_drv_t`)*/
|
||||
|
||||
/* Input device read period in milliseconds */
|
||||
#define LV_INDEV_DEF_READ_PERIOD 30
|
||||
|
||||
/* Drag threshold in pixels */
|
||||
#define LV_INDEV_DEF_DRAG_LIMIT 10
|
||||
|
||||
/* Drag throw slow-down in [%]. Greater value -> faster slow-down */
|
||||
#define LV_INDEV_DEF_DRAG_THROW 20
|
||||
|
||||
/* Long press time in milliseconds.
|
||||
* Time to send `LV_EVENT_LONG_PRESSSED`) */
|
||||
#define LV_INDEV_DEF_LONG_PRESS_TIME 400
|
||||
|
||||
/* Repeated trigger period in long press [ms]
|
||||
* Time between `LV_EVENT_LONG_PRESSED_REPEAT */
|
||||
#define LV_INDEV_DEF_LONG_PRESS_REP_TIME 100
|
||||
|
||||
/*==================
|
||||
* Feature usage
|
||||
*==================*/
|
||||
|
||||
/*1: Enable the Animations */
|
||||
#define LV_USE_ANIMATION 1
|
||||
#if LV_USE_ANIMATION
|
||||
|
||||
/*Declare the type of the user data of animations (can be e.g. `void *`, `int`, `struct`)*/
|
||||
typedef void * lv_anim_user_data_t;
|
||||
|
||||
#endif
|
||||
|
||||
/* 1: Enable shadow drawing*/
|
||||
#define LV_USE_SHADOW 1
|
||||
|
||||
/* 1: Enable object groups (for keyboard/encoder navigation) */
|
||||
#define LV_USE_GROUP 1
|
||||
#if LV_USE_GROUP
|
||||
typedef void * lv_group_user_data_t;
|
||||
#endif /*LV_USE_GROUP*/
|
||||
|
||||
/* 1: Enable GPU interface*/
|
||||
#define LV_USE_GPU 1
|
||||
|
||||
/* 1: Enable file system (might be required for images */
|
||||
#define LV_USE_FILESYSTEM 1
|
||||
#if LV_USE_FILESYSTEM
|
||||
/*Declare the type of the user data of file system drivers (can be e.g. `void *`, `int`, `struct`)*/
|
||||
typedef void * lv_fs_drv_user_data_t;
|
||||
#endif
|
||||
|
||||
/*1: Add a `user_data` to drivers and objects*/
|
||||
#define LV_USE_USER_DATA 0
|
||||
|
||||
/*========================
|
||||
* Image decoder and cache
|
||||
*========================*/
|
||||
|
||||
/* 1: Enable indexed (palette) images */
|
||||
#define LV_IMG_CF_INDEXED 1
|
||||
|
||||
/* 1: Enable alpha indexed images */
|
||||
#define LV_IMG_CF_ALPHA 1
|
||||
|
||||
/* Default image cache size. Image caching keeps the images opened.
|
||||
* If only the built-in image formats are used there is no real advantage of caching.
|
||||
* (I.e. no new image decoder is added)
|
||||
* With complex image decoders (e.g. PNG or JPG) caching can save the continuous open/decode of images.
|
||||
* However the opened images might consume additional RAM.
|
||||
* LV_IMG_CACHE_DEF_SIZE must be >= 1 */
|
||||
#define LV_IMG_CACHE_DEF_SIZE 1
|
||||
|
||||
/*Declare the type of the user data of image decoder (can be e.g. `void *`, `int`, `struct`)*/
|
||||
typedef void * lv_img_decoder_user_data_t;
|
||||
|
||||
/*=====================
|
||||
* Compiler settings
|
||||
*====================*/
|
||||
/* Define a custom attribute to `lv_tick_inc` function */
|
||||
#define LV_ATTRIBUTE_TICK_INC
|
||||
|
||||
/* Define a custom attribute to `lv_task_handler` function */
|
||||
#define LV_ATTRIBUTE_TASK_HANDLER
|
||||
|
||||
/* With size optimization (-Os) the compiler might not align data to
|
||||
* 4 or 8 byte boundary. This alignment will be explicitly applied where needed.
|
||||
* E.g. __attribute__((aligned(4))) */
|
||||
#define LV_ATTRIBUTE_MEM_ALIGN
|
||||
|
||||
/* Attribute to mark large constant arrays for example
|
||||
* font's bitmaps */
|
||||
#define LV_ATTRIBUTE_LARGE_CONST
|
||||
|
||||
/*===================
|
||||
* HAL settings
|
||||
*==================*/
|
||||
|
||||
/* 1: use a custom tick source.
|
||||
* It removes the need to manually update the tick with `lv_tick_inc`) */
|
||||
#define LV_TICK_CUSTOM 0
|
||||
#if LV_TICK_CUSTOM == 1
|
||||
#define LV_TICK_CUSTOM_INCLUDE "something.h" /*Header for the sys time function*/
|
||||
#define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis()) /*Expression evaluating to current systime in ms*/
|
||||
#endif /*LV_TICK_CUSTOM*/
|
||||
|
||||
typedef void * lv_disp_drv_user_data_t; /*Type of user data in the display driver*/
|
||||
typedef void * lv_indev_drv_user_data_t; /*Type of user data in the input device driver*/
|
||||
|
||||
/*================
|
||||
* Log settings
|
||||
*===============*/
|
||||
|
||||
/*1: Enable the log module*/
|
||||
#define LV_USE_LOG 0
|
||||
#if LV_USE_LOG
|
||||
/* How important log should be added:
|
||||
* LV_LOG_LEVEL_TRACE A lot of logs to give detailed information
|
||||
* LV_LOG_LEVEL_INFO Log important events
|
||||
* LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem
|
||||
* LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail
|
||||
* LV_LOG_LEVEL_NONE Do not log anything
|
||||
*/
|
||||
# define LV_LOG_LEVEL LV_LOG_LEVEL_WARN
|
||||
|
||||
/* 1: Print the log with 'printf';
|
||||
* 0: user need to register a callback with `lv_log_register_print`*/
|
||||
# define LV_LOG_PRINTF 0
|
||||
#endif /*LV_USE_LOG*/
|
||||
|
||||
/*================
|
||||
* THEME USAGE
|
||||
*================*/
|
||||
#define LV_THEME_LIVE_UPDATE 0 /*1: Allow theme switching at run time. Uses 8..10 kB of RAM*/
|
||||
|
||||
#define LV_USE_THEME_TEMPL 0 /*Just for test*/
|
||||
#define LV_USE_THEME_DEFAULT 0 /*Built mainly from the built-in styles. Consumes very few RAM*/
|
||||
#define LV_USE_THEME_ALIEN 0 /*Dark futuristic theme*/
|
||||
#define LV_USE_THEME_NIGHT 0 /*Dark elegant theme*/
|
||||
#define LV_USE_THEME_MONO 0 /*Mono color theme for monochrome displays*/
|
||||
#define LV_USE_THEME_MATERIAL 0 /*Flat theme with bold colors and light shadows*/
|
||||
#define LV_USE_THEME_ZEN 0 /*Peaceful, mainly light theme */
|
||||
#define LV_USE_THEME_NEMO 0 /*Water-like theme based on the movie "Finding Nemo"*/
|
||||
|
||||
/*==================
|
||||
* FONT USAGE
|
||||
*===================*/
|
||||
|
||||
/* The built-in fonts contains the ASCII range and some Symbols with 4 bit-per-pixel.
|
||||
* The symbols are available via `LV_SYMBOL_...` defines
|
||||
* More info about fonts: https://docs.littlevgl.com/#Fonts
|
||||
* To create a new font go to: https://littlevgl.com/ttf-font-to-c-array
|
||||
*/
|
||||
|
||||
/* Robot fonts with bpp = 4
|
||||
* https://fonts.google.com/specimen/Roboto */
|
||||
#define LV_FONT_ROBOTO_12 0
|
||||
#define LV_FONT_ROBOTO_16 1
|
||||
#define LV_FONT_ROBOTO_22 0
|
||||
#define LV_FONT_ROBOTO_28 0
|
||||
|
||||
/*Pixel perfect monospace font
|
||||
* http://pelulamu.net/unscii/ */
|
||||
#define LV_FONT_UNSCII_8 0
|
||||
|
||||
/* Optionally declare your custom fonts here.
|
||||
* You can use these fonts as default font too
|
||||
* and they will be available globally. E.g.
|
||||
* #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) \
|
||||
* LV_FONT_DECLARE(my_font_2)
|
||||
*/
|
||||
#define LV_FONT_CUSTOM_DECLARE
|
||||
|
||||
/*Always set a default font from the built-in fonts*/
|
||||
#define LV_FONT_DEFAULT &lv_font_roboto_16
|
||||
|
||||
/* Enable it if you have fonts with a lot of characters.
|
||||
* The limit depends on the font size, font face and bpp
|
||||
* but with > 10,000 characters if you see issues probably you need to enable it.*/
|
||||
#define LV_FONT_FMT_TXT_LARGE 0
|
||||
|
||||
/*Declare the type of the user data of fonts (can be e.g. `void *`, `int`, `struct`)*/
|
||||
typedef void * lv_font_user_data_t;
|
||||
|
||||
/*=================
|
||||
* Text settings
|
||||
*=================*/
|
||||
|
||||
/* Select a character encoding for strings.
|
||||
* Your IDE or editor should have the same character encoding
|
||||
* - LV_TXT_ENC_UTF8
|
||||
* - LV_TXT_ENC_ASCII
|
||||
* */
|
||||
#define LV_TXT_ENC LV_TXT_ENC_UTF8
|
||||
|
||||
/*Can break (wrap) texts on these chars*/
|
||||
#define LV_TXT_BREAK_CHARS " ,.;:-_"
|
||||
|
||||
/*===================
|
||||
* LV_OBJ SETTINGS
|
||||
*==================*/
|
||||
|
||||
/*Declare the type of the user data of object (can be e.g. `void *`, `int`, `struct`)*/
|
||||
typedef void * lv_obj_user_data_t;
|
||||
|
||||
/*1: enable `lv_obj_realaign()` based on `lv_obj_align()` parameters*/
|
||||
#define LV_USE_OBJ_REALIGN 1
|
||||
|
||||
/* Enable to make the object clickable on a larger area.
|
||||
* LV_EXT_CLICK_AREA_OFF or 0: Disable this feature
|
||||
* LV_EXT_CLICK_AREA_TINY: The extra area can be adjusted horizontally and vertically (0..255 px)
|
||||
* LV_EXT_CLICK_AREA_FULL: The extra area can be adjusted in all 4 directions (-32k..+32k px)
|
||||
*/
|
||||
#define LV_USE_EXT_CLICK_AREA LV_EXT_CLICK_AREA_OFF
|
||||
|
||||
/*==================
|
||||
* LV OBJ X USAGE
|
||||
*================*/
|
||||
/*
|
||||
* Documentation of the object types: https://docs.littlevgl.com/#Object-types
|
||||
*/
|
||||
|
||||
/*Arc (dependencies: -)*/
|
||||
#define LV_USE_ARC 1
|
||||
|
||||
/*Bar (dependencies: -)*/
|
||||
#define LV_USE_BAR 1
|
||||
|
||||
/*Button (dependencies: lv_cont*/
|
||||
#define LV_USE_BTN 1
|
||||
#if LV_USE_BTN != 0
|
||||
/*Enable button-state animations - draw a circle on click (dependencies: LV_USE_ANIMATION)*/
|
||||
# define LV_BTN_INK_EFFECT 0
|
||||
#endif
|
||||
|
||||
/*Button matrix (dependencies: -)*/
|
||||
#define LV_USE_BTNM 1
|
||||
|
||||
/*Calendar (dependencies: -)*/
|
||||
#define LV_USE_CALENDAR 1
|
||||
|
||||
/*Canvas (dependencies: lv_img)*/
|
||||
#define LV_USE_CANVAS 1
|
||||
|
||||
/*Check box (dependencies: lv_btn, lv_label)*/
|
||||
#define LV_USE_CB 1
|
||||
|
||||
/*Chart (dependencies: -)*/
|
||||
#define LV_USE_CHART 1
|
||||
#if LV_USE_CHART
|
||||
# define LV_CHART_AXIS_TICK_LABEL_MAX_LEN 20
|
||||
#endif
|
||||
|
||||
/*Container (dependencies: -*/
|
||||
#define LV_USE_CONT 1
|
||||
|
||||
/*Drop down list (dependencies: lv_page, lv_label, lv_symbol_def.h)*/
|
||||
#define LV_USE_DDLIST 1
|
||||
#if LV_USE_DDLIST != 0
|
||||
/*Open and close default animation time [ms] (0: no animation)*/
|
||||
# define LV_DDLIST_DEF_ANIM_TIME 200
|
||||
#endif
|
||||
|
||||
/*Gauge (dependencies:lv_bar, lv_lmeter)*/
|
||||
#define LV_USE_GAUGE 1
|
||||
|
||||
/*Image (dependencies: lv_label*/
|
||||
#define LV_USE_IMG 1
|
||||
|
||||
/*Image Button (dependencies: lv_btn*/
|
||||
#define LV_USE_IMGBTN 1
|
||||
#if LV_USE_IMGBTN
|
||||
/*1: The imgbtn requires left, mid and right parts and the width can be set freely*/
|
||||
# define LV_IMGBTN_TILED 0
|
||||
#endif
|
||||
|
||||
/*Keyboard (dependencies: lv_btnm)*/
|
||||
#define LV_USE_KB 1
|
||||
|
||||
/*Label (dependencies: -*/
|
||||
#define LV_USE_LABEL 1
|
||||
#if LV_USE_LABEL != 0
|
||||
/*Hor, or ver. scroll speed [px/sec] in 'LV_LABEL_LONG_ROLL/ROLL_CIRC' mode*/
|
||||
# define LV_LABEL_DEF_SCROLL_SPEED 25
|
||||
|
||||
/* Waiting period at beginning/end of animation cycle */
|
||||
# define LV_LABEL_WAIT_CHAR_COUNT 3
|
||||
|
||||
/*Enable selecting text of the label */
|
||||
# define LV_LABEL_TEXT_SEL 0
|
||||
|
||||
/*Store extra some info in labels (12 bytes) to speed up drawing of very long texts*/
|
||||
# define LV_LABEL_LONG_TXT_HINT 0
|
||||
#endif
|
||||
|
||||
/*LED (dependencies: -)*/
|
||||
#define LV_USE_LED 1
|
||||
|
||||
/*Line (dependencies: -*/
|
||||
#define LV_USE_LINE 1
|
||||
|
||||
/*List (dependencies: lv_page, lv_btn, lv_label, (lv_img optionally for icons ))*/
|
||||
#define LV_USE_LIST 1
|
||||
#if LV_USE_LIST != 0
|
||||
/*Default animation time of focusing to a list element [ms] (0: no animation) */
|
||||
# define LV_LIST_DEF_ANIM_TIME 100
|
||||
#endif
|
||||
|
||||
/*Line meter (dependencies: *;)*/
|
||||
#define LV_USE_LMETER 1
|
||||
|
||||
/*Message box (dependencies: lv_rect, lv_btnm, lv_label)*/
|
||||
#define LV_USE_MBOX 1
|
||||
|
||||
/*Page (dependencies: lv_cont)*/
|
||||
#define LV_USE_PAGE 1
|
||||
#if LV_USE_PAGE != 0
|
||||
/*Focus default animation time [ms] (0: no animation)*/
|
||||
# define LV_PAGE_DEF_ANIM_TIME 400
|
||||
#endif
|
||||
|
||||
/*Preload (dependencies: lv_arc, lv_anim)*/
|
||||
#define LV_USE_PRELOAD 1
|
||||
#if LV_USE_PRELOAD != 0
|
||||
# define LV_PRELOAD_DEF_ARC_LENGTH 60 /*[deg]*/
|
||||
# define LV_PRELOAD_DEF_SPIN_TIME 1000 /*[ms]*/
|
||||
# define LV_PRELOAD_DEF_ANIM LV_PRELOAD_TYPE_SPINNING_ARC
|
||||
#endif
|
||||
|
||||
/*Roller (dependencies: lv_ddlist)*/
|
||||
#define LV_USE_ROLLER 1
|
||||
#if LV_USE_ROLLER != 0
|
||||
/*Focus animation time [ms] (0: no animation)*/
|
||||
# define LV_ROLLER_DEF_ANIM_TIME 200
|
||||
|
||||
/*Number of extra "pages" when the roller is infinite*/
|
||||
# define LV_ROLLER_INF_PAGES 7
|
||||
#endif
|
||||
|
||||
/*Slider (dependencies: lv_bar)*/
|
||||
#define LV_USE_SLIDER 1
|
||||
|
||||
/*Spinbox (dependencies: lv_ta)*/
|
||||
#define LV_USE_SPINBOX 1
|
||||
|
||||
/*Switch (dependencies: lv_slider)*/
|
||||
#define LV_USE_SW 1
|
||||
|
||||
/*Text area (dependencies: lv_label, lv_page)*/
|
||||
#define LV_USE_TA 1
|
||||
#if LV_USE_TA != 0
|
||||
# define LV_TA_DEF_CURSOR_BLINK_TIME 400 /*ms*/
|
||||
# define LV_TA_DEF_PWD_SHOW_TIME 1500 /*ms*/
|
||||
#endif
|
||||
|
||||
/*Table (dependencies: lv_label)*/
|
||||
#define LV_USE_TABLE 1
|
||||
#if LV_USE_TABLE
|
||||
# define LV_TABLE_COL_MAX 12
|
||||
#endif
|
||||
|
||||
/*Tab (dependencies: lv_page, lv_btnm)*/
|
||||
#define LV_USE_TABVIEW 1
|
||||
# if LV_USE_TABVIEW != 0
|
||||
/*Time of slide animation [ms] (0: no animation)*/
|
||||
# define LV_TABVIEW_DEF_ANIM_TIME 300
|
||||
#endif
|
||||
|
||||
/*Tileview (dependencies: lv_page) */
|
||||
#define LV_USE_TILEVIEW 1
|
||||
#if LV_USE_TILEVIEW
|
||||
/*Time of slide animation [ms] (0: no animation)*/
|
||||
# define LV_TILEVIEW_DEF_ANIM_TIME 300
|
||||
#endif
|
||||
|
||||
/*Window (dependencies: lv_cont, lv_btn, lv_label, lv_img, lv_page)*/
|
||||
#define LV_USE_WIN 1
|
||||
|
||||
/*==================
|
||||
* Non-user section
|
||||
*==================*/
|
||||
|
||||
#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) /* Disable warnings for Visual Studio*/
|
||||
# define _CRT_SECURE_NO_WARNINGS
|
||||
#endif
|
||||
|
||||
/*--END OF LV_CONF_H--*/
|
||||
|
||||
/*Be sure every define has a default value*/
|
||||
#include "lvgl/src/lv_conf_checker.h"
|
||||
|
||||
#endif /*LV_CONF_H*/
|
||||
|
||||
#endif /*End of "Content enable"*/
|
||||
1376
lv_draw/lv_draw.c
1376
lv_draw/lv_draw.c
File diff suppressed because it is too large
Load Diff
@@ -1,93 +0,0 @@
|
||||
/**
|
||||
* @file lv_draw.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LV_DRAW_H
|
||||
#define LV_DRAW_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "misc_conf.h"
|
||||
#include "misc/gfx/text.h"
|
||||
#include "../lv_obj/lv_style.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Draw a rectangle
|
||||
* @param cords_p the coordinates of the rectangle
|
||||
* @param mask_p the rectangle will be drawn only in this mask
|
||||
* @param style_p pointer to a style
|
||||
*/
|
||||
void lv_draw_rect(const area_t * cords_p, const area_t * mask_p, const lv_style_t * style_p);
|
||||
|
||||
|
||||
/*Experimental use for 3D modeling*/
|
||||
#define USE_LV_TRIANGLE 0
|
||||
#if USE_LV_TRIANGLE != 0
|
||||
/**
|
||||
*
|
||||
* @param points pointer to an array with 3 points
|
||||
* @param mask_p the triangle will be drawn only in this mask
|
||||
* @param color color of the triangle
|
||||
*/
|
||||
void lv_draw_triangle(const point_t * points, const area_t * mask_p, color_t color);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Write a text
|
||||
* @param cords_p coordinates of the label
|
||||
* @param mask_p the label will be drawn only in this area
|
||||
* @param style_p pointer to a style
|
||||
* @param txt 0 terminated text to write
|
||||
* @param flags settings for the text from 'txt_flag_t' enum
|
||||
* @param offset text offset in x and y direction (NULL if unused)
|
||||
*/
|
||||
void lv_draw_label(const area_t * cords_p,const area_t * mask_p, const lv_style_t * style_p,
|
||||
const char * txt, txt_flag_t flag, point_t * offset);
|
||||
|
||||
/**
|
||||
* Draw an image
|
||||
* @param cords_p the coordinates of the image
|
||||
* @param mask_p the image will be drawn only in this area
|
||||
* @param map_p pointer to a color_t array which contains the pixels of the image
|
||||
*/
|
||||
void lv_draw_img(const area_t * cords_p, const area_t * mask_p,
|
||||
const lv_style_t * style_p, const char * fn);
|
||||
|
||||
/**
|
||||
* Draw a line
|
||||
* @param p1 first point of the line
|
||||
* @param p2 second point of the line
|
||||
* @param mask_pthe line will be drawn only on this area
|
||||
* @param style_p pointer to a style
|
||||
*/
|
||||
void lv_draw_line(const point_t * p1, const point_t * p2, const area_t * mask_p,
|
||||
const lv_style_t * style_p);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /*LV_DRAW_H*/
|
||||
@@ -1,216 +0,0 @@
|
||||
/**
|
||||
* @file lv_draw_rbasic.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_draw_rbasic.h"
|
||||
#include "lv_conf.h"
|
||||
#include "hal/disp/disp.h"
|
||||
#include "misc/gfx/font.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Put a pixel to the display
|
||||
* @param x x coordinate of the pixel
|
||||
* @param y y coordinate of the pixel
|
||||
* @param mask_p the pixel will be drawn on this area
|
||||
* @param color color of the pixel
|
||||
* @param opa opacity (ignored, only for compatibility with lv_vpx)
|
||||
*/
|
||||
void lv_rpx(cord_t x, cord_t y, const area_t * mask_p, color_t color, opa_t opa)
|
||||
{
|
||||
area_t area;
|
||||
area.x1 = x;
|
||||
area.y1 = y;
|
||||
area.x2 = x;
|
||||
area.y2 = y;
|
||||
|
||||
lv_rfill(&area, mask_p, color, OPA_COVER);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fill an area on the display
|
||||
* @param cords_p coordinates of the area to fill
|
||||
* @param mask_p fill only o this mask
|
||||
* @param color fill color
|
||||
* @param opa opacity (ignored, only for compatibility with lv_vfill)
|
||||
*/
|
||||
void lv_rfill(const area_t * cords_p, const area_t * mask_p,
|
||||
color_t color, opa_t opa)
|
||||
{
|
||||
area_t masked_area;
|
||||
bool union_ok = true;
|
||||
|
||||
if(mask_p != NULL) {
|
||||
union_ok = area_union(&masked_area, cords_p, mask_p);
|
||||
} else {
|
||||
area_t scr_area;
|
||||
area_set(&scr_area, 0, 0, LV_HOR_RES - 1, LV_VER_RES - 1);
|
||||
union_ok = area_union(&masked_area, cords_p, &scr_area);
|
||||
}
|
||||
|
||||
|
||||
if(union_ok != false){
|
||||
disp_fill(masked_area.x1, masked_area.y1, masked_area.x2, masked_area.y2, color);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Draw a letter to the display
|
||||
* @param pos_p left-top coordinate of the latter
|
||||
* @param mask_p the letter will be drawn only on this area
|
||||
* @param font_p pointer to font
|
||||
* @param letter a letter to draw
|
||||
* @param color color of letter
|
||||
* @param opa opacity of letter (ignored, only for compatibility with lv_vletter)
|
||||
*/
|
||||
void lv_rletter(const point_t * pos_p, const area_t * mask_p,
|
||||
const font_t * font_p, uint8_t letter,
|
||||
color_t color, opa_t opa)
|
||||
{
|
||||
uint8_t w = font_get_width(font_p, letter);
|
||||
const uint8_t * bitmap_p = font_get_bitmap(font_p, letter);
|
||||
|
||||
uint8_t col, col_sub, row;
|
||||
#if FONT_ANTIALIAS == 0
|
||||
for(row = 0; row < font_p->height_row; row ++) {
|
||||
for(col = 0, col_sub = 7; col < w; col ++, col_sub--) {
|
||||
if(*bitmap_p & (1 << col_sub)) {
|
||||
lv_rpx(pos_p->x + col, pos_p->y + row, mask_p, color, opa);
|
||||
}
|
||||
|
||||
if(col_sub == 0) {
|
||||
bitmap_p++;
|
||||
col_sub = 8;
|
||||
}
|
||||
}
|
||||
|
||||
/*Correction if the letter is short*/
|
||||
bitmap_p += font_p->width_byte - ((w >> 3) + 1);
|
||||
/*Go to the next row*/
|
||||
bitmap_p ++;
|
||||
}
|
||||
#else
|
||||
const uint8_t * map1_p = bitmap_p;
|
||||
const uint8_t * map2_p = bitmap_p + font_p->width_byte;
|
||||
uint8_t px_cnt;
|
||||
uint8_t col_byte_cnt;
|
||||
for(row = 0; row < (font_p->height_row >> 1); row ++) {
|
||||
col_byte_cnt = 0;
|
||||
col_sub = 7;
|
||||
for(col = 0; col < (w >> 1); col ++) {
|
||||
|
||||
px_cnt = 0;
|
||||
if((*map1_p & (1 << col_sub)) != 0) px_cnt++;
|
||||
if((*map2_p & (1 << col_sub)) != 0) px_cnt++;
|
||||
if(col_sub != 0) col_sub --;
|
||||
else {
|
||||
col_sub = 7;
|
||||
col_byte_cnt ++;
|
||||
map1_p ++;
|
||||
map2_p ++;
|
||||
}
|
||||
if((*map1_p & (1 << col_sub)) != 0) px_cnt++;
|
||||
if((*map2_p & (1 << col_sub)) != 0) px_cnt++;
|
||||
if(col_sub != 0) col_sub --;
|
||||
else {
|
||||
col_sub = 7;
|
||||
col_byte_cnt ++;
|
||||
map1_p ++;
|
||||
map2_p ++;
|
||||
}
|
||||
|
||||
|
||||
if(px_cnt != 0) {
|
||||
lv_rpx(pos_p->x + col, pos_p->y + row, mask_p, color_mix(color, COLOR_SILVER, 63 * px_cnt), OPA_COVER);
|
||||
}
|
||||
}
|
||||
|
||||
map1_p += font_p->width_byte;
|
||||
map2_p += font_p->width_byte;
|
||||
map1_p += font_p->width_byte - col_byte_cnt;
|
||||
map2_p += font_p->width_byte - col_byte_cnt;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Draw a color map to the display
|
||||
* @param cords_p coordinates the color map
|
||||
* @param mask_p the map will drawn only on this area
|
||||
* @param map_p pointer to a color_t array
|
||||
* @param opa opacity of the map (ignored, only for compatibility with lv_vmap)
|
||||
* @param transp true: enable transparency of LV_IMG_COLOR_TRANSP color pixels
|
||||
* @param upscale true: upscale to double size (not supported)
|
||||
* @param recolor mix the pixels with this color (not supported)
|
||||
* @param recolor_opa the intense of recoloring (not supported)
|
||||
*/
|
||||
void lv_rmap(const area_t * cords_p, const area_t * mask_p,
|
||||
const color_t * map_p, opa_t opa, bool transp, bool upscale,
|
||||
color_t recolor, opa_t recolor_opa)
|
||||
{
|
||||
area_t masked_a;
|
||||
bool union_ok;
|
||||
|
||||
union_ok = area_union(&masked_a, cords_p, mask_p);
|
||||
|
||||
/*If there are common part of the mask and map then draw the map*/
|
||||
if(union_ok == false) return;
|
||||
|
||||
/*Go to the first pixel*/
|
||||
cord_t map_width = area_get_width(cords_p);
|
||||
map_p+= (masked_a.y1 - cords_p->y1) * map_width;
|
||||
map_p += masked_a.x1 - cords_p->x1;
|
||||
|
||||
if(transp == false) {
|
||||
cord_t row;
|
||||
cord_t mask_w = area_get_width(&masked_a) - 1;
|
||||
for(row = 0; row < area_get_height(&masked_a); row++) {
|
||||
disp_map(masked_a.x1, masked_a.y1 + row, masked_a.x1 + mask_w, masked_a.y1 + row, map_p);
|
||||
|
||||
map_p += map_width;
|
||||
}
|
||||
}else {
|
||||
color_t transp_color = LV_COLOR_TRANSP;
|
||||
cord_t row;
|
||||
for(row = 0; row < area_get_height(&masked_a); row++) {
|
||||
cord_t col;
|
||||
for(col = 0; col < area_get_width(&masked_a); col ++) {
|
||||
if(map_p[col].full != transp_color.full) {
|
||||
lv_rpx(masked_a.x1 + col, masked_a.y1 + row, mask_p, map_p[col], opa);
|
||||
}
|
||||
}
|
||||
map_p += map_width;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
@@ -1,80 +0,0 @@
|
||||
/**
|
||||
* @file lv_draw_rbasic..h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LV_DRAW_RBASIC_H
|
||||
#define LV_DRAW_RBASIC_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "misc/gfx/color.h"
|
||||
#include "misc/gfx/area.h"
|
||||
#include "misc/gfx/font.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
|
||||
void lv_rpx(cord_t x, cord_t y, const area_t * mask_p, color_t color, opa_t opa);
|
||||
|
||||
/**
|
||||
* Fill an area on the display
|
||||
* @param cords_p coordinates of the area to fill
|
||||
* @param mask_p fill only o this mask
|
||||
* @param color fill color
|
||||
* @param opa opacity (ignored, only for compatibility with lv_vfill)
|
||||
*/
|
||||
void lv_rfill(const area_t * cords_p, const area_t * mask_p,
|
||||
color_t color, opa_t opa);
|
||||
|
||||
/**
|
||||
* Draw a letter to the display
|
||||
* @param pos_p left-top coordinate of the latter
|
||||
* @param mask_p the letter will be drawn only on this area
|
||||
* @param font_p pointer to font
|
||||
* @param letter a letter to draw
|
||||
* @param color color of letter
|
||||
* @param opa opacity of letter (ignored, only for compatibility with lv_vletter)
|
||||
*/
|
||||
void lv_rletter(const point_t * pos_p, const area_t * mask_p,
|
||||
const font_t * font_p, uint8_t letter,
|
||||
color_t color, opa_t opa);
|
||||
|
||||
/**
|
||||
* Draw a color map to the display
|
||||
* @param cords_p coordinates the color map
|
||||
* @param mask_p the map will drawn only on this area
|
||||
* @param map_p pointer to a color_t array
|
||||
* @param opa opacity of the map (ignored, only for compatibility with lv_vmap)
|
||||
* @param transp true: enable transparency of LV_IMG_COLOR_TRANSP color pixels
|
||||
* @param upscale true: upscale to double size (not supported)
|
||||
* @param recolor mix the pixels with this color (not supported)
|
||||
* @param recolor_opa the intense of recoloring (not supported)
|
||||
*/
|
||||
void lv_rmap(const area_t * cords_p, const area_t * mask_p,
|
||||
const color_t * map_p, opa_t opa, bool transp, bool upscale,
|
||||
color_t recolor, opa_t recolor_opa);
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /*LV_DRAW_RBASIC_H*/
|
||||
@@ -1,533 +0,0 @@
|
||||
/**
|
||||
* @file lv_vdraw.c
|
||||
*
|
||||
*/
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "lv_conf.h"
|
||||
#include "misc/gfx/area.h"
|
||||
#include "misc/gfx/font.h"
|
||||
#include "misc/gfx/color.h"
|
||||
#include "hal/disp/disp.h"
|
||||
|
||||
#if LV_VDB_SIZE != 0
|
||||
|
||||
#include <stddef.h>
|
||||
#include "lvgl/lv_obj/lv_vdb.h"
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static void sw_color_cpy(color_t * dest, const color_t * src, uint32_t length, opa_t opa);
|
||||
static void sw_color_fill(area_t * mem_area, color_t * mem, const area_t * fill_area, color_t color, opa_t opa);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
|
||||
/**
|
||||
* Put a pixel in the Virtual Display Buffer
|
||||
* @param x pixel x coordinate
|
||||
* @param y pixel y coordinate
|
||||
* @param mask_p fill only on this mask (truncated to VDB area)
|
||||
* @param color pixel color
|
||||
* @param opa opacity of the area (0..255)
|
||||
*/
|
||||
void lv_vpx(cord_t x, cord_t y, const area_t * mask_p, color_t color, opa_t opa)
|
||||
{
|
||||
lv_vdb_t * vdb_p = lv_vdb_get();
|
||||
|
||||
/*Pixel out of the mask*/
|
||||
if(x < mask_p->x1 || x > mask_p->x2 ||
|
||||
y < mask_p->y1 || y > mask_p->y2) {
|
||||
return;
|
||||
}
|
||||
|
||||
uint32_t vdb_width = area_get_width(&vdb_p->area);
|
||||
|
||||
/*Make the coordinates relative to VDB*/
|
||||
x-=vdb_p->area.x1;
|
||||
y-=vdb_p->area.y1;
|
||||
color_t * vdb_px_p = vdb_p->buf + y * vdb_width + x;
|
||||
if(opa == OPA_COVER) {
|
||||
*vdb_px_p = color;
|
||||
}
|
||||
else {
|
||||
*vdb_px_p = color_mix(color,*vdb_px_p, opa);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Fill an area in the Virtual Display Buffer
|
||||
* @param cords_p coordinates of the area to fill
|
||||
* @param mask_p fill only o this mask (truncated to VDB area)
|
||||
* @param color fill color
|
||||
* @param opa opacity of the area (0..255)
|
||||
*/
|
||||
void lv_vfill(const area_t * cords_p, const area_t * mask_p,
|
||||
color_t color, opa_t opa)
|
||||
{
|
||||
area_t res_a;
|
||||
bool union_ok;
|
||||
lv_vdb_t * vdb_p = lv_vdb_get();
|
||||
|
||||
/*Get the union of cord and mask*/
|
||||
/* The mask is already truncated to the vdb size
|
||||
* in 'lv_refr_area_with_vdb' function */
|
||||
union_ok = area_union(&res_a, cords_p, mask_p);
|
||||
|
||||
/*If there are common part of the three area then draw to the vdb*/
|
||||
if(union_ok == false) return;
|
||||
|
||||
area_t vdb_rel_a; /*Stores relative coordinates on vdb*/
|
||||
vdb_rel_a.x1 = res_a.x1 - vdb_p->area.x1;
|
||||
vdb_rel_a.y1 = res_a.y1 - vdb_p->area.y1;
|
||||
vdb_rel_a.x2 = res_a.x2 - vdb_p->area.x1;
|
||||
vdb_rel_a.y2 = res_a.y2 - vdb_p->area.y1;
|
||||
|
||||
color_t * vdb_buf_tmp = vdb_p->buf;
|
||||
uint32_t vdb_width = area_get_width(&vdb_p->area);
|
||||
/*Move the vdb_tmp to the first row*/
|
||||
vdb_buf_tmp += vdb_width * vdb_rel_a.y1;
|
||||
|
||||
#if DISP_HW_ACC == 0
|
||||
sw_color_fill(&vdb_p->area, vdb_buf_tmp, &vdb_rel_a, color, opa);
|
||||
#else
|
||||
static color_t color_map[LV_HOR_RES];
|
||||
static cord_t last_width = 0;
|
||||
cord_t map_width = area_get_width(&vdb_rel_a);
|
||||
if(color_map[0].full != color.full || last_width != map_width) {
|
||||
uint16_t i;
|
||||
for(i = 0; i < map_width; i++) {
|
||||
color_map[i].full = color.full;
|
||||
}
|
||||
|
||||
last_width = map_width;
|
||||
}
|
||||
cord_t row;
|
||||
for(row = vdb_rel_a.y1;row <= vdb_rel_a.y2; row++) {
|
||||
disp_color_cpy(&vdb_buf_tmp[vdb_rel_a.x1], color_map, map_width, opa);
|
||||
vdb_buf_tmp += vdb_width;
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Draw a letter in the Virtual Display Buffer
|
||||
* @param pos_p left-top coordinate of the latter
|
||||
* @param mask_p the letter will be drawn only on this area (truncated to VDB area)
|
||||
* @param font_p pointer to font
|
||||
* @param letter a letter to draw
|
||||
* @param color color of letter
|
||||
* @param opa opacity of letter (0..255)
|
||||
*/
|
||||
void lv_vletter(const point_t * pos_p, const area_t * mask_p,
|
||||
const font_t * font_p, uint8_t letter,
|
||||
color_t color, opa_t opa)
|
||||
{
|
||||
if(font_p == NULL) return;
|
||||
|
||||
uint8_t letter_w = font_get_width(font_p, letter);
|
||||
uint8_t letter_h = font_get_height(font_p);
|
||||
|
||||
const uint8_t * map_p = font_get_bitmap(font_p, letter);
|
||||
|
||||
if(map_p == NULL) return;
|
||||
|
||||
/*If the letter is completely out of mask don't draw it */
|
||||
if(pos_p->x + letter_w < mask_p->x1 || pos_p->x > mask_p->x2 ||
|
||||
pos_p->y + letter_h < mask_p->y1 || pos_p->y > mask_p->y2) return;
|
||||
|
||||
lv_vdb_t * vdb_p = lv_vdb_get();
|
||||
cord_t vdb_width = area_get_width(&vdb_p->area);
|
||||
color_t * vdb_buf_tmp = vdb_p->buf;
|
||||
cord_t col, row;
|
||||
uint8_t col_bit;
|
||||
uint8_t col_byte_cnt;
|
||||
|
||||
/* Calculate the col/row start/end on the map
|
||||
* If font anti alaiassing is enabled use the reduced letter sizes*/
|
||||
cord_t col_start = pos_p->x > mask_p->x1 ? 0 : mask_p->x1 - pos_p->x;
|
||||
cord_t col_end = pos_p->x + (letter_w >> FONT_ANTIALIAS) < mask_p->x2 ? (letter_w >> FONT_ANTIALIAS) : mask_p->x2 - pos_p->x + 1;
|
||||
cord_t row_start = pos_p->y > mask_p->y1 ? 0 : mask_p->y1 - pos_p->y;
|
||||
cord_t row_end = pos_p->y + (letter_h >> FONT_ANTIALIAS) < mask_p->y2 ? (letter_h >> FONT_ANTIALIAS) : mask_p->y2 - pos_p->y + 1;
|
||||
|
||||
/*Set a pointer on VDB to the first pixel of the letter*/
|
||||
vdb_buf_tmp += ((pos_p->y - vdb_p->area.y1) * vdb_width)
|
||||
+ pos_p->x - vdb_p->area.x1;
|
||||
|
||||
/*If the letter is partially out of mask the move there on VDB*/
|
||||
vdb_buf_tmp += (row_start * vdb_width) + col_start;
|
||||
|
||||
/*Move on the map too*/
|
||||
map_p += ((row_start << FONT_ANTIALIAS) * font_p->width_byte) + ((col_start << FONT_ANTIALIAS) >> 3);
|
||||
|
||||
#if FONT_ANTIALIAS != 0
|
||||
opa_t opa_tmp = opa;
|
||||
if(opa_tmp != OPA_COVER) opa_tmp = opa_tmp >> 2; /*Opacity per pixel (used when sum the pixels)*/
|
||||
const uint8_t * map1_p = map_p;
|
||||
const uint8_t * map2_p = map_p + font_p->width_byte;
|
||||
uint8_t px_cnt;
|
||||
for(row = row_start; row < row_end; row ++) {
|
||||
col_byte_cnt = 0;
|
||||
col_bit = 7 - ((col_start << FONT_ANTIALIAS) % 8);
|
||||
for(col = col_start; col < col_end; col ++) {
|
||||
|
||||
px_cnt = 0;
|
||||
if((*map1_p & (1 << col_bit)) != 0) px_cnt++;
|
||||
if((*map2_p & (1 << col_bit)) != 0) px_cnt++;
|
||||
if(col_bit != 0) col_bit --;
|
||||
else {
|
||||
col_bit = 7;
|
||||
col_byte_cnt ++;
|
||||
map1_p ++;
|
||||
map2_p ++;
|
||||
}
|
||||
if((*map1_p & (1 << col_bit)) != 0) px_cnt++;
|
||||
if((*map2_p & (1 << col_bit)) != 0) px_cnt++;
|
||||
if(col_bit != 0) col_bit --;
|
||||
else {
|
||||
col_bit = 7;
|
||||
col_byte_cnt ++;
|
||||
map1_p ++;
|
||||
map2_p ++;
|
||||
}
|
||||
|
||||
|
||||
if(px_cnt != 0) {
|
||||
if(opa == OPA_COVER) *vdb_buf_tmp = color_mix(color, *vdb_buf_tmp, 63*px_cnt);
|
||||
else *vdb_buf_tmp = color_mix(color, *vdb_buf_tmp, opa_tmp * px_cnt);
|
||||
}
|
||||
|
||||
vdb_buf_tmp++;
|
||||
}
|
||||
|
||||
map1_p += font_p->width_byte;
|
||||
map2_p += font_p->width_byte;
|
||||
map1_p += font_p->width_byte - col_byte_cnt;
|
||||
map2_p += font_p->width_byte - col_byte_cnt;
|
||||
vdb_buf_tmp += vdb_width - ((col_end) - (col_start)); /*Next row in VDB*/
|
||||
}
|
||||
#else
|
||||
for(row = row_start; row < row_end; row ++) {
|
||||
col_byte_cnt = 0;
|
||||
col_bit = 7 - (col_start % 8);
|
||||
for(col = col_start; col < col_end; col ++) {
|
||||
|
||||
if((*map_p & (1 << col_bit)) != 0) {
|
||||
if(opa == OPA_COVER) *vdb_buf_tmp = color;
|
||||
else *vdb_buf_tmp = color_mix(color, *vdb_buf_tmp, opa);
|
||||
}
|
||||
|
||||
vdb_buf_tmp++;
|
||||
|
||||
if(col_bit != 0) col_bit --;
|
||||
else {
|
||||
col_bit = 7;
|
||||
col_byte_cnt ++;
|
||||
map_p ++;
|
||||
}
|
||||
}
|
||||
|
||||
map_p += font_p->width_byte - col_byte_cnt;
|
||||
vdb_buf_tmp += vdb_width - (col_end - col_start); /*Next row in VDB*/
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Draw a color map to the display
|
||||
* @param cords_p coordinates the color map
|
||||
* @param mask_p the map will drawn only on this area (truncated to VDB area)
|
||||
* @param map_p pointer to a color_t array
|
||||
* @param opa opacity of the map (ignored, only for compatibility with lv_vmap)
|
||||
* @param transp true: enable transparency of LV_IMG_COLOR_TRANSP color pixels
|
||||
* @param upscale true: upscale to double size
|
||||
* @param recolor mix the pixels with this color
|
||||
* @param recolor_opa the intense of recoloring
|
||||
*/
|
||||
void lv_vmap(const area_t * cords_p, const area_t * mask_p,
|
||||
const color_t * map_p, opa_t opa, bool transp, bool upscale,
|
||||
color_t recolor, opa_t recolor_opa)
|
||||
{
|
||||
area_t masked_a;
|
||||
bool union_ok;
|
||||
lv_vdb_t * vdb_p = lv_vdb_get();
|
||||
|
||||
/*Get the union of map size and mask*/
|
||||
/* The mask is already truncated to the vdb size
|
||||
* in 'lv_refr_area_with_vdb' function */
|
||||
union_ok = area_union(&masked_a, cords_p, mask_p);
|
||||
|
||||
/*If there are common part of the three area then draw to the vdb*/
|
||||
if(union_ok == false) return;
|
||||
|
||||
uint8_t ds_shift = 0;
|
||||
if(upscale != false) ds_shift = 1;
|
||||
|
||||
/*If the map starts OUT of the masked area then calc. the first pixel*/
|
||||
cord_t map_width = area_get_width(cords_p) >> ds_shift;
|
||||
if(cords_p->y1 < masked_a.y1) {
|
||||
map_p += (uint32_t) map_width * ((masked_a.y1 - cords_p->y1) >> ds_shift);
|
||||
}
|
||||
if(cords_p->x1 < masked_a.x1) {
|
||||
map_p += (masked_a.x1 - cords_p->x1) >> ds_shift;
|
||||
}
|
||||
|
||||
/*Stores coordinates relative to the act vdb*/
|
||||
masked_a.x1 = masked_a.x1 - vdb_p->area.x1;
|
||||
masked_a.y1 = masked_a.y1 - vdb_p->area.y1;
|
||||
masked_a.x2 = masked_a.x2 - vdb_p->area.x1;
|
||||
masked_a.y2 = masked_a.y2 - vdb_p->area.y1;
|
||||
|
||||
cord_t vdb_width = area_get_width(&vdb_p->area);
|
||||
color_t * vdb_buf_tmp = vdb_p->buf;
|
||||
vdb_buf_tmp += (uint32_t) vdb_width * masked_a.y1; /*Move to the first row*/
|
||||
|
||||
map_p -= (masked_a.x1 >> ds_shift); /*Move back. It will be easier to index 'map_p' later*/
|
||||
|
||||
/*No upscalse*/
|
||||
if(upscale == false) {
|
||||
if(transp == false) { /*Simply copy the pixels to the VDB*/
|
||||
cord_t row;
|
||||
cord_t map_useful_w = area_get_width(&masked_a);
|
||||
|
||||
for(row = masked_a.y1; row <= masked_a.y2; row++) {
|
||||
#if DISP_HW_ACC == 0
|
||||
sw_color_cpy(&vdb_buf_tmp[masked_a.x1], &map_p[masked_a.x1], map_useful_w, opa);
|
||||
#else
|
||||
disp_color_cpy(&vdb_buf_tmp[masked_a.x1], &map_p[masked_a.x1], map_useful_w, opa);
|
||||
#endif
|
||||
map_p += map_width; /*Next row on the map*/
|
||||
vdb_buf_tmp += vdb_width; /*Next row on the VDB*/
|
||||
}
|
||||
/*To recolor draw simply a rectangle above the image*/
|
||||
if(recolor_opa != OPA_TRANSP) {
|
||||
lv_vfill(cords_p, mask_p, recolor, recolor_opa);
|
||||
}
|
||||
} else { /*transp == true: Check all pixels */
|
||||
cord_t row;
|
||||
cord_t col;
|
||||
color_t transp_color = LV_COLOR_TRANSP;
|
||||
|
||||
if(recolor_opa == OPA_TRANSP) {/*No recolor*/
|
||||
if(opa == OPA_COVER) { /*no opa */
|
||||
for(row = masked_a.y1; row <= masked_a.y2; row++) {
|
||||
for(col = masked_a.x1; col <= masked_a.x2; col ++) {
|
||||
if(map_p[col].full != transp_color.full) {
|
||||
vdb_buf_tmp[col] = map_p[col];
|
||||
}
|
||||
}
|
||||
|
||||
map_p += map_width; /*Next row on the map*/
|
||||
vdb_buf_tmp += vdb_width; /*Next row on the VDB*/
|
||||
}
|
||||
} else {
|
||||
for(row = masked_a.y1; row <= masked_a.y2; row++) {
|
||||
for(col = masked_a.x1; col <= masked_a.x2; col ++) {
|
||||
if(map_p[col].full != transp_color.full) {
|
||||
vdb_buf_tmp[col] = color_mix( map_p[col], vdb_buf_tmp[col], opa);
|
||||
}
|
||||
}
|
||||
|
||||
map_p += map_width; /*Next row on the map*/
|
||||
vdb_buf_tmp += vdb_width; /*Next row on the VDB*/
|
||||
}
|
||||
}
|
||||
} else { /*Recolor needed*/
|
||||
color_t color_tmp;
|
||||
if(opa == OPA_COVER) { /*no opa */
|
||||
for(row = masked_a.y1; row <= masked_a.y2; row++) {
|
||||
for(col = masked_a.x1; col <= masked_a.x2; col ++) {
|
||||
if(map_p[col].full != transp_color.full) {
|
||||
color_tmp = color_mix(recolor, map_p[col], recolor_opa);
|
||||
vdb_buf_tmp[col] = color_tmp;
|
||||
}
|
||||
}
|
||||
|
||||
map_p += map_width; /*Next row on the map*/
|
||||
vdb_buf_tmp += vdb_width; /*Next row on the VDB*/
|
||||
}
|
||||
} else {
|
||||
for(row = masked_a.y1; row <= masked_a.y2; row++) {
|
||||
for(col = masked_a.x1; col <= masked_a.x2; col ++) {
|
||||
if(map_p[col].full != transp_color.full) {
|
||||
color_tmp = color_mix(recolor, map_p[col], recolor_opa);
|
||||
vdb_buf_tmp[col] = color_mix(color_tmp, vdb_buf_tmp[col], opa);
|
||||
}
|
||||
}
|
||||
|
||||
map_p += map_width; /*Next row on the map*/
|
||||
vdb_buf_tmp += vdb_width; /*Next row on the VDB*/
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/*Upscalse*/
|
||||
else {
|
||||
cord_t row;
|
||||
cord_t col;
|
||||
color_t transp_color = LV_COLOR_TRANSP;
|
||||
color_t color_tmp;
|
||||
color_t prev_color = COLOR_BLACK;
|
||||
cord_t map_col;
|
||||
|
||||
/*The most simple case (but upscale): 0 opacity, no recolor, no transp. pixels*/
|
||||
if(transp == false && opa == OPA_COVER && recolor_opa == OPA_TRANSP) {
|
||||
cord_t map_col_start = masked_a.x1 >> 1;
|
||||
cord_t map_col_end = masked_a.x2 >> 1;
|
||||
cord_t vdb_col; /*Col. in this row*/
|
||||
cord_t vdb_col2; /*Col. in next row*/
|
||||
for(row = masked_a.y1; row <= masked_a.y2; row += 2) {
|
||||
map_col_start = masked_a.x1 >> 1;
|
||||
map_col_end = masked_a.x2 >> 1;
|
||||
vdb_col = masked_a.x1;
|
||||
vdb_col2 = masked_a.x1 + vdb_width;
|
||||
for(map_col = map_col_start; map_col <= map_col_end; map_col ++, vdb_col += 2, vdb_col2 += 2) {
|
||||
vdb_buf_tmp[vdb_col].full = map_p[map_col].full;
|
||||
vdb_buf_tmp[vdb_col + 1].full = map_p[map_col].full;
|
||||
vdb_buf_tmp[vdb_col2].full = map_p[map_col].full;
|
||||
vdb_buf_tmp[vdb_col2 + 1].full = map_p[map_col].full;
|
||||
}
|
||||
|
||||
map_p += map_width;
|
||||
vdb_buf_tmp += 2 * vdb_width ; /*+ 2 row on the VDB (2 rows are filled because of the upscale)*/
|
||||
|
||||
}
|
||||
}
|
||||
/*Handle other cases*/
|
||||
else {
|
||||
color_tmp = color_mix(recolor, prev_color, recolor_opa);
|
||||
for(row = masked_a.y1; row <= masked_a.y2; row++) {
|
||||
for(col = masked_a.x1; col <= masked_a.x2; col ++) {
|
||||
map_col = col >> 1;
|
||||
|
||||
/*Handle recoloring*/
|
||||
if(recolor_opa == OPA_TRANSP) {
|
||||
color_tmp.full = map_p[map_col].full;
|
||||
} else {
|
||||
if(map_p[map_col].full != prev_color.full) {
|
||||
prev_color.full = map_p[map_col].full;
|
||||
color_tmp = color_mix(recolor, prev_color, recolor_opa);
|
||||
}
|
||||
}
|
||||
/*Put the NOT transparent pixels*/
|
||||
if(transp == false || map_p[map_col].full != transp_color.full) {
|
||||
/*Handle opacity*/
|
||||
if(opa == OPA_COVER) {
|
||||
vdb_buf_tmp[col] = color_tmp;
|
||||
} else {
|
||||
vdb_buf_tmp[col] = color_mix( color_tmp, vdb_buf_tmp[col], opa);
|
||||
}
|
||||
}
|
||||
}
|
||||
if((row & 0x1) != 0) map_p += map_width; /*Next row on the map*/
|
||||
vdb_buf_tmp += vdb_width ; /*Next row on the VDB*/
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
#if DISP_HW_ACC == 0
|
||||
|
||||
/**
|
||||
* Copy pixels to destination memory using opacity
|
||||
* @param dest a memory address. Copy 'src' here.
|
||||
* @param src pointer to pixel map. Copy it to 'dest'.
|
||||
* @param length number of pixels in 'src'
|
||||
* @param opa opacity (0, OPA_TRANSP: transparent ... 255, OPA_COVER, fully cover)
|
||||
*/
|
||||
static void sw_color_cpy(color_t * dest, const color_t * src, uint32_t length, opa_t opa)
|
||||
{
|
||||
if(opa == OPA_COVER) {
|
||||
memcpy(dest, src, length * sizeof(color_t));
|
||||
} else {
|
||||
cord_t col;
|
||||
for(col = 0; col < length; col++) {
|
||||
dest[col] = color_mix(src[col], dest[col], opa);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param mem_area coordinates of 'mem' memory area
|
||||
* @param mem a memory address. Considered to a rectangual window according to 'mem_area'
|
||||
* @param fill_area coordinates of an area to fill. Relative to 'mem_area'.
|
||||
* @param color fill color
|
||||
* @param opa opacity (0, OPA_TRANSP: transparent ... 255, OPA_COVER, fully cover)
|
||||
*/
|
||||
static void sw_color_fill(area_t * mem_area, color_t * mem, const area_t * fill_area, color_t color, opa_t opa)
|
||||
{
|
||||
/*Set all row in vdb to the given color*/
|
||||
cord_t row;
|
||||
uint32_t col;
|
||||
cord_t mem_width = area_get_width(mem_area);
|
||||
|
||||
/*Run simpler function without opacity*/
|
||||
if(opa == OPA_COVER) {
|
||||
/*Fill the first row with 'color'*/
|
||||
for(col = fill_area->x1; col <= fill_area->x2; col++) {
|
||||
mem[col] = color;
|
||||
}
|
||||
/*Copy the first row to all other rows*/
|
||||
color_t * mem_first = &mem[fill_area->x1];
|
||||
cord_t copy_size = (fill_area->x2 - fill_area->x1 + 1) * sizeof(color_t);
|
||||
mem += mem_width;
|
||||
|
||||
for(row = fill_area->y1 + 1; row <= fill_area->y2; row++) {
|
||||
memcpy(&mem[fill_area->x1], mem_first, copy_size);
|
||||
mem += mem_width;
|
||||
}
|
||||
}
|
||||
/*Calculate with alpha too*/
|
||||
else {
|
||||
color_t bg_tmp = COLOR_BLACK;
|
||||
color_t opa_tmp = color_mix(color, bg_tmp, opa);
|
||||
for(row = fill_area->y1; row <= fill_area->y2; row++) {
|
||||
for(col = fill_area->x1; col <= fill_area->x2; col++) {
|
||||
/*If the bg color changed recalculate the result color*/
|
||||
if(mem[col].full != bg_tmp.full) {
|
||||
bg_tmp = mem[col];
|
||||
opa_tmp = color_mix(color, bg_tmp, opa);
|
||||
}
|
||||
mem[col] = opa_tmp;
|
||||
}
|
||||
mem += mem_width;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /*DISP_HW_ACC == 0*/
|
||||
|
||||
#endif
|
||||
@@ -1,87 +0,0 @@
|
||||
/**
|
||||
* @file lv_draw_vbasic.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LV_DRAW_VBASIC_H
|
||||
#define LV_DRAW_VBASIC_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_conf.h"
|
||||
|
||||
#if LV_VDB_SIZE != 0
|
||||
|
||||
#include "misc/gfx/color.h"
|
||||
#include "misc/gfx/area.h"
|
||||
#include "misc/gfx/font.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
|
||||
void lv_vpx(cord_t x, cord_t y, const area_t * mask_p, color_t color, opa_t opa);
|
||||
/**
|
||||
* Fill an area in the Virtual Display Buffer
|
||||
* @param cords_p coordinates of the area to fill
|
||||
* @param mask_p fill only o this mask
|
||||
* @param color fill color
|
||||
* @param opa opacity of the area (0..255)
|
||||
*/
|
||||
void lv_vfill(const area_t * cords_p, const area_t * mask_p,
|
||||
color_t color, opa_t opa);
|
||||
|
||||
/**
|
||||
* Draw a letter in the Virtual Display Buffer
|
||||
* @param pos_p left-top coordinate of the latter
|
||||
* @param mask_p the letter will be drawn only on this area
|
||||
* @param font_p pointer to font
|
||||
* @param letter a letter to draw
|
||||
* @param color color of letter
|
||||
* @param opa opacity of letter (0..255)
|
||||
*/
|
||||
void lv_vletter(const point_t * pos_p, const area_t * mask_p,
|
||||
const font_t * font_p, uint8_t letter,
|
||||
color_t color, opa_t opa);
|
||||
|
||||
/**
|
||||
* Draw a color map to the display
|
||||
* @param cords_p coordinates the color map
|
||||
* @param mask_p the map will drawn only on this area
|
||||
* @param map_p pointer to a color_t array
|
||||
* @param opa opacity of the map (ignored, only for compatibility with lv_vmap)
|
||||
* @param transp true: enable transparency of LV_IMG_COLOR_TRANSP color pixels
|
||||
* @param upscale true: upscale to double size
|
||||
* @param recolor mix the pixels with this color
|
||||
* @param recolor_opa the intense of recoloring
|
||||
*/
|
||||
void lv_vmap(const area_t * cords_p, const area_t * mask_p,
|
||||
const color_t * map_p, opa_t opa, bool transp, bool upscale,
|
||||
color_t recolor, opa_t recolor_opa);
|
||||
|
||||
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /*LV_VDB_SIZE != 0*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /*LV_DRAW_RBASIC_H*/
|
||||
@@ -1,67 +0,0 @@
|
||||
/**
|
||||
* @file lv_ex_hello_world.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* Greetings,
|
||||
* this is the first example in the tutorial hence this is the most simple one.
|
||||
* It only creates a Label, set its text, and align to the middle.
|
||||
*
|
||||
* Be sure in lv_conf.h LV_APP_ENEBLE is 0 (just for simplicity)
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_ex_hello_world.h"
|
||||
#if USE_LV_EXAMPLE != 0
|
||||
|
||||
#include "lvgl/lvgl.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Create a simple 'Hello world!' label
|
||||
*/
|
||||
void lv_ex_hello_world(void)
|
||||
{
|
||||
/*Create a Label on the current screen*/
|
||||
lv_obj_t * label1 = lv_label_create(lv_scr_act(), NULL);
|
||||
|
||||
/*Modify the Label's text*/
|
||||
lv_label_set_text(label1, "Hello world!");
|
||||
|
||||
/* Align the Label to the center
|
||||
* NULL means align on parent (which is the screen now)
|
||||
* 0, 0 at the and means an x, y offset after alignment*/
|
||||
lv_obj_align_us(label1, NULL, LV_ALIGN_CENTER, 0, 0);
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
#endif /*USE_LV_EXAMPLE != 0*/
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 1.8 KiB |
@@ -1,218 +0,0 @@
|
||||
/**
|
||||
* @file lv_hello_world.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* The basic building blocks (components or widgets) in LittlevGL are the graphical objects.
|
||||
* For example:
|
||||
* - Buttons
|
||||
* - Labels
|
||||
* - Charts
|
||||
* - Sliders etc
|
||||
*
|
||||
* In this part you can learn the basics of the objects like creating, positioning, sizing etc.
|
||||
* You will also meet some different object types and their attributes.
|
||||
*
|
||||
* Regardless to the object type the 'lv_obj_t' variable type is used stores the objects
|
||||
* and you can refer to an object with an lv_obj_t pointer (lv_obj_t *)
|
||||
*
|
||||
* INHERITANCE
|
||||
* -------------
|
||||
* Similarly to object oriented languages some kind of inheritance is used
|
||||
* among the object types.
|
||||
*
|
||||
* Every object is derived from the 'Basic object'. (lv_obj)
|
||||
*
|
||||
* The types are backward compatible which means a type can use all the ancestor
|
||||
* attributes/functions too.
|
||||
*
|
||||
* For example a 'Button' is derived from 'Container' which is derived from 'Basic objects'.
|
||||
* Therefore a button can use container attributes like automatically fit size to the content.
|
||||
*
|
||||
* PARENT-CHILD
|
||||
* -------------
|
||||
* A parent can be considered as the container of its children.
|
||||
* Every object has exactly one parent object (except screens).
|
||||
* A parent can have unlimited number of children.
|
||||
* There is no limitation for the type of the parent.
|
||||
*
|
||||
* The children are visible only on their parent. The parts outside will be cropped (not displayed)
|
||||
*
|
||||
* If the parent is moved the children will be moved with it.
|
||||
*
|
||||
* The earlier created object (and its children) will drawn earlier.
|
||||
* Using this layers can be built.
|
||||
*
|
||||
* LEARN MORE
|
||||
* -------------
|
||||
* - General overview: http://www.gl.littlev.hu/objects
|
||||
* - Detailed description of types: http://www.gl.littlev.hu/object-types
|
||||
*
|
||||
* NOTES
|
||||
* -------------
|
||||
* - Be sure 'LV_OBJ_FREE_P' is enabled in 'lv_conf.h'
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_ex_objects.h"
|
||||
#if USE_LV_EXAMPLE != 0
|
||||
|
||||
#include "lvgl/lvgl.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static lv_action_res_t btn_rel_action(lv_obj_t * btn, lv_dispi_t * dispi);
|
||||
static lv_action_res_t ddlist_action(lv_obj_t * ddlist, lv_dispi_t * dispi);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the Object usage example
|
||||
*/
|
||||
void lv_ex_objects(void)
|
||||
{
|
||||
|
||||
/********************
|
||||
* CREATE A SCREEN
|
||||
*******************/
|
||||
|
||||
/* Create a new screen and load it
|
||||
* Screen can be created from any type object
|
||||
* Now a Page is used which is an objects with scrollable content*/
|
||||
lv_obj_t * scr = lv_page_create(NULL, NULL);
|
||||
lv_scr_load(scr);
|
||||
|
||||
|
||||
/****************
|
||||
* ADD A TITLE
|
||||
****************/
|
||||
lv_obj_t * label = lv_label_create(scr, NULL); /*First parameters (scr) is the parent*/
|
||||
lv_label_set_text(label, "Object usage demo"); /*Set the text*/
|
||||
lv_obj_set_x(label, 50); /*Labels are inherited from Basic object so 'lv_obj_...' functions can be used*/
|
||||
|
||||
|
||||
/********************
|
||||
* CREATE TWO BUTTONS
|
||||
********************/
|
||||
|
||||
/*Create a button*/
|
||||
lv_obj_t * btn1 = lv_btn_create(lv_scr_act(), NULL); /*Create a button on the currently loaded screen*/
|
||||
lv_btn_set_rel_action(btn1, btn_rel_action); /*Set function to call when the button is released*/
|
||||
lv_obj_align(btn1, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 20); /*Align below the label*/
|
||||
label = lv_label_create(btn1, NULL); /*Create a label on the button (the 'label' variable can be reused)*/
|
||||
lv_label_set_text(label, "Button 1");
|
||||
|
||||
/*Copy the previous button*/
|
||||
lv_obj_t * btn2 = lv_btn_create(lv_scr_act(), btn1); /*Second parameter is an object to copy*/
|
||||
lv_obj_align(btn2, btn1, LV_ALIGN_OUT_RIGHT_MID, 50, 0);/*Align next to the prev. button.*/
|
||||
label = lv_label_create(btn2, NULL); /*Create a label on the button*/
|
||||
lv_label_set_text(label, "Button 2");
|
||||
|
||||
|
||||
/****************
|
||||
* ADD A SLIDER
|
||||
****************/
|
||||
|
||||
/*Add a slider (inheritance: lv_obj -> lv_bar -> lv_slider)*/
|
||||
lv_obj_t * slider = lv_slider_create(scr, NULL); /*Create a slider*/
|
||||
lv_obj_set_size(slider, lv_obj_get_width(lv_scr_act()) / 3, LV_DPI / 3); /*Set the size*/
|
||||
lv_obj_align(slider, btn1, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 20); /*Align below the first button*/
|
||||
lv_bar_set_value(slider, 30); /*Slider is a 'bar' so set its value like a 'bar'*/
|
||||
|
||||
|
||||
/***********************
|
||||
* ADD A DROP DOWN LIST
|
||||
************************/
|
||||
|
||||
lv_obj_t * ddlist = lv_ddlist_create(lv_scr_act(), NULL);
|
||||
lv_obj_align(ddlist, slider, LV_ALIGN_OUT_RIGHT_TOP, 20, 0); /*Align next to the slider*/
|
||||
lv_obj_set_free_p(ddlist, slider); /*Save the pointer of the slider in the ddlist (used in 'ddlist_action()')*/
|
||||
lv_ddlist_set_options_str(ddlist, "None\nLittle\nHalf\nA lot\nAll"); /*Set the options*/
|
||||
lv_ddlist_set_action(ddlist, ddlist_action); /*Set function to call on new option choose*/
|
||||
lv_obj_set_top(ddlist, true); /*Enable the drop down list always be on the top*/
|
||||
|
||||
|
||||
/****************
|
||||
* CREATE A CHART
|
||||
****************/
|
||||
lv_obj_t * chart = lv_chart_create(lv_scr_act(), NULL); /*Craete the chart*/
|
||||
lv_obj_set_size(chart, lv_obj_get_width(scr) / 2, lv_obj_get_width(scr) / 4); /*Set the size*/
|
||||
lv_obj_align(chart, slider, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 20); /*Align below the slider*/
|
||||
lv_chart_set_dl_width(chart, 3 * LV_DOWNSCALE); /*Set the line width (LV_DOWNSCALE compensates anti-aliasing if enabled)*/
|
||||
|
||||
/*Add a RED data line and set some points*/
|
||||
lv_chart_dl_t * dl1 = lv_chart_add_data_line(chart, COLOR_RED);
|
||||
lv_chart_set_next(chart, dl1, 10);
|
||||
lv_chart_set_next(chart, dl1, 25);
|
||||
lv_chart_set_next(chart, dl1, 45);
|
||||
lv_chart_set_next(chart, dl1, 80);
|
||||
|
||||
/*Add a BLUE data line and set some points*/
|
||||
lv_chart_dl_t * dl2 = lv_chart_add_data_line(chart, COLOR_MAKE(0x40, 0x70, 0xC0));
|
||||
lv_chart_set_next(chart, dl2, 10);
|
||||
lv_chart_set_next(chart, dl2, 25);
|
||||
lv_chart_set_next(chart, dl2, 45);
|
||||
lv_chart_set_next(chart, dl2, 80);
|
||||
lv_chart_set_next(chart, dl2, 75);
|
||||
lv_chart_set_next(chart, dl2, 505);
|
||||
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Called when a button is released
|
||||
* @param btn pointer to the released button
|
||||
* @param dispi pointer to caller display input (e.g. touchpad)
|
||||
* @return LV_ACTION_RES_OK because the object is not deleted in this function
|
||||
*/
|
||||
static lv_action_res_t btn_rel_action(lv_obj_t * btn, lv_dispi_t * dispi)
|
||||
{
|
||||
/*Increase the button width*/
|
||||
cord_t width = lv_obj_get_width(btn);
|
||||
lv_obj_set_width(btn, width + 20);
|
||||
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when a new option is chosen in the drop down list
|
||||
* @param ddlist pointer to the drop down list
|
||||
* @param dispi pointer to caller display input (e.g. touchpad)
|
||||
* @return LV_ACTION_RES_OK because the object is not deleted in this function
|
||||
*/
|
||||
static lv_action_res_t ddlist_action(lv_obj_t * ddlist, lv_dispi_t * dispi)
|
||||
{
|
||||
uint16_t opt = lv_ddlist_get_selected(ddlist); /*Get the id of selected option*/
|
||||
|
||||
lv_obj_t * slider = lv_obj_get_free_p(ddlist); /*Get the saved slider*/
|
||||
lv_bar_set_value(slider, (opt * 100) / 4); /*Modify the slider value according to the selection*/
|
||||
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
#endif /*USE_LV_EXAMPLE != 0*/
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 11 KiB |
@@ -1,161 +0,0 @@
|
||||
/**
|
||||
* @file lv_ex_styles.h
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* You can modify the appearance of the graphical objects with styles.
|
||||
* A style is simple 'lv_style_t' variable.
|
||||
* Objects save the address of this variable so it has to be 'static or 'global'.
|
||||
*
|
||||
* A style contains various attributes to describe rectangle, image or text like
|
||||
* objects at same time. To know which attribute is used by an object see:
|
||||
* http://www.gl.littlev.hu/object-types
|
||||
*
|
||||
* To set a new style for an object use: 'lv_obj_set_style(obj, &style);
|
||||
* If NULL is set as style then the object will inherit the parents style.
|
||||
* For example is you create a style for button the label appearance can be defined there as well.
|
||||
*
|
||||
* You can use built-in styles. 'lv_style_get(LV_STYLE_... , ©)' will give you a pointer to built in style
|
||||
* and copy it to variable (second parameter) if it is not NULL.
|
||||
* By default the objects use the built-in styles.
|
||||
* The built-in styles can be modified in run time to give a new default skin to your GUI.
|
||||
*
|
||||
* Learn more here: http://www.gl.littlev.hu/objects#style
|
||||
* */
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_ex_styles.h"
|
||||
|
||||
#if USE_LV_EXAMPLE != 0
|
||||
|
||||
#include "lvgl/lvgl.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Create a simple 'Hello world!' label
|
||||
*/
|
||||
void lv_ex_styles(void)
|
||||
{
|
||||
|
||||
/****************************************
|
||||
* BASE OBJECT + LABEL WITH DEFAULT STYLE
|
||||
****************************************/
|
||||
|
||||
lv_obj_t * obj1;
|
||||
obj1 = lv_obj_create(lv_scr_act(), NULL); /*Create a simple objects*/
|
||||
lv_obj_set_pos(obj1, 10, 10);
|
||||
lv_obj_t * label = lv_label_create(obj1, NULL);
|
||||
|
||||
/*Add a label to the object*/
|
||||
lv_label_set_text(label, "Default");
|
||||
lv_obj_align(label, NULL, LV_ALIGN_CENTER, 0, 0);
|
||||
|
||||
/****************************************
|
||||
* BASE OBJECT WITH PRETTY COLOR STYLE
|
||||
****************************************/
|
||||
|
||||
lv_obj_t * obj2;
|
||||
obj2 = lv_obj_create(lv_scr_act(), NULL);
|
||||
lv_obj_align(obj2, obj1, LV_ALIGN_OUT_RIGHT_MID, 20, 0); /*Align next to the previous object*/
|
||||
lv_obj_set_style(obj2, lv_style_get(LV_STYLE_PRETTY_COLOR, NULL)); /*Set built in style*/
|
||||
label = lv_label_create(obj2, NULL);
|
||||
|
||||
/* Add a label to the object.
|
||||
* Labels by default inherit the parent's style */
|
||||
lv_label_set_text(label, "Pretty\ncolor");
|
||||
lv_obj_align(label, NULL, LV_ALIGN_CENTER, 0, 0);
|
||||
|
||||
/*****************************
|
||||
* BASE OBJECT WITH NEW STYLE
|
||||
*****************************/
|
||||
|
||||
/* Create a new style */
|
||||
static lv_style_t style_new; /*Styles can't be local variables*/
|
||||
lv_style_get(LV_STYLE_PRETTY_COLOR, &style_new); /*Copy a built-in style as a starting point*/
|
||||
style_new.radius = LV_RADIUS_CIRCLE; /*Fully round corners*/
|
||||
style_new.swidth = 8; /*8 px shadow*/
|
||||
style_new.bwidth = 2; /*2 px border width*/
|
||||
style_new.mcolor = COLOR_WHITE; /*White main color*/
|
||||
style_new.gcolor = color_mix(COLOR_BLUE, COLOR_WHITE, OPA_40); /*light blue gradient color*/
|
||||
style_new.scolor = COLOR_MAKE(0xa0, 0xa0, 0xa0); /*Light gray shadow color*/
|
||||
style_new.ccolor = color_mix(COLOR_BLUE, COLOR_WHITE, OPA_90); /*Blue content color (text color)*/
|
||||
style_new.letter_space = 10; /*10 px letter space*/
|
||||
style_new.txt_align = LV_TXT_ALIGN_MID; /*Middel text align*/
|
||||
|
||||
/*Create a base object and apply the new style*/
|
||||
lv_obj_t * obj3;
|
||||
obj3 = lv_obj_create(lv_scr_act(), NULL);
|
||||
lv_obj_align(obj3, obj2, LV_ALIGN_OUT_RIGHT_MID, 20, 0);
|
||||
lv_obj_set_style(obj3, &style_new);
|
||||
|
||||
/* Add a label to the object.
|
||||
* Labels by default inherit the parent's style */
|
||||
label = lv_label_create(obj3, NULL);
|
||||
lv_label_set_text(label, "New\nstyle");
|
||||
lv_obj_align(label, NULL, LV_ALIGN_CENTER, 0, 0);
|
||||
|
||||
|
||||
/************************
|
||||
* CREATE A STYLED LED
|
||||
***********************/
|
||||
|
||||
/*Create a style for the LED*/
|
||||
static lv_style_t style_led;
|
||||
lv_style_get(LV_STYLE_PRETTY_COLOR, &style_led);
|
||||
style_led.swidth = 15;
|
||||
style_led.radius = LV_RADIUS_CIRCLE;
|
||||
style_led.bwidth = 3;
|
||||
style_led.bopa = OPA_30;
|
||||
style_led.mcolor = COLOR_MAKE(0xb5, 0x0f, 0x04);
|
||||
style_led.gcolor = COLOR_MAKE(0x50, 0x07, 0x02);
|
||||
style_led.bcolor = COLOR_MAKE(0xfa, 0x0f, 0x00);
|
||||
style_led.scolor = COLOR_MAKE(0xb5, 0x0f, 0x04);
|
||||
|
||||
/*Create a LED and switch it ON*/
|
||||
lv_obj_t * led1 = lv_led_create(lv_scr_act(), NULL);
|
||||
lv_obj_set_style(led1, &style_led);
|
||||
lv_obj_align_us(led1, obj1, LV_ALIGN_OUT_BOTTOM_MID, 0, 40);
|
||||
lv_led_on(led1);
|
||||
|
||||
/*Copy the previous LED and set a brightness*/
|
||||
lv_obj_t * led2 = lv_led_create(lv_scr_act(), led1);
|
||||
lv_obj_align_us(led2, obj2, LV_ALIGN_OUT_BOTTOM_MID, 0, 40);
|
||||
lv_led_set_bright(led2, 190);
|
||||
|
||||
/*Copy the previous LED and switch it OFF*/
|
||||
lv_obj_t * led3 = lv_led_create(lv_scr_act(), led1);
|
||||
lv_obj_align_us(led3, obj3, LV_ALIGN_OUT_BOTTOM_MID, 0, 40);
|
||||
lv_led_off(led3);
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
#endif /*USE_LV_EXAMPLE != 0*/
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 11 KiB |
@@ -1 +0,0 @@
|
||||
|
||||
@@ -1,328 +0,0 @@
|
||||
/**
|
||||
* @file lv_ex_encoder_ctrl.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* Create a simple GUI to demonstrate how to control it with an encoder
|
||||
* using 'lv_group'.
|
||||
*
|
||||
* Be sure in lv_conf.h:
|
||||
* - LV_OBJ_GROUP 1 to enable groups
|
||||
* - LV_APP_ENABLE 0 to disable applications because they might bother now
|
||||
*
|
||||
* lv_group:
|
||||
* - you can create groups and add object to them
|
||||
* - it can be a focused object within a group
|
||||
* - the style of the focused object will be automatically modified
|
||||
* - different style modifier functions can be applied in each groups
|
||||
* - you can focus on the next or previous object (lv_group_focus_next/prev)
|
||||
* - letters can be sent to the focused object to do something (lv_group_send):
|
||||
* - LV_GROUP_KEY_RIGHT/UP: increment action in the object
|
||||
* - LV_GROUP_KEY_LEFT/DOWN: decrement action in the object
|
||||
* - LV_GROUP_KEY_ENTER: ok or select action in the object
|
||||
* - LV_GROUP_KEY_ESC: close or back action action in the object
|
||||
* - or any character for example to a text area
|
||||
*
|
||||
* The encoder is replaced by 4 button on the screen:
|
||||
* - [>] Next (lv_group_focus_next): focus on the next object in the group (simulates encoder press)
|
||||
* - [+] IncrementNext (LV_GROUP_KEY_RIGHT): increment signal to the object (simulates rotate right)
|
||||
* - [-] DecrementNext (LV_GROUP_KEY_LEFT): increment signal to the object (simulates rotate left)
|
||||
* - [!] SelectNext (LV_GROUP_KEY_ENTER): Select something (simulates encoder long press or an 'Select' button)
|
||||
*/
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_ex_encoder_ctrl.h"
|
||||
#if USE_LV_EXAMPLE != 0
|
||||
|
||||
#include "lvgl/lvgl.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static void gui_create(void);
|
||||
static void enc_create(void);
|
||||
static lv_action_res_t mbox_yes_action(lv_obj_t * btn, lv_dispi_t * dispi);
|
||||
static lv_action_res_t mbox_no_action(lv_obj_t * btn, lv_dispi_t * dispi);
|
||||
static lv_action_res_t enable_action(lv_obj_t * btn, lv_dispi_t * dispi);
|
||||
static lv_action_res_t enc_next(lv_obj_t * btn, lv_dispi_t * dispi);
|
||||
static lv_action_res_t enc_inc(lv_obj_t * btn, lv_dispi_t * dispi);
|
||||
static lv_action_res_t enc_dec(lv_obj_t * btn, lv_dispi_t * dispi);
|
||||
static lv_action_res_t enc_sel(lv_obj_t * btn, lv_dispi_t * dispi);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
static lv_obj_t * scr; /*The screen for the demo*/
|
||||
static lv_obj_t * btn_enable; /*An enable button*/
|
||||
static lv_style_t style_mbox_bg; /*Black bg. style with opacity*/
|
||||
static lv_group_t * g; /*An Object Group*/
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Create a simple GUI to demonstrate encoder control capability
|
||||
*/
|
||||
void lv_ex_encoder_ctrl(void)
|
||||
{
|
||||
/* Create a Page screen (to make it scrollable)
|
||||
* and use Pretty layout to make the content responsive.
|
||||
* See the 'responsive' example for more information */
|
||||
scr = lv_page_create(NULL, NULL);
|
||||
lv_cont_set_layout(lv_page_get_scrl(scr), LV_CONT_LAYOUT_PRETTY);
|
||||
lv_page_set_sb_mode(scr, LV_PAGE_SB_MODE_AUTO);
|
||||
lv_scr_load(scr);
|
||||
|
||||
/*Create an object group for objects to focus*/
|
||||
g = lv_group_create();
|
||||
|
||||
/* Create a dark plain style for a message box's background*/
|
||||
lv_style_get(LV_STYLE_PLAIN, &style_mbox_bg);
|
||||
style_mbox_bg.mcolor = COLOR_BLACK;
|
||||
style_mbox_bg.gcolor = COLOR_BLACK;
|
||||
style_mbox_bg.opa = OPA_50;
|
||||
|
||||
/*Create a demo GUI*/
|
||||
gui_create();
|
||||
|
||||
/*Create virtual encoder*/
|
||||
enc_create();
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Create a demo GUI
|
||||
*/
|
||||
static void gui_create(void)
|
||||
{
|
||||
/*Create a title*/
|
||||
lv_obj_t * title = lv_label_create(scr, NULL);
|
||||
lv_label_set_text(title, "Encoder control");
|
||||
lv_obj_set_protect(title, LV_PROTECT_FOLLOW); /*Make a line break in the layout*/
|
||||
|
||||
/*Create a drop down list*/
|
||||
lv_obj_t * ddlist = lv_ddlist_create(scr, NULL);
|
||||
lv_ddlist_set_options_str(ddlist, "Low\nMedium\nHigh");
|
||||
lv_group_add_obj(g, ddlist); /*Add the object to the group*/
|
||||
|
||||
/*Create a holder an check boxes on it*/
|
||||
lv_obj_t * holder = lv_cont_create(scr, NULL); /*Create a transparent holder*/
|
||||
lv_cont_set_fit(holder, true, true);
|
||||
lv_cont_set_layout(holder, LV_CONT_LAYOUT_COL_L);
|
||||
lv_obj_set_style(holder, lv_style_get(LV_STYLE_TRANSP, NULL));
|
||||
|
||||
lv_obj_t * cb = lv_cb_create(holder, NULL); /*First check box*/
|
||||
lv_cb_set_text(cb, "Red");
|
||||
lv_group_add_obj(g, cb); /*Add to the group*/
|
||||
|
||||
cb = lv_cb_create(holder, cb); /*Copy the first check box. Automatically added to the same group*/
|
||||
lv_cb_set_text(cb, "Green");
|
||||
|
||||
cb = lv_cb_create(holder, cb); /*Copy the second check box. Automatically added to the same group*/
|
||||
lv_cb_set_text(cb, "Blue");
|
||||
|
||||
/*Create a sliders*/
|
||||
lv_obj_t * slider = lv_slider_create(scr, NULL);
|
||||
lv_obj_set_size_us(slider, 180, 30);
|
||||
lv_bar_set_range(slider, 0, 20);
|
||||
lv_group_add_obj(g, slider); /*Add to the group*/
|
||||
|
||||
/*Create a button*/
|
||||
btn_enable = lv_btn_create(scr, NULL);
|
||||
lv_btn_set_rel_action(btn_enable, enable_action);
|
||||
lv_cont_set_fit(btn_enable, true, true);
|
||||
lv_group_add_obj(g, btn_enable); /*Add to the group*/
|
||||
lv_obj_t * l = lv_label_create(btn_enable, NULL);
|
||||
lv_label_set_text(l, "Enable");
|
||||
lv_obj_set_protect(btn_enable, LV_PROTECT_FOLLOW); /*Make a line break in the layout*/
|
||||
}
|
||||
|
||||
/**
|
||||
* Create virtual encoder using 4 buttons:
|
||||
* - [>] Next: focus on the next object in the group (simulates encoder press)
|
||||
* - [+] Increment: increment signal to the object (simulates rotate right)
|
||||
* - [-] Decrement: increment signal to the object (simulates rotate left)
|
||||
* - [!] Select: Select something (simulates encoder long press or an 'Select' button)
|
||||
*/
|
||||
static void enc_create(void)
|
||||
{
|
||||
/*Next button*/
|
||||
lv_obj_t * btn = lv_btn_create(lv_scr_act(), NULL);
|
||||
lv_btn_set_rel_action(btn, enc_next);
|
||||
lv_cont_set_fit(btn, true, true);
|
||||
lv_obj_t * l = lv_label_create(btn, NULL);
|
||||
lv_label_set_text(l, ">");
|
||||
|
||||
/*Increment button*/
|
||||
btn = lv_btn_create(lv_scr_act(), btn);
|
||||
lv_btn_set_rel_action(btn, enc_dec);
|
||||
l = lv_label_create(btn, NULL);
|
||||
lv_label_set_text(l, "-");
|
||||
|
||||
/*Decrement button*/
|
||||
btn = lv_btn_create(lv_scr_act(), btn);
|
||||
lv_btn_set_rel_action(btn, enc_inc);
|
||||
l = lv_label_create(btn, NULL);
|
||||
lv_label_set_text(l, "+");
|
||||
|
||||
/*Select button*/
|
||||
btn = lv_btn_create(lv_scr_act(), btn);
|
||||
lv_btn_set_rel_action(btn, enc_sel);
|
||||
l = lv_label_create(btn, NULL);
|
||||
lv_label_set_text(l, "!");
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the Enable button is released. Show a message box to really enable or not?
|
||||
* @param btn pointer to the Enable button
|
||||
* @param dispi pointer to the caller display input or NULL if the encoder used
|
||||
* @return LV_ACTION_RES_OK: because the button is not deleted
|
||||
*/
|
||||
static lv_action_res_t enable_action(lv_obj_t * btn, lv_dispi_t * dispi)
|
||||
{
|
||||
/*If the butto nsi released the show message box to be sure about the Enable*/
|
||||
if(lv_btn_get_state(btn) == LV_BTN_STATE_REL) {
|
||||
/* Create a dark screen sized bg. with opacity to show
|
||||
* the other objects are not available now*/
|
||||
lv_obj_t * bg = lv_obj_create(scr, NULL);
|
||||
lv_obj_set_protect(bg, LV_PROTECT_PARENT); /*The page screen move it to scrollable area*/
|
||||
lv_obj_set_parent(bg, scr); /*So movi it back ater protected*/
|
||||
lv_obj_set_style(bg, &style_mbox_bg);
|
||||
lv_obj_set_size(bg, LV_HOR_RES, LV_VER_RES);
|
||||
lv_obj_set_pos(bg, 0, 0);
|
||||
lv_obj_set_click(bg, false); /*For test disable click there fore buttons under it remain clickable*/
|
||||
|
||||
/*Create a message box*/
|
||||
lv_obj_t * mbox = lv_mbox_create(bg, NULL);
|
||||
lv_mbox_set_text(mbox, "Really Enable the outputs?");
|
||||
lv_group_add_obj(g, mbox); /*Add to he group*/
|
||||
|
||||
/*Add two buttons*/
|
||||
lv_mbox_add_btn(mbox, "Yes", mbox_yes_action);
|
||||
lv_mbox_add_btn(mbox, "No", mbox_no_action);
|
||||
|
||||
lv_obj_align(mbox, NULL, LV_ALIGN_CENTER, 0, - LV_DPI / 2);
|
||||
|
||||
/*Focus on the new message box, can freeze focus on it*/
|
||||
lv_group_focus_obj(mbox);
|
||||
lv_group_focus_freeze(g, true);
|
||||
}
|
||||
/*Disable is not dangerous so just change the button state*/
|
||||
else {
|
||||
lv_btn_set_state(btn_enable, LV_BTN_STATE_REL);
|
||||
}
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the message box's 'Yes' button is released
|
||||
* @param btn pointer to the 'Yes' button
|
||||
* @param dispi pointer to the caller display input or NULL if the encoder used
|
||||
* @return LV_ACTION_RES_INV: because the button along with the message box will be deleted
|
||||
*/
|
||||
static lv_action_res_t mbox_yes_action(lv_obj_t * btn, lv_dispi_t * dispi)
|
||||
{
|
||||
lv_group_focus_freeze(g, false); /*Release the freeze*/
|
||||
lv_obj_t * mbox = lv_mbox_get_from_btn(btn);
|
||||
lv_obj_del(lv_obj_get_parent(mbox)); /*Delete the black background. (it will delete the mbox too)*/
|
||||
|
||||
/*Mark the enabled state by toggling the button*/
|
||||
lv_btn_set_state(btn_enable, LV_BTN_STATE_TREL);
|
||||
|
||||
/* In a real case you can add some specific actions here
|
||||
* to really enable something */
|
||||
|
||||
return LV_ACTION_RES_INV;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the message box's 'No' button is released
|
||||
* @param btn pointer to the 'No' button
|
||||
* @param dispi pointer to the caller display input or NULL if the encoder used
|
||||
* @return LV_ACTION_RES_INV: because the button along with the message box will be deleted
|
||||
*/
|
||||
static lv_action_res_t mbox_no_action(lv_obj_t * btn, lv_dispi_t * dispi)
|
||||
{
|
||||
lv_group_focus_freeze(g, false); /*Release the freeze*/
|
||||
lv_obj_t * mbox = lv_mbox_get_from_btn(btn);
|
||||
lv_obj_del(lv_obj_get_parent(mbox)); /*Delete the black background. (it will delete the mbox too)*/
|
||||
|
||||
return LV_ACTION_RES_INV;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the Encoder emulator's Next button is released
|
||||
* @param btn pointer to the button
|
||||
* @param dispi pointer to the caller display input
|
||||
* @return LV_ACTION_RES_OK: because the button is not deleted
|
||||
*/
|
||||
static lv_action_res_t enc_next(lv_obj_t * btn, lv_dispi_t * dispi)
|
||||
{
|
||||
/*Focus on the next object in the group*/
|
||||
lv_group_focus_next(g);
|
||||
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the Encoder emulator's Increment button is released
|
||||
* @param btn pointer to the button
|
||||
* @param dispi pointer to the caller display input
|
||||
* @return LV_ACTION_RES_OK: because the button is not deleted
|
||||
*/
|
||||
static lv_action_res_t enc_inc(lv_obj_t * btn, lv_dispi_t * dispi)
|
||||
{
|
||||
/* Send RIGHT key when rotate to right.
|
||||
* It will trigger an increment like action in the object */
|
||||
lv_group_send(g, LV_GROUP_KEY_RIGHT);
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the Encoder emulator's Increment button is released
|
||||
* @param btn pointer to the button
|
||||
* @param dispi pointer to the caller display input
|
||||
* @return LV_ACTION_RES_OK: because the button is not deleted
|
||||
*/
|
||||
static lv_action_res_t enc_dec(lv_obj_t * btn, lv_dispi_t * dispi)
|
||||
{
|
||||
/* Send LEFT key when rotate to left.
|
||||
* It will trigger a decrement like action in the object */
|
||||
lv_group_send(g, LV_GROUP_KEY_LEFT);
|
||||
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
/**
|
||||
* Called when the Encoder emulator's Send button is released
|
||||
* @param btn pointer to the button
|
||||
* @param dispi pointer to the caller display input
|
||||
* @return LV_ACTION_RES_OK: because the button is not deleted
|
||||
*/
|
||||
static lv_action_res_t enc_sel(lv_obj_t * btn, lv_dispi_t * dispi)
|
||||
{
|
||||
/* Send ENTER key.
|
||||
* It will trigger an 'OK' or 'Select' action in the object */
|
||||
lv_group_send(g, LV_GROUP_KEY_ENTER);
|
||||
|
||||
return LV_ACTION_RES_OK;
|
||||
}
|
||||
|
||||
#endif /*USE_LV_EXAMPLE != 0*/
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 8.8 KiB |
@@ -1,41 +0,0 @@
|
||||
# EXAMPLES FOR LITTLEV GRAPHICS LIBRARY
|
||||
|
||||
## Introduction
|
||||
In the folders you will find simple hardware independent examples to know the key features of Littlev Graphics Library.
|
||||
The examples are organized in consistent way and can be used as a **Tutorial**.
|
||||
|
||||
Every example consist of least an *example_name.c* and *example_name.h* files. You can load an example in your *main* function with **example_name_init()**. The header file has to be included too.
|
||||
|
||||
You will find **detailed explanation** in the *c* and *h* files.
|
||||
|
||||
The examples can be enabled/disabled in *lv_conf.h* with **USE_LV_EXAMPLES**.
|
||||
|
||||
## 1_x Getting started
|
||||
With examples in this section you can learn the basics from a simple *Hello world* label to a complex full featured GUI with animations and other effects. You will learn about
|
||||
- creating, deleting graphical objects
|
||||
- modify their attributes
|
||||
- change their style
|
||||
- and even creating a new object type
|
||||
|
||||
## 2_x GUI control without Touchpad
|
||||
You can control your GUI not only with Touchpad. The most simple way to put real buttons next to the graphical ones and simulate *touch pad-like press* on the display. An other way is to organize the objects in groups and *focus* on one of objects. Then you can control the object-in-focus with simple character instructions. Or using a cursor and mouse is also possible. So an external control device can be
|
||||
- push buttons
|
||||
- encoders
|
||||
- keyboard
|
||||
- or a mouse
|
||||
|
||||
In this section you will find examples for them!
|
||||
|
||||
## 3_x Applications
|
||||
The applications are high level components to do complex thing with a nice user interface. An application can be for example
|
||||
- WiFi network manager
|
||||
- File system browser
|
||||
- System monitor
|
||||
- Terminal etc.
|
||||
|
||||
Here you will find examples how to run application, and communicate with them.
|
||||
|
||||
## Final words
|
||||
If you also have codes which could be useful for others, please share it via *Pull requests* on *GitHub*!
|
||||
Thank you in advance!
|
||||
|
||||
@@ -1,494 +0,0 @@
|
||||
/**
|
||||
* @file lv_dispi.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
********************/
|
||||
#include "lv_conf.h"
|
||||
|
||||
#include "misc/os/ptask.h"
|
||||
#include "misc/math/math_base.h"
|
||||
#include "lv_dispi.h"
|
||||
#include "../lv_draw/lv_draw_rbasic.h"
|
||||
#include "hal/indev/indev.h"
|
||||
#include "hal/systick/systick.h"
|
||||
#include "lv_obj.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static void dispi_task(void * param);
|
||||
static void dispi_proc_point(lv_dispi_t * dispi_p, cord_t x, cord_t y);
|
||||
static void dispi_proc_press(lv_dispi_t * dispi_p);
|
||||
static void disi_proc_release(lv_dispi_t * dispi_p);
|
||||
static lv_obj_t * dispi_search_obj(const lv_dispi_t * dispi_p, lv_obj_t * obj);
|
||||
static void dispi_drag(lv_dispi_t * dispi_p);
|
||||
static void dispi_drag_throw(lv_dispi_t * dispi_p);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
static ptask_t* dispi_task_p;
|
||||
static bool lv_dispi_reset_qry;
|
||||
static bool lv_dispi_reset_now;
|
||||
static lv_dispi_t dispi_array[INDEV_NUM];
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the display input subsystem
|
||||
*/
|
||||
void lv_dispi_init(void)
|
||||
{
|
||||
lv_dispi_reset_qry = false;
|
||||
lv_dispi_reset_now = false;
|
||||
|
||||
#if LV_DISPI_READ_PERIOD != 0
|
||||
dispi_task_p = ptask_create(dispi_task, LV_DISPI_READ_PERIOD, PTASK_PRIO_MID, NULL);
|
||||
#else
|
||||
dispi_task_p = ptask_create(dispi_task, 1, PTASK_PRIO_OFF); /*Not use lv_dispi*/
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an array with all the display inputs. Contains (INDEV_NUM elements)
|
||||
* @return pointer to a an lv_dispi_t array.
|
||||
*/
|
||||
lv_dispi_t * lv_dispi_get_array(void)
|
||||
{
|
||||
return dispi_array;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset all display inputs
|
||||
*/
|
||||
void lv_dispi_reset(void)
|
||||
{
|
||||
lv_dispi_reset_qry = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset the long press state of a display input
|
||||
* @param dispi pointer to a display input
|
||||
*/
|
||||
void lv_dispi_reset_lpr(lv_dispi_t * dispi)
|
||||
{
|
||||
dispi->long_press_sent = 0;
|
||||
dispi->lpr_rep_time_stamp = systick_get();
|
||||
dispi->press_time_stamp = systick_get();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the last point on display input
|
||||
* @param dispi pointer to a display input
|
||||
* @param point pointer to a point to store the result
|
||||
*/
|
||||
void lv_dispi_get_point(lv_dispi_t * dispi, point_t * point)
|
||||
{
|
||||
point->x = dispi->act_point.x;
|
||||
point->y = dispi->act_point.y;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if there is dragging on display input or not
|
||||
* @param dispi pointer to a display input
|
||||
* @return true: drag is in progress
|
||||
*/
|
||||
bool lv_dispi_is_dragging(lv_dispi_t * dispi)
|
||||
{
|
||||
return dispi->drag_in_prog == 0 ? false : true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the vector of dragging on a display input
|
||||
* @param dispi pointer to a display input
|
||||
* @param point pointer to a point to store the vector
|
||||
*/
|
||||
void lv_dispi_get_vect(lv_dispi_t * dispi, point_t * point)
|
||||
{
|
||||
point->x = dispi->vect.x;
|
||||
point->y = dispi->vect.y;
|
||||
}
|
||||
|
||||
/**
|
||||
* Do nothing until the next release
|
||||
* @param dispi pointer to a display input
|
||||
*/
|
||||
void lv_dispi_wait_release(lv_dispi_t * dispi)
|
||||
{
|
||||
dispi->wait_release = 1;
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Called periodically to handle the display inputs
|
||||
* @param param unused
|
||||
*/
|
||||
static void dispi_task(void * param)
|
||||
{
|
||||
cord_t x;
|
||||
cord_t y;
|
||||
uint8_t i;
|
||||
|
||||
for (i = 0; i < INDEV_NUM; i++) {
|
||||
dispi_array[i].pressed = indev_get(i, &x, &y);
|
||||
dispi_proc_point(&dispi_array[i], x, y);
|
||||
}
|
||||
|
||||
/*If reset query occurred in this round then set a flag to
|
||||
* ask the dispis to reset themself in the next round */
|
||||
if(lv_dispi_reset_qry != false) {
|
||||
lv_dispi_reset_qry = false;
|
||||
lv_dispi_reset_now = true;
|
||||
}
|
||||
/*If now a reset occurred then clear the flag*/
|
||||
else if (lv_dispi_reset_now != false){
|
||||
lv_dispi_reset_now = false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Process new points by a display input. dispi_p->pressed has to be set
|
||||
* @param dispi_p pointer to a display input
|
||||
* @param x x coordinate of the next point
|
||||
* @param y y coordinate of the next point
|
||||
*/
|
||||
static void dispi_proc_point(lv_dispi_t * dispi_p, cord_t x, cord_t y)
|
||||
{
|
||||
#if LV_ANTIALIAS != 0 && LV_VDB_SIZE != 0
|
||||
dispi_p->act_point.x = x * LV_DOWNSCALE;
|
||||
dispi_p->act_point.y = y * LV_DOWNSCALE;
|
||||
#else
|
||||
dispi_p->act_point.x = x;
|
||||
dispi_p->act_point.y = y;
|
||||
#endif
|
||||
/*Handle the reset query*/
|
||||
if(lv_dispi_reset_now != false) {
|
||||
dispi_p->act_obj = NULL;
|
||||
dispi_p->last_obj = NULL;
|
||||
dispi_p->drag_range_out = 0;
|
||||
dispi_p->drag_in_prog = 0;
|
||||
dispi_p->long_press_sent = 0;
|
||||
dispi_p->press_time_stamp = 0;
|
||||
dispi_p->lpr_rep_time_stamp = 0;
|
||||
dispi_p->vect_sum.x = 0;
|
||||
dispi_p->vect_sum.y = 0;
|
||||
}
|
||||
|
||||
if(dispi_p->pressed != false){
|
||||
#if LV_DISPI_TP_MARKER != 0
|
||||
area_t area;
|
||||
area.x1 = x - (LV_DISPI_TP_MARKER >> 1);
|
||||
area.y1 = y - (LV_DISPI_TP_MARKER >> 1);
|
||||
area.x2 = x + ((LV_DISPI_TP_MARKER >> 1) | 0x1);
|
||||
area.y2 = y + ((LV_DISPI_TP_MARKER >> 1) | 0x1);
|
||||
lv_rfill(&area, NULL, COLOR_MAKE(0xFF, 0, 0), OPA_COVER);
|
||||
#endif
|
||||
dispi_proc_press(dispi_p);
|
||||
} else {
|
||||
disi_proc_release(dispi_p);
|
||||
}
|
||||
|
||||
|
||||
dispi_p->last_point.x = dispi_p->act_point.x;
|
||||
dispi_p->last_point.y = dispi_p->act_point.y;
|
||||
}
|
||||
|
||||
/**
|
||||
* Process the pressed state
|
||||
* @param dispi_p pointer to a display input
|
||||
*/
|
||||
static void dispi_proc_press(lv_dispi_t * dispi_p)
|
||||
{
|
||||
lv_obj_t * pr_obj = dispi_p->act_obj;
|
||||
|
||||
if(dispi_p->wait_release != 0) return;
|
||||
|
||||
/*If there is no last object then search*/
|
||||
if(dispi_p->act_obj == NULL) {
|
||||
pr_obj = dispi_search_obj(dispi_p, lv_scr_act());
|
||||
}
|
||||
/*If there is last object but it is not dragged also search*/
|
||||
else if(dispi_p->drag_in_prog == 0) {/*Now act_obj != NULL*/
|
||||
pr_obj = dispi_search_obj(dispi_p, lv_scr_act());
|
||||
}
|
||||
/*If a dragable object was the last then keep it*/
|
||||
else {
|
||||
|
||||
}
|
||||
|
||||
/*If a new object was found reset some variables and send a pressed signal*/
|
||||
if(pr_obj != dispi_p->act_obj) {
|
||||
|
||||
dispi_p->last_point.x = dispi_p->act_point.x;
|
||||
dispi_p->last_point.y = dispi_p->act_point.y;
|
||||
|
||||
/*If a new object found the previous was lost, so send a signal*/
|
||||
if(dispi_p->act_obj != NULL) {
|
||||
dispi_p->act_obj->signal_f(dispi_p->act_obj,
|
||||
LV_SIGNAL_PRESS_LOST, dispi_p);
|
||||
}
|
||||
|
||||
if(pr_obj != NULL) {
|
||||
/* Save the time when the obj pressed.
|
||||
* It is necessary to count the long press time.*/
|
||||
dispi_p->press_time_stamp = systick_get();
|
||||
dispi_p->long_press_sent = 0;
|
||||
dispi_p->drag_range_out = 0;
|
||||
dispi_p->drag_in_prog = 0;
|
||||
dispi_p->vect_sum.x = 0;
|
||||
dispi_p->vect_sum.y = 0;
|
||||
|
||||
/*Search for 'top' attribute*/
|
||||
lv_obj_t * i = pr_obj;
|
||||
lv_obj_t * last_top = NULL;
|
||||
while(i != NULL){
|
||||
if(i->top_en != 0) last_top = i;
|
||||
i = lv_obj_get_parent(i);
|
||||
}
|
||||
|
||||
if(last_top != NULL) {
|
||||
/*Move the last_top object to the foreground*/
|
||||
lv_obj_t * par =lv_obj_get_parent(last_top);
|
||||
/*After list change it will be the new head*/
|
||||
ll_chg_list(&par->child_ll, &par->child_ll, last_top);
|
||||
lv_obj_inv(last_top);
|
||||
}
|
||||
|
||||
/*Send a signal about the press*/
|
||||
pr_obj->signal_f(pr_obj, LV_SIGNAL_PRESSED, dispi_p);
|
||||
}
|
||||
}
|
||||
|
||||
/* The reset can be set in the signal function.
|
||||
* In case of reset query ignore the remaining parts.*/
|
||||
if(lv_dispi_reset_qry == false) {
|
||||
dispi_p->act_obj = pr_obj; /*Save the pressed object*/
|
||||
dispi_p->last_obj = dispi_p->act_obj; /*Refresh the last_obj*/
|
||||
|
||||
/*Calculate the vector*/
|
||||
dispi_p->vect.x = dispi_p->act_point.x - dispi_p->last_point.x;
|
||||
dispi_p->vect.y = dispi_p->act_point.y - dispi_p->last_point.y;
|
||||
|
||||
/*If there is active object and it can be dragged run the drag*/
|
||||
if(dispi_p->act_obj != NULL) {
|
||||
dispi_p->act_obj->signal_f(dispi_p->act_obj, LV_SIGNAL_PRESSING, dispi_p);
|
||||
|
||||
dispi_drag(dispi_p);
|
||||
|
||||
/*If there is no drag then check for long press time*/
|
||||
if(dispi_p->drag_in_prog == 0 && dispi_p->long_press_sent == 0) {
|
||||
/*Send a signal about the long press if enough time elapsed*/
|
||||
if(systick_elaps(dispi_p->press_time_stamp) > LV_DISPI_LONG_PRESS_TIME) {
|
||||
pr_obj->signal_f(pr_obj, LV_SIGNAL_LONG_PRESS, dispi_p);
|
||||
|
||||
/*Mark the signal sending to do not send it again*/
|
||||
dispi_p->long_press_sent = 1;
|
||||
|
||||
/*Save the long press time stamp for the long press repeat handler*/
|
||||
dispi_p->lpr_rep_time_stamp = systick_get();
|
||||
}
|
||||
}
|
||||
/*Send long press repeated signal*/
|
||||
if(dispi_p->drag_in_prog == 0 && dispi_p->long_press_sent == 1) {
|
||||
/*Send a signal about the long press repeate if enough time elapsed*/
|
||||
if(systick_elaps(dispi_p->lpr_rep_time_stamp) > LV_DISPI_LONG_PRESS_REP_TIME) {
|
||||
pr_obj->signal_f(pr_obj, LV_SIGNAL_LONG_PRESS_REP, dispi_p);
|
||||
dispi_p->lpr_rep_time_stamp = systick_get();
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Process the released state
|
||||
* @param dispi_p pointer to a display input
|
||||
*/
|
||||
static void disi_proc_release(lv_dispi_t * dispi_p)
|
||||
{
|
||||
if(dispi_p->wait_release != 0) {
|
||||
dispi_p->act_obj = NULL;
|
||||
dispi_p->last_obj = NULL;
|
||||
dispi_p->press_time_stamp = 0;
|
||||
dispi_p->lpr_rep_time_stamp = 0;
|
||||
dispi_p->wait_release = 0;
|
||||
}
|
||||
|
||||
/*Forgot the act obj and send a released signal */
|
||||
if(dispi_p->act_obj != NULL) {
|
||||
dispi_p->act_obj->signal_f(dispi_p->act_obj,
|
||||
LV_SIGNAL_RELEASED, dispi_p);
|
||||
dispi_p->act_obj = NULL;
|
||||
dispi_p->press_time_stamp = 0;
|
||||
dispi_p->lpr_rep_time_stamp = 0;
|
||||
}
|
||||
|
||||
/*The reset can be set in the signal function.
|
||||
* In case of reset query ignore the remaining parts.*/
|
||||
if(dispi_p->last_obj != NULL && lv_dispi_reset_qry == false) {
|
||||
dispi_drag_throw(dispi_p);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Search the most top, clickable object on the last point of a display input
|
||||
* @param dispi_p pointer to a display input
|
||||
* @param obj pointer to a start object, typically the screen
|
||||
* @return pointer to the found object or NULL if there was no suitable object
|
||||
*/
|
||||
static lv_obj_t * dispi_search_obj(const lv_dispi_t * dispi_p, lv_obj_t * obj)
|
||||
{
|
||||
lv_obj_t * found_p = NULL;
|
||||
|
||||
/*If the point is on this object*/
|
||||
/*Check its children too*/
|
||||
if(area_is_point_on(&obj->cords, &dispi_p->act_point)) {
|
||||
lv_obj_t * i;
|
||||
|
||||
LL_READ(obj->child_ll, i) {
|
||||
found_p = dispi_search_obj(dispi_p, i);
|
||||
|
||||
/*If a child was found then break*/
|
||||
if(found_p != NULL) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*If then the children was not ok, but this obj is clickable
|
||||
* and it or its parent is not hidden then save this object*/
|
||||
if(found_p == NULL && lv_obj_get_click(obj) != false) {
|
||||
lv_obj_t * i = obj;
|
||||
while(i != NULL) {
|
||||
if(lv_obj_get_hidden(i) == true) break;
|
||||
i = lv_obj_get_parent(i);
|
||||
}
|
||||
/*No parent found with hidden == true*/
|
||||
if(i == NULL) found_p = obj;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return found_p;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the dragging of dispi_p->act_obj
|
||||
* @param dispi_p pointer to a display input
|
||||
*/
|
||||
static void dispi_drag(lv_dispi_t * dispi_p)
|
||||
{
|
||||
lv_obj_t * drag_obj = dispi_p->act_obj;
|
||||
|
||||
/*If drag parent is active check recursively the drag_parent attribute*/
|
||||
while(lv_obj_get_drag_parent(drag_obj) != false &&
|
||||
drag_obj != NULL) {
|
||||
drag_obj = lv_obj_get_parent(drag_obj);
|
||||
}
|
||||
|
||||
if(drag_obj == NULL) return;
|
||||
|
||||
if(lv_obj_get_drag(drag_obj) == false) return;
|
||||
|
||||
/*If still there is no drag then count the movement*/
|
||||
if(dispi_p->drag_range_out == 0) {
|
||||
dispi_p->vect_sum.x += dispi_p->vect.x;
|
||||
dispi_p->vect_sum.y += dispi_p->vect.y;
|
||||
|
||||
/*If a move is greater then LV_DRAG_LIMIT then begin the drag*/
|
||||
if(MATH_ABS(dispi_p->vect_sum.x) >= LV_DISPI_DRAG_LIMIT ||
|
||||
MATH_ABS(dispi_p->vect_sum.y) >= LV_DISPI_DRAG_LIMIT)
|
||||
{
|
||||
dispi_p->drag_range_out = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/*If the drag limit is stepped over then handle the dragging*/
|
||||
if(dispi_p->drag_range_out != 0) {
|
||||
/*Set new position if the vector is not zero*/
|
||||
if(dispi_p->vect.x != 0 ||
|
||||
dispi_p->vect.y != 0) {
|
||||
/*Get the coordinates of the object end modify them*/
|
||||
cord_t act_x = lv_obj_get_x(drag_obj);
|
||||
cord_t act_y = lv_obj_get_y(drag_obj);
|
||||
|
||||
lv_obj_set_pos(drag_obj, act_x + dispi_p->vect.x, act_y + dispi_p->vect.y);
|
||||
|
||||
/*Set the drag in progress flag if the object is really moved*/
|
||||
if(lv_obj_get_x(drag_obj) != act_x || lv_obj_get_y(drag_obj) != act_y) {
|
||||
if(dispi_p->drag_range_out != 0) { /*Send the drag begin signal on first move*/
|
||||
drag_obj->signal_f(drag_obj, LV_SIGNAL_DRAG_BEGIN, dispi_p);
|
||||
}
|
||||
dispi_p->drag_in_prog = 1;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle throwing by drag if the drag is ended
|
||||
* @param dispi_p pointer to a display input
|
||||
*/
|
||||
static void dispi_drag_throw(lv_dispi_t * dispi_p)
|
||||
{
|
||||
if(dispi_p->drag_in_prog == 0) return;
|
||||
|
||||
/*Set new position if the vector is not zero*/
|
||||
lv_obj_t * drag_obj = dispi_p->last_obj;
|
||||
|
||||
/*If drag parent is active check recursively the drag_parent attribute*/
|
||||
|
||||
while(lv_obj_get_drag_parent(drag_obj) != false &&
|
||||
drag_obj != NULL) {
|
||||
drag_obj = lv_obj_get_parent(drag_obj);
|
||||
}
|
||||
|
||||
if(drag_obj == NULL) return;
|
||||
|
||||
/*Return if the drag throw is not enabled*/
|
||||
if(lv_obj_get_drag_throw(drag_obj) == false ){
|
||||
dispi_p->drag_in_prog = 0;
|
||||
drag_obj->signal_f(drag_obj, LV_SIGNAL_DRAG_END, dispi_p);
|
||||
return;
|
||||
}
|
||||
|
||||
/*Reduce the vectors*/
|
||||
dispi_p->vect.x = dispi_p->vect.x * (100 -LV_DISPI_DRAG_THROW) / 100;
|
||||
dispi_p->vect.y = dispi_p->vect.y * (100 -LV_DISPI_DRAG_THROW) / 100;
|
||||
|
||||
if(dispi_p->vect.x != 0 ||
|
||||
dispi_p->vect.y != 0)
|
||||
{
|
||||
/*Get the coordinates and modify them*/
|
||||
cord_t act_x = lv_obj_get_x(drag_obj) + dispi_p->vect.x;
|
||||
cord_t act_y = lv_obj_get_y(drag_obj) + dispi_p->vect.y;
|
||||
lv_obj_set_pos(drag_obj, act_x, act_y);
|
||||
}
|
||||
/*If the vectors become 0 -> drag_in_prog = 0 and send a drag end signal*/
|
||||
else {
|
||||
dispi_p->drag_in_prog = 0;
|
||||
drag_obj->signal_f(drag_obj, LV_SIGNAL_DRAG_END, dispi_p);
|
||||
}
|
||||
}
|
||||
@@ -1,115 +0,0 @@
|
||||
/**
|
||||
* @file lv_dispi.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LV_DISPI_H
|
||||
#define LV_DISPI_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_obj.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
typedef struct
|
||||
{
|
||||
bool pressed;
|
||||
point_t act_point;
|
||||
point_t last_point;
|
||||
point_t vect;
|
||||
point_t vect_sum;
|
||||
lv_obj_t * act_obj;
|
||||
lv_obj_t * last_obj;
|
||||
uint32_t press_time_stamp;
|
||||
uint32_t lpr_rep_time_stamp;
|
||||
|
||||
/*Flags*/
|
||||
uint8_t drag_range_out :1;
|
||||
uint8_t drag_in_prog :1;
|
||||
uint8_t long_press_sent :1;
|
||||
uint8_t wait_release :1;
|
||||
}lv_dispi_t;
|
||||
|
||||
|
||||
typedef enum
|
||||
{
|
||||
LV_ACTION_RES_INV = 0, /*Typically indicates that the object is deleted (become invalid) in the action function*/
|
||||
LV_ACTION_RES_OK, /*The object is valid (no deleted) after the action*/
|
||||
}lv_action_res_t;
|
||||
|
||||
typedef lv_action_res_t ( * lv_action_t) (struct __LV_OBJ_T * obj, lv_dispi_t * dispi);
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the display input subsystem
|
||||
*/
|
||||
void lv_dispi_init(void);
|
||||
|
||||
/**
|
||||
* Get an array with all the display inputs. Contains (INDEV_NUM elements)
|
||||
* @return pointer to a an lv_dispi_t array.
|
||||
*/
|
||||
lv_dispi_t * lv_dispi_get_array(void);
|
||||
|
||||
/**
|
||||
* Reset all display inputs
|
||||
*/
|
||||
void lv_dispi_reset(void);
|
||||
|
||||
/**
|
||||
* Reset the long press state of a display input
|
||||
* @param dispi pointer to a display input
|
||||
*/
|
||||
void lv_dispi_reset_lpr(lv_dispi_t * dispi);
|
||||
|
||||
/**
|
||||
* Get the last point on display input
|
||||
* @param dispi pointer to a display input
|
||||
* @param point pointer to a point to store the result
|
||||
*/
|
||||
void lv_dispi_get_point(lv_dispi_t * dispi, point_t * point);
|
||||
|
||||
/**
|
||||
* Check if there is dragging on display input or not
|
||||
* @param dispi pointer to a display input
|
||||
* @return true: drag is in progress
|
||||
*/
|
||||
bool lv_dispi_is_dragging(lv_dispi_t * dispi);
|
||||
|
||||
/**
|
||||
* Get the vector of dragging on a display input
|
||||
* @param dispi pointer to a display input
|
||||
* @param point pointer to a point to store the vector
|
||||
*/
|
||||
void lv_dispi_get_vect(lv_dispi_t * dispi, point_t * point);
|
||||
|
||||
/**
|
||||
* Do nothing until the next release
|
||||
* @param dispi pointer to a display input
|
||||
*/
|
||||
void lv_dispi_wait_release(lv_dispi_t * dispi);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /*LV_DISPI_H*/
|
||||
@@ -1,264 +0,0 @@
|
||||
/**
|
||||
* @file lv_group.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_group.h"
|
||||
#if LV_OBJ_GROUP != 0
|
||||
#include <stddef.h>
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static void style_mod_def(lv_style_t * style);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Create a new object group
|
||||
* @return pointer to the new object group
|
||||
*/
|
||||
lv_group_t * lv_group_create(void)
|
||||
{
|
||||
lv_group_t * group = dm_alloc(sizeof(lv_group_t));
|
||||
ll_init(&group->obj_ll, sizeof(lv_obj_t *));
|
||||
|
||||
group->style_mod = style_mod_def;
|
||||
group->obj_focus = NULL;
|
||||
group->frozen = 0;
|
||||
|
||||
return group;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an object to a group
|
||||
* @param group pointer to a group
|
||||
* @param obj pointer to an object to add
|
||||
*/
|
||||
void lv_group_add_obj(lv_group_t * group, lv_obj_t * obj)
|
||||
{
|
||||
obj->group_p = group;
|
||||
lv_obj_t ** next = ll_ins_tail(&group->obj_ll);
|
||||
*next = obj;
|
||||
|
||||
/* If the head and the tail is equal then there is only one object in the linked list.
|
||||
* In this case automatically activate it*/
|
||||
if(ll_get_head(&group->obj_ll) == next) {
|
||||
lv_group_focus_next(group);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove an object from its group
|
||||
* @param obj pointer to an objectto remove
|
||||
*/
|
||||
void lv_group_rem_obj(lv_obj_t * obj)
|
||||
{
|
||||
lv_group_t * g = obj->group_p;
|
||||
if(g == NULL) return;
|
||||
lv_obj_t ** i;
|
||||
|
||||
LL_READ(g->obj_ll, i) {
|
||||
if(*i == obj) {
|
||||
ll_rem(&g->obj_ll, i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(*g->obj_focus == obj) {
|
||||
g->obj_focus = NULL;
|
||||
lv_group_focus_next(g);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Focus on an object (defocus the current)
|
||||
* @param obj pointer to an object to focus on
|
||||
*/
|
||||
void lv_group_focus_obj(lv_obj_t * obj)
|
||||
{
|
||||
lv_group_t * g = obj->group_p;
|
||||
if(g == NULL) return;
|
||||
|
||||
if(g->frozen != 0) return;
|
||||
|
||||
lv_obj_t ** i;
|
||||
|
||||
LL_READ(g->obj_ll, i) {
|
||||
if(*i == obj) {
|
||||
if(g->obj_focus != NULL) {
|
||||
(*g->obj_focus)->signal_f(*g->obj_focus, LV_SIGNAL_DEFOCUS, NULL);
|
||||
lv_obj_inv(*g->obj_focus);
|
||||
}
|
||||
|
||||
g->obj_focus = i;
|
||||
|
||||
if(g->obj_focus != NULL){
|
||||
(*g->obj_focus)->signal_f(*g->obj_focus, LV_SIGNAL_FOCUS, NULL);
|
||||
lv_obj_inv(*g->obj_focus);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Focus the next object in a group (defocus the current)
|
||||
* @param group pointer to a group
|
||||
*/
|
||||
void lv_group_focus_next(lv_group_t * group)
|
||||
{
|
||||
if(group->frozen != 0) return;
|
||||
|
||||
if(group->obj_focus != NULL) {
|
||||
(*group->obj_focus)->signal_f(*group->obj_focus, LV_SIGNAL_DEFOCUS, NULL);
|
||||
lv_obj_inv(*group->obj_focus);
|
||||
}
|
||||
|
||||
lv_obj_t ** obj_next;
|
||||
if(group->obj_focus == NULL) obj_next = ll_get_head(&group->obj_ll);
|
||||
else obj_next = ll_get_next(&group->obj_ll, group->obj_focus);
|
||||
|
||||
if(obj_next == NULL) obj_next = ll_get_head(&group->obj_ll);
|
||||
group->obj_focus = obj_next;
|
||||
|
||||
if(group->obj_focus != NULL){
|
||||
(*group->obj_focus)->signal_f(*group->obj_focus, LV_SIGNAL_FOCUS, NULL);
|
||||
lv_obj_inv(*group->obj_focus);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Focus the previous object in a group (defocus the current)
|
||||
* @param group pointer to a group
|
||||
*/
|
||||
void lv_group_focus_prev(lv_group_t * group)
|
||||
{
|
||||
if(group->frozen != 0) return;
|
||||
|
||||
if(group->obj_focus != NULL) {
|
||||
(*group->obj_focus)->signal_f(*group->obj_focus, LV_SIGNAL_DEFOCUS, NULL);
|
||||
lv_obj_inv(*group->obj_focus);
|
||||
}
|
||||
|
||||
lv_obj_t ** obj_next;
|
||||
if(group->obj_focus == NULL) obj_next = ll_get_tail(&group->obj_ll);
|
||||
else obj_next = ll_get_prev(&group->obj_ll, group->obj_focus);
|
||||
|
||||
if(obj_next == NULL) obj_next = ll_get_tail(&group->obj_ll);
|
||||
group->obj_focus = obj_next;
|
||||
|
||||
if(group->obj_focus != NULL){
|
||||
(*group->obj_focus)->signal_f(*group->obj_focus, LV_SIGNAL_FOCUS, NULL);
|
||||
lv_obj_inv(*group->obj_focus);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Do not let to change the focus from the current object
|
||||
* @param group pointer to a group
|
||||
* @param en true: freeze, false: release freezing (normal mode)
|
||||
*/
|
||||
void lv_group_focus_freeze(lv_group_t * group, bool en)
|
||||
{
|
||||
if(en == false) group->frozen = 0;
|
||||
else group->frozen = 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a control character to the focuses object of a group
|
||||
* @param group pointer to a group
|
||||
* @param c a control character (use LV_GROUP_KEY_.. to navigate)
|
||||
*/
|
||||
void lv_group_send(lv_group_t * group, char c)
|
||||
{
|
||||
lv_obj_t * act = lv_group_get_focused(group);
|
||||
if(act == NULL) return;
|
||||
|
||||
act->signal_f(act, LV_SIGNAL_CONTROLL, &c);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set a function for a group which will modify the object's style if it is in focus
|
||||
* @param group pointer to a group
|
||||
* @param style_cb the style modifier function pointer
|
||||
*/
|
||||
void lv_group_set_style_mod_cb(lv_group_t * group, void (*style_cb)(lv_style_t * style))
|
||||
{
|
||||
group->style_mod = style_cb;
|
||||
if(group->obj_focus != NULL) lv_obj_inv(*group->obj_focus);
|
||||
}
|
||||
|
||||
/**
|
||||
* Modify a style with the set 'style_mod' function. The input style remains unchanged.
|
||||
* @param group pointer to group
|
||||
* @param style pointer to a style to modify
|
||||
* @return a copy of the input style but modified with the 'style_mod' function
|
||||
*/
|
||||
lv_style_t * lv_group_mod_style(lv_group_t * group, const lv_style_t * style)
|
||||
{
|
||||
lv_style_cpy(&group->style_tmp, style);
|
||||
|
||||
if(group->style_mod != NULL) group->style_mod(&group->style_tmp);
|
||||
else style_mod_def(&group->style_tmp);
|
||||
|
||||
return &group->style_tmp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the focused object or NULL if there isn't one
|
||||
* @param group pointer to a group
|
||||
* @return pointer to the focused object
|
||||
*/
|
||||
lv_obj_t * lv_group_get_focused(lv_group_t * group)
|
||||
{
|
||||
if(group == NULL) return NULL;
|
||||
if(group->obj_focus == NULL) return NULL;
|
||||
|
||||
return *group->obj_focus;
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Default style modifier function
|
||||
* @param style pointer to a style to modify. (Typically &group->style_tmp) It will be OVERWRITTEN.
|
||||
*/
|
||||
static void style_mod_def(lv_style_t * style)
|
||||
{
|
||||
/*Make the style a little bit orange*/
|
||||
style->bcolor = COLOR_ORANGE;
|
||||
style->bopa = OPA_COVER;
|
||||
if(style->bwidth == 0 && style->empty == 0) style->bwidth = 2 * LV_DOWNSCALE; /*Add border to not transparent styles*/
|
||||
else style->bwidth = style->bwidth * 2; /*Make the border thicker*/
|
||||
style->mcolor = color_mix(style->mcolor, COLOR_ORANGE, OPA_80);
|
||||
style->gcolor = color_mix(style->gcolor, COLOR_ORANGE, OPA_80);
|
||||
}
|
||||
|
||||
#endif /*LV_OBJ_GROUP != 0*/
|
||||
@@ -1,68 +0,0 @@
|
||||
/**
|
||||
* @file lv_group.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LV_GROUP_H
|
||||
#define LV_GROUP_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_conf.h"
|
||||
#include "lv_obj.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
/*Predefined keys to control the focused object via lv_group_send(group, c)*/
|
||||
/*For compatibility in signal function define the keys regardless to LV_OBJ_GROUP*/
|
||||
#define LV_GROUP_KEY_UP 17 /*0x11*/
|
||||
#define LV_GROUP_KEY_DOWN 18 /*0x12*/
|
||||
#define LV_GROUP_KEY_RIGHT 19 /*0x13*/
|
||||
#define LV_GROUP_KEY_LEFT 20 /*0x14*/
|
||||
#define LV_GROUP_KEY_ESC 33 /*0x1B*/
|
||||
#define LV_GROUP_KEY_ENTER 10 /*0x0A, '\n'*/
|
||||
|
||||
#if LV_OBJ_GROUP != 0
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
typedef struct
|
||||
{
|
||||
ll_dsc_t obj_ll;
|
||||
lv_obj_t ** obj_focus;
|
||||
void (*style_mod)(lv_style_t * style);
|
||||
lv_style_t style_tmp;
|
||||
uint8_t frozen:1;
|
||||
}lv_group_t;
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
lv_group_t * lv_group_create(void);
|
||||
void lv_group_add_obj(lv_group_t * group, lv_obj_t * obj);
|
||||
void lv_group_rem_obj(lv_obj_t * obj);
|
||||
void lv_group_focus_obj(lv_obj_t * obj);
|
||||
void lv_group_focus_next(lv_group_t * group);
|
||||
void lv_group_focus_prev(lv_group_t * group);
|
||||
void lv_group_focus_freeze(lv_group_t * group, bool en);
|
||||
void lv_group_send(lv_group_t * group, char c);
|
||||
lv_style_t * lv_group_mod_style(lv_group_t * group, const lv_style_t * style);
|
||||
lv_obj_t * lv_group_get_focused(lv_group_t * group);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /*LV_OBJ_GROUP != 0*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /*LV_GROUP_H*/
|
||||
1577
lv_obj/lv_obj.c
1577
lv_obj/lv_obj.c
File diff suppressed because it is too large
Load Diff
689
lv_obj/lv_obj.h
689
lv_obj/lv_obj.h
@@ -1,689 +0,0 @@
|
||||
/**
|
||||
* @file lv_obj.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LV_OBJ_H
|
||||
#define LV_OBJ_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_conf.h"
|
||||
#include <misc/gfx/area.h>
|
||||
#include <stddef.h>
|
||||
#include <stdbool.h>
|
||||
#include "misc/mem/dyn_mem.h"
|
||||
#include "misc/mem/linked_list.h"
|
||||
#include "misc/gfx/color.h"
|
||||
#include "lv_style.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/*Error check of lv_conf.h*/
|
||||
#if LV_HOR_RES == 0 || LV_VER_RES == 0
|
||||
#error "LV: LV_HOR_RES and LV_VER_RES must be greater then 0"
|
||||
#endif
|
||||
|
||||
#if LV_DOWNSCALE != 1 && LV_DOWNSCALE != 2
|
||||
#error "LV: LV_DOWNSCALE can be only 1 or 2"
|
||||
#endif
|
||||
|
||||
#if LV_VDB_SIZE == 0 && LV_ANTIALIAS != 0
|
||||
#error "LV: If LV_VDB_SIZE == 0 the antialaissing must be disabled"
|
||||
#endif
|
||||
|
||||
#if LV_VDB_SIZE != 0 && LV_VDB_SIZE < LV_HOR_RES && LV_ANTIALIAS == 0
|
||||
#error "LV: Small Virtual Display Buffer (lv_conf.h: LV_VDB_SIZE >= LV_HOR_RES)"
|
||||
#endif
|
||||
|
||||
#if LV_VDB_SIZE != 0 && LV_VDB_SIZE < 2 *LV_HOR_RES && LV_ANTIALIAS != 0
|
||||
#error "LV: Small Virtual Display Buffer (lv_conf.h: LV_VDB_SIZE >= (2 * LV_HOR_RES))"
|
||||
#endif
|
||||
|
||||
/*New defines*/
|
||||
#define LV_OBJ_DEF_WIDTH (80 * LV_DOWNSCALE)
|
||||
#define LV_OBJ_DEF_HEIGHT (60 * LV_DOWNSCALE)
|
||||
|
||||
#define ANIM_IN 0x00 /*Animation to show an object. 'OR' it with lv_anim_builtin_t*/
|
||||
#define ANIM_OUT 0x80 /*Animation to hide an object. 'OR' it with lv_anim_builtin_t*/
|
||||
#define ANIM_DIR_MASK 0x80 /*ANIM_IN/ANIM_OUT mask*/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
struct __LV_OBJ_T;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
LV_DESIGN_DRAW_MAIN,
|
||||
LV_DESIGN_DRAW_POST,
|
||||
LV_DESIGN_COVER_CHK,
|
||||
}lv_design_mode_t;
|
||||
|
||||
typedef bool (* lv_design_f_t) (struct __LV_OBJ_T * obj, const area_t * mask_p, lv_design_mode_t mode);
|
||||
|
||||
typedef enum
|
||||
{
|
||||
/*General signals*/
|
||||
LV_SIGNAL_CLEANUP,
|
||||
LV_SIGNAL_CHILD_CHG,
|
||||
LV_SIGNAL_CORD_CHG,
|
||||
LV_SIGNAL_STYLE_CHG,
|
||||
LV_SIGNAL_REFR_EXT_SIZE,
|
||||
|
||||
/*Display input related*/
|
||||
LV_SIGNAL_PRESSED,
|
||||
LV_SIGNAL_PRESSING,
|
||||
LV_SIGNAL_PRESS_LOST,
|
||||
LV_SIGNAL_RELEASED,
|
||||
LV_SIGNAL_LONG_PRESS,
|
||||
LV_SIGNAL_LONG_PRESS_REP,
|
||||
LV_SIGNAL_DRAG_BEGIN,
|
||||
LV_SIGNAL_DRAG_END,
|
||||
|
||||
/*Group related*/
|
||||
LV_SIGNAL_FOCUS,
|
||||
LV_SIGNAL_DEFOCUS,
|
||||
LV_SIGNAL_CONTROLL,
|
||||
}lv_signal_t;
|
||||
|
||||
typedef bool (* lv_signal_f_t) (struct __LV_OBJ_T * obj, lv_signal_t sign, void * param);
|
||||
|
||||
typedef struct __LV_OBJ_T
|
||||
{
|
||||
struct __LV_OBJ_T * par; /*Pointer to the parent object*/
|
||||
ll_dsc_t child_ll; /*Linked list to store the children objects*/
|
||||
|
||||
area_t cords; /*Coordinates of the object (x1, y1, x2, y2)*/
|
||||
|
||||
lv_signal_f_t signal_f; /*Object type specific signal function*/
|
||||
lv_design_f_t design_f; /*Object type specific design function*/
|
||||
|
||||
void * ext; /*Object type specific extended data*/
|
||||
lv_style_t * style_p; /*Pointer to the object's style*/
|
||||
|
||||
#if LV_OBJ_FREE_P != 0
|
||||
void * free_p; /*Application specific pointer (set it freely)*/
|
||||
#endif
|
||||
|
||||
void * group_p; /*Pointer to the group of the object*/
|
||||
|
||||
/*Attributes and states*/
|
||||
uint8_t click_en :1; /*1: Can be pressed by a display input device*/
|
||||
uint8_t drag_en :1; /*1: Enable the dragging*/
|
||||
uint8_t drag_throw_en:1; /*1: Enable throwing with drag*/
|
||||
uint8_t drag_parent :1; /*1: Parent will be dragged instead*/
|
||||
uint8_t hidden :1; /*1: Object is hidden*/
|
||||
uint8_t top_en :1; /*1: If the object or its children is clicked it goes to the foreground*/
|
||||
uint8_t reserved :1;
|
||||
|
||||
uint8_t protect; /*Automatically happening actions can be prevented. 'OR'ed values from lv_obj_prot_t*/
|
||||
|
||||
cord_t ext_size; /*EXTtend the size of the object in every direction. E.g. for shadow drawing*/
|
||||
|
||||
#if LV_OBJ_FREE_NUM != 0
|
||||
uint8_t free_num; /*Application specific identifier (set it freely)*/
|
||||
#endif
|
||||
}lv_obj_t;
|
||||
|
||||
/*Protect some attributes (max. 8 bit)*/
|
||||
typedef enum
|
||||
{
|
||||
LV_PROTECT_NONE = 0x00,
|
||||
LV_PROTECT_CHILD_CHG = 0x01, /*Disable the child change signal. Used by the library*/
|
||||
LV_PROTECT_PARENT = 0x02, /*Prevent automatic parent change (e.g. in lv_page)*/
|
||||
LV_PROTECT_POS = 0x04, /*Prevent automatic positioning (e.g. in lv_cont layout)*/
|
||||
LV_PROTECT_FOLLOW = 0x08, /*Prevent the object be followed in automatic ordering (e.g. in lv_cont PRETTY layout)*/
|
||||
}lv_protect_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
LV_ALIGN_CENTER = 0,
|
||||
LV_ALIGN_IN_TOP_LEFT,
|
||||
LV_ALIGN_IN_TOP_MID,
|
||||
LV_ALIGN_IN_TOP_RIGHT,
|
||||
LV_ALIGN_IN_BOTTOM_LEFT,
|
||||
LV_ALIGN_IN_BOTTOM_MID,
|
||||
LV_ALIGN_IN_BOTTOM_RIGHT,
|
||||
LV_ALIGN_IN_LEFT_MID,
|
||||
LV_ALIGN_IN_RIGHT_MID,
|
||||
LV_ALIGN_OUT_TOP_LEFT,
|
||||
LV_ALIGN_OUT_TOP_MID,
|
||||
LV_ALIGN_OUT_TOP_RIGHT,
|
||||
LV_ALIGN_OUT_BOTTOM_LEFT,
|
||||
LV_ALIGN_OUT_BOTTOM_MID,
|
||||
LV_ALIGN_OUT_BOTTOM_RIGHT,
|
||||
LV_ALIGN_OUT_LEFT_TOP,
|
||||
LV_ALIGN_OUT_LEFT_MID,
|
||||
LV_ALIGN_OUT_LEFT_BOTTOM,
|
||||
LV_ALIGN_OUT_RIGHT_TOP,
|
||||
LV_ALIGN_OUT_RIGHT_MID,
|
||||
LV_ALIGN_OUT_RIGHT_BOTTOM,
|
||||
}lv_align_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
LV_ANIM_NONE = 0,
|
||||
LV_ANIM_FLOAT_TOP, /*Float from/to the top*/
|
||||
LV_ANIM_FLOAT_LEFT, /*Float from/to the left*/
|
||||
LV_ANIM_FLOAT_BOTTOM, /*Float from/to the bottom*/
|
||||
LV_ANIM_FLOAT_RIGHT, /*Float from/to the right*/
|
||||
LV_ANIM_GROW_H, /*Grow/shrink horizontally*/
|
||||
LV_ANIM_GROW_V, /*Grow/shrink vertically*/
|
||||
}lv_anim_builtin_t;
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Init. the 'lv' library.
|
||||
*/
|
||||
void lv_init(void);
|
||||
|
||||
/**
|
||||
* Create a basic object
|
||||
* @param parent pointer to a parent object.
|
||||
* If NULL then a screen will be created
|
||||
* @param copy pointer to a base object, if not NULL then the new object will be copied from it
|
||||
* @return pointer to the new object
|
||||
*/
|
||||
lv_obj_t * lv_obj_create(lv_obj_t * parent, lv_obj_t * copy);
|
||||
|
||||
/**
|
||||
* Delete 'obj' and all of its children
|
||||
* @param obj pointer to an object to delete
|
||||
*/
|
||||
void lv_obj_del(lv_obj_t * obj);
|
||||
|
||||
/**
|
||||
* Signal function of the basic object
|
||||
* @param obj pointer to an object
|
||||
* @param sign signal type
|
||||
* @param param parameter for the signal (depends on signal type)
|
||||
* @return false: the object become invalid (e.g. deleted)
|
||||
*/
|
||||
bool lv_obj_signal(lv_obj_t * obj, lv_signal_t sign, void * param);
|
||||
|
||||
/**
|
||||
* Mark the object as invalid therefore its current position will be redrawn by 'lv_refr_task'
|
||||
* @param obj pointer to an object
|
||||
*/
|
||||
void lv_obj_inv(lv_obj_t * obj);
|
||||
|
||||
/**
|
||||
* Load a new screen
|
||||
* @param scr pointer to a screen
|
||||
*/
|
||||
void lv_scr_load(lv_obj_t * scr);
|
||||
|
||||
/**
|
||||
* Set a new parent for an object. Its relative position will be the same.
|
||||
* @param obj pointer to an object
|
||||
* @param parent pointer to the new parent object
|
||||
*/
|
||||
void lv_obj_set_parent(lv_obj_t * obj, lv_obj_t * parent);
|
||||
|
||||
/**
|
||||
* Set relative the position of an object (relative to the parent)
|
||||
* @param obj pointer to an object
|
||||
* @param x new distance from the left side of the parent
|
||||
* @param y new distance from the top of the parent
|
||||
*/
|
||||
void lv_obj_set_pos(lv_obj_t * obj, cord_t x, cord_t y);
|
||||
|
||||
/**
|
||||
* Set relative the position of an object (relative to the parent).
|
||||
* The coordinates will be upscaled with LV_DOWNSCALE.
|
||||
* @param obj pointer to an object
|
||||
* @param x new distance from the left side of the parent. (will be multiplied with LV_DOWNSCALE)
|
||||
* @param y new distance from the top of the parent. (will be multiplied with LV_DOWNSCALE)
|
||||
*/
|
||||
void lv_obj_set_pos_us(lv_obj_t * obj, cord_t x, cord_t y);
|
||||
|
||||
/**
|
||||
* Set the x coordinate of a object
|
||||
* @param obj pointer to an object
|
||||
* @param x new distance from the left side from the parent
|
||||
*/
|
||||
void lv_obj_set_x(lv_obj_t * obj, cord_t x);
|
||||
|
||||
/**
|
||||
* Set the x coordinate of a object.
|
||||
* The coordinate will be upscaled with LV_DOWNSCALE.
|
||||
* @param obj pointer to an object
|
||||
* @param x new distance from the left side from the parent. (will be multiplied with LV_DOWNSCALE)
|
||||
*/
|
||||
void lv_obj_set_x_us(lv_obj_t * obj, cord_t x);
|
||||
|
||||
/**
|
||||
* Set the y coordinate of a object
|
||||
* @param obj pointer to an object
|
||||
* @param y new distance from the top of the parent
|
||||
*/
|
||||
void lv_obj_set_y(lv_obj_t * obj, cord_t y);
|
||||
|
||||
/**
|
||||
* Set the y coordinate of a object.
|
||||
* The coordinate will be upscaled with LV_DOWNSCALE.
|
||||
* @param obj pointer to an object
|
||||
* @param y new distance from the top of the parent. (will be multiplied with LV_DOWNSCALE)
|
||||
*/
|
||||
void lv_obj_set_y_us(lv_obj_t * obj, cord_t y);
|
||||
|
||||
/**
|
||||
* Set the size of an object
|
||||
* @param obj pointer to an object
|
||||
* @param w new width
|
||||
* @param h new height
|
||||
*/
|
||||
void lv_obj_set_size(lv_obj_t * obj, cord_t w, cord_t h);
|
||||
|
||||
/**
|
||||
* Set the size of an object. The coordinates will be upscaled with LV_DOWNSCALE.
|
||||
* @param obj pointer to an object
|
||||
* @param w new width (will be multiplied with LV_DOWNSCALE)
|
||||
* @param h new height (will be multiplied with LV_DOWNSCALE)
|
||||
*/
|
||||
void lv_obj_set_size_us(lv_obj_t * obj, cord_t w, cord_t h);
|
||||
|
||||
/**
|
||||
* Set the width of an object
|
||||
* @param obj pointer to an object
|
||||
* @param w new width
|
||||
*/
|
||||
void lv_obj_set_width(lv_obj_t * obj, cord_t w);
|
||||
|
||||
/**
|
||||
* Set the width of an object. The width will be upscaled with LV_DOWNSCALE
|
||||
* @param obj pointer to an object
|
||||
* @param w new width (will be multiplied with LV_DOWNSCALE)
|
||||
*/
|
||||
void lv_obj_set_width_us(lv_obj_t * obj, cord_t w);
|
||||
|
||||
/**
|
||||
* Set the height of an object
|
||||
* @param obj pointer to an object
|
||||
* @param h new height
|
||||
*/
|
||||
void lv_obj_set_height(lv_obj_t * obj, cord_t h);
|
||||
|
||||
/**
|
||||
* Set the height of an object. The height will be upscaled with LV_DOWNSCALE
|
||||
* @param obj pointer to an object
|
||||
* @param h new height (will be multiplied with LV_DOWNSCALE)
|
||||
*/
|
||||
void lv_obj_set_height_us(lv_obj_t * obj, cord_t h);
|
||||
|
||||
/**
|
||||
* Align an object to an other object.
|
||||
* @param obj pointer to an object to align
|
||||
* @param base pointer to an object (if NULL the parent is used). 'obj' will be aligned to it.
|
||||
* @param align type of alignment (see 'lv_align_t' enum)
|
||||
* @param x_mod x coordinate shift after alignment
|
||||
* @param y_mod y coordinate shift after alignment
|
||||
*/
|
||||
void lv_obj_align(lv_obj_t * obj,lv_obj_t * base, lv_align_t align, cord_t x_mod, cord_t y_mod);
|
||||
|
||||
/**
|
||||
* Align an object to an other object. The coordinates will be upscaled with LV_DOWNSCALE.
|
||||
* @param obj pointer to an object to align
|
||||
* @param base pointer to an object (if NULL the parent is used). 'obj' will be aligned to it.
|
||||
* @param align type of alignment (see 'lv_align_t' enum)
|
||||
* @param x_mod x coordinate shift after alignment (will be multiplied with LV_DOWNSCALE)
|
||||
* @param y_mod y coordinate shift after alignment (will be multiplied with LV_DOWNSCALE)
|
||||
*/
|
||||
void lv_obj_align_us(lv_obj_t * obj,lv_obj_t * base, lv_align_t align, cord_t x_mod, cord_t y_mod);
|
||||
|
||||
/**
|
||||
* Set the extended size of an object
|
||||
* @param obj pointer to an object
|
||||
* @param ext_size the extended size
|
||||
*/
|
||||
void lv_obj_set_ext_size(lv_obj_t * obj, cord_t ext_size);
|
||||
|
||||
/**
|
||||
* Set a new style for an object
|
||||
* @param obj pointer to an object
|
||||
* @param style_p pointer to the new style
|
||||
*/
|
||||
void lv_obj_set_style(lv_obj_t * obj, lv_style_t * style);
|
||||
|
||||
/**
|
||||
* Notify an object about its style is modified
|
||||
* @param obj pointer to an object
|
||||
*/
|
||||
void lv_obj_refr_style(lv_obj_t * obj);
|
||||
|
||||
/**
|
||||
* Notify all object if a style is modified
|
||||
* @param style pointer to a style. Only the objects with this style will be notified
|
||||
* (NULL to notify all objects)
|
||||
*/
|
||||
void lv_style_refr_objs(void * style);
|
||||
|
||||
/**
|
||||
* Hide an object. It won't be visible and clickable.
|
||||
* @param obj pointer to an object
|
||||
* @param en true: hide the object
|
||||
*/
|
||||
void lv_obj_set_hidden(lv_obj_t * obj, bool en);
|
||||
|
||||
/**
|
||||
* Enable or disable the clicking of an object
|
||||
* @param obj pointer to an object
|
||||
* @param en true: make the object clickable
|
||||
*/
|
||||
void lv_obj_set_click(lv_obj_t * obj, bool en);
|
||||
|
||||
/**
|
||||
* Enable to bring this object to the foreground if it
|
||||
* or any of its children is clicked
|
||||
* @param obj pointer to an object
|
||||
* @param en true: enable the auto top feature
|
||||
*/
|
||||
void lv_obj_set_top(lv_obj_t * obj, bool en);
|
||||
|
||||
/**
|
||||
* Enable the dragging of an object
|
||||
* @param obj pointer to an object
|
||||
* @param en true: make the object dragable
|
||||
*/
|
||||
void lv_obj_set_drag(lv_obj_t * obj, bool en);
|
||||
|
||||
/**
|
||||
* Enable the throwing of an object after is is dragged
|
||||
* @param obj pointer to an object
|
||||
* @param en true: enable the drag throw
|
||||
*/
|
||||
void lv_obj_set_drag_throw(lv_obj_t * obj, bool en);
|
||||
|
||||
/**
|
||||
* Enable to use parent for drag related operations.
|
||||
* If trying to drag the object the parent will be moved instead
|
||||
* @param obj pointer to an object
|
||||
* @param en true: enable the 'drag parent' for the object
|
||||
*/
|
||||
void lv_obj_set_drag_parent(lv_obj_t * obj, bool en);
|
||||
|
||||
/**
|
||||
* Set a bit or bits in the protect filed
|
||||
* @param obj pointer to an object
|
||||
* @param prot 'OR'-ed values from lv_obj_prot_t
|
||||
*/
|
||||
void lv_obj_set_protect(lv_obj_t * obj, uint8_t prot);
|
||||
|
||||
/**
|
||||
* Clear a bit or bits in the protect filed
|
||||
* @param obj pointer to an object
|
||||
* @param prot 'OR'-ed values from lv_obj_prot_t
|
||||
*/
|
||||
void lv_obj_clr_protect(lv_obj_t * obj, uint8_t prot);
|
||||
|
||||
/**
|
||||
* Set the signal function of an object.
|
||||
* Always call the previous signal function in the new.
|
||||
* @param obj pointer to an object
|
||||
* @param fp the new signal function
|
||||
*/
|
||||
void lv_obj_set_signal_f(lv_obj_t * obj, lv_signal_f_t fp);
|
||||
|
||||
/**
|
||||
* Set a new design function for an object
|
||||
* @param obj pointer to an object
|
||||
* @param fp the new design function
|
||||
*/
|
||||
void lv_obj_set_design_f(lv_obj_t * obj, lv_design_f_t fp);
|
||||
|
||||
/**
|
||||
* Allocate a new ext. data for an object
|
||||
* @param obj pointer to an object
|
||||
* @param ext_size the size of the new ext. data
|
||||
* @return Normal pointer to the allocated ext
|
||||
*/
|
||||
void * lv_obj_alloc_ext(lv_obj_t * obj, uint16_t ext_size);
|
||||
|
||||
/**
|
||||
* Send a 'LV_SIGNAL_REFR_EXT_SIZE' signal to the object
|
||||
* @param obj pointer to an object
|
||||
*/
|
||||
void lv_obj_refr_ext_size(lv_obj_t * obj);
|
||||
|
||||
#if LV_OBJ_FREE_NUM != 0
|
||||
/**
|
||||
* Set an application specific number for an object.
|
||||
* It can help to identify objects in the application.
|
||||
* @param obj pointer to an object
|
||||
* @param free_num the new free number
|
||||
*/
|
||||
void lv_obj_set_free_num(lv_obj_t * obj, uint8_t free_num);
|
||||
#endif
|
||||
|
||||
#if LV_OBJ_FREE_P != 0
|
||||
/**
|
||||
* Set an application specific pointer for an object.
|
||||
* It can help to identify objects in the application.
|
||||
* @param obj pointer to an object
|
||||
* @param free_p the new free pinter
|
||||
*/
|
||||
void lv_obj_set_free_p(lv_obj_t * obj, void * free_p);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Animate an object
|
||||
* @param obj pointer to an object to animate
|
||||
* @param type type of animation from 'lv_anim_builtin_t'. 'OR' it with ANIM_IN or ANIM_OUT
|
||||
* @param time time of animation in milliseconds
|
||||
* @param delay delay before the animation in milliseconds
|
||||
* @param cb a function to call when the animation is ready
|
||||
*/
|
||||
void lv_obj_anim(lv_obj_t * obj, lv_anim_builtin_t type, uint16_t time, uint16_t delay, void (*cb) (lv_obj_t *));
|
||||
|
||||
/**
|
||||
* Return with the actual screen
|
||||
* @return pointer to to the actual screen object
|
||||
*/
|
||||
lv_obj_t * lv_scr_act(void);
|
||||
|
||||
/**
|
||||
* Return with the screen of an object
|
||||
* @param obj pointer to an object
|
||||
* @return pointer to a screen
|
||||
*/
|
||||
lv_obj_t * lv_obj_get_scr(lv_obj_t * obj);
|
||||
|
||||
/**
|
||||
* Returns with the parent of an object
|
||||
* @param obj pointer to an object
|
||||
* @return pointer to the parent of 'obj'
|
||||
*/
|
||||
lv_obj_t * lv_obj_get_parent(lv_obj_t * obj);
|
||||
|
||||
/**
|
||||
* Iterate through the children of an object
|
||||
* @param obj pointer to an object
|
||||
* @param child NULL at first call to get the next children
|
||||
* and the previous return value later
|
||||
* @return the child after 'act_child' or NULL if no more child
|
||||
*/
|
||||
lv_obj_t * lv_obj_get_child(lv_obj_t * obj, lv_obj_t * child);
|
||||
|
||||
/**
|
||||
* Count the children of an object (only children directly on 'obj')
|
||||
* @param obj pointer to an object
|
||||
* @return children number of 'obj'
|
||||
*/
|
||||
uint16_t lv_obj_get_child_num(lv_obj_t * obj);
|
||||
|
||||
/**
|
||||
* Copy the coordinates of an object to an area
|
||||
* @param obj pointer to an object
|
||||
* @param cords_p pointer to an area to store the coordinates
|
||||
*/
|
||||
void lv_obj_get_cords(lv_obj_t * obj, area_t * cords_p);
|
||||
|
||||
/**
|
||||
* Get the x coordinate of object
|
||||
* @param obj pointer to an object
|
||||
* @return distance of 'obj' from the left side of its parent
|
||||
*/
|
||||
cord_t lv_obj_get_x(lv_obj_t * obj);
|
||||
|
||||
/**
|
||||
* Get the y coordinate of object
|
||||
* @param obj pointer to an object
|
||||
* @return distance of 'obj' from the top of its parent
|
||||
*/
|
||||
cord_t lv_obj_get_y(lv_obj_t * obj);
|
||||
|
||||
/**
|
||||
* Get the width of an object
|
||||
* @param obj pointer to an object
|
||||
* @return the width
|
||||
*/
|
||||
cord_t lv_obj_get_width(lv_obj_t * obj);
|
||||
|
||||
/**
|
||||
* Get the height of an object
|
||||
* @param obj pointer to an object
|
||||
* @return the height
|
||||
*/
|
||||
cord_t lv_obj_get_height(lv_obj_t * obj);
|
||||
|
||||
/**
|
||||
* Get the extended size attribute of an object
|
||||
* @param obj pointer to an object
|
||||
* @return the extended size attribute
|
||||
*/
|
||||
cord_t lv_obj_get_ext_size(lv_obj_t * obj);
|
||||
|
||||
/**
|
||||
* Get the style pointer of an object (if NULL get style of the parent)
|
||||
* @param obj pointer to an object
|
||||
* @return pointer to a style
|
||||
*/
|
||||
lv_style_t * lv_obj_get_style(lv_obj_t * obj);
|
||||
|
||||
/**
|
||||
* Get the hidden attribute of an object
|
||||
* @param obj pointer to an object
|
||||
* @return true: the object is hidden
|
||||
*/
|
||||
bool lv_obj_get_hidden(lv_obj_t * obj);
|
||||
|
||||
/**
|
||||
* Get the click enable attribute of an object
|
||||
* @param obj pointer to an object
|
||||
* @return true: the object is clickable
|
||||
*/
|
||||
bool lv_obj_get_click(lv_obj_t * obj);
|
||||
|
||||
/**
|
||||
* Get the top enable attribute of an object
|
||||
* @param obj pointer to an object
|
||||
* @return true: the auto top feture is enabled
|
||||
*/
|
||||
bool lv_obj_get_top(lv_obj_t * obj);
|
||||
|
||||
/**
|
||||
* Get the drag enable attribute of an object
|
||||
* @param obj pointer to an object
|
||||
* @return true: the object is dragable
|
||||
*/
|
||||
bool lv_obj_get_drag(lv_obj_t * obj);
|
||||
|
||||
/**
|
||||
* Get the drag thow enable attribute of an object
|
||||
* @param obj pointer to an object
|
||||
* @return true: drag throw is enabled
|
||||
*/
|
||||
bool lv_obj_get_drag_throw(lv_obj_t * obj);
|
||||
|
||||
/**
|
||||
* Get the drag parent attribute of an object
|
||||
* @param obj pointer to an object
|
||||
* @return true: drag parent is enabled
|
||||
*/
|
||||
bool lv_obj_get_drag_parent(lv_obj_t * obj);
|
||||
|
||||
/**
|
||||
* Get the protect field of an object
|
||||
* @param obj pointer to an object
|
||||
* @return protect field ('OR'ed values of lv_obj_prot_t)
|
||||
*/
|
||||
uint8_t lv_obj_get_protect(lv_obj_t * obj);
|
||||
|
||||
/**
|
||||
* Check at least one bit of a given protect bitfield is set
|
||||
* @param obj pointer to an object
|
||||
* @param prot protect bits to test ('OR'ed values of lv_obj_prot_t)
|
||||
* @return false: none of the given bits are set, true: at least one bit is set
|
||||
*/
|
||||
bool lv_obj_is_protected(lv_obj_t * obj, uint8_t prot);
|
||||
|
||||
/**
|
||||
* Get the signal function of an object
|
||||
* @param obj pointer to an object
|
||||
* @return the signal function
|
||||
*/
|
||||
lv_signal_f_t lv_obj_get_signal_f(lv_obj_t * obj);
|
||||
|
||||
/**
|
||||
* Get the design function of an object
|
||||
* @param obj pointer to an object
|
||||
* @return the design function
|
||||
*/
|
||||
lv_design_f_t lv_obj_get_design_f(lv_obj_t * obj);
|
||||
|
||||
/**
|
||||
* Get the ext pointer
|
||||
* @param obj pointer to an object
|
||||
* @return the ext pointer but not the dynamic version
|
||||
* Use it as ext->data1, and NOT da(ext)->data1
|
||||
*/
|
||||
void * lv_obj_get_ext(lv_obj_t * obj);
|
||||
|
||||
#if LV_OBJ_FREE_NUM != 0
|
||||
/**
|
||||
* Get the free number
|
||||
* @param obj pointer to an object
|
||||
* @return the free number
|
||||
*/
|
||||
uint8_t lv_obj_get_free_num(lv_obj_t * obj);
|
||||
#endif
|
||||
|
||||
#if LV_OBJ_FREE_P != 0
|
||||
/**
|
||||
* Get the free pointer
|
||||
* @param obj pointer to an object
|
||||
* @return the free pointer
|
||||
*/
|
||||
void * lv_obj_get_free_p(lv_obj_t * obj);
|
||||
#endif
|
||||
|
||||
#if LV_OBJ_GROUP != 0
|
||||
/**
|
||||
* Get the group of the object
|
||||
* @param obj pointer to an object
|
||||
* @return the pointer to group of the object
|
||||
*/
|
||||
void * lv_obj_get_group(lv_obj_t * obj);
|
||||
#endif
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /*LV_OBJ_H*/
|
||||
474
lv_obj/lv_refr.c
474
lv_obj/lv_refr.c
@@ -1,474 +0,0 @@
|
||||
/**
|
||||
* @file lv_refr.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include <stddef.h>
|
||||
#include "lv_conf.h"
|
||||
#include "misc/os/ptask.h"
|
||||
#include "misc/mem/fifo.h"
|
||||
#include "lv_refr.h"
|
||||
#include "lv_vdb.h"
|
||||
#include "hal/systick/systick.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
typedef struct
|
||||
{
|
||||
area_t area;
|
||||
uint8_t joined;
|
||||
}lv_join_t;
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static void lv_refr_task(void * param);
|
||||
static void lv_refr_join_area(void);
|
||||
static void lv_refr_areas(void);
|
||||
#if LV_VDB_SIZE == 0
|
||||
static void lv_refr_area_no_vdb(const area_t * area_p);
|
||||
#else
|
||||
static void lv_refr_area_with_vdb(const area_t * area_p);
|
||||
static void lv_refr_area_part_vdb(const area_t * area_p);
|
||||
#endif
|
||||
static lv_obj_t * lv_refr_get_top_obj(const area_t * area_p, lv_obj_t * obj);
|
||||
static void lv_refr_make(lv_obj_t * top_p, const area_t * mask_p);
|
||||
static void lv_refr_obj(lv_obj_t * obj, const area_t * mask_ori_p);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
static lv_join_t inv_buf[LV_INV_FIFO_SIZE];
|
||||
static uint16_t inv_buf_p;
|
||||
static void (*monitor_cb)(uint32_t, uint32_t);
|
||||
static uint32_t px_num;
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the screen refresh subsystem
|
||||
*/
|
||||
void lv_refr_init(void)
|
||||
{
|
||||
inv_buf_p = 0;
|
||||
memset(inv_buf, 0, sizeof(inv_buf));
|
||||
|
||||
ptask_t* task;
|
||||
task = ptask_create(lv_refr_task, LV_REFR_PERIOD, PTASK_PRIO_MID, NULL);
|
||||
dm_assert(task);
|
||||
}
|
||||
|
||||
/**
|
||||
* Invalidate an area
|
||||
* @param area_p pointer to area which should be invalidated
|
||||
*/
|
||||
void lv_inv_area(const area_t * area_p)
|
||||
{
|
||||
/*Clear the invalidate buffer if the parameter is NULL*/
|
||||
if(area_p == NULL) {
|
||||
inv_buf_p = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
area_t scr_area;
|
||||
scr_area.x1 = 0;
|
||||
scr_area.y1 = 0;
|
||||
scr_area.x2 = LV_HOR_RES - 1;
|
||||
scr_area.y2 = LV_VER_RES - 1;
|
||||
|
||||
area_t com_area;
|
||||
bool suc;
|
||||
|
||||
suc = area_union(&com_area, area_p, &scr_area);
|
||||
|
||||
/*The area is truncated to the screen*/
|
||||
if(suc != false)
|
||||
{
|
||||
#if LV_DOWNSCALE == 2
|
||||
/*Rounding*/
|
||||
com_area.x1 = com_area.x1 & (~0x1);
|
||||
com_area.y1 = com_area.y1 & (~0x1);
|
||||
com_area.x2 = com_area.x2 | 0x1;
|
||||
com_area.y2 = com_area.y2 | 0x1;
|
||||
#endif
|
||||
|
||||
/*Save only if this area is not in one of the saved areas*/
|
||||
uint16_t i;
|
||||
for(i = 0; i < inv_buf_p; i++) {
|
||||
if(area_is_in(&com_area, &inv_buf[i].area) != false) return;
|
||||
}
|
||||
|
||||
|
||||
/*Save the area*/
|
||||
if(inv_buf_p < LV_INV_FIFO_SIZE) {
|
||||
area_cpy(&inv_buf[inv_buf_p].area,&com_area);
|
||||
} else {/*If no place for the area add the screen*/
|
||||
inv_buf_p = 0;
|
||||
area_cpy(&inv_buf[inv_buf_p].area,&scr_area);
|
||||
}
|
||||
inv_buf_p ++;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a function to call after every refresh to announce the refresh time and the number of refreshed pixels
|
||||
* @param cb pointer to a callback function (void my_refr_cb(uint32_t time_ms, uint32_t px_num))
|
||||
* time_ms: refresh time in [ms]
|
||||
* px_num: not the drawn pixels but the number of affected pixels of the screen
|
||||
* (more pixels are drawn because of overlapping objects)
|
||||
*/
|
||||
void lv_refr_set_monitor_cb(void (*cb)(uint32_t, uint32_t))
|
||||
{
|
||||
monitor_cb = cb;
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Called periodically to handle the refreshing
|
||||
* @param param unused
|
||||
*/
|
||||
static void lv_refr_task(void * param)
|
||||
{
|
||||
|
||||
uint32_t start = systick_get();
|
||||
|
||||
lv_refr_join_area();
|
||||
|
||||
lv_refr_areas();
|
||||
|
||||
bool refr_done = false;
|
||||
if(inv_buf_p != 0) refr_done = true;
|
||||
memset(inv_buf, 0, sizeof(inv_buf));
|
||||
inv_buf_p = 0;
|
||||
|
||||
/* In the callback lv_obj_inv can occur
|
||||
* therefore be sure the inv_buf is cleared prior to it*/
|
||||
if(refr_done != false) {
|
||||
if(monitor_cb != NULL) {
|
||||
monitor_cb(systick_elaps(start), px_num);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Join the areas which has got common parts
|
||||
*/
|
||||
static void lv_refr_join_area(void)
|
||||
{
|
||||
uint32_t join_from;
|
||||
uint32_t join_in;
|
||||
area_t joined_area;
|
||||
for(join_in = 0; join_in < inv_buf_p; join_in++) {
|
||||
if(inv_buf[join_in].joined != 0) continue;
|
||||
|
||||
/*Check all areas to join them in 'join_in'*/
|
||||
for(join_from = 0; join_from < inv_buf_p; join_from++) {
|
||||
/*Handle only unjoined areas and ignore itself*/
|
||||
if(inv_buf[join_from].joined != 0 || join_in == join_from) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/*Check if the areas are on each other*/
|
||||
if(area_is_on(&inv_buf[join_in].area,
|
||||
&inv_buf[join_from].area) == false)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
area_join(&joined_area, &inv_buf[join_in].area,
|
||||
&inv_buf[join_from].area);
|
||||
|
||||
/*Join two area only if the joined area size is smaller*/
|
||||
if(area_get_size(&joined_area) <
|
||||
(area_get_size(&inv_buf[join_in].area) + area_get_size(&inv_buf[join_from].area))) {
|
||||
area_cpy(&inv_buf[join_in].area, &joined_area);
|
||||
|
||||
/*Mark 'join_form' is joined into 'join_in'*/
|
||||
inv_buf[join_from].joined = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Refresh the joined areas
|
||||
*/
|
||||
static void lv_refr_areas(void)
|
||||
{
|
||||
px_num = 0;
|
||||
uint32_t i;
|
||||
|
||||
for(i = 0; i < inv_buf_p; i++) {
|
||||
/*Refresh the unjoined areas*/
|
||||
if(inv_buf[i].joined == 0) {
|
||||
/*If there is no VDB do simple drawing*/
|
||||
#if LV_VDB_SIZE == 0
|
||||
lv_refr_area_no_vdb(&inv_buf[i].area);
|
||||
#else
|
||||
/*If VDB is used...*/
|
||||
lv_refr_area_with_vdb(&inv_buf[i].area);
|
||||
#endif
|
||||
if(monitor_cb != NULL) px_num += area_get_size(&inv_buf[i].area);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#if LV_VDB_SIZE == 0
|
||||
/**
|
||||
* Refresh an area if there is no Virtual Display Buffer
|
||||
* @param area_p pointer to an area to refresh
|
||||
*/
|
||||
static void lv_refr_area_no_vdb(const area_t * area_p)
|
||||
{
|
||||
lv_obj_t * top_p;
|
||||
|
||||
/*Get top object which is not covered by others*/
|
||||
top_p = lv_refr_get_top_obj(area_p, lv_scr_act());
|
||||
|
||||
/*Do the refreshing*/
|
||||
lv_refr_make(top_p, area_p);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
/**
|
||||
* Refresh an area if there is Virtual Display Buffer
|
||||
* @param area_p pointer to an area to refresh
|
||||
*/
|
||||
static void lv_refr_area_with_vdb(const area_t * area_p)
|
||||
{
|
||||
/*Calculate the max row num*/
|
||||
uint32_t max_row = (uint32_t) LV_VDB_SIZE / (area_get_width(area_p));
|
||||
if(max_row > area_get_height(area_p)) max_row = area_get_height(area_p);
|
||||
|
||||
/*Round the row number with downscale*/
|
||||
#if LV_DOWNSCALE == 2
|
||||
max_row &= (~0x1);
|
||||
#endif
|
||||
|
||||
/*Always use the full row*/
|
||||
cord_t row;
|
||||
cord_t row_last = 0;
|
||||
for(row = area_p->y1; row + max_row - 1 <= area_p->y2; row += max_row) {
|
||||
lv_vdb_t * vdb_p = lv_vdb_get();
|
||||
|
||||
/*Calc. the next y coordinates of VDB*/
|
||||
vdb_p->area.x1 = area_p->x1;
|
||||
vdb_p->area.x2 = area_p->x2;
|
||||
vdb_p->area.y1 = row;
|
||||
vdb_p->area.y2 = row + max_row - 1;
|
||||
row_last = row + max_row - 1;
|
||||
lv_refr_area_part_vdb(area_p);
|
||||
}
|
||||
|
||||
/*If the last y coordinates are not handled yet ...*/
|
||||
if(area_p->y2 != row_last) {
|
||||
lv_vdb_t * vdb_p = lv_vdb_get();
|
||||
|
||||
/*Calc. the next y coordinates of VDB*/
|
||||
vdb_p->area.x1 = area_p->x1;
|
||||
vdb_p->area.x2 = area_p->x2;
|
||||
vdb_p->area.y1 = row;
|
||||
vdb_p->area.y2 = area_p->y2;
|
||||
|
||||
/*Refresh this part too*/
|
||||
lv_refr_area_part_vdb(area_p);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Refresh a part of an area which is on the actual Virtual Display Buffer
|
||||
* @param area_p pointer to an area to refresh
|
||||
*/
|
||||
static void lv_refr_area_part_vdb(const area_t * area_p)
|
||||
{
|
||||
lv_vdb_t * vdb_p = lv_vdb_get();
|
||||
lv_obj_t * top_p;
|
||||
|
||||
/*Get the new mask from the original area and the act. VDB
|
||||
It will be a part of 'area_p'*/
|
||||
area_t start_mask;
|
||||
area_union(&start_mask, area_p, &vdb_p->area);
|
||||
|
||||
/*Get the most top object which is not covered by others*/
|
||||
top_p = lv_refr_get_top_obj(&start_mask, lv_scr_act());
|
||||
|
||||
/*Do the refreshing from the top object*/
|
||||
lv_refr_make(top_p, &start_mask);
|
||||
|
||||
/*Flush the content of the VDB*/
|
||||
lv_vdb_flush();
|
||||
}
|
||||
|
||||
#endif /*LV_VDB_SIZE == 0*/
|
||||
|
||||
/**
|
||||
* Search the most top object which fully covers an area
|
||||
* @param area_p pointer to an area
|
||||
* @param obj the first object to start the searching (typically a screen)
|
||||
* @return
|
||||
*/
|
||||
static lv_obj_t * lv_refr_get_top_obj(const area_t * area_p, lv_obj_t * obj)
|
||||
{
|
||||
lv_obj_t * i;
|
||||
lv_obj_t * found_p = NULL;
|
||||
|
||||
/*If this object is fully cover the draw area check the children too */
|
||||
if(area_is_in(area_p, &obj->cords) && obj->hidden == 0)
|
||||
{
|
||||
LL_READ(obj->child_ll, i) {
|
||||
found_p = lv_refr_get_top_obj(area_p, i);
|
||||
|
||||
/*If a children is ok then break*/
|
||||
if(found_p != NULL) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*If no better children check this object*/
|
||||
if(found_p == NULL) {
|
||||
lv_style_t * style = lv_obj_get_style(obj);
|
||||
if(style->opa == OPA_COVER &&
|
||||
obj->design_f(obj, area_p, LV_DESIGN_COVER_CHK) != false) {
|
||||
found_p = obj;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return found_p;
|
||||
}
|
||||
|
||||
/**
|
||||
* Make the refreshing from an object. Draw all its children and the youngers too.
|
||||
* @param top_p pointer to an objects. Start the drawing from it.
|
||||
* @param mask_p pointer to an area, the objects will be drawn only here
|
||||
*/
|
||||
static void lv_refr_make(lv_obj_t * top_p, const area_t * mask_p)
|
||||
{
|
||||
/* Normally always will be a top_obj (at least the screen)
|
||||
* but in special cases (e.g. if the screen has alpha) it won't.
|
||||
* In this case use the screen directly */
|
||||
if(top_p == NULL) top_p = lv_scr_act();
|
||||
|
||||
/*Refresh the top object and its children*/
|
||||
lv_refr_obj(top_p, mask_p);
|
||||
|
||||
/*Draw the 'younger' sibling objects because they can be on top_obj */
|
||||
lv_obj_t * par;
|
||||
lv_obj_t * i;
|
||||
lv_obj_t * border_p = top_p;
|
||||
|
||||
par = lv_obj_get_parent(top_p);
|
||||
|
||||
/*Do until not reach the screen*/
|
||||
while(par != NULL) {
|
||||
/*object before border_p has to be redrawn*/
|
||||
i = ll_get_prev(&(par->child_ll), border_p);
|
||||
|
||||
while(i != NULL) {
|
||||
/*Refresh the objects*/
|
||||
lv_refr_obj(i, mask_p);
|
||||
i = ll_get_prev(&(par->child_ll), i);
|
||||
}
|
||||
|
||||
/*The new border will be there last parents,
|
||||
*so the 'younger' brothers of parent will be refreshed*/
|
||||
border_p = par;
|
||||
/*Go a level deeper*/
|
||||
par = lv_obj_get_parent(par);
|
||||
}
|
||||
|
||||
/*Call the post draw design function of the parents of the to object*/
|
||||
par = lv_obj_get_parent(top_p);
|
||||
while(par != NULL) {
|
||||
par->design_f(par, mask_p, LV_DESIGN_DRAW_POST);
|
||||
par = lv_obj_get_parent(par);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Refresh an object an all of its children. (Called recursively)
|
||||
* @param obj pointer to an object to refresh
|
||||
* @param mask_ori_p pointer to an area, the objects will be drawn only here
|
||||
*/
|
||||
static void lv_refr_obj(lv_obj_t * obj, const area_t * mask_ori_p)
|
||||
{
|
||||
/*Do not refresh hidden objects*/
|
||||
if(obj->hidden != 0) return;
|
||||
|
||||
bool union_ok; /* Store the return value of area_union */
|
||||
/* Truncate the original mask to the coordinates of the parent
|
||||
* because the parent and its children are visible only here */
|
||||
area_t obj_mask;
|
||||
area_t obj_ext_mask;
|
||||
area_t obj_area;
|
||||
cord_t ext_size = obj->ext_size;
|
||||
lv_obj_get_cords(obj, &obj_area);
|
||||
obj_area.x1 -= ext_size;
|
||||
obj_area.y1 -= ext_size;
|
||||
obj_area.x2 += ext_size;
|
||||
obj_area.y2 += ext_size;
|
||||
union_ok = area_union(&obj_ext_mask, mask_ori_p, &obj_area);
|
||||
|
||||
/*Draw the parent and its children only if they ore on 'mask_parent'*/
|
||||
if(union_ok != false) {
|
||||
|
||||
/* Redraw the object */
|
||||
lv_style_t * style = lv_obj_get_style(obj);
|
||||
if(style->opa != OPA_TRANSP) {
|
||||
obj->design_f(obj, &obj_ext_mask, LV_DESIGN_DRAW_MAIN);
|
||||
//tick_wait_ms(100); /*DEBUG: Wait after every object draw to see the order of drawing*/
|
||||
}
|
||||
|
||||
/*Create a new 'obj_mask' without 'ext_size' because the children can't be visible there*/
|
||||
lv_obj_get_cords(obj, &obj_area);
|
||||
union_ok = area_union(&obj_mask, mask_ori_p, &obj_area);
|
||||
if(union_ok != false) {
|
||||
area_t mask_child; /*Mask from obj and its child*/
|
||||
lv_obj_t * child_p;
|
||||
area_t child_area;
|
||||
LL_READ_BACK(obj->child_ll, child_p)
|
||||
{
|
||||
lv_obj_get_cords(child_p, &child_area);
|
||||
ext_size = child_p->ext_size;
|
||||
child_area.x1 -= ext_size;
|
||||
child_area.y1 -= ext_size;
|
||||
child_area.x2 += ext_size;
|
||||
child_area.y2 += ext_size;
|
||||
/* Get the union (common parts) of original mask (from obj)
|
||||
* and its child */
|
||||
union_ok = area_union(&mask_child, &obj_mask, &child_area);
|
||||
|
||||
/*If the parent and the child has common area then refresh the child */
|
||||
if(union_ok) {
|
||||
/*Refresh the next children*/
|
||||
lv_refr_obj(child_p, &mask_child);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* If all the children are redrawn make 'post draw' design */
|
||||
if(style->opa != OPA_TRANSP) {
|
||||
obj->design_f(obj, &obj_ext_mask, LV_DESIGN_DRAW_POST);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,70 +0,0 @@
|
||||
/**
|
||||
* @file lv_refr.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LV_REFR_H
|
||||
#define LV_REFR_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_obj.h"
|
||||
#include <stdbool.h>
|
||||
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the screen refresh subsystem
|
||||
*/
|
||||
void lv_refr_init(void);
|
||||
|
||||
/**
|
||||
* Invalidate an area
|
||||
* @param area_p pointer to area which should be invalidated
|
||||
*/
|
||||
void lv_inv_area(const area_t * area_p);
|
||||
|
||||
/**
|
||||
* Set a function to call after every refresh to announce the refresh time and the number of refreshed pixels
|
||||
* @param cb pointer to a callback function (void my_refr_cb(uint32_t time_ms, uint32_t px_num))
|
||||
*/
|
||||
void lv_refr_set_monitor_cb(void (*cb)(uint32_t, uint32_t));
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /*LV_REFR_H*/
|
||||
@@ -1,325 +0,0 @@
|
||||
/**
|
||||
* @file lv_style.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_conf.h"
|
||||
#include "lv_style.h"
|
||||
#include "lv_obj.h"
|
||||
#include "misc/mem/dyn_mem.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define LV_STYLE_ANIM_RES 255 /*Animation max in 1024 steps*/
|
||||
#define LV_STYLE_ANIM_SHIFT 8 /*log2(LV_STYLE_ANIM_RES)*/
|
||||
|
||||
#define VAL_PROP(v1, v2, r) v1 + (((v2-v1) * r) >> LV_STYLE_ANIM_SHIFT)
|
||||
#define STYLE_ATTR_ANIM(attr, r) if(start->attr != end->attr) act->attr = VAL_PROP(start->attr, end->attr, r)
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
typedef struct {
|
||||
const lv_style_t * style_start;
|
||||
const lv_style_t * style_end;
|
||||
lv_style_t * style_anim;
|
||||
}lv_style_anim_dsc_t;
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static void lv_style_aimator(lv_style_anim_dsc_t * dsc, int32_t val);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
|
||||
static lv_style_t lv_style_scr;
|
||||
static lv_style_t lv_style_transp;
|
||||
static lv_style_t lv_style_transp_tight;
|
||||
static lv_style_t lv_style_plain;
|
||||
static lv_style_t lv_style_plain_color;
|
||||
static lv_style_t lv_style_pretty;
|
||||
static lv_style_t lv_style_pretty_color;
|
||||
static lv_style_t lv_style_btn_rel;
|
||||
static lv_style_t lv_style_btn_pr;
|
||||
static lv_style_t lv_style_btn_trel;
|
||||
static lv_style_t lv_style_btn_tpr;
|
||||
static lv_style_t lv_style_btn_ina;
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Init the basic styles
|
||||
*/
|
||||
void lv_style_init (void)
|
||||
{
|
||||
/* Not White/Black/Gray colors are created by HSV model with
|
||||
* HUE = 210*/
|
||||
|
||||
/*Screen style*/
|
||||
lv_style_scr.ccolor = COLOR_MAKE(0x20, 0x20, 0x20);
|
||||
lv_style_scr.opa = OPA_COVER;
|
||||
|
||||
lv_style_scr.mcolor = COLOR_MAKE(0xc9, 0xdb, 0xee);
|
||||
lv_style_scr.gcolor = COLOR_MAKE(0x4d, 0x91, 0xd5);
|
||||
lv_style_scr.bcolor = COLOR_BLACK;
|
||||
lv_style_scr.scolor = COLOR_GRAY;
|
||||
lv_style_scr.radius = 0;
|
||||
lv_style_scr.bwidth = 0;
|
||||
lv_style_scr.swidth = 0;
|
||||
lv_style_scr.stype = LV_STYPE_FULL;
|
||||
lv_style_scr.vpad = LV_DPI / 12;
|
||||
lv_style_scr.hpad = LV_DPI / 12;
|
||||
lv_style_scr.opad = LV_DPI / 12;
|
||||
lv_style_scr.bopa = OPA_COVER;
|
||||
lv_style_scr.empty = 0;
|
||||
lv_style_scr.glass = 0;
|
||||
|
||||
lv_style_scr.font = font_get(FONT_DEFAULT);
|
||||
lv_style_scr.letter_space = 1 * LV_DOWNSCALE;
|
||||
lv_style_scr.line_space = 2 * LV_DOWNSCALE;
|
||||
lv_style_scr.txt_align = LV_TXT_ALIGN_LEFT;
|
||||
lv_style_scr.img_recolor = OPA_TRANSP;
|
||||
lv_style_scr.line_width = 1 * LV_DOWNSCALE;
|
||||
|
||||
/*Plain style (by default near the same as the screen style)*/
|
||||
memcpy(&lv_style_plain, &lv_style_scr, sizeof(lv_style_t));
|
||||
lv_style_plain.mcolor = COLOR_WHITE;
|
||||
lv_style_plain.gcolor = COLOR_WHITE;
|
||||
lv_style_plain.bcolor = COLOR_WHITE;
|
||||
|
||||
/*Plain color style*/
|
||||
memcpy(&lv_style_plain_color, &lv_style_plain, sizeof(lv_style_t));
|
||||
lv_style_plain_color.ccolor = COLOR_MAKE(0xf0, 0xf0, 0xf0);
|
||||
lv_style_plain_color.mcolor = COLOR_MAKE(0x55, 0x96, 0xd8);
|
||||
lv_style_plain_color.gcolor = lv_style_plain_color.mcolor;
|
||||
|
||||
/*Pretty style */
|
||||
memcpy(&lv_style_pretty, &lv_style_plain, sizeof(lv_style_t));
|
||||
lv_style_pretty.ccolor = COLOR_MAKE(0x20, 0x20, 0x20);
|
||||
lv_style_pretty.mcolor = COLOR_WHITE;
|
||||
lv_style_pretty.gcolor = COLOR_SILVER;
|
||||
lv_style_pretty.bcolor = COLOR_MAKE(0x40, 0x40, 0x40);
|
||||
lv_style_pretty.radius = LV_DPI / 15;
|
||||
lv_style_pretty.bwidth = LV_DPI / 50 >= 1 ? LV_DPI / 50 : 1;
|
||||
lv_style_pretty.bopa = OPA_50;
|
||||
|
||||
/*Pretty color style*/
|
||||
memcpy(&lv_style_pretty_color, &lv_style_pretty, sizeof(lv_style_t));
|
||||
lv_style_pretty_color.ccolor = COLOR_MAKE(0xe0, 0xe0, 0xe0);
|
||||
lv_style_pretty_color.mcolor = COLOR_MAKE(0x6b, 0x9a, 0xc7);
|
||||
lv_style_pretty_color.gcolor = COLOR_MAKE(0x2b, 0x59, 0x8b);
|
||||
lv_style_pretty_color.bcolor = COLOR_MAKE(0x15, 0x2c, 0x42);
|
||||
|
||||
/*Transparent style*/
|
||||
memcpy(&lv_style_transp, &lv_style_plain, sizeof(lv_style_t));
|
||||
lv_style_transp.empty = 1;
|
||||
lv_style_transp.bwidth = 0;
|
||||
lv_style_transp.glass = 1;
|
||||
|
||||
/*Transparent tight style*/
|
||||
memcpy(&lv_style_transp_tight, &lv_style_transp, sizeof(lv_style_t));
|
||||
lv_style_transp_tight.hpad = 0;
|
||||
lv_style_transp_tight.vpad = 0;
|
||||
|
||||
/*Button released style*/
|
||||
memcpy(&lv_style_btn_rel, &lv_style_plain, sizeof(lv_style_t));
|
||||
lv_style_btn_rel.mcolor = COLOR_MAKE(0x76, 0xa2, 0xd0);
|
||||
lv_style_btn_rel.gcolor = COLOR_MAKE(0x19, 0x3a, 0x5d);
|
||||
lv_style_btn_rel.bcolor = COLOR_MAKE(0x0b, 0x19, 0x28);
|
||||
lv_style_btn_rel.ccolor = COLOR_MAKE(0xff, 0xff, 0xff);
|
||||
lv_style_btn_rel.bwidth = LV_DPI / 50 >= 1 ? LV_DPI / 50 : 1;
|
||||
lv_style_btn_rel.radius = LV_DPI / 15;
|
||||
lv_style_btn_rel.bopa = OPA_70;
|
||||
lv_style_btn_rel.scolor = COLOR_GRAY;
|
||||
lv_style_btn_rel.swidth = 0;
|
||||
lv_style_btn_rel.hpad = LV_DPI / 4;
|
||||
lv_style_btn_rel.vpad = LV_DPI / 6;
|
||||
lv_style_btn_rel.opad = LV_DPI / 10;
|
||||
lv_style_btn_rel.txt_align = LV_TXT_ALIGN_MID;
|
||||
|
||||
/*Button pressed style*/
|
||||
memcpy(&lv_style_btn_pr, &lv_style_btn_rel, sizeof(lv_style_t));
|
||||
lv_style_btn_pr.mcolor = COLOR_MAKE(0x33, 0x62, 0x94);
|
||||
lv_style_btn_pr.gcolor = COLOR_MAKE(0x10, 0x26, 0x3c);
|
||||
lv_style_btn_pr.ccolor = COLOR_MAKE(0xa4, 0xb5, 0xc6);
|
||||
|
||||
/*Button toggle released style*/
|
||||
memcpy(&lv_style_btn_trel, &lv_style_btn_rel, sizeof(lv_style_t));
|
||||
lv_style_btn_trel.mcolor = COLOR_MAKE(0x0a, 0x11, 0x22);
|
||||
lv_style_btn_trel.gcolor = COLOR_MAKE(0x37, 0x62, 0x90);
|
||||
lv_style_btn_trel.bcolor = COLOR_MAKE(0x01, 0x07, 0x0d);
|
||||
lv_style_btn_trel.ccolor = COLOR_MAKE(0xc8, 0xdd, 0xf4);
|
||||
|
||||
/*Button toggle pressed style*/
|
||||
memcpy(&lv_style_btn_tpr, &lv_style_btn_rel, sizeof(lv_style_t));
|
||||
lv_style_btn_tpr.mcolor = COLOR_MAKE(0x02, 0x14, 0x27);
|
||||
lv_style_btn_tpr.gcolor = COLOR_MAKE(0x2b, 0x4c, 0x70);
|
||||
lv_style_btn_tpr.ccolor = COLOR_MAKE(0xa4, 0xb5, 0xc6);
|
||||
|
||||
/*Button inactive style*/
|
||||
memcpy(&lv_style_btn_ina, &lv_style_btn_rel, sizeof(lv_style_t));
|
||||
lv_style_btn_ina.mcolor = COLOR_MAKE(0xd8, 0xd8, 0xd8);
|
||||
lv_style_btn_ina.gcolor = COLOR_MAKE(0xd8, 0xd8, 0xd8);
|
||||
lv_style_btn_ina.bcolor = COLOR_MAKE(0x90, 0x90, 0x90);
|
||||
lv_style_btn_ina.ccolor = COLOR_MAKE(0x70, 0x70, 0x70);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get style from its name
|
||||
* @param style_name an element of the 'lv_style_name_t' enum
|
||||
* @return pointer to the requested style (lv_style_def by default)
|
||||
*/
|
||||
lv_style_t * lv_style_get(lv_style_name_t style_name, lv_style_t * copy)
|
||||
{
|
||||
lv_style_t * style = &lv_style_plain;
|
||||
|
||||
switch(style_name) {
|
||||
case LV_STYLE_SCR:
|
||||
style = &lv_style_scr;
|
||||
break;
|
||||
case LV_STYLE_PLAIN:
|
||||
style = &lv_style_plain;
|
||||
break;
|
||||
case LV_STYLE_PLAIN_COLOR:
|
||||
style = &lv_style_plain_color;
|
||||
break;
|
||||
case LV_STYLE_PRETTY:
|
||||
style = &lv_style_pretty;
|
||||
break;
|
||||
case LV_STYLE_PRETTY_COLOR:
|
||||
style = &lv_style_pretty_color;
|
||||
break;
|
||||
case LV_STYLE_TRANSP:
|
||||
style = &lv_style_transp;
|
||||
break;
|
||||
case LV_STYLE_TRANSP_TIGHT:
|
||||
style = &lv_style_transp_tight;
|
||||
break;
|
||||
case LV_STYLE_BTN_REL:
|
||||
style = &lv_style_btn_rel;
|
||||
break;
|
||||
case LV_STYLE_BTN_PR:
|
||||
style = &lv_style_btn_pr;
|
||||
break;
|
||||
case LV_STYLE_BTN_TREL:
|
||||
style = &lv_style_btn_trel;
|
||||
break;
|
||||
case LV_STYLE_BTN_TPR:
|
||||
style = &lv_style_btn_tpr;
|
||||
break;
|
||||
case LV_STYLE_BTN_INA:
|
||||
style = &lv_style_btn_ina;
|
||||
break;
|
||||
default:
|
||||
style = &lv_style_plain;
|
||||
}
|
||||
|
||||
if(copy != NULL) memcpy(copy, style, sizeof(lv_style_t));
|
||||
|
||||
return style;
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy a style to an other
|
||||
* @param dest pointer to the destination style
|
||||
* @param src pointer to the source style
|
||||
*/
|
||||
void lv_style_cpy(lv_style_t * dest, const lv_style_t * src)
|
||||
{
|
||||
memcpy(dest, src, sizeof(lv_style_t));
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an animation from a pre-configured 'lv_style_anim_t' variable
|
||||
* @param anim pointer to a pre-configured 'lv_style_anim_t' variable (will be copied)
|
||||
*/
|
||||
void lv_style_anim_create(lv_style_anim_t * anim)
|
||||
{
|
||||
lv_style_anim_dsc_t * dsc;
|
||||
dsc = dm_alloc(sizeof(lv_style_anim_dsc_t));
|
||||
dsc->style_anim = anim->style_anim;
|
||||
dsc->style_start = anim->style_start;
|
||||
dsc->style_end = anim->style_end;
|
||||
|
||||
anim_t a;
|
||||
a.var = (void*)dsc;
|
||||
a.start = 0;
|
||||
a.end = LV_STYLE_ANIM_RES;
|
||||
a.fp = (anim_fp_t)lv_style_aimator;
|
||||
a.path = anim_get_path(ANIM_PATH_LIN);
|
||||
a.end_cb = anim->end_cb;
|
||||
a.act_time = anim->act_time;
|
||||
a.time = anim->time;
|
||||
a.playback = anim->playback;
|
||||
a.playback_pause = anim->playback_pause;
|
||||
a.repeat = anim->repeat;
|
||||
a.repeat_pause = anim->repeat_pause;
|
||||
|
||||
anim_create(&a);
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Used by the style animations to set the values of a style according to start and end style.
|
||||
* @param dsc the 'animated variable' set by lv_style_anim_create()
|
||||
* @param val the current state of the animation between 0 and LV_STYLE_ANIM_RES
|
||||
*/
|
||||
static void lv_style_aimator(lv_style_anim_dsc_t * dsc, int32_t val)
|
||||
{
|
||||
const lv_style_t * start = dsc->style_start;
|
||||
const lv_style_t * end = dsc->style_end;
|
||||
lv_style_t * act = dsc->style_anim;
|
||||
|
||||
STYLE_ATTR_ANIM(opa, val);
|
||||
STYLE_ATTR_ANIM(radius, val);
|
||||
STYLE_ATTR_ANIM(bwidth, val);
|
||||
STYLE_ATTR_ANIM(swidth, val);
|
||||
STYLE_ATTR_ANIM(hpad, val);
|
||||
STYLE_ATTR_ANIM(vpad, val);
|
||||
STYLE_ATTR_ANIM(opad, val);
|
||||
STYLE_ATTR_ANIM(line_space, val);
|
||||
STYLE_ATTR_ANIM(letter_space, val);
|
||||
STYLE_ATTR_ANIM(line_width, val);
|
||||
STYLE_ATTR_ANIM(img_recolor, val);
|
||||
|
||||
act->mcolor = color_mix(end->mcolor, start->mcolor, val);
|
||||
act->gcolor = color_mix(end->gcolor, start->gcolor, val);
|
||||
act->bcolor = color_mix(end->bcolor, start->bcolor, val);
|
||||
act->scolor = color_mix(end->scolor, start->scolor, val);
|
||||
act->ccolor = color_mix(end->ccolor, start->ccolor, val);
|
||||
|
||||
|
||||
if(val == 0) {
|
||||
act->empty = start->empty;
|
||||
act->glass = start->glass;
|
||||
act->font = start->font;
|
||||
act->stype = start->stype;
|
||||
act->txt_align = start->txt_align;
|
||||
}
|
||||
|
||||
if(val == LV_STYLE_ANIM_RES) {
|
||||
act->empty = end->empty;
|
||||
act->glass = end->glass;
|
||||
act->font = end->font;
|
||||
act->stype = end->stype;
|
||||
act->txt_align = end->txt_align;
|
||||
}
|
||||
|
||||
lv_style_refr_objs(dsc->style_anim);
|
||||
}
|
||||
@@ -1,155 +0,0 @@
|
||||
/**
|
||||
* @file lv_style.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LV_STYLE_H
|
||||
#define LV_STYLE_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include <stdbool.h>
|
||||
#include "misc/gfx/color.h"
|
||||
#include "misc/gfx/area.h"
|
||||
#include "misc/gfx/font.h"
|
||||
#include "misc/gfx/anim.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define LV_RADIUS_CIRCLE (CORD_MAX) /*A very big radius to always draw as circle*/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
typedef enum {
|
||||
LV_TXT_ALIGN_LEFT = 0,
|
||||
LV_TXT_ALIGN_MID,
|
||||
}lv_txt_align_t;
|
||||
|
||||
|
||||
/*Shadow types*/
|
||||
typedef enum
|
||||
{
|
||||
LV_STYPE_BOTTOM = 0,
|
||||
LV_STYPE_FULL,
|
||||
}lv_stype_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
/*Object level styles*/
|
||||
color_t ccolor; /*Content color (e.g. text or image re-color )*/
|
||||
opa_t opa; /*Opacity of the object*/
|
||||
uint8_t glass :1; /*1: Do not inherit this style*/
|
||||
uint8_t empty :1; /*Transparent background (border drawn)*/
|
||||
uint8_t stype :2; /*Shadow type from 'lv_shadow_type_t'*/
|
||||
uint8_t txt_align:2;
|
||||
color_t mcolor; /*Main color of background*/
|
||||
color_t gcolor; /*Gradient color of background*/
|
||||
color_t bcolor; /*Border color of background*/
|
||||
color_t scolor; /*Shadow color of background*/
|
||||
cord_t radius; /*Corner radius of background*/
|
||||
cord_t bwidth; /*Width of the background border*/
|
||||
cord_t swidth; /*Width of the background shadow effect*/
|
||||
cord_t vpad; /*Vertical padding*/
|
||||
cord_t hpad; /*Horizontal padding*/
|
||||
cord_t opad; /*Object padding on the background*/
|
||||
opa_t bopa; /*Opacity of background border*/
|
||||
const font_t * font;
|
||||
cord_t letter_space;
|
||||
cord_t line_space;
|
||||
opa_t img_recolor;
|
||||
cord_t line_width;
|
||||
}lv_style_t;
|
||||
|
||||
typedef enum {
|
||||
LV_STYLE_SCR,
|
||||
LV_STYLE_TRANSP,
|
||||
LV_STYLE_TRANSP_TIGHT,
|
||||
LV_STYLE_PLAIN,
|
||||
LV_STYLE_PLAIN_COLOR,
|
||||
LV_STYLE_PRETTY,
|
||||
LV_STYLE_PRETTY_COLOR,
|
||||
LV_STYLE_BTN_REL,
|
||||
LV_STYLE_BTN_PR,
|
||||
LV_STYLE_BTN_TREL,
|
||||
LV_STYLE_BTN_TPR,
|
||||
LV_STYLE_BTN_INA,
|
||||
}lv_style_name_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
const lv_style_t * style_start; /*Pointer to the starting style*/
|
||||
const lv_style_t * style_end; /*Pointer to the destination style*/
|
||||
lv_style_t * style_anim; /*Pointer to a style to animate*/
|
||||
anim_cb_t end_cb; /*Call it when the animation is ready*/
|
||||
int16_t time; /*Animation time in ms*/
|
||||
int16_t act_time; /*Current time in animation. Set to negative to make delay.*/
|
||||
uint16_t playback_pause; /*Wait before play back*/
|
||||
uint16_t repeat_pause; /*Wait before repeat*/
|
||||
uint8_t playback :1; /*When the animation is ready play it back*/
|
||||
uint8_t repeat :1; /*Repeat the animation infinitely*/
|
||||
}lv_style_anim_t;
|
||||
|
||||
/* Example initialization
|
||||
lv_style_anim_t a;
|
||||
a.style_anim = &style_to_anim;
|
||||
a.style_start = &style_1;
|
||||
a.style_end = &style_2;
|
||||
a.act_time = 0;
|
||||
a.time = 1000;
|
||||
a.playback = 0;
|
||||
a.playback_pause = 0;
|
||||
a.repeat = 0;
|
||||
a.repeat_pause = 0;
|
||||
a.end_cb = NULL;
|
||||
lv_style_anim_create(&a);
|
||||
*/
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Init the basic styles
|
||||
*/
|
||||
void lv_style_init (void);
|
||||
|
||||
/**
|
||||
* Get style from its name
|
||||
* @param style_name an element of the 'lv_style_name_t' enum
|
||||
* @return pointer to the requested style (lv_style_def by default)
|
||||
*/
|
||||
lv_style_t * lv_style_get(lv_style_name_t style_name, lv_style_t * copy);
|
||||
|
||||
|
||||
/**
|
||||
* Copy a style to an other
|
||||
* @param dest pointer to the destination style
|
||||
* @param src pointer to the source style
|
||||
*/
|
||||
void lv_style_cpy(lv_style_t * dest, const lv_style_t * src);
|
||||
|
||||
/**
|
||||
* Create an animation from a pre-configured 'lv_style_anim_t' variable
|
||||
* @param anim pointer to a pre-configured 'lv_style_anim_t' variable (will be copied)
|
||||
*/
|
||||
void lv_style_anim_create(lv_style_anim_t * anim);
|
||||
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /*LV_STYLE_H*/
|
||||
169
lv_obj/lv_vdb.c
169
lv_obj/lv_vdb.c
@@ -1,169 +0,0 @@
|
||||
/**
|
||||
* @file lv_vdb.c
|
||||
*
|
||||
*/
|
||||
#include "lv_conf.h"
|
||||
#if LV_VDB_SIZE != 0
|
||||
|
||||
#include "hal/disp/disp.h"
|
||||
#include <stddef.h>
|
||||
#include "lv_vdb.h"
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
#if LV_VDB_DOUBLE != 0
|
||||
typedef enum {
|
||||
LV_VDB_STATE_FREE = 0,
|
||||
LV_VDB_STATE_ACTIVE,
|
||||
LV_VDB_STATE_FLUSH,
|
||||
} lv_vdb_state_t;
|
||||
#endif
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
#if LV_VDB_DOUBLE == 0
|
||||
static lv_vdb_t vdb;
|
||||
#else
|
||||
static lv_vdb_t vdb[2];
|
||||
static volatile lv_vdb_state_t vdb_state[2] = {LV_VDB_STATE_FREE, LV_VDB_STATE_FREE};
|
||||
#endif
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Get the 'vdb' variable or allocate one in LV_VDB_DOUBLE mode
|
||||
* @return pointer to the 'vdb' variable
|
||||
*/
|
||||
lv_vdb_t * lv_vdb_get(void)
|
||||
{
|
||||
#if LV_VDB_DOUBLE == 0
|
||||
return &vdb;
|
||||
#else
|
||||
/*If already there is an active do nothing*/
|
||||
if(vdb_state[0] == LV_VDB_STATE_ACTIVE) return &vdb[0];
|
||||
if(vdb_state[1] == LV_VDB_STATE_ACTIVE) return &vdb[1];
|
||||
|
||||
/*Try to allocate a free VDB*/
|
||||
if(vdb_state[0] == LV_VDB_STATE_FREE) {
|
||||
vdb_state[0] = LV_VDB_STATE_ACTIVE;
|
||||
return &vdb[0];
|
||||
}
|
||||
|
||||
if(vdb_state[1] == LV_VDB_STATE_FREE) {
|
||||
vdb_state[1] = LV_VDB_STATE_ACTIVE;
|
||||
return &vdb[1];
|
||||
}
|
||||
|
||||
return NULL; /*There wasn't free VDB (never happen)*/
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Flush the content of the VDB
|
||||
*/
|
||||
void lv_vdb_flush(void)
|
||||
{
|
||||
lv_vdb_t * vdb_act = lv_vdb_get();
|
||||
if(vdb_act == NULL) return;
|
||||
|
||||
#if LV_VDB_DOUBLE != 0
|
||||
/* Wait the pending flush before starting this one
|
||||
* (Don't forget: 'lv_vdb_flush_ready' has to be called when flushing is ready)*/
|
||||
while(vdb_state[0] == LV_VDB_STATE_FLUSH || vdb_state[1] == LV_VDB_STATE_FLUSH);
|
||||
|
||||
/*Turn the active VDB to flushing*/
|
||||
if(vdb_state[0] == LV_VDB_STATE_ACTIVE) vdb_state[0] = LV_VDB_STATE_FLUSH;
|
||||
if(vdb_state[1] == LV_VDB_STATE_ACTIVE) vdb_state[1] = LV_VDB_STATE_FLUSH;
|
||||
#endif
|
||||
|
||||
#if LV_ANTIALIAS == 0
|
||||
disp_map(vdb_act->area.x1, vdb_act->area.y1, vdb_act->area.x2, vdb_act->area.y2, vdb_act->buf);
|
||||
#else
|
||||
/* Get the average of 2x2 pixels and put the result back to the VDB
|
||||
* The reading goes much faster then the write back
|
||||
* so useful data won't be overwritten
|
||||
* Example:
|
||||
* -----------------------------
|
||||
* in1_buf |2,2|6,8| 3,7
|
||||
* in2_buf |4,4|7,7| 1,2
|
||||
* --------- ==>
|
||||
* in1_buf |1,1|1,3|
|
||||
* in2_buf |1,1|1,3|
|
||||
* */
|
||||
cord_t x;
|
||||
cord_t y;
|
||||
cord_t w = area_get_width(&vdb_act->area);
|
||||
color_t * in1_buf = vdb_act->buf; /*Pointer to the first row*/
|
||||
color_t * in2_buf = vdb_act->buf + w; /*Pointer to the second row*/
|
||||
color_t * out_buf = vdb_act->buf; /*Store the result here*/
|
||||
for(y = vdb_act->area.y1; y < vdb_act->area.y2; y += 2) {
|
||||
for(x = vdb_act->area.x1; x < vdb_act->area.x2; x += 2) {
|
||||
|
||||
/*If the pixels are the same do not calculate the average */
|
||||
if(in1_buf->full == (in1_buf + 1)->full &&
|
||||
in1_buf->full == in2_buf->full &&
|
||||
in1_buf->full == (in2_buf + 1)->full) {
|
||||
out_buf->full = in1_buf->full;
|
||||
} else {
|
||||
/*Get the average of 2x2 red*/
|
||||
out_buf->red = (in1_buf->red + (in1_buf + 1)->red +
|
||||
in2_buf->red + (in2_buf+ 1)->red) >> 2;
|
||||
/*Get the average of 2x2 green*/
|
||||
out_buf->green = (in1_buf->green + (in1_buf + 1)->green +
|
||||
in2_buf->green + (in2_buf + 1)->green) >> 2;
|
||||
/*Get the average of 2x2 blue*/
|
||||
out_buf->blue = (in1_buf->blue + (in1_buf + 1)->blue +
|
||||
in2_buf->blue + (in2_buf + 1)->blue) >> 2;
|
||||
}
|
||||
|
||||
in1_buf += 2; /*Skip the next pixel because it is already used above*/
|
||||
in2_buf += 2;
|
||||
out_buf ++;
|
||||
}
|
||||
/*2 row is ready so go the next 2*/
|
||||
in1_buf += w; /*Skip the next row because it is processed from in2_buf*/
|
||||
in2_buf += w;
|
||||
}
|
||||
|
||||
/* Now the full the VDB is filtered and the result is stored in the first quarter of it
|
||||
* Write out the filtered map to the display*/
|
||||
disp_map(vdb_act->area.x1 >> 1, vdb_act->area.y1 >> 1, vdb_act->area.x2 >> 1, vdb_act->area.y2 >> 1, vdb_act->buf);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* In 'LV_VDB_DOUBLE' mode has to be called when the 'disp_map'
|
||||
* is ready with copying the map to a frame buffer.
|
||||
*/
|
||||
void lv_vdb_flush_ready(void)
|
||||
{
|
||||
#if LV_VDB_DOUBLE != 0
|
||||
if(vdb_state[0] == LV_VDB_STATE_FLUSH) vdb_state[0] = LV_VDB_STATE_FREE;
|
||||
if(vdb_state[1] == LV_VDB_STATE_FLUSH) vdb_state[1] = LV_VDB_STATE_FREE;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
#endif
|
||||
@@ -1,69 +0,0 @@
|
||||
/**
|
||||
* @file lv_vdb.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LV_VDB_H
|
||||
#define LV_VDB_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_conf.h"
|
||||
|
||||
#if LV_VDB_SIZE != 0
|
||||
|
||||
#include "misc/gfx/color.h"
|
||||
#include "misc/gfx/area.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
typedef struct
|
||||
{
|
||||
area_t area;
|
||||
color_t buf[LV_VDB_SIZE];
|
||||
}lv_vdb_t;
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Get the 'vdb' variable or allocate one in LV_VDB_DOUBLE mode
|
||||
* @return pointer to the 'vdb' variable
|
||||
*/
|
||||
lv_vdb_t * lv_vdb_get(void);
|
||||
|
||||
/**
|
||||
* Flush the content of the vdb
|
||||
*/
|
||||
void lv_vdb_flush(void);
|
||||
|
||||
|
||||
/**
|
||||
* In 'LV_VDB_DOUBLE' mode has to be called when 'disp_map()'
|
||||
* is ready with copying the map to a frame buffer.
|
||||
*/
|
||||
void lv_vdb_flush_ready(void);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /*LV_VDB_SIZE != 0*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /*LV_VDB_H*/
|
||||
306
lv_objx/lv_bar.c
306
lv_objx/lv_bar.c
@@ -1,306 +0,0 @@
|
||||
|
||||
|
||||
/**
|
||||
* @file lv_bar.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_conf.h"
|
||||
#if USE_LV_BAR != 0
|
||||
|
||||
#include <lvgl/lv_objx/lv_bar.h>
|
||||
#include "../lv_draw/lv_draw.h"
|
||||
#include "misc/gfx/anim.h"
|
||||
#include <stdio.h>
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static bool lv_bar_design(lv_obj_t * bar, const area_t * mask, lv_design_mode_t mode);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
static lv_design_f_t ancestor_design_f;
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/*-----------------
|
||||
* Create function
|
||||
*-----------------*/
|
||||
|
||||
/**
|
||||
* Create a bar objects
|
||||
* @param par pointer to an object, it will be the parent of the new bar
|
||||
* @param copy pointer to a bar object, if not NULL then the new object will be copied from it
|
||||
* @return pointer to the created bar
|
||||
*/
|
||||
lv_obj_t * lv_bar_create(lv_obj_t * par, lv_obj_t * copy)
|
||||
{
|
||||
/*Create the ancestor basic object*/
|
||||
lv_obj_t * new_bar = lv_obj_create(par, copy);
|
||||
dm_assert(new_bar);
|
||||
|
||||
/*Allocate the object type specific extended data*/
|
||||
lv_bar_ext_t * ext = lv_obj_alloc_ext(new_bar, sizeof(lv_bar_ext_t));
|
||||
dm_assert(ext);
|
||||
ext->min_value = 0;
|
||||
ext->max_value = 100;
|
||||
ext->act_value = 0;
|
||||
ext->style_indic = lv_style_get(LV_STYLE_PRETTY_COLOR, NULL);
|
||||
|
||||
/* Save the ancient design function.
|
||||
* It will be used in the bar design function*/
|
||||
if(ancestor_design_f == NULL) ancestor_design_f = lv_obj_get_design_f(new_bar);
|
||||
|
||||
lv_obj_set_signal_f(new_bar, lv_bar_signal);
|
||||
lv_obj_set_design_f(new_bar, lv_bar_design);
|
||||
|
||||
/*Init the new bar object*/
|
||||
if(copy == NULL) {
|
||||
lv_obj_set_click(new_bar, false);
|
||||
lv_obj_set_size(new_bar, LV_DPI * 2, LV_DPI / 3);
|
||||
lv_obj_set_style(new_bar, lv_style_get(LV_STYLE_PRETTY, NULL));
|
||||
lv_bar_set_value(new_bar, ext->act_value);
|
||||
} else {
|
||||
lv_bar_ext_t * ext_copy = lv_obj_get_ext(copy);
|
||||
ext->min_value = ext_copy->min_value;
|
||||
ext->max_value = ext_copy->max_value;
|
||||
ext->act_value = ext_copy->act_value;
|
||||
ext->style_indic = ext_copy->style_indic;
|
||||
/*Refresh the style with new signal function*/
|
||||
lv_obj_refr_style(new_bar);
|
||||
|
||||
lv_bar_set_value(new_bar, ext->act_value);
|
||||
}
|
||||
return new_bar;
|
||||
}
|
||||
|
||||
/**
|
||||
* Signal function of the bar
|
||||
* @param bar pointer to a bar object
|
||||
* @param sign a signal type from lv_signal_t enum
|
||||
* @param param pointer to a signal specific variable
|
||||
*/
|
||||
bool lv_bar_signal(lv_obj_t * bar, lv_signal_t sign, void * param)
|
||||
{
|
||||
bool valid;
|
||||
|
||||
/* Include the ancient signal function */
|
||||
valid = lv_obj_signal(bar, sign, param);
|
||||
|
||||
/* The object can be deleted so check its validity and then
|
||||
* make the object specific signal handling */
|
||||
if(valid != false) {
|
||||
if(sign == LV_SIGNAL_REFR_EXT_SIZE) {
|
||||
lv_style_t * style_indic = lv_bar_get_style_indic(bar);
|
||||
if(style_indic->swidth > bar->ext_size) bar->ext_size = style_indic->swidth;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return valid;
|
||||
}
|
||||
|
||||
/*=====================
|
||||
* Setter functions
|
||||
*====================*/
|
||||
|
||||
/**
|
||||
* Set a new value on the bar
|
||||
* @param bar pointer to a bar object
|
||||
* @param value new value
|
||||
*/
|
||||
void lv_bar_set_value(lv_obj_t * bar, int16_t value)
|
||||
{
|
||||
lv_bar_ext_t * ext = lv_obj_get_ext(bar);
|
||||
ext->act_value = value > ext->max_value ? ext->max_value : value;
|
||||
ext->act_value = ext->act_value < ext->min_value ? ext->min_value : ext->act_value;
|
||||
lv_obj_inv(bar);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a new value with animation on the bar
|
||||
* @param bar pointer to a bar object
|
||||
* @param value new value
|
||||
* @param anim_time animation time in milliseconds
|
||||
*/
|
||||
void lv_bar_set_value_anim(lv_obj_t * bar, int16_t value, uint16_t anim_time)
|
||||
{
|
||||
|
||||
lv_bar_ext_t * ext = lv_obj_get_ext(bar);
|
||||
int16_t new_value;
|
||||
new_value = value > ext->max_value ? ext->max_value : value;
|
||||
new_value = new_value < ext->min_value ? ext->min_value : new_value;
|
||||
|
||||
anim_t a;
|
||||
a.var = bar;
|
||||
a.start = ext->act_value;
|
||||
a.end = new_value;
|
||||
a.fp = (anim_fp_t)lv_bar_set_value;
|
||||
a.path = anim_get_path(ANIM_PATH_LIN);
|
||||
a.end_cb = NULL;
|
||||
a.act_time = 0;
|
||||
a.time = anim_time;
|
||||
a.playback = 0;
|
||||
a.playback_pause = 0;
|
||||
a.repeat = 0;
|
||||
a.repeat_pause = 0;
|
||||
|
||||
anim_create(&a);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set minimum and the maximum values of a bar
|
||||
* @param bar pointer to he bar object
|
||||
* @param min minimum value
|
||||
* @param max maximum value
|
||||
*/
|
||||
void lv_bar_set_range(lv_obj_t * bar, int16_t min, int16_t max)
|
||||
{
|
||||
lv_bar_ext_t * ext = lv_obj_get_ext(bar);
|
||||
ext->max_value = max;
|
||||
ext->max_value = max;
|
||||
if(ext->act_value > max) {
|
||||
ext->act_value = max;
|
||||
lv_bar_set_value(bar, ext->act_value);
|
||||
}
|
||||
lv_obj_inv(bar);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the style of bar indicator
|
||||
* @param bar pointer to a bar object
|
||||
* @param style pointer to a style
|
||||
*/
|
||||
void lv_bar_set_style_indic(lv_obj_t * bar, lv_style_t * style)
|
||||
{
|
||||
lv_bar_ext_t * ext = lv_obj_get_ext(bar);
|
||||
|
||||
ext->style_indic = style;
|
||||
|
||||
bar->signal_f(bar, LV_SIGNAL_REFR_EXT_SIZE, NULL);
|
||||
|
||||
lv_obj_inv(bar);
|
||||
}
|
||||
|
||||
/*=====================
|
||||
* Getter functions
|
||||
*====================*/
|
||||
|
||||
/**
|
||||
* Get the value of a bar
|
||||
* @param bar pointer to a bar object
|
||||
* @return the value of the bar
|
||||
*/
|
||||
int16_t lv_bar_get_value(lv_obj_t * bar)
|
||||
{
|
||||
lv_bar_ext_t * ext = lv_obj_get_ext(bar);
|
||||
return ext->act_value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the minimum value of a bar
|
||||
* @param bar pointer to a bar object
|
||||
* @return the minimum value of the bar
|
||||
*/
|
||||
int16_t lv_bar_get_min_value(lv_obj_t * bar)
|
||||
{
|
||||
lv_bar_ext_t * ext = lv_obj_get_ext(bar);
|
||||
return ext->min_value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the maximum value of a bar
|
||||
* @param bar pointer to a bar object
|
||||
* @return the maximum value of the bar
|
||||
*/
|
||||
int16_t lv_bar_get_max_value(lv_obj_t * bar)
|
||||
{
|
||||
lv_bar_ext_t * ext = lv_obj_get_ext(bar);
|
||||
return ext->max_value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the style of bar indicator
|
||||
* @param bar pointer to a bar object
|
||||
* @return pointer to the bar indicator style
|
||||
*/
|
||||
lv_style_t * lv_bar_get_style_indic(lv_obj_t * bar)
|
||||
{
|
||||
lv_bar_ext_t * ext = lv_obj_get_ext(bar);
|
||||
|
||||
if(ext->style_indic == NULL) return lv_obj_get_style(bar);
|
||||
|
||||
return ext->style_indic;
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Handle the drawing related tasks of the bars
|
||||
* @param bar pointer to an object
|
||||
* @param mask the object will be drawn only in this area
|
||||
* @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area
|
||||
* (return 'true' if yes)
|
||||
* LV_DESIGN_DRAW: draw the object (always return 'true')
|
||||
* LV_DESIGN_DRAW_POST: drawing after every children are drawn
|
||||
* @param return true/false, depends on 'mode'
|
||||
*/
|
||||
static bool lv_bar_design(lv_obj_t * bar, const area_t * mask, lv_design_mode_t mode)
|
||||
{
|
||||
if(mode == LV_DESIGN_COVER_CHK) {
|
||||
/*Return false if the object is not covers the mask area*/
|
||||
return ancestor_design_f(bar, mask, mode);;
|
||||
} else if(mode == LV_DESIGN_DRAW_MAIN) {
|
||||
ancestor_design_f(bar, mask, mode);
|
||||
|
||||
lv_bar_ext_t * ext = lv_obj_get_ext(bar);
|
||||
|
||||
lv_style_t * style_indic = lv_bar_get_style_indic(bar);
|
||||
area_t indic_area;
|
||||
area_cpy(&indic_area, &bar->cords);
|
||||
indic_area.x1 += style_indic->hpad;
|
||||
indic_area.x2 -= style_indic->hpad;
|
||||
indic_area.y1 += style_indic->vpad;
|
||||
indic_area.y2 -= style_indic->vpad;
|
||||
|
||||
cord_t w = area_get_width(&indic_area);
|
||||
cord_t h = area_get_height(&indic_area);
|
||||
|
||||
if(w >= h) {
|
||||
indic_area.x2 = (int32_t) ((int32_t)w * ext->act_value) / (ext->max_value - ext->min_value);
|
||||
indic_area.x2 += indic_area.x1;
|
||||
} else {
|
||||
indic_area.y1 = (int32_t) ((int32_t)h * ext->act_value) / (ext->max_value - ext->min_value);
|
||||
indic_area.y1 = indic_area.y2 - indic_area.y1;
|
||||
}
|
||||
|
||||
/*Draw the indicator*/
|
||||
lv_draw_rect(&indic_area, mask, style_indic);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif
|
||||
131
lv_objx/lv_bar.h
131
lv_objx/lv_bar.h
@@ -1,131 +0,0 @@
|
||||
/**
|
||||
* @file lv_bar.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LV_BAR_H
|
||||
#define LV_BAR_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_conf.h"
|
||||
#if USE_LV_BAR != 0
|
||||
|
||||
#include "../lv_obj/lv_obj.h"
|
||||
#include <lvgl/lv_objx/lv_cont.h>
|
||||
#include "lv_btn.h"
|
||||
#include "lv_label.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/*Data of bar*/
|
||||
typedef struct
|
||||
{
|
||||
/*No inherited ext*/ /*Ext. of ancestor*/
|
||||
/*New data for this type */
|
||||
int16_t act_value; /*Current value of the bar*/
|
||||
int16_t min_value; /*Minimum value of the bar*/
|
||||
int16_t max_value; /*Maximum value of the bar*/
|
||||
lv_style_t * style_indic; /*Style of the indicator*/
|
||||
}lv_bar_ext_t;
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Create a bar objects
|
||||
* @param par pointer to an object, it will be the parent of the new bar
|
||||
* @param copy pointer to a bar object, if not NULL then the new object will be copied from it
|
||||
* @return pointer to the created bar
|
||||
*/
|
||||
lv_obj_t * lv_bar_create(lv_obj_t * par, lv_obj_t * copy);
|
||||
|
||||
/**
|
||||
* Signal function of the bar
|
||||
* @param bar pointer to a bar object
|
||||
* @param sign a signal type from lv_signal_t enum
|
||||
* @param param pointer to a signal specific variable
|
||||
*/
|
||||
bool lv_bar_signal(lv_obj_t * bar, lv_signal_t sign, void * param);
|
||||
|
||||
/**
|
||||
* Set a new value on the bar
|
||||
* @param bar pointer to a bar object
|
||||
* @param value new value
|
||||
*/
|
||||
void lv_bar_set_value(lv_obj_t * bar, int16_t value);
|
||||
|
||||
/**
|
||||
* Set a new value with animation on the bar
|
||||
* @param bar pointer to a bar object
|
||||
* @param value new value
|
||||
* @param anim_time animation time in milliseconds
|
||||
*/
|
||||
void lv_bar_set_value_anim(lv_obj_t * bar, int16_t value, uint16_t anim_time);
|
||||
|
||||
/**
|
||||
* Set minimum and the maximum values of a bar
|
||||
* @param bar pointer to he bar object
|
||||
* @param min minimum value
|
||||
* @param max maximum value
|
||||
*/
|
||||
void lv_bar_set_range(lv_obj_t * bar, int16_t min, int16_t max);
|
||||
|
||||
/**
|
||||
* Set the style of bar indicator
|
||||
* @param bar pointer to a bar object
|
||||
* @param style pointer to a style
|
||||
*/
|
||||
void lv_bar_set_style_indic(lv_obj_t * bar, lv_style_t * style);
|
||||
|
||||
/**
|
||||
* Get the value of a bar
|
||||
* @param bar pointer to a bar object
|
||||
* @return the value of the bar
|
||||
*/
|
||||
int16_t lv_bar_get_value(lv_obj_t * bar);
|
||||
|
||||
/**
|
||||
* Get the minimum value of a bar
|
||||
* @param bar pointer to a bar object
|
||||
* @return the minimum value of the bar
|
||||
*/
|
||||
int16_t lv_bar_get_min_value(lv_obj_t * bar);
|
||||
|
||||
/**
|
||||
* Get the maximum value of a bar
|
||||
* @param bar pointer to a bar object
|
||||
* @return the maximum value of the bar
|
||||
*/
|
||||
int16_t lv_bar_get_max_value(lv_obj_t * bar);
|
||||
|
||||
/**
|
||||
* Get the style of bar indicator
|
||||
* @param bar pointer to a bar object
|
||||
* @return pointer to the bar indicator style
|
||||
*/
|
||||
lv_style_t * lv_bar_get_style_indic(lv_obj_t * bar);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /*USE_LV_BAR*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /*LV_BAR_H*/
|
||||
437
lv_objx/lv_btn.c
437
lv_objx/lv_btn.c
@@ -1,437 +0,0 @@
|
||||
/**
|
||||
* @file lv_btn.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
|
||||
#include "lv_conf.h"
|
||||
#if USE_LV_BTN != 0
|
||||
|
||||
#include "lv_btn.h"
|
||||
#include "../lv_obj/lv_group.h"
|
||||
#include "../lv_draw/lv_draw.h"
|
||||
#include "misc/gfx/area.h"
|
||||
#include "misc/gfx/color.h"
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
#if 0
|
||||
static bool lv_btn_design(lv_obj_t * btn, const area_t * mask, lv_design_mode_t mode);
|
||||
#endif
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Create a button objects
|
||||
* @param par pointer to an object, it will be the parent of the new button
|
||||
* @param copy pointer to a button object, if not NULL then the new object will be copied from it
|
||||
* @return pointer to the created button
|
||||
*/
|
||||
lv_obj_t * lv_btn_create(lv_obj_t * par, lv_obj_t * copy)
|
||||
{
|
||||
lv_obj_t * new_btn;
|
||||
|
||||
new_btn = lv_cont_create(par, copy);
|
||||
dm_assert(new_btn);
|
||||
/*Allocate the extended data*/
|
||||
lv_btn_ext_t * ext = lv_obj_alloc_ext(new_btn, sizeof(lv_btn_ext_t));
|
||||
dm_assert(ext);
|
||||
ext->state = LV_BTN_STATE_REL;
|
||||
ext->pr_action = NULL;
|
||||
ext->rel_action = NULL;
|
||||
ext->lpr_action = NULL;
|
||||
ext->lpr_rep_action = NULL;
|
||||
ext->styles[LV_BTN_STATE_REL] = lv_style_get(LV_STYLE_BTN_REL, NULL);
|
||||
ext->styles[LV_BTN_STATE_PR] = lv_style_get(LV_STYLE_BTN_PR, NULL);
|
||||
ext->styles[LV_BTN_STATE_TREL] = lv_style_get(LV_STYLE_BTN_TREL, NULL);
|
||||
ext->styles[LV_BTN_STATE_TPR] = lv_style_get(LV_STYLE_BTN_TPR, NULL);
|
||||
ext->styles[LV_BTN_STATE_INA] = lv_style_get(LV_STYLE_BTN_INA, NULL);
|
||||
ext->lpr_exec = 0;
|
||||
ext->tgl = 0;
|
||||
|
||||
lv_obj_set_signal_f(new_btn, lv_btn_signal);
|
||||
|
||||
/*If no copy do the basic initialization*/
|
||||
if(copy == NULL) {
|
||||
lv_cont_set_layout(new_btn, LV_CONT_LAYOUT_CENTER);
|
||||
lv_obj_set_style(new_btn, ext->styles[LV_BTN_STATE_REL]);
|
||||
}
|
||||
/*Copy 'copy'*/
|
||||
else {
|
||||
lv_btn_ext_t * copy_ext = lv_obj_get_ext(copy);
|
||||
ext->state = copy_ext->state;
|
||||
ext->pr_action = copy_ext->pr_action;
|
||||
ext->rel_action = copy_ext->rel_action;
|
||||
ext->lpr_action = copy_ext->lpr_action;
|
||||
ext->lpr_rep_action = copy_ext->lpr_action;
|
||||
ext->styles[LV_BTN_STATE_REL] = copy_ext->styles[LV_BTN_STATE_REL];
|
||||
ext->styles[LV_BTN_STATE_PR] = copy_ext->styles[LV_BTN_STATE_PR];
|
||||
ext->styles[LV_BTN_STATE_TREL] = copy_ext->styles[LV_BTN_STATE_TREL];
|
||||
ext->styles[LV_BTN_STATE_TPR] = copy_ext->styles[LV_BTN_STATE_TPR];
|
||||
ext->styles[LV_BTN_STATE_INA] = copy_ext->styles[LV_BTN_STATE_INA];
|
||||
ext->tgl = copy_ext->tgl;
|
||||
|
||||
/*Refresh the style with new signal function*/
|
||||
lv_obj_refr_style(new_btn);
|
||||
}
|
||||
|
||||
return new_btn;
|
||||
}
|
||||
|
||||
/**
|
||||
* Signal function of the button
|
||||
* @param btn pointer to a button object
|
||||
* @param sign a signal type from lv_signal_t enum
|
||||
* @param param pointer to a signal specific variable
|
||||
*/
|
||||
bool lv_btn_signal(lv_obj_t * btn, lv_signal_t sign, void * param)
|
||||
{
|
||||
bool valid;
|
||||
|
||||
/* Include the ancient signal function */
|
||||
valid = lv_cont_signal(btn, sign, param);
|
||||
|
||||
/* The object can be deleted so check its validity and then
|
||||
* make the object specific signal handling */
|
||||
if(valid != false) {
|
||||
lv_btn_ext_t * ext = lv_obj_get_ext(btn);
|
||||
lv_btn_state_t state = lv_btn_get_state(btn);
|
||||
bool tgl = lv_btn_get_tgl(btn);
|
||||
|
||||
if(sign == LV_SIGNAL_PRESSED) {
|
||||
/*Refresh the state*/
|
||||
if(ext->state == LV_BTN_STATE_REL) {
|
||||
lv_btn_set_state(btn, LV_BTN_STATE_PR);
|
||||
} else if(ext->state == LV_BTN_STATE_TREL) {
|
||||
lv_btn_set_state(btn, LV_BTN_STATE_TPR);
|
||||
}
|
||||
|
||||
ext->lpr_exec = 0;
|
||||
/*Call the press action, 'param' is the caller dispi*/
|
||||
if(ext->pr_action != NULL && state != LV_BTN_STATE_INA) {
|
||||
valid = ext->pr_action(btn, param);
|
||||
}
|
||||
}
|
||||
else if(sign == LV_SIGNAL_PRESS_LOST) {
|
||||
/*Refresh the state*/
|
||||
if(ext->state == LV_BTN_STATE_PR) lv_btn_set_state(btn, LV_BTN_STATE_REL);
|
||||
else if(ext->state == LV_BTN_STATE_TPR) lv_btn_set_state(btn, LV_BTN_STATE_TREL);
|
||||
}
|
||||
else if(sign == LV_SIGNAL_PRESSING) {
|
||||
/*When the button begins to drag revert pressed states to released*/
|
||||
if(lv_dispi_is_dragging(param) != false) {
|
||||
if(ext->state == LV_BTN_STATE_PR) lv_btn_set_state(btn, LV_BTN_STATE_REL);
|
||||
else if(ext->state == LV_BTN_STATE_TPR) lv_btn_set_state(btn, LV_BTN_STATE_TREL);
|
||||
}
|
||||
}
|
||||
else if(sign == LV_SIGNAL_RELEASED) {
|
||||
/*If not dragged and it was not long press action then
|
||||
*change state and run the action*/
|
||||
if(lv_dispi_is_dragging(param) == false && ext->lpr_exec == 0) {
|
||||
if(ext->state == LV_BTN_STATE_PR && tgl == false) {
|
||||
lv_btn_set_state(btn, LV_BTN_STATE_REL);
|
||||
} else if(ext->state == LV_BTN_STATE_TPR && tgl == false) {
|
||||
lv_btn_set_state(btn, LV_BTN_STATE_TREL);
|
||||
} else if(ext->state == LV_BTN_STATE_PR && tgl == true) {
|
||||
lv_btn_set_state(btn, LV_BTN_STATE_TREL);
|
||||
} else if(ext->state == LV_BTN_STATE_TPR && tgl == true) {
|
||||
lv_btn_set_state(btn, LV_BTN_STATE_REL);
|
||||
}
|
||||
|
||||
if(ext->rel_action != NULL && state != LV_BTN_STATE_INA) {
|
||||
valid = ext->rel_action(btn, param);
|
||||
}
|
||||
} else { /*If dragged change back the state*/
|
||||
if(ext->state == LV_BTN_STATE_PR) {
|
||||
lv_btn_set_state(btn, LV_BTN_STATE_REL);
|
||||
} else if(ext->state == LV_BTN_STATE_TPR) {
|
||||
lv_btn_set_state(btn, LV_BTN_STATE_TREL);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(sign == LV_SIGNAL_LONG_PRESS) {
|
||||
/*Call the long press action, 'param' is the caller dispi*/
|
||||
if(ext->lpr_action != NULL && state != LV_BTN_STATE_INA) {
|
||||
ext->lpr_exec = 1;
|
||||
valid = ext->lpr_action(btn, param);
|
||||
}
|
||||
}
|
||||
else if(sign == LV_SIGNAL_LONG_PRESS_REP) {
|
||||
/*Call the release action, 'param' is the caller dispi*/
|
||||
if(ext->lpr_rep_action != NULL && state != LV_BTN_STATE_INA) {
|
||||
valid = ext->lpr_rep_action(btn, param);
|
||||
}
|
||||
} else if(sign == LV_SIGNAL_CONTROLL) {
|
||||
lv_btn_ext_t * ext = lv_obj_get_ext(btn);
|
||||
char c = *((char*)param);
|
||||
if(c == LV_GROUP_KEY_RIGHT || c == LV_GROUP_KEY_UP) {
|
||||
if(lv_btn_get_tgl(btn) != false) lv_btn_set_state(btn, LV_BTN_STATE_TREL);
|
||||
if(ext->rel_action != NULL && lv_btn_get_state(btn) != LV_BTN_STATE_INA) {
|
||||
valid = ext->rel_action(btn, param);
|
||||
}
|
||||
} else if(c == LV_GROUP_KEY_LEFT || c == LV_GROUP_KEY_DOWN) {
|
||||
if(lv_btn_get_tgl(btn) != false) lv_btn_set_state(btn, LV_BTN_STATE_REL);
|
||||
if(ext->rel_action != NULL && lv_btn_get_state(btn) != LV_BTN_STATE_INA) {
|
||||
valid = ext->rel_action(btn, param);
|
||||
}
|
||||
} else if(c == LV_GROUP_KEY_ENTER) {
|
||||
if(lv_btn_get_tgl(btn) != false) {
|
||||
lv_btn_state_t state = lv_btn_get_state(btn);
|
||||
if(state == LV_BTN_STATE_REL) lv_btn_set_state(btn, LV_BTN_STATE_TREL);
|
||||
else if(state == LV_BTN_STATE_PR) lv_btn_set_state(btn, LV_BTN_STATE_TPR);
|
||||
else if(state == LV_BTN_STATE_TREL) lv_btn_set_state(btn, LV_BTN_STATE_REL);
|
||||
else if(state == LV_BTN_STATE_TPR) lv_btn_set_state(btn, LV_BTN_STATE_PR);
|
||||
}
|
||||
if(ext->rel_action != NULL && lv_btn_get_state(btn) != LV_BTN_STATE_INA) {
|
||||
valid = ext->rel_action(btn, param);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return valid;
|
||||
}
|
||||
|
||||
/*=====================
|
||||
* Setter functions
|
||||
*====================*/
|
||||
|
||||
/**
|
||||
* Enable the toggled states
|
||||
* @param btn pointer to a button object
|
||||
* @param tgl true: enable toggled states, false: disable
|
||||
*/
|
||||
void lv_btn_set_tgl(lv_obj_t * btn, bool tgl)
|
||||
{
|
||||
lv_btn_ext_t * ext = lv_obj_get_ext(btn);
|
||||
|
||||
ext->tgl = tgl != false ? 1 : 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the state of the button
|
||||
* @param btn pointer to a button object
|
||||
* @param state the new state of the button (from lv_btn_state_t enum)
|
||||
*/
|
||||
void lv_btn_set_state(lv_obj_t * btn, lv_btn_state_t state)
|
||||
{
|
||||
lv_btn_ext_t * ext = lv_obj_get_ext(btn);
|
||||
if(ext->state != state) {
|
||||
ext->state = state;
|
||||
lv_obj_set_style(btn, ext->styles[state]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a function to call when the button is pressed
|
||||
* @param btn pointer to a button object
|
||||
* @param pr_action pointer to function
|
||||
*/
|
||||
void lv_btn_set_pr_action(lv_obj_t * btn, lv_action_t pr_action)
|
||||
{
|
||||
lv_btn_ext_t * ext = lv_obj_get_ext(btn);
|
||||
|
||||
ext->pr_action = pr_action;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a function to call when the button is released
|
||||
* @param btn pointer to a button object
|
||||
* @param rel_action pointer to functionREL
|
||||
*/
|
||||
void lv_btn_set_rel_action(lv_obj_t * btn, lv_action_t rel_action)
|
||||
{
|
||||
lv_btn_ext_t * btn_p = lv_obj_get_ext(btn);
|
||||
|
||||
btn_p->rel_action = rel_action;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a function to call when the button is long pressed
|
||||
* @param btn pointer to a button object
|
||||
* @param lpr_action pointer to function
|
||||
*/
|
||||
void lv_btn_set_lpr_action(lv_obj_t * btn, lv_action_t lpr_action)
|
||||
{
|
||||
lv_btn_ext_t * ext = lv_obj_get_ext(btn);
|
||||
|
||||
ext->lpr_action = lpr_action;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a function to called periodically after long press.
|
||||
* @param btn pointer to a button object
|
||||
* @param lpr_rep_action pointer to function
|
||||
*/
|
||||
void lv_btn_set_lpr_rep_action(lv_obj_t * btn, lv_action_t lpr_rep_action)
|
||||
{
|
||||
lv_btn_ext_t * ext = lv_obj_get_ext(btn);
|
||||
|
||||
ext->lpr_rep_action = lpr_rep_action;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set styles of a button is each state
|
||||
* @param btn pointer to button object
|
||||
* @param rel pointer to a style for releases state
|
||||
* @param pr pointer to a style for pressed state
|
||||
* @param trel pointer to a style for toggled releases state
|
||||
* @param tpr pointer to a style for toggled pressed state
|
||||
* @param ina pointer to a style for inactive state
|
||||
*/
|
||||
void lv_btn_set_styles(lv_obj_t * btn, lv_style_t * rel, lv_style_t * pr,
|
||||
lv_style_t * trel, lv_style_t * tpr,
|
||||
lv_style_t * ina)
|
||||
{
|
||||
lv_btn_ext_t * ext = lv_obj_get_ext(btn);
|
||||
ext->styles[LV_BTN_STATE_REL] = rel;
|
||||
ext->styles[LV_BTN_STATE_PR] = pr;
|
||||
ext->styles[LV_BTN_STATE_TREL] = trel;
|
||||
ext->styles[LV_BTN_STATE_TPR] = tpr;
|
||||
ext->styles[LV_BTN_STATE_INA] = ina;
|
||||
|
||||
lv_obj_set_style(btn, ext->styles[ext->state]);
|
||||
|
||||
}
|
||||
|
||||
/*=====================
|
||||
* Getter functions
|
||||
*====================*/
|
||||
|
||||
/**
|
||||
* Get the current state of the button
|
||||
* @param btn pointer to a button object
|
||||
* @return the state of the button (from lv_btn_state_t enum)
|
||||
*/
|
||||
lv_btn_state_t lv_btn_get_state(lv_obj_t * btn)
|
||||
{
|
||||
lv_btn_ext_t * ext = lv_obj_get_ext(btn);
|
||||
|
||||
return ext->state;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the toggle enable attribute of the button
|
||||
* @param btn pointer to a button object
|
||||
* @return ture: toggle enabled, false: disabled
|
||||
*/
|
||||
bool lv_btn_get_tgl(lv_obj_t * btn)
|
||||
{
|
||||
lv_btn_ext_t * ext = lv_obj_get_ext(btn);
|
||||
|
||||
return ext->tgl != 0 ? true : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the release action of a button
|
||||
* @param btn pointer to a button object
|
||||
* @return pointer to the release action function
|
||||
*/
|
||||
lv_action_t lv_btn_get_rel_action(lv_obj_t * btn)
|
||||
{
|
||||
lv_btn_ext_t * ext = lv_obj_get_ext(btn);
|
||||
return ext->rel_action;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the press action of a button
|
||||
* @param btn pointer to a button object
|
||||
* @return pointer to the press action function
|
||||
*/
|
||||
lv_action_t lv_btn_get_pr_action(lv_obj_t * btn)
|
||||
{
|
||||
lv_btn_ext_t * ext = lv_obj_get_ext(btn);
|
||||
return ext->pr_action;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the long press action of a button
|
||||
* @param btn pointer to a button object
|
||||
* @return pointer to the release action function
|
||||
*/
|
||||
lv_action_t lv_btn_get_lpr_action(lv_obj_t * btn)
|
||||
{
|
||||
lv_btn_ext_t * ext = lv_obj_get_ext(btn);
|
||||
return ext->lpr_action;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the long press repeat action of a button
|
||||
* @param btn pointer to a button object
|
||||
* @return pointer to the long press repeat action function
|
||||
*/
|
||||
lv_action_t lv_btn_get_lpr_rep_action(lv_obj_t * btn)
|
||||
{
|
||||
lv_btn_ext_t * ext = lv_obj_get_ext(btn);
|
||||
return ext->lpr_rep_action;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the style of a button in a given state
|
||||
* @param btn pointer to a button object
|
||||
* @param state a state from 'lv_btn_state_t' in which style should be get
|
||||
* @return pointer to the style in the given state
|
||||
*/
|
||||
lv_style_t * lv_btn_get_style(lv_obj_t * btn, lv_btn_state_t state)
|
||||
{
|
||||
lv_btn_ext_t * ext = lv_obj_get_ext(btn);
|
||||
|
||||
if(ext->styles[state] == NULL) return lv_obj_get_style(btn->par);
|
||||
|
||||
return ext->styles[state];
|
||||
}
|
||||
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
#if 0
|
||||
/**
|
||||
* Handle the drawing related tasks of the buttons
|
||||
* @param btn pointer to a button object
|
||||
* @param mask the object will be drawn only in this area
|
||||
* @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area
|
||||
* (return 'true' if yes)
|
||||
* LV_DESIGN_DRAW: draw the object (always return 'true')
|
||||
* LV_DESIGN_DRAW_POST: drawing after every children are drawn
|
||||
* @param return true/false, depends on 'mode'
|
||||
*/
|
||||
static bool lv_btn_design(lv_obj_t * btn, const area_t * mask, lv_design_mode_t mode)
|
||||
{
|
||||
|
||||
/* Because of the radius it is not sure the area is covered*/
|
||||
if(mode == LV_DESIGN_COVER_CHK) {
|
||||
return false;
|
||||
|
||||
} else if(mode == LV_DESIGN_DRAW_MAIN || mode == LV_DESIGN_DRAW_POST) {
|
||||
|
||||
}
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
195
lv_objx/lv_btn.h
195
lv_objx/lv_btn.h
@@ -1,195 +0,0 @@
|
||||
/**
|
||||
* @file lv_btn.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LV_BTN_H
|
||||
#define LV_BTN_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_conf.h"
|
||||
#if USE_LV_BTN != 0
|
||||
|
||||
/*Testing of dependencies*/
|
||||
#if USE_LV_CONT == 0
|
||||
#error "lv_btn: lv_cont is required. Enable it in lv_conf.h (USE_LV_CONT 1) "
|
||||
#endif
|
||||
|
||||
#include <lvgl/lv_objx/lv_cont.h>
|
||||
#include "../lv_obj/lv_dispi.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/*Button states*/
|
||||
typedef enum
|
||||
{
|
||||
LV_BTN_STATE_REL,
|
||||
LV_BTN_STATE_PR,
|
||||
LV_BTN_STATE_TREL,
|
||||
LV_BTN_STATE_TPR,
|
||||
LV_BTN_STATE_INA,
|
||||
LV_BTN_STATE_NUM,
|
||||
}lv_btn_state_t;
|
||||
|
||||
/*Data of button*/
|
||||
typedef struct
|
||||
{
|
||||
lv_cont_ext_t cont; /*Ext. of ancestor*/
|
||||
/*New data for this type */
|
||||
lv_action_t pr_action; /*A function to call when the button is pressed (NULL if unused)*/
|
||||
lv_action_t rel_action; /*A function to call when the button is released (NULL if unused)*/
|
||||
lv_action_t lpr_action; /*A function to call when the button is long pressed (NULL if unused)*/
|
||||
lv_action_t lpr_rep_action; /*A function to call periodically after long press (NULL if unused)*/
|
||||
|
||||
lv_style_t * styles[LV_BTN_STATE_NUM]; /*Styles in each state*/
|
||||
|
||||
lv_btn_state_t state; /*Current state of the button from 'lv_btn_state_t' enum*/
|
||||
uint8_t tgl :1; /*1: Toggle enabled*/
|
||||
uint8_t lpr_exec :1; /*1: Long press action executed (Handled by the library)*/
|
||||
}lv_btn_ext_t;
|
||||
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Create a button objects
|
||||
* @param par pointer to an object, it will be the parent of the new button
|
||||
* @param copy pointer to a button object, if not NULL then the new object will be copied from it
|
||||
* @return pointer to the created button
|
||||
*/
|
||||
lv_obj_t * lv_btn_create(lv_obj_t * par, lv_obj_t * copy);
|
||||
|
||||
/**
|
||||
* Signal function of the button
|
||||
* @param btn pointer to a button object
|
||||
* @param sign a signal type from lv_signal_t enum
|
||||
* @param param pointer to a signal specific variable
|
||||
*/
|
||||
bool lv_btn_signal(lv_obj_t * btn, lv_signal_t sign, void * param);
|
||||
|
||||
/**
|
||||
* Enable the toggled states
|
||||
* @param btn pointer to a button object
|
||||
* @param tgl true: enable toggled states, false: disable
|
||||
*/
|
||||
void lv_btn_set_tgl(lv_obj_t * btn, bool tgl);
|
||||
|
||||
/**
|
||||
* Set the state of the button
|
||||
* @param btn pointer to a button object
|
||||
* @param state the new state of the button (from lv_btn_state_t enum)
|
||||
*/
|
||||
void lv_btn_set_state(lv_obj_t * btn, lv_btn_state_t state);
|
||||
|
||||
/**
|
||||
* Set a function to call when the button is pressed
|
||||
* @param btn pointer to a button object
|
||||
* @param pr_action pointer to function
|
||||
*/
|
||||
void lv_btn_set_pr_action(lv_obj_t * btn, lv_action_t pr_action);
|
||||
|
||||
/**
|
||||
* Set a function to call when the button is released
|
||||
* @param btn pointer to a button object
|
||||
* @param rel_action pointer to functionREL
|
||||
*/
|
||||
void lv_btn_set_rel_action(lv_obj_t * btn, lv_action_t rel_action);
|
||||
|
||||
/**
|
||||
* Set a function to call when the button is long pressed
|
||||
* @param btn pointer to a button object
|
||||
* @param lpr_action pointer to function
|
||||
*/
|
||||
void lv_btn_set_lpr_action(lv_obj_t * btn, lv_action_t lpr_action);
|
||||
|
||||
/**
|
||||
* Set a function to called periodically after long press.
|
||||
* @param btn pointer to a button object
|
||||
* @param lpr_rep_action pointer to function
|
||||
*/
|
||||
void lv_btn_set_lpr_rep_action(lv_obj_t * btn, lv_action_t lpr_rep_action);
|
||||
|
||||
/**
|
||||
* Set styles of a button is each state
|
||||
* @param btn pointer to button object
|
||||
* @param rel pointer to a style for releases state
|
||||
* @param pr pointer to a style for pressed state
|
||||
* @param trel pointer to a style for toggled releases state
|
||||
* @param tpr pointer to a style for toggled pressed state
|
||||
* @param ina pointer to a style for inactive state
|
||||
*/
|
||||
void lv_btn_set_styles(lv_obj_t * btn, lv_style_t * rel, lv_style_t * pr, lv_style_t * trel, lv_style_t * tpr, lv_style_t * ina);
|
||||
|
||||
/**
|
||||
* Get the current state of the button
|
||||
* @param btn pointer to a button object
|
||||
* @return the state of the button (from lv_btn_state_t enum)
|
||||
*/
|
||||
lv_btn_state_t lv_btn_get_state(lv_obj_t * btn);
|
||||
|
||||
/**
|
||||
* Get the toggle enable attribute of the button
|
||||
* @param btn pointer to a button object
|
||||
* @return ture: toggle enabled, false: disabled
|
||||
*/
|
||||
bool lv_btn_get_tgl(lv_obj_t * btn);
|
||||
|
||||
/**
|
||||
* Get the release action of a button
|
||||
* @param btn pointer to a button object
|
||||
* @return pointer to the release action function
|
||||
*/
|
||||
lv_action_t lv_btn_get_rel_action(lv_obj_t * btn);
|
||||
|
||||
/**
|
||||
* Get the press action of a button
|
||||
* @param btn pointer to a button object
|
||||
* @return pointer to the press action function
|
||||
*/
|
||||
lv_action_t lv_btn_get_pr_action(lv_obj_t * btn);
|
||||
|
||||
/**
|
||||
* Get the long press action of a button
|
||||
* @param btn pointer to a button object
|
||||
* @return pointer to the release action function
|
||||
*/
|
||||
lv_action_t lv_btn_get_lpr_action(lv_obj_t * btn);
|
||||
/**
|
||||
* Get the long press repeat action of a button
|
||||
* @param btn pointer to a button object
|
||||
* @return pointer to the long press repeat action function
|
||||
*/
|
||||
lv_action_t lv_btn_get_lpr_rep_action(lv_obj_t * btn);
|
||||
/**
|
||||
* Get the style of a button in a given state
|
||||
* @param btn pointer to a button object
|
||||
* @param state a state from 'lv_btn_state_t' in which style should be get
|
||||
* @return pointer to the style in the given state
|
||||
*/
|
||||
lv_style_t * lv_btn_get_style(lv_obj_t * btn, lv_btn_state_t state);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /*USE_LV_BTN*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /*LV_BTN_H*/
|
||||
@@ -1,558 +0,0 @@
|
||||
/**
|
||||
* @file lv_btnm.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_conf.h"
|
||||
#if USE_LV_BTNM != 0
|
||||
|
||||
#include "lv_btnm.h"
|
||||
#include "../lv_obj/lv_group.h"
|
||||
#include "../lv_draw/lv_draw.h"
|
||||
#include "../lv_obj/lv_refr.h"
|
||||
#include "misc/gfx/text.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define LV_BTNM_PR_NONE 0xFFFF
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static bool lv_btnm_design(lv_obj_t * btnm, const area_t * mask, lv_design_mode_t mode);
|
||||
static uint8_t lv_btnm_get_width_unit(const char * btn_str);
|
||||
static uint16_t lv_btnm_get_btn_from_point(lv_obj_t * btnm, point_t * p);
|
||||
static uint16_t lv_btnm_get_btn_txt(lv_obj_t * btnm, uint16_t btn_id);
|
||||
static void lv_btnm_create_btns(lv_obj_t * btnm, const char ** map);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
static const char * lv_btnm_def_map[] = {"Btn1","Btn2", "Btn3","\n",
|
||||
"\002Btn4","Btn5", ""};
|
||||
|
||||
static lv_design_f_t ancestor_design_f;
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/*-----------------
|
||||
* Create function
|
||||
*-----------------*/
|
||||
|
||||
/**
|
||||
* Create a button matrix objects
|
||||
* @param par pointer to an object, it will be the parent of the new button matrix
|
||||
* @param copy pointer to a button matrix object, if not NULL then the new object will be copied from it
|
||||
* @return pointer to the created button matrix
|
||||
*/
|
||||
lv_obj_t * lv_btnm_create(lv_obj_t * par, lv_obj_t * copy)
|
||||
{
|
||||
/*Create the ancestor object*/
|
||||
lv_obj_t * new_btnm = lv_cont_create(par, copy);
|
||||
dm_assert(new_btnm);
|
||||
|
||||
/*Allocate the object type specific extended data*/
|
||||
lv_btnm_ext_t * ext = lv_obj_alloc_ext(new_btnm, sizeof(lv_btnm_ext_t));
|
||||
dm_assert(ext);
|
||||
ext->btn_cnt = 0;
|
||||
ext->btn_pr = LV_BTNM_PR_NONE;
|
||||
ext->btn_areas = NULL;
|
||||
ext->cb = NULL;
|
||||
ext->map_p = NULL;
|
||||
ext->style_btn_rel = lv_style_get(LV_STYLE_BTN_REL, NULL);
|
||||
ext->style_btn_pr = lv_style_get(LV_STYLE_BTN_PR, NULL);
|
||||
|
||||
if(ancestor_design_f == NULL) ancestor_design_f = lv_obj_get_design_f(new_btnm);
|
||||
|
||||
lv_obj_set_signal_f(new_btnm, lv_btnm_signal);
|
||||
lv_obj_set_design_f(new_btnm, lv_btnm_design);
|
||||
|
||||
/*Init the new button matrix object*/
|
||||
if(copy == NULL) {
|
||||
lv_obj_set_size(new_btnm, LV_HOR_RES, LV_VER_RES / 2);
|
||||
lv_obj_set_style(new_btnm, lv_style_get(LV_STYLE_PLAIN, NULL));
|
||||
lv_btnm_set_map(new_btnm, lv_btnm_def_map);
|
||||
}
|
||||
/*Copy an existing object*/
|
||||
else {
|
||||
lv_btnm_ext_t * copy_ext = lv_obj_get_ext(copy);
|
||||
ext->style_btn_rel = copy_ext->style_btn_rel;
|
||||
ext->style_btn_pr = copy_ext->style_btn_pr;
|
||||
lv_btnm_set_map(new_btnm, lv_btnm_get_map(copy));
|
||||
ext->cb = copy_ext->cb;
|
||||
}
|
||||
|
||||
return new_btnm;
|
||||
}
|
||||
|
||||
/**
|
||||
* Signal function of the button matrix
|
||||
* @param btnm pointer to a button matrix object
|
||||
* @param sign a signal type from lv_signal_t enum
|
||||
* @param param pointer to a signal specific variable
|
||||
* @return true: the object is still valid (not deleted), false: the object become invalid
|
||||
*/
|
||||
bool lv_btnm_signal(lv_obj_t * btnm, lv_signal_t sign, void * param)
|
||||
{
|
||||
bool valid;
|
||||
|
||||
/* Include the ancient signal function */
|
||||
valid = lv_cont_signal(btnm, sign, param);
|
||||
|
||||
/* The object can be deleted so check its validity and then
|
||||
* make the object specific signal handling */
|
||||
if(valid != false) {
|
||||
lv_btnm_ext_t * ext = lv_obj_get_ext(btnm);
|
||||
area_t btnm_area;
|
||||
area_t btn_area;
|
||||
point_t p;
|
||||
if(sign == LV_SIGNAL_CLEANUP) {
|
||||
dm_free(ext->btn_areas);
|
||||
}
|
||||
else if(sign == LV_SIGNAL_STYLE_CHG || sign == LV_SIGNAL_CORD_CHG) {
|
||||
lv_btnm_set_map(btnm, ext->map_p);
|
||||
}
|
||||
else if(sign == LV_SIGNAL_PRESSING) {
|
||||
uint16_t btn_pr;
|
||||
/*Search the pressed area*/
|
||||
lv_dispi_get_point(param, &p);
|
||||
btn_pr = lv_btnm_get_btn_from_point(btnm, &p);
|
||||
/*Invalidate to old and the new areas*/;
|
||||
lv_obj_get_cords(btnm, &btnm_area);
|
||||
if(btn_pr != ext->btn_pr) {
|
||||
lv_dispi_reset_lpr(param);
|
||||
if(ext->btn_pr != LV_BTNM_PR_NONE) {
|
||||
area_cpy(&btn_area, &ext->btn_areas[ext->btn_pr]);
|
||||
btn_area.x1 += btnm_area.x1;
|
||||
btn_area.y1 += btnm_area.y1;
|
||||
btn_area.x2 += btnm_area.x1;
|
||||
btn_area.y2 += btnm_area.y1;
|
||||
lv_inv_area(&btn_area);
|
||||
}
|
||||
if(btn_pr != LV_BTNM_PR_NONE) {
|
||||
area_cpy(&btn_area, &ext->btn_areas[btn_pr]);
|
||||
btn_area.x1 += btnm_area.x1;
|
||||
btn_area.y1 += btnm_area.y1;
|
||||
btn_area.x2 += btnm_area.x1;
|
||||
btn_area.y2 += btnm_area.y1;
|
||||
lv_inv_area(&btn_area);
|
||||
}
|
||||
}
|
||||
|
||||
ext->btn_pr = btn_pr;
|
||||
}
|
||||
else if(sign == LV_SIGNAL_RELEASED || sign == LV_SIGNAL_LONG_PRESS_REP) {
|
||||
if(ext->cb != NULL && ext->btn_pr != LV_BTNM_PR_NONE) {
|
||||
uint16_t txt_i = lv_btnm_get_btn_txt(btnm, ext->btn_pr);
|
||||
if(txt_i != LV_BTNM_PR_NONE) ext->cb(btnm, txt_i);
|
||||
}
|
||||
|
||||
if(sign == LV_SIGNAL_RELEASED && ext->btn_pr != LV_BTNM_PR_NONE) {
|
||||
/*Invalidate to old area*/;
|
||||
lv_obj_get_cords(btnm, &btnm_area);
|
||||
area_cpy(&btn_area, &ext->btn_areas[ext->btn_pr]);
|
||||
btn_area.x1 += btnm_area.x1;
|
||||
btn_area.y1 += btnm_area.y1;
|
||||
btn_area.x2 += btnm_area.x1;
|
||||
btn_area.y2 += btnm_area.y1;
|
||||
lv_inv_area(&btn_area);
|
||||
|
||||
ext->btn_pr = LV_BTNM_PR_NONE;
|
||||
}
|
||||
} else if(sign == LV_SIGNAL_PRESS_LOST || sign == LV_SIGNAL_DEFOCUS) {
|
||||
ext->btn_pr = LV_BTNM_PR_NONE;
|
||||
lv_obj_inv(btnm);
|
||||
} else if(sign == LV_SIGNAL_FOCUS) {
|
||||
ext->btn_pr = 0;
|
||||
lv_obj_inv(btnm);
|
||||
} else if(sign == LV_SIGNAL_CONTROLL) {
|
||||
lv_btnm_ext_t * ext = lv_obj_get_ext(btnm);
|
||||
char c = *((char*)param);
|
||||
if(c == LV_GROUP_KEY_RIGHT || c == LV_GROUP_KEY_UP) {
|
||||
if(ext->btn_pr == LV_BTNM_PR_NONE) ext->btn_pr = 0;
|
||||
else ext->btn_pr++;
|
||||
if(ext->btn_pr >= ext->btn_cnt - 1) ext->btn_pr = ext->btn_cnt - 1;
|
||||
lv_obj_inv(btnm);
|
||||
} else if(c == LV_GROUP_KEY_LEFT || c == LV_GROUP_KEY_DOWN) {
|
||||
if(ext->btn_pr == LV_BTNM_PR_NONE) ext->btn_pr = 0;
|
||||
if(ext->btn_pr > 0) ext->btn_pr--;
|
||||
lv_obj_inv(btnm);
|
||||
} else if(c == LV_GROUP_KEY_ENTER) {
|
||||
if(ext->cb != NULL) {
|
||||
uint16_t txt_i = lv_btnm_get_btn_txt(btnm, ext->btn_pr);
|
||||
if(txt_i != LV_BTNM_PR_NONE) ext->cb(btnm, txt_i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return valid;
|
||||
}
|
||||
|
||||
/*=====================
|
||||
* Setter functions
|
||||
*====================*/
|
||||
|
||||
/**
|
||||
* Set a new map. Buttons will be created/deleted according to the map.
|
||||
* @param btnm pointer to a button matrix object
|
||||
* @param map pointer a string array. The last string has to be: "".
|
||||
* Use "\n" to begin a new line.
|
||||
* Use octal numbers (e.g. "\003") to set the relative
|
||||
* width of a button. (max. 9 -> \011)
|
||||
* (e.g. const char * str[] = {"a", "b", "\n", "\004c", "d", ""}).
|
||||
* The button do not copy the array so it can not be a local variable.
|
||||
*/
|
||||
void lv_btnm_set_map(lv_obj_t * btnm, const char ** map)
|
||||
{
|
||||
if(map == NULL) return;
|
||||
|
||||
lv_btnm_ext_t * ext = lv_obj_get_ext(btnm);
|
||||
ext->map_p = map;
|
||||
|
||||
/*Analyze the map and create the required number of buttons*/
|
||||
lv_btnm_create_btns(btnm, map);
|
||||
|
||||
/*Set size and positions of the buttons*/
|
||||
lv_style_t * btnms = lv_obj_get_style(btnm);
|
||||
cord_t max_w = lv_obj_get_width(btnm) - 2 * btnms->hpad;
|
||||
cord_t max_h = lv_obj_get_height(btnm) - 2 * btnms->vpad;
|
||||
cord_t act_y = btnms->vpad;
|
||||
|
||||
/*Count the lines to calculate button height*/
|
||||
uint8_t line_cnt = 1;
|
||||
uint8_t li;
|
||||
for(li = 0; strlen(map[li]) != 0; li++) {
|
||||
if(strcmp(map[li], "\n") == 0) line_cnt ++;
|
||||
}
|
||||
|
||||
cord_t btn_h = max_h - ((line_cnt - 1) * btnms->opad);
|
||||
btn_h = btn_h / line_cnt;
|
||||
|
||||
/* Count the units and the buttons in a line
|
||||
* (A button can be 1,2,3... unit wide)*/
|
||||
uint16_t unit_cnt; /*Number of units in a row*/
|
||||
uint16_t unit_act_cnt; /*Number of units currently put in a row*/
|
||||
uint16_t btn_cnt; /*Number of buttons in a row*/
|
||||
uint16_t i_tot = 0; /*Act. index in the str map*/
|
||||
uint16_t btn_i = 0; /*Act. index of button areas*/
|
||||
const char ** map_p_tmp = map;
|
||||
|
||||
/*Count the units and the buttons in a line*/
|
||||
while(1) {
|
||||
unit_cnt = 0;
|
||||
btn_cnt = 0;
|
||||
/*Count the buttons in a line*/
|
||||
while(strcmp(map_p_tmp[btn_cnt], "\n") != 0 &&
|
||||
strlen(map_p_tmp[btn_cnt]) != 0) { /*Check a line*/
|
||||
unit_cnt += lv_btnm_get_width_unit(map_p_tmp[btn_cnt]);
|
||||
btn_cnt ++;
|
||||
}
|
||||
|
||||
/*Only deal with the non empty lines*/
|
||||
if(btn_cnt != 0) {
|
||||
/*Calculate the width of all units*/
|
||||
cord_t all_unit_w = max_w - ((btn_cnt-1) * btnms->opad);
|
||||
|
||||
/*Set the button size and positions and set the texts*/
|
||||
uint16_t i;
|
||||
cord_t act_x = btnms->hpad;
|
||||
cord_t act_unit_w;
|
||||
unit_act_cnt = 0;
|
||||
for(i = 0; i < btn_cnt; i++) {
|
||||
/* one_unit_w = all_unit_w / unit_cnt
|
||||
* act_unit_w = one_unit_w * button_width
|
||||
* do this two operation but the multiply first to divide a greater number */
|
||||
act_unit_w = (all_unit_w * lv_btnm_get_width_unit(map_p_tmp[i])) / unit_cnt;
|
||||
|
||||
/*Always recalculate act_x because of rounding errors */
|
||||
act_x = (unit_act_cnt * all_unit_w) / unit_cnt + i * btnms->opad + btnms->hpad;
|
||||
|
||||
area_set(&ext->btn_areas[btn_i], act_x,
|
||||
act_y,
|
||||
act_x + act_unit_w,
|
||||
act_y + btn_h);
|
||||
|
||||
unit_act_cnt += lv_btnm_get_width_unit(map_p_tmp[i]);
|
||||
|
||||
i_tot ++;
|
||||
btn_i ++;
|
||||
}
|
||||
}
|
||||
act_y += btn_h + btnms->opad;
|
||||
if(strlen(map_p_tmp[btn_cnt]) == 0) break; /*Break on end of map*/
|
||||
map_p_tmp = &map_p_tmp[btn_cnt + 1]; /*Set the map to the next line*/
|
||||
i_tot ++; /*Skip the '\n'*/
|
||||
}
|
||||
|
||||
lv_obj_inv(btnm);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a new callback function for the buttons (It will be called when a button is released)
|
||||
* @param btnm: pointer to button matrix object
|
||||
* @param cb pointer to a callback function
|
||||
*/
|
||||
void lv_btnm_set_action(lv_obj_t * btnm, lv_btnm_callback_t cb)
|
||||
{
|
||||
lv_btnm_ext_t * ext = lv_obj_get_ext(btnm);
|
||||
ext->cb = cb;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the styles of the buttons of the button matrox
|
||||
* @param btnm pointer to a button matrix object
|
||||
* @param state style in this state (LV_BTN_STATE_PR or LV_BTN_STATE_REL)
|
||||
* @param style pointer to style
|
||||
*/
|
||||
void lv_btnm_set_styles_btn(lv_obj_t * btnm, lv_style_t * rel, lv_style_t * pr)
|
||||
{
|
||||
lv_btnm_ext_t * ext = lv_obj_get_ext(btnm);
|
||||
ext->style_btn_rel = rel;
|
||||
ext->style_btn_pr = pr;
|
||||
|
||||
lv_obj_inv(btnm);
|
||||
|
||||
}
|
||||
|
||||
/*=====================
|
||||
* Getter functions
|
||||
*====================*/
|
||||
|
||||
/**
|
||||
* Get the current map of a button matrix
|
||||
* @param btnm pointer to a button matrix object
|
||||
* @return the current map
|
||||
*/
|
||||
const char ** lv_btnm_get_map(lv_obj_t * btnm)
|
||||
{
|
||||
lv_btnm_ext_t * ext = lv_obj_get_ext(btnm);
|
||||
return ext->map_p;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a the callback function of the buttons on a button matrix
|
||||
* @param btnm: pointer to button matrix object
|
||||
* @return pointer to the callback function
|
||||
*/
|
||||
lv_btnm_callback_t lv_btnm_get_action(lv_obj_t * btnm)
|
||||
{
|
||||
lv_btnm_ext_t * ext = lv_obj_get_ext(btnm);
|
||||
return ext->cb;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the style of buttons in button matrix
|
||||
* @param btnm pointer to a button matrix object
|
||||
* @param state style in this state (LV_BTN_STATE_PR or LV_BTN_STATE_REL)
|
||||
* @return pointer the button style in the given state
|
||||
*/
|
||||
lv_style_t * lv_btnm_get_style_btn(lv_obj_t * btnm, lv_btn_state_t state)
|
||||
{
|
||||
lv_style_t * style;
|
||||
lv_btnm_ext_t * ext = lv_obj_get_ext(btnm);
|
||||
|
||||
switch(state) {
|
||||
case LV_BTN_STATE_PR:
|
||||
style = ext->style_btn_pr;
|
||||
break;
|
||||
case LV_BTN_STATE_REL:
|
||||
style = ext->style_btn_rel;
|
||||
break;
|
||||
default:
|
||||
style = NULL;
|
||||
}
|
||||
|
||||
if(style == NULL) style = lv_obj_get_style(btnm);
|
||||
|
||||
return style;
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Handle the drawing related tasks of the button matrixs
|
||||
* @param btnm pointer to a button matrix object
|
||||
* @param mask the object will be drawn only in this area
|
||||
* @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area
|
||||
* (return 'true' if yes)
|
||||
* LV_DESIGN_DRAW: draw the object (always return 'true')
|
||||
* LV_DESIGN_DRAW_POST: drawing after every children are drawn
|
||||
* @param return true/false, depends on 'mode'
|
||||
*/
|
||||
static bool lv_btnm_design(lv_obj_t * btnm, const area_t * mask, lv_design_mode_t mode)
|
||||
{
|
||||
if(mode == LV_DESIGN_COVER_CHK) {
|
||||
return ancestor_design_f(btnm, mask, mode);
|
||||
/*Return false if the object is not covers the mask_p area*/
|
||||
}
|
||||
/*Draw the object*/
|
||||
else if (mode == LV_DESIGN_DRAW_MAIN) {
|
||||
ancestor_design_f(btnm, mask, mode);
|
||||
|
||||
lv_btnm_ext_t * ext = lv_obj_get_ext(btnm);
|
||||
lv_style_t * btn_style;
|
||||
|
||||
area_t area_btnm;
|
||||
area_t area_tmp;
|
||||
cord_t btn_w;
|
||||
cord_t btn_h;
|
||||
|
||||
uint16_t btn_i = 0;
|
||||
uint16_t txt_i = 0;
|
||||
for(btn_i = 0; btn_i < ext->btn_cnt; btn_i ++, txt_i ++) {
|
||||
/*Search the next valid text in the map*/
|
||||
while(strcmp(ext->map_p[txt_i], "\n") == 0) txt_i ++;
|
||||
|
||||
if(ext->map_p[txt_i][1] == '\177') continue;
|
||||
|
||||
lv_obj_get_cords(btnm, &area_btnm);
|
||||
|
||||
area_cpy(&area_tmp, &ext->btn_areas[btn_i]);
|
||||
area_tmp.x1 += area_btnm.x1;
|
||||
area_tmp.y1 += area_btnm.y1;
|
||||
area_tmp.x2 += area_btnm.x1;
|
||||
area_tmp.y2 += area_btnm.y1;
|
||||
|
||||
btn_w = area_get_width(&area_tmp);
|
||||
btn_h = area_get_height(&area_tmp);
|
||||
|
||||
/*Load the style*/
|
||||
btn_style = lv_btnm_get_style_btn(btnm, ext->btn_pr == btn_i ? LV_BTN_STATE_PR : LV_BTN_STATE_REL);
|
||||
|
||||
lv_draw_rect(&area_tmp, mask, btn_style);
|
||||
|
||||
/*Calculate the size of the text*/
|
||||
const font_t * font = btn_style->font;
|
||||
point_t txt_size;
|
||||
txt_get_size(&txt_size, ext->map_p[txt_i], font,
|
||||
btn_style->letter_space, btn_style->line_space,
|
||||
area_get_width(&area_btnm), TXT_FLAG_NONE);
|
||||
|
||||
area_tmp.x1 += (btn_w - txt_size.x) / 2;
|
||||
area_tmp.y1 += (btn_h - txt_size.y) / 2;
|
||||
area_tmp.x2 = area_tmp.x1 + txt_size.x;
|
||||
area_tmp.y2 = area_tmp.y1 + txt_size.y;
|
||||
|
||||
lv_draw_label(&area_tmp, mask, btn_style, ext->map_p[txt_i], TXT_FLAG_NONE, NULL);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the required number of buttons according to a map
|
||||
* @param btnm pointer to button matrix object
|
||||
* @param map_p pointer to a string array
|
||||
*/
|
||||
static void lv_btnm_create_btns(lv_obj_t * btnm, const char ** map)
|
||||
{
|
||||
/*Count the buttons in the map*/
|
||||
uint16_t btn_cnt = 0;
|
||||
uint16_t i = 0;
|
||||
while(strlen(map[i]) != 0) {
|
||||
if(strcmp(map[i], "\n") != 0) { /*Do not count line breaks*/
|
||||
btn_cnt ++;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
lv_btnm_ext_t * ext = lv_obj_get_ext(btnm);
|
||||
|
||||
if(ext->btn_areas != NULL) {
|
||||
dm_free(ext->btn_areas);
|
||||
ext->btn_areas = NULL;
|
||||
}
|
||||
|
||||
ext->btn_areas = dm_alloc(sizeof(area_t) * btn_cnt);
|
||||
ext->btn_cnt = btn_cnt;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the width of a button in units. It comes from the first "letter".
|
||||
* @param btn_str The descriptor string of a button. E.g. "apple" or "\004banana"
|
||||
* @return the width of the button in units
|
||||
*/
|
||||
static uint8_t lv_btnm_get_width_unit(const char * btn_str)
|
||||
{
|
||||
if(btn_str[0] <= '\011') return btn_str[0];
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gives the button id of a button under a given point
|
||||
* @param btnm pointer to a button matrix object
|
||||
* @param p a point with absolute coordinates
|
||||
* @return the id of the button or LV_BTNM_PR_NONE.
|
||||
*/
|
||||
static uint16_t lv_btnm_get_btn_from_point(lv_obj_t * btnm, point_t * p)
|
||||
{
|
||||
area_t btnm_cords;
|
||||
area_t btn_area;
|
||||
lv_btnm_ext_t * ext = lv_obj_get_ext(btnm);
|
||||
uint16_t i;
|
||||
lv_obj_get_cords(btnm, &btnm_cords);
|
||||
|
||||
for(i = 0; i < ext->btn_cnt; i++) {
|
||||
area_cpy(&btn_area, &ext->btn_areas[i]);
|
||||
btn_area.x1 += btnm_cords.x1;
|
||||
btn_area.y1 += btnm_cords.y1;
|
||||
btn_area.x2 += btnm_cords.x1;
|
||||
btn_area.y2 += btnm_cords.y1;
|
||||
if(area_is_point_on(&btn_area, p) != false) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(i == ext->btn_cnt) i = LV_BTNM_PR_NONE;
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the text of a button
|
||||
* @param btnm pointer to a button matrix object
|
||||
* @param btn_id button id
|
||||
* @return text id in ext->map_p or LV_BTNM_PR_NONE if 'btn_id' was invalid
|
||||
*/
|
||||
static uint16_t lv_btnm_get_btn_txt(lv_obj_t * btnm, uint16_t btn_id)
|
||||
{
|
||||
lv_btnm_ext_t * ext = lv_obj_get_ext(btnm);
|
||||
if(btn_id > ext->btn_cnt) return LV_BTNM_PR_NONE;
|
||||
|
||||
uint16_t txt_i = 0;
|
||||
uint16_t btn_i = 0;
|
||||
|
||||
/* Search the text of ext->btn_pr the buttons text in the map
|
||||
* Skip "\n"-s*/
|
||||
while(btn_i != btn_id) {
|
||||
btn_i ++;
|
||||
txt_i ++;
|
||||
if(strcmp(ext->map_p[txt_i], "\n") == 0) txt_i ++;
|
||||
}
|
||||
|
||||
if(btn_i == ext->btn_cnt) return LV_BTNM_PR_NONE;
|
||||
|
||||
return txt_i;
|
||||
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
@@ -1,131 +0,0 @@
|
||||
/**
|
||||
* @file lv_btnm.h
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef LV_BTNM_H
|
||||
#define LV_BTNM_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_conf.h"
|
||||
#if USE_LV_BTNM != 0
|
||||
|
||||
#include "../lv_obj/lv_obj.h"
|
||||
#include "lv_label.h"
|
||||
#include "lv_btn.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/* Type of callback function which is called when a button is released on the button matrix
|
||||
* Parameters: button matrix, released button index in the map string
|
||||
* return LV_ACTION_RES_INV: the button matrix is deleted else LV_ACTION_RES_OK*/
|
||||
typedef lv_action_res_t (*lv_btnm_callback_t) (lv_obj_t *, uint16_t);
|
||||
|
||||
/*Data of button matrix*/
|
||||
typedef struct
|
||||
{
|
||||
lv_cont_ext_t bg; /*Ext. of ancestor*/
|
||||
/*New data for this type */
|
||||
const char ** map_p; /*Pointer to the current map*/
|
||||
area_t * btn_areas; /*Array of areas for the buttons (Handled by the library)*/
|
||||
uint16_t btn_cnt; /*Number of button in 'map_p'(Handled by the library)*/
|
||||
uint16_t btn_pr; /*Index of the currently pressed button or LV_BTNM_PR_NONE (Handled by the library)*/
|
||||
lv_btnm_callback_t cb; /*A function to call when a button is releases*/
|
||||
lv_style_t * style_btn_rel; /*Style of the released buttons*/
|
||||
lv_style_t * style_btn_pr; /*Style of the pressed buttons*/
|
||||
}lv_btnm_ext_t;
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Create a button matrix objects
|
||||
* @param par pointer to an object, it will be the parent of the new button matrix
|
||||
* @param copy pointer to a button matrix object, if not NULL then the new object will be copied from it
|
||||
* @return pointer to the created button matrix
|
||||
*/
|
||||
lv_obj_t * lv_btnm_create(lv_obj_t * par, lv_obj_t * copy);
|
||||
|
||||
/**
|
||||
* Signal function of the button matrix
|
||||
* @param btnm pointer to a button matrix object
|
||||
* @param sign a signal type from lv_signal_t enum
|
||||
* @param param pointer to a signal specific variable
|
||||
* @return true: the object is still valid (not deleted), false: the object become invalid
|
||||
*/
|
||||
bool lv_btnm_signal(lv_obj_t * btnm, lv_signal_t sign, void * param);
|
||||
|
||||
/**
|
||||
* Set a new map. Buttons will be created/deleted according to the map.
|
||||
* @param btnm pointer to a button matrix object
|
||||
* @param map pointer a string array. The last string has to be: "".
|
||||
* Use "\n" to begin a new line.
|
||||
* Use octal numbers (e.g. "\003") to set the relative
|
||||
* width of a button. (max. 9 -> \011)
|
||||
* (e.g. const char * str[] = {"a", "b", "\n", "\004c", "d", ""}).
|
||||
* The button do not copy the array so it can not be a local variable.
|
||||
*/
|
||||
void lv_btnm_set_map(lv_obj_t * btnm, const char ** map);
|
||||
|
||||
/**
|
||||
* Set a new callback function for the buttons (It will be called when a button is released)
|
||||
* @param btnm: pointer to button matrix object
|
||||
* @param cb pointer to a callback function
|
||||
*/
|
||||
void lv_btnm_set_action(lv_obj_t * btnm, lv_btnm_callback_t cb);
|
||||
|
||||
/**
|
||||
* Set the styles of the buttons of the button matrox
|
||||
* @param btnm pointer to a button matrix object
|
||||
* @param state style in this state (LV_BTN_STATE_PR or LV_BTN_STATE_REL)
|
||||
* @param style pointer to style
|
||||
*/
|
||||
void lv_btnm_set_styles_btn(lv_obj_t * btnm, lv_style_t * rel, lv_style_t * pr);
|
||||
|
||||
/**
|
||||
* Get the current map of a button matrix
|
||||
* @param btnm pointer to a button matrix object
|
||||
* @return the current map
|
||||
*/
|
||||
const char ** lv_btnm_get_map(lv_obj_t * btnm);
|
||||
|
||||
/**
|
||||
* Get a the callback function of the buttons on a button matrix
|
||||
* @param btnm: pointer to button matrix object
|
||||
* @return pointer to the callback function
|
||||
*/
|
||||
lv_btnm_callback_t lv_btnm_get_action(lv_obj_t * btnm);
|
||||
|
||||
/**
|
||||
* Get the style of buttons in button matrix
|
||||
* @param btnm pointer to a button matrix object
|
||||
* @param state style in this state (LV_BTN_STATE_PR or LV_BTN_STATE_REL)
|
||||
* @return pointer the button style in the given state
|
||||
*/
|
||||
lv_style_t * lv_btnm_get_style_btn(lv_obj_t * btnm, lv_btn_state_t state);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /*USE_LV_BTNM*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /*LV_BTNM_H*/
|
||||
262
lv_objx/lv_cb.c
262
lv_objx/lv_cb.c
@@ -1,262 +0,0 @@
|
||||
/**
|
||||
* @file lv_cb.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_conf.h"
|
||||
#if USE_LV_CB != 0
|
||||
|
||||
#include "lv_cb.h"
|
||||
#include "../lv_obj/lv_group.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static bool lv_cb_design(lv_obj_t * cb, const area_t * mask, lv_design_mode_t mode);
|
||||
static bool lv_bullet_design(lv_obj_t * bullet, const area_t * mask, lv_design_mode_t mode);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
static lv_design_f_t ancestor_bg_design_f;
|
||||
static lv_design_f_t ancestor_bullet_design_f;
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/*-----------------
|
||||
* Create function
|
||||
*-----------------*/
|
||||
|
||||
/**
|
||||
* Create a check box objects
|
||||
* @param par pointer to an object, it will be the parent of the new check box
|
||||
* @param copy pointer to a check box object, if not NULL then the new object will be copied from it
|
||||
* @return pointer to the created check box
|
||||
*/
|
||||
lv_obj_t * lv_cb_create(lv_obj_t * par, lv_obj_t * copy)
|
||||
{
|
||||
/*Create the ancestor basic object*/
|
||||
lv_obj_t * new_cb = lv_btn_create(par, copy);
|
||||
dm_assert(new_cb);
|
||||
|
||||
lv_cb_ext_t * ext = lv_obj_alloc_ext(new_cb, sizeof(lv_cb_ext_t));
|
||||
dm_assert(ext);
|
||||
ext->bullet = NULL;
|
||||
ext->label = NULL;
|
||||
|
||||
if(ancestor_bg_design_f == NULL) ancestor_bg_design_f = lv_obj_get_design_f(new_cb);
|
||||
|
||||
lv_obj_set_signal_f(new_cb, lv_cb_signal);
|
||||
lv_obj_set_design_f(new_cb, lv_cb_design);
|
||||
|
||||
/*Init the new checkbox object*/
|
||||
if(copy == NULL) {
|
||||
ext->bullet = lv_btn_create(new_cb, NULL);
|
||||
if(ancestor_bullet_design_f == NULL) ancestor_bullet_design_f = lv_obj_get_design_f(ext->bullet);
|
||||
lv_btn_set_styles(new_cb, lv_style_get(LV_STYLE_TRANSP, NULL), lv_style_get(LV_STYLE_TRANSP, NULL),
|
||||
lv_style_get(LV_STYLE_TRANSP, NULL), lv_style_get(LV_STYLE_TRANSP, NULL),
|
||||
lv_style_get(LV_STYLE_TRANSP, NULL));
|
||||
lv_cont_set_layout(new_cb, LV_CONT_LAYOUT_ROW_M);
|
||||
lv_cont_set_fit(new_cb, true, true);
|
||||
lv_btn_set_tgl(new_cb, true);
|
||||
|
||||
lv_obj_set_click(ext->bullet, false);
|
||||
lv_btn_set_styles(ext->bullet, lv_style_get(LV_STYLE_PRETTY, NULL), lv_style_get(LV_STYLE_PRETTY_COLOR, NULL),
|
||||
lv_style_get(LV_STYLE_BTN_TREL, NULL), lv_style_get(LV_STYLE_BTN_TPR, NULL),
|
||||
lv_style_get(LV_STYLE_BTN_INA, NULL));
|
||||
|
||||
ext->label = lv_label_create(new_cb, NULL);
|
||||
lv_obj_set_style(ext->label, NULL); /*Inherit the style of the parent*/
|
||||
lv_label_set_text(ext->label, "Check box");
|
||||
} else {
|
||||
lv_cb_ext_t * copy_ext = lv_obj_get_ext(copy);
|
||||
ext->bullet = lv_btn_create(new_cb, copy_ext->bullet);
|
||||
ext->label = lv_label_create(new_cb, copy_ext->label);
|
||||
|
||||
/*Refresh the style with new signal function*/
|
||||
lv_obj_refr_style(new_cb);
|
||||
}
|
||||
|
||||
lv_obj_set_design_f(ext->bullet, lv_bullet_design);
|
||||
|
||||
return new_cb;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Signal function of the check box
|
||||
* @param cb pointer to a check box object
|
||||
* @param sign a signal type from lv_signal_t enum
|
||||
* @param param pointer to a signal specific variable
|
||||
*/
|
||||
bool lv_cb_signal(lv_obj_t * cb, lv_signal_t sign, void * param)
|
||||
{
|
||||
bool valid;
|
||||
|
||||
/* Include the ancient signal function */
|
||||
valid = lv_btn_signal(cb, sign, param);
|
||||
|
||||
lv_cb_ext_t * ext = lv_obj_get_ext(cb);
|
||||
lv_style_t * style = lv_obj_get_style(cb);
|
||||
|
||||
/* The object can be deleted so check its validity and then
|
||||
* make the object specific signal handling */
|
||||
if(valid != false) {
|
||||
if(sign == LV_SIGNAL_STYLE_CHG) {
|
||||
lv_obj_set_size(ext->bullet, font_get_height(style->font), font_get_height(style->font));
|
||||
} else if(sign == LV_SIGNAL_PRESSED ||
|
||||
sign == LV_SIGNAL_RELEASED ||
|
||||
sign == LV_SIGNAL_PRESS_LOST) {
|
||||
lv_btn_set_state(lv_cb_get_bullet(cb), lv_btn_get_state(cb));
|
||||
} else if(sign == LV_SIGNAL_CONTROLL) {
|
||||
char c = *((char*)param);
|
||||
if(c == LV_GROUP_KEY_RIGHT || c == LV_GROUP_KEY_DOWN ||
|
||||
c == LV_GROUP_KEY_LEFT || c == LV_GROUP_KEY_UP ||
|
||||
c == LV_GROUP_KEY_ENTER) {
|
||||
lv_btn_set_state(lv_cb_get_bullet(cb), lv_btn_get_state(cb));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return valid;
|
||||
}
|
||||
|
||||
|
||||
/*=====================
|
||||
* Setter functions
|
||||
*====================*/
|
||||
|
||||
/**
|
||||
* Set the text of a check box
|
||||
* @param cb pointer to a check box
|
||||
* @param txt the text of the check box
|
||||
*/
|
||||
void lv_cb_set_text(lv_obj_t * cb, const char * txt)
|
||||
{
|
||||
lv_cb_ext_t * ext = lv_obj_get_ext(cb);
|
||||
lv_label_set_text(ext->label, txt);
|
||||
}
|
||||
|
||||
|
||||
/*=====================
|
||||
* Getter functions
|
||||
*====================*/
|
||||
|
||||
/**
|
||||
* Get the text of a check box
|
||||
* @param cb pointer to check box object
|
||||
* @return pointer to the text of the check box
|
||||
*/
|
||||
const char * lv_cb_get_text(lv_obj_t * cb)
|
||||
{
|
||||
lv_cb_ext_t * ext = lv_obj_get_ext(cb);
|
||||
return lv_label_get_text(ext->label);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the bullet (lv_btn) of a check box
|
||||
* @param cb pointer to check box object
|
||||
* @return pointer to the bullet of the check box (lv_btn)
|
||||
*/
|
||||
lv_obj_t * lv_cb_get_bullet(lv_obj_t * cb)
|
||||
{
|
||||
lv_cb_ext_t * ext = lv_obj_get_ext(cb);
|
||||
return ext->bullet;
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Handle the drawing related tasks of the check boxes
|
||||
* @param cb pointer to an object
|
||||
* @param mask the object will be drawn only in this area
|
||||
* @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area
|
||||
* (return 'true' if yes)
|
||||
* LV_DESIGN_DRAW: draw the object (always return 'true')
|
||||
* LV_DESIGN_DRAW_POST: drawing after every children are drawn
|
||||
* @param return true/false, depends on 'mode'
|
||||
*/
|
||||
static bool lv_cb_design(lv_obj_t * cb, const area_t * mask, lv_design_mode_t mode)
|
||||
{
|
||||
if(mode == LV_DESIGN_COVER_CHK) {
|
||||
/*Return false if the object is not covers the mask_p area*/
|
||||
return ancestor_bg_design_f(cb, mask, mode);
|
||||
} else if(mode == LV_DESIGN_DRAW_MAIN || mode == LV_DESIGN_DRAW_POST) {
|
||||
lv_cb_ext_t * cb_ext = lv_obj_get_ext(cb);
|
||||
lv_btn_ext_t * bullet_ext = lv_obj_get_ext(cb_ext->bullet);
|
||||
|
||||
/*Be sure the state of the bullet is the same as the parent button*/
|
||||
bullet_ext->state = cb_ext->bg_btn.state;
|
||||
|
||||
return ancestor_bg_design_f(cb, mask, mode);
|
||||
|
||||
} else {
|
||||
return ancestor_bg_design_f(cb, mask, mode);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the drawing related tasks of the check boxes
|
||||
* @param bullet pointer to an object
|
||||
* @param mask the object will be drawn only in this area
|
||||
* @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area
|
||||
* (return 'true' if yes)
|
||||
* LV_DESIGN_DRAW: draw the object (always return 'true')
|
||||
* LV_DESIGN_DRAW_POST: drawing after every children are drawn
|
||||
* @param return true/false, depends on 'mode'
|
||||
*/
|
||||
static bool lv_bullet_design(lv_obj_t * bullet, const area_t * mask, lv_design_mode_t mode)
|
||||
{
|
||||
if(mode == LV_DESIGN_COVER_CHK) {
|
||||
return ancestor_bullet_design_f(bullet, mask, mode);
|
||||
} else if(mode == LV_DESIGN_DRAW_MAIN) {
|
||||
#if LV_OBJ_GROUP != 0
|
||||
/* If the check box is the active in a group and
|
||||
* the background is not visible (transparent or empty)
|
||||
* then activate the style of the bullet*/
|
||||
lv_style_t * style_ori = lv_obj_get_style(bullet);
|
||||
lv_obj_t * bg = lv_obj_get_parent(bullet);
|
||||
lv_style_t * style_page = lv_obj_get_style(bg);
|
||||
lv_group_t * g = lv_obj_get_group(bg);
|
||||
if(style_page->empty != 0 || style_page->opa == OPA_TRANSP) { /*Background is visible?*/
|
||||
if(lv_group_get_focused(g) == bg) {
|
||||
lv_style_t * style_mod;
|
||||
style_mod = lv_group_mod_style(g, style_ori);
|
||||
bullet->style_p = style_mod; /*Temporally change the style to the activated */
|
||||
}
|
||||
}
|
||||
#endif
|
||||
ancestor_bullet_design_f(bullet, mask, mode);
|
||||
|
||||
#if LV_OBJ_GROUP != 0
|
||||
bullet->style_p = style_ori; /*Revert the style*/
|
||||
#endif
|
||||
} else if(mode == LV_DESIGN_DRAW_POST) {
|
||||
ancestor_bullet_design_f(bullet, mask, mode);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif
|
||||
100
lv_objx/lv_cb.h
100
lv_objx/lv_cb.h
@@ -1,100 +0,0 @@
|
||||
/**
|
||||
* @file lv_cb.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LV_CB_H
|
||||
#define LV_CB_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_conf.h"
|
||||
#if USE_LV_CB != 0
|
||||
|
||||
/*Testing of dependencies*/
|
||||
#if USE_LV_BTN == 0
|
||||
#error "lv_cb: lv_btn is required. Enable it in lv_conf.h (USE_LV_BTN 1) "
|
||||
#endif
|
||||
|
||||
#if USE_LV_LABEL == 0
|
||||
#error "lv_cb: lv_label is required. Enable it in lv_conf.h (USE_LV_LABEL 1) "
|
||||
#endif
|
||||
|
||||
#include "../lv_obj/lv_obj.h"
|
||||
#include "lv_btn.h"
|
||||
#include "lv_label.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/*Data of check box*/
|
||||
typedef struct
|
||||
{
|
||||
lv_btn_ext_t bg_btn; /*Ext. of ancestor*/
|
||||
/*New data for this type */
|
||||
lv_obj_t * bullet; /*Pointer to button*/
|
||||
lv_obj_t * label; /*Pointer to label*/
|
||||
}lv_cb_ext_t;
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Create a check box objects
|
||||
* @param par pointer to an object, it will be the parent of the new check box
|
||||
* @param copy pointer to a check box object, if not NULL then the new object will be copied from it
|
||||
* @return pointer to the created check box
|
||||
*/
|
||||
lv_obj_t * lv_cb_create(lv_obj_t * par, lv_obj_t * copy);
|
||||
|
||||
/**
|
||||
* Signal function of the check box
|
||||
* @param cb pointer to a check box object
|
||||
* @param sign a signal type from lv_signal_t enum
|
||||
* @param param pointer to a signal specific variable
|
||||
*/
|
||||
bool lv_cb_signal(lv_obj_t * cb, lv_signal_t sign, void * param);
|
||||
|
||||
/**
|
||||
* Set the text of a check box
|
||||
* @param cb pointer to a check box
|
||||
* @param txt the text of the check box
|
||||
*/
|
||||
void lv_cb_set_text(lv_obj_t * cb, const char * txt);
|
||||
|
||||
/**
|
||||
* Get the text of a check box
|
||||
* @param cb pointer to check box object
|
||||
* @return pointer to the text of the check box
|
||||
*/
|
||||
const char * lv_cb_get_text(lv_obj_t * cb);
|
||||
|
||||
/**
|
||||
* Get the bullet (lv_btn) of a check box
|
||||
* @param cb pointer to check box object
|
||||
* @return pointer to the bullet of the check box (lv_btn)
|
||||
*/
|
||||
lv_obj_t * lv_cb_get_bullet(lv_obj_t * cb);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /*USE_LV_CB*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /*LV_CB_H*/
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user