Implement UI scaling and more (#501)

**New Features**
 * Runtime font accessors and new symbol fonts for text, launcher, statusbar, and shared icons.
 * Added font height base setting to device.properties
 * Text fonts now have 3 sizes: small, default, large

**Improvements**
 * Renamed `UiScale` to `UiDensity`
 * Statusbar, toolbar and many UI components now compute heights and spacing from fonts/density.
 * SSD1306 initialization sequence refined for more stable startup.
 * Multiple image assets replaced by symbol-font rendering.
 * Many layout improvements related to density, font scaling and icon scaling
 * Updated folder name capitalization for newer style
This commit is contained in:
Ken Van Hoeylandt 2026-02-15 01:41:47 +01:00 committed by GitHub
parent 72c9b2b113
commit 9a11e6f47b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
264 changed files with 5923 additions and 494 deletions

View File

@ -1,17 +1,17 @@
idf_component_register( idf_component_register(
INCLUDE_DIRS INCLUDE_DIRS
"Libraries/TactilityC/Include" "Libraries/TactilityC/include"
"Libraries/TactilityKernel/Include" "Libraries/TactilityKernel/include"
"Libraries/TactilityFreeRtos/Include" "Libraries/TactilityFreeRtos/include"
"Libraries/lvgl/Include" "Libraries/lvgl/include"
"Libraries/lvgl-module/Include" "Libraries/lvgl-module/include"
REQUIRES esp_timer REQUIRES esp_timer
) )
add_prebuilt_library(TactilityC Libraries/TactilityC/Binary/libTactilityC.a) add_prebuilt_library(TactilityC Libraries/TactilityC/binary/libTactilityC.a)
add_prebuilt_library(TactilityKernel Libraries/TactilityKernel/Binary/libTactilityKernel.a) add_prebuilt_library(TactilityKernel Libraries/TactilityKernel/binary/libTactilityKernel.a)
add_prebuilt_library(lvgl Libraries/lvgl/Binary/liblvgl.a) add_prebuilt_library(lvgl Libraries/lvgl/binary/liblvgl.a)
add_prebuilt_library(lvgl-module Libraries/lvgl-module/Binary/liblvgl-module.a) add_prebuilt_library(lvgl-module Libraries/lvgl-module/binary/liblvgl-module.a)
target_link_libraries(${COMPONENT_LIB} INTERFACE TactilityC) target_link_libraries(${COMPONENT_LIB} INTERFACE TactilityC)
target_link_libraries(${COMPONENT_LIB} INTERFACE TactilityKernel) target_link_libraries(${COMPONENT_LIB} INTERFACE TactilityKernel)

View File

@ -7,23 +7,13 @@ else ()
set(Cyan "") set(Cyan "")
endif () endif ()
include("${CMAKE_CURRENT_LIST_DIR}/properties.cmake")
function(INIT_TACTILITY_GLOBALS SDKCONFIG_FILE) function(INIT_TACTILITY_GLOBALS SDKCONFIG_FILE)
get_filename_component(SDKCONFIG_FILE_ABS ${SDKCONFIG_FILE} ABSOLUTE) GET_PROPERTY_FILE_CONTENT(${SDKCONFIG_FILE} sdkconfig_text)
# Find the device identifier in the sdkconfig file # Get device id
if (NOT EXISTS ${SDKCONFIG_FILE_ABS}) GET_PROPERTY_VALUE(sdkconfig_text "CONFIG_TT_DEVICE_ID" device_id)
message(FATAL_ERROR "sdkconfig file not found:\nMake sure you select a device by running \"python device.py [device-id]\"\n")
endif ()
file(READ ${SDKCONFIG_FILE_ABS} sdkconfig_text)
string(REGEX MATCH "(CONFIG_TT_DEVICE_ID\=\"[^\"]*\")" sdkconfig_device_id "${sdkconfig_text}")
if (sdkconfig_device_id STREQUAL "CONFIG_TT_DEVICE_ID=\"\"" OR sdkconfig_device_id STREQUAL "")
message(FATAL_ERROR "CONFIG_TT_DEVICE_ID not found in sdkconfig:\nMake sure you select a device with 'python device.py device-id'")
endif ()
string(LENGTH ${sdkconfig_device_id} sdkconfig_device_id_length)
set(id_length 0)
# Total length minus chars of 'CONFIG_TT_DEVICE_ID=""'
math(EXPR id_length "${sdkconfig_device_id_length} - 22")
# Skip 'CONFIG_TT_DEVICE_ID="' then read the relevant (remaining) chars
string(SUBSTRING ${sdkconfig_device_id} 21 ${id_length} device_id)
# Validate device id # Validate device id
if (NOT device_id MATCHES "^[a-z0-9\-]*$") if (NOT device_id MATCHES "^[a-z0-9\-]*$")
message(FATAL_ERROR "Device identifier ${device_id} contains invalid characters. Valid characters: a-z 0-9 \"-\"") message(FATAL_ERROR "Device identifier ${device_id} contains invalid characters. Valid characters: a-z 0-9 \"-\"")
@ -31,7 +21,8 @@ function(INIT_TACTILITY_GLOBALS SDKCONFIG_FILE)
# Output results # Output results
message("Device identifier: ${Cyan}${device_id}${ColorReset}") message("Device identifier: ${Cyan}${device_id}${ColorReset}")
set(TACTILITY_DEVICE_PROJECT ${device_id}) set(TACTILITY_DEVICE_PROJECT ${device_id})
message("Device project path: ${Cyan}Devices/${TACTILITY_DEVICE_PROJECT}${ColorReset}\n") message("Device project path: ${Cyan}Devices/${TACTILITY_DEVICE_PROJECT}${ColorReset} ")
message("")
set_property(GLOBAL PROPERTY TACTILITY_DEVICE_PROJECT ${TACTILITY_DEVICE_PROJECT}) set_property(GLOBAL PROPERTY TACTILITY_DEVICE_PROJECT ${TACTILITY_DEVICE_PROJECT})
set_property(GLOBAL PROPERTY TACTILITY_DEVICE_ID ${device_id}) set_property(GLOBAL PROPERTY TACTILITY_DEVICE_ID ${device_id})
endfunction() endfunction()

View File

@ -0,0 +1,23 @@
function(GET_PROPERTY_VALUE PROPERTIES_CONTENT_VAR KEY_NAME RESULT_VAR)
# Search for the key and its value in the properties content
# Supports KEY=VALUE, KEY="VALUE", and optional spaces around =
# Use parentheses to capture the value
# We use ^ and $ with multiline if available, but string(REGEX) doesn't support them easily for lines.
# So we look for the key at the beginning of the string or after a newline.
if ("${${PROPERTIES_CONTENT_VAR}}" MATCHES "(^|\n)${KEY_NAME}[ \t]*=[ \t]*\"?([^\n\"]*)\"?")
set(${RESULT_VAR} "${CMAKE_MATCH_2}" PARENT_SCOPE)
else ()
message(FATAL_ERROR "Property '${KEY_NAME}' not found in the properties content.")
endif ()
endfunction()
function(GET_PROPERTY_FILE_CONTENT PROPERTY_FILE RESULT_VAR)
get_filename_component(PROPERTY_FILE_ABS ${PROPERTY_FILE} ABSOLUTE)
# Find the device identifier in the sdkconfig file
if (NOT EXISTS ${PROPERTY_FILE_ABS})
message(FATAL_ERROR "Property file not found: ${PROPERTY_FILE}\nMake sure you select a device by running \"python device.py [device-id]\"\n")
endif ()
file(READ ${PROPERTY_FILE_ABS} file_content)
set(${RESULT_VAR} "${file_content}" PARENT_SCOPE)
endfunction()

View File

@ -73,31 +73,31 @@ def main():
mappings = [ mappings = [
{'src': 'version.txt', 'dst': ''}, {'src': 'version.txt', 'dst': ''},
# TactilityC # TactilityC
{'src': 'build/esp-idf/TactilityC/libTactilityC.a', 'dst': 'Libraries/TactilityC/Binary/'}, {'src': 'build/esp-idf/TactilityC/libTactilityC.a', 'dst': 'Libraries/TactilityC/binary/'},
{'src': 'TactilityC/Include/*', 'dst': 'Libraries/TactilityC/Include/'}, {'src': 'TactilityC/Include/*', 'dst': 'Libraries/TactilityC/include/'},
{'src': 'TactilityC/CMakeLists.txt', 'dst': 'Libraries/TactilityC/'}, {'src': 'TactilityC/CMakeLists.txt', 'dst': 'Libraries/TactilityC/'},
{'src': 'TactilityC/LICENSE*.*', 'dst': 'Libraries/TactilityC/'}, {'src': 'TactilityC/LICENSE*.*', 'dst': 'Libraries/TactilityC/'},
# TactilityFreeRtos # TactilityFreeRtos
{'src': 'TactilityFreeRtos/Include/**', 'dst': 'Libraries/TactilityFreeRtos/Include/'}, {'src': 'TactilityFreeRtos/Include/**', 'dst': 'Libraries/TactilityFreeRtos/include/'},
{'src': 'TactilityFreeRtos/CMakeLists.txt', 'dst': 'Libraries/TactilityFreeRtos/'}, {'src': 'TactilityFreeRtos/CMakeLists.txt', 'dst': 'Libraries/TactilityFreeRtos/'},
{'src': 'TactilityFreeRtos/LICENSE*.*', 'dst': 'Libraries/TactilityFreeRtos/'}, {'src': 'TactilityFreeRtos/LICENSE*.*', 'dst': 'Libraries/TactilityFreeRtos/'},
# TactilityKernel # TactilityKernel
{'src': 'build/esp-idf/TactilityKernel/libTactilityKernel.a', 'dst': 'Libraries/TactilityKernel/Binary/'}, {'src': 'build/esp-idf/TactilityKernel/libTactilityKernel.a', 'dst': 'Libraries/TactilityKernel/binary/'},
{'src': 'TactilityKernel/Include/**', 'dst': 'Libraries/TactilityKernel/Include/'}, {'src': 'TactilityKernel/include/**', 'dst': 'Libraries/TactilityKernel/include/'},
{'src': 'TactilityKernel/CMakeLists.txt', 'dst': 'Libraries/TactilityKernel/'}, {'src': 'TactilityKernel/CMakeLists.txt', 'dst': 'Libraries/TactilityKernel/'},
{'src': 'TactilityKernel/LICENSE*.*', 'dst': 'Libraries/TactilityKernel/'}, {'src': 'TactilityKernel/LICENSE*.*', 'dst': 'Libraries/TactilityKernel/'},
# lvgl-module # lvgl-module
{'src': 'build/esp-idf/lvgl-module/liblvgl-module.a', 'dst': 'Libraries/lvgl-module/Binary/'}, {'src': 'build/esp-idf/lvgl-module/liblvgl-module.a', 'dst': 'Libraries/lvgl-module/binary/'},
{'src': 'Modules/lvgl-module/Include/**', 'dst': 'Libraries/lvgl-module/Include/'}, {'src': 'Modules/lvgl-module/include/**', 'dst': 'Libraries/lvgl-module/include/'},
{'src': 'Modules/lvgl-module/CMakeLists.txt', 'dst': 'Libraries/lvgl-module/'}, {'src': 'Modules/lvgl-module/CMakeLists.txt', 'dst': 'Libraries/lvgl-module/'},
{'src': 'Modules/lvgl-module/LICENSE*.*', 'dst': 'Libraries/lvgl-module/'}, {'src': 'Modules/lvgl-module/LICENSE*.*', 'dst': 'Libraries/lvgl-module/'},
# lvgl (basics) # lvgl (basics)
{'src': 'build/esp-idf/lvgl__lvgl/liblvgl__lvgl.a', 'dst': 'Libraries/lvgl/Binary/liblvgl.a'}, {'src': 'build/esp-idf/lvgl__lvgl/liblvgl__lvgl.a', 'dst': 'Libraries/lvgl/binary/liblvgl.a'},
{'src': 'Libraries/lvgl/lvgl.h', 'dst': 'Libraries/lvgl/Include/'}, {'src': 'Libraries/lvgl/lvgl.h', 'dst': 'Libraries/lvgl/include/'},
{'src': 'Libraries/lvgl/lv_version.h', 'dst': 'Libraries/lvgl/Include/'}, {'src': 'Libraries/lvgl/lv_version.h', 'dst': 'Libraries/lvgl/include/'},
{'src': 'Libraries/lvgl/LICENCE*.*', 'dst': 'Libraries/lvgl/'}, {'src': 'Libraries/lvgl/LICENCE*.*', 'dst': 'Libraries/lvgl/'},
{'src': 'Libraries/lvgl/src/lv_conf_kconfig.h', 'dst': 'Libraries/lvgl/Include/lv_conf.h'}, {'src': 'Libraries/lvgl/src/lv_conf_kconfig.h', 'dst': 'Libraries/lvgl/include/lv_conf.h'},
{'src': 'Libraries/lvgl/src/**/*.h', 'dst': 'Libraries/lvgl/Include/src/'}, {'src': 'Libraries/lvgl/src/**/*.h', 'dst': 'Libraries/lvgl/include/src/'},
# elf_loader # elf_loader
{'src': 'Libraries/elf_loader/elf_loader.cmake', 'dst': 'Libraries/elf_loader/'}, {'src': 'Libraries/elf_loader/elf_loader.cmake', 'dst': 'Libraries/elf_loader/'},
{'src': 'Libraries/elf_loader/license.txt', 'dst': 'Libraries/elf_loader/'}, {'src': 'Libraries/elf_loader/license.txt', 'dst': 'Libraries/elf_loader/'},

View File

@ -11,8 +11,6 @@ CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH=y
# EmbedTLS # EmbedTLS
CONFIG_MBEDTLS_SSL_PROTO_TLS1_3=y CONFIG_MBEDTLS_SSL_PROTO_TLS1_3=y
# LVGL # LVGL
CONFIG_LV_FONT_MONTSERRAT_14=y
CONFIG_LV_FONT_MONTSERRAT_18=y
CONFIG_LV_USE_USER_DATA=y CONFIG_LV_USE_USER_DATA=y
CONFIG_LV_USE_FS_STDIO=y CONFIG_LV_USE_FS_STDIO=y
CONFIG_LV_FS_STDIO_LETTER=65 CONFIG_LV_FS_STDIO_LETTER=65

View File

@ -25,6 +25,8 @@ if (DEFINED ENV{ESP_IDF_VERSION})
else () else ()
set(TACTILITY_DEVICE_PROJECT "Devices/simulator") set(TACTILITY_DEVICE_PROJECT "Devices/simulator")
set(TACTILITY_DEVICE_ID "simulator") set(TACTILITY_DEVICE_ID "simulator")
set_property(GLOBAL PROPERTY TACTILITY_DEVICE_PROJECT ${TACTILITY_DEVICE_PROJECT})
set_property(GLOBAL PROPERTY TACTILITY_DEVICE_ID ${TACTILITY_DEVICE_ID})
endif () endif ()
if (DEFINED ENV{ESP_IDF_VERSION}) if (DEFINED ENV{ESP_IDF_VERSION})
@ -37,7 +39,7 @@ if (DEFINED ENV{ESP_IDF_VERSION})
"Devices/${TACTILITY_DEVICE_PROJECT}" "Devices/${TACTILITY_DEVICE_PROJECT}"
"Drivers" "Drivers"
"Modules" "Modules"
"Platforms/PlatformEsp32" "Platforms/platform-esp32"
"TactilityKernel" "TactilityKernel"
"Tactility" "Tactility"
"TactilityC" "TactilityC"
@ -82,7 +84,7 @@ if (NOT DEFINED ENV{ESP_IDF_VERSION})
add_subdirectory(TactilityCore) add_subdirectory(TactilityCore)
add_subdirectory(TactilityFreeRtos) add_subdirectory(TactilityFreeRtos)
add_subdirectory(TactilityKernel) add_subdirectory(TactilityKernel)
add_subdirectory(Platforms/PlatformPosix) add_subdirectory(Platforms/platform-posix)
add_subdirectory(Devices/simulator) add_subdirectory(Devices/simulator)
add_subdirectory(Libraries/cJSON) add_subdirectory(Libraries/cJSON)
add_subdirectory(Libraries/lv_screenshot) add_subdirectory(Libraries/lv_screenshot)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 753 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 273 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 528 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 193 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 663 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 755 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 394 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 407 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 524 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 517 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 534 B

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: bigtreetech,panda-touch.dts dts: bigtreetech,panda-touch.dts

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: cyd,2432s024c.dts dts: cyd,2432s024c.dts

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: cyd,2432s028r.dts dts: cyd,2432s028r.dts

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: cyd,2432s028rv3.dts dts: cyd,2432s028rv3.dts

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: cyd,2432s032c.dts dts: cyd,2432s032c.dts

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: cyd,4848s040c.dts dts: cyd,4848s040c.dts

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: cyd,8048s043c.dts dts: cyd,8048s043c.dts

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: cyd,e32r28t.dts dts: cyd,e32r28t.dts

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: cyd,e32r32p.dts dts: cyd,e32r32p.dts

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: elecrow,crowpanel-advance-28.dts dts: elecrow,crowpanel-advance-28.dts

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: elecrow,crowpanel-advance-35.dts dts: elecrow,crowpanel-advance-35.dts

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: elecrow,crowpanel-advance-50.dts dts: elecrow,crowpanel-advance-50.dts

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: elecrow,crowpanel-basic-28.dts dts: elecrow,crowpanel-basic-28.dts

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: elecrow,crowpanel-basic-35.dts dts: elecrow,crowpanel-basic-35.dts

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: elecrow,crowpanel-basic-50.dts dts: elecrow,crowpanel-basic-50.dts

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: generic,esp32.dts dts: generic,esp32.dts

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: generic,esp32c6.dts dts: generic,esp32c6.dts

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: generic,esp32p4.dts dts: generic,esp32p4.dts

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: generic,esp32s3.dts dts: generic,esp32s3.dts

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: guition,jc1060p470ciwy.dts dts: guition,jc1060p470ciwy.dts

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: guition,jc2432w328c.dts dts: guition,jc2432w328c.dts

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: guition,jc3248w535c.dts dts: guition,jc3248w535c.dts

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: guition,jc8048w550c.dts dts: guition,jc8048w550c.dts

View File

@ -44,6 +44,6 @@ static std::vector<std::shared_ptr<tt::hal::Device>> createDevices() {
extern const Configuration hardwareConfiguration = { extern const Configuration hardwareConfiguration = {
.initBoot = initBoot, .initBoot = initBoot,
.uiScale = UiScale::Smallest, .uiDensity = UiDensity::Compact,
.createDevices = createDevices .createDevices = createDevices
}; };

View File

@ -5,6 +5,7 @@ incubating=true
[apps] [apps]
launcherAppId=Launcher launcherAppId=Launcher
autoStartAppId=ApWebServer
[hardware] [hardware]
target=ESP32S3 target=ESP32S3
@ -24,3 +25,4 @@ infoMessage=Due to the small size of the screen, the icons don't render properly
[lvgl] [lvgl]
theme=Mono theme=Mono
colorDepth=16 colorDepth=16
uiScale=70

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: heltec,wifi-lora-32-v3.dts dts: heltec,wifi-lora-32-v3.dts

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: lilygo,tdeck.dts dts: lilygo,tdeck.dts

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: lilygo,tdisplay-s3.dts dts: lilygo,tdisplay-s3.dts

View File

@ -19,6 +19,6 @@ static std::vector<std::shared_ptr<tt::hal::Device>> createDevices() {
extern const Configuration hardwareConfiguration = { extern const Configuration hardwareConfiguration = {
.initBoot = initBoot, .initBoot = initBoot,
.uiScale = UiScale::Smallest, .uiDensity = UiDensity::Compact,
.createDevices = createDevices .createDevices = createDevices
}; };

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: lilygo,tdisplay.dts dts: lilygo,tdisplay.dts

View File

@ -16,6 +16,6 @@ static std::vector<std::shared_ptr<tt::hal::Device>> createDevices() {
extern const Configuration hardwareConfiguration = { extern const Configuration hardwareConfiguration = {
.initBoot = initBoot, .initBoot = initBoot,
.uiScale = UiScale::Smallest, .uiDensity = UiDensity::Compact,
.createDevices = createDevices .createDevices = createDevices
}; };

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: lilygo,tdongle-s3.dts dts: lilygo,tdongle-s3.dts

View File

@ -3,5 +3,5 @@ file(GLOB_RECURSE SOURCE_FILES Source/*.c*)
idf_component_register( idf_component_register(
SRCS ${SOURCE_FILES} SRCS ${SOURCE_FILES}
INCLUDE_DIRS "Source" INCLUDE_DIRS "Source"
REQUIRES Tactility esp_lcd ST7796 BQ25896 BQ27220 TCA8418 DRV2605 PwmBacklight driver esp_adc PlatformEsp32 REQUIRES Tactility esp_lcd ST7796 BQ25896 BQ27220 TCA8418 DRV2605 PwmBacklight driver esp_adc platform-esp32
) )

View File

@ -22,3 +22,4 @@ dpi=227
[lvgl] [lvgl]
colorDepth=16 colorDepth=16
dpi=150

View File

@ -1,4 +1,4 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
bindings: ./ bindings: ./
dts: lilygo,tlora-pager.dts dts: lilygo,tlora-pager.dts

View File

@ -28,6 +28,6 @@ static DeviceVector createDevices() {
extern const Configuration hardwareConfiguration = { extern const Configuration hardwareConfiguration = {
.initBoot = initBoot, .initBoot = initBoot,
.uiScale = UiScale::Smallest, .uiDensity = UiDensity::Compact,
.createDevices = createDevices .createDevices = createDevices
}; };

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: m5stack,cardputer-adv.dts dts: m5stack,cardputer-adv.dts

View File

@ -26,6 +26,6 @@ static DeviceVector createDevices() {
extern const Configuration hardwareConfiguration = { extern const Configuration hardwareConfiguration = {
.initBoot = initBoot, .initBoot = initBoot,
.uiScale = UiScale::Smallest, .uiDensity = UiDensity::Compact,
.createDevices = createDevices .createDevices = createDevices
}; };

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: m5stack,cardputer.dts dts: m5stack,cardputer.dts

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: m5stack,core2.dts dts: m5stack,core2.dts

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: m5stack,cores3.dts dts: m5stack,cores3.dts

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: m5stack,papers3.dts dts: m5stack,papers3.dts

View File

@ -25,6 +25,6 @@ static DeviceVector createDevices() {
extern const Configuration hardwareConfiguration = { extern const Configuration hardwareConfiguration = {
.initBoot = initBoot, .initBoot = initBoot,
.uiScale = UiScale::Smallest, .uiDensity = UiDensity::Compact,
.createDevices = createDevices .createDevices = createDevices
}; };

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: m5stack,stickc-plus.dts dts: m5stack,stickc-plus.dts

View File

@ -28,6 +28,6 @@ static DeviceVector createDevices() {
extern const Configuration hardwareConfiguration = { extern const Configuration hardwareConfiguration = {
.initBoot = initBoot, .initBoot = initBoot,
.uiScale = UiScale::Smallest, .uiDensity = UiDensity::Compact,
.createDevices = createDevices .createDevices = createDevices
}; };

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: m5stack,stickc-plus2.dts dts: m5stack,stickc-plus2.dts

View File

@ -20,6 +20,8 @@ dpi=294
[lvgl] [lvgl]
colorDepth=16 colorDepth=16
fontSize=28
dpi=250
[cdn] [cdn]
warningMessage=Only the original hardware variant with the ILI9881C display is supported for now warningMessage=Only the original hardware variant with the ILI9881C display is supported for now

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: m5stack,tab5.dts dts: m5stack,tab5.dts

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformPosix - Platforms/platform-posix
dts: simulator.dts dts: simulator.dts

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: unphone.dts dts: unphone.dts

View File

@ -21,6 +21,6 @@ static bool initBoot() {
extern const Configuration hardwareConfiguration = { extern const Configuration hardwareConfiguration = {
.initBoot = initBoot, .initBoot = initBoot,
.uiScale = UiScale::Smallest, .uiDensity = UiDensity::Compact,
.createDevices = createDevices .createDevices = createDevices
}; };

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: waveshare,esp32-s3-geek.dts dts: waveshare,esp32-s3-geek.dts

View File

@ -20,6 +20,6 @@ static bool initBoot() {
extern const Configuration hardwareConfiguration = { extern const Configuration hardwareConfiguration = {
.initBoot = initBoot, .initBoot = initBoot,
.uiScale = UiScale::Smallest, .uiDensity = UiDensity::Compact,
.createDevices = createDevices .createDevices = createDevices
}; };

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: waveshare,s3-lcd-13.dts dts: waveshare,s3-lcd-13.dts

View File

@ -20,6 +20,6 @@ static bool initBoot() {
extern const Configuration hardwareConfiguration = { extern const Configuration hardwareConfiguration = {
.initBoot = initBoot, .initBoot = initBoot,
.uiScale = UiScale::Smallest, .uiDensity = UiDensity::Compact,
.createDevices = createDevices .createDevices = createDevices
}; };

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: waveshare,s3-touch-lcd-128.dts dts: waveshare,s3-touch-lcd-128.dts

View File

@ -16,6 +16,6 @@ static std::vector<std::shared_ptr<tt::hal::Device>> createDevices() {
extern const Configuration hardwareConfiguration = { extern const Configuration hardwareConfiguration = {
.initBoot = initBoot, .initBoot = initBoot,
.uiScale = UiScale::Smallest, .uiDensity = UiDensity::Compact,
.createDevices = createDevices .createDevices = createDevices
}; };

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: waveshare,s3-touch-lcd-147.dts dts: waveshare,s3-touch-lcd-147.dts

View File

@ -21,3 +21,4 @@ dpi=217
[lvgl] [lvgl]
colorDepth=16 colorDepth=16
fontSize=18

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: waveshare,s3-touch-lcd-43.dts dts: waveshare,s3-touch-lcd-43.dts

View File

@ -1,3 +1,3 @@
dependencies: dependencies:
- Platforms/PlatformEsp32 - Platforms/platform-esp32
dts: wireless-tag,wt32-sc01-plus.dts dts: wireless-tag,wt32-sc01-plus.dts

View File

@ -87,7 +87,6 @@
- Remove flex_flow from app_container in Gui.cpp - Remove flex_flow from app_container in Gui.cpp
- Files app: copy/cut/paste actions - Files app: copy/cut/paste actions
- ElfAppManifest: change name (remove "manifest" as it's confusing), remove icon and title, publish snapshot SDK on CDN - ElfAppManifest: change name (remove "manifest" as it's confusing), remove icon and title, publish snapshot SDK on CDN
- `UiScale` implementation for devices like the CYD 2432S032C
- Bug: CYD 2432S032C screen rotation fails due to touch driver issue - Bug: CYD 2432S032C screen rotation fails due to touch driver issue
- Calculator app should show regular text input field on non-touch devices that have a keyboard (Cardputer, T-Lora Pager) - Calculator app should show regular text input field on non-touch devices that have a keyboard (Cardputer, T-Lora Pager)
- Allow for WSAD keys to navigate LVGL (this is extra nice for cardputer, but just handy in general) - Allow for WSAD keys to navigate LVGL (this is extra nice for cardputer, but just handy in general)

View File

@ -13,6 +13,7 @@
static const auto LOGGER = tt::Logger("Ssd1306Display"); static const auto LOGGER = tt::Logger("Ssd1306Display");
// SSD1306 commands // SSD1306 commands
#define SSD1306_CMD_SET_CLOCK 0xD5
#define SSD1306_CMD_SET_CHARGE_PUMP 0x8D #define SSD1306_CMD_SET_CHARGE_PUMP 0x8D
#define SSD1306_CMD_SET_SEGMENT_REMAP 0xA0 #define SSD1306_CMD_SET_SEGMENT_REMAP 0xA0
#define SSD1306_CMD_SET_COM_SCAN_DIR 0xC0 #define SSD1306_CMD_SET_COM_SCAN_DIR 0xC0
@ -20,11 +21,17 @@ static const auto LOGGER = tt::Logger("Ssd1306Display");
#define SSD1306_CMD_SET_CONTRAST 0x81 #define SSD1306_CMD_SET_CONTRAST 0x81
#define SSD1306_CMD_SET_PRECHARGE 0xD9 #define SSD1306_CMD_SET_PRECHARGE 0xD9
#define SSD1306_CMD_SET_VCOMH_DESELECT 0xDB #define SSD1306_CMD_SET_VCOMH_DESELECT 0xDB
#define SSD1306_CMD_DISPLAY_INVERT 0xA6 #define SSD1306_CMD_DISPLAY_NORMAL 0xA6
#define SSD1306_CMD_DISPLAY_INVERT 0xA7
#define SSD1306_CMD_DISPLAY_OFF 0xAE
#define SSD1306_CMD_DISPLAY_ON 0xAF #define SSD1306_CMD_DISPLAY_ON 0xAF
#define SSD1306_CMD_SET_MEMORY_ADDR_MODE 0x20 #define SSD1306_CMD_SET_MEMORY_MODE 0x20
#define SSD1306_CMD_SET_COLUMN_RANGE 0x21 #define SSD1306_CMD_SET_COLUMN_RANGE 0x21
#define SSD1306_CMD_SET_PAGE_RANGE 0x22 #define SSD1306_CMD_SET_PAGE_RANGE 0x22
#define SSD1306_CMD_SET_MULTIPLEX 0xA8
#define SSD1306_CMD_SET_OFFSET 0xD3
#define SSD1306_CMD_STOP_SCROLL 0x2E
#define SSD1306_CMD_SET_SCAN_DIRECTION_REVERSED 0xC8
// Helper to send I2C commands directly // Helper to send I2C commands directly
static bool ssd1306_i2c_send_cmd(i2c_port_t port, uint8_t addr, uint8_t cmd) { static bool ssd1306_i2c_send_cmd(i2c_port_t port, uint8_t addr, uint8_t cmd) {
@ -40,15 +47,20 @@ static bool ssd1306_i2c_send_cmd(i2c_port_t port, uint8_t addr, uint8_t cmd) {
bool Ssd1306Display::createIoHandle(esp_lcd_panel_io_handle_t& ioHandle) { bool Ssd1306Display::createIoHandle(esp_lcd_panel_io_handle_t& ioHandle) {
const esp_lcd_panel_io_i2c_config_t io_config = { const esp_lcd_panel_io_i2c_config_t io_config = {
.dev_addr = configuration->deviceAddress, .dev_addr = configuration->deviceAddress,
.on_color_trans_done = nullptr,
.user_ctx = nullptr,
.control_phase_bytes = 1, .control_phase_bytes = 1,
.dc_bit_offset = 6, .dc_bit_offset = 6,
.lcd_cmd_bits = 0,
.lcd_param_bits = 0,
.flags = { .flags = {
.dc_low_on_data = false, .dc_low_on_data = false,
.disable_control_phase = false, .disable_control_phase = false,
}, },
.scl_speed_hz = 0
}; };
if (esp_lcd_new_panel_io_i2c((esp_lcd_i2c_bus_handle_t)configuration->port, &io_config, &ioHandle) != ESP_OK) { if (esp_lcd_new_panel_io_i2c(static_cast<esp_lcd_i2c_bus_handle_t>(configuration->port), &io_config, &ioHandle) != ESP_OK) {
LOGGER.error("Failed to create IO handle"); LOGGER.error("Failed to create IO handle");
return false; return false;
} }
@ -78,6 +90,7 @@ bool Ssd1306Display::createPanelHandle(esp_lcd_panel_io_handle_t ioHandle, esp_l
esp_lcd_panel_dev_config_t panel_config = { esp_lcd_panel_dev_config_t panel_config = {
.reset_gpio_num = GPIO_NUM_NC, // Already handled above .reset_gpio_num = GPIO_NUM_NC, // Already handled above
.color_space = ESP_LCD_COLOR_SPACE_MONOCHROME, .color_space = ESP_LCD_COLOR_SPACE_MONOCHROME,
.data_endian = LCD_RGB_DATA_ENDIAN_BIG,
.bits_per_pixel = 1, // Must be 1 for monochrome .bits_per_pixel = 1, // Must be 1 for monochrome
.flags = { .flags = {
.reset_active_high = false, .reset_active_high = false,
@ -106,22 +119,18 @@ bool Ssd1306Display::createPanelHandle(esp_lcd_panel_io_handle_t ioHandle, esp_l
LOGGER.info("Sending Heltec V3 custom init sequence"); LOGGER.info("Sending Heltec V3 custom init sequence");
// Display off while configuring // Display off while configuring
ssd1306_i2c_send_cmd(port, addr, 0xAE); ssd1306_i2c_send_cmd(port, addr, SSD1306_CMD_DISPLAY_OFF);
vTaskDelay(pdMS_TO_TICKS(10)); // Important: let display stabilize after turning off
// Set oscillator frequency (MUST come early in sequence) // Set oscillator frequency (MUST come early in sequence)
ssd1306_i2c_send_cmd(port, addr, 0xD5); ssd1306_i2c_send_cmd(port, addr, SSD1306_CMD_SET_CLOCK);
ssd1306_i2c_send_cmd(port, addr, 0x80); ssd1306_i2c_send_cmd(port, addr, 0xF0); // ~96 Hz
// Set multiplex ratio // Set multiplex ratio
ssd1306_i2c_send_cmd(port, addr, 0xA8); ssd1306_i2c_send_cmd(port, addr, SSD1306_CMD_SET_MULTIPLEX);
ssd1306_i2c_send_cmd(port, addr, configuration->verticalResolution - 1); ssd1306_i2c_send_cmd(port, addr, configuration->verticalResolution - 1);
// Set display offset ssd1306_i2c_send_cmd(port, addr, SSD1306_CMD_SET_OFFSET);
ssd1306_i2c_send_cmd(port, addr, 0xD3);
ssd1306_i2c_send_cmd(port, addr, 0x00); ssd1306_i2c_send_cmd(port, addr, 0x00);
// Set display start line
ssd1306_i2c_send_cmd(port, addr, 0x40); ssd1306_i2c_send_cmd(port, addr, 0x40);
// Enable charge pump (required for Heltec V3 - must be before memory mode) // Enable charge pump (required for Heltec V3 - must be before memory mode)
@ -129,14 +138,13 @@ bool Ssd1306Display::createPanelHandle(esp_lcd_panel_io_handle_t ioHandle, esp_l
ssd1306_i2c_send_cmd(port, addr, 0x14); // Enable ssd1306_i2c_send_cmd(port, addr, 0x14); // Enable
// Horizontal addressing mode // Horizontal addressing mode
ssd1306_i2c_send_cmd(port, addr, SSD1306_CMD_SET_MEMORY_ADDR_MODE); ssd1306_i2c_send_cmd(port, addr, SSD1306_CMD_SET_MEMORY_MODE);
ssd1306_i2c_send_cmd(port, addr, 0x00); ssd1306_i2c_send_cmd(port, addr, 0x00); // Horizontal addressing
// Segment remap (0xA1 for Heltec V3 orientation) // Segment remap (0xA1 for Heltec V3 orientation)
ssd1306_i2c_send_cmd(port, addr, SSD1306_CMD_SET_SEGMENT_REMAP | 0x01); ssd1306_i2c_send_cmd(port, addr, SSD1306_CMD_SET_SEGMENT_REMAP | 0x01);
// COM scan direction (0xC8 = reversed) ssd1306_i2c_send_cmd(port, addr, SSD1306_CMD_SET_SCAN_DIRECTION_REVERSED );
ssd1306_i2c_send_cmd(port, addr, 0xC8);
// COM pin configuration // COM pin configuration
ssd1306_i2c_send_cmd(port, addr, SSD1306_CMD_SET_COM_PIN_CFG); ssd1306_i2c_send_cmd(port, addr, SSD1306_CMD_SET_COM_PIN_CFG);
@ -146,26 +154,30 @@ bool Ssd1306Display::createPanelHandle(esp_lcd_panel_io_handle_t ioHandle, esp_l
ssd1306_i2c_send_cmd(port, addr, 0x02); // Sequential COM pin config for 32-row displays ssd1306_i2c_send_cmd(port, addr, 0x02); // Sequential COM pin config for 32-row displays
} }
// Contrast (0xCF = bright, good for Heltec OLED)
ssd1306_i2c_send_cmd(port, addr, SSD1306_CMD_SET_CONTRAST); ssd1306_i2c_send_cmd(port, addr, SSD1306_CMD_SET_CONTRAST);
ssd1306_i2c_send_cmd(port, addr, 0xCF); ssd1306_i2c_send_cmd(port, addr, 0xCF);
// Precharge period (0xF1 for Heltec OLED)
ssd1306_i2c_send_cmd(port, addr, SSD1306_CMD_SET_PRECHARGE); ssd1306_i2c_send_cmd(port, addr, SSD1306_CMD_SET_PRECHARGE);
ssd1306_i2c_send_cmd(port, addr, 0xF1); ssd1306_i2c_send_cmd(port, addr, 0xF1);
// VCOMH deselect level
ssd1306_i2c_send_cmd(port, addr, SSD1306_CMD_SET_VCOMH_DESELECT); ssd1306_i2c_send_cmd(port, addr, SSD1306_CMD_SET_VCOMH_DESELECT);
ssd1306_i2c_send_cmd(port, addr, 0x40); ssd1306_i2c_send_cmd(port, addr, 0x40);
// Normal display mode (not inverse/all-on) ssd1306_i2c_send_cmd(port, addr, SSD1306_CMD_SET_COLUMN_RANGE);
ssd1306_i2c_send_cmd(port, addr, 0xA6); ssd1306_i2c_send_cmd(port, addr, 0);
ssd1306_i2c_send_cmd(port, addr, configuration->horizontalResolution - 1);
// Invert display (0xA7) ssd1306_i2c_send_cmd(port, addr, SSD1306_CMD_SET_PAGE_RANGE);
// This is what your old working driver did unconditionally ssd1306_i2c_send_cmd(port, addr, 0);
ssd1306_i2c_send_cmd(port, addr, 0xA7); if (configuration->verticalResolution == 64)
ssd1306_i2c_send_cmd(port, addr, 0x7);
else if (configuration->verticalResolution == 32)
ssd1306_i2c_send_cmd(port, addr, 0x3);
else
check(false, "Not supported");
// Display ON ssd1306_i2c_send_cmd(port, addr, SSD1306_CMD_DISPLAY_INVERT);
ssd1306_i2c_send_cmd(port, addr, SSD1306_CMD_STOP_SCROLL);
ssd1306_i2c_send_cmd(port, addr, SSD1306_CMD_DISPLAY_ON); ssd1306_i2c_send_cmd(port, addr, SSD1306_CMD_DISPLAY_ON);
vTaskDelay(pdMS_TO_TICKS(100)); // Let display stabilize vTaskDelay(pdMS_TO_TICKS(100)); // Let display stabilize

View File

@ -25,7 +25,7 @@ if (DEFINED ENV{ESP_IDF_VERSION})
idf_component_register( idf_component_register(
SRCS ${SOURCE_FILES} "${GENERATED_DIR}/devicetree.c" SRCS ${SOURCE_FILES} "${GENERATED_DIR}/devicetree.c"
REQUIRES Tactility TactilityC TactilityKernel PlatformEsp32 ${TACTILITY_DEVICE_PROJECT} REQUIRES Tactility TactilityC TactilityKernel platform-esp32 ${TACTILITY_DEVICE_PROJECT}
) )
else () else ()
@ -39,7 +39,7 @@ else ()
hal-device-module hal-device-module
lvgl-module lvgl-module
Simulator Simulator
PlatformPosix platform-posix
SDL2::SDL2-static SDL2-static SDL2::SDL2-static SDL2-static
) )

View File

@ -17,7 +17,43 @@ menu "Tactility App"
help help
The applications that gives access to other application. The applications that gives access to other application.
This is the first thing that starts after the boot screen. This is the first thing that starts after the boot screen.
The user can override it from a boot.properties file. The user can override it with a boot.properties file
config TT_LVGL_FONT_SIZE_SMALL
int "Small font size"
default 10
range 8 200
help
Small font size in pixels
config TT_LVGL_FONT_SIZE_DEFAULT
int "Default font size"
default 14
range 8 200
help
Default font size in pixels
config TT_LVGL_FONT_SIZE_LARGE
int "Large font size"
default 18
range 8 200
help
Large font size in pixels
config TT_LVGL_STATUSBAR_ICON_SIZE
int "Statusbar icon size"
default 20
range 0 200
help
Statusbar icon size in pixels
config TT_LVGL_LAUNCHER_ICON_SIZE
int "Launcher icon size"
default 20
range 0 200
help
Launcher icon size in pixels
config TT_LVGL_SHARED_ICON_SIZE
int "Shared icon size"
default 16
range 0 200
help
Shared icon size in pixels
config TT_AUTO_START_APP_ID config TT_AUTO_START_APP_ID
string "Auto Start App ID" string "Auto Start App ID"
default "" default ""

View File

@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.20)
include("${CMAKE_CURRENT_LIST_DIR}/../../Buildscripts/module.cmake") include("${CMAKE_CURRENT_LIST_DIR}/../../Buildscripts/module.cmake")
file(GLOB_RECURSE SOURCE_FILES "Source/*.c*") file(GLOB_RECURSE SOURCE_FILES "source/*.c*")
list(APPEND REQUIRES_LIST list(APPEND REQUIRES_LIST
TactilityKernel TactilityKernel
@ -16,6 +16,6 @@ endif ()
tactility_add_module(hal-device-module tactility_add_module(hal-device-module
SRCS ${SOURCE_FILES} SRCS ${SOURCE_FILES}
INCLUDE_DIRS Include/ INCLUDE_DIRS include/
REQUIRES ${REQUIRES_LIST} REQUIRES ${REQUIRES_LIST}
) )

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