Compare commits

...

6 Commits

Author SHA1 Message Date
Ken Van Hoeylandt
6d01f6f6e7 Updated README.md screenshots and text 2026-10-07 22:56:56 +02:00
Ken Van Hoeylandt
94341069fe Fix for selection issue 2026-10-07 22:22:57 +02:00
Ken Van Hoeylandt
a6b880e33f Launcher improvements 2026-10-07 22:15:13 +02:00
Ken Van Hoeylandt
b088c35449 Add missing license files and clean up devices 2026-10-07 20:53:42 +02:00
Ken Van Hoeylandt
628f7b2b0c Fixes 2026-10-07 20:53:16 +02:00
Ken Van Hoeylandt
ae0d002f36 Fixes and improvements 2026-10-07 20:35:26 +02:00
137 changed files with 4005 additions and 661 deletions

View File

@ -24,6 +24,12 @@ macro(tactility_project_post project_name)
idf_build_set_property(COMPILE_OPTIONS "-fno-omit-frame-pointer" APPEND) idf_build_set_property(COMPILE_OPTIONS "-fno-omit-frame-pointer" APPEND)
endif() endif()
# Binds the app's references to its own symbols at link time. The C++ standard library's templates
# (e.g. std::shared_ptr internals) keep default visibility despite -fvisibility=hidden, so without this
# the linker leaves symbol relocations for them, which the ELF loader only resolves against the
# firmware's exported symbols. On RISC-V that fails to load the app with "Can't find common <symbol>".
idf_build_set_property(COMPILE_OPTIONS "-Wl,-Bsymbolic" APPEND)
# ESP-IDF's own <sys/ioctl.h> (esp_libc/platform_include) is found before app-module's, which adds # ESP-IDF's own <sys/ioctl.h> (esp_libc/platform_include) is found before app-module's, which adds
# the terminal ioctls (TIOCGWINSZ) Tactility's ioctl() supports for app fds. # the terminal ioctls (TIOCGWINSZ) Tactility's ioctl() supports for app fds.
# C and C++ only: assembly sources can't include a C header. # C and C++ only: assembly sources can't include a C header.

View File

@ -15,7 +15,6 @@ hardware.usbHostEnabled=true
storage.userDataLocation=Internal storage.userDataLocation=Internal
display.size=5" display.size=5"
display.shape=rectangle
display.dpi=187 display.dpi=187
lvgl.colorDepth=16 lvgl.colorDepth=16

View File

@ -15,7 +15,6 @@ hardware.bluetooth=true
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=2.9" display.size=2.9"
display.shape=rectangle
display.dpi=139 display.dpi=139
lvgl.colorDepth=8 lvgl.colorDepth=8

View File

@ -10,7 +10,6 @@ hardware.spiRam=false
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=2.2" display.size=2.2"
display.shape=rectangle
display.dpi=182 display.dpi=182
lvgl.colorDepth=16 lvgl.colorDepth=16

View File

@ -10,7 +10,6 @@ hardware.spiRam=false
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=2.4" display.size=2.4"
display.shape=rectangle
display.dpi=167 display.dpi=167
lvgl.colorDepth=16 lvgl.colorDepth=16

View File

@ -10,7 +10,6 @@ hardware.spiRam=false
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=2.4" display.size=2.4"
display.shape=rectangle
display.dpi=167 display.dpi=167
lvgl.colorDepth=16 lvgl.colorDepth=16

View File

@ -10,7 +10,6 @@ hardware.spiRam=false
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=2.8" display.size=2.8"
display.shape=rectangle
display.dpi=143 display.dpi=143
touch.calibrationSupported=true touch.calibrationSupported=true

View File

@ -10,7 +10,6 @@ hardware.spiRam=false
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=2.8" display.size=2.8"
display.shape=rectangle
display.dpi=143 display.dpi=143
touch.calibrationSupported=true touch.calibrationSupported=true

View File

@ -10,7 +10,6 @@ hardware.spiRam=false
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=3.2" display.size=3.2"
display.shape=rectangle
display.dpi=125 display.dpi=125
lvgl.colorDepth=16 lvgl.colorDepth=16

View File

@ -10,7 +10,6 @@ hardware.spiRam=false
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=3.5" display.size=3.5"
display.shape=rectangle
display.dpi=165 display.dpi=165
lvgl.colorDepth=16 lvgl.colorDepth=16

View File

@ -13,7 +13,6 @@ hardware.bluetooth=true
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=4" display.size=4"
display.shape=rectangle
display.dpi=170 display.dpi=170
lvgl.colorDepth=16 lvgl.colorDepth=16

View File

@ -15,7 +15,6 @@ hardware.bluetooth=true
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=4.3" display.size=4.3"
display.shape=rectangle
display.dpi=217 display.dpi=217
cdn.infoMessage= cdn.infoMessage=

View File

@ -10,7 +10,6 @@ hardware.spiRam=false
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=2.8" display.size=2.8"
display.shape=rectangle
display.dpi=143 display.dpi=143
touch.calibrationSupported=true touch.calibrationSupported=true

View File

@ -10,7 +10,6 @@ hardware.spiRam=false
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=2.8" display.size=2.8"
display.shape=rectangle
display.dpi=125 display.dpi=125
touch.calibrationSupported=true touch.calibrationSupported=true

View File

@ -15,7 +15,6 @@ hardware.bluetooth=true
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=2.8" display.size=2.8"
display.shape=rectangle
display.dpi=143 display.dpi=143
lvgl.colorDepth=16 lvgl.colorDepth=16

View File

@ -15,7 +15,6 @@ hardware.bluetooth=true
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=3.5" display.size=3.5"
display.shape=rectangle
display.dpi=165 display.dpi=165
cdn.warningMessage=This device has display driver and memory issues. App Hub doesn't work. cdn.warningMessage=This device has display driver and memory issues. App Hub doesn't work.

View File

@ -15,7 +15,6 @@ hardware.bluetooth=true
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=5" display.size=5"
display.shape=rectangle
display.dpi=187 display.dpi=187
lvgl.colorDepth=16 lvgl.colorDepth=16

View File

@ -10,7 +10,6 @@ hardware.spiRam=false
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=2.8" display.size=2.8"
display.shape=rectangle
display.dpi=143 display.dpi=143
touch.calibrationSupported=true touch.calibrationSupported=true

View File

@ -10,7 +10,6 @@ hardware.spiRam=false
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=3.5" display.size=3.5"
display.shape=rectangle
display.dpi=165 display.dpi=165
touch.calibrationSupported=true touch.calibrationSupported=true

View File

@ -15,7 +15,6 @@ hardware.bluetooth=true
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=5.0" display.size=5.0"
display.shape=rectangle
display.dpi=187 display.dpi=187
lvgl.colorDepth=16 lvgl.colorDepth=16

View File

@ -0,0 +1,195 @@
Apache License
==============
_Version 2.0, January 2004_
_&lt;<http://www.apache.org/licenses/>&gt;_
### Terms and Conditions for use, reproduction, and distribution
#### 1. Definitions
“License” shall mean the terms and conditions for use, reproduction, and
distribution as defined by Sections 1 through 9 of this document.
“Licensor” shall mean the copyright owner or entity authorized by the copyright
owner that is granting the License.
“Legal Entity” shall mean the union of the acting entity and all other entities
that control, are controlled by, or are under common control with that entity.
For the purposes of this definition, “control” means **(i)** the power, direct or
indirect, to cause the direction or management of such entity, whether by
contract or otherwise, or **(ii)** ownership of fifty percent (50%) or more of the
outstanding shares, or **(iii)** beneficial ownership of such entity.
“You” (or “Your”) shall mean an individual or Legal Entity exercising
permissions granted by this License.
“Source” form shall mean the preferred form for making modifications, including
but not limited to software source code, documentation source, and configuration
files.
“Object” form shall mean any form resulting from mechanical transformation or
translation of a Source form, including but not limited to compiled object code,
generated documentation, and conversions to other media types.
“Work” shall mean the work of authorship, whether in Source or Object form, made
available under the License, as indicated by a copyright notice that is included
in or attached to the work (an example is provided in the Appendix below).
“Derivative Works” shall mean any work, whether in Source or Object form, that
is based on (or derived from) the Work and for which the editorial revisions,
annotations, elaborations, or other modifications represent, as a whole, an
original work of authorship. For the purposes of this License, Derivative Works
shall not include works that remain separable from, or merely link (or bind by
name) to the interfaces of, the Work and Derivative Works thereof.
“Contribution” shall mean any work of authorship, including the original version
of the Work and any modifications or additions to that Work or Derivative Works
thereof, that is intentionally submitted to Licensor for inclusion in the Work
by the copyright owner or by an individual or Legal Entity authorized to submit
on behalf of the copyright owner. For the purposes of this definition,
“submitted” means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems, and
issue tracking systems that are managed by, or on behalf of, the Licensor for
the purpose of discussing and improving the Work, but excluding communication
that is conspicuously marked or otherwise designated in writing by the copyright
owner as “Not a Contribution.”
“Contributor” shall mean Licensor and any individual or Legal Entity on behalf
of whom a Contribution has been received by Licensor and subsequently
incorporated within the Work.
#### 2. Grant of Copyright License
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the Work and such
Derivative Works in Source or Object form.
#### 3. Grant of Patent License
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable (except as stated in this section) patent license to make, have
made, use, offer to sell, sell, import, and otherwise transfer the Work, where
such license applies only to those patent claims licensable by such Contributor
that are necessarily infringed by their Contribution(s) alone or by combination
of their Contribution(s) with the Work to which such Contribution(s) was
submitted. If You institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work or a
Contribution incorporated within the Work constitutes direct or contributory
patent infringement, then any patent licenses granted to You under this License
for that Work shall terminate as of the date such litigation is filed.
#### 4. Redistribution
You may reproduce and distribute copies of the Work or Derivative Works thereof
in any medium, with or without modifications, and in Source or Object form,
provided that You meet the following conditions:
* **(a)** You must give any other recipients of the Work or Derivative Works a copy of
this License; and
* **(b)** You must cause any modified files to carry prominent notices stating that You
changed the files; and
* **(c)** You must retain, in the Source form of any Derivative Works that You distribute,
all copyright, patent, trademark, and attribution notices from the Source form
of the Work, excluding those notices that do not pertain to any part of the
Derivative Works; and
* **(d)** If the Work includes a “NOTICE” text file as part of its distribution, then any
Derivative Works that You distribute must include a readable copy of the
attribution notices contained within such NOTICE file, excluding those notices
that do not pertain to any part of the Derivative Works, in at least one of the
following places: within a NOTICE text file distributed as part of the
Derivative Works; within the Source form or documentation, if provided along
with the Derivative Works; or, within a display generated by the Derivative
Works, if and wherever such third-party notices normally appear. The contents of
the NOTICE file are for informational purposes only and do not modify the
License. You may add Your own attribution notices within Derivative Works that
You distribute, alongside or as an addendum to the NOTICE text from the Work,
provided that such additional attribution notices cannot be construed as
modifying the License.
You may add Your own copyright statement to Your modifications and may provide
additional or different license terms and conditions for use, reproduction, or
distribution of Your modifications, or for any such Derivative Works as a whole,
provided Your use, reproduction, and distribution of the Work otherwise complies
with the conditions stated in this License.
#### 5. Submission of Contributions
Unless You explicitly state otherwise, any Contribution intentionally submitted
for inclusion in the Work by You to the Licensor shall be under the terms and
conditions of this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify the terms of
any separate license agreement you may have executed with Licensor regarding
such Contributions.
#### 6. Trademarks
This License does not grant permission to use the trade names, trademarks,
service marks, or product names of the Licensor, except as required for
reasonable and customary use in describing the origin of the Work and
reproducing the content of the NOTICE file.
#### 7. Disclaimer of Warranty
Unless required by applicable law or agreed to in writing, Licensor provides the
Work (and each Contributor provides its Contributions) on an “AS IS” BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
including, without limitation, any warranties or conditions of TITLE,
NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
solely responsible for determining the appropriateness of using or
redistributing the Work and assume any risks associated with Your exercise of
permissions under this License.
#### 8. Limitation of Liability
In no event and under no legal theory, whether in tort (including negligence),
contract, or otherwise, unless required by applicable law (such as deliberate
and grossly negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special, incidental,
or consequential damages of any character arising as a result of this License or
out of the use or inability to use the Work (including but not limited to
damages for loss of goodwill, work stoppage, computer failure or malfunction, or
any and all other commercial damages or losses), even if such Contributor has
been advised of the possibility of such damages.
#### 9. Accepting Warranty or Additional Liability
While redistributing the Work or Derivative Works thereof, You may choose to
offer, and charge a fee for, acceptance of support, warranty, indemnity, or
other liability obligations and/or rights consistent with this License. However,
in accepting such obligations, You may act only on Your own behalf and on Your
sole responsibility, not on behalf of any other Contributor, and only if You
agree to indemnify, defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason of your
accepting any such warranty or additional liability.
_END OF TERMS AND CONDITIONS_
### APPENDIX: How to apply the Apache License to your work
To apply the Apache License to your work, attach the following boilerplate
notice, with the fields enclosed by brackets `[]` replaced with your own
identifying information. (Don't include the brackets!) The text should be
enclosed in the appropriate comment syntax for the file format. We also
recommend that a file or class name and description of purpose be included on
the same “printed page” as the copyright notice for easier identification within
third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@ -13,7 +13,6 @@ hardware.tinyUsbMsc=true
hardware.bluetooth=true hardware.bluetooth=true
display.size=2.8" display.size=2.8"
display.shape=rectangle
display.dpi=143 display.dpi=143
lvgl.colorDepth=16 lvgl.colorDepth=16

View File

@ -14,7 +14,6 @@ hardware.bluetooth=true
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=7" display.size=7"
display.shape=rectangle
display.dpi=187 display.dpi=187
lvgl.colorDepth=16 lvgl.colorDepth=16

View File

@ -10,7 +10,6 @@ hardware.spiRam=false
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=2.8" display.size=2.8"
display.shape=rectangle
display.dpi=143 display.dpi=143
lvgl.colorDepth=16 lvgl.colorDepth=16

View File

@ -14,7 +14,6 @@ hardware.bluetooth=true
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=5" display.size=5"
display.shape=rectangle
display.dpi=187 display.dpi=187
lvgl.colorDepth=16 lvgl.colorDepth=16

View File

@ -15,7 +15,6 @@ hardware.bluetooth=true
storage.userDataLocation=Internal storage.userDataLocation=Internal
display.size=0.96" display.size=0.96"
display.shape=rectangle
display.dpi=149 display.dpi=149
cdn.infoMessage=Due to the small size of the screen, the icons don't render properly. cdn.infoMessage=Due to the small size of the screen, the icons don't render properly.

View File

@ -15,7 +15,6 @@ hardware.bluetooth=true
storage.userDataLocation=Internal storage.userDataLocation=Internal
display.size=4.7" display.size=4.7"
display.shape=rectangle
display.dpi=235 display.dpi=235
lvgl.colorDepth=8 lvgl.colorDepth=8

View File

@ -19,7 +19,6 @@ hardware.bluetooth=true
storage.userDataLocation=Internal storage.userDataLocation=Internal
display.size=3.1" display.size=3.1"
display.shape=rectangle
display.dpi=128 display.dpi=128
lvgl.colorDepth=8 lvgl.colorDepth=8

View File

@ -16,7 +16,6 @@ hardware.bluetooth=true
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=2.8" display.size=2.8"
display.shape=rectangle
display.dpi=143 display.dpi=143
cdn.infoMessage=To put the device into bootloader mode: <br/>1. Press the trackball and then the reset button at the same time,<br/>2. Let go of the reset button, then the trackball.<br/><br/>When this website reports that flashing is finished, you likely have to press the reset button. cdn.infoMessage=To put the device into bootloader mode: <br/>1. Press the trackball and then the reset button at the same time,<br/>2. Let go of the reset button, then the trackball.<br/><br/>When this website reports that flashing is finished, you likely have to press the reset button.

View File

@ -18,7 +18,6 @@ hardware.bluetooth=true
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=3.1" display.size=3.1"
display.shape=rectangle
display.dpi=128 display.dpi=128
lvgl.colorDepth=8 lvgl.colorDepth=8

View File

@ -16,7 +16,6 @@ hardware.bluetooth=true
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=2.8" display.size=2.8"
display.shape=rectangle
display.dpi=143 display.dpi=143
cdn.infoMessage=To put the device into bootloader mode: <br/>1. Press the trackball and then the reset button at the same time,<br/>2. Let go of the reset button, then the trackball.<br/><br/>When this website reports that flashing is finished, you likely have to press the reset button. cdn.infoMessage=To put the device into bootloader mode: <br/>1. Press the trackball and then the reset button at the same time,<br/>2. Let go of the reset button, then the trackball.<br/><br/>When this website reports that flashing is finished, you likely have to press the reset button.

View File

@ -16,7 +16,6 @@ hardware.bluetooth=true
storage.userDataLocation=Internal storage.userDataLocation=Internal
display.size=1.9" display.size=1.9"
display.shape=rectangle
display.dpi=191 display.dpi=191
lvgl.colorDepth=16 lvgl.colorDepth=16

View File

@ -13,7 +13,6 @@ hardware.esptoolFlashFreq=80M
storage.userDataLocation=Internal storage.userDataLocation=Internal
display.size=1.14" display.size=1.14"
display.shape=rectangle
display.dpi=242 display.dpi=242
lvgl.colorDepth=16 lvgl.colorDepth=16

View File

@ -15,7 +15,6 @@ hardware.bluetooth=true
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=0.96" display.size=0.96"
display.shape=rectangle
display.dpi=186 display.dpi=186
lvgl.colorDepth=16 lvgl.colorDepth=16

View File

@ -16,7 +16,6 @@ hardware.bluetooth=true
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=1.9" display.size=1.9"
display.shape=rectangle
display.dpi=191 display.dpi=191
lvgl.colorDepth=16 lvgl.colorDepth=16

View File

@ -15,7 +15,6 @@ hardware.bluetooth=true
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=2.8" display.size=2.8"
display.shape=rectangle
display.dpi=125 display.dpi=125
touch.calibrationSupported=true touch.calibrationSupported=true

View File

@ -16,7 +16,6 @@ hardware.bluetooth=true
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=2.33" display.size=2.33"
display.shape=rectangle
display.dpi=227 display.dpi=227
lvgl.colorDepth=16 lvgl.colorDepth=16

View File

@ -13,7 +13,6 @@ hardware.bluetooth=true
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=1.14" display.size=1.14"
display.shape=rectangle
# TODO: dps is actually 242, but this breaks UI (button selection becomes invisible and switch visibility is reduced) # TODO: dps is actually 242, but this breaks UI (button selection becomes invisible and switch visibility is reduced)
display.dpi=139 display.dpi=139

View File

@ -13,7 +13,6 @@ hardware.bluetooth=true
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=1.14" display.size=1.14"
display.shape=rectangle
# TODO: dps is actually 242, but this breaks UI (button selection becomes invisible and switch visibility is reduced) # TODO: dps is actually 242, but this breaks UI (button selection becomes invisible and switch visibility is reduced)
display.dpi=139 display.dpi=139

View File

@ -13,7 +13,6 @@ hardware.esptoolFlashFreq=80M
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=2" display.size=2"
display.shape=rectangle
display.dpi=200 display.dpi=200
cdn.warningMessage=This board implementation concerns the original Core2 hardware and **not** the v1.1 variant cdn.warningMessage=This board implementation concerns the original Core2 hardware and **not** the v1.1 variant

View File

@ -15,7 +15,6 @@ hardware.bluetooth=true
storage.userDataLocation=Internal storage.userDataLocation=Internal
display.size=2" display.size=2"
display.shape=rectangle
display.dpi=200 display.dpi=200
lvgl.colorDepth=16 lvgl.colorDepth=16

View File

@ -16,7 +16,6 @@ hardware.bluetooth=true
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=4.7" display.size=4.7"
display.shape=rectangle
display.dpi=235 display.dpi=235
lvgl.colorDepth=8 lvgl.colorDepth=8

View File

@ -15,7 +15,6 @@ hardware.bluetooth=true
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=2" display.size=2"
display.shape=rectangle
display.dpi=200 display.dpi=200
lvgl.colorDepth=16 lvgl.colorDepth=16

View File

@ -13,7 +13,6 @@ hardware.esptoolFlashFreq=80M
storage.userDataLocation=Internal storage.userDataLocation=Internal
display.size=1.14" display.size=1.14"
display.shape=rectangle
display.dpi=242 display.dpi=242
lvgl.colorDepth=16 lvgl.colorDepth=16

View File

@ -15,7 +15,6 @@ hardware.bluetooth=true
storage.userDataLocation=Internal storage.userDataLocation=Internal
display.size=1.14" display.size=1.14"
display.shape=rectangle
display.dpi=242 display.dpi=242
lvgl.colorDepth=16 lvgl.colorDepth=16

View File

@ -21,7 +21,6 @@ storage.userDataLocation=SD
dependencies.useDeprecatedHal=false dependencies.useDeprecatedHal=false
display.size=5" display.size=5"
display.shape=rectangle
display.dpi=294 display.dpi=294
lvgl.colorDepth=16 lvgl.colorDepth=16

View File

@ -18,7 +18,6 @@ touch.calibrationSupported=true
touch.calibrationRequired=false touch.calibrationRequired=false
display.size=7" display.size=7"
display.shape=rectangle
display.dpi=117 display.dpi=117
lvgl.colorDepth=16 lvgl.colorDepth=16

View File

@ -13,7 +13,6 @@ hardware.bluetooth=true
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=3.5" display.size=3.5"
display.shape=rectangle
display.dpi=165 display.dpi=165
touch.calibrationSupported=true touch.calibrationSupported=true

View File

@ -18,7 +18,6 @@ hardware.bluetooth=true
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=1.14" display.size=1.14"
display.shape=rectangle
display.dpi=143 display.dpi=143
lvgl.colorDepth=16 lvgl.colorDepth=16

View File

@ -17,7 +17,6 @@ hardware.bluetooth=true
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=1.3" display.size=1.3"
display.shape=rectangle
display.dpi=261 display.dpi=261
lvgl.colorDepth=16 lvgl.colorDepth=16

View File

@ -18,7 +18,6 @@ hardware.bluetooth=true
storage.userDataLocation=Internal storage.userDataLocation=Internal
display.size=1.28" display.size=1.28"
display.shape=circle
display.dpi=265 display.dpi=265
lvgl.colorDepth=16 lvgl.colorDepth=16

View File

@ -84,6 +84,7 @@
compatible = "galaxycore,gc9a01"; compatible = "galaxycore,gc9a01";
horizontal-resolution = <240>; horizontal-resolution = <240>;
vertical-resolution = <240>; vertical-resolution = <240>;
shape = <DISPLAY_SHAPE_CIRCLE>;
mirror-y; mirror-y;
invert-color; invert-color;
bgr-order; bgr-order;

View File

@ -16,7 +16,6 @@ hardware.bluetooth=true
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=1.47" display.size=1.47"
display.shape=rectangle
display.dpi=247 display.dpi=247
lvgl.colorDepth=16 lvgl.colorDepth=16

View File

@ -77,6 +77,9 @@
compatible = "jadard,jd9853"; compatible = "jadard,jd9853";
horizontal-resolution = <172>; horizontal-resolution = <172>;
vertical-resolution = <320>; vertical-resolution = <320>;
// The panel has rounded corners. The radius is estimated, as it isn't specified.
shape = <DISPLAY_SHAPE_ROUNDED>;
corner-radius = <40>;
gap-x = <34>; gap-x = <34>;
invert-color; invert-color;
pin-dc = <&gpio0 45 GPIO_FLAG_NONE>; pin-dc = <&gpio0 45 GPIO_FLAG_NONE>;

View File

@ -16,7 +16,6 @@ hardware.bluetooth=true
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=4.3" display.size=4.3"
display.shape=rectangle
display.dpi=217 display.dpi=217
lvgl.colorDepth=16 lvgl.colorDepth=16

View File

@ -15,7 +15,6 @@ hardware.bluetooth=true
storage.userDataLocation=SD storage.userDataLocation=SD
display.size=3.5" display.size=3.5"
display.shape=rectangle
display.dpi=165 display.dpi=165
lvgl.colorDepth=16 lvgl.colorDepth=16

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

View File

@ -0,0 +1,195 @@
Apache License
==============
_Version 2.0, January 2004_
_&lt;<http://www.apache.org/licenses/>&gt;_
### Terms and Conditions for use, reproduction, and distribution
#### 1. Definitions
“License” shall mean the terms and conditions for use, reproduction, and
distribution as defined by Sections 1 through 9 of this document.
“Licensor” shall mean the copyright owner or entity authorized by the copyright
owner that is granting the License.
“Legal Entity” shall mean the union of the acting entity and all other entities
that control, are controlled by, or are under common control with that entity.
For the purposes of this definition, “control” means **(i)** the power, direct or
indirect, to cause the direction or management of such entity, whether by
contract or otherwise, or **(ii)** ownership of fifty percent (50%) or more of the
outstanding shares, or **(iii)** beneficial ownership of such entity.
“You” (or “Your”) shall mean an individual or Legal Entity exercising
permissions granted by this License.
“Source” form shall mean the preferred form for making modifications, including
but not limited to software source code, documentation source, and configuration
files.
“Object” form shall mean any form resulting from mechanical transformation or
translation of a Source form, including but not limited to compiled object code,
generated documentation, and conversions to other media types.
“Work” shall mean the work of authorship, whether in Source or Object form, made
available under the License, as indicated by a copyright notice that is included
in or attached to the work (an example is provided in the Appendix below).
“Derivative Works” shall mean any work, whether in Source or Object form, that
is based on (or derived from) the Work and for which the editorial revisions,
annotations, elaborations, or other modifications represent, as a whole, an
original work of authorship. For the purposes of this License, Derivative Works
shall not include works that remain separable from, or merely link (or bind by
name) to the interfaces of, the Work and Derivative Works thereof.
“Contribution” shall mean any work of authorship, including the original version
of the Work and any modifications or additions to that Work or Derivative Works
thereof, that is intentionally submitted to Licensor for inclusion in the Work
by the copyright owner or by an individual or Legal Entity authorized to submit
on behalf of the copyright owner. For the purposes of this definition,
“submitted” means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems, and
issue tracking systems that are managed by, or on behalf of, the Licensor for
the purpose of discussing and improving the Work, but excluding communication
that is conspicuously marked or otherwise designated in writing by the copyright
owner as “Not a Contribution.”
“Contributor” shall mean Licensor and any individual or Legal Entity on behalf
of whom a Contribution has been received by Licensor and subsequently
incorporated within the Work.
#### 2. Grant of Copyright License
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the Work and such
Derivative Works in Source or Object form.
#### 3. Grant of Patent License
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable (except as stated in this section) patent license to make, have
made, use, offer to sell, sell, import, and otherwise transfer the Work, where
such license applies only to those patent claims licensable by such Contributor
that are necessarily infringed by their Contribution(s) alone or by combination
of their Contribution(s) with the Work to which such Contribution(s) was
submitted. If You institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work or a
Contribution incorporated within the Work constitutes direct or contributory
patent infringement, then any patent licenses granted to You under this License
for that Work shall terminate as of the date such litigation is filed.
#### 4. Redistribution
You may reproduce and distribute copies of the Work or Derivative Works thereof
in any medium, with or without modifications, and in Source or Object form,
provided that You meet the following conditions:
* **(a)** You must give any other recipients of the Work or Derivative Works a copy of
this License; and
* **(b)** You must cause any modified files to carry prominent notices stating that You
changed the files; and
* **(c)** You must retain, in the Source form of any Derivative Works that You distribute,
all copyright, patent, trademark, and attribution notices from the Source form
of the Work, excluding those notices that do not pertain to any part of the
Derivative Works; and
* **(d)** If the Work includes a “NOTICE” text file as part of its distribution, then any
Derivative Works that You distribute must include a readable copy of the
attribution notices contained within such NOTICE file, excluding those notices
that do not pertain to any part of the Derivative Works, in at least one of the
following places: within a NOTICE text file distributed as part of the
Derivative Works; within the Source form or documentation, if provided along
with the Derivative Works; or, within a display generated by the Derivative
Works, if and wherever such third-party notices normally appear. The contents of
the NOTICE file are for informational purposes only and do not modify the
License. You may add Your own attribution notices within Derivative Works that
You distribute, alongside or as an addendum to the NOTICE text from the Work,
provided that such additional attribution notices cannot be construed as
modifying the License.
You may add Your own copyright statement to Your modifications and may provide
additional or different license terms and conditions for use, reproduction, or
distribution of Your modifications, or for any such Derivative Works as a whole,
provided Your use, reproduction, and distribution of the Work otherwise complies
with the conditions stated in this License.
#### 5. Submission of Contributions
Unless You explicitly state otherwise, any Contribution intentionally submitted
for inclusion in the Work by You to the Licensor shall be under the terms and
conditions of this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify the terms of
any separate license agreement you may have executed with Licensor regarding
such Contributions.
#### 6. Trademarks
This License does not grant permission to use the trade names, trademarks,
service marks, or product names of the Licensor, except as required for
reasonable and customary use in describing the origin of the Work and
reproducing the content of the NOTICE file.
#### 7. Disclaimer of Warranty
Unless required by applicable law or agreed to in writing, Licensor provides the
Work (and each Contributor provides its Contributions) on an “AS IS” BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
including, without limitation, any warranties or conditions of TITLE,
NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
solely responsible for determining the appropriateness of using or
redistributing the Work and assume any risks associated with Your exercise of
permissions under this License.
#### 8. Limitation of Liability
In no event and under no legal theory, whether in tort (including negligence),
contract, or otherwise, unless required by applicable law (such as deliberate
and grossly negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special, incidental,
or consequential damages of any character arising as a result of this License or
out of the use or inability to use the Work (including but not limited to
damages for loss of goodwill, work stoppage, computer failure or malfunction, or
any and all other commercial damages or losses), even if such Contributor has
been advised of the possibility of such damages.
#### 9. Accepting Warranty or Additional Liability
While redistributing the Work or Derivative Works thereof, You may choose to
offer, and charge a fee for, acceptance of support, warranty, indemnity, or
other liability obligations and/or rights consistent with this License. However,
in accepting such obligations, You may act only on Your own behalf and on Your
sole responsibility, not on behalf of any other Contributor, and only if You
agree to indemnify, defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason of your
accepting any such warranty or additional liability.
_END OF TERMS AND CONDITIONS_
### APPENDIX: How to apply the Apache License to your work
To apply the Apache License to your work, attach the following boilerplate
notice, with the fields enclosed by brackets `[]` replaced with your own
identifying information. (Don't include the brackets!) The text should be
enclosed in the appropriate comment syntax for the file format. We also
recommend that a file or class name and description of purpose be included on
the same “printed page” as the copyright notice for easier identification within
third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@ -0,0 +1,195 @@
Apache License
==============
_Version 2.0, January 2004_
_&lt;<http://www.apache.org/licenses/>&gt;_
### Terms and Conditions for use, reproduction, and distribution
#### 1. Definitions
“License” shall mean the terms and conditions for use, reproduction, and
distribution as defined by Sections 1 through 9 of this document.
“Licensor” shall mean the copyright owner or entity authorized by the copyright
owner that is granting the License.
“Legal Entity” shall mean the union of the acting entity and all other entities
that control, are controlled by, or are under common control with that entity.
For the purposes of this definition, “control” means **(i)** the power, direct or
indirect, to cause the direction or management of such entity, whether by
contract or otherwise, or **(ii)** ownership of fifty percent (50%) or more of the
outstanding shares, or **(iii)** beneficial ownership of such entity.
“You” (or “Your”) shall mean an individual or Legal Entity exercising
permissions granted by this License.
“Source” form shall mean the preferred form for making modifications, including
but not limited to software source code, documentation source, and configuration
files.
“Object” form shall mean any form resulting from mechanical transformation or
translation of a Source form, including but not limited to compiled object code,
generated documentation, and conversions to other media types.
“Work” shall mean the work of authorship, whether in Source or Object form, made
available under the License, as indicated by a copyright notice that is included
in or attached to the work (an example is provided in the Appendix below).
“Derivative Works” shall mean any work, whether in Source or Object form, that
is based on (or derived from) the Work and for which the editorial revisions,
annotations, elaborations, or other modifications represent, as a whole, an
original work of authorship. For the purposes of this License, Derivative Works
shall not include works that remain separable from, or merely link (or bind by
name) to the interfaces of, the Work and Derivative Works thereof.
“Contribution” shall mean any work of authorship, including the original version
of the Work and any modifications or additions to that Work or Derivative Works
thereof, that is intentionally submitted to Licensor for inclusion in the Work
by the copyright owner or by an individual or Legal Entity authorized to submit
on behalf of the copyright owner. For the purposes of this definition,
“submitted” means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems, and
issue tracking systems that are managed by, or on behalf of, the Licensor for
the purpose of discussing and improving the Work, but excluding communication
that is conspicuously marked or otherwise designated in writing by the copyright
owner as “Not a Contribution.”
“Contributor” shall mean Licensor and any individual or Legal Entity on behalf
of whom a Contribution has been received by Licensor and subsequently
incorporated within the Work.
#### 2. Grant of Copyright License
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the Work and such
Derivative Works in Source or Object form.
#### 3. Grant of Patent License
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable (except as stated in this section) patent license to make, have
made, use, offer to sell, sell, import, and otherwise transfer the Work, where
such license applies only to those patent claims licensable by such Contributor
that are necessarily infringed by their Contribution(s) alone or by combination
of their Contribution(s) with the Work to which such Contribution(s) was
submitted. If You institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work or a
Contribution incorporated within the Work constitutes direct or contributory
patent infringement, then any patent licenses granted to You under this License
for that Work shall terminate as of the date such litigation is filed.
#### 4. Redistribution
You may reproduce and distribute copies of the Work or Derivative Works thereof
in any medium, with or without modifications, and in Source or Object form,
provided that You meet the following conditions:
* **(a)** You must give any other recipients of the Work or Derivative Works a copy of
this License; and
* **(b)** You must cause any modified files to carry prominent notices stating that You
changed the files; and
* **(c)** You must retain, in the Source form of any Derivative Works that You distribute,
all copyright, patent, trademark, and attribution notices from the Source form
of the Work, excluding those notices that do not pertain to any part of the
Derivative Works; and
* **(d)** If the Work includes a “NOTICE” text file as part of its distribution, then any
Derivative Works that You distribute must include a readable copy of the
attribution notices contained within such NOTICE file, excluding those notices
that do not pertain to any part of the Derivative Works, in at least one of the
following places: within a NOTICE text file distributed as part of the
Derivative Works; within the Source form or documentation, if provided along
with the Derivative Works; or, within a display generated by the Derivative
Works, if and wherever such third-party notices normally appear. The contents of
the NOTICE file are for informational purposes only and do not modify the
License. You may add Your own attribution notices within Derivative Works that
You distribute, alongside or as an addendum to the NOTICE text from the Work,
provided that such additional attribution notices cannot be construed as
modifying the License.
You may add Your own copyright statement to Your modifications and may provide
additional or different license terms and conditions for use, reproduction, or
distribution of Your modifications, or for any such Derivative Works as a whole,
provided Your use, reproduction, and distribution of the Work otherwise complies
with the conditions stated in this License.
#### 5. Submission of Contributions
Unless You explicitly state otherwise, any Contribution intentionally submitted
for inclusion in the Work by You to the Licensor shall be under the terms and
conditions of this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify the terms of
any separate license agreement you may have executed with Licensor regarding
such Contributions.
#### 6. Trademarks
This License does not grant permission to use the trade names, trademarks,
service marks, or product names of the Licensor, except as required for
reasonable and customary use in describing the origin of the Work and
reproducing the content of the NOTICE file.
#### 7. Disclaimer of Warranty
Unless required by applicable law or agreed to in writing, Licensor provides the
Work (and each Contributor provides its Contributions) on an “AS IS” BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
including, without limitation, any warranties or conditions of TITLE,
NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
solely responsible for determining the appropriateness of using or
redistributing the Work and assume any risks associated with Your exercise of
permissions under this License.
#### 8. Limitation of Liability
In no event and under no legal theory, whether in tort (including negligence),
contract, or otherwise, unless required by applicable law (such as deliberate
and grossly negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special, incidental,
or consequential damages of any character arising as a result of this License or
out of the use or inability to use the Work (including but not limited to
damages for loss of goodwill, work stoppage, computer failure or malfunction, or
any and all other commercial damages or losses), even if such Contributor has
been advised of the possibility of such damages.
#### 9. Accepting Warranty or Additional Liability
While redistributing the Work or Derivative Works thereof, You may choose to
offer, and charge a fee for, acceptance of support, warranty, indemnity, or
other liability obligations and/or rights consistent with this License. However,
in accepting such obligations, You may act only on Your own behalf and on Your
sole responsibility, not on behalf of any other Contributor, and only if You
agree to indemnify, defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason of your
accepting any such warranty or additional liability.
_END OF TERMS AND CONDITIONS_
### APPENDIX: How to apply the Apache License to your work
To apply the Apache License to your work, attach the following boilerplate
notice, with the fields enclosed by brackets `[]` replaced with your own
identifying information. (Don't include the brackets!) The text should be
enclosed in the appropriate comment syntax for the file format. We also
recommend that a file or class name and description of purpose be included on
the same “printed page” as the copyright notice for easier identification within
third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@ -0,0 +1,195 @@
Apache License
==============
_Version 2.0, January 2004_
_&lt;<http://www.apache.org/licenses/>&gt;_
### Terms and Conditions for use, reproduction, and distribution
#### 1. Definitions
“License” shall mean the terms and conditions for use, reproduction, and
distribution as defined by Sections 1 through 9 of this document.
“Licensor” shall mean the copyright owner or entity authorized by the copyright
owner that is granting the License.
“Legal Entity” shall mean the union of the acting entity and all other entities
that control, are controlled by, or are under common control with that entity.
For the purposes of this definition, “control” means **(i)** the power, direct or
indirect, to cause the direction or management of such entity, whether by
contract or otherwise, or **(ii)** ownership of fifty percent (50%) or more of the
outstanding shares, or **(iii)** beneficial ownership of such entity.
“You” (or “Your”) shall mean an individual or Legal Entity exercising
permissions granted by this License.
“Source” form shall mean the preferred form for making modifications, including
but not limited to software source code, documentation source, and configuration
files.
“Object” form shall mean any form resulting from mechanical transformation or
translation of a Source form, including but not limited to compiled object code,
generated documentation, and conversions to other media types.
“Work” shall mean the work of authorship, whether in Source or Object form, made
available under the License, as indicated by a copyright notice that is included
in or attached to the work (an example is provided in the Appendix below).
“Derivative Works” shall mean any work, whether in Source or Object form, that
is based on (or derived from) the Work and for which the editorial revisions,
annotations, elaborations, or other modifications represent, as a whole, an
original work of authorship. For the purposes of this License, Derivative Works
shall not include works that remain separable from, or merely link (or bind by
name) to the interfaces of, the Work and Derivative Works thereof.
“Contribution” shall mean any work of authorship, including the original version
of the Work and any modifications or additions to that Work or Derivative Works
thereof, that is intentionally submitted to Licensor for inclusion in the Work
by the copyright owner or by an individual or Legal Entity authorized to submit
on behalf of the copyright owner. For the purposes of this definition,
“submitted” means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems, and
issue tracking systems that are managed by, or on behalf of, the Licensor for
the purpose of discussing and improving the Work, but excluding communication
that is conspicuously marked or otherwise designated in writing by the copyright
owner as “Not a Contribution.”
“Contributor” shall mean Licensor and any individual or Legal Entity on behalf
of whom a Contribution has been received by Licensor and subsequently
incorporated within the Work.
#### 2. Grant of Copyright License
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the Work and such
Derivative Works in Source or Object form.
#### 3. Grant of Patent License
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable (except as stated in this section) patent license to make, have
made, use, offer to sell, sell, import, and otherwise transfer the Work, where
such license applies only to those patent claims licensable by such Contributor
that are necessarily infringed by their Contribution(s) alone or by combination
of their Contribution(s) with the Work to which such Contribution(s) was
submitted. If You institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work or a
Contribution incorporated within the Work constitutes direct or contributory
patent infringement, then any patent licenses granted to You under this License
for that Work shall terminate as of the date such litigation is filed.
#### 4. Redistribution
You may reproduce and distribute copies of the Work or Derivative Works thereof
in any medium, with or without modifications, and in Source or Object form,
provided that You meet the following conditions:
* **(a)** You must give any other recipients of the Work or Derivative Works a copy of
this License; and
* **(b)** You must cause any modified files to carry prominent notices stating that You
changed the files; and
* **(c)** You must retain, in the Source form of any Derivative Works that You distribute,
all copyright, patent, trademark, and attribution notices from the Source form
of the Work, excluding those notices that do not pertain to any part of the
Derivative Works; and
* **(d)** If the Work includes a “NOTICE” text file as part of its distribution, then any
Derivative Works that You distribute must include a readable copy of the
attribution notices contained within such NOTICE file, excluding those notices
that do not pertain to any part of the Derivative Works, in at least one of the
following places: within a NOTICE text file distributed as part of the
Derivative Works; within the Source form or documentation, if provided along
with the Derivative Works; or, within a display generated by the Derivative
Works, if and wherever such third-party notices normally appear. The contents of
the NOTICE file are for informational purposes only and do not modify the
License. You may add Your own attribution notices within Derivative Works that
You distribute, alongside or as an addendum to the NOTICE text from the Work,
provided that such additional attribution notices cannot be construed as
modifying the License.
You may add Your own copyright statement to Your modifications and may provide
additional or different license terms and conditions for use, reproduction, or
distribution of Your modifications, or for any such Derivative Works as a whole,
provided Your use, reproduction, and distribution of the Work otherwise complies
with the conditions stated in this License.
#### 5. Submission of Contributions
Unless You explicitly state otherwise, any Contribution intentionally submitted
for inclusion in the Work by You to the Licensor shall be under the terms and
conditions of this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify the terms of
any separate license agreement you may have executed with Licensor regarding
such Contributions.
#### 6. Trademarks
This License does not grant permission to use the trade names, trademarks,
service marks, or product names of the Licensor, except as required for
reasonable and customary use in describing the origin of the Work and
reproducing the content of the NOTICE file.
#### 7. Disclaimer of Warranty
Unless required by applicable law or agreed to in writing, Licensor provides the
Work (and each Contributor provides its Contributions) on an “AS IS” BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
including, without limitation, any warranties or conditions of TITLE,
NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
solely responsible for determining the appropriateness of using or
redistributing the Work and assume any risks associated with Your exercise of
permissions under this License.
#### 8. Limitation of Liability
In no event and under no legal theory, whether in tort (including negligence),
contract, or otherwise, unless required by applicable law (such as deliberate
and grossly negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special, incidental,
or consequential damages of any character arising as a result of this License or
out of the use or inability to use the Work (including but not limited to
damages for loss of goodwill, work stoppage, computer failure or malfunction, or
any and all other commercial damages or losses), even if such Contributor has
been advised of the possibility of such damages.
#### 9. Accepting Warranty or Additional Liability
While redistributing the Work or Derivative Works thereof, You may choose to
offer, and charge a fee for, acceptance of support, warranty, indemnity, or
other liability obligations and/or rights consistent with this License. However,
in accepting such obligations, You may act only on Your own behalf and on Your
sole responsibility, not on behalf of any other Contributor, and only if You
agree to indemnify, defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason of your
accepting any such warranty or additional liability.
_END OF TERMS AND CONDITIONS_
### APPENDIX: How to apply the Apache License to your work
To apply the Apache License to your work, attach the following boilerplate
notice, with the fields enclosed by brackets `[]` replaced with your own
identifying information. (Don't include the brackets!) The text should be
enclosed in the appropriate comment syntax for the file format. We also
recommend that a file or class name and description of purpose be included on
the same “printed page” as the copyright notice for easier identification within
third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@ -0,0 +1,195 @@
Apache License
==============
_Version 2.0, January 2004_
_&lt;<http://www.apache.org/licenses/>&gt;_
### Terms and Conditions for use, reproduction, and distribution
#### 1. Definitions
“License” shall mean the terms and conditions for use, reproduction, and
distribution as defined by Sections 1 through 9 of this document.
“Licensor” shall mean the copyright owner or entity authorized by the copyright
owner that is granting the License.
“Legal Entity” shall mean the union of the acting entity and all other entities
that control, are controlled by, or are under common control with that entity.
For the purposes of this definition, “control” means **(i)** the power, direct or
indirect, to cause the direction or management of such entity, whether by
contract or otherwise, or **(ii)** ownership of fifty percent (50%) or more of the
outstanding shares, or **(iii)** beneficial ownership of such entity.
“You” (or “Your”) shall mean an individual or Legal Entity exercising
permissions granted by this License.
“Source” form shall mean the preferred form for making modifications, including
but not limited to software source code, documentation source, and configuration
files.
“Object” form shall mean any form resulting from mechanical transformation or
translation of a Source form, including but not limited to compiled object code,
generated documentation, and conversions to other media types.
“Work” shall mean the work of authorship, whether in Source or Object form, made
available under the License, as indicated by a copyright notice that is included
in or attached to the work (an example is provided in the Appendix below).
“Derivative Works” shall mean any work, whether in Source or Object form, that
is based on (or derived from) the Work and for which the editorial revisions,
annotations, elaborations, or other modifications represent, as a whole, an
original work of authorship. For the purposes of this License, Derivative Works
shall not include works that remain separable from, or merely link (or bind by
name) to the interfaces of, the Work and Derivative Works thereof.
“Contribution” shall mean any work of authorship, including the original version
of the Work and any modifications or additions to that Work or Derivative Works
thereof, that is intentionally submitted to Licensor for inclusion in the Work
by the copyright owner or by an individual or Legal Entity authorized to submit
on behalf of the copyright owner. For the purposes of this definition,
“submitted” means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems, and
issue tracking systems that are managed by, or on behalf of, the Licensor for
the purpose of discussing and improving the Work, but excluding communication
that is conspicuously marked or otherwise designated in writing by the copyright
owner as “Not a Contribution.”
“Contributor” shall mean Licensor and any individual or Legal Entity on behalf
of whom a Contribution has been received by Licensor and subsequently
incorporated within the Work.
#### 2. Grant of Copyright License
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the Work and such
Derivative Works in Source or Object form.
#### 3. Grant of Patent License
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable (except as stated in this section) patent license to make, have
made, use, offer to sell, sell, import, and otherwise transfer the Work, where
such license applies only to those patent claims licensable by such Contributor
that are necessarily infringed by their Contribution(s) alone or by combination
of their Contribution(s) with the Work to which such Contribution(s) was
submitted. If You institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work or a
Contribution incorporated within the Work constitutes direct or contributory
patent infringement, then any patent licenses granted to You under this License
for that Work shall terminate as of the date such litigation is filed.
#### 4. Redistribution
You may reproduce and distribute copies of the Work or Derivative Works thereof
in any medium, with or without modifications, and in Source or Object form,
provided that You meet the following conditions:
* **(a)** You must give any other recipients of the Work or Derivative Works a copy of
this License; and
* **(b)** You must cause any modified files to carry prominent notices stating that You
changed the files; and
* **(c)** You must retain, in the Source form of any Derivative Works that You distribute,
all copyright, patent, trademark, and attribution notices from the Source form
of the Work, excluding those notices that do not pertain to any part of the
Derivative Works; and
* **(d)** If the Work includes a “NOTICE” text file as part of its distribution, then any
Derivative Works that You distribute must include a readable copy of the
attribution notices contained within such NOTICE file, excluding those notices
that do not pertain to any part of the Derivative Works, in at least one of the
following places: within a NOTICE text file distributed as part of the
Derivative Works; within the Source form or documentation, if provided along
with the Derivative Works; or, within a display generated by the Derivative
Works, if and wherever such third-party notices normally appear. The contents of
the NOTICE file are for informational purposes only and do not modify the
License. You may add Your own attribution notices within Derivative Works that
You distribute, alongside or as an addendum to the NOTICE text from the Work,
provided that such additional attribution notices cannot be construed as
modifying the License.
You may add Your own copyright statement to Your modifications and may provide
additional or different license terms and conditions for use, reproduction, or
distribution of Your modifications, or for any such Derivative Works as a whole,
provided Your use, reproduction, and distribution of the Work otherwise complies
with the conditions stated in this License.
#### 5. Submission of Contributions
Unless You explicitly state otherwise, any Contribution intentionally submitted
for inclusion in the Work by You to the Licensor shall be under the terms and
conditions of this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify the terms of
any separate license agreement you may have executed with Licensor regarding
such Contributions.
#### 6. Trademarks
This License does not grant permission to use the trade names, trademarks,
service marks, or product names of the Licensor, except as required for
reasonable and customary use in describing the origin of the Work and
reproducing the content of the NOTICE file.
#### 7. Disclaimer of Warranty
Unless required by applicable law or agreed to in writing, Licensor provides the
Work (and each Contributor provides its Contributions) on an “AS IS” BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
including, without limitation, any warranties or conditions of TITLE,
NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
solely responsible for determining the appropriateness of using or
redistributing the Work and assume any risks associated with Your exercise of
permissions under this License.
#### 8. Limitation of Liability
In no event and under no legal theory, whether in tort (including negligence),
contract, or otherwise, unless required by applicable law (such as deliberate
and grossly negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special, incidental,
or consequential damages of any character arising as a result of this License or
out of the use or inability to use the Work (including but not limited to
damages for loss of goodwill, work stoppage, computer failure or malfunction, or
any and all other commercial damages or losses), even if such Contributor has
been advised of the possibility of such damages.
#### 9. Accepting Warranty or Additional Liability
While redistributing the Work or Derivative Works thereof, You may choose to
offer, and charge a fee for, acceptance of support, warranty, indemnity, or
other liability obligations and/or rights consistent with this License. However,
in accepting such obligations, You may act only on Your own behalf and on Your
sole responsibility, not on behalf of any other Contributor, and only if You
agree to indemnify, defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason of your
accepting any such warranty or additional liability.
_END OF TERMS AND CONDITIONS_
### APPENDIX: How to apply the Apache License to your work
To apply the Apache License to your work, attach the following boilerplate
notice, with the fields enclosed by brackets `[]` replaced with your own
identifying information. (Don't include the brackets!) The text should be
enclosed in the appropriate comment syntax for the file format. We also
recommend that a file or class name and description of purpose be included on
the same “printed page” as the copyright notice for easier identification within
third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@ -0,0 +1,195 @@
Apache License
==============
_Version 2.0, January 2004_
_&lt;<http://www.apache.org/licenses/>&gt;_
### Terms and Conditions for use, reproduction, and distribution
#### 1. Definitions
“License” shall mean the terms and conditions for use, reproduction, and
distribution as defined by Sections 1 through 9 of this document.
“Licensor” shall mean the copyright owner or entity authorized by the copyright
owner that is granting the License.
“Legal Entity” shall mean the union of the acting entity and all other entities
that control, are controlled by, or are under common control with that entity.
For the purposes of this definition, “control” means **(i)** the power, direct or
indirect, to cause the direction or management of such entity, whether by
contract or otherwise, or **(ii)** ownership of fifty percent (50%) or more of the
outstanding shares, or **(iii)** beneficial ownership of such entity.
“You” (or “Your”) shall mean an individual or Legal Entity exercising
permissions granted by this License.
“Source” form shall mean the preferred form for making modifications, including
but not limited to software source code, documentation source, and configuration
files.
“Object” form shall mean any form resulting from mechanical transformation or
translation of a Source form, including but not limited to compiled object code,
generated documentation, and conversions to other media types.
“Work” shall mean the work of authorship, whether in Source or Object form, made
available under the License, as indicated by a copyright notice that is included
in or attached to the work (an example is provided in the Appendix below).
“Derivative Works” shall mean any work, whether in Source or Object form, that
is based on (or derived from) the Work and for which the editorial revisions,
annotations, elaborations, or other modifications represent, as a whole, an
original work of authorship. For the purposes of this License, Derivative Works
shall not include works that remain separable from, or merely link (or bind by
name) to the interfaces of, the Work and Derivative Works thereof.
“Contribution” shall mean any work of authorship, including the original version
of the Work and any modifications or additions to that Work or Derivative Works
thereof, that is intentionally submitted to Licensor for inclusion in the Work
by the copyright owner or by an individual or Legal Entity authorized to submit
on behalf of the copyright owner. For the purposes of this definition,
“submitted” means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems, and
issue tracking systems that are managed by, or on behalf of, the Licensor for
the purpose of discussing and improving the Work, but excluding communication
that is conspicuously marked or otherwise designated in writing by the copyright
owner as “Not a Contribution.”
“Contributor” shall mean Licensor and any individual or Legal Entity on behalf
of whom a Contribution has been received by Licensor and subsequently
incorporated within the Work.
#### 2. Grant of Copyright License
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the Work and such
Derivative Works in Source or Object form.
#### 3. Grant of Patent License
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable (except as stated in this section) patent license to make, have
made, use, offer to sell, sell, import, and otherwise transfer the Work, where
such license applies only to those patent claims licensable by such Contributor
that are necessarily infringed by their Contribution(s) alone or by combination
of their Contribution(s) with the Work to which such Contribution(s) was
submitted. If You institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work or a
Contribution incorporated within the Work constitutes direct or contributory
patent infringement, then any patent licenses granted to You under this License
for that Work shall terminate as of the date such litigation is filed.
#### 4. Redistribution
You may reproduce and distribute copies of the Work or Derivative Works thereof
in any medium, with or without modifications, and in Source or Object form,
provided that You meet the following conditions:
* **(a)** You must give any other recipients of the Work or Derivative Works a copy of
this License; and
* **(b)** You must cause any modified files to carry prominent notices stating that You
changed the files; and
* **(c)** You must retain, in the Source form of any Derivative Works that You distribute,
all copyright, patent, trademark, and attribution notices from the Source form
of the Work, excluding those notices that do not pertain to any part of the
Derivative Works; and
* **(d)** If the Work includes a “NOTICE” text file as part of its distribution, then any
Derivative Works that You distribute must include a readable copy of the
attribution notices contained within such NOTICE file, excluding those notices
that do not pertain to any part of the Derivative Works, in at least one of the
following places: within a NOTICE text file distributed as part of the
Derivative Works; within the Source form or documentation, if provided along
with the Derivative Works; or, within a display generated by the Derivative
Works, if and wherever such third-party notices normally appear. The contents of
the NOTICE file are for informational purposes only and do not modify the
License. You may add Your own attribution notices within Derivative Works that
You distribute, alongside or as an addendum to the NOTICE text from the Work,
provided that such additional attribution notices cannot be construed as
modifying the License.
You may add Your own copyright statement to Your modifications and may provide
additional or different license terms and conditions for use, reproduction, or
distribution of Your modifications, or for any such Derivative Works as a whole,
provided Your use, reproduction, and distribution of the Work otherwise complies
with the conditions stated in this License.
#### 5. Submission of Contributions
Unless You explicitly state otherwise, any Contribution intentionally submitted
for inclusion in the Work by You to the Licensor shall be under the terms and
conditions of this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify the terms of
any separate license agreement you may have executed with Licensor regarding
such Contributions.
#### 6. Trademarks
This License does not grant permission to use the trade names, trademarks,
service marks, or product names of the Licensor, except as required for
reasonable and customary use in describing the origin of the Work and
reproducing the content of the NOTICE file.
#### 7. Disclaimer of Warranty
Unless required by applicable law or agreed to in writing, Licensor provides the
Work (and each Contributor provides its Contributions) on an “AS IS” BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
including, without limitation, any warranties or conditions of TITLE,
NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
solely responsible for determining the appropriateness of using or
redistributing the Work and assume any risks associated with Your exercise of
permissions under this License.
#### 8. Limitation of Liability
In no event and under no legal theory, whether in tort (including negligence),
contract, or otherwise, unless required by applicable law (such as deliberate
and grossly negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special, incidental,
or consequential damages of any character arising as a result of this License or
out of the use or inability to use the Work (including but not limited to
damages for loss of goodwill, work stoppage, computer failure or malfunction, or
any and all other commercial damages or losses), even if such Contributor has
been advised of the possibility of such damages.
#### 9. Accepting Warranty or Additional Liability
While redistributing the Work or Derivative Works thereof, You may choose to
offer, and charge a fee for, acceptance of support, warranty, indemnity, or
other liability obligations and/or rights consistent with this License. However,
in accepting such obligations, You may act only on Your own behalf and on Your
sole responsibility, not on behalf of any other Contributor, and only if You
agree to indemnify, defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason of your
accepting any such warranty or additional liability.
_END OF TERMS AND CONDITIONS_
### APPENDIX: How to apply the Apache License to your work
To apply the Apache License to your work, attach the following boilerplate
notice, with the fields enclosed by brackets `[]` replaced with your own
identifying information. (Don't include the brackets!) The text should be
enclosed in the appropriate comment syntax for the file format. We also
recommend that a file or class name and description of purpose be included on
the same “printed page” as the copyright notice for easier identification within
third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@ -0,0 +1,195 @@
Apache License
==============
_Version 2.0, January 2004_
_&lt;<http://www.apache.org/licenses/>&gt;_
### Terms and Conditions for use, reproduction, and distribution
#### 1. Definitions
“License” shall mean the terms and conditions for use, reproduction, and
distribution as defined by Sections 1 through 9 of this document.
“Licensor” shall mean the copyright owner or entity authorized by the copyright
owner that is granting the License.
“Legal Entity” shall mean the union of the acting entity and all other entities
that control, are controlled by, or are under common control with that entity.
For the purposes of this definition, “control” means **(i)** the power, direct or
indirect, to cause the direction or management of such entity, whether by
contract or otherwise, or **(ii)** ownership of fifty percent (50%) or more of the
outstanding shares, or **(iii)** beneficial ownership of such entity.
“You” (or “Your”) shall mean an individual or Legal Entity exercising
permissions granted by this License.
“Source” form shall mean the preferred form for making modifications, including
but not limited to software source code, documentation source, and configuration
files.
“Object” form shall mean any form resulting from mechanical transformation or
translation of a Source form, including but not limited to compiled object code,
generated documentation, and conversions to other media types.
“Work” shall mean the work of authorship, whether in Source or Object form, made
available under the License, as indicated by a copyright notice that is included
in or attached to the work (an example is provided in the Appendix below).
“Derivative Works” shall mean any work, whether in Source or Object form, that
is based on (or derived from) the Work and for which the editorial revisions,
annotations, elaborations, or other modifications represent, as a whole, an
original work of authorship. For the purposes of this License, Derivative Works
shall not include works that remain separable from, or merely link (or bind by
name) to the interfaces of, the Work and Derivative Works thereof.
“Contribution” shall mean any work of authorship, including the original version
of the Work and any modifications or additions to that Work or Derivative Works
thereof, that is intentionally submitted to Licensor for inclusion in the Work
by the copyright owner or by an individual or Legal Entity authorized to submit
on behalf of the copyright owner. For the purposes of this definition,
“submitted” means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems, and
issue tracking systems that are managed by, or on behalf of, the Licensor for
the purpose of discussing and improving the Work, but excluding communication
that is conspicuously marked or otherwise designated in writing by the copyright
owner as “Not a Contribution.”
“Contributor” shall mean Licensor and any individual or Legal Entity on behalf
of whom a Contribution has been received by Licensor and subsequently
incorporated within the Work.
#### 2. Grant of Copyright License
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the Work and such
Derivative Works in Source or Object form.
#### 3. Grant of Patent License
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable (except as stated in this section) patent license to make, have
made, use, offer to sell, sell, import, and otherwise transfer the Work, where
such license applies only to those patent claims licensable by such Contributor
that are necessarily infringed by their Contribution(s) alone or by combination
of their Contribution(s) with the Work to which such Contribution(s) was
submitted. If You institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work or a
Contribution incorporated within the Work constitutes direct or contributory
patent infringement, then any patent licenses granted to You under this License
for that Work shall terminate as of the date such litigation is filed.
#### 4. Redistribution
You may reproduce and distribute copies of the Work or Derivative Works thereof
in any medium, with or without modifications, and in Source or Object form,
provided that You meet the following conditions:
* **(a)** You must give any other recipients of the Work or Derivative Works a copy of
this License; and
* **(b)** You must cause any modified files to carry prominent notices stating that You
changed the files; and
* **(c)** You must retain, in the Source form of any Derivative Works that You distribute,
all copyright, patent, trademark, and attribution notices from the Source form
of the Work, excluding those notices that do not pertain to any part of the
Derivative Works; and
* **(d)** If the Work includes a “NOTICE” text file as part of its distribution, then any
Derivative Works that You distribute must include a readable copy of the
attribution notices contained within such NOTICE file, excluding those notices
that do not pertain to any part of the Derivative Works, in at least one of the
following places: within a NOTICE text file distributed as part of the
Derivative Works; within the Source form or documentation, if provided along
with the Derivative Works; or, within a display generated by the Derivative
Works, if and wherever such third-party notices normally appear. The contents of
the NOTICE file are for informational purposes only and do not modify the
License. You may add Your own attribution notices within Derivative Works that
You distribute, alongside or as an addendum to the NOTICE text from the Work,
provided that such additional attribution notices cannot be construed as
modifying the License.
You may add Your own copyright statement to Your modifications and may provide
additional or different license terms and conditions for use, reproduction, or
distribution of Your modifications, or for any such Derivative Works as a whole,
provided Your use, reproduction, and distribution of the Work otherwise complies
with the conditions stated in this License.
#### 5. Submission of Contributions
Unless You explicitly state otherwise, any Contribution intentionally submitted
for inclusion in the Work by You to the Licensor shall be under the terms and
conditions of this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify the terms of
any separate license agreement you may have executed with Licensor regarding
such Contributions.
#### 6. Trademarks
This License does not grant permission to use the trade names, trademarks,
service marks, or product names of the Licensor, except as required for
reasonable and customary use in describing the origin of the Work and
reproducing the content of the NOTICE file.
#### 7. Disclaimer of Warranty
Unless required by applicable law or agreed to in writing, Licensor provides the
Work (and each Contributor provides its Contributions) on an “AS IS” BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
including, without limitation, any warranties or conditions of TITLE,
NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
solely responsible for determining the appropriateness of using or
redistributing the Work and assume any risks associated with Your exercise of
permissions under this License.
#### 8. Limitation of Liability
In no event and under no legal theory, whether in tort (including negligence),
contract, or otherwise, unless required by applicable law (such as deliberate
and grossly negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special, incidental,
or consequential damages of any character arising as a result of this License or
out of the use or inability to use the Work (including but not limited to
damages for loss of goodwill, work stoppage, computer failure or malfunction, or
any and all other commercial damages or losses), even if such Contributor has
been advised of the possibility of such damages.
#### 9. Accepting Warranty or Additional Liability
While redistributing the Work or Derivative Works thereof, You may choose to
offer, and charge a fee for, acceptance of support, warranty, indemnity, or
other liability obligations and/or rights consistent with this License. However,
in accepting such obligations, You may act only on Your own behalf and on Your
sole responsibility, not on behalf of any other Contributor, and only if You
agree to indemnify, defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason of your
accepting any such warranty or additional liability.
_END OF TERMS AND CONDITIONS_
### APPENDIX: How to apply the Apache License to your work
To apply the Apache License to your work, attach the following boilerplate
notice, with the fields enclosed by brackets `[]` replaced with your own
identifying information. (Don't include the brackets!) The text should be
enclosed in the appropriate comment syntax for the file format. We also
recommend that a file or class name and description of purpose be included on
the same “printed page” as the copyright notice for easier identification within
third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@ -2,6 +2,8 @@ description: Galaxycore GC9A01 round display panel
bus: spi bus: spi
include: ["display.yaml"]
compatible: "galaxycore,gc9a01" compatible: "galaxycore,gc9a01"
properties: properties:

View File

@ -9,9 +9,13 @@ extern "C" {
#include <stdbool.h> #include <stdbool.h>
#include <tactility/device.h> #include <tactility/device.h>
#include <tactility/drivers/display.h>
#include <tactility/drivers/gpio.h> #include <tactility/drivers/gpio.h>
struct Gc9a01Config { struct Gc9a01Config {
// From display.yaml: a DisplayShapeType value and the corner radius for rounded displays
uint8_t shape;
uint16_t corner_radius;
uint16_t horizontal_resolution; uint16_t horizontal_resolution;
uint16_t vertical_resolution; uint16_t vertical_resolution;
int32_t gap_x; int32_t gap_x;

View File

@ -316,6 +316,11 @@ static error_t gc9a01_get_backlight(Device* device, Device** backlight) {
// endregion // endregion
static void gc9a01_get_shape(Device* device, DisplayShape* shape) {
const auto* config = GET_CONFIG(device);
*shape = { .shape = config->shape, .corner_radius = config->corner_radius };
}
static const DisplayApi gc9a01_display_api = { static const DisplayApi gc9a01_display_api = {
.capabilities = DISPLAY_CAPABILITY_CAP_MIRROR | DISPLAY_CAPABILITY_CAP_SWAP_XY | .capabilities = DISPLAY_CAPABILITY_CAP_MIRROR | DISPLAY_CAPABILITY_CAP_SWAP_XY |
DISPLAY_CAPABILITY_CAP_SET_GAP | DISPLAY_CAPABILITY_INVERT_COLOR | DISPLAY_CAPABILITY_ON_OFF | DISPLAY_CAPABILITY_CAP_SET_GAP | DISPLAY_CAPABILITY_INVERT_COLOR | DISPLAY_CAPABILITY_ON_OFF |
@ -343,6 +348,7 @@ static const DisplayApi gc9a01_display_api = {
.get_frame_buffer_count = nullptr, .get_frame_buffer_count = nullptr,
.get_backlight = gc9a01_get_backlight, .get_backlight = gc9a01_get_backlight,
.has_capability = nullptr, .has_capability = nullptr,
.get_shape = gc9a01_get_shape,
}; };
Driver gc9a01_driver = { Driver gc9a01_driver = {

View File

@ -2,6 +2,8 @@ description: Jadard JD9853 display panel
bus: spi bus: spi
include: ["display.yaml"]
compatible: "jadard,jd9853" compatible: "jadard,jd9853"
properties: properties:

View File

@ -9,9 +9,13 @@ extern "C" {
#include <stdbool.h> #include <stdbool.h>
#include <tactility/device.h> #include <tactility/device.h>
#include <tactility/drivers/display.h>
#include <tactility/drivers/gpio.h> #include <tactility/drivers/gpio.h>
struct Jd9853Config { struct Jd9853Config {
// From display.yaml: a DisplayShapeType value and the corner radius for rounded displays
uint8_t shape;
uint16_t corner_radius;
uint16_t horizontal_resolution; uint16_t horizontal_resolution;
uint16_t vertical_resolution; uint16_t vertical_resolution;
int32_t gap_x; int32_t gap_x;

View File

@ -329,6 +329,11 @@ static error_t jd9853_get_backlight(Device* device, Device** backlight) {
// endregion // endregion
static void jd9853_get_shape(Device* device, DisplayShape* shape) {
const auto* config = GET_CONFIG(device);
*shape = { .shape = config->shape, .corner_radius = config->corner_radius };
}
static const DisplayApi jd9853_display_api = { static const DisplayApi jd9853_display_api = {
.capabilities = DISPLAY_CAPABILITY_CAP_MIRROR | DISPLAY_CAPABILITY_CAP_SWAP_XY | .capabilities = DISPLAY_CAPABILITY_CAP_MIRROR | DISPLAY_CAPABILITY_CAP_SWAP_XY |
DISPLAY_CAPABILITY_CAP_SET_GAP | DISPLAY_CAPABILITY_INVERT_COLOR | DISPLAY_CAPABILITY_ON_OFF | DISPLAY_CAPABILITY_CAP_SET_GAP | DISPLAY_CAPABILITY_INVERT_COLOR | DISPLAY_CAPABILITY_ON_OFF |
@ -356,6 +361,7 @@ static const DisplayApi jd9853_display_api = {
.get_frame_buffer_count = nullptr, .get_frame_buffer_count = nullptr,
.get_backlight = jd9853_get_backlight, .get_backlight = jd9853_get_backlight,
.has_capability = nullptr, .has_capability = nullptr,
.get_shape = jd9853_get_shape,
}; };
Driver jd9853_driver = { Driver jd9853_driver = {

View File

@ -0,0 +1,195 @@
Apache License
==============
_Version 2.0, January 2004_
_&lt;<http://www.apache.org/licenses/>&gt;_
### Terms and Conditions for use, reproduction, and distribution
#### 1. Definitions
“License” shall mean the terms and conditions for use, reproduction, and
distribution as defined by Sections 1 through 9 of this document.
“Licensor” shall mean the copyright owner or entity authorized by the copyright
owner that is granting the License.
“Legal Entity” shall mean the union of the acting entity and all other entities
that control, are controlled by, or are under common control with that entity.
For the purposes of this definition, “control” means **(i)** the power, direct or
indirect, to cause the direction or management of such entity, whether by
contract or otherwise, or **(ii)** ownership of fifty percent (50%) or more of the
outstanding shares, or **(iii)** beneficial ownership of such entity.
“You” (or “Your”) shall mean an individual or Legal Entity exercising
permissions granted by this License.
“Source” form shall mean the preferred form for making modifications, including
but not limited to software source code, documentation source, and configuration
files.
“Object” form shall mean any form resulting from mechanical transformation or
translation of a Source form, including but not limited to compiled object code,
generated documentation, and conversions to other media types.
“Work” shall mean the work of authorship, whether in Source or Object form, made
available under the License, as indicated by a copyright notice that is included
in or attached to the work (an example is provided in the Appendix below).
“Derivative Works” shall mean any work, whether in Source or Object form, that
is based on (or derived from) the Work and for which the editorial revisions,
annotations, elaborations, or other modifications represent, as a whole, an
original work of authorship. For the purposes of this License, Derivative Works
shall not include works that remain separable from, or merely link (or bind by
name) to the interfaces of, the Work and Derivative Works thereof.
“Contribution” shall mean any work of authorship, including the original version
of the Work and any modifications or additions to that Work or Derivative Works
thereof, that is intentionally submitted to Licensor for inclusion in the Work
by the copyright owner or by an individual or Legal Entity authorized to submit
on behalf of the copyright owner. For the purposes of this definition,
“submitted” means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems, and
issue tracking systems that are managed by, or on behalf of, the Licensor for
the purpose of discussing and improving the Work, but excluding communication
that is conspicuously marked or otherwise designated in writing by the copyright
owner as “Not a Contribution.”
“Contributor” shall mean Licensor and any individual or Legal Entity on behalf
of whom a Contribution has been received by Licensor and subsequently
incorporated within the Work.
#### 2. Grant of Copyright License
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the Work and such
Derivative Works in Source or Object form.
#### 3. Grant of Patent License
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable (except as stated in this section) patent license to make, have
made, use, offer to sell, sell, import, and otherwise transfer the Work, where
such license applies only to those patent claims licensable by such Contributor
that are necessarily infringed by their Contribution(s) alone or by combination
of their Contribution(s) with the Work to which such Contribution(s) was
submitted. If You institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work or a
Contribution incorporated within the Work constitutes direct or contributory
patent infringement, then any patent licenses granted to You under this License
for that Work shall terminate as of the date such litigation is filed.
#### 4. Redistribution
You may reproduce and distribute copies of the Work or Derivative Works thereof
in any medium, with or without modifications, and in Source or Object form,
provided that You meet the following conditions:
* **(a)** You must give any other recipients of the Work or Derivative Works a copy of
this License; and
* **(b)** You must cause any modified files to carry prominent notices stating that You
changed the files; and
* **(c)** You must retain, in the Source form of any Derivative Works that You distribute,
all copyright, patent, trademark, and attribution notices from the Source form
of the Work, excluding those notices that do not pertain to any part of the
Derivative Works; and
* **(d)** If the Work includes a “NOTICE” text file as part of its distribution, then any
Derivative Works that You distribute must include a readable copy of the
attribution notices contained within such NOTICE file, excluding those notices
that do not pertain to any part of the Derivative Works, in at least one of the
following places: within a NOTICE text file distributed as part of the
Derivative Works; within the Source form or documentation, if provided along
with the Derivative Works; or, within a display generated by the Derivative
Works, if and wherever such third-party notices normally appear. The contents of
the NOTICE file are for informational purposes only and do not modify the
License. You may add Your own attribution notices within Derivative Works that
You distribute, alongside or as an addendum to the NOTICE text from the Work,
provided that such additional attribution notices cannot be construed as
modifying the License.
You may add Your own copyright statement to Your modifications and may provide
additional or different license terms and conditions for use, reproduction, or
distribution of Your modifications, or for any such Derivative Works as a whole,
provided Your use, reproduction, and distribution of the Work otherwise complies
with the conditions stated in this License.
#### 5. Submission of Contributions
Unless You explicitly state otherwise, any Contribution intentionally submitted
for inclusion in the Work by You to the Licensor shall be under the terms and
conditions of this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify the terms of
any separate license agreement you may have executed with Licensor regarding
such Contributions.
#### 6. Trademarks
This License does not grant permission to use the trade names, trademarks,
service marks, or product names of the Licensor, except as required for
reasonable and customary use in describing the origin of the Work and
reproducing the content of the NOTICE file.
#### 7. Disclaimer of Warranty
Unless required by applicable law or agreed to in writing, Licensor provides the
Work (and each Contributor provides its Contributions) on an “AS IS” BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
including, without limitation, any warranties or conditions of TITLE,
NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
solely responsible for determining the appropriateness of using or
redistributing the Work and assume any risks associated with Your exercise of
permissions under this License.
#### 8. Limitation of Liability
In no event and under no legal theory, whether in tort (including negligence),
contract, or otherwise, unless required by applicable law (such as deliberate
and grossly negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special, incidental,
or consequential damages of any character arising as a result of this License or
out of the use or inability to use the Work (including but not limited to
damages for loss of goodwill, work stoppage, computer failure or malfunction, or
any and all other commercial damages or losses), even if such Contributor has
been advised of the possibility of such damages.
#### 9. Accepting Warranty or Additional Liability
While redistributing the Work or Derivative Works thereof, You may choose to
offer, and charge a fee for, acceptance of support, warranty, indemnity, or
other liability obligations and/or rights consistent with this License. However,
in accepting such obligations, You may act only on Your own behalf and on Your
sole responsibility, not on behalf of any other Contributor, and only if You
agree to indemnify, defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason of your
accepting any such warranty or additional liability.
_END OF TERMS AND CONDITIONS_
### APPENDIX: How to apply the Apache License to your work
To apply the Apache License to your work, attach the following boilerplate
notice, with the fields enclosed by brackets `[]` replaced with your own
identifying information. (Don't include the brackets!) The text should be
enclosed in the appropriate comment syntax for the file format. We also
recommend that a file or class name and description of purpose be included on
the same “printed page” as the copyright notice for easier identification within
third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@ -0,0 +1,195 @@
Apache License
==============
_Version 2.0, January 2004_
_&lt;<http://www.apache.org/licenses/>&gt;_
### Terms and Conditions for use, reproduction, and distribution
#### 1. Definitions
“License” shall mean the terms and conditions for use, reproduction, and
distribution as defined by Sections 1 through 9 of this document.
“Licensor” shall mean the copyright owner or entity authorized by the copyright
owner that is granting the License.
“Legal Entity” shall mean the union of the acting entity and all other entities
that control, are controlled by, or are under common control with that entity.
For the purposes of this definition, “control” means **(i)** the power, direct or
indirect, to cause the direction or management of such entity, whether by
contract or otherwise, or **(ii)** ownership of fifty percent (50%) or more of the
outstanding shares, or **(iii)** beneficial ownership of such entity.
“You” (or “Your”) shall mean an individual or Legal Entity exercising
permissions granted by this License.
“Source” form shall mean the preferred form for making modifications, including
but not limited to software source code, documentation source, and configuration
files.
“Object” form shall mean any form resulting from mechanical transformation or
translation of a Source form, including but not limited to compiled object code,
generated documentation, and conversions to other media types.
“Work” shall mean the work of authorship, whether in Source or Object form, made
available under the License, as indicated by a copyright notice that is included
in or attached to the work (an example is provided in the Appendix below).
“Derivative Works” shall mean any work, whether in Source or Object form, that
is based on (or derived from) the Work and for which the editorial revisions,
annotations, elaborations, or other modifications represent, as a whole, an
original work of authorship. For the purposes of this License, Derivative Works
shall not include works that remain separable from, or merely link (or bind by
name) to the interfaces of, the Work and Derivative Works thereof.
“Contribution” shall mean any work of authorship, including the original version
of the Work and any modifications or additions to that Work or Derivative Works
thereof, that is intentionally submitted to Licensor for inclusion in the Work
by the copyright owner or by an individual or Legal Entity authorized to submit
on behalf of the copyright owner. For the purposes of this definition,
“submitted” means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems, and
issue tracking systems that are managed by, or on behalf of, the Licensor for
the purpose of discussing and improving the Work, but excluding communication
that is conspicuously marked or otherwise designated in writing by the copyright
owner as “Not a Contribution.”
“Contributor” shall mean Licensor and any individual or Legal Entity on behalf
of whom a Contribution has been received by Licensor and subsequently
incorporated within the Work.
#### 2. Grant of Copyright License
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the Work and such
Derivative Works in Source or Object form.
#### 3. Grant of Patent License
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable (except as stated in this section) patent license to make, have
made, use, offer to sell, sell, import, and otherwise transfer the Work, where
such license applies only to those patent claims licensable by such Contributor
that are necessarily infringed by their Contribution(s) alone or by combination
of their Contribution(s) with the Work to which such Contribution(s) was
submitted. If You institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work or a
Contribution incorporated within the Work constitutes direct or contributory
patent infringement, then any patent licenses granted to You under this License
for that Work shall terminate as of the date such litigation is filed.
#### 4. Redistribution
You may reproduce and distribute copies of the Work or Derivative Works thereof
in any medium, with or without modifications, and in Source or Object form,
provided that You meet the following conditions:
* **(a)** You must give any other recipients of the Work or Derivative Works a copy of
this License; and
* **(b)** You must cause any modified files to carry prominent notices stating that You
changed the files; and
* **(c)** You must retain, in the Source form of any Derivative Works that You distribute,
all copyright, patent, trademark, and attribution notices from the Source form
of the Work, excluding those notices that do not pertain to any part of the
Derivative Works; and
* **(d)** If the Work includes a “NOTICE” text file as part of its distribution, then any
Derivative Works that You distribute must include a readable copy of the
attribution notices contained within such NOTICE file, excluding those notices
that do not pertain to any part of the Derivative Works, in at least one of the
following places: within a NOTICE text file distributed as part of the
Derivative Works; within the Source form or documentation, if provided along
with the Derivative Works; or, within a display generated by the Derivative
Works, if and wherever such third-party notices normally appear. The contents of
the NOTICE file are for informational purposes only and do not modify the
License. You may add Your own attribution notices within Derivative Works that
You distribute, alongside or as an addendum to the NOTICE text from the Work,
provided that such additional attribution notices cannot be construed as
modifying the License.
You may add Your own copyright statement to Your modifications and may provide
additional or different license terms and conditions for use, reproduction, or
distribution of Your modifications, or for any such Derivative Works as a whole,
provided Your use, reproduction, and distribution of the Work otherwise complies
with the conditions stated in this License.
#### 5. Submission of Contributions
Unless You explicitly state otherwise, any Contribution intentionally submitted
for inclusion in the Work by You to the Licensor shall be under the terms and
conditions of this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify the terms of
any separate license agreement you may have executed with Licensor regarding
such Contributions.
#### 6. Trademarks
This License does not grant permission to use the trade names, trademarks,
service marks, or product names of the Licensor, except as required for
reasonable and customary use in describing the origin of the Work and
reproducing the content of the NOTICE file.
#### 7. Disclaimer of Warranty
Unless required by applicable law or agreed to in writing, Licensor provides the
Work (and each Contributor provides its Contributions) on an “AS IS” BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
including, without limitation, any warranties or conditions of TITLE,
NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
solely responsible for determining the appropriateness of using or
redistributing the Work and assume any risks associated with Your exercise of
permissions under this License.
#### 8. Limitation of Liability
In no event and under no legal theory, whether in tort (including negligence),
contract, or otherwise, unless required by applicable law (such as deliberate
and grossly negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special, incidental,
or consequential damages of any character arising as a result of this License or
out of the use or inability to use the Work (including but not limited to
damages for loss of goodwill, work stoppage, computer failure or malfunction, or
any and all other commercial damages or losses), even if such Contributor has
been advised of the possibility of such damages.
#### 9. Accepting Warranty or Additional Liability
While redistributing the Work or Derivative Works thereof, You may choose to
offer, and charge a fee for, acceptance of support, warranty, indemnity, or
other liability obligations and/or rights consistent with this License. However,
in accepting such obligations, You may act only on Your own behalf and on Your
sole responsibility, not on behalf of any other Contributor, and only if You
agree to indemnify, defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason of your
accepting any such warranty or additional liability.
_END OF TERMS AND CONDITIONS_
### APPENDIX: How to apply the Apache License to your work
To apply the Apache License to your work, attach the following boilerplate
notice, with the fields enclosed by brackets `[]` replaced with your own
identifying information. (Don't include the brackets!) The text should be
enclosed in the appropriate comment syntax for the file format. We also
recommend that a file or class name and description of purpose be included on
the same “printed page” as the copyright notice for easier identification within
third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@ -0,0 +1,195 @@
Apache License
==============
_Version 2.0, January 2004_
_&lt;<http://www.apache.org/licenses/>&gt;_
### Terms and Conditions for use, reproduction, and distribution
#### 1. Definitions
“License” shall mean the terms and conditions for use, reproduction, and
distribution as defined by Sections 1 through 9 of this document.
“Licensor” shall mean the copyright owner or entity authorized by the copyright
owner that is granting the License.
“Legal Entity” shall mean the union of the acting entity and all other entities
that control, are controlled by, or are under common control with that entity.
For the purposes of this definition, “control” means **(i)** the power, direct or
indirect, to cause the direction or management of such entity, whether by
contract or otherwise, or **(ii)** ownership of fifty percent (50%) or more of the
outstanding shares, or **(iii)** beneficial ownership of such entity.
“You” (or “Your”) shall mean an individual or Legal Entity exercising
permissions granted by this License.
“Source” form shall mean the preferred form for making modifications, including
but not limited to software source code, documentation source, and configuration
files.
“Object” form shall mean any form resulting from mechanical transformation or
translation of a Source form, including but not limited to compiled object code,
generated documentation, and conversions to other media types.
“Work” shall mean the work of authorship, whether in Source or Object form, made
available under the License, as indicated by a copyright notice that is included
in or attached to the work (an example is provided in the Appendix below).
“Derivative Works” shall mean any work, whether in Source or Object form, that
is based on (or derived from) the Work and for which the editorial revisions,
annotations, elaborations, or other modifications represent, as a whole, an
original work of authorship. For the purposes of this License, Derivative Works
shall not include works that remain separable from, or merely link (or bind by
name) to the interfaces of, the Work and Derivative Works thereof.
“Contribution” shall mean any work of authorship, including the original version
of the Work and any modifications or additions to that Work or Derivative Works
thereof, that is intentionally submitted to Licensor for inclusion in the Work
by the copyright owner or by an individual or Legal Entity authorized to submit
on behalf of the copyright owner. For the purposes of this definition,
“submitted” means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems, and
issue tracking systems that are managed by, or on behalf of, the Licensor for
the purpose of discussing and improving the Work, but excluding communication
that is conspicuously marked or otherwise designated in writing by the copyright
owner as “Not a Contribution.”
“Contributor” shall mean Licensor and any individual or Legal Entity on behalf
of whom a Contribution has been received by Licensor and subsequently
incorporated within the Work.
#### 2. Grant of Copyright License
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the Work and such
Derivative Works in Source or Object form.
#### 3. Grant of Patent License
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable (except as stated in this section) patent license to make, have
made, use, offer to sell, sell, import, and otherwise transfer the Work, where
such license applies only to those patent claims licensable by such Contributor
that are necessarily infringed by their Contribution(s) alone or by combination
of their Contribution(s) with the Work to which such Contribution(s) was
submitted. If You institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work or a
Contribution incorporated within the Work constitutes direct or contributory
patent infringement, then any patent licenses granted to You under this License
for that Work shall terminate as of the date such litigation is filed.
#### 4. Redistribution
You may reproduce and distribute copies of the Work or Derivative Works thereof
in any medium, with or without modifications, and in Source or Object form,
provided that You meet the following conditions:
* **(a)** You must give any other recipients of the Work or Derivative Works a copy of
this License; and
* **(b)** You must cause any modified files to carry prominent notices stating that You
changed the files; and
* **(c)** You must retain, in the Source form of any Derivative Works that You distribute,
all copyright, patent, trademark, and attribution notices from the Source form
of the Work, excluding those notices that do not pertain to any part of the
Derivative Works; and
* **(d)** If the Work includes a “NOTICE” text file as part of its distribution, then any
Derivative Works that You distribute must include a readable copy of the
attribution notices contained within such NOTICE file, excluding those notices
that do not pertain to any part of the Derivative Works, in at least one of the
following places: within a NOTICE text file distributed as part of the
Derivative Works; within the Source form or documentation, if provided along
with the Derivative Works; or, within a display generated by the Derivative
Works, if and wherever such third-party notices normally appear. The contents of
the NOTICE file are for informational purposes only and do not modify the
License. You may add Your own attribution notices within Derivative Works that
You distribute, alongside or as an addendum to the NOTICE text from the Work,
provided that such additional attribution notices cannot be construed as
modifying the License.
You may add Your own copyright statement to Your modifications and may provide
additional or different license terms and conditions for use, reproduction, or
distribution of Your modifications, or for any such Derivative Works as a whole,
provided Your use, reproduction, and distribution of the Work otherwise complies
with the conditions stated in this License.
#### 5. Submission of Contributions
Unless You explicitly state otherwise, any Contribution intentionally submitted
for inclusion in the Work by You to the Licensor shall be under the terms and
conditions of this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify the terms of
any separate license agreement you may have executed with Licensor regarding
such Contributions.
#### 6. Trademarks
This License does not grant permission to use the trade names, trademarks,
service marks, or product names of the Licensor, except as required for
reasonable and customary use in describing the origin of the Work and
reproducing the content of the NOTICE file.
#### 7. Disclaimer of Warranty
Unless required by applicable law or agreed to in writing, Licensor provides the
Work (and each Contributor provides its Contributions) on an “AS IS” BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
including, without limitation, any warranties or conditions of TITLE,
NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
solely responsible for determining the appropriateness of using or
redistributing the Work and assume any risks associated with Your exercise of
permissions under this License.
#### 8. Limitation of Liability
In no event and under no legal theory, whether in tort (including negligence),
contract, or otherwise, unless required by applicable law (such as deliberate
and grossly negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special, incidental,
or consequential damages of any character arising as a result of this License or
out of the use or inability to use the Work (including but not limited to
damages for loss of goodwill, work stoppage, computer failure or malfunction, or
any and all other commercial damages or losses), even if such Contributor has
been advised of the possibility of such damages.
#### 9. Accepting Warranty or Additional Liability
While redistributing the Work or Derivative Works thereof, You may choose to
offer, and charge a fee for, acceptance of support, warranty, indemnity, or
other liability obligations and/or rights consistent with this License. However,
in accepting such obligations, You may act only on Your own behalf and on Your
sole responsibility, not on behalf of any other Contributor, and only if You
agree to indemnify, defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason of your
accepting any such warranty or additional liability.
_END OF TERMS AND CONDITIONS_
### APPENDIX: How to apply the Apache License to your work
To apply the Apache License to your work, attach the following boilerplate
notice, with the fields enclosed by brackets `[]` replaced with your own
identifying information. (Don't include the brackets!) The text should be
enclosed in the appropriate comment syntax for the file format. We also
recommend that a file or class name and description of purpose be included on
the same “printed page” as the copyright notice for easier identification within
third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@ -13,7 +13,7 @@ These applications are not part of the Tactility operating system's main firmwar
The intentions behind picking the licenses for the subprojects: The intentions behind picking the licenses for the subprojects:
1. Forks of the entire Tactility project required to be open source as: GPL v3.0 applies to the main firmware projects (see `Firmware/` and `Tactility/`). 1. Forks of the entire Tactility project required to be open source as: GPL v3.0 applies to the main firmware project (see `Tactility/`).
2. It should be possible to make closed source external applications using TactilitySDK and the libraries it includes (it must exclude software with a GPL license). 2. It should be possible to make closed source external applications using TactilitySDK and the libraries it includes (it must exclude software with a GPL license).
3. It should be possible to make closed source forks that only contain TactilityKernel, the platform implementations (`Platforms/*`) and most of the device and driver implementations. As few as possible driver and device combinations should prevent this. 3. It should be possible to make closed source forks that only contain TactilityKernel, the platform implementations (`Platforms/*`) and most of the device and driver implementations. As few as possible driver and device combinations should prevent this.
@ -30,12 +30,12 @@ The license texts that are relevant to this document:
**IMPORTANT:** This document may have inaccuracies. It mainly exists to create awareness about license differences. **IMPORTANT:** This document may have inaccuracies. It mainly exists to create awareness about license differences.
The top-level projects `Firmware/` and `Tactility/` are licensed under `GPL v3.0`. The top-level project `Tactility/` is licensed under `GPL v3.0`.
Most devices are licensed with `Apache License v2.0` while some are implemented as `GPL v3.0` until author consent is given to change the license. Most devices are licensed with `Apache License v2.0` while some are implemented as `GPL v3.0` until author consent is given to change the license.
New device implementations should be licensed under `Apache License v2.0`. New device implementations should be licensed under `Apache License v2.0`.
Most drivers have an `Apache License v2.0`, with exceptions such as `Drivers/gps-generic-module/`. Most drivers have an `Apache License v2.0`, with exceptions such as `Drivers/gps-meshtastic-module/`.
Licensing may also differ for subprojects intended for use in external applications. Licensing may also differ for subprojects intended for use in external applications.
Driver subprojects aren't generally used directly in external app projects, but if they are, make sure to check their licenses. Driver subprojects aren't generally used directly in external app projects, but if they are, make sure to check their licenses.
@ -65,7 +65,6 @@ Below is an overview of the licenses of some of the subprojects.
| Project | License | | Project | License |
|--------------------|-------------------------| |--------------------|-------------------------|
| Tactility | GNU Public License v3.0 | | Tactility | GNU Public License v3.0 |
| TactilityC | Apache License v2.0 |
| TactilityFreeRTOS | Apache License v2.0 | | TactilityFreeRTOS | Apache License v2.0 |
| TactilityKernel | Apache License v2.0 | | TactilityKernel | Apache License v2.0 |
| Tests | (varies) | | Tests | (varies) |

View File

@ -28,7 +28,7 @@ enum AppCategory {
/** Bit flags for AppManifest::flags. */ /** Bit flags for AppManifest::flags. */
enum AppManifestFlags { enum AppManifestFlags {
/** Excluded from generic app-browsing UIs (e.g. AppList, Settings) */ /** Excluded from generic app-browsing UIs (e.g. Launcher, Settings) */
APP_MANIFEST_FLAG_HIDDEN = 1 << 0, APP_MANIFEST_FLAG_HIDDEN = 1 << 0,
/** No window-manager dependency. Safe to start from a context with no GUI available. */ /** No window-manager dependency. Safe to start from a context with no GUI available. */
APP_MANIFEST_FLAG_HEADLESS = 1 << 1, APP_MANIFEST_FLAG_HEADLESS = 1 << 1,

View File

@ -0,0 +1,195 @@
Apache License
==============
_Version 2.0, January 2004_
_&lt;<http://www.apache.org/licenses/>&gt;_
### Terms and Conditions for use, reproduction, and distribution
#### 1. Definitions
“License” shall mean the terms and conditions for use, reproduction, and
distribution as defined by Sections 1 through 9 of this document.
“Licensor” shall mean the copyright owner or entity authorized by the copyright
owner that is granting the License.
“Legal Entity” shall mean the union of the acting entity and all other entities
that control, are controlled by, or are under common control with that entity.
For the purposes of this definition, “control” means **(i)** the power, direct or
indirect, to cause the direction or management of such entity, whether by
contract or otherwise, or **(ii)** ownership of fifty percent (50%) or more of the
outstanding shares, or **(iii)** beneficial ownership of such entity.
“You” (or “Your”) shall mean an individual or Legal Entity exercising
permissions granted by this License.
“Source” form shall mean the preferred form for making modifications, including
but not limited to software source code, documentation source, and configuration
files.
“Object” form shall mean any form resulting from mechanical transformation or
translation of a Source form, including but not limited to compiled object code,
generated documentation, and conversions to other media types.
“Work” shall mean the work of authorship, whether in Source or Object form, made
available under the License, as indicated by a copyright notice that is included
in or attached to the work (an example is provided in the Appendix below).
“Derivative Works” shall mean any work, whether in Source or Object form, that
is based on (or derived from) the Work and for which the editorial revisions,
annotations, elaborations, or other modifications represent, as a whole, an
original work of authorship. For the purposes of this License, Derivative Works
shall not include works that remain separable from, or merely link (or bind by
name) to the interfaces of, the Work and Derivative Works thereof.
“Contribution” shall mean any work of authorship, including the original version
of the Work and any modifications or additions to that Work or Derivative Works
thereof, that is intentionally submitted to Licensor for inclusion in the Work
by the copyright owner or by an individual or Legal Entity authorized to submit
on behalf of the copyright owner. For the purposes of this definition,
“submitted” means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems, and
issue tracking systems that are managed by, or on behalf of, the Licensor for
the purpose of discussing and improving the Work, but excluding communication
that is conspicuously marked or otherwise designated in writing by the copyright
owner as “Not a Contribution.”
“Contributor” shall mean Licensor and any individual or Legal Entity on behalf
of whom a Contribution has been received by Licensor and subsequently
incorporated within the Work.
#### 2. Grant of Copyright License
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the Work and such
Derivative Works in Source or Object form.
#### 3. Grant of Patent License
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable (except as stated in this section) patent license to make, have
made, use, offer to sell, sell, import, and otherwise transfer the Work, where
such license applies only to those patent claims licensable by such Contributor
that are necessarily infringed by their Contribution(s) alone or by combination
of their Contribution(s) with the Work to which such Contribution(s) was
submitted. If You institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work or a
Contribution incorporated within the Work constitutes direct or contributory
patent infringement, then any patent licenses granted to You under this License
for that Work shall terminate as of the date such litigation is filed.
#### 4. Redistribution
You may reproduce and distribute copies of the Work or Derivative Works thereof
in any medium, with or without modifications, and in Source or Object form,
provided that You meet the following conditions:
* **(a)** You must give any other recipients of the Work or Derivative Works a copy of
this License; and
* **(b)** You must cause any modified files to carry prominent notices stating that You
changed the files; and
* **(c)** You must retain, in the Source form of any Derivative Works that You distribute,
all copyright, patent, trademark, and attribution notices from the Source form
of the Work, excluding those notices that do not pertain to any part of the
Derivative Works; and
* **(d)** If the Work includes a “NOTICE” text file as part of its distribution, then any
Derivative Works that You distribute must include a readable copy of the
attribution notices contained within such NOTICE file, excluding those notices
that do not pertain to any part of the Derivative Works, in at least one of the
following places: within a NOTICE text file distributed as part of the
Derivative Works; within the Source form or documentation, if provided along
with the Derivative Works; or, within a display generated by the Derivative
Works, if and wherever such third-party notices normally appear. The contents of
the NOTICE file are for informational purposes only and do not modify the
License. You may add Your own attribution notices within Derivative Works that
You distribute, alongside or as an addendum to the NOTICE text from the Work,
provided that such additional attribution notices cannot be construed as
modifying the License.
You may add Your own copyright statement to Your modifications and may provide
additional or different license terms and conditions for use, reproduction, or
distribution of Your modifications, or for any such Derivative Works as a whole,
provided Your use, reproduction, and distribution of the Work otherwise complies
with the conditions stated in this License.
#### 5. Submission of Contributions
Unless You explicitly state otherwise, any Contribution intentionally submitted
for inclusion in the Work by You to the Licensor shall be under the terms and
conditions of this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify the terms of
any separate license agreement you may have executed with Licensor regarding
such Contributions.
#### 6. Trademarks
This License does not grant permission to use the trade names, trademarks,
service marks, or product names of the Licensor, except as required for
reasonable and customary use in describing the origin of the Work and
reproducing the content of the NOTICE file.
#### 7. Disclaimer of Warranty
Unless required by applicable law or agreed to in writing, Licensor provides the
Work (and each Contributor provides its Contributions) on an “AS IS” BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
including, without limitation, any warranties or conditions of TITLE,
NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
solely responsible for determining the appropriateness of using or
redistributing the Work and assume any risks associated with Your exercise of
permissions under this License.
#### 8. Limitation of Liability
In no event and under no legal theory, whether in tort (including negligence),
contract, or otherwise, unless required by applicable law (such as deliberate
and grossly negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special, incidental,
or consequential damages of any character arising as a result of this License or
out of the use or inability to use the Work (including but not limited to
damages for loss of goodwill, work stoppage, computer failure or malfunction, or
any and all other commercial damages or losses), even if such Contributor has
been advised of the possibility of such damages.
#### 9. Accepting Warranty or Additional Liability
While redistributing the Work or Derivative Works thereof, You may choose to
offer, and charge a fee for, acceptance of support, warranty, indemnity, or
other liability obligations and/or rights consistent with this License. However,
in accepting such obligations, You may act only on Your own behalf and on Your
sole responsibility, not on behalf of any other Contributor, and only if You
agree to indemnify, defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason of your
accepting any such warranty or additional liability.
_END OF TERMS AND CONDITIONS_
### APPENDIX: How to apply the Apache License to your work
To apply the Apache License to your work, attach the following boilerplate
notice, with the fields enclosed by brackets `[]` replaced with your own
identifying information. (Don't include the brackets!) The text should be
enclosed in the appropriate comment syntax for the file format. We also
recommend that a file or class name and description of purpose be included on
the same “printed page” as the copyright notice for easier identification within
third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@ -0,0 +1,195 @@
Apache License
==============
_Version 2.0, January 2004_
_&lt;<http://www.apache.org/licenses/>&gt;_
### Terms and Conditions for use, reproduction, and distribution
#### 1. Definitions
“License” shall mean the terms and conditions for use, reproduction, and
distribution as defined by Sections 1 through 9 of this document.
“Licensor” shall mean the copyright owner or entity authorized by the copyright
owner that is granting the License.
“Legal Entity” shall mean the union of the acting entity and all other entities
that control, are controlled by, or are under common control with that entity.
For the purposes of this definition, “control” means **(i)** the power, direct or
indirect, to cause the direction or management of such entity, whether by
contract or otherwise, or **(ii)** ownership of fifty percent (50%) or more of the
outstanding shares, or **(iii)** beneficial ownership of such entity.
“You” (or “Your”) shall mean an individual or Legal Entity exercising
permissions granted by this License.
“Source” form shall mean the preferred form for making modifications, including
but not limited to software source code, documentation source, and configuration
files.
“Object” form shall mean any form resulting from mechanical transformation or
translation of a Source form, including but not limited to compiled object code,
generated documentation, and conversions to other media types.
“Work” shall mean the work of authorship, whether in Source or Object form, made
available under the License, as indicated by a copyright notice that is included
in or attached to the work (an example is provided in the Appendix below).
“Derivative Works” shall mean any work, whether in Source or Object form, that
is based on (or derived from) the Work and for which the editorial revisions,
annotations, elaborations, or other modifications represent, as a whole, an
original work of authorship. For the purposes of this License, Derivative Works
shall not include works that remain separable from, or merely link (or bind by
name) to the interfaces of, the Work and Derivative Works thereof.
“Contribution” shall mean any work of authorship, including the original version
of the Work and any modifications or additions to that Work or Derivative Works
thereof, that is intentionally submitted to Licensor for inclusion in the Work
by the copyright owner or by an individual or Legal Entity authorized to submit
on behalf of the copyright owner. For the purposes of this definition,
“submitted” means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems, and
issue tracking systems that are managed by, or on behalf of, the Licensor for
the purpose of discussing and improving the Work, but excluding communication
that is conspicuously marked or otherwise designated in writing by the copyright
owner as “Not a Contribution.”
“Contributor” shall mean Licensor and any individual or Legal Entity on behalf
of whom a Contribution has been received by Licensor and subsequently
incorporated within the Work.
#### 2. Grant of Copyright License
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the Work and such
Derivative Works in Source or Object form.
#### 3. Grant of Patent License
Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable (except as stated in this section) patent license to make, have
made, use, offer to sell, sell, import, and otherwise transfer the Work, where
such license applies only to those patent claims licensable by such Contributor
that are necessarily infringed by their Contribution(s) alone or by combination
of their Contribution(s) with the Work to which such Contribution(s) was
submitted. If You institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work or a
Contribution incorporated within the Work constitutes direct or contributory
patent infringement, then any patent licenses granted to You under this License
for that Work shall terminate as of the date such litigation is filed.
#### 4. Redistribution
You may reproduce and distribute copies of the Work or Derivative Works thereof
in any medium, with or without modifications, and in Source or Object form,
provided that You meet the following conditions:
* **(a)** You must give any other recipients of the Work or Derivative Works a copy of
this License; and
* **(b)** You must cause any modified files to carry prominent notices stating that You
changed the files; and
* **(c)** You must retain, in the Source form of any Derivative Works that You distribute,
all copyright, patent, trademark, and attribution notices from the Source form
of the Work, excluding those notices that do not pertain to any part of the
Derivative Works; and
* **(d)** If the Work includes a “NOTICE” text file as part of its distribution, then any
Derivative Works that You distribute must include a readable copy of the
attribution notices contained within such NOTICE file, excluding those notices
that do not pertain to any part of the Derivative Works, in at least one of the
following places: within a NOTICE text file distributed as part of the
Derivative Works; within the Source form or documentation, if provided along
with the Derivative Works; or, within a display generated by the Derivative
Works, if and wherever such third-party notices normally appear. The contents of
the NOTICE file are for informational purposes only and do not modify the
License. You may add Your own attribution notices within Derivative Works that
You distribute, alongside or as an addendum to the NOTICE text from the Work,
provided that such additional attribution notices cannot be construed as
modifying the License.
You may add Your own copyright statement to Your modifications and may provide
additional or different license terms and conditions for use, reproduction, or
distribution of Your modifications, or for any such Derivative Works as a whole,
provided Your use, reproduction, and distribution of the Work otherwise complies
with the conditions stated in this License.
#### 5. Submission of Contributions
Unless You explicitly state otherwise, any Contribution intentionally submitted
for inclusion in the Work by You to the Licensor shall be under the terms and
conditions of this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify the terms of
any separate license agreement you may have executed with Licensor regarding
such Contributions.
#### 6. Trademarks
This License does not grant permission to use the trade names, trademarks,
service marks, or product names of the Licensor, except as required for
reasonable and customary use in describing the origin of the Work and
reproducing the content of the NOTICE file.
#### 7. Disclaimer of Warranty
Unless required by applicable law or agreed to in writing, Licensor provides the
Work (and each Contributor provides its Contributions) on an “AS IS” BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
including, without limitation, any warranties or conditions of TITLE,
NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
solely responsible for determining the appropriateness of using or
redistributing the Work and assume any risks associated with Your exercise of
permissions under this License.
#### 8. Limitation of Liability
In no event and under no legal theory, whether in tort (including negligence),
contract, or otherwise, unless required by applicable law (such as deliberate
and grossly negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special, incidental,
or consequential damages of any character arising as a result of this License or
out of the use or inability to use the Work (including but not limited to
damages for loss of goodwill, work stoppage, computer failure or malfunction, or
any and all other commercial damages or losses), even if such Contributor has
been advised of the possibility of such damages.
#### 9. Accepting Warranty or Additional Liability
While redistributing the Work or Derivative Works thereof, You may choose to
offer, and charge a fee for, acceptance of support, warranty, indemnity, or
other liability obligations and/or rights consistent with this License. However,
in accepting such obligations, You may act only on Your own behalf and on Your
sole responsibility, not on behalf of any other Contributor, and only if You
agree to indemnify, defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason of your
accepting any such warranty or additional liability.
_END OF TERMS AND CONDITIONS_
### APPENDIX: How to apply the Apache License to your work
To apply the Apache License to your work, attach the following boilerplate
notice, with the fields enclosed by brackets `[]` replaced with your own
identifying information. (Don't include the brackets!) The text should be
enclosed in the appropriate comment syntax for the file format. We also
recommend that a file or class name and description of purpose be included on
the same “printed page” as the copyright notice for easier identification within
third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@ -183,6 +183,7 @@ shared_symbol_code_point_names = [
statusbar_symbol_code_point_names = [ statusbar_symbol_code_point_names = [
# Location tracking # Location tracking
"location_on", "location_on",
"location_off",
# Development server # Development server
"cloud", "cloud",
# Low on available memory # Low on available memory

View File

@ -17,8 +17,8 @@ extern "C" {
* @brief Trackball operating mode. * @brief Trackball operating mode.
*/ */
enum LvglTrackballMode { enum LvglTrackballMode {
/** Navigation via enc_diff (scroll wheel behavior). No cursor is shown. */ /** Navigation with arrow keys, and the button as the enter key. No cursor is shown. */
LVGL_TRACKBALL_MODE_ENCODER, LVGL_TRACKBALL_MODE_KEYS,
/** Mouse cursor via point.x/point.y. A cursor is shown if an image was set via /** Mouse cursor via point.x/point.y. A cursor is shown if an image was set via
* lvgl_trackball_set_cursor_image(). */ * lvgl_trackball_set_cursor_image(). */
LVGL_TRACKBALL_MODE_POINTER LVGL_TRACKBALL_MODE_POINTER
@ -33,8 +33,8 @@ struct LvglTrackballSettings {
/** When false, movement and button presses are drained from the device and discarded: /** When false, movement and button presses are drained from the device and discarded:
* the indev reports no movement and stays released. */ * the indev reports no movement and stays released. */
bool enabled; bool enabled;
/** Encoder mode: steps per raw trackball tick. Must be >= 1. */ /** Keys mode: arrow key presses per raw trackball tick. Must be >= 1. */
uint8_t encoder_sensitivity; uint8_t key_sensitivity;
/** Pointer mode: pixels per raw trackball tick. Must be >= 1. */ /** Pointer mode: pixels per raw trackball tick. Must be >= 1. */
uint8_t pointer_sensitivity; uint8_t pointer_sensitivity;
}; };
@ -43,7 +43,7 @@ struct LvglTrackballSettings {
* @brief Creates an lv_indev_t bound to the given TRACKBALL_TYPE device and registers a read * @brief Creates an lv_indev_t bound to the given TRACKBALL_TYPE device and registers a read
* callback that polls the device through its TrackballApi. * callback that polls the device through its TrackballApi.
* *
* The indev starts in LVGL_TRACKBALL_MODE_ENCODER, enabled, with default sensitivities (see * The indev starts in LVGL_TRACKBALL_MODE_KEYS, enabled, with default sensitivities (see
* lvgl_trackball_settings_get_default()). Call lvgl_trackball_set_settings() to change this, * lvgl_trackball_settings_get_default()). Call lvgl_trackball_set_settings() to change this,
* e.g. to switch to pointer mode - each device added this way can independently run with or * e.g. to switch to pointer mode - each device added this way can independently run with or
* without pointer support. * without pointer support.
@ -68,8 +68,8 @@ error_t lvgl_trackball_add(struct Device* device, lv_display_t* display, lv_inde
void lvgl_trackball_remove(lv_indev_t* indev); void lvgl_trackball_remove(lv_indev_t* indev);
/** /**
* @return the default (all fields explicitly set) LvglTrackballSettings: encoder mode, enabled, * @return the default (all fields explicitly set) LvglTrackballSettings: keys mode, enabled,
* encoder_sensitivity 1, pointer_sensitivity 10. * key_sensitivity 1, pointer_sensitivity 10.
*/ */
struct LvglTrackballSettings lvgl_trackball_settings_get_default(void); struct LvglTrackballSettings lvgl_trackball_settings_get_default(void);

View File

@ -21,12 +21,19 @@ void lvgl_grid_navigation_add(lv_obj_t* container);
void lvgl_grid_navigation_remove(lv_obj_t* container); void lvgl_grid_navigation_remove(lv_obj_t* container);
/** /**
* @brief Moves the focus to the next or previous child in their order, for devices that can only step through widgets. * @brief Moves the focus to the next or previous widget, for devices that can only step through widgets.
* Past the last or first child, the focus moves to the next or previous object in the container's focus group. * The children of grid navigation containers are visited in their order: entering a container forwards focuses its first child, and backwards its last child.
* @param[in] container a container that was passed to lvgl_grid_navigation_add() * @param[in] group the focus group
* @param[in] next true for the next child, false for the previous child * @param[in] next true for the next widget, false for the previous widget
*/ */
void lvgl_grid_navigation_focus_next(lv_obj_t* container, bool next); void lvgl_grid_navigation_step(lv_group_t* group, bool next);
/**
* @brief Hides the selection that keys made, e.g. when the touchscreen is used. The focus stays where it is,
* and the next key that moves the focus shows the selection again.
* @param[in] group the focus group
*/
void lvgl_focus_hide_key_selection(lv_group_t* group);
/** /**
* @param[in] container a container that was passed to lvgl_grid_navigation_add() * @param[in] container a container that was passed to lvgl_grid_navigation_add()

View File

@ -9,7 +9,7 @@ extern "C" {
#endif #endif
/** Changes whenever the icon TTF subset, its codepoints file or the icon name lists change */ /** Changes whenever the icon TTF subset, its codepoints file or the icon name lists change */
#define LVGL_ICON_FONT_VERSION 0xEE67835Du #define LVGL_ICON_FONT_VERSION 0x1B608834u
// Icon names per icon font, resolved through the .codepoints file next to the TTF // Icon names per icon font, resolved through the .codepoints file next to the TTF
extern const char* const lvgl_icon_shared_names[]; extern const char* const lvgl_icon_shared_names[];

View File

@ -3,6 +3,7 @@
#pragma once #pragma once
#define LVGL_ICON_STATUSBAR_LOCATION_ON "\xEF\x87\x9B" #define LVGL_ICON_STATUSBAR_LOCATION_ON "\xEF\x87\x9B"
#define LVGL_ICON_STATUSBAR_LOCATION_OFF "\xEE\x83\x87"
#define LVGL_ICON_STATUSBAR_CLOUD "\xEF\x85\x9C" #define LVGL_ICON_STATUSBAR_CLOUD "\xEF\x85\x9C"
#define LVGL_ICON_STATUSBAR_MEMORY "\xEE\x8C\xA2" #define LVGL_ICON_STATUSBAR_MEMORY "\xEE\x8C\xA2"
#define LVGL_ICON_STATUSBAR_SD_CARD "\xEE\x98\xA3" #define LVGL_ICON_STATUSBAR_SD_CARD "\xEE\x98\xA3"

View File

@ -0,0 +1,55 @@
// SPDX-License-Identifier: Apache-2.0
#pragma once
#include <lvgl.h>
#include <tactility/drivers/display.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/** Margins in pixels on each side of a display */
typedef struct {
int32_t top;
int32_t bottom;
int32_t left;
int32_t right;
} LvglInsets;
/**
* @brief Gets the shape of the display's visible area.
* @param[in] display the display
* @param[out] out_shape the shape: a rectangle when the display doesn't report one
*/
void lvgl_display_get_shape(lv_display_t* display, struct DisplayShape* out_shape);
/**
* @brief Gets the margins that keep a rectangle inside the display's visible area.
* They're all zero for rectangular displays.
* @param[in] display the display
* @param[out] out_insets the margins
*/
void lvgl_display_get_insets(lv_display_t* display, LvglInsets* out_insets);
/**
* @brief Gets the horizontal margin on both sides of a row, for layouts that follow the display's edge.
* @param[in] display the display
* @param[in] y the row, in display coordinates
* @return the margin in pixels on the left and on the right of the row
*/
int32_t lvgl_display_get_row_inset(lv_display_t* display, int32_t y);
/**
* @brief Moves the object's content inward where it overlaps the curved edge of a round or rounded display.
* The extra horizontal padding is added to the object's current padding, and follows its size changes.
* Does nothing on rectangular displays.
* @param[in] obj the object, with its own padding already set
*/
void lvgl_obj_add_edge_padding(lv_obj_t* obj);
#ifdef __cplusplus
}
#endif

View File

@ -0,0 +1,37 @@
// SPDX-License-Identifier: Apache-2.0
#pragma once
#include <lvgl.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief Creates a page indicator: a row of dots with one dot per page, where the dot of the current page is filled.
* The theme determines the size and colour of the dots.
* When the dots are wider than the indicator's maximum width (lv_obj_set_style_max_width()), it shows the page number instead, e.g. "2/12".
* @param[in] parent the parent object
* @return the created page indicator
*/
lv_obj_t* lvgl_page_indicator_create(lv_obj_t* parent);
/**
* @brief Sets the number of pages, which is the number of dots.
* @param[in] obj the page indicator
* @param[in] count the number of pages
*/
void lvgl_page_indicator_set_page_count(lv_obj_t* obj, uint32_t count);
/**
* @brief Sets the current page, whose dot is filled.
* @param[in] obj the page indicator
* @param[in] page the zero-based index of the current page
*/
void lvgl_page_indicator_set_page(lv_obj_t* obj, uint32_t page);
#ifdef __cplusplus
}
#endif

View File

@ -4,9 +4,22 @@
extern "C" { extern "C" {
#endif #endif
#include <lvgl.h>
#include <stdint.h>
void lvgl_keyboard_on_start_lvgl(); void lvgl_keyboard_on_start_lvgl();
void lvgl_keyboard_on_stop_lvgl(); void lvgl_keyboard_on_stop_lvgl();
/**
* @brief Translates a key codepoint into the LVGL key for the object that the indev's group focuses.
* The arrow up and down keys move the focus to the previous and next widget, or within a grid navigation container.
* @param[in] indev the indev that reports the key
* @param[in] codepoint the key codepoint (see tactility/drivers/keyboard.h)
* @return the LVGL key
*/
uint32_t lvgl_keyboard_translate_key(lv_indev_t* indev, uint32_t codepoint);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -0,0 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
#pragma once
#include <lvgl/insets.h>
#include <tactility/drivers/display.h>
/** Calculates the insets of a display with the given shape and resolution */
LvglInsets lvgl_insets_calculate(const DisplayShape& shape, int32_t width, int32_t height);
/** Calculates the horizontal margin of a row of a display with the given shape and resolution */
int32_t lvgl_insets_calculate_row(const DisplayShape& shape, int32_t width, int32_t height, int32_t y);

View File

@ -1,6 +1,7 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
#include <lvgl/devices/keyboard.h> #include <lvgl/devices/keyboard.h>
#include <lvgl/devices/device_context.h> #include <lvgl/devices/device_context.h>
#include <lvgl/devices/keyboard_private.h>
#include <lvgl/grid_navigation.h> #include <lvgl/grid_navigation.h>
#include <lvgl/lvgl.h> #include <lvgl/lvgl.h>
@ -56,14 +57,26 @@ static uint32_t codepoint_to_lv_key(uint32_t key) {
case CODEPOINT_ARROW_UP: return LV_KEY_PREV; case CODEPOINT_ARROW_UP: return LV_KEY_PREV;
case CODEPOINT_ARROW_RIGHT: return LV_KEY_RIGHT; case CODEPOINT_ARROW_RIGHT: return LV_KEY_RIGHT;
case CODEPOINT_ARROW_DOWN: return LV_KEY_NEXT; case CODEPOINT_ARROW_DOWN: return LV_KEY_NEXT;
case CODEPOINT_FOCUS_NEXT: return LV_KEY_NEXT;
case CODEPOINT_FOCUS_PREVIOUS: return LV_KEY_PREV;
case CODEPOINT_HOME: return LV_KEY_HOME; case CODEPOINT_HOME: return LV_KEY_HOME;
case CODEPOINT_END: return LV_KEY_END; case CODEPOINT_END: return LV_KEY_END;
default: return key; default: return key;
} }
} }
uint32_t lvgl_keyboard_translate_key(lv_indev_t* indev, uint32_t codepoint) {
lv_group_t* group = lv_indev_get_group(indev);
lv_obj_t* focused = group != nullptr ? lv_group_get_focused(group) : nullptr;
if (lvgl_grid_navigation_is_container(focused)) {
// Grid navigation moves the focus in two dimensions with the arrow keys
if (codepoint == CODEPOINT_ARROW_UP) {
return LV_KEY_UP;
} else if (codepoint == CODEPOINT_ARROW_DOWN) {
return LV_KEY_DOWN;
}
}
return codepoint_to_lv_key(codepoint);
}
static void lvgl_keyboard_read_cb(lv_indev_t* indev, lv_indev_data_t* data) { static void lvgl_keyboard_read_cb(lv_indev_t* indev, lv_indev_data_t* data) {
auto* wrapper = static_cast<LvglDeviceContext*>(lv_indev_get_driver_data(indev)); auto* wrapper = static_cast<LvglDeviceContext*>(lv_indev_get_driver_data(indev));
@ -74,26 +87,19 @@ static void lvgl_keyboard_read_cb(lv_indev_t* indev, lv_indev_data_t* data) {
return; return;
} }
data->key = codepoint_to_lv_key(key_data.key);
lv_group_t* group = lv_indev_get_group(indev); lv_group_t* group = lv_indev_get_group(indev);
lv_obj_t* focused = group != nullptr ? lv_group_get_focused(group) : nullptr; if (key_data.key == CODEPOINT_FOCUS_NEXT || key_data.key == CODEPOINT_FOCUS_PREVIOUS) {
if (lvgl_grid_navigation_is_container(focused)) { // Devices that can only step through widgets also visit the children of grid navigation containers.
if (key_data.key == CODEPOINT_ARROW_UP) {
// Grid navigation moves the focus in two dimensions with the arrow keys
data->key = LV_KEY_UP;
} else if (key_data.key == CODEPOINT_ARROW_DOWN) {
data->key = LV_KEY_DOWN;
} else if (key_data.key == CODEPOINT_FOCUS_NEXT || key_data.key == CODEPOINT_FOCUS_PREVIOUS) {
// Devices that can only step through widgets visit the children in their order.
// LVGL doesn't see these keys: the group would skip the children, as only the container is in the group. // LVGL doesn't see these keys: the group would skip the children, as only the container is in the group.
if (key_data.pressed) { if (key_data.pressed && group != nullptr) {
lvgl_grid_navigation_focus_next(focused, key_data.key == CODEPOINT_FOCUS_NEXT); lvgl_grid_navigation_step(group, key_data.key == CODEPOINT_FOCUS_NEXT);
} }
data->state = LV_INDEV_STATE_RELEASED; data->state = LV_INDEV_STATE_RELEASED;
data->continue_reading = key_data.continue_reading; data->continue_reading = key_data.continue_reading;
return; return;
} }
}
data->key = lvgl_keyboard_translate_key(indev, key_data.key);
data->state = key_data.pressed ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; data->state = key_data.pressed ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED;
data->continue_reading = key_data.continue_reading; data->continue_reading = key_data.continue_reading;
} }

View File

@ -1,6 +1,7 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
#include <lvgl/devices/pointer.h> #include <lvgl/devices/pointer.h>
#include <lvgl/devices/device_context.h> #include <lvgl/devices/device_context.h>
#include <lvgl/grid_navigation.h>
#include <tactility/device.h> #include <tactility/device.h>
#include <tactility/drivers/pointer.h> #include <tactility/drivers/pointer.h>
@ -140,8 +141,8 @@ static void lvgl_pointer_pool_refresh(struct LvglPointerPool* pool, int32_t nati
// the touch controller reports points in a different order (no touch-ID/tracking field exists // the touch controller reports points in a different order (no touch-ID/tracking field exists
// anywhere in this stack - see esp_lcd_touch_get_coordinates()/PointerApi.get_touched_points()). // anywhere in this stack - see esp_lcd_touch_get_coordinates()/PointerApi.get_touched_points()).
// Unmatched raw points (new touches) claim the nearest inactive slot. Slots with no matching // Unmatched raw points (new touches) claim the nearest inactive slot. Slots with no matching
// point this round go inactive (RELEASED). // point this round go inactive (RELEASED). Returns true when a new touch started.
static void lvgl_pointer_pool_assign(struct LvglPointerPool* pool, int32_t native_x_max) { static bool lvgl_pointer_pool_assign(struct LvglPointerPool* pool, int32_t native_x_max) {
// Touch drivers clamp raw coordinates to the panel's configured native resolution regardless // Touch drivers clamp raw coordinates to the panel's configured native resolution regardless
// of calibration, so native_x_max is a valid scale reference for the distance cap even when calibration is disabled. // of calibration, so native_x_max is a valid scale reference for the distance cap even when calibration is disabled.
// Falls back to a conservative fixed pixel value if the display/resolution isn't available for some reason. // Falls back to a conservative fixed pixel value if the display/resolution isn't available for some reason.
@ -182,6 +183,7 @@ static void lvgl_pointer_pool_assign(struct LvglPointerPool* pool, int32_t nativ
// Second pass: any unclaimed raw point is a new touch - hand it to the first inactive slot // Second pass: any unclaimed raw point is a new touch - hand it to the first inactive slot
// that wasn't just released this round. // that wasn't just released this round.
bool touch_started = false;
for (uint8_t r = 0; r < pool->raw_count; r++) { for (uint8_t r = 0; r < pool->raw_count; r++) {
if (raw_claimed[r]) continue; if (raw_claimed[r]) continue;
for (uint8_t s = 0; s < pool->slot_count; s++) { for (uint8_t s = 0; s < pool->slot_count; s++) {
@ -190,9 +192,11 @@ static void lvgl_pointer_pool_assign(struct LvglPointerPool* pool, int32_t nativ
pool->slot_point[s].x = (lv_coord_t)pool->raw_x[r]; pool->slot_point[s].x = (lv_coord_t)pool->raw_x[r];
pool->slot_point[s].y = (lv_coord_t)pool->raw_y[r]; pool->slot_point[s].y = (lv_coord_t)pool->raw_y[r];
raw_claimed[r] = true; raw_claimed[r] = true;
touch_started = true;
break; break;
} }
} }
return touch_started;
} }
// The actual LVGL indev read callback, shared by every slot in the pool. Only the first slot to // The actual LVGL indev read callback, shared by every slot in the pool. Only the first slot to
@ -219,7 +223,11 @@ static void lvgl_pointer_read_cb(lv_indev_t* indev, lv_indev_data_t* data) {
int32_t native_x_max = display != NULL ? lv_display_get_original_horizontal_resolution(display) - 1 : 0; int32_t native_x_max = display != NULL ? lv_display_get_original_horizontal_resolution(display) - 1 : 0;
int32_t native_y_max = display != NULL ? lv_display_get_original_vertical_resolution(display) - 1 : 0; int32_t native_y_max = display != NULL ? lv_display_get_original_vertical_resolution(display) - 1 : 0;
lvgl_pointer_pool_refresh(pool, native_x_max, native_y_max); lvgl_pointer_pool_refresh(pool, native_x_max, native_y_max);
lvgl_pointer_pool_assign(pool, native_x_max); // A touch hides the selection that keys made, so it doesn't look like two widgets are selected.
// This runs before LVGL handles the press, so a widget that the touch focuses isn't affected.
if (lvgl_pointer_pool_assign(pool, native_x_max) && lv_group_get_default() != NULL) {
lvgl_focus_hide_key_selection(lv_group_get_default());
}
} }
pool->round_pos = (uint8_t)((pool->round_pos + 1) % pool->slot_count); pool->round_pos = (uint8_t)((pool->round_pos + 1) % pool->slot_count);

View File

@ -2,11 +2,16 @@
#include <lvgl/devices/trackball.h> #include <lvgl/devices/trackball.h>
#include <lvgl/devices/device_context.h> #include <lvgl/devices/device_context.h>
#include <lvgl/devices/keyboard.h> #include <lvgl/devices/keyboard.h>
#include <lvgl/devices/keyboard_private.h>
#include <lvgl/grid_navigation.h>
#include <lvgl/lvgl.h> #include <lvgl/lvgl.h>
#include <tactility/drivers/keyboard.h>
#include <tactility/drivers/trackball.h> #include <tactility/drivers/trackball.h>
#include <algorithm>
#include <cstdint> #include <cstdint>
#include <cstdlib>
constexpr auto* TAG = "lvgl_trackball"; constexpr auto* TAG = "lvgl_trackball";
@ -16,6 +21,13 @@ struct LvglTrackballCtx {
int32_t cursor_y; int32_t cursor_y;
lv_obj_t* cursor; lv_obj_t* cursor;
const void* cursor_image_src; const void* cursor_image_src;
// Keys mode: arrow key presses that are still to be reported
uint32_t pending_codepoint;
int32_t pending_count;
// Keys mode: the LVGL key that is reported as pressed, or 0
uint32_t pressed_key;
// Pointer mode: whether the button was pressed during the previous read
bool pointer_pressed;
}; };
static inline int32_t clamp(int32_t value, int32_t min_value, int32_t max_value) { static inline int32_t clamp(int32_t value, int32_t min_value, int32_t max_value) {
@ -68,6 +80,49 @@ static void hide_cursor(LvglTrackballCtx* ctx) {
lv_obj_add_flag(ctx->cursor, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(ctx->cursor, LV_OBJ_FLAG_HIDDEN);
} }
// Reports one key event per read: the button as the enter key, and movement as arrow key presses along its strongest axis.
static void read_keys(lv_indev_t* indev, LvglTrackballCtx* ctx, lv_indev_data_t* data, int32_t dx, int32_t dy, bool button_pressed) {
if (dx != 0 || dy != 0) {
uint32_t codepoint;
if (std::abs(dx) >= std::abs(dy)) {
codepoint = dx > 0 ? CODEPOINT_ARROW_RIGHT : CODEPOINT_ARROW_LEFT;
} else {
codepoint = dy > 0 ? CODEPOINT_ARROW_DOWN : CODEPOINT_ARROW_UP;
}
const int32_t steps = std::max(std::abs(dx), std::abs(dy)) * static_cast<int32_t>(ctx->settings.key_sensitivity);
// A change of direction drops the presses that weren't reported yet
if (codepoint != ctx->pending_codepoint) {
ctx->pending_codepoint = codepoint;
ctx->pending_count = 0;
}
ctx->pending_count = clamp(ctx->pending_count + steps, 0, INT16_MAX);
lv_display_trigger_activity(lv_indev_get_display(indev));
}
if (ctx->pressed_key == LV_KEY_ENTER && button_pressed) {
data->key = LV_KEY_ENTER;
data->state = LV_INDEV_STATE_PRESSED;
} else if (ctx->pressed_key != 0) {
// Every press is released before the next event, so LVGL sees each arrow key press
data->key = ctx->pressed_key;
data->state = LV_INDEV_STATE_RELEASED;
ctx->pressed_key = 0;
data->continue_reading = ctx->pending_count > 0;
} else if (button_pressed) {
ctx->pressed_key = LV_KEY_ENTER;
data->key = LV_KEY_ENTER;
data->state = LV_INDEV_STATE_PRESSED;
lv_display_trigger_activity(lv_indev_get_display(indev));
} else if (ctx->pending_count > 0) {
ctx->pending_count--;
ctx->pressed_key = lvgl_keyboard_translate_key(indev, ctx->pending_codepoint);
data->key = ctx->pressed_key;
data->state = LV_INDEV_STATE_PRESSED;
} else {
data->state = LV_INDEV_STATE_RELEASED;
}
}
static void lvgl_trackball_read_cb(lv_indev_t* indev, lv_indev_data_t* data) { static void lvgl_trackball_read_cb(lv_indev_t* indev, lv_indev_data_t* data) {
auto* wrapper = static_cast<LvglDeviceContext*>(lv_indev_get_driver_data(indev)); auto* wrapper = static_cast<LvglDeviceContext*>(lv_indev_get_driver_data(indev));
auto* ctx = static_cast<LvglTrackballCtx*>(wrapper->context); auto* ctx = static_cast<LvglTrackballCtx*>(wrapper->context);
@ -83,27 +138,30 @@ static void lvgl_trackball_read_cb(lv_indev_t* indev, lv_indev_data_t* data) {
lv_display_t* display = lv_indev_get_display(indev); lv_display_t* display = lv_indev_get_display(indev);
if (ctx->settings.mode == LVGL_TRACKBALL_MODE_ENCODER) { bool pressed = false;
int32_t ticks = (dx + dy) * static_cast<int32_t>(ctx->settings.encoder_sensitivity); if (ctx->settings.enabled) {
data->enc_diff = static_cast<int16_t>(clamp(ticks, INT16_MIN, INT16_MAX)); trackball_get_button_pressed(wrapper->device, &pressed);
if (ticks != 0) {
lv_display_trigger_activity(display);
} }
} else {
if (ctx->settings.mode == LVGL_TRACKBALL_MODE_KEYS) {
read_keys(indev, ctx, data, dx, dy, pressed);
return;
}
int32_t max_x = display != nullptr ? lv_display_get_original_horizontal_resolution(display) - 1 : 0; int32_t max_x = display != nullptr ? lv_display_get_original_horizontal_resolution(display) - 1 : 0;
int32_t max_y = display != nullptr ? lv_display_get_original_vertical_resolution(display) - 1 : 0; int32_t max_y = display != nullptr ? lv_display_get_original_vertical_resolution(display) - 1 : 0;
ctx->cursor_x = clamp(ctx->cursor_x + dx * static_cast<int32_t>(ctx->settings.pointer_sensitivity), 0, max_x); ctx->cursor_x = clamp(ctx->cursor_x + dx * static_cast<int32_t>(ctx->settings.pointer_sensitivity), 0, max_x);
ctx->cursor_y = clamp(ctx->cursor_y + dy * static_cast<int32_t>(ctx->settings.pointer_sensitivity), 0, max_y); ctx->cursor_y = clamp(ctx->cursor_y + dy * static_cast<int32_t>(ctx->settings.pointer_sensitivity), 0, max_y);
data->point.x = static_cast<int16_t>(ctx->cursor_x); data->point.x = static_cast<int16_t>(ctx->cursor_x);
data->point.y = static_cast<int16_t>(ctx->cursor_y); data->point.y = static_cast<int16_t>(ctx->cursor_y);
}
bool pressed = false;
if (ctx->settings.enabled) {
trackball_get_button_pressed(wrapper->device, &pressed);
}
data->state = pressed ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; data->state = pressed ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED;
// Like a touch, a click hides the selection that keys made
if (pressed && !ctx->pointer_pressed && lv_group_get_default() != nullptr) {
lvgl_focus_hide_key_selection(lv_group_get_default());
}
ctx->pointer_pressed = pressed;
if (pressed) { if (pressed) {
lv_display_trigger_activity(display); lv_display_trigger_activity(display);
} }
@ -113,9 +171,9 @@ extern "C" {
LvglTrackballSettings lvgl_trackball_settings_get_default() { LvglTrackballSettings lvgl_trackball_settings_get_default() {
return LvglTrackballSettings { return LvglTrackballSettings {
.mode = LVGL_TRACKBALL_MODE_ENCODER, .mode = LVGL_TRACKBALL_MODE_KEYS,
.enabled = true, .enabled = true,
.encoder_sensitivity = 1, .key_sensitivity = 1,
.pointer_sensitivity = 10, .pointer_sensitivity = 10,
}; };
} }
@ -147,7 +205,7 @@ error_t lvgl_trackball_add(struct Device* device, lv_display_t* display, lv_inde
return ERROR_OUT_OF_MEMORY; return ERROR_OUT_OF_MEMORY;
} }
lv_indev_set_type(indev, LV_INDEV_TYPE_ENCODER); lv_indev_set_type(indev, LV_INDEV_TYPE_KEYPAD);
lv_indev_set_read_cb(indev, lvgl_trackball_read_cb); lv_indev_set_read_cb(indev, lvgl_trackball_read_cb);
lv_indev_set_driver_data(indev, wrapper); lv_indev_set_driver_data(indev, wrapper);
if (display != nullptr) { if (display != nullptr) {
@ -155,10 +213,10 @@ error_t lvgl_trackball_add(struct Device* device, lv_display_t* display, lv_inde
} }
recenter_cursor(ctx, indev); recenter_cursor(ctx, indev);
// Encoder indevs are useless without a group (LVGL dispatch bails out immediately if indev->group is NULL) // Keypad indevs are useless without a group (LVGL dispatch bails out immediately if indev->group is NULL)
// Use the keyboard group for now, until it's refactored into a proper global/shared group. See ideas.md // Use the keyboard group for now, until it's refactored into a proper global/shared group. See ideas.md
// When refactoring this, you probably want to remove the calls to lvgl_keyboard_* below. // When refactoring this, you probably want to remove the calls to lvgl_keyboard_* below.
if (ctx->settings.mode == LVGL_TRACKBALL_MODE_ENCODER) { if (ctx->settings.mode == LVGL_TRACKBALL_MODE_KEYS) {
lvgl_keyboard_enable(indev); lvgl_keyboard_enable(indev);
} }
@ -188,8 +246,8 @@ error_t lvgl_trackball_set_settings(lv_indev_t* indev, const struct LvglTrackbal
} }
if ( if (
(settings->mode != LVGL_TRACKBALL_MODE_ENCODER && settings->mode != LVGL_TRACKBALL_MODE_POINTER) || (settings->mode != LVGL_TRACKBALL_MODE_KEYS && settings->mode != LVGL_TRACKBALL_MODE_POINTER) ||
settings->encoder_sensitivity == 0 || settings->key_sensitivity == 0 ||
settings->pointer_sensitivity == 0 settings->pointer_sensitivity == 0
) { ) {
return ERROR_INVALID_ARGUMENT; return ERROR_INVALID_ARGUMENT;
@ -203,6 +261,8 @@ error_t lvgl_trackball_set_settings(lv_indev_t* indev, const struct LvglTrackbal
ctx->settings = *settings; ctx->settings = *settings;
if (mode_changed) { if (mode_changed) {
ctx->pending_count = 0;
ctx->pressed_key = 0;
if (settings->mode == LVGL_TRACKBALL_MODE_POINTER) { if (settings->mode == LVGL_TRACKBALL_MODE_POINTER) {
lvgl_keyboard_disable(indev); lvgl_keyboard_disable(indev);
lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER); lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER);
@ -210,12 +270,12 @@ error_t lvgl_trackball_set_settings(lv_indev_t* indev, const struct LvglTrackbal
show_cursor(ctx, indev); show_cursor(ctx, indev);
} else { } else {
hide_cursor(ctx); hide_cursor(ctx);
lv_indev_set_type(indev, LV_INDEV_TYPE_ENCODER); lv_indev_set_type(indev, LV_INDEV_TYPE_KEYPAD);
lvgl_keyboard_enable(indev); lvgl_keyboard_enable(indev);
} }
} }
// Cursor visibility only tracks the enabled toggle in pointer mode - in encoder mode it must // Cursor visibility only tracks the enabled toggle in pointer mode - in keys mode it must
// stay hidden regardless of enabled, otherwise this unconditionally un-hides the cursor // stay hidden regardless of enabled, otherwise this unconditionally un-hides the cursor
// hide_cursor() just hid above (enabled is independent of mode, and defaults to true). // hide_cursor() just hid above (enabled is independent of mode, and defaults to true).
if (ctx->cursor != nullptr && ctx->settings.mode == LVGL_TRACKBALL_MODE_POINTER) { if (ctx->cursor != nullptr && ctx->settings.mode == LVGL_TRACKBALL_MODE_POINTER) {

View File

@ -19,8 +19,24 @@ static void on_child_created(lv_event_t* event) {
} }
} }
// Grid navigation shows the focused child as selected whenever the container gets the focus. That's only
// right when a key moved the focus there, not when it moved because e.g. the previously focused widget was deleted.
static void on_container_focused(lv_event_t* event) {
lv_indev_t* indev = lv_indev_active();
const lv_indev_type_t type = indev != nullptr ? lv_indev_get_type(indev) : LV_INDEV_TYPE_NONE;
if (type == LV_INDEV_TYPE_KEYPAD || type == LV_INDEV_TYPE_ENCODER) {
return;
}
lv_obj_t* child = lvgl_grid_navigation_get_focused(lv_event_get_current_target_obj(event));
if (child != nullptr) {
lv_obj_remove_state(child, LV_STATE_FOCUS_KEY);
}
}
void lvgl_grid_navigation_add(lv_obj_t* container) { void lvgl_grid_navigation_add(lv_obj_t* container) {
lv_gridnav_add(container, LV_GRIDNAV_CTRL_NONE); lv_gridnav_add(container, LV_GRIDNAV_CTRL_NONE);
// Added after grid navigation's own handler, so it runs after it
lv_obj_add_event_cb(container, on_container_focused, LV_EVENT_FOCUSED, nullptr);
lv_obj_add_flag(container, GRID_NAVIGATION_FLAG); lv_obj_add_flag(container, GRID_NAVIGATION_FLAG);
const uint32_t child_count = lv_obj_get_child_count(container); const uint32_t child_count = lv_obj_get_child_count(container);
@ -45,6 +61,7 @@ void lvgl_grid_navigation_remove(lv_obj_t* container) {
lv_gridnav_remove(container); lv_gridnav_remove(container);
lv_obj_remove_event_cb(container, on_child_created); lv_obj_remove_event_cb(container, on_child_created);
lv_obj_remove_event_cb(container, on_container_focused);
lv_obj_remove_flag(container, GRID_NAVIGATION_FLAG); lv_obj_remove_flag(container, GRID_NAVIGATION_FLAG);
if (group == nullptr) { if (group == nullptr) {
@ -65,28 +82,64 @@ void lvgl_grid_navigation_remove(lv_obj_t* container) {
// Matches which children grid navigation can focus // Matches which children grid navigation can focus
static bool is_focusable(lv_obj_t* obj) { static bool is_focusable(lv_obj_t* obj) {
return !lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN) && lv_obj_has_flag_any(obj, static_cast<lv_obj_flag_t>(LV_OBJ_FLAG_CLICKABLE | LV_OBJ_FLAG_CLICK_FOCUSABLE)); return !lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN) && lv_obj_has_flag(obj, static_cast<lv_obj_flag_t>(LV_OBJ_FLAG_CLICKABLE | LV_OBJ_FLAG_CLICK_FOCUSABLE));
} }
void lvgl_grid_navigation_focus_next(lv_obj_t* container, bool next) { // Finds the next focusable child after (or before) the given index
static lv_obj_t* find_focusable_child(lv_obj_t* container, int32_t index, bool next) {
const auto child_count = static_cast<int32_t>(lv_obj_get_child_count(container)); const auto child_count = static_cast<int32_t>(lv_obj_get_child_count(container));
lv_obj_t* focused = lvgl_grid_navigation_get_focused(container);
int32_t index = focused != nullptr ? lv_obj_get_index(focused) : (next ? -1 : child_count);
for (index += next ? 1 : -1; index >= 0 && index < child_count; index += next ? 1 : -1) { for (index += next ? 1 : -1; index >= 0 && index < child_count; index += next ? 1 : -1) {
auto* child = lv_obj_get_child(container, index); auto* child = lv_obj_get_child(container, index);
if (is_focusable(child)) { if (is_focusable(child)) {
lv_gridnav_set_focused(container, child, LV_ANIM_ON); return child;
}
}
return nullptr;
}
void lvgl_grid_navigation_step(lv_group_t* group, bool next) {
lv_obj_t* focused = lv_group_get_focused(group);
if (lvgl_grid_navigation_is_container(focused)) {
lv_obj_t* focused_child = lvgl_grid_navigation_get_focused(focused);
const int32_t index = focused_child != nullptr ? lv_obj_get_index(focused_child) : (next ? -1 : static_cast<int32_t>(lv_obj_get_child_count(focused)));
lv_obj_t* child = find_focusable_child(focused, index, next);
if (child != nullptr) {
lv_gridnav_set_focused(focused, child, LV_ANIM_ON);
return; return;
} }
} }
lv_group_t* group = lv_obj_get_group(container); lv_group_set_editing(group, false);
if (group != nullptr) {
if (next) { if (next) {
lv_group_focus_next(group); lv_group_focus_next(group);
} else { } else {
lv_group_focus_prev(group); lv_group_focus_prev(group);
} }
// Grid navigation restores the child that was focused last, but stepping enters at the side it came from
lv_obj_t* entered = lv_group_get_focused(group);
if (lvgl_grid_navigation_is_container(entered)) {
const int32_t start = next ? -1 : static_cast<int32_t>(lv_obj_get_child_count(entered));
lv_obj_t* child = find_focusable_child(entered, start, next);
if (child != nullptr) {
lv_gridnav_set_focused(entered, child, LV_ANIM_ON);
}
}
}
void lvgl_focus_hide_key_selection(lv_group_t* group) {
lv_obj_t* focused = lv_group_get_focused(group);
if (focused == nullptr) {
return;
}
lv_group_set_editing(group, false);
constexpr auto key_states = static_cast<lv_state_t>(LV_STATE_FOCUS_KEY | LV_STATE_EDITED);
lv_obj_remove_state(focused, key_states);
if (lvgl_grid_navigation_is_container(focused)) {
lv_obj_t* child = lvgl_grid_navigation_get_focused(focused);
if (child != nullptr) {
lv_obj_remove_state(child, key_states);
}
} }
} }

View File

@ -58,6 +58,7 @@ const size_t lvgl_icon_shared_name_count = sizeof(lvgl_icon_shared_names) / size
const char* const lvgl_icon_statusbar_names[] = { const char* const lvgl_icon_statusbar_names[] = {
"location_on", "location_on",
"location_off",
"cloud", "cloud",
"memory", "memory",
"sd_card", "sd_card",

View File

@ -0,0 +1,78 @@
// SPDX-License-Identifier: Apache-2.0
#include <lvgl/insets.h>
#include <lvgl/insets_math.h>
#include <lvgl/devices/device_context.h>
#include <algorithm>
#include <new>
static DisplayShape get_shape(lv_display_t* display) {
DisplayShape shape = { .shape = DISPLAY_SHAPE_RECTANGLE, .corner_radius = 0 };
const auto* wrapper = static_cast<const LvglDeviceContext*>(lv_display_get_driver_data(display));
if (wrapper != nullptr && wrapper->device != nullptr) {
display_get_shape(wrapper->device, &shape);
}
return shape;
}
struct EdgePadding {
lv_obj_t* obj;
// The padding before the display's edge was added
int32_t base_left;
int32_t base_right;
};
static void update_edge_padding(void* data) {
const auto* padding = static_cast<const EdgePadding*>(data);
lv_display_t* display = lv_obj_get_display(padding->obj);
lv_area_t coords;
lv_obj_get_coords(padding->obj, &coords);
// The curve is widest at the object's edge that is nearest to the display's top or bottom
const int32_t inset = std::max(lvgl_display_get_row_inset(display, coords.y1), lvgl_display_get_row_inset(display, coords.y2));
const int32_t right_edge = lv_display_get_horizontal_resolution(display) - 1;
lv_obj_set_style_pad_left(padding->obj, padding->base_left + std::max<int32_t>(0, inset - coords.x1), LV_STATE_DEFAULT);
lv_obj_set_style_pad_right(padding->obj, padding->base_right + std::max<int32_t>(0, inset - (right_edge - coords.x2)), LV_STATE_DEFAULT);
}
// The position is final once the layout pass that changed the size has finished
static void on_size_changed(lv_event_t* event) {
lv_async_call(update_edge_padding, lv_event_get_user_data(event));
}
static void on_deleted(lv_event_t* event) {
auto* padding = static_cast<EdgePadding*>(lv_event_get_user_data(event));
lv_async_call_cancel(update_edge_padding, padding);
delete padding;
}
extern "C" {
void lvgl_obj_add_edge_padding(lv_obj_t* obj) {
if (get_shape(lv_obj_get_display(obj)).shape == DISPLAY_SHAPE_RECTANGLE) {
return;
}
auto* padding = new(std::nothrow) EdgePadding {
.obj = obj,
.base_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN),
.base_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN)
};
if (padding == nullptr) {
return;
}
lv_obj_add_event_cb(obj, on_size_changed, LV_EVENT_SIZE_CHANGED, padding);
lv_obj_add_event_cb(obj, on_deleted, LV_EVENT_DELETE, padding);
}
void lvgl_display_get_shape(lv_display_t* display, DisplayShape* out_shape) {
*out_shape = get_shape(display);
}
void lvgl_display_get_insets(lv_display_t* display, LvglInsets* out_insets) {
*out_insets = lvgl_insets_calculate(get_shape(display), lv_display_get_horizontal_resolution(display), lv_display_get_vertical_resolution(display));
}
int32_t lvgl_display_get_row_inset(lv_display_t* display, int32_t y) {
return lvgl_insets_calculate_row(get_shape(display), lv_display_get_horizontal_resolution(display), lv_display_get_vertical_resolution(display), y);
}
}

View File

@ -0,0 +1,60 @@
// SPDX-License-Identifier: Apache-2.0
#include <lvgl/insets_math.h>
#include <algorithm>
#include <cmath>
#include <numbers>
constexpr double INV_SQRT2 = 1.0 / std::numbers::sqrt2;
// The part of a corner's square that a circle with the given radius cuts off along its diagonal
static int32_t corner_inset(int32_t radius) {
return static_cast<int32_t>(std::ceil(radius * (1.0 - INV_SQRT2)));
}
// The horizontal distance between a circle's edge and its bounding box at the given distance from the circle's center row
static int32_t circle_row_inset(int32_t radius, int32_t distance_from_center) {
if (distance_from_center >= radius) {
return radius;
}
const double half_width = std::sqrt(static_cast<double>(radius) * radius - static_cast<double>(distance_from_center) * distance_from_center);
return static_cast<int32_t>(std::ceil(radius - half_width));
}
LvglInsets lvgl_insets_calculate(const DisplayShape& shape, int32_t width, int32_t height) {
switch (shape.shape) {
case DISPLAY_SHAPE_ROUNDED: {
const int32_t radius = std::min<int32_t>(shape.corner_radius, std::min(width, height) / 2);
const int32_t inset = corner_inset(radius);
return { .top = inset, .bottom = inset, .left = 0, .right = 0 };
}
case DISPLAY_SHAPE_CIRCLE: {
const int32_t diameter = std::min(width, height);
const int32_t inset = corner_inset(diameter / 2);
const int32_t horizontal = inset + (width - diameter) / 2;
const int32_t vertical = inset + (height - diameter) / 2;
return { .top = vertical, .bottom = vertical, .left = horizontal, .right = horizontal };
}
default:
return { .top = 0, .bottom = 0, .left = 0, .right = 0 };
}
}
int32_t lvgl_insets_calculate_row(const DisplayShape& shape, int32_t width, int32_t height, int32_t y) {
switch (shape.shape) {
case DISPLAY_SHAPE_ROUNDED: {
const int32_t radius = std::min<int32_t>(shape.corner_radius, std::min(width, height) / 2);
// Distance from the row to the center row of the nearest corner's circle
const int32_t distance = std::max(radius - y, y - (height - 1 - radius));
return distance > 0 ? circle_row_inset(radius, distance) : 0;
}
case DISPLAY_SHAPE_CIRCLE: {
const int32_t diameter = std::min(width, height);
const int32_t radius = diameter / 2;
const int32_t distance = std::abs(y - height / 2);
return std::min(circle_row_inset(radius, distance) + (width - diameter) / 2, width / 2);
}
default:
return 0;
}
}

View File

@ -11,11 +11,13 @@
#include <lvgl/widgets/sliderbox.h> #include <lvgl/widgets/sliderbox.h>
#include <lvgl/grid_navigation.h> #include <lvgl/grid_navigation.h>
#include <lvgl/insets.h>
#include <lvgl/theme.h> #include <lvgl/theme.h>
#include <lvgl/widgets/badge.h> #include <lvgl/widgets/badge.h>
#include <lvgl/widgets/card.h> #include <lvgl/widgets/card.h>
#include <lvgl/widgets/chip.h> #include <lvgl/widgets/chip.h>
#include <lvgl/widgets/icon_button.h> #include <lvgl/widgets/icon_button.h>
#include <lvgl/widgets/page_indicator.h>
#include <lvgl/widgets/spinner.h> #include <lvgl/widgets/spinner.h>
#include <lvgl/widgets/toolbar.h> #include <lvgl/widgets/toolbar.h>
@ -65,9 +67,15 @@ const struct ModuleSymbol lvgl_module_symbols[] = {
// lvgl_grid_navigation // lvgl_grid_navigation
DEFINE_MODULE_SYMBOL(lvgl_grid_navigation_add), DEFINE_MODULE_SYMBOL(lvgl_grid_navigation_add),
DEFINE_MODULE_SYMBOL(lvgl_grid_navigation_remove), DEFINE_MODULE_SYMBOL(lvgl_grid_navigation_remove),
DEFINE_MODULE_SYMBOL(lvgl_grid_navigation_focus_next), DEFINE_MODULE_SYMBOL(lvgl_grid_navigation_step),
DEFINE_MODULE_SYMBOL(lvgl_grid_navigation_get_focused), DEFINE_MODULE_SYMBOL(lvgl_grid_navigation_get_focused),
DEFINE_MODULE_SYMBOL(lvgl_grid_navigation_is_container), DEFINE_MODULE_SYMBOL(lvgl_grid_navigation_is_container),
DEFINE_MODULE_SYMBOL(lvgl_focus_hide_key_selection),
// lvgl_insets
DEFINE_MODULE_SYMBOL(lvgl_display_get_shape),
DEFINE_MODULE_SYMBOL(lvgl_display_get_insets),
DEFINE_MODULE_SYMBOL(lvgl_display_get_row_inset),
DEFINE_MODULE_SYMBOL(lvgl_obj_add_edge_padding),
// lvgl_theme // lvgl_theme
DEFINE_MODULE_SYMBOL(lvgl_theme_get_settings), DEFINE_MODULE_SYMBOL(lvgl_theme_get_settings),
DEFINE_MODULE_SYMBOL(lvgl_theme_get_default_settings), DEFINE_MODULE_SYMBOL(lvgl_theme_get_default_settings),
@ -75,6 +83,9 @@ const struct ModuleSymbol lvgl_module_symbols[] = {
DEFINE_MODULE_SYMBOL(lvgl_theme_is_mono), DEFINE_MODULE_SYMBOL(lvgl_theme_is_mono),
// lvgl_badge // lvgl_badge
DEFINE_MODULE_SYMBOL(lvgl_badge_create), DEFINE_MODULE_SYMBOL(lvgl_badge_create),
DEFINE_MODULE_SYMBOL(lvgl_page_indicator_create),
DEFINE_MODULE_SYMBOL(lvgl_page_indicator_set_page_count),
DEFINE_MODULE_SYMBOL(lvgl_page_indicator_set_page),
// lvgl_card // lvgl_card
DEFINE_MODULE_SYMBOL(lvgl_card_create), DEFINE_MODULE_SYMBOL(lvgl_card_create),
// lvgl_chip // lvgl_chip

View File

@ -16,6 +16,8 @@ extern const lv_obj_class_t lvgl_sliderbox_class;
extern const lv_obj_class_t lvgl_card_class; extern const lv_obj_class_t lvgl_card_class;
extern const lv_obj_class_t lvgl_chip_class; extern const lv_obj_class_t lvgl_chip_class;
extern const lv_obj_class_t lvgl_badge_class; extern const lv_obj_class_t lvgl_badge_class;
extern const lv_obj_class_t lvgl_page_indicator_class;
extern const lv_obj_class_t lvgl_page_indicator_dot_class;
#define NEUTRAL_4 lv_color_hex(0x0E0E0E) #define NEUTRAL_4 lv_color_hex(0x0E0E0E)
#define NEUTRAL_6 lv_color_hex(0x131313) #define NEUTRAL_6 lv_color_hex(0x131313)
@ -137,7 +139,10 @@ extern const lv_obj_class_t lvgl_badge_class;
#define CHIP_SHAPE (theme->config.is_compact ? CORNER_COMPACT : CORNER_SMALL) #define CHIP_SHAPE (theme->config.is_compact ? CORNER_COMPACT : CORNER_SMALL)
#define CHIP_PAD_HOR (theme->config.is_compact ? 3 : SPACE_4) #define CHIP_PAD_HOR (theme->config.is_compact ? 3 : SPACE_4)
#define CHIP_PAD_VER (theme->config.is_compact ? 2 : LV_DPX_CALC(theme->disp_dpi, 6)) #define CHIP_PAD_VER (theme->config.is_compact ? 2 : LV_DPX_CALC(theme->disp_dpi, 6))
#define BADGE_COLOR COLOR_PRIMARY #define PAGE_INDICATOR_COLOR COLOR_ON_SURFACE_VARIANT
#define PAGE_INDICATOR_DOT_SIZE (theme->config.is_compact ? 4 : LV_DPX_CALC(theme->disp_dpi, 6))
#define PAGE_INDICATOR_GAP (theme->config.is_compact ? 3 : LV_DPX_CALC(theme->disp_dpi, 6))
#define BADGE_COLOR COLOR_SECONDARY
#define BADGE_SIZE (theme->config.is_compact ? 4 : LV_DPX_CALC(theme->disp_dpi, 6)) #define BADGE_SIZE (theme->config.is_compact ? 4 : LV_DPX_CALC(theme->disp_dpi, 6))
#define SCROLLBAR_COLOR COLOR_OUTLINE #define SCROLLBAR_COLOR COLOR_OUTLINE
#define SCROLLBAR_OPACITY (LV_OPA_40) #define SCROLLBAR_OPACITY (LV_OPA_40)
@ -161,7 +166,7 @@ extern const lv_obj_class_t lvgl_badge_class;
#define TEXT_BUTTON_LABEL_COLOR COLOR_PRIMARY #define TEXT_BUTTON_LABEL_COLOR COLOR_PRIMARY
#define TEXT_BUTTON_PRESSED_CONTAINER_COLOR COLOR_PRIMARY #define TEXT_BUTTON_PRESSED_CONTAINER_COLOR COLOR_PRIMARY
#define TEXT_BUTTON_PAD_HOR (theme->config.is_compact ? 3 : SPACE_3) #define TEXT_BUTTON_PAD_HOR (theme->config.is_compact ? 3 : SPACE_3)
#define ICON_BUTTON_COLOR COLOR_ON_SURFACE_VARIANT #define ICON_BUTTON_COLOR COLOR_ON_SURFACE
#define ICON_BUTTON_CONTAINER_SHAPE (theme->config.is_compact ? CORNER_COMPACT : CORNER_LARGE) #define ICON_BUTTON_CONTAINER_SHAPE (theme->config.is_compact ? CORNER_COMPACT : CORNER_LARGE)
#define ICON_BUTTON_FILLED_COLOR COLOR_PRIMARY #define ICON_BUTTON_FILLED_COLOR COLOR_PRIMARY
#define ICON_BUTTON_FILLED_ICON_COLOR COLOR_ON_PRIMARY #define ICON_BUTTON_FILLED_ICON_COLOR COLOR_ON_PRIMARY
@ -334,6 +339,12 @@ typedef struct {
lv_style_t screen; lv_style_t screen;
lv_style_t container; lv_style_t container;
lv_style_t card; lv_style_t card;
lv_style_t page_indicator;
#if LV_USE_LABEL
lv_style_t page_indicator_label;
#endif
lv_style_t page_indicator_dot;
lv_style_t page_indicator_dot_current;
lv_style_t badge; lv_style_t badge;
lv_style_t chip; lv_style_t chip;
lv_style_t chip_selected; lv_style_t chip_selected;
@ -396,7 +407,7 @@ typedef struct {
lv_style_t checkbox_box_selected; lv_style_t checkbox_box_selected;
#endif #endif
lv_style_t sliderbox; lv_style_t sliderbox;
#if LV_USE_SLIDER #if LV_USE_BAR || LV_USE_SLIDER
lv_style_t slider_track_size; lv_style_t slider_track_size;
#endif #endif
#if LV_USE_SLIDER #if LV_USE_SLIDER
@ -758,6 +769,29 @@ static void style_init(my_theme_t * theme)
lv_style_set_pad_all(&theme->styles.card, CARD_PAD); lv_style_set_pad_all(&theme->styles.card, CARD_PAD);
lv_style_set_pad_gap(&theme->styles.card, CARD_GAP); lv_style_set_pad_gap(&theme->styles.card, CARD_GAP);
style_init_reset(&theme->styles.page_indicator);
lv_style_set_bg_opa(&theme->styles.page_indicator, LV_OPA_TRANSP);
lv_style_set_border_width(&theme->styles.page_indicator, 0);
lv_style_set_pad_all(&theme->styles.page_indicator, 0);
lv_style_set_pad_gap(&theme->styles.page_indicator, PAGE_INDICATOR_GAP);
#if LV_USE_LABEL
style_init_reset(&theme->styles.page_indicator_label);
lv_style_set_text_color(&theme->styles.page_indicator_label, PAGE_INDICATOR_COLOR);
#endif
style_init_reset(&theme->styles.page_indicator_dot);
lv_style_set_width(&theme->styles.page_indicator_dot, PAGE_INDICATOR_DOT_SIZE);
lv_style_set_height(&theme->styles.page_indicator_dot, PAGE_INDICATOR_DOT_SIZE);
lv_style_set_radius(&theme->styles.page_indicator_dot, LV_RADIUS_CIRCLE);
lv_style_set_bg_color(&theme->styles.page_indicator_dot, PAGE_INDICATOR_COLOR);
lv_style_set_bg_opa(&theme->styles.page_indicator_dot, LV_OPA_TRANSP);
lv_style_set_border_color(&theme->styles.page_indicator_dot, PAGE_INDICATOR_COLOR);
lv_style_set_border_width(&theme->styles.page_indicator_dot, 1);
style_init_reset(&theme->styles.page_indicator_dot_current);
lv_style_set_bg_opa(&theme->styles.page_indicator_dot_current, LV_OPA_COVER);
style_init_reset(&theme->styles.badge); style_init_reset(&theme->styles.badge);
lv_style_set_width(&theme->styles.badge, BADGE_SIZE); lv_style_set_width(&theme->styles.badge, BADGE_SIZE);
lv_style_set_height(&theme->styles.badge, BADGE_SIZE); lv_style_set_height(&theme->styles.badge, BADGE_SIZE);
@ -874,7 +908,7 @@ static void style_init(my_theme_t * theme)
lv_style_set_bg_opa(&theme->styles.app_bar_button_pressed, APP_BAR_PRESSED_OPACITY); lv_style_set_bg_opa(&theme->styles.app_bar_button_pressed, APP_BAR_PRESSED_OPACITY);
style_init_reset(&theme->styles.app_bar_focus_ring); style_init_reset(&theme->styles.app_bar_focus_ring);
lv_style_set_outline_color(&theme->styles.app_bar_focus_ring, APP_BAR_CONTENT_COLOR); lv_style_set_outline_color(&theme->styles.app_bar_focus_ring, FOCUS_RING_COLOR);
lv_style_set_outline_width(&theme->styles.app_bar_focus_ring, APP_BAR_FOCUS_WIDTH); lv_style_set_outline_width(&theme->styles.app_bar_focus_ring, APP_BAR_FOCUS_WIDTH);
lv_style_set_outline_pad(&theme->styles.app_bar_focus_ring, -APP_BAR_FOCUS_WIDTH); lv_style_set_outline_pad(&theme->styles.app_bar_focus_ring, -APP_BAR_FOCUS_WIDTH);
lv_style_set_outline_opa(&theme->styles.app_bar_focus_ring, LV_OPA_COVER); lv_style_set_outline_opa(&theme->styles.app_bar_focus_ring, LV_OPA_COVER);
@ -957,7 +991,7 @@ static void style_init(my_theme_t * theme)
style_init_reset(&theme->styles.sliderbox); style_init_reset(&theme->styles.sliderbox);
lv_style_set_pad_column(&theme->styles.sliderbox, SLIDERBOX_GAP); lv_style_set_pad_column(&theme->styles.sliderbox, SLIDERBOX_GAP);
#if LV_USE_SLIDER #if LV_USE_BAR || LV_USE_SLIDER
style_init_reset(&theme->styles.slider_track_size); style_init_reset(&theme->styles.slider_track_size);
lv_style_set_height(&theme->styles.slider_track_size, SLIDER_TRACK_HEIGHT); lv_style_set_height(&theme->styles.slider_track_size, SLIDER_TRACK_HEIGHT);
#endif #endif
@ -1802,6 +1836,11 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj)
return; return;
} }
#endif #endif
/* page_indicator > label */
if(lv_obj_check_type(parent, &lvgl_page_indicator_class)) {
lv_obj_add_style(obj, &theme->styles.page_indicator_label, 0);
return;
}
return; return;
} }
#endif #endif
@ -1833,11 +1872,29 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj)
return; return;
} }
#endif #endif
if(lv_obj_check_type(obj, &lvgl_page_indicator_class)) {
/* page_indicator */
lv_obj_add_style(obj, &theme->styles.page_indicator, 0);
return;
}
if(lv_obj_check_type(obj, &lvgl_page_indicator_dot_class)) {
/* page_indicator_dot */
lv_obj_add_style(obj, &theme->styles.page_indicator_dot, 0);
lv_obj_add_style(obj, &theme->styles.page_indicator_dot_current, LV_STATE_CHECKED);
return;
}
if(lv_obj_check_type(obj, &lvgl_badge_class)) { if(lv_obj_check_type(obj, &lvgl_badge_class)) {
/* badge */ /* badge */
lv_obj_add_style(obj, &theme->styles.badge, 0); lv_obj_add_style(obj, &theme->styles.badge, 0);
return; return;
} }
#if LV_USE_IMAGE
if(lv_obj_check_type(obj, &lv_image_class)) {
/* image */
lv_obj_add_style(obj, &theme->styles.focus_ring_inset, LV_STATE_FOCUS_KEY);
return;
}
#endif
if(lv_obj_check_type(obj, &lvgl_chip_class)) { if(lv_obj_check_type(obj, &lvgl_chip_class)) {
/* chip */ /* chip */
lv_obj_add_style(obj, &theme->styles.chip, 0); lv_obj_add_style(obj, &theme->styles.chip, 0);
@ -1878,6 +1935,7 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj)
#if LV_USE_BAR #if LV_USE_BAR
if(lv_obj_check_type(obj, &lv_bar_class)) { if(lv_obj_check_type(obj, &lv_bar_class)) {
/* bar */ /* bar */
lv_obj_add_style(obj, &theme->styles.slider_track_size, 0);
lv_obj_add_style(obj, &theme->styles.progress_track, 0); lv_obj_add_style(obj, &theme->styles.progress_track, 0);
lv_obj_add_style(obj, &theme->styles.progress_indicator, LV_PART_INDICATOR); lv_obj_add_style(obj, &theme->styles.progress_indicator, LV_PART_INDICATOR);
lv_obj_add_style(obj, &theme->styles.focus_ring, LV_STATE_FOCUS_KEY); lv_obj_add_style(obj, &theme->styles.focus_ring, LV_STATE_FOCUS_KEY);

View File

@ -16,6 +16,8 @@ extern const lv_obj_class_t lvgl_sliderbox_class;
extern const lv_obj_class_t lvgl_card_class; extern const lv_obj_class_t lvgl_card_class;
extern const lv_obj_class_t lvgl_chip_class; extern const lv_obj_class_t lvgl_chip_class;
extern const lv_obj_class_t lvgl_badge_class; extern const lv_obj_class_t lvgl_badge_class;
extern const lv_obj_class_t lvgl_page_indicator_class;
extern const lv_obj_class_t lvgl_page_indicator_dot_class;
#define BLACK lv_color_black() #define BLACK lv_color_black()
#define WHITE lv_color_white() #define WHITE lv_color_white()
@ -87,6 +89,9 @@ extern const lv_obj_class_t lvgl_badge_class;
#define CHIP_SHAPE (theme->config.is_compact ? CORNER_COMPACT : CORNER_SMALL) #define CHIP_SHAPE (theme->config.is_compact ? CORNER_COMPACT : CORNER_SMALL)
#define CHIP_PAD_HOR (theme->config.is_compact ? 3 : SPACE_4) #define CHIP_PAD_HOR (theme->config.is_compact ? 3 : SPACE_4)
#define CHIP_PAD_VER (theme->config.is_compact ? 2 : SPACE_2) #define CHIP_PAD_VER (theme->config.is_compact ? 2 : SPACE_2)
#define PAGE_INDICATOR_COLOR COLOR_ON_SURFACE
#define PAGE_INDICATOR_DOT_SIZE (theme->config.is_compact ? 4 : LV_DPX_CALC(theme->disp_dpi, 6))
#define PAGE_INDICATOR_GAP (theme->config.is_compact ? 3 : LV_DPX_CALC(theme->disp_dpi, 6))
#define BADGE_COLOR COLOR_ON_SURFACE #define BADGE_COLOR COLOR_ON_SURFACE
#define BADGE_SIZE (theme->config.is_compact ? 4 : LV_DPX_CALC(theme->disp_dpi, 6)) #define BADGE_SIZE (theme->config.is_compact ? 4 : LV_DPX_CALC(theme->disp_dpi, 6))
#define SCROLLBAR_COLOR COLOR_ON_SURFACE #define SCROLLBAR_COLOR COLOR_ON_SURFACE
@ -216,6 +221,12 @@ typedef struct {
lv_style_t screen; lv_style_t screen;
lv_style_t container; lv_style_t container;
lv_style_t card; lv_style_t card;
lv_style_t page_indicator;
#if LV_USE_LABEL
lv_style_t page_indicator_label;
#endif
lv_style_t page_indicator_dot;
lv_style_t page_indicator_dot_current;
lv_style_t badge; lv_style_t badge;
lv_style_t chip; lv_style_t chip;
#if LV_USE_BUTTON || LV_USE_MSGBOX #if LV_USE_BUTTON || LV_USE_MSGBOX
@ -250,7 +261,7 @@ typedef struct {
lv_style_t checkbox_box_selected; lv_style_t checkbox_box_selected;
#endif #endif
lv_style_t sliderbox; lv_style_t sliderbox;
#if LV_USE_SLIDER #if LV_USE_BAR || LV_USE_SLIDER
lv_style_t slider_track_size; lv_style_t slider_track_size;
#endif #endif
#if LV_USE_SLIDER #if LV_USE_SLIDER
@ -548,6 +559,29 @@ static void style_init(my_theme_t * theme)
lv_style_set_pad_all(&theme->styles.card, CARD_PAD); lv_style_set_pad_all(&theme->styles.card, CARD_PAD);
lv_style_set_pad_gap(&theme->styles.card, CARD_GAP); lv_style_set_pad_gap(&theme->styles.card, CARD_GAP);
style_init_reset(&theme->styles.page_indicator);
lv_style_set_bg_opa(&theme->styles.page_indicator, LV_OPA_TRANSP);
lv_style_set_border_width(&theme->styles.page_indicator, 0);
lv_style_set_pad_all(&theme->styles.page_indicator, 0);
lv_style_set_pad_gap(&theme->styles.page_indicator, PAGE_INDICATOR_GAP);
#if LV_USE_LABEL
style_init_reset(&theme->styles.page_indicator_label);
lv_style_set_text_color(&theme->styles.page_indicator_label, PAGE_INDICATOR_COLOR);
#endif
style_init_reset(&theme->styles.page_indicator_dot);
lv_style_set_width(&theme->styles.page_indicator_dot, PAGE_INDICATOR_DOT_SIZE);
lv_style_set_height(&theme->styles.page_indicator_dot, PAGE_INDICATOR_DOT_SIZE);
lv_style_set_radius(&theme->styles.page_indicator_dot, LV_RADIUS_CIRCLE);
lv_style_set_bg_color(&theme->styles.page_indicator_dot, PAGE_INDICATOR_COLOR);
lv_style_set_bg_opa(&theme->styles.page_indicator_dot, LV_OPA_TRANSP);
lv_style_set_border_color(&theme->styles.page_indicator_dot, PAGE_INDICATOR_COLOR);
lv_style_set_border_width(&theme->styles.page_indicator_dot, 1);
style_init_reset(&theme->styles.page_indicator_dot_current);
lv_style_set_bg_opa(&theme->styles.page_indicator_dot_current, LV_OPA_COVER);
style_init_reset(&theme->styles.badge); style_init_reset(&theme->styles.badge);
lv_style_set_width(&theme->styles.badge, BADGE_SIZE); lv_style_set_width(&theme->styles.badge, BADGE_SIZE);
lv_style_set_height(&theme->styles.badge, BADGE_SIZE); lv_style_set_height(&theme->styles.badge, BADGE_SIZE);
@ -688,7 +722,7 @@ static void style_init(my_theme_t * theme)
style_init_reset(&theme->styles.sliderbox); style_init_reset(&theme->styles.sliderbox);
lv_style_set_pad_column(&theme->styles.sliderbox, SLIDERBOX_GAP); lv_style_set_pad_column(&theme->styles.sliderbox, SLIDERBOX_GAP);
#if LV_USE_SLIDER #if LV_USE_BAR || LV_USE_SLIDER
style_init_reset(&theme->styles.slider_track_size); style_init_reset(&theme->styles.slider_track_size);
lv_style_set_height(&theme->styles.slider_track_size, SLIDER_TRACK_HEIGHT); lv_style_set_height(&theme->styles.slider_track_size, SLIDER_TRACK_HEIGHT);
#endif #endif
@ -1401,6 +1435,11 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj)
return; return;
} }
#endif #endif
/* page_indicator > label */
if(lv_obj_check_type(parent, &lvgl_page_indicator_class)) {
lv_obj_add_style(obj, &theme->styles.page_indicator_label, 0);
return;
}
return; return;
} }
#endif #endif
@ -1428,6 +1467,17 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj)
return; return;
} }
#endif #endif
if(lv_obj_check_type(obj, &lvgl_page_indicator_class)) {
/* page_indicator */
lv_obj_add_style(obj, &theme->styles.page_indicator, 0);
return;
}
if(lv_obj_check_type(obj, &lvgl_page_indicator_dot_class)) {
/* page_indicator_dot */
lv_obj_add_style(obj, &theme->styles.page_indicator_dot, 0);
lv_obj_add_style(obj, &theme->styles.page_indicator_dot_current, LV_STATE_CHECKED);
return;
}
if(lv_obj_check_type(obj, &lvgl_badge_class)) { if(lv_obj_check_type(obj, &lvgl_badge_class)) {
/* badge */ /* badge */
lv_obj_add_style(obj, &theme->styles.badge, 0); lv_obj_add_style(obj, &theme->styles.badge, 0);
@ -1470,6 +1520,7 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj)
#if LV_USE_BAR #if LV_USE_BAR
if(lv_obj_check_type(obj, &lv_bar_class)) { if(lv_obj_check_type(obj, &lv_bar_class)) {
/* bar */ /* bar */
lv_obj_add_style(obj, &theme->styles.slider_track_size, 0);
lv_obj_add_style(obj, &theme->styles.slider_track, 0); lv_obj_add_style(obj, &theme->styles.slider_track, 0);
lv_obj_add_style(obj, &theme->styles.slider_active_track, LV_PART_INDICATOR); lv_obj_add_style(obj, &theme->styles.slider_active_track, LV_PART_INDICATOR);
lv_obj_add_style(obj, &theme->styles.focus_ring, LV_STATE_FOCUS_KEY); lv_obj_add_style(obj, &theme->styles.focus_ring, LV_STATE_FOCUS_KEY);

Some files were not shown because too many files have changed in this diff Show More