Merge develop into main (#318)

- Disable `DisplayDriver` for `St7701Display` (on CYD 4848)
- Improve `GraphicsDemo`: check for feature capability and show alert dialog if there's an issue
- `DevelopmentService` installs to `/data` instead of `/sdcard`
- Fixed `tt_app_get_data_directory()` and `tt_app_get_data_directory_lvgl()` (C++ to C)
- `tt_kernel.h` now defines `MAX_TICKS`
- `tt_init.cpp` now exports `esp_log()` which is required since ESP-IDF 5.5
This commit is contained in:
Ken Van Hoeylandt 2025-09-06 14:44:41 +02:00 committed by GitHub
parent a9b69010d8
commit c0ed8f0a44
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 66 additions and 22 deletions

View File

@ -32,4 +32,7 @@ public:
void setBacklightDuty(uint8_t backlightDuty) override; void setBacklightDuty(uint8_t backlightDuty) override;
bool supportsBacklightDuty() const override { return true; } bool supportsBacklightDuty() const override { return true; }
// TODO: Find out why it crashes
bool supportsDisplayDriver() const override { return false; }
}; };

View File

@ -5,14 +5,17 @@
- Fix Development service: when no SD card is present, the app fails to install. Consider installing to `/data` - Fix Development service: when no SD card is present, the app fails to install. Consider installing to `/data`
Note: Change app install to "transfer file" functionality. We can have a proper install when we have app packaging. Note: Change app install to "transfer file" functionality. We can have a proper install when we have app packaging.
Note: Consider installation path option in interface Note: Consider installation path option in interface
- Update ILI934x to v2.0.1
- External app loading: Check the version of Tactility and check ESP target hardware to check for compatibility. - External app loading: Check the version of Tactility and check ESP target hardware to check for compatibility.
- Make a URL handler. Use it for handling local files. Match file types with apps. - Make a URL handler. Use it for handling local files. Match file types with apps.
Create some kind of "intent" handler like on Android. Create some kind of "intent" handler like on Android.
The intent can have an action (e.g. view), a URL and an optional bundle. The intent can have an action (e.g. view), a URL and an optional bundle.
The manifest can provide the intent handler The manifest can provide the intent handler
- App packaging
- Bug: GraphicsDemo should check if display supports the DisplayDriver interface (and same for touch) and show an AlertDialog error if there's a problem - Bug: GraphicsDemo should check if display supports the DisplayDriver interface (and same for touch) and show an AlertDialog error if there's a problem
- Update ILI934x to v2.0.1
- App packaging
- Create an "app install paths" settings app to add/remove paths.
Scan these paths on startup.
Make the AppList use the scan results.
## Lower Priority ## Lower Priority

View File

@ -56,7 +56,7 @@ public:
// endregion // endregion
// region NativeDisplay // region DisplayDriver
bool supportsDisplayDriver() const override { return true; } bool supportsDisplayDriver() const override { return true; }

View File

@ -5,22 +5,55 @@
#include <esp_log.h> #include <esp_log.h>
#include <tt_app.h> #include <tt_app.h>
#include <tt_app_alertdialog.h>
#include <tt_lvgl.h> #include <tt_lvgl.h>
constexpr auto TAG = "Main"; constexpr auto TAG = "Main";
static void onCreate(AppHandle appHandle, void* data) { /** Find a DisplayDevice that supports the DisplayDriver interface */
static bool findUsableDisplay(DeviceId& deviceId) {
uint16_t display_count = 0; uint16_t display_count = 0;
if (!tt_hal_device_find(DEVICE_TYPE_DISPLAY, &deviceId, &display_count, 1)) {
ESP_LOGE(TAG, "No display device found");
return false;
}
if (!tt_hal_display_driver_supported(deviceId)) {
ESP_LOGE(TAG, "Display doesn't support driver mode");
return false;
}
return true;
}
/** Find a TouchDevice that supports the TouchDriver interface */
static bool findUsableTouch(DeviceId& deviceId) {
uint16_t touch_count = 0;
if (!tt_hal_device_find(DEVICE_TYPE_TOUCH, &deviceId, &touch_count, 1)) {
ESP_LOGE(TAG, "No touch device found");
return false;
}
if (!tt_hal_touch_driver_supported(deviceId)) {
ESP_LOGE(TAG, "Touch doesn't support driver mode");
return false;
}
return true;
}
static void onCreate(AppHandle appHandle, void* data) {
DeviceId display_id; DeviceId display_id;
if (!tt_hal_device_find(DEVICE_TYPE_DISPLAY, &display_id, &display_count, 1)) { if (!findUsableDisplay(display_id)) {
ESP_LOGI(TAG, "No display device found"); tt_app_stop();
tt_app_alertdialog_start("Error", "The display doesn't support the required features.", nullptr, 0);
return; return;
} }
uint16_t touch_count = 0;
DeviceId touch_id; DeviceId touch_id;
if (!tt_hal_device_find(DEVICE_TYPE_TOUCH, &touch_id, &touch_count, 1)) { if (!findUsableTouch(touch_id)) {
ESP_LOGI(TAG, "No touch device found"); tt_app_stop();
tt_app_alertdialog_start("Error", "The touch driver doesn't support the required features.", nullptr, 0);
return; return;
} }

View File

@ -251,7 +251,7 @@ esp_err_t DevelopmentService::handleAppInstall(httpd_req_t* request) {
content_left -= content_read; content_left -= content_read;
// Write file // Write file
auto file_path = std::format("/sdcard/{}", filename_entry->second); auto file_path = std::format("/data/{}", filename_entry->second);
auto* file = fopen(file_path.c_str(), "wb"); auto* file = fopen(file_path.c_str(), "wb");
auto file_bytes_written = fwrite(buffer.get(), 1, file_size, file); auto file_bytes_written = fwrite(buffer.get(), 1, file_size, file);
fclose(file); fclose(file);

View File

@ -29,7 +29,7 @@ bool tt_app_has_result(AppHandle handle);
* @param[out] buffer the output buffer (recommended size is 256 bytes) * @param[out] buffer the output buffer (recommended size is 256 bytes)
* @param[inout] size used as input for maximum buffer size (including null terminator) and is set with the path string length by this function * @param[inout] size used as input for maximum buffer size (including null terminator) and is set with the path string length by this function
*/ */
void tt_app_get_data_directory(AppPathsHandle handle, char* buffer, size_t& size); void tt_app_get_data_directory(AppPathsHandle handle, char* buffer, size_t* size);
/** Get the path to the data directory of this app, with LVGL drive letter prefix applied. /** Get the path to the data directory of this app, with LVGL drive letter prefix applied.
* The recommended buffer size is 256 bytes. * The recommended buffer size is 256 bytes.
@ -37,7 +37,7 @@ void tt_app_get_data_directory(AppPathsHandle handle, char* buffer, size_t& size
* @param[out] buffer the output buffer (recommended size is 256 bytes) * @param[out] buffer the output buffer (recommended size is 256 bytes)
* @param[inout] size used as input for maximum buffer size (including null terminator) and is set with the path string length by this function * @param[inout] size used as input for maximum buffer size (including null terminator) and is set with the path string length by this function
*/ */
void tt_app_get_data_directory_lvgl(AppPathsHandle handle, char* buffer, size_t& size); void tt_app_get_data_directory_lvgl(AppPathsHandle handle, char* buffer, size_t* size);
/** /**
* Start an app by id. * Start an app by id.

View File

@ -8,6 +8,8 @@ extern "C" {
typedef unsigned long TickType; typedef unsigned long TickType;
#define MAX_TICKS INT32_MAX
/** /**
* Stall the current task for the specified amount of time. * Stall the current task for the specified amount of time.
* @param milliseconds the time in milliseconds to stall. * @param milliseconds the time in milliseconds to stall.

View File

@ -33,38 +33,40 @@ void tt_app_stop() {
tt::app::stop(); tt::app::stop();
} }
void tt_app_get_data_directory(AppPathsHandle handle, char* buffer, size_t& size) { void tt_app_get_data_directory(AppPathsHandle handle, char* buffer, size_t* size) {
assert(buffer != nullptr); assert(buffer != nullptr);
assert(size > 0); assert(size != nullptr);
assert(*size > 0);
auto paths = HANDLE_AS_APP_CONTEXT(handle)->getPaths(); auto paths = HANDLE_AS_APP_CONTEXT(handle)->getPaths();
auto data_path = paths->getDataDirectory(); auto data_path = paths->getDataDirectory();
auto expected_length = data_path.length() + 1; auto expected_length = data_path.length() + 1;
if (size < expected_length) { if (*size < expected_length) {
TT_LOG_E(TAG, "Path buffer not large enough (%d < %d)", size, expected_length); TT_LOG_E(TAG, "Path buffer not large enough (%d < %d)", size, expected_length);
size = 0; *size = 0;
buffer[0] = 0; buffer[0] = 0;
return; return;
} }
strcpy(buffer, data_path.c_str()); strcpy(buffer, data_path.c_str());
size = data_path.length(); *size = data_path.length();
} }
void tt_app_get_data_directory_lvgl(AppPathsHandle handle, char* buffer, size_t& size) { void tt_app_get_data_directory_lvgl(AppPathsHandle handle, char* buffer, size_t* size) {
assert(buffer != nullptr); assert(buffer != nullptr);
assert(size > 0); assert(size != nullptr);
assert(*size > 0);
auto paths = HANDLE_AS_APP_CONTEXT(handle)->getPaths(); auto paths = HANDLE_AS_APP_CONTEXT(handle)->getPaths();
auto data_path = paths->getDataDirectoryLvgl(); auto data_path = paths->getDataDirectoryLvgl();
auto expected_length = data_path.length() + 1; auto expected_length = data_path.length() + 1;
if (size < expected_length) { if (*size < expected_length) {
TT_LOG_E(TAG, "Path buffer not large enough (%d < %d)", size, expected_length); TT_LOG_E(TAG, "Path buffer not large enough (%d < %d)", size, expected_length);
size = 0; *size = 0;
buffer[0] = 0; buffer[0] = 0;
return; return;
} }
strcpy(buffer, data_path.c_str()); strcpy(buffer, data_path.c_str());
size = data_path.length(); *size = data_path.length();
} }
} }

View File

@ -105,6 +105,7 @@ const esp_elfsym elf_symbols[] {
ESP_ELFSYM_EXPORT(tolower), ESP_ELFSYM_EXPORT(tolower),
ESP_ELFSYM_EXPORT(toupper), ESP_ELFSYM_EXPORT(toupper),
// ESP-IDF // ESP-IDF
ESP_ELFSYM_EXPORT(esp_log),
ESP_ELFSYM_EXPORT(esp_log_write), ESP_ELFSYM_EXPORT(esp_log_write),
ESP_ELFSYM_EXPORT(esp_log_timestamp), ESP_ELFSYM_EXPORT(esp_log_timestamp),
// Tactility // Tactility