Compare commits

...

6 Commits

Author SHA1 Message Date
Ken Van Hoeylandt
4c5b0b8b99 Update ideas.md 2025-09-05 14:48:32 +02:00
Ken Van Hoeylandt
ea070784fc Disable DisplayDriver for CYD 4848 2025-09-05 14:48:19 +02:00
Ken Van Hoeylandt
230f082460 Show warning if hardware is not supported 2025-09-05 14:48:10 +02:00
Ken Van Hoeylandt
81322b4e02 Fix for logging with idf 5.5 2025-09-05 14:47:57 +02:00
Ken Van Hoeylandt
25a39e5bc6 Install to /data by default 2025-09-05 14:26:04 +02:00
Ken Van Hoeylandt
e1dc59098e Fixes for SDK 2025-09-04 20:30:54 +02:00
8 changed files with 65 additions and 23 deletions

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,9 +56,10 @@ public:
// endregion // endregion
// region NativeDisplay // region DisplayDriver
bool supportsDisplayDriver() const override { return true; } // TODO: Find out why it crashes
bool supportsDisplayDriver() const override { return false; }
/** @return a NativeDisplay instance if this device supports it */ /** @return a NativeDisplay instance if this device supports it */
std::shared_ptr<tt::hal::display::DisplayDriver> _Nullable getDisplayDriver() final; std::shared_ptr<tt::hal::display::DisplayDriver> _Nullable getDisplayDriver() final;

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