Compare commits

...

2 Commits

Author SHA1 Message Date
Ken Van Hoeylandt
1a61eac8e0
Export more symbols (#476)
* **Export more symbols:**
  * Expanded standard library support with additional math functions (trigonometric, exponential, and rounding operations), string comparison, directory operations, and locale configuration
  * Added C++ static initialization guard utilities to enhance object initialization support
2026-02-02 08:18:51 +01:00
Ken Van Hoeylandt
1f9e7f82fd
Implement support for module symbols (#475)
* **New Features**
  - Adds module symbol support and per-module symbol tables, including LVGL symbol exports moved into a dedicated table.
* **API**
  - Adds symbol-resolution APIs and an accessor to enable dynamic lookup between modules.
* **Bug Fixes / Chores**
  - Explicitly initializes module symbol pointers across device and platform modules to avoid uninitialized state.
* **Tests**
  - Updates tests to account for symbol pointer initialization.
2026-02-02 07:50:43 +01:00
56 changed files with 609 additions and 365 deletions

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "btt-panda-touch",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "cyd-2432s024c",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "cyd-2432s028r",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "cyd-2432s028rv3",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "cyd-2432s032c",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "cyd-4848s040c",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "cyd-8048s043c",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "cyd-e32r28t",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "cyd-e32r32p",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "elecrow-crowpanel-advance-28",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "elecrow-crowpanel-advance-35",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "elecrow-crowpanel-advance-50",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "elecrow-crowpanel-basic-28",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "elecrow-crowpanel-basic-35",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "elecrow-crowpanel-basic-50",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "generic-esp32",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "generic-esp32c6",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "generic-esp32p4",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "generic-esp32s3",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "guition-jc1060p470ciwy",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "guition-jc2432w328c",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "guition-jc3248w535c",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "guition-jc8048w550c",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "heltec-wifi-lora-32-v3",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "lilygo-tdeck",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "lilygo-tdisplay-s3",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "lilygo-tdisplay",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "lilygo-tdongle-s3",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -24,7 +24,8 @@ static error_t stop() {
struct Module device_module = {
.name = "lilygo-tlora-pager",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "m5stack-cardputer-adv",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "m5stack-cardputer",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "m5stack-core2",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "m5stack-cores3",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "m5stack-stickc-plus",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "m5stack-stickc-plus2",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "m5stack-tab5",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "simulator",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "unphone",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "waveshare-esp32-s3-geek",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "waveshare-s3-lcd-13",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "waveshare-s3-touch-lcd-128",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "waveshare-s3-touch-lcd-147",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "waveshare-s3-touch-lcd-43",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -16,7 +16,8 @@ static error_t stop() {
struct Module device_module = {
.name = "wireless-tag-wt32-sc01-plus",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -17,15 +17,15 @@ static error_t start() {
static error_t stop() {
/* We crash when destruct fails, because if a single driver fails to destruct,
* there is no guarantee that the previously destroyed drivers can be recovered */
check(driver_remove(&hal_device_driver) == ERROR_NONE);
check(driver_destruct(&hal_device_driver) == ERROR_NONE);
check(driver_remove_destruct(&hal_device_driver) == ERROR_NONE);
return ERROR_NONE;
}
struct Module hal_device_module = {
.name = "hal-device",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -4,7 +4,7 @@
#include <tactility/module.h>
#include <tactility/lvgl_module.h>
extern const struct ModuleSymbol lvgl_module_symbols[];
error_t lvgl_arch_start();
error_t lvgl_arch_stop();
@ -63,5 +63,6 @@ bool lvgl_is_running() {
struct Module lvgl_module = {
.name = "lvgl",
.start = start,
.stop = stop
.stop = stop,
.symbols = (const struct ModuleSymbol*)lvgl_module_symbols
};

View File

@ -0,0 +1,364 @@
#include <tactility/module.h>
#include <lvgl.h>
const struct ModuleSymbol lvgl_module_symbols[] = {
// lv_event
DEFINE_MODULE_SYMBOL(lv_event_get_code),
DEFINE_MODULE_SYMBOL(lv_event_get_indev),
DEFINE_MODULE_SYMBOL(lv_event_get_key),
DEFINE_MODULE_SYMBOL(lv_event_get_param),
DEFINE_MODULE_SYMBOL(lv_event_get_scroll_anim),
DEFINE_MODULE_SYMBOL(lv_event_get_user_data),
DEFINE_MODULE_SYMBOL(lv_event_get_target_obj),
DEFINE_MODULE_SYMBOL(lv_event_get_target),
DEFINE_MODULE_SYMBOL(lv_event_get_current_target_obj),
DEFINE_MODULE_SYMBOL(lv_event_get_draw_task),
DEFINE_MODULE_SYMBOL(lv_event_stop_bubbling),
// lv_obj
DEFINE_MODULE_SYMBOL(lv_color_hex),
DEFINE_MODULE_SYMBOL(lv_color_make),
DEFINE_MODULE_SYMBOL(lv_color_black),
DEFINE_MODULE_SYMBOL(lv_color_white),
DEFINE_MODULE_SYMBOL(lv_obj_center),
DEFINE_MODULE_SYMBOL(lv_obj_clean),
DEFINE_MODULE_SYMBOL(lv_obj_clear_flag),
DEFINE_MODULE_SYMBOL(lv_obj_create),
DEFINE_MODULE_SYMBOL(lv_obj_delete),
DEFINE_MODULE_SYMBOL(lv_obj_add_event_cb),
DEFINE_MODULE_SYMBOL(lv_obj_add_flag),
DEFINE_MODULE_SYMBOL(lv_obj_add_state),
DEFINE_MODULE_SYMBOL(lv_obj_clear_state),
DEFINE_MODULE_SYMBOL(lv_obj_set_state),
DEFINE_MODULE_SYMBOL(lv_obj_align),
DEFINE_MODULE_SYMBOL(lv_obj_align_to),
DEFINE_MODULE_SYMBOL(lv_obj_get_parent),
DEFINE_MODULE_SYMBOL(lv_obj_get_height),
DEFINE_MODULE_SYMBOL(lv_obj_get_width),
DEFINE_MODULE_SYMBOL(lv_obj_get_coords),
DEFINE_MODULE_SYMBOL(lv_obj_get_x),
DEFINE_MODULE_SYMBOL(lv_obj_get_display),
DEFINE_MODULE_SYMBOL(lv_obj_get_y),
DEFINE_MODULE_SYMBOL(lv_obj_get_content_width),
DEFINE_MODULE_SYMBOL(lv_obj_get_content_height),
DEFINE_MODULE_SYMBOL(lv_obj_get_group),
DEFINE_MODULE_SYMBOL(lv_obj_get_user_data),
DEFINE_MODULE_SYMBOL(lv_obj_get_state),
DEFINE_MODULE_SYMBOL(lv_obj_has_flag),
DEFINE_MODULE_SYMBOL(lv_obj_has_flag_any),
DEFINE_MODULE_SYMBOL(lv_obj_has_state),
DEFINE_MODULE_SYMBOL(lv_obj_invalidate),
DEFINE_MODULE_SYMBOL(lv_obj_is_valid),
DEFINE_MODULE_SYMBOL(lv_obj_remove_event_cb),
DEFINE_MODULE_SYMBOL(lv_obj_remove_flag),
DEFINE_MODULE_SYMBOL(lv_obj_remove_state),
DEFINE_MODULE_SYMBOL(lv_obj_set_pos),
DEFINE_MODULE_SYMBOL(lv_obj_set_flex_align),
DEFINE_MODULE_SYMBOL(lv_obj_set_flex_flow),
DEFINE_MODULE_SYMBOL(lv_obj_set_flex_grow),
DEFINE_MODULE_SYMBOL(lv_obj_set_layout),
DEFINE_MODULE_SYMBOL(lv_obj_is_layout_positioned),
DEFINE_MODULE_SYMBOL(lv_obj_mark_layout_as_dirty),
DEFINE_MODULE_SYMBOL(lv_obj_get_style_layout),
DEFINE_MODULE_SYMBOL(lv_obj_update_layout),
DEFINE_MODULE_SYMBOL(lv_obj_set_scroll_dir),
DEFINE_MODULE_SYMBOL(lv_obj_scroll_to_view),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_radius),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_border_width),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_border_color),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_border_opa),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_line_width),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_line_color),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_line_opa),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_line_rounded),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_opa),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_bg_color),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_bg_opa),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_bg_image_src),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_bg_image_opa),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_bg_image_recolor),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_bg_image_recolor_opa),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_margin_hor),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_margin_ver),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_margin_top),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_margin_bottom),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_margin_left),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_margin_right),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_margin_all),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_pad_all),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_pad_hor),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_pad_ver),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_pad_top),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_pad_bottom),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_pad_left),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_pad_right),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_pad_column),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_pad_row),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_border_post),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_border_side),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_text_opa),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_text_align),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_text_color),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_text_font),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_text_decor),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_text_letter_space),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_text_line_space),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_text_outline_stroke_color),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_text_outline_stroke_opa),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_text_outline_stroke_width),
DEFINE_MODULE_SYMBOL(lv_obj_set_user_data),
DEFINE_MODULE_SYMBOL(lv_obj_set_align),
DEFINE_MODULE_SYMBOL(lv_obj_set_x),
DEFINE_MODULE_SYMBOL(lv_obj_set_y),
DEFINE_MODULE_SYMBOL(lv_obj_set_size),
DEFINE_MODULE_SYMBOL(lv_obj_set_width),
DEFINE_MODULE_SYMBOL(lv_obj_set_height),
DEFINE_MODULE_SYMBOL(lv_obj_send_event),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_outline_color),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_outline_width),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_outline_pad),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_outline_opa),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_flex_cross_place),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_image_recolor_opa),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_pad_gap),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_shadow_width),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_size),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_transform_pivot_x),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_transform_pivot_y),
DEFINE_MODULE_SYMBOL(lv_obj_set_style_transform_rotation),
DEFINE_MODULE_SYMBOL(lv_obj_scroll_to_y),
DEFINE_MODULE_SYMBOL(lv_obj_set_scrollbar_mode),
DEFINE_MODULE_SYMBOL(lv_obj_get_child_count),
DEFINE_MODULE_SYMBOL(lv_obj_get_child),
DEFINE_MODULE_SYMBOL(lv_obj_get_index),
DEFINE_MODULE_SYMBOL(lv_obj_remove_style_all),
DEFINE_MODULE_SYMBOL(lv_obj_set_content_height),
DEFINE_MODULE_SYMBOL(lv_obj_set_content_width),
DEFINE_MODULE_SYMBOL(lv_obj_event_base),
DEFINE_MODULE_SYMBOL(lv_obj_class_create_obj),
DEFINE_MODULE_SYMBOL(lv_obj_class_init_obj),
// lv_font
DEFINE_MODULE_SYMBOL(lv_font_get_default),
// lv_theme
DEFINE_MODULE_SYMBOL(lv_theme_get_color_primary),
DEFINE_MODULE_SYMBOL(lv_theme_get_color_secondary),
DEFINE_MODULE_SYMBOL(lv_theme_get_font_small),
DEFINE_MODULE_SYMBOL(lv_theme_get_font_normal),
DEFINE_MODULE_SYMBOL(lv_theme_get_font_large),
// lv_button
DEFINE_MODULE_SYMBOL(lv_button_create),
DEFINE_MODULE_SYMBOL(lv_btn_create),
// lv_buttonmatrix
DEFINE_MODULE_SYMBOL(lv_buttonmatrix_create),
DEFINE_MODULE_SYMBOL(lv_buttonmatrix_get_button_text),
DEFINE_MODULE_SYMBOL(lv_buttonmatrix_get_map),
DEFINE_MODULE_SYMBOL(lv_buttonmatrix_get_one_checked),
DEFINE_MODULE_SYMBOL(lv_buttonmatrix_get_selected_button),
DEFINE_MODULE_SYMBOL(lv_buttonmatrix_set_button_ctrl),
DEFINE_MODULE_SYMBOL(lv_buttonmatrix_set_button_ctrl_all),
DEFINE_MODULE_SYMBOL(lv_buttonmatrix_set_ctrl_map),
DEFINE_MODULE_SYMBOL(lv_buttonmatrix_set_map),
DEFINE_MODULE_SYMBOL(lv_buttonmatrix_set_one_checked),
DEFINE_MODULE_SYMBOL(lv_buttonmatrix_set_button_width),
DEFINE_MODULE_SYMBOL(lv_buttonmatrix_set_selected_button),
// lv_canvas
DEFINE_MODULE_SYMBOL(lv_canvas_create),
DEFINE_MODULE_SYMBOL(lv_canvas_set_draw_buf),
DEFINE_MODULE_SYMBOL(lv_canvas_set_px),
// lv_label
DEFINE_MODULE_SYMBOL(lv_label_create),
DEFINE_MODULE_SYMBOL(lv_label_cut_text),
DEFINE_MODULE_SYMBOL(lv_label_get_long_mode),
DEFINE_MODULE_SYMBOL(lv_label_set_long_mode),
DEFINE_MODULE_SYMBOL(lv_label_get_text),
DEFINE_MODULE_SYMBOL(lv_label_set_text),
DEFINE_MODULE_SYMBOL(lv_label_set_text_fmt),
// lv_switch
DEFINE_MODULE_SYMBOL(lv_switch_create),
// lv_checkbox
DEFINE_MODULE_SYMBOL(lv_checkbox_create),
DEFINE_MODULE_SYMBOL(lv_checkbox_set_text),
DEFINE_MODULE_SYMBOL(lv_checkbox_get_text),
DEFINE_MODULE_SYMBOL(lv_checkbox_set_text_static),
// lv_bar
DEFINE_MODULE_SYMBOL(lv_bar_create),
DEFINE_MODULE_SYMBOL(lv_bar_get_max_value),
DEFINE_MODULE_SYMBOL(lv_bar_get_min_value),
DEFINE_MODULE_SYMBOL(lv_bar_get_mode),
DEFINE_MODULE_SYMBOL(lv_bar_get_start_value),
DEFINE_MODULE_SYMBOL(lv_bar_get_value),
DEFINE_MODULE_SYMBOL(lv_bar_set_mode),
DEFINE_MODULE_SYMBOL(lv_bar_set_range),
DEFINE_MODULE_SYMBOL(lv_bar_set_start_value),
DEFINE_MODULE_SYMBOL(lv_bar_set_value),
DEFINE_MODULE_SYMBOL(lv_bar_is_symmetrical),
// lv_dropdown
DEFINE_MODULE_SYMBOL(lv_dropdown_create),
DEFINE_MODULE_SYMBOL(lv_dropdown_add_option),
DEFINE_MODULE_SYMBOL(lv_dropdown_clear_options),
DEFINE_MODULE_SYMBOL(lv_dropdown_close),
DEFINE_MODULE_SYMBOL(lv_dropdown_get_dir),
DEFINE_MODULE_SYMBOL(lv_dropdown_get_list),
DEFINE_MODULE_SYMBOL(lv_dropdown_get_option_count),
DEFINE_MODULE_SYMBOL(lv_dropdown_get_option_index),
DEFINE_MODULE_SYMBOL(lv_dropdown_get_options),
DEFINE_MODULE_SYMBOL(lv_dropdown_get_selected),
DEFINE_MODULE_SYMBOL(lv_dropdown_get_selected_str),
DEFINE_MODULE_SYMBOL(lv_dropdown_get_selected_highlight),
DEFINE_MODULE_SYMBOL(lv_dropdown_set_dir),
DEFINE_MODULE_SYMBOL(lv_dropdown_set_options),
DEFINE_MODULE_SYMBOL(lv_dropdown_set_options_static),
DEFINE_MODULE_SYMBOL(lv_dropdown_set_selected),
DEFINE_MODULE_SYMBOL(lv_dropdown_set_selected_highlight),
DEFINE_MODULE_SYMBOL(lv_dropdown_set_symbol),
DEFINE_MODULE_SYMBOL(lv_dropdown_set_text),
DEFINE_MODULE_SYMBOL(lv_dropdown_open),
// lv_list
DEFINE_MODULE_SYMBOL(lv_list_create),
DEFINE_MODULE_SYMBOL(lv_list_add_text),
DEFINE_MODULE_SYMBOL(lv_list_add_button),
DEFINE_MODULE_SYMBOL(lv_list_get_button_text),
DEFINE_MODULE_SYMBOL(lv_list_set_button_text),
// lv_keyboard
DEFINE_MODULE_SYMBOL(lv_keyboard_create),
DEFINE_MODULE_SYMBOL(lv_keyboard_set_textarea),
// lv_textarea
DEFINE_MODULE_SYMBOL(lv_textarea_create),
DEFINE_MODULE_SYMBOL(lv_textarea_get_accepted_chars),
DEFINE_MODULE_SYMBOL(lv_textarea_get_label),
DEFINE_MODULE_SYMBOL(lv_textarea_get_max_length),
DEFINE_MODULE_SYMBOL(lv_textarea_get_one_line),
DEFINE_MODULE_SYMBOL(lv_textarea_get_text),
DEFINE_MODULE_SYMBOL(lv_textarea_get_text_selection),
DEFINE_MODULE_SYMBOL(lv_textarea_set_one_line),
DEFINE_MODULE_SYMBOL(lv_textarea_set_accepted_chars),
DEFINE_MODULE_SYMBOL(lv_textarea_set_align),
DEFINE_MODULE_SYMBOL(lv_textarea_set_password_bullet),
DEFINE_MODULE_SYMBOL(lv_textarea_set_password_mode),
DEFINE_MODULE_SYMBOL(lv_textarea_set_password_show_time),
DEFINE_MODULE_SYMBOL(lv_textarea_set_placeholder_text),
DEFINE_MODULE_SYMBOL(lv_textarea_set_text),
DEFINE_MODULE_SYMBOL(lv_textarea_set_text_selection),
DEFINE_MODULE_SYMBOL(lv_textarea_set_max_length),
DEFINE_MODULE_SYMBOL(lv_textarea_set_cursor_click_pos),
DEFINE_MODULE_SYMBOL(lv_textarea_add_text),
// lv_palette
DEFINE_MODULE_SYMBOL(lv_palette_main),
DEFINE_MODULE_SYMBOL(lv_palette_darken),
DEFINE_MODULE_SYMBOL(lv_palette_lighten),
// lv_display
DEFINE_MODULE_SYMBOL(lv_display_get_default),
DEFINE_MODULE_SYMBOL(lv_display_get_horizontal_resolution),
DEFINE_MODULE_SYMBOL(lv_display_get_vertical_resolution),
DEFINE_MODULE_SYMBOL(lv_display_get_physical_horizontal_resolution),
DEFINE_MODULE_SYMBOL(lv_display_get_physical_vertical_resolution),
DEFINE_MODULE_SYMBOL(lv_display_dpx),
DEFINE_MODULE_SYMBOL(lv_display_get_inactive_time),
DEFINE_MODULE_SYMBOL(lv_display_get_rotation),
DEFINE_MODULE_SYMBOL(lv_display_set_rotation),
DEFINE_MODULE_SYMBOL(lv_display_set_offset),
DEFINE_MODULE_SYMBOL(lv_display_trigger_activity),
// lv_pct
DEFINE_MODULE_SYMBOL(lv_pct),
DEFINE_MODULE_SYMBOL(lv_pct_to_px),
// lv_spinbox
DEFINE_MODULE_SYMBOL(lv_spinbox_create),
DEFINE_MODULE_SYMBOL(lv_spinbox_decrement),
DEFINE_MODULE_SYMBOL(lv_spinbox_get_rollover),
DEFINE_MODULE_SYMBOL(lv_spinbox_get_step),
DEFINE_MODULE_SYMBOL(lv_spinbox_get_value),
DEFINE_MODULE_SYMBOL(lv_spinbox_increment),
DEFINE_MODULE_SYMBOL(lv_spinbox_set_rollover),
DEFINE_MODULE_SYMBOL(lv_spinbox_set_step),
DEFINE_MODULE_SYMBOL(lv_spinbox_set_range),
DEFINE_MODULE_SYMBOL(lv_spinbox_set_digit_format),
DEFINE_MODULE_SYMBOL(lv_spinbox_set_digit_step_direction),
DEFINE_MODULE_SYMBOL(lv_spinbox_set_value),
DEFINE_MODULE_SYMBOL(lv_spinbox_set_cursor_pos),
DEFINE_MODULE_SYMBOL(lv_spinbox_step_next),
DEFINE_MODULE_SYMBOL(lv_spinbox_step_prev),
// lv_indev
DEFINE_MODULE_SYMBOL(lv_indev_get_type),
DEFINE_MODULE_SYMBOL(lv_indev_get_point),
DEFINE_MODULE_SYMBOL(lv_indev_get_display),
DEFINE_MODULE_SYMBOL(lv_indev_get_key),
DEFINE_MODULE_SYMBOL(lv_indev_get_gesture_dir),
DEFINE_MODULE_SYMBOL(lv_indev_get_state),
DEFINE_MODULE_SYMBOL(lv_indev_active),
DEFINE_MODULE_SYMBOL(lv_indev_get_next),
DEFINE_MODULE_SYMBOL(lv_indev_set_group),
// lv_timer
DEFINE_MODULE_SYMBOL(lv_timer_handler),
DEFINE_MODULE_SYMBOL(lv_timer_handler_run_in_period),
DEFINE_MODULE_SYMBOL(lv_timer_periodic_handler),
DEFINE_MODULE_SYMBOL(lv_timer_handler_set_resume_cb),
DEFINE_MODULE_SYMBOL(lv_timer_create_basic),
DEFINE_MODULE_SYMBOL(lv_timer_create),
DEFINE_MODULE_SYMBOL(lv_timer_delete),
DEFINE_MODULE_SYMBOL(lv_timer_pause),
DEFINE_MODULE_SYMBOL(lv_timer_resume),
DEFINE_MODULE_SYMBOL(lv_timer_set_cb),
DEFINE_MODULE_SYMBOL(lv_timer_set_period),
DEFINE_MODULE_SYMBOL(lv_timer_ready),
DEFINE_MODULE_SYMBOL(lv_timer_set_repeat_count),
DEFINE_MODULE_SYMBOL(lv_timer_set_auto_delete),
DEFINE_MODULE_SYMBOL(lv_timer_set_user_data),
DEFINE_MODULE_SYMBOL(lv_timer_reset),
DEFINE_MODULE_SYMBOL(lv_timer_enable),
DEFINE_MODULE_SYMBOL(lv_timer_get_idle),
DEFINE_MODULE_SYMBOL(lv_timer_get_time_until_next),
DEFINE_MODULE_SYMBOL(lv_timer_get_next),
DEFINE_MODULE_SYMBOL(lv_timer_get_user_data),
DEFINE_MODULE_SYMBOL(lv_timer_get_paused),
// lvgl other
DEFINE_MODULE_SYMBOL(lv_refr_now),
DEFINE_MODULE_SYMBOL(lv_line_create),
DEFINE_MODULE_SYMBOL(lv_line_set_points),
DEFINE_MODULE_SYMBOL(lv_line_set_points_mutable),
// lv_slider
DEFINE_MODULE_SYMBOL(lv_slider_create),
DEFINE_MODULE_SYMBOL(lv_slider_get_value),
DEFINE_MODULE_SYMBOL(lv_slider_set_range),
DEFINE_MODULE_SYMBOL(lv_slider_set_value),
// lv_tabview
DEFINE_MODULE_SYMBOL(lv_tabview_add_tab),
DEFINE_MODULE_SYMBOL(lv_tabview_create),
DEFINE_MODULE_SYMBOL(lv_tabview_set_tab_bar_position),
DEFINE_MODULE_SYMBOL(lv_tabview_set_tab_bar_size),
// lv_screen
DEFINE_MODULE_SYMBOL(lv_scr_act),
DEFINE_MODULE_SYMBOL(lv_screen_active),
DEFINE_MODULE_SYMBOL(lv_layer_top),
// lv_group
DEFINE_MODULE_SYMBOL(lv_group_remove_obj),
DEFINE_MODULE_SYMBOL(lv_group_focus_obj),
DEFINE_MODULE_SYMBOL(lv_group_get_default),
DEFINE_MODULE_SYMBOL(lv_group_add_obj),
DEFINE_MODULE_SYMBOL(lv_group_set_default),
DEFINE_MODULE_SYMBOL(lv_group_set_editing),
DEFINE_MODULE_SYMBOL(lv_group_create),
DEFINE_MODULE_SYMBOL(lv_group_delete),
// lv_mem
DEFINE_MODULE_SYMBOL(lv_free),
DEFINE_MODULE_SYMBOL(lv_malloc),
// lv_draw
DEFINE_MODULE_SYMBOL(lv_draw_task_get_draw_dsc),
DEFINE_MODULE_SYMBOL(lv_draw_task_get_label_dsc),
DEFINE_MODULE_SYMBOL(lv_draw_task_get_fill_dsc),
DEFINE_MODULE_SYMBOL(lv_draw_buf_create),
// lv_image
DEFINE_MODULE_SYMBOL(lv_image_create),
DEFINE_MODULE_SYMBOL(lv_image_set_src),
DEFINE_MODULE_SYMBOL(lv_img_set_src),
// lv_anim
DEFINE_MODULE_SYMBOL(lv_anim_init),
DEFINE_MODULE_SYMBOL(lv_anim_set_duration),
DEFINE_MODULE_SYMBOL(lv_anim_set_exec_cb),
DEFINE_MODULE_SYMBOL(lv_anim_set_repeat_count),
DEFINE_MODULE_SYMBOL(lv_anim_set_values),
DEFINE_MODULE_SYMBOL(lv_anim_set_var),
DEFINE_MODULE_SYMBOL(lv_anim_set_path_cb),
DEFINE_MODULE_SYMBOL(lv_anim_start),
DEFINE_MODULE_SYMBOL(lv_anim_path_ease_in_out),
DEFINE_MODULE_SYMBOL(lv_anim_path_linear),
MODULE_SYMBOL_TERMINATOR
};

View File

@ -27,7 +27,8 @@ static error_t stop() {
struct Module platform_module = {
.name = "platform-esp32",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -17,7 +17,8 @@ static error_t stop() {
struct Module platform_module = {
.name = "platform-posix",
.start = start,
.stop = stop
.stop = stop,
.symbols = nullptr
};
}

View File

@ -38,6 +38,8 @@ const Configuration* getConfiguration();
*/
Dispatcher& getMainDispatcher();
ModuleParent& getModuleParent();
namespace hal {
/** While technically this configuration is nullable, it's never null after initHeadless() is called. */

View File

@ -41,11 +41,15 @@ static auto LOGGER = Logger("Tactility");
static const Configuration* config_instance = nullptr;
static Dispatcher mainDispatcher;
struct ModuleParent tactility_module_parent {
static struct ModuleParent tactility_module_parent {
"tactility",
nullptr
};
ModuleParent& getModuleParent() {
return tactility_module_parent;
}
// region Default services
namespace service {
// Primary

View File

@ -7,12 +7,22 @@ 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)
extern void __cxa_pure_virtual();
// cxx_guards.cpp
extern int __cxa_guard_acquire(void* pg);
extern void __cxa_guard_release(void* pg) throw();
extern void __cxa_guard_abort(void* pg) throw();
extern void __cxa_guard_dummy(void);
}
const esp_elfsym cplusplus_symbols[] = {
ESP_ELFSYM_EXPORT(_Znwj), // operator new(unsigned int)
ESP_ELFSYM_EXPORT(_ZdlPvj), // operator delete(void*, unsigned int)
// cxx_guards
ESP_ELFSYM_EXPORT(__cxa_pure_virtual), // class-related, see https://arobenko.github.io/bare_metal_cpp/
ESP_ELFSYM_EXPORT(__cxa_guard_acquire),
ESP_ELFSYM_EXPORT(__cxa_guard_release),
ESP_ELFSYM_EXPORT(__cxa_guard_abort),
ESP_ELFSYM_EXPORT(__cxa_guard_dummy),
// delimiter
ESP_ELFSYM_END
};

View File

@ -20,38 +20,38 @@
#include "tt_time.h"
#include "tt_wifi.h"
#include "symbols/cplusplus.h"
#include "symbols/esp_event.h"
#include "symbols/esp_http_client.h"
#include "symbols/freertos.h"
#include "symbols/gcc_soft_float.h"
#include "symbols/pthread.h"
#include "symbols/stl.h"
#include "symbols/string.h"
#include "symbols/cplusplus.h"
#include "symbols/freertos.h"
#include "symbols/gcc_soft_float.h"
#include <cstring>
#include <ctype.h>
#include <cassert>
#include <getopt.h>
#include <cmath>
#include <cstring>
#include <ctime>
#include <setjmp.h>
#include <sys/errno.h>
#include <sys/unistd.h>
#include <ctype.h>
#include <getopt.h>
#include <dirent.h>
#include <esp_log.h>
#include <esp_random.h>
#include <esp_sntp.h>
#include <esp_netif.h>
#include <dirent.h>
#include <sys/stat.h>
#include <time.h>
#include <fcntl.h>
#include <lwip/sockets.h>
#include <lvgl.h>
#include <locale.h>
#include <setjmp.h>
#include <sys/errno.h>
#include <sys/stat.h>
#include <sys/unistd.h>
#include <vector>
#include <Tactility/Tactility.h>
bool module_parent_resolve_symbol(ModuleParent* pParent, const char* name, uintptr_t* pInt);
extern "C" {
extern double __floatsidf(int x);
@ -88,8 +88,30 @@ const esp_elfsym main_symbols[] {
// esp_sntp.h
ESP_ELFSYM_EXPORT(sntp_get_sync_status),
// math.h
ESP_ELFSYM_EXPORT(atan),
ESP_ELFSYM_EXPORT(cos),
ESP_ELFSYM_EXPORT(sin),
ESP_ELFSYM_EXPORT(tan),
ESP_ELFSYM_EXPORT(tanh),
ESP_ELFSYM_EXPORT(frexp),
ESP_ELFSYM_EXPORT(modf),
ESP_ELFSYM_EXPORT(ceil),
ESP_ELFSYM_EXPORT(fabs),
ESP_ELFSYM_EXPORT(floor),
#ifndef _REENT_ONLY
ESP_ELFSYM_EXPORT(acos),
ESP_ELFSYM_EXPORT(asin),
ESP_ELFSYM_EXPORT(atan2),
ESP_ELFSYM_EXPORT(cos),
ESP_ELFSYM_EXPORT(sinh),
ESP_ELFSYM_EXPORT(exp),
ESP_ELFSYM_EXPORT(ldexp),
ESP_ELFSYM_EXPORT(log),
ESP_ELFSYM_EXPORT(log10),
ESP_ELFSYM_EXPORT(pow),
ESP_ELFSYM_EXPORT(sqrt),
ESP_ELFSYM_EXPORT(fmod),
#endif
// sys/errno.h
ESP_ELFSYM_EXPORT(__errno),
// freertos_tasks_c_additions.h
@ -112,6 +134,7 @@ const esp_elfsym main_symbols[] {
// cassert
ESP_ELFSYM_EXPORT(__assert_func),
// cstdio
ESP_ELFSYM_EXPORT(abort),
ESP_ELFSYM_EXPORT(fclose),
ESP_ELFSYM_EXPORT(feof),
ESP_ELFSYM_EXPORT(ferror),
@ -120,6 +143,7 @@ const esp_elfsym main_symbols[] {
ESP_ELFSYM_EXPORT(fgetpos),
ESP_ELFSYM_EXPORT(fgets),
ESP_ELFSYM_EXPORT(fopen),
ESP_ELFSYM_EXPORT(freopen),
ESP_ELFSYM_EXPORT(fputc),
ESP_ELFSYM_EXPORT(fputs),
ESP_ELFSYM_EXPORT(fprintf),
@ -153,11 +177,15 @@ const esp_elfsym main_symbols[] {
ESP_ELFSYM_EXPORT(strtol),
ESP_ELFSYM_EXPORT(strcspn),
ESP_ELFSYM_EXPORT(strncat),
ESP_ELFSYM_EXPORT(strpbrk),
ESP_ELFSYM_EXPORT(strspn),
ESP_ELFSYM_EXPORT(strcoll),
ESP_ELFSYM_EXPORT(memset),
ESP_ELFSYM_EXPORT(memcpy),
ESP_ELFSYM_EXPORT(memcmp),
ESP_ELFSYM_EXPORT(memchr),
ESP_ELFSYM_EXPORT(memmove),
// ctype
ESP_ELFSYM_EXPORT(isalnum),
ESP_ELFSYM_EXPORT(isalpha),
@ -284,300 +312,7 @@ const esp_elfsym main_symbols[] {
ESP_ELFSYM_EXPORT(tt_wifi_get_rssi),
// tt::lvgl
ESP_ELFSYM_EXPORT(tt_lvgl_spinner_create),
// lv_event
ESP_ELFSYM_EXPORT(lv_event_get_code),
ESP_ELFSYM_EXPORT(lv_event_get_indev),
ESP_ELFSYM_EXPORT(lv_event_get_key),
ESP_ELFSYM_EXPORT(lv_event_get_param),
ESP_ELFSYM_EXPORT(lv_event_get_scroll_anim),
ESP_ELFSYM_EXPORT(lv_event_get_user_data),
ESP_ELFSYM_EXPORT(lv_event_get_target_obj),
ESP_ELFSYM_EXPORT(lv_event_get_target),
ESP_ELFSYM_EXPORT(lv_event_get_current_target_obj),
ESP_ELFSYM_EXPORT(lv_event_get_draw_task),
// lv_obj
ESP_ELFSYM_EXPORT(lv_color_hex),
ESP_ELFSYM_EXPORT(lv_color_make),
ESP_ELFSYM_EXPORT(lv_obj_center),
ESP_ELFSYM_EXPORT(lv_obj_clean),
ESP_ELFSYM_EXPORT(lv_obj_clear_flag),
ESP_ELFSYM_EXPORT(lv_obj_create),
ESP_ELFSYM_EXPORT(lv_obj_delete),
ESP_ELFSYM_EXPORT(lv_obj_add_event_cb),
ESP_ELFSYM_EXPORT(lv_obj_add_flag),
ESP_ELFSYM_EXPORT(lv_obj_add_state),
ESP_ELFSYM_EXPORT(lv_obj_align),
ESP_ELFSYM_EXPORT(lv_obj_align_to),
ESP_ELFSYM_EXPORT(lv_obj_get_parent),
ESP_ELFSYM_EXPORT(lv_obj_get_height),
ESP_ELFSYM_EXPORT(lv_obj_get_width),
ESP_ELFSYM_EXPORT(lv_obj_get_coords),
ESP_ELFSYM_EXPORT(lv_obj_get_x),
ESP_ELFSYM_EXPORT(lv_obj_get_display),
ESP_ELFSYM_EXPORT(lv_obj_get_y),
ESP_ELFSYM_EXPORT(lv_obj_get_content_width),
ESP_ELFSYM_EXPORT(lv_obj_get_content_height),
ESP_ELFSYM_EXPORT(lv_obj_get_group),
ESP_ELFSYM_EXPORT(lv_obj_get_user_data),
ESP_ELFSYM_EXPORT(lv_obj_get_state),
ESP_ELFSYM_EXPORT(lv_obj_has_flag),
ESP_ELFSYM_EXPORT(lv_obj_has_flag_any),
ESP_ELFSYM_EXPORT(lv_obj_has_state),
ESP_ELFSYM_EXPORT(lv_obj_invalidate),
ESP_ELFSYM_EXPORT(lv_obj_is_valid),
ESP_ELFSYM_EXPORT(lv_obj_remove_event_cb),
ESP_ELFSYM_EXPORT(lv_obj_remove_flag),
ESP_ELFSYM_EXPORT(lv_obj_remove_state),
ESP_ELFSYM_EXPORT(lv_obj_set_pos),
ESP_ELFSYM_EXPORT(lv_obj_set_flex_align),
ESP_ELFSYM_EXPORT(lv_obj_set_flex_flow),
ESP_ELFSYM_EXPORT(lv_obj_set_flex_grow),
ESP_ELFSYM_EXPORT(lv_obj_set_layout),
ESP_ELFSYM_EXPORT(lv_obj_is_layout_positioned),
ESP_ELFSYM_EXPORT(lv_obj_mark_layout_as_dirty),
ESP_ELFSYM_EXPORT(lv_obj_get_style_layout),
ESP_ELFSYM_EXPORT(lv_obj_update_layout),
ESP_ELFSYM_EXPORT(lv_obj_set_scroll_dir),
ESP_ELFSYM_EXPORT(lv_obj_scroll_to_view),
ESP_ELFSYM_EXPORT(lv_obj_set_style_radius),
ESP_ELFSYM_EXPORT(lv_obj_set_style_border_width),
ESP_ELFSYM_EXPORT(lv_obj_set_style_border_color),
ESP_ELFSYM_EXPORT(lv_obj_set_style_border_opa),
ESP_ELFSYM_EXPORT(lv_obj_set_style_line_width),
ESP_ELFSYM_EXPORT(lv_obj_set_style_line_color),
ESP_ELFSYM_EXPORT(lv_obj_set_style_line_opa),
ESP_ELFSYM_EXPORT(lv_obj_set_style_line_rounded),
ESP_ELFSYM_EXPORT(lv_obj_set_style_opa),
ESP_ELFSYM_EXPORT(lv_obj_set_style_bg_color),
ESP_ELFSYM_EXPORT(lv_obj_set_style_bg_opa),
ESP_ELFSYM_EXPORT(lv_obj_set_style_bg_image_src),
ESP_ELFSYM_EXPORT(lv_obj_set_style_bg_image_opa),
ESP_ELFSYM_EXPORT(lv_obj_set_style_bg_image_recolor),
ESP_ELFSYM_EXPORT(lv_obj_set_style_bg_image_recolor_opa),
ESP_ELFSYM_EXPORT(lv_obj_set_style_margin_hor),
ESP_ELFSYM_EXPORT(lv_obj_set_style_margin_ver),
ESP_ELFSYM_EXPORT(lv_obj_set_style_margin_top),
ESP_ELFSYM_EXPORT(lv_obj_set_style_margin_bottom),
ESP_ELFSYM_EXPORT(lv_obj_set_style_margin_left),
ESP_ELFSYM_EXPORT(lv_obj_set_style_margin_right),
ESP_ELFSYM_EXPORT(lv_obj_set_style_margin_all),
ESP_ELFSYM_EXPORT(lv_obj_set_style_pad_all),
ESP_ELFSYM_EXPORT(lv_obj_set_style_pad_hor),
ESP_ELFSYM_EXPORT(lv_obj_set_style_pad_ver),
ESP_ELFSYM_EXPORT(lv_obj_set_style_pad_top),
ESP_ELFSYM_EXPORT(lv_obj_set_style_pad_bottom),
ESP_ELFSYM_EXPORT(lv_obj_set_style_pad_left),
ESP_ELFSYM_EXPORT(lv_obj_set_style_pad_right),
ESP_ELFSYM_EXPORT(lv_obj_set_style_pad_column),
ESP_ELFSYM_EXPORT(lv_obj_set_style_pad_row),
ESP_ELFSYM_EXPORT(lv_obj_set_style_border_post),
ESP_ELFSYM_EXPORT(lv_obj_set_style_border_side),
ESP_ELFSYM_EXPORT(lv_obj_set_style_text_opa),
ESP_ELFSYM_EXPORT(lv_obj_set_style_text_align),
ESP_ELFSYM_EXPORT(lv_obj_set_style_text_color),
ESP_ELFSYM_EXPORT(lv_obj_set_style_text_font),
ESP_ELFSYM_EXPORT(lv_obj_set_style_text_decor),
ESP_ELFSYM_EXPORT(lv_obj_set_style_text_letter_space),
ESP_ELFSYM_EXPORT(lv_obj_set_style_text_line_space),
ESP_ELFSYM_EXPORT(lv_obj_set_style_text_outline_stroke_color),
ESP_ELFSYM_EXPORT(lv_obj_set_style_text_outline_stroke_opa),
ESP_ELFSYM_EXPORT(lv_obj_set_style_text_outline_stroke_width),
ESP_ELFSYM_EXPORT(lv_obj_set_user_data),
ESP_ELFSYM_EXPORT(lv_obj_set_align),
ESP_ELFSYM_EXPORT(lv_obj_set_x),
ESP_ELFSYM_EXPORT(lv_obj_set_y),
ESP_ELFSYM_EXPORT(lv_obj_set_size),
ESP_ELFSYM_EXPORT(lv_obj_set_width),
ESP_ELFSYM_EXPORT(lv_obj_set_height),
ESP_ELFSYM_EXPORT(lv_obj_send_event),
ESP_ELFSYM_EXPORT(lv_obj_set_style_outline_color),
ESP_ELFSYM_EXPORT(lv_obj_set_style_outline_width),
ESP_ELFSYM_EXPORT(lv_obj_set_style_outline_pad),
ESP_ELFSYM_EXPORT(lv_obj_set_style_outline_opa),
ESP_ELFSYM_EXPORT(lv_obj_scroll_to_y),
ESP_ELFSYM_EXPORT(lv_obj_set_scrollbar_mode),
ESP_ELFSYM_EXPORT(lv_obj_get_child_count),
ESP_ELFSYM_EXPORT(lv_obj_get_child),
// lv_font
ESP_ELFSYM_EXPORT(lv_font_get_default),
// lv_theme
ESP_ELFSYM_EXPORT(lv_theme_get_color_primary),
ESP_ELFSYM_EXPORT(lv_theme_get_color_secondary),
ESP_ELFSYM_EXPORT(lv_theme_get_font_small),
ESP_ELFSYM_EXPORT(lv_theme_get_font_normal),
ESP_ELFSYM_EXPORT(lv_theme_get_font_large),
// lv_button
ESP_ELFSYM_EXPORT(lv_button_create),
// lv_buttonmatrix
ESP_ELFSYM_EXPORT(lv_buttonmatrix_create),
ESP_ELFSYM_EXPORT(lv_buttonmatrix_get_button_text),
ESP_ELFSYM_EXPORT(lv_buttonmatrix_get_map),
ESP_ELFSYM_EXPORT(lv_buttonmatrix_get_one_checked),
ESP_ELFSYM_EXPORT(lv_buttonmatrix_get_selected_button),
ESP_ELFSYM_EXPORT(lv_buttonmatrix_set_button_ctrl),
ESP_ELFSYM_EXPORT(lv_buttonmatrix_set_button_ctrl_all),
ESP_ELFSYM_EXPORT(lv_buttonmatrix_set_ctrl_map),
ESP_ELFSYM_EXPORT(lv_buttonmatrix_set_map),
ESP_ELFSYM_EXPORT(lv_buttonmatrix_set_one_checked),
ESP_ELFSYM_EXPORT(lv_buttonmatrix_set_button_width),
ESP_ELFSYM_EXPORT(lv_buttonmatrix_set_selected_button),
// lv_label
ESP_ELFSYM_EXPORT(lv_label_create),
ESP_ELFSYM_EXPORT(lv_label_cut_text),
ESP_ELFSYM_EXPORT(lv_label_get_long_mode),
ESP_ELFSYM_EXPORT(lv_label_set_long_mode),
ESP_ELFSYM_EXPORT(lv_label_get_text),
ESP_ELFSYM_EXPORT(lv_label_set_text),
ESP_ELFSYM_EXPORT(lv_label_set_text_fmt),
// lv_switch
ESP_ELFSYM_EXPORT(lv_switch_create),
// lv_checkbox
ESP_ELFSYM_EXPORT(lv_checkbox_create),
ESP_ELFSYM_EXPORT(lv_checkbox_set_text),
ESP_ELFSYM_EXPORT(lv_checkbox_get_text),
ESP_ELFSYM_EXPORT(lv_checkbox_set_text_static),
// lv_bar
ESP_ELFSYM_EXPORT(lv_bar_create),
ESP_ELFSYM_EXPORT(lv_bar_get_max_value),
ESP_ELFSYM_EXPORT(lv_bar_get_min_value),
ESP_ELFSYM_EXPORT(lv_bar_get_mode),
ESP_ELFSYM_EXPORT(lv_bar_get_start_value),
ESP_ELFSYM_EXPORT(lv_bar_get_value),
ESP_ELFSYM_EXPORT(lv_bar_set_mode),
ESP_ELFSYM_EXPORT(lv_bar_set_range),
ESP_ELFSYM_EXPORT(lv_bar_set_start_value),
ESP_ELFSYM_EXPORT(lv_bar_set_value),
ESP_ELFSYM_EXPORT(lv_bar_is_symmetrical),
// lv_dropdown
ESP_ELFSYM_EXPORT(lv_dropdown_create),
ESP_ELFSYM_EXPORT(lv_dropdown_add_option),
ESP_ELFSYM_EXPORT(lv_dropdown_clear_options),
ESP_ELFSYM_EXPORT(lv_dropdown_close),
ESP_ELFSYM_EXPORT(lv_dropdown_get_dir),
ESP_ELFSYM_EXPORT(lv_dropdown_get_list),
ESP_ELFSYM_EXPORT(lv_dropdown_get_option_count),
ESP_ELFSYM_EXPORT(lv_dropdown_get_option_index),
ESP_ELFSYM_EXPORT(lv_dropdown_get_options),
ESP_ELFSYM_EXPORT(lv_dropdown_get_selected),
ESP_ELFSYM_EXPORT(lv_dropdown_get_selected_str),
ESP_ELFSYM_EXPORT(lv_dropdown_get_selected_highlight),
ESP_ELFSYM_EXPORT(lv_dropdown_set_dir),
ESP_ELFSYM_EXPORT(lv_dropdown_set_options),
ESP_ELFSYM_EXPORT(lv_dropdown_set_options_static),
ESP_ELFSYM_EXPORT(lv_dropdown_set_selected),
ESP_ELFSYM_EXPORT(lv_dropdown_set_selected_highlight),
ESP_ELFSYM_EXPORT(lv_dropdown_set_symbol),
ESP_ELFSYM_EXPORT(lv_dropdown_set_text),
ESP_ELFSYM_EXPORT(lv_dropdown_open),
// lv_list
ESP_ELFSYM_EXPORT(lv_list_create),
ESP_ELFSYM_EXPORT(lv_list_add_text),
ESP_ELFSYM_EXPORT(lv_list_add_button),
ESP_ELFSYM_EXPORT(lv_list_get_button_text),
ESP_ELFSYM_EXPORT(lv_list_set_button_text),
// lv_textarea
ESP_ELFSYM_EXPORT(lv_textarea_create),
ESP_ELFSYM_EXPORT(lv_textarea_get_accepted_chars),
ESP_ELFSYM_EXPORT(lv_textarea_get_label),
ESP_ELFSYM_EXPORT(lv_textarea_get_max_length),
ESP_ELFSYM_EXPORT(lv_textarea_get_one_line),
ESP_ELFSYM_EXPORT(lv_textarea_get_text),
ESP_ELFSYM_EXPORT(lv_textarea_get_text_selection),
ESP_ELFSYM_EXPORT(lv_textarea_set_one_line),
ESP_ELFSYM_EXPORT(lv_textarea_set_accepted_chars),
ESP_ELFSYM_EXPORT(lv_textarea_set_align),
ESP_ELFSYM_EXPORT(lv_textarea_set_password_bullet),
ESP_ELFSYM_EXPORT(lv_textarea_set_password_mode),
ESP_ELFSYM_EXPORT(lv_textarea_set_password_show_time),
ESP_ELFSYM_EXPORT(lv_textarea_set_placeholder_text),
ESP_ELFSYM_EXPORT(lv_textarea_set_text),
ESP_ELFSYM_EXPORT(lv_textarea_set_text_selection),
ESP_ELFSYM_EXPORT(lv_textarea_set_max_length),
ESP_ELFSYM_EXPORT(lv_textarea_set_cursor_click_pos),
ESP_ELFSYM_EXPORT(lv_textarea_add_text),
// lv_palette
ESP_ELFSYM_EXPORT(lv_palette_main),
ESP_ELFSYM_EXPORT(lv_palette_darken),
ESP_ELFSYM_EXPORT(lv_palette_lighten),
// lv_display
ESP_ELFSYM_EXPORT(lv_display_get_default),
ESP_ELFSYM_EXPORT(lv_display_get_horizontal_resolution),
ESP_ELFSYM_EXPORT(lv_display_get_vertical_resolution),
ESP_ELFSYM_EXPORT(lv_display_get_physical_horizontal_resolution),
ESP_ELFSYM_EXPORT(lv_display_get_physical_vertical_resolution),
ESP_ELFSYM_EXPORT(lv_display_dpx),
// lv_pct
ESP_ELFSYM_EXPORT(lv_pct),
ESP_ELFSYM_EXPORT(lv_pct_to_px),
// lv_spinbox
ESP_ELFSYM_EXPORT(lv_spinbox_create),
ESP_ELFSYM_EXPORT(lv_spinbox_decrement),
ESP_ELFSYM_EXPORT(lv_spinbox_get_rollover),
ESP_ELFSYM_EXPORT(lv_spinbox_get_step),
ESP_ELFSYM_EXPORT(lv_spinbox_get_value),
ESP_ELFSYM_EXPORT(lv_spinbox_increment),
ESP_ELFSYM_EXPORT(lv_spinbox_set_rollover),
ESP_ELFSYM_EXPORT(lv_spinbox_set_step),
ESP_ELFSYM_EXPORT(lv_spinbox_set_range),
ESP_ELFSYM_EXPORT(lv_spinbox_set_digit_format),
ESP_ELFSYM_EXPORT(lv_spinbox_set_digit_step_direction),
ESP_ELFSYM_EXPORT(lv_spinbox_set_value),
ESP_ELFSYM_EXPORT(lv_spinbox_set_cursor_pos),
ESP_ELFSYM_EXPORT(lv_spinbox_step_next),
ESP_ELFSYM_EXPORT(lv_spinbox_step_prev),
// lv_indev
ESP_ELFSYM_EXPORT(lv_indev_get_type),
ESP_ELFSYM_EXPORT(lv_indev_get_point),
ESP_ELFSYM_EXPORT(lv_indev_get_display),
ESP_ELFSYM_EXPORT(lv_indev_get_key),
ESP_ELFSYM_EXPORT(lv_indev_get_gesture_dir),
ESP_ELFSYM_EXPORT(lv_indev_get_state),
ESP_ELFSYM_EXPORT(lv_indev_active),
// lv_timer
ESP_ELFSYM_EXPORT(lv_timer_handler),
ESP_ELFSYM_EXPORT(lv_timer_handler_run_in_period),
ESP_ELFSYM_EXPORT(lv_timer_periodic_handler),
ESP_ELFSYM_EXPORT(lv_timer_handler_set_resume_cb),
ESP_ELFSYM_EXPORT(lv_timer_create_basic),
ESP_ELFSYM_EXPORT(lv_timer_create),
ESP_ELFSYM_EXPORT(lv_timer_delete),
ESP_ELFSYM_EXPORT(lv_timer_pause),
ESP_ELFSYM_EXPORT(lv_timer_resume),
ESP_ELFSYM_EXPORT(lv_timer_set_cb),
ESP_ELFSYM_EXPORT(lv_timer_set_period),
ESP_ELFSYM_EXPORT(lv_timer_ready),
ESP_ELFSYM_EXPORT(lv_timer_set_repeat_count),
ESP_ELFSYM_EXPORT(lv_timer_set_auto_delete),
ESP_ELFSYM_EXPORT(lv_timer_set_user_data),
ESP_ELFSYM_EXPORT(lv_timer_reset),
ESP_ELFSYM_EXPORT(lv_timer_enable),
ESP_ELFSYM_EXPORT(lv_timer_get_idle),
ESP_ELFSYM_EXPORT(lv_timer_get_time_until_next),
ESP_ELFSYM_EXPORT(lv_timer_get_next),
ESP_ELFSYM_EXPORT(lv_timer_get_user_data),
ESP_ELFSYM_EXPORT(lv_timer_get_paused),
// lvgl other
ESP_ELFSYM_EXPORT(lv_refr_now),
ESP_ELFSYM_EXPORT(lv_line_create),
ESP_ELFSYM_EXPORT(lv_line_set_points),
ESP_ELFSYM_EXPORT(lv_line_set_points_mutable),
// lv_group
ESP_ELFSYM_EXPORT(lv_group_remove_obj),
ESP_ELFSYM_EXPORT(lv_group_focus_obj),
ESP_ELFSYM_EXPORT(lv_group_get_default),
ESP_ELFSYM_EXPORT(lv_group_add_obj),
ESP_ELFSYM_EXPORT(lv_group_set_default),
ESP_ELFSYM_EXPORT(lv_group_set_editing),
// lv_mem
ESP_ELFSYM_EXPORT(lv_free),
ESP_ELFSYM_EXPORT(lv_malloc),
// lv_draw
ESP_ELFSYM_EXPORT(lv_draw_task_get_draw_dsc),
ESP_ELFSYM_EXPORT(lv_draw_task_get_label_dsc),
ESP_ELFSYM_EXPORT(lv_draw_task_get_fill_dsc),
// lv_image
ESP_ELFSYM_EXPORT(lv_image_create),
ESP_ELFSYM_EXPORT(lv_image_set_src),
// stdio.h
ESP_ELFSYM_EXPORT(rename),
// dirent.h
@ -603,6 +338,8 @@ const esp_elfsym main_symbols[] {
// esp_netif.h
ESP_ELFSYM_EXPORT(esp_netif_get_ip_info),
ESP_ELFSYM_EXPORT(esp_netif_get_handle_from_ifkey),
// Locale
ESP_ELFSYM_EXPORT(localeconv),
// delimiter
ESP_ELFSYM_END
};
@ -638,6 +375,12 @@ uintptr_t tt_symbol_resolver(const char* symbolName) {
}
}
auto& module_parent = tt::getModuleParent();
uintptr_t symbol_address;
if (module_parent_resolve_symbol(&module_parent, symbolName, &symbol_address)) {
return symbol_address;
}
return 0;
}
@ -645,7 +388,9 @@ void tt_init_tactility_c() {
elf_set_symbol_resolver(tt_symbol_resolver);
}
} // extern "C"
}
// extern "C"
#else // Simulator

View File

@ -1,16 +1,28 @@
// SPDX-License-Identifier: Apache-2.0
#pragma once
#include "error.h"
#include <stdbool.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
#include "error.h"
#include <stdbool.h>
struct ModuleParent;
struct ModuleParentPrivate;
#define MODULE_SYMBOL_TERMINATOR { NULL, NULL }
#define DEFINE_MODULE_SYMBOL(symbol) { #symbol, (void*)&symbol }
/** A binary symbol like a function or a variable. */
struct ModuleSymbol {
/** The name of the symbol. */
const char* name;
/** The address of the symbol. */
const void* symbol;
};
/**
* A module is a collection of drivers or other functionality that can be loaded and unloaded at runtime.
*/
@ -38,6 +50,13 @@ struct Module {
*/
error_t (*stop)(void);
/**
* A list of symbols exported by the module.
* Should be terminated by MODULE_SYMBOL_TERMINATOR.
* Can be a NULL value.
*/
const struct ModuleSymbol* symbols;
struct {
bool started;
struct ModuleParent* parent;
@ -69,6 +88,16 @@ error_t module_parent_construct(struct ModuleParent* parent);
*/
error_t module_parent_destruct(struct ModuleParent* parent);
/**
* @brief Resolve a symbol from the module parent.
* @details This function iterates through all started modules in the parent and attempts to resolve the symbol.
* @param parent parent module
* @param symbol_name name of the symbol to resolve
* @param symbol_address pointer to store the address of the resolved symbol
* @return true if the symbol was found, false otherwise
*/
bool module_parent_resolve_symbol(struct ModuleParent* parent, const char* symbol_name, uintptr_t* symbol_address);
/**
* @brief Set the parent of the module.
* @warning must call before module_start()
@ -99,6 +128,16 @@ bool module_is_started(struct Module* module);
*/
error_t module_stop(struct Module* module);
/**
* @brief Resolve a symbol from the module.
* @details The module must be started for symbol resolution to succeed.
* @param module module
* @param symbol_name name of the symbol to resolve
* @param symbol_address pointer to store the address of the resolved symbol
* @return true if the symbol was found and the module is started, false otherwise
*/
bool module_resolve_symbol(struct Module* module, const char* symbol_name, uintptr_t* symbol_address);
#ifdef __cplusplus
}
#endif

View File

@ -1,4 +1,5 @@
#include <vector>
#include <string.h>
#include <algorithm>
#include <tactility/concurrent/mutex.h>
#include <tactility/module.h>
@ -41,6 +42,21 @@ error_t module_parent_destruct(struct ModuleParent* parent) {
return ERROR_NONE;
}
bool module_parent_resolve_symbol(ModuleParent* parent, const char* symbol_name, uintptr_t* symbol_address) {
auto* data = static_cast<ModuleParentPrivate*>(parent->module_parent_private);
mutex_lock(&data->mutex);
for (auto* module : data->modules) {
if (!module_is_started(module))
continue;
if (module_resolve_symbol(module, symbol_name, symbol_address)) {
mutex_unlock(&data->mutex);
return true;
}
}
mutex_unlock(&data->mutex);
return false;
}
#pragma endregion
#pragma region module
@ -102,6 +118,20 @@ error_t module_stop(struct Module* module) {
return error;
}
bool module_resolve_symbol(Module* module, const char* symbol_name, uintptr_t* symbol_address) {
if (!module_is_started(module)) return false;
auto* symbol_ptr = module->symbols;
if (symbol_ptr == nullptr) return false;
while (symbol_ptr->name != nullptr) {
if (strcmp(symbol_ptr->name, symbol_name) == 0) {
*symbol_address = reinterpret_cast<uintptr_t>(symbol_ptr->symbol);
return true;
}
symbol_ptr++;
}
return false;
}
#pragma endregion
}

View File

@ -35,6 +35,7 @@ TEST_CASE("ModuleParent destruction with children") {
.name = "test",
.start = test_start,
.stop = test_stop,
.symbols = nullptr,
.internal = {.started = false, .parent = nullptr}
};
@ -62,6 +63,7 @@ TEST_CASE("Module parent management") {
.name = "test",
.start = test_start,
.stop = test_stop,
.symbols = nullptr,
.internal = {.started = false, .parent = nullptr}
};
@ -100,6 +102,7 @@ TEST_CASE("Module lifecycle") {
.name = "test",
.start = test_start,
.stop = test_stop,
.symbols = nullptr,
.internal = {.started = false, .parent = nullptr}
};