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:
parent
a9b69010d8
commit
c0ed8f0a44
@ -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; }
|
||||||
};
|
};
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -56,7 +56,7 @@ public:
|
|||||||
|
|
||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
// region NativeDisplay
|
// region DisplayDriver
|
||||||
|
|
||||||
bool supportsDisplayDriver() const override { return true; }
|
bool supportsDisplayDriver() const override { return true; }
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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.
|
||||||
|
|||||||
@ -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.
|
||||||
|
|||||||
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user