diff --git a/README.md b/README.md index 35056373..90008ec9 100644 --- a/README.md +++ b/README.md @@ -73,12 +73,12 @@ Implementing drivers can take some effort, so Tactility provides support for sev Predefined configurations are available for: -| Device | Screen&Touch | SD card | Other | -|------------------------------------------|--------------|---------|----------| -| [LilyGo T-Deck][tdeck] | ✅ | ✅ | Keyboard | -| [Waveshare S3 Touch][waveshare_s3_touch] | ✅ | ⏳ | | -| Yellow Board 2432S024C (\*) | ✅ | ✅ | | -| [M5Stack Core2][m5stack] | ✅ | ✅ | | +| Device | Screen&Touch | SD card | Power | Other | +|------------------------------------------|--------------|---------|-------|----------| +| [M5Stack Core2][m5stack] | ✅ | ✅ | ✅ | | +| [LilyGo T-Deck][tdeck] | ✅ | ✅ | | Keyboard | +| [Waveshare S3 Touch][waveshare_s3_touch] | ✅ | ⏳ | | | +| Yellow Board 2432S024C (\*) | ✅ | ✅ | | | - ✅: Capable and implemented - ⏳: Capable but not yet implemented diff --git a/app-sim/src/hardware_config.c b/app-sim/src/hardware_config.c index 3fbea738..4912a433 100644 --- a/app-sim/src/hardware_config.c +++ b/app-sim/src/hardware_config.c @@ -5,6 +5,8 @@ #define TAG "hardware" +extern const Power power; + static bool lvgl_init() { lv_init(); lvgl_task_start(); @@ -22,7 +24,12 @@ TT_UNUSED static void lvgl_deinit() { #endif } -HardwareConfig sim_hardware = { +const HardwareConfig sim_hardware = { .bootstrap = NULL, .init_graphics = &lvgl_init, + .display = { + .set_backlight_duty = NULL, + }, + .power = &power, + .sdcard = NULL }; diff --git a/app-sim/src/main.c b/app-sim/src/main.c index 4642916a..273939a5 100644 --- a/app-sim/src/main.c +++ b/app-sim/src/main.c @@ -1,7 +1,7 @@ #include "hello_world/hello_world.h" #include "tactility.h" -extern HardwareConfig sim_hardware; +extern const HardwareConfig sim_hardware; void app_main() { static const Config config = { diff --git a/app-sim/src/power.c b/app-sim/src/power.c new file mode 100644 index 00000000..e4d2ab14 --- /dev/null +++ b/app-sim/src/power.c @@ -0,0 +1,34 @@ +#include "power.h" + +#ifdef __cplusplus +extern "C" { +#endif + +static bool is_charging_enabled = false; + +static bool power_is_charging() { + return is_charging_enabled; +} + +static void power_set_charging_enabled(bool enabled) { + is_charging_enabled = enabled; +} + +static uint8_t power_get_charge_level() { + return 204; +} + +static int32_t power_get_current() { + return is_charging_enabled ? 100 : -50; +} + +const Power power = { + .is_charging = &power_is_charging, + .set_charging_enabled = &power_set_charging_enabled, + .get_charge_level = &power_get_charge_level, + .get_current = &power_get_current +}; + +#ifdef __cplusplus +} +#endif diff --git a/boards/lilygo_tdeck/lilygo_tdeck.c b/boards/lilygo_tdeck/lilygo_tdeck.c index d1d9c15e..59b5108f 100644 --- a/boards/lilygo_tdeck/lilygo_tdeck.c +++ b/boards/lilygo_tdeck/lilygo_tdeck.c @@ -13,5 +13,6 @@ const HardwareConfig lilygo_tdeck = { .set_backlight_duty = &tdeck_backlight_set }, .init_graphics = &tdeck_init_lvgl, - .sdcard = &tdeck_sdcard + .sdcard = &tdeck_sdcard, + .power = NULL }; diff --git a/boards/m5stack_core2/source/display.cpp b/boards/m5stack_core2/source/display.cpp index df866f7a..99670c49 100644 --- a/boards/m5stack_core2/source/display.cpp +++ b/boards/m5stack_core2/source/display.cpp @@ -32,7 +32,12 @@ lv_disp_t* core2_display_init() { const esp_lcd_panel_dev_config_t panel_config = { .reset_gpio_num = GPIO_NUM_NC, .rgb_ele_order = LCD_RGB_ELEMENT_ORDER_BGR, + .data_endian = LCD_RGB_DATA_ENDIAN_BIG, .bits_per_pixel = CORE2_LCD_BITS_PER_PIXEL, + .flags = { + .reset_active_high = false + }, + .vendor_config = nullptr }; esp_lcd_panel_handle_t panel_handle; diff --git a/boards/m5stack_core2/source/m5stack_core2.c b/boards/m5stack_core2/source/m5stack_core2.c index c8cc3b52..90364154 100644 --- a/boards/m5stack_core2/source/m5stack_core2.c +++ b/boards/m5stack_core2/source/m5stack_core2.c @@ -3,6 +3,7 @@ #include "lvgl_i.h" extern const SdCard core2_sdcard; +extern Power core2_power; // Making it const fails the build const HardwareConfig m5stack_core2 = { .bootstrap = &core2_bootstrap, @@ -10,5 +11,6 @@ const HardwareConfig m5stack_core2 = { .set_backlight_duty = NULL }, .init_graphics = &core2_lvgl_init, - .sdcard = &core2_sdcard + .sdcard = &core2_sdcard, + .power = &core2_power }; diff --git a/boards/m5stack_core2/source/power.cpp b/boards/m5stack_core2/source/power.cpp new file mode 100644 index 00000000..c88512e6 --- /dev/null +++ b/boards/m5stack_core2/source/power.cpp @@ -0,0 +1,34 @@ +#include "power.h" +#include "M5Unified.hpp" + +#ifdef __cplusplus +extern "C" { +#endif + +static bool power_is_charging() { + return M5.Power.isCharging() == m5::Power_Class::is_charging; +} + +static void power_set_charging_enabled(bool enabled) { + M5.Power.setBatteryCharge(enabled); +} + +static uint8_t power_get_charge_level() { + uint16_t scaled = (uint16_t)M5.Power.getBatteryLevel() * 255 / 100; + return (uint8_t)scaled; +} + +static int32_t power_get_current() { + return M5.Power.getBatteryCurrent(); +} + +Power core2_power = { + .is_charging = &power_is_charging, + .set_charging_enabled = &power_set_charging_enabled, + .get_charge_level = &power_get_charge_level, + .get_current = &power_get_current +}; + +#ifdef __cplusplus +} +#endif diff --git a/boards/m5stack_core2/source/touch.cpp b/boards/m5stack_core2/source/touch.cpp index 847e5b03..94d2c43d 100644 --- a/boards/m5stack_core2/source/touch.cpp +++ b/boards/m5stack_core2/source/touch.cpp @@ -9,7 +9,7 @@ extern "C" { #endif static void read_touch(TT_UNUSED lv_indev_t* indev, lv_indev_data_t* data) { - static lgfx::touch_point_t point; + lgfx::touch_point_t point; // Making it static makes it unreliable bool touched = M5.Lcd.getTouch(&point) > 0; if (touched) { data->point.x = point.x; diff --git a/boards/waveshare_s3_touch/waveshare_s3_touch.c b/boards/waveshare_s3_touch/waveshare_s3_touch.c index 9e65a13b..15ae87e8 100644 --- a/boards/waveshare_s3_touch/waveshare_s3_touch.c +++ b/boards/waveshare_s3_touch/waveshare_s3_touch.c @@ -9,5 +9,7 @@ const HardwareConfig waveshare_s3_touch = { .display = { .set_backlight_duty = NULL // TODO: This requires implementing the CH422G IO expander }, - .init_graphics = &ws3t_init_lvgl + .init_graphics = &ws3t_init_lvgl, + .sdcard = NULL, + .power = NULL }; diff --git a/boards/yellow_board/yellow_board.c b/boards/yellow_board/yellow_board.c index b678092e..0a57eee5 100644 --- a/boards/yellow_board/yellow_board.c +++ b/boards/yellow_board/yellow_board.c @@ -12,5 +12,6 @@ const HardwareConfig yellow_board_24inch_cap = { .set_backlight_duty = &twodotfour_backlight_set }, .init_graphics = &twodotfour_lvgl_init, - .sdcard = &twodotfour_sdcard + .sdcard = &twodotfour_sdcard, + .power = NULL }; diff --git a/data/assets/app_icon_power_settings.png b/data/assets/app_icon_power_settings.png new file mode 100644 index 00000000..41ba02da Binary files /dev/null and b/data/assets/app_icon_power_settings.png differ diff --git a/data/assets/power_020.png b/data/assets/power_020.png new file mode 100644 index 00000000..4827f245 Binary files /dev/null and b/data/assets/power_020.png differ diff --git a/data/assets/power_040.png b/data/assets/power_040.png new file mode 100644 index 00000000..67079c18 Binary files /dev/null and b/data/assets/power_040.png differ diff --git a/data/assets/power_060.png b/data/assets/power_060.png new file mode 100644 index 00000000..9600ceab Binary files /dev/null and b/data/assets/power_060.png differ diff --git a/data/assets/power_080.png b/data/assets/power_080.png new file mode 100644 index 00000000..a3dd78ff Binary files /dev/null and b/data/assets/power_080.png differ diff --git a/data/assets/power_100.png b/data/assets/power_100.png new file mode 100644 index 00000000..4098f968 Binary files /dev/null and b/data/assets/power_100.png differ diff --git a/data/assets_sources/Desktop Icons.svg b/data/assets_sources/Desktop Icons.svg index 05afdc5c..73a05d92 100644 --- a/data/assets_sources/Desktop Icons.svg +++ b/data/assets_sources/Desktop Icons.svg @@ -7,10 +7,10 @@ id="svg11" sodipodi:docname="Desktop Icons.svg" xml:space="preserve" - inkscape:export-filename="app_icon_display_settings.png" + inkscape:export-filename="../assets/power_020.png" inkscape:export-xdpi="3" inkscape:export-ydpi="3" - inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)" + inkscape:version="1.4 (e7c3feb100, 2024-10-09)" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" @@ -100,14 +100,14 @@ in2="comp1" id="feComposite41" />