From b214a3358eac0ebadc0bea4f46e2979befcf02fa Mon Sep 17 00:00:00 2001 From: Ken Van Hoeylandt Date: Wed, 1 Oct 2025 23:07:47 +0200 Subject: [PATCH] Merge develop into main (#353) ## TactilityC - Add `tt_lvgl_lock()` and `tt_lvgl_unlock()` - Add `tt_thread_set_affinity()` - Add support for STL symbols ## Other - Add `Thread::setAffinity()` - `GuiService`: replace `#define` with `constexpr` - Remove log storage and log app for now - Split up ELF symbols into more groups --- CMakeLists.txt | 1 - .../Source/ChargeFromVoltage.cpp | 2 + .../Tactility/service/gui/GuiService.h | 8 +- Tactility/Source/Tactility.cpp | 2 - Tactility/Source/app/log/Log.cpp | 130 ------------------ TactilityC/Include/tt_lvgl.h | 6 + TactilityC/Include/tt_thread.h | 6 + TactilityC/Private/symbols/esp_event.h | 5 + TactilityC/Private/symbols/esp_http_client.h | 5 + TactilityC/Private/symbols/gcc_soft_float.h | 8 -- TactilityC/Private/symbols/pthread.h | 5 + TactilityC/Private/symbols/stl.h | 5 + TactilityC/Source/symbols/esp_event.cpp | 22 +++ TactilityC/Source/symbols/esp_http_client.cpp | 46 +++++++ TactilityC/Source/symbols/gcc_soft_float.cpp | 8 +- TactilityC/Source/symbols/pthread.cpp | 11 ++ TactilityC/Source/symbols/stl.cpp | 18 +++ TactilityC/Source/tt_init.cpp | 118 +++++----------- TactilityC/Source/tt_lvgl.cpp | 9 ++ TactilityC/Source/tt_thread.cpp | 6 +- TactilityCore/Include/Tactility/Log.h | 28 +--- TactilityCore/Include/Tactility/LogEsp.h | 1 + TactilityCore/Include/Tactility/Thread.h | 5 + TactilityCore/Source/Log.cpp | 50 ------- TactilityCore/Source/LogEsp.cpp | 24 ---- TactilityCore/Source/LogSimulator.cpp | 6 - TactilityCore/Source/Thread.cpp | 7 +- 27 files changed, 198 insertions(+), 344 deletions(-) delete mode 100644 Tactility/Source/app/log/Log.cpp create mode 100644 TactilityC/Private/symbols/esp_event.h create mode 100644 TactilityC/Private/symbols/esp_http_client.h create mode 100644 TactilityC/Private/symbols/pthread.h create mode 100644 TactilityC/Private/symbols/stl.h create mode 100644 TactilityC/Source/symbols/esp_event.cpp create mode 100644 TactilityC/Source/symbols/esp_http_client.cpp create mode 100644 TactilityC/Source/symbols/pthread.cpp create mode 100644 TactilityC/Source/symbols/stl.cpp delete mode 100644 TactilityCore/Source/Log.cpp delete mode 100644 TactilityCore/Source/LogEsp.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 7f44b7d7..d388273e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -49,7 +49,6 @@ if (DEFINED ENV{ESP_IDF_VERSION}) set(EXCLUDE_COMPONENTS "Simulator") idf_build_set_property(LINK_OPTIONS "-Wl,--wrap=esp_panic_handler" APPEND) - idf_build_set_property(LINK_OPTIONS "-Wl,--wrap=esp_log_write" APPEND) idf_build_set_property(LINK_OPTIONS "-Wl,--wrap=lv_button_create" APPEND) idf_build_set_property(LINK_OPTIONS "-Wl,--wrap=lv_dropdown_create" APPEND) idf_build_set_property(LINK_OPTIONS "-Wl,--wrap=lv_list_create" APPEND) diff --git a/Drivers/EstimatedPower/Source/ChargeFromVoltage.cpp b/Drivers/EstimatedPower/Source/ChargeFromVoltage.cpp index cd558f83..a8dbd03a 100644 --- a/Drivers/EstimatedPower/Source/ChargeFromVoltage.cpp +++ b/Drivers/EstimatedPower/Source/ChargeFromVoltage.cpp @@ -1,4 +1,6 @@ #include "ChargeFromVoltage.h" + +#include #include constexpr auto* TAG = "ChargeFromVoltage"; diff --git a/Tactility/Private/Tactility/service/gui/GuiService.h b/Tactility/Private/Tactility/service/gui/GuiService.h index 4ed67511..f90e4c69 100644 --- a/Tactility/Private/Tactility/service/gui/GuiService.h +++ b/Tactility/Private/Tactility/service/gui/GuiService.h @@ -12,10 +12,10 @@ namespace tt::service::gui { -#define GUI_THREAD_FLAG_DRAW (1 << 0) -#define GUI_THREAD_FLAG_INPUT (1 << 1) -#define GUI_THREAD_FLAG_EXIT (1 << 2) -#define GUI_THREAD_FLAG_ALL (GUI_THREAD_FLAG_DRAW | GUI_THREAD_FLAG_INPUT | GUI_THREAD_FLAG_EXIT) +constexpr auto GUI_THREAD_FLAG_DRAW = (1 << 0); +constexpr auto GUI_THREAD_FLAG_INPUT = (1 << 1); +constexpr auto GUI_THREAD_FLAG_EXIT = (1 << 2); +constexpr auto GUI_THREAD_FLAG_ALL = (GUI_THREAD_FLAG_DRAW | GUI_THREAD_FLAG_INPUT | GUI_THREAD_FLAG_EXIT); class GuiService final : public Service { diff --git a/Tactility/Source/Tactility.cpp b/Tactility/Source/Tactility.cpp index f2f2005d..0268f725 100644 --- a/Tactility/Source/Tactility.cpp +++ b/Tactility/Source/Tactility.cpp @@ -72,7 +72,6 @@ namespace app { namespace inputdialog { extern const AppManifest manifest; } namespace launcher { extern const AppManifest manifest; } namespace localesettings { extern const AppManifest manifest; } - namespace log { extern const AppManifest manifest; } namespace notes { extern const AppManifest manifest; } namespace power { extern const AppManifest manifest; } namespace selectiondialog { extern const AppManifest manifest; } @@ -111,7 +110,6 @@ static void registerSystemApps() { addApp(app::inputdialog::manifest); addApp(app::launcher::manifest); addApp(app::localesettings::manifest); - addApp(app::log::manifest); addApp(app::notes::manifest); addApp(app::settings::manifest); addApp(app::selectiondialog::manifest); diff --git a/Tactility/Source/app/log/Log.cpp b/Tactility/Source/app/log/Log.cpp deleted file mode 100644 index 14d666ab..00000000 --- a/Tactility/Source/app/log/Log.cpp +++ /dev/null @@ -1,130 +0,0 @@ -#include -#include -#include -#include -#include - -#include -#include -#include - -#include - -namespace tt::app::log { - -class LogApp : public App { - - static constexpr auto* TAG = "LogApp"; - - LogLevel filterLevel = LogLevel::Info; - lv_obj_t* labelWidget = nullptr; - - static bool shouldShowLog(LogLevel filterLevel, LogLevel logLevel) { - return filterLevel >= logLevel; - } - - void updateLogEntries() { - std::size_t next_log_index; - auto entries = copyLogEntries(next_log_index); - std::stringstream buffer; - - if (next_log_index != 0) { - long to_drop = TT_LOG_ENTRY_COUNT - next_log_index; - for (auto entry : std::views::drop(*entries, (long)next_log_index)) { - if (shouldShowLog(filterLevel, entry.level) && entry.message[0] != 0x00) { - buffer << entry.message; - } - } - } - - for (auto entry : std::views::take(*entries, (long)next_log_index)) { - if (shouldShowLog(filterLevel, entry.level) && entry.message[0] != 0x00) { - buffer << entry.message; - } - } - - if (!buffer.str().empty()) { - lv_label_set_text(labelWidget, buffer.str().c_str()); - } else { - lv_label_set_text(labelWidget, "No logs for the selected log level"); - } - } - - void updateViews() { - if (lvgl::lock(100 / portTICK_PERIOD_MS)) { - updateLogEntries(); - lvgl::unlock(); - } - } - - static void onLevelFilterPressedCallback(TT_UNUSED lv_event_t* event) { - std::vector items = { - "Verbose", - "Debug", - "Info", - "Warning", - "Error", - }; - - selectiondialog::start("Log Level", items); - } - -public: - - void onShow(AppContext& app, lv_obj_t* parent) override { - lv_obj_set_flex_flow(parent, LV_FLEX_FLOW_COLUMN); - lv_obj_set_style_pad_row(parent, 0, LV_STATE_DEFAULT); - - auto* toolbar = lvgl::toolbar_create(parent, app); - lvgl::toolbar_add_button_action(toolbar, LV_SYMBOL_EDIT, onLevelFilterPressedCallback, this); - - auto* wrapper = lv_obj_create(parent); - lv_obj_set_width(wrapper, LV_PCT(100)); - lv_obj_set_flex_grow(wrapper, 1); - lv_obj_set_flex_flow(wrapper, LV_FLEX_FLOW_COLUMN); - lv_obj_set_style_pad_all(wrapper, 0, 0); - lv_obj_set_style_pad_gap(wrapper, 0, 0); - lvgl::obj_set_style_bg_invisible(wrapper); - - labelWidget = lv_label_create(wrapper); - lv_obj_align(labelWidget, LV_ALIGN_CENTER, 0, 0); - - updateLogEntries(); - } - - void onResult(AppContext& app, TT_UNUSED LaunchId launchId, Result result, std::unique_ptr bundle) override { - if (result == Result::Ok && bundle != nullptr) { - switch (selectiondialog::getResultIndex(*bundle)) { - case 0: - filterLevel = LogLevel::Verbose; - break; - case 1: - filterLevel = LogLevel::Debug; - break; - case 2: - filterLevel = LogLevel::Info; - break; - case 3: - filterLevel = LogLevel::Warning; - break; - case 4: - filterLevel = LogLevel::Error; - break; - default: - break; - } - - updateViews(); - } - } -}; - -extern const AppManifest manifest = { - .appId = "Log", - .appName = "Log", - .appIcon = LV_SYMBOL_LIST, - .appCategory = Category::System, - .createApp = create -}; - -} // namespace diff --git a/TactilityC/Include/tt_lvgl.h b/TactilityC/Include/tt_lvgl.h index 89572141..82988ac0 100644 --- a/TactilityC/Include/tt_lvgl.h +++ b/TactilityC/Include/tt_lvgl.h @@ -13,6 +13,12 @@ void tt_lvgl_start(); /** Stop LVGL and related background services */ void tt_lvgl_stop(); +/** Lock the LVGL context. Call this before doing LVGL-related operations from a non-LVLG thread */ +void tt_lvgl_lock(); + +/** Unlock the LVGL context */ +void tt_lvgl_unlock(); + #ifdef __cplusplus } #endif diff --git a/TactilityC/Include/tt_thread.h b/TactilityC/Include/tt_thread.h index e1dec737..0f8da9a4 100644 --- a/TactilityC/Include/tt_thread.h +++ b/TactilityC/Include/tt_thread.h @@ -88,6 +88,12 @@ void tt_thread_set_name(ThreadHandle handle, const char* name); */ void tt_thread_set_stack_size(ThreadHandle handle, size_t size); +/** Set CPu core affinity for this thread + * @param[in] handle the thread instance handle + * @param[in] affinity -1 means not pinned, otherwise it's the core id (e.g. 0 or 1 on ESP32) + */ +void tt_thread_set_affinity(ThreadHandle handle, int affinity); + /** * Set the callback for a thread. This method is executed when the thread is started. * @param[in] handle the thread instance handle diff --git a/TactilityC/Private/symbols/esp_event.h b/TactilityC/Private/symbols/esp_event.h new file mode 100644 index 00000000..6136904f --- /dev/null +++ b/TactilityC/Private/symbols/esp_event.h @@ -0,0 +1,5 @@ +#pragma once + +#include + +extern const esp_elfsym esp_event_symbols[]; diff --git a/TactilityC/Private/symbols/esp_http_client.h b/TactilityC/Private/symbols/esp_http_client.h new file mode 100644 index 00000000..3242fafa --- /dev/null +++ b/TactilityC/Private/symbols/esp_http_client.h @@ -0,0 +1,5 @@ +#pragma once + +#include + +extern const esp_elfsym esp_http_client_symbols[]; diff --git a/TactilityC/Private/symbols/gcc_soft_float.h b/TactilityC/Private/symbols/gcc_soft_float.h index 120e9ef6..94d675bd 100644 --- a/TactilityC/Private/symbols/gcc_soft_float.h +++ b/TactilityC/Private/symbols/gcc_soft_float.h @@ -2,12 +2,4 @@ #include -#ifdef __cplusplus -extern "C" { -#endif - extern const esp_elfsym gcc_soft_float_symbols[]; - -#ifdef __cplusplus -} -#endif diff --git a/TactilityC/Private/symbols/pthread.h b/TactilityC/Private/symbols/pthread.h new file mode 100644 index 00000000..302314ef --- /dev/null +++ b/TactilityC/Private/symbols/pthread.h @@ -0,0 +1,5 @@ +#pragma once + +#include + +extern const esp_elfsym pthread_symbols[]; diff --git a/TactilityC/Private/symbols/stl.h b/TactilityC/Private/symbols/stl.h new file mode 100644 index 00000000..10587020 --- /dev/null +++ b/TactilityC/Private/symbols/stl.h @@ -0,0 +1,5 @@ +#pragma once + +#include + +extern const esp_elfsym stl_symbols[]; diff --git a/TactilityC/Source/symbols/esp_event.cpp b/TactilityC/Source/symbols/esp_event.cpp new file mode 100644 index 00000000..239028ca --- /dev/null +++ b/TactilityC/Source/symbols/esp_event.cpp @@ -0,0 +1,22 @@ +#include +#include + +const esp_elfsym esp_event_symbols[] = { + ESP_ELFSYM_EXPORT(esp_event_loop_create), + ESP_ELFSYM_EXPORT(esp_event_loop_delete), + ESP_ELFSYM_EXPORT(esp_event_loop_create_default), + ESP_ELFSYM_EXPORT(esp_event_loop_delete_default), + ESP_ELFSYM_EXPORT(esp_event_loop_run), + ESP_ELFSYM_EXPORT(esp_event_handler_register), + ESP_ELFSYM_EXPORT(esp_event_handler_register_with), + ESP_ELFSYM_EXPORT(esp_event_handler_instance_register_with), + ESP_ELFSYM_EXPORT(esp_event_handler_instance_register), + ESP_ELFSYM_EXPORT(esp_event_handler_unregister), + ESP_ELFSYM_EXPORT(esp_event_handler_unregister_with), + ESP_ELFSYM_EXPORT(esp_event_handler_instance_unregister_with), + ESP_ELFSYM_EXPORT(esp_event_handler_instance_unregister), + ESP_ELFSYM_EXPORT(esp_event_post), + ESP_ELFSYM_EXPORT(esp_event_post_to), + ESP_ELFSYM_EXPORT(esp_event_isr_post), + ESP_ELFSYM_EXPORT(esp_event_isr_post_to), +}; diff --git a/TactilityC/Source/symbols/esp_http_client.cpp b/TactilityC/Source/symbols/esp_http_client.cpp new file mode 100644 index 00000000..5beb6df1 --- /dev/null +++ b/TactilityC/Source/symbols/esp_http_client.cpp @@ -0,0 +1,46 @@ +#include +#include + +const esp_elfsym esp_http_client_symbols[] = { + ESP_ELFSYM_EXPORT(esp_http_client_init), + ESP_ELFSYM_EXPORT(esp_http_client_perform), + ESP_ELFSYM_EXPORT(esp_http_client_cancel_request), + ESP_ELFSYM_EXPORT(esp_http_client_set_url), + ESP_ELFSYM_EXPORT(esp_http_client_set_post_field), + ESP_ELFSYM_EXPORT(esp_http_client_get_post_field), + ESP_ELFSYM_EXPORT(esp_http_client_set_header), + ESP_ELFSYM_EXPORT(esp_http_client_get_header), + ESP_ELFSYM_EXPORT(esp_http_client_get_username), + ESP_ELFSYM_EXPORT(esp_http_client_set_username), + ESP_ELFSYM_EXPORT(esp_http_client_get_password), + ESP_ELFSYM_EXPORT(esp_http_client_set_password), + ESP_ELFSYM_EXPORT(esp_http_client_cancel_request), + ESP_ELFSYM_EXPORT(esp_http_client_set_authtype), + ESP_ELFSYM_EXPORT(esp_http_client_get_user_data), + ESP_ELFSYM_EXPORT(esp_http_client_set_user_data), + ESP_ELFSYM_EXPORT(esp_http_client_get_errno), + ESP_ELFSYM_EXPORT(esp_http_client_get_and_clear_last_tls_error), + ESP_ELFSYM_EXPORT(esp_http_client_set_method), + ESP_ELFSYM_EXPORT(esp_http_client_set_timeout_ms), + ESP_ELFSYM_EXPORT(esp_http_client_delete_header), + ESP_ELFSYM_EXPORT(esp_http_client_delete_all_headers), + ESP_ELFSYM_EXPORT(esp_http_client_open), + ESP_ELFSYM_EXPORT(esp_http_client_write), + ESP_ELFSYM_EXPORT(esp_http_client_fetch_headers), + ESP_ELFSYM_EXPORT(esp_http_client_is_chunked_response), + ESP_ELFSYM_EXPORT(esp_http_client_read), + ESP_ELFSYM_EXPORT(esp_http_client_get_status_code), + ESP_ELFSYM_EXPORT(esp_http_client_get_content_length), + ESP_ELFSYM_EXPORT(esp_http_client_close), + ESP_ELFSYM_EXPORT(esp_http_client_cleanup), + ESP_ELFSYM_EXPORT(esp_http_client_get_transport_type), + ESP_ELFSYM_EXPORT(esp_http_client_set_redirection), + ESP_ELFSYM_EXPORT(esp_http_client_reset_redirect_counter), + ESP_ELFSYM_EXPORT(esp_http_client_set_auth_data), + ESP_ELFSYM_EXPORT(esp_http_client_add_auth), + ESP_ELFSYM_EXPORT(esp_http_client_is_complete_data_received), + ESP_ELFSYM_EXPORT(esp_http_client_read_response), + ESP_ELFSYM_EXPORT(esp_http_client_flush_response), + ESP_ELFSYM_EXPORT(esp_http_client_get_url), + ESP_ELFSYM_EXPORT(esp_http_client_get_chunk_length), +}; diff --git a/TactilityC/Source/symbols/gcc_soft_float.cpp b/TactilityC/Source/symbols/gcc_soft_float.cpp index 45dd9cfd..34f5eda2 100644 --- a/TactilityC/Source/symbols/gcc_soft_float.cpp +++ b/TactilityC/Source/symbols/gcc_soft_float.cpp @@ -1,10 +1,10 @@ #include #include -extern "C" { - // Reference: https://gcc.gnu.org/onlinedocs/gccint/Soft-float-library-routines.html +extern "C" { + extern float __addsf3(float a, float b); extern double __adddf3(double a, double b); // extern long double __addtf3(long double a, long double b); @@ -139,6 +139,8 @@ int __gtsf2(float a, float b); int __gtdf2(double a, double b); // int __gttf2(long double a, long double b); +} + const esp_elfsym gcc_soft_float_symbols[] = { ESP_ELFSYM_EXPORT(__addsf3), ESP_ELFSYM_EXPORT(__adddf3), @@ -276,5 +278,3 @@ const esp_elfsym gcc_soft_float_symbols[] = { ESP_ELFSYM_END }; - -} \ No newline at end of file diff --git a/TactilityC/Source/symbols/pthread.cpp b/TactilityC/Source/symbols/pthread.cpp new file mode 100644 index 00000000..c7f0cca0 --- /dev/null +++ b/TactilityC/Source/symbols/pthread.cpp @@ -0,0 +1,11 @@ +#include +#include + +const esp_elfsym pthread_symbols[] = { + ESP_ELFSYM_EXPORT(pthread_create), + ESP_ELFSYM_EXPORT(pthread_attr_init), + ESP_ELFSYM_EXPORT(pthread_attr_setstacksize), + ESP_ELFSYM_EXPORT(pthread_detach), + ESP_ELFSYM_EXPORT(pthread_join), + ESP_ELFSYM_EXPORT(pthread_exit), +}; diff --git a/TactilityC/Source/symbols/stl.cpp b/TactilityC/Source/symbols/stl.cpp new file mode 100644 index 00000000..e8ce08a1 --- /dev/null +++ b/TactilityC/Source/symbols/stl.cpp @@ -0,0 +1,18 @@ +#include + +#include + +extern "C" { + extern void* _Znwj(uint32_t size); // operator new(unsigned int) + extern void _ZdlPvj(void* p, uint64_t size); // operator delete(void*, unsigned int) +} + +const esp_elfsym stl_symbols[] = { + ESP_ELFSYM_EXPORT(_Znwj), // operator new(unsigned int) + ESP_ELFSYM_EXPORT(_ZdlPvj), // operator delete(void*, unsigned int) + // Note: You have to use the mangled names here + { "_ZSt20__throw_length_errorPKc", (void*)&(std::__throw_length_error) }, + { "_ZSt28__throw_bad_array_new_lengthv", (void*)&(std::__throw_bad_array_new_length) }, + { "_ZSt17__throw_bad_allocv", (void*)&(std::__throw_bad_alloc) } + // { "", (void*)&(std::) }, +}; diff --git a/TactilityC/Source/tt_init.cpp b/TactilityC/Source/tt_init.cpp index c02d7227..7fcf6748 100644 --- a/TactilityC/Source/tt_init.cpp +++ b/TactilityC/Source/tt_init.cpp @@ -5,6 +5,7 @@ #include "tt_app_manifest.h" #include "tt_app_selectiondialog.h" #include "tt_bundle.h" +#include "tt_file.h" #include "tt_gps.h" #include "tt_hal_device.h" #include "tt_hal_display.h" @@ -25,31 +26,28 @@ #include "tt_timer.h" #include "tt_wifi.h" -#include +#include "symbols/esp_event.h" +#include "symbols/esp_http_client.h" #include "symbols/gcc_soft_float.h" +#include "symbols/pthread.h" +#include "symbols/stl.h" #include #include #include -#include #include #include +#include +#include +#include +#include #include -#include -#include -#include +#include extern "C" { -// GCC internal new and delete -extern void* _Znwj(uint32_t size); -extern void _ZdlPvj(void* p, uint64_t size); - -const esp_elfsym elf_symbols[] { - // GCC internal - ESP_ELFSYM_EXPORT(_Znwj), // new - ESP_ELFSYM_EXPORT(_ZdlPvj), // delete +const esp_elfsym main_symbols[] { // stdlib.h ESP_ELFSYM_EXPORT(malloc), ESP_ELFSYM_EXPORT(calloc), @@ -66,13 +64,6 @@ const esp_elfsym elf_symbols[] { // time.h ESP_ELFSYM_EXPORT(clock_gettime), ESP_ELFSYM_EXPORT(strftime), - // pthread - ESP_ELFSYM_EXPORT(pthread_create), - ESP_ELFSYM_EXPORT(pthread_attr_init), - ESP_ELFSYM_EXPORT(pthread_attr_setstacksize), - ESP_ELFSYM_EXPORT(pthread_detach), - ESP_ELFSYM_EXPORT(pthread_join), - ESP_ELFSYM_EXPORT(pthread_exit), // sys/errno.h ESP_ELFSYM_EXPORT(__errno), // freertos_tasks_c_additions.h @@ -158,66 +149,6 @@ const esp_elfsym elf_symbols[] { ESP_ELFSYM_EXPORT(esp_log), ESP_ELFSYM_EXPORT(esp_log_write), ESP_ELFSYM_EXPORT(esp_log_timestamp), - // esp_http_client - ESP_ELFSYM_EXPORT(esp_http_client_init), - ESP_ELFSYM_EXPORT(esp_http_client_perform), - ESP_ELFSYM_EXPORT(esp_http_client_cancel_request), - ESP_ELFSYM_EXPORT(esp_http_client_set_url), - ESP_ELFSYM_EXPORT(esp_http_client_set_post_field), - ESP_ELFSYM_EXPORT(esp_http_client_get_post_field), - ESP_ELFSYM_EXPORT(esp_http_client_set_header), - ESP_ELFSYM_EXPORT(esp_http_client_get_header), - ESP_ELFSYM_EXPORT(esp_http_client_get_username), - ESP_ELFSYM_EXPORT(esp_http_client_set_username), - ESP_ELFSYM_EXPORT(esp_http_client_get_password), - ESP_ELFSYM_EXPORT(esp_http_client_set_password), - ESP_ELFSYM_EXPORT(esp_http_client_cancel_request), - ESP_ELFSYM_EXPORT(esp_http_client_set_authtype), - ESP_ELFSYM_EXPORT(esp_http_client_get_user_data), - ESP_ELFSYM_EXPORT(esp_http_client_set_user_data), - ESP_ELFSYM_EXPORT(esp_http_client_get_errno), - ESP_ELFSYM_EXPORT(esp_http_client_get_and_clear_last_tls_error), - ESP_ELFSYM_EXPORT(esp_http_client_set_method), - ESP_ELFSYM_EXPORT(esp_http_client_set_timeout_ms), - ESP_ELFSYM_EXPORT(esp_http_client_delete_header), - ESP_ELFSYM_EXPORT(esp_http_client_delete_all_headers), - ESP_ELFSYM_EXPORT(esp_http_client_open), - ESP_ELFSYM_EXPORT(esp_http_client_write), - ESP_ELFSYM_EXPORT(esp_http_client_fetch_headers), - ESP_ELFSYM_EXPORT(esp_http_client_is_chunked_response), - ESP_ELFSYM_EXPORT(esp_http_client_read), - ESP_ELFSYM_EXPORT(esp_http_client_get_status_code), - ESP_ELFSYM_EXPORT(esp_http_client_get_content_length), - ESP_ELFSYM_EXPORT(esp_http_client_close), - ESP_ELFSYM_EXPORT(esp_http_client_cleanup), - ESP_ELFSYM_EXPORT(esp_http_client_get_transport_type), - ESP_ELFSYM_EXPORT(esp_http_client_set_redirection), - ESP_ELFSYM_EXPORT(esp_http_client_reset_redirect_counter), - ESP_ELFSYM_EXPORT(esp_http_client_set_auth_data), - ESP_ELFSYM_EXPORT(esp_http_client_add_auth), - ESP_ELFSYM_EXPORT(esp_http_client_is_complete_data_received), - ESP_ELFSYM_EXPORT(esp_http_client_read_response), - ESP_ELFSYM_EXPORT(esp_http_client_flush_response), - ESP_ELFSYM_EXPORT(esp_http_client_get_url), - ESP_ELFSYM_EXPORT(esp_http_client_get_chunk_length), - // esp_event - ESP_ELFSYM_EXPORT(esp_event_loop_create), - ESP_ELFSYM_EXPORT(esp_event_loop_delete), - ESP_ELFSYM_EXPORT(esp_event_loop_create_default), - ESP_ELFSYM_EXPORT(esp_event_loop_delete_default), - ESP_ELFSYM_EXPORT(esp_event_loop_run), - ESP_ELFSYM_EXPORT(esp_event_handler_register), - ESP_ELFSYM_EXPORT(esp_event_handler_register_with), - ESP_ELFSYM_EXPORT(esp_event_handler_instance_register_with), - ESP_ELFSYM_EXPORT(esp_event_handler_instance_register), - ESP_ELFSYM_EXPORT(esp_event_handler_unregister), - ESP_ELFSYM_EXPORT(esp_event_handler_unregister_with), - ESP_ELFSYM_EXPORT(esp_event_handler_instance_unregister_with), - ESP_ELFSYM_EXPORT(esp_event_handler_instance_unregister), - ESP_ELFSYM_EXPORT(esp_event_post), - ESP_ELFSYM_EXPORT(esp_event_post_to), - ESP_ELFSYM_EXPORT(esp_event_isr_post), - ESP_ELFSYM_EXPORT(esp_event_isr_post_to), // Tactility ESP_ELFSYM_EXPORT(tt_app_start), ESP_ELFSYM_EXPORT(tt_app_start_with_bundle), @@ -289,6 +220,8 @@ const esp_elfsym elf_symbols[] { ESP_ELFSYM_EXPORT(tt_kernel_get_millis), ESP_ELFSYM_EXPORT(tt_kernel_get_micros), ESP_ELFSYM_EXPORT(tt_lvgl_is_started), + ESP_ELFSYM_EXPORT(tt_lvgl_lock), + ESP_ELFSYM_EXPORT(tt_lvgl_unlock), ESP_ELFSYM_EXPORT(tt_lvgl_start), ESP_ELFSYM_EXPORT(tt_lvgl_stop), ESP_ELFSYM_EXPORT(tt_lvgl_software_keyboard_show), @@ -330,6 +263,7 @@ const esp_elfsym elf_symbols[] { ESP_ELFSYM_EXPORT(tt_thread_free), ESP_ELFSYM_EXPORT(tt_thread_set_name), ESP_ELFSYM_EXPORT(tt_thread_set_stack_size), + ESP_ELFSYM_EXPORT(tt_thread_set_affinity), ESP_ELFSYM_EXPORT(tt_thread_set_callback), ESP_ELFSYM_EXPORT(tt_thread_set_priority), ESP_ELFSYM_EXPORT(tt_thread_set_state_callback), @@ -560,8 +494,8 @@ const esp_elfsym elf_symbols[] { uintptr_t resolve_symbol(const esp_elfsym* source, const char* symbolName) { const esp_elfsym* symbol_iterator = source; - while (symbol_iterator->name) { - if (!strcmp(symbol_iterator->name, symbolName)) { + while (symbol_iterator->name != nullptr) { + if (strcmp(symbol_iterator->name, symbolName) == 0) { return reinterpret_cast(symbol_iterator->sym); } symbol_iterator++; @@ -570,11 +504,23 @@ uintptr_t resolve_symbol(const esp_elfsym* source, const char* symbolName) { } uintptr_t tt_symbol_resolver(const char* symbolName) { - uintptr_t address = resolve_symbol(elf_symbols, symbolName); - if (address != 0) { - return address; + static const std::vector all_symbols = { + main_symbols, + gcc_soft_float_symbols, + stl_symbols, + esp_event_symbols, + esp_http_client_symbols, + pthread_symbols + }; + + for (const auto* symbols : all_symbols) { + const uintptr_t address = resolve_symbol(symbols, symbolName); + if (address != 0) { + return address; + } } - return resolve_symbol(gcc_soft_float_symbols, symbolName); + + return 0; } void tt_init_tactility_c() { diff --git a/TactilityC/Source/tt_lvgl.cpp b/TactilityC/Source/tt_lvgl.cpp index f7bf8a6c..2af6a4bf 100644 --- a/TactilityC/Source/tt_lvgl.cpp +++ b/TactilityC/Source/tt_lvgl.cpp @@ -1,4 +1,5 @@ #include +#include extern "C" { @@ -14,4 +15,12 @@ void tt_lvgl_stop() { tt::lvgl::stop(); } +void tt_lvgl_lock() { + tt::lvgl::getSyncLock()->lock(); } + +void tt_lvgl_unlock() { + tt::lvgl::getSyncLock()->unlock(); +} + +} \ No newline at end of file diff --git a/TactilityC/Source/tt_thread.cpp b/TactilityC/Source/tt_thread.cpp index af065f52..26c93a2e 100644 --- a/TactilityC/Source/tt_thread.cpp +++ b/TactilityC/Source/tt_thread.cpp @@ -18,7 +18,7 @@ ThreadHandle tt_thread_alloc_ext( return new tt::Thread( name, stackSize, - [callback, callbackContext]() { + [callback, callbackContext] { return callback(callbackContext); } ); @@ -36,6 +36,10 @@ void tt_thread_set_stack_size(ThreadHandle handle, size_t size) { HANDLE_AS_THREAD(handle)->setStackSize(size); } +void tt_thread_set_affinity(ThreadHandle handle, int affinity) { + HANDLE_AS_THREAD(handle)->setAffinity(affinity); +} + void tt_thread_set_callback(ThreadHandle handle, ThreadCallback callback, void* _Nullable callbackContext) { HANDLE_AS_THREAD(handle)->setMainFunction([callback, callbackContext]() { return callback(callbackContext); diff --git a/TactilityCore/Include/Tactility/Log.h b/TactilityCore/Include/Tactility/Log.h index 6e282df4..0b0cab09 100644 --- a/TactilityCore/Include/Tactility/Log.h +++ b/TactilityCore/Include/Tactility/Log.h @@ -1,36 +1,10 @@ #pragma once -#include "LogMessages.h" -#include -#include - -#if not defined(ESP_PLATFORM) or (defined(CONFIG_SPIRAM_USE_MALLOC) && CONFIG_SPIRAM_USE_MALLOC == 1) -#define TT_LOG_ENTRY_COUNT 200 -#define TT_LOG_MESSAGE_SIZE 128 -#else -#define TT_LOG_ENTRY_COUNT 50 -#define TT_LOG_MESSAGE_SIZE 50 -#endif - #ifdef ESP_PLATFORM #include "LogEsp.h" #else #include "LogSimulator.h" #endif +#include "LogMessages.h" #include "LogCommon.h" - -namespace tt { - -struct LogEntry { - LogLevel level = LogLevel::Verbose; - char message[TT_LOG_MESSAGE_SIZE] = { 0 }; -}; - -/** Make a copy of the currently stored entries. - * The array size is TT_LOG_ENTRY_COUNT - * @param[out] outIndex the write index for the next log entry. - */ -std::unique_ptr> copyLogEntries(std::size_t& outIndex); - -} // namespace tt diff --git a/TactilityCore/Include/Tactility/LogEsp.h b/TactilityCore/Include/Tactility/LogEsp.h index ac0a6e1f..b3d78a41 100644 --- a/TactilityCore/Include/Tactility/LogEsp.h +++ b/TactilityCore/Include/Tactility/LogEsp.h @@ -3,6 +3,7 @@ #ifdef ESP_PLATFORM #include +#include "Tactility/LogCommon.h" #define TT_LOG_E(tag, format, ...) \ ESP_LOGE(tag, format, ##__VA_ARGS__) diff --git a/TactilityCore/Include/Tactility/Thread.h b/TactilityCore/Include/Tactility/Thread.h index 6d623e6e..a8efac51 100644 --- a/TactilityCore/Include/Tactility/Thread.h +++ b/TactilityCore/Include/Tactility/Thread.h @@ -97,6 +97,11 @@ public: */ void setStackSize(size_t stackSize); + /** Set CPU core pinning for this thread. + * @param[in] affinity -1 means not pinned, otherwise it's the core id (e.g. 0 or 1 on ESP32) + */ + void setAffinity(portBASE_TYPE affinity); + /** Set Thread callback * @param[in] callback ThreadCallback, called upon thread run * @param[in] callbackContext what to pass to the callback diff --git a/TactilityCore/Source/Log.cpp b/TactilityCore/Source/Log.cpp deleted file mode 100644 index 2e540328..00000000 --- a/TactilityCore/Source/Log.cpp +++ /dev/null @@ -1,50 +0,0 @@ -#include "Tactility/Mutex.h" - -#include -#include - -namespace tt { - -static std::array logEntries; -static size_t nextLogEntryIndex; - -/** - * This used to be a simple static value, but that crashes on device boot where early logging happens. - * For some unknown reason, the static Mutex instance wouldn't have their constructor called before - * the mutex is used. - */ -Mutex& getLogMutex() { - static Mutex* logMutex = nullptr; - if (logMutex == nullptr) { - logMutex = new Mutex(); - } - return *logMutex; -} - -void storeLog(LogLevel level, const char* format, va_list args) { - if (getLogMutex().lock(5 / portTICK_PERIOD_MS)) { - logEntries[nextLogEntryIndex].level = level; - vsnprintf(logEntries[nextLogEntryIndex].message, TT_LOG_MESSAGE_SIZE, format, args); - - nextLogEntryIndex++; - if (nextLogEntryIndex == TT_LOG_ENTRY_COUNT) { - nextLogEntryIndex = 0; - } - - getLogMutex().unlock(); - } -} - -std::unique_ptr> copyLogEntries(std::size_t& outIndex) { - if (getLogMutex().lock(5 / portTICK_PERIOD_MS)) { - auto copy = std::make_unique>(logEntries); - getLogMutex().unlock(); - outIndex = nextLogEntryIndex; - return copy; - } else { - return nullptr; - } -} - - -} // namespace tt diff --git a/TactilityCore/Source/LogEsp.cpp b/TactilityCore/Source/LogEsp.cpp deleted file mode 100644 index 0b3c6e93..00000000 --- a/TactilityCore/Source/LogEsp.cpp +++ /dev/null @@ -1,24 +0,0 @@ -#ifdef ESP_PLATFORM - -#include "Tactility/LogCommon.h" -#include - -namespace tt { -void storeLog(LogLevel level, const char* format, va_list args); -} - -extern "C" { - -extern void __real_esp_log_write(esp_log_level_t level, const char* tag, const char* format, ...); - -void __wrap_esp_log_write(esp_log_level_t level, const char* tag, const char* format, ...) { - va_list args; - va_start(args, format); - tt::storeLog((tt::LogLevel)level, format, args); - esp_log_writev(level, tag, format, args); - va_end(args); -} - -} - -#endif diff --git a/TactilityCore/Source/LogSimulator.cpp b/TactilityCore/Source/LogSimulator.cpp index ed9344d5..5bf95cf4 100644 --- a/TactilityCore/Source/LogSimulator.cpp +++ b/TactilityCore/Source/LogSimulator.cpp @@ -9,8 +9,6 @@ namespace tt { -void storeLog(LogLevel level, const char* format, va_list args); - static char toPrefix(LogLevel level) { using enum LogLevel; switch (level) { @@ -81,10 +79,6 @@ void log(LogLevel level, const char* tag, const char* format, ...) { va_start(args, format); vprintf(buffer.str().c_str(), args); va_end(args); - - va_start(args, format); - tt::storeLog(level, buffer.str().c_str(), args); - va_end(args); } } // namespace tt diff --git a/TactilityCore/Source/Thread.cpp b/TactilityCore/Source/Thread.cpp index 15fa8136..73f3d13d 100644 --- a/TactilityCore/Source/Thread.cpp +++ b/TactilityCore/Source/Thread.cpp @@ -95,9 +95,14 @@ void Thread::setStackSize(size_t newStackSize) { stackSize = newStackSize; } +void Thread::setAffinity(portBASE_TYPE newAffinity) { + assert(state == State::Stopped); + affinity = newAffinity; +} + void Thread::setCallback(Callback callback, _Nullable void* callbackContext) { assert(state == State::Stopped); - mainFunction = [callback, callbackContext]() { + mainFunction = [callback, callbackContext] { return callback(callbackContext); }; }