Kernel and TactilitySDK improvements (#479)

* **New Features**
  * Expanded public device and driver APIs (accessors, sync, lifecycle, binding) and a module construct+start helper.
  * Added kernel symbol registry and new exported symbols (lvgl, C++ nothrow, I2S APIs, additional math funcs).

* **Refactor**
  * Renamed device traversal APIs for consistency (device_for_each*).
  * Moved inline helpers to explicit public declarations.

* **Chores**
  * Replaced several shell release scripts with Python-based SDK release tooling.
* **Style**
  * Header naming consistency fixes.
This commit is contained in:
Ken Van Hoeylandt
2026-02-03 23:24:37 +01:00
committed by GitHub
parent 9cc96fd32b
commit 9a672a30ff
29 changed files with 684 additions and 217 deletions
-10
View File
@@ -1,10 +0,0 @@
idf_component_register(
INCLUDE_DIRS "Libraries/TactilityC/Include" "Libraries/lvgl/Include" "Libraries/TactilityFreeRtos/Include"
REQUIRES esp_timer
)
add_prebuilt_library(TactilityC Libraries/TactilityC/Binary/libTactilityC.a)
add_prebuilt_library(lvgl Libraries/lvgl/Binary/liblvgl.a)
target_link_libraries(${COMPONENT_LIB} INTERFACE TactilityC)
target_link_libraries(${COMPONENT_LIB} INTERFACE lvgl)
+19
View File
@@ -0,0 +1,19 @@
idf_component_register(
INCLUDE_DIRS
"Libraries/TactilityC/Include"
"Libraries/TactilityKernel/Include"
"Libraries/TactilityFreeRtos/Include"
"Libraries/lvgl/Include"
"Libraries/lvgl-module/Include"
REQUIRES esp_timer
)
add_prebuilt_library(TactilityC Libraries/TactilityC/Binary/libTactilityC.a)
add_prebuilt_library(TactilityKernel Libraries/TactilityKernel/Binary/libTactilityKernel.a)
add_prebuilt_library(lvgl Libraries/lvgl/Binary/liblvgl.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 TactilityKernel)
target_link_libraries(${COMPONENT_LIB} INTERFACE lvgl)
target_link_libraries(${COMPONENT_LIB} INTERFACE lvgl-module)
Binary file not shown.
-4
View File
@@ -1,4 +0,0 @@
#!/bin/sh
config_idf_target=`cat sdkconfig | grep CONFIG_IDF_TARGET=`
echo ${config_idf_target:19:-1}
+58
View File
@@ -0,0 +1,58 @@
#!/usr/bin/env python3
import os
import shutil
import subprocess
import sys
def get_idf_target():
try:
with open("sdkconfig", "r") as f:
for line in f:
if line.startswith("CONFIG_IDF_TARGET="):
# CONFIG_IDF_TARGET="esp32s3" -> esp32s3
return line.split('=')[1].strip().strip('"')
except FileNotFoundError:
print("sdkconfig not found")
return None
return None
def main():
# 1. Get idf_target
idf_target = get_idf_target()
if not idf_target:
print("Could not determine IDF target from sdkconfig")
sys.exit(1)
# 2. Get version
try:
with open("version.txt", "r") as f:
version = f.read().strip()
except FileNotFoundError:
print("version.txt not found")
sys.exit(1)
# 3. Construct sdk_path
# release/TactilitySDK/${version}-${idf_target}/TactilitySDK
sdk_path = os.path.join("release", "TactilitySDK", f"{version}-{idf_target}", "TactilitySDK")
# 4. Cleanup sdk_path
if os.path.exists(sdk_path):
print(f"Cleaning up {sdk_path}")
shutil.rmtree(sdk_path)
os.makedirs(sdk_path, exist_ok=True)
# 5. Call release-sdk.py
# Note: Using sys.executable to ensure we use the same python interpreter
script_path = os.path.join("Buildscripts", "release-sdk.py")
print(f"Running {script_path} {sdk_path}")
result = subprocess.run([sys.executable, script_path, sdk_path])
if result.returncode != 0:
print(f"Error: {script_path} failed with return code {result.returncode}")
sys.exit(result.returncode)
if __name__ == "__main__":
main()
-14
View File
@@ -1,14 +0,0 @@
#!/bin/sh
#
# Description: Releases the current build files as an SDK in release/TactilitySDK-[platform]
# This deployment is used when compiling new SDK features for apps.
#
idf_target=`Buildscripts/get-idf-target.sh`
version=`cat version.txt`
sdk_path="release/TactilitySDK/${version}-${idf_target}/TactilitySDK"
mkdir -p ${sdk_path}
echo Cleaning up ${sdk_path}
rm -rf ${sdk_path}
./Buildscripts/release-sdk.sh ${sdk_path}
+117
View File
@@ -0,0 +1,117 @@
#!/usr/bin/env python3
import os
import shutil
import glob
import subprocess
import sys
def map_copy(mappings, target_base):
"""
Helper function to map input files/directories to output files/directories.
mappings: list of dicts with 'src' (glob pattern) and 'dst' (relative to target_base or absolute)
'src' can be a single file or a directory (if it ends with /).
"""
for mapping in mappings:
src_pattern = mapping['src']
dst_rel = mapping['dst']
dst_path = os.path.join(target_base, dst_rel)
# To preserve directory structure, we need to know where the wildcard starts
# or have a way to determine the "base" of the search.
# We'll split the pattern into a fixed base and a pattern part.
# Simple heuristic: find the first occurrence of '*' or '?'
wildcard_idx = -1
for i, char in enumerate(src_pattern):
if char in '*?':
wildcard_idx = i
break
if wildcard_idx != -1:
# Found a wildcard. The base is the directory containing it.
pattern_base = os.path.dirname(src_pattern[:wildcard_idx])
else:
# No wildcard. If it's a directory, we might want to preserve its name?
# For now, let's treat no-wildcard as no relative structure needed.
pattern_base = None
src_files = glob.glob(src_pattern, recursive=True)
if not src_files:
continue
for src in src_files:
if os.path.isdir(src):
continue
if pattern_base and src.startswith(pattern_base):
# Calculate relative path from the base of the glob pattern
rel_src = os.path.relpath(src, pattern_base)
# If dst_rel ends with /, it's a target directory
if dst_rel.endswith('/') or os.path.isdir(dst_path):
final_dst = os.path.join(dst_path, rel_src)
else:
# If dst_rel is a file, we can't really preserve structure
# unless we join it. But usually it's a dir if structure is preserved.
final_dst = dst_path
else:
final_dst = dst_path if not (dst_rel.endswith('/') or os.path.isdir(dst_path)) else os.path.join(dst_path, os.path.basename(src))
os.makedirs(os.path.dirname(final_dst), exist_ok=True)
shutil.copy2(src, final_dst)
def main():
if len(sys.argv) < 2:
print("Usage: release-sdk.py [target_path]")
print("Example: release-sdk.py release/TactilitySDK")
sys.exit(1)
target_path = os.path.abspath(sys.argv[1])
os.makedirs(target_path, exist_ok=True)
# Mapping logic
mappings = [
{'src': 'version.txt', 'dst': ''},
# TactilityC
{'src': 'build/esp-idf/TactilityC/libTactilityC.a', 'dst': 'Libraries/TactilityC/Binary/'},
{'src': 'TactilityC/Include/*', 'dst': 'Libraries/TactilityC/Include/'},
{'src': 'TactilityC/CMakeLists.txt', 'dst': 'Libraries/TactilityC/'},
{'src': 'TactilityC/LICENSE*.*', 'dst': 'Libraries/TactilityC/'},
# TactilityFreeRtos
{'src': 'TactilityFreeRtos/Include/**', 'dst': 'Libraries/TactilityFreeRtos/Include/'},
{'src': 'TactilityFreeRtos/CMakeLists.txt', 'dst': 'Libraries/TactilityFreeRtos/'},
{'src': 'TactilityFreeRtos/LICENSE*.*', 'dst': 'Libraries/TactilityFreeRtos/'},
# TactilityKernel
{'src': 'build/esp-idf/TactilityKernel/libTactilityKernel.a', 'dst': 'Libraries/TactilityKernel/Binary/'},
{'src': 'TactilityKernel/Include/**', 'dst': 'Libraries/TactilityKernel/Include/'},
{'src': 'TactilityKernel/CMakeLists.txt', 'dst': 'Libraries/TactilityKernel/'},
{'src': 'TactilityKernel/LICENSE*.*', 'dst': 'Libraries/TactilityKernel/'},
# lvgl-module
{'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/CMakeLists.txt', 'dst': 'Libraries/lvgl-module/'},
{'src': 'Modules/lvgl-module/LICENSE*.*', 'dst': 'Libraries/lvgl-module/'},
# lvgl (basics)
{'src': 'build/esp-idf/lvgl/liblvgl.a', 'dst': 'Libraries/lvgl/Binary/'},
{'src': 'Libraries/lvgl/lvgl.h', 'dst': 'Libraries/lvgl/Include/'},
{'src': 'Libraries/lvgl/lv_version.h', 'dst': 'Libraries/lvgl/Include/'},
{'src': 'Libraries/lvgl/LICENCE.txt', 'dst': 'Libraries/lvgl/LICENSE.txt'},
{'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/'},
# elf_loader
{'src': 'Libraries/elf_loader/elf_loader.cmake', 'dst': 'Libraries/elf_loader/'},
{'src': 'Libraries/elf_loader/license.txt', 'dst': 'Libraries/elf_loader/'},
# Final scripts
{'src': 'Buildscripts/TactilitySDK/TactilitySDK.cmake', 'dst': ''},
{'src': 'Buildscripts/TactilitySDK/CMakeLists.txt', 'dst': ''},
]
map_copy(mappings, target_path)
# Output ESP-IDF SDK version to file
esp_idf_version = os.environ.get("ESP_IDF_VERSION", "")
with open(os.path.join(target_path, "idf-version.txt"), "a") as f:
f.write(esp_idf_version)
if __name__ == "__main__":
main()
-58
View File
@@ -1,58 +0,0 @@
#!/bin/sh
#
# Usage: release-sdk.sh [target_path]
# Example: release.sh release/TactilitySDK
# Description: Releases the current build files as an SDK in the specified folder.
#
target_path=$1
mkdir -p $target_path
build_dir=`pwd`
library_path=$target_path/Libraries
cp version.txt $target_path
# TactilityC
tactility_library_path=$library_path/TactilityC
mkdir -p $tactility_library_path/Binary
cp build/esp-idf/TactilityC/libTactilityC.a $tactility_library_path/Binary/
mkdir -p $tactility_library_path/Include
find_target_dir="$build_dir/$tactility_library_path"
cp TactilityC/Include/* "$find_target_dir/Include"
cp TactilityC/*.txt "$find_target_dir"
cp TactilityC/*.md "$find_target_dir"
# TactilityFreeRtos
tactilityfreertos_library_path=$library_path/TactilityFreeRtos
mkdir -p "$tactilityfreertos_library_path/Include"
find_target_dir="$build_dir/$tactilityfreertos_library_path"
cp -r TactilityFreeRtos/Include/* "$find_target_dir/Include"
cp TactilityFreeRtos/*.txt "$find_target_dir"
cp TactilityFreeRtos/*.md "$find_target_dir"
# lvgl
lvgl_library_path=$library_path/lvgl
mkdir -p "$lvgl_library_path/Binary"
mkdir -p "$lvgl_library_path/Include"
cp build/esp-idf/lvgl/liblvgl.a "$lvgl_library_path/Binary/"
find_target_dir="$build_dir/$lvgl_library_path"
cd Libraries/lvgl
find src/ -name '*.h' | cpio -pdm "$find_target_dir/Include"
cd -
cp Libraries/lvgl/lvgl.h "$find_target_dir/Include"
cp Libraries/lvgl/lv_version.h "$find_target_dir/Include"
cp Libraries/lvgl/LICENCE.txt "$lvgl_library_path/LICENSE.txt"
cp Libraries/lvgl/src/lv_conf_kconfig.h "$lvgl_library_path/Include/lv_conf.h"
# elf_loader
elf_loader_library_path="$library_path/elf_loader"
mkdir -p "$elf_loader_library_path"
cp Libraries/elf_loader/elf_loader.cmake "$elf_loader_library_path/"
cp Libraries/elf_loader/license.txt "$elf_loader_library_path/"
cp Buildscripts/CMake/TactilitySDK.cmake "$target_path/"
cp Buildscripts/CMake/CMakeLists.txt "$target_path/"
printf '%s' "$ESP_IDF_VERSION" >> "$target_path/idf-version.txt"