diff --git a/hal/esp32/app_hal.cpp b/hal/esp32/app_hal.cpp new file mode 100644 index 0000000..efed72a --- /dev/null +++ b/hal/esp32/app_hal.cpp @@ -0,0 +1,91 @@ + +#include "app_hal.h" +#include "lvgl.h" +#include "PanelLan.h" + +PanelLan tft(BOARD_SC01_PLUS); + +static const uint32_t screenWidth = 480; +static const uint32_t screenHeight = 320; + +const unsigned int lvBufferSize = screenWidth * 30; +uint8_t lvBuffer[2][lvBufferSize]; + +static lv_display_t *lvDisplay; +static lv_indev_t *lvInput; + +#if LV_USE_LOG != 0 +static void lv_log_print_g_cb(lv_log_level_t level, const char *buf) +{ + LV_UNUSED(level); + LV_UNUSED(buf); +} +#endif + +/* Display flushing */ +void my_disp_flush(lv_display_t *display, const lv_area_t *area, unsigned char *data) +{ + + uint32_t w = lv_area_get_width(area); + uint32_t h = lv_area_get_height(area); + lv_draw_sw_rgb565_swap(data, w * h); + + if (tft.getStartCount() == 0) + { + tft.endWrite(); + } + tft.pushImageDMA(area->x1, area->y1, area->x2 - area->x1 + 1, area->y2 - area->y1 + 1, (uint16_t *)data); + lv_display_flush_ready(display); /* tell lvgl that flushing is done */ +} + +/*Read the touchpad*/ +void my_touchpad_read(lv_indev_t *indev_driver, lv_indev_data_t *data) +{ + uint16_t touchX, touchY; + bool touched = tft.getTouch(&touchX, &touchY); + if (!touched) + { + data->state = LV_INDEV_STATE_REL; + } + else + { + data->state = LV_INDEV_STATE_PR; + /*Set the coordinates*/ + data->point.x = touchX; + data->point.y = touchY; + } +} + +static uint32_t my_tick(void) +{ + return millis(); +} + +void hal_setup(void) +{ + + tft.init(); + tft.initDMA(); + tft.startWrite(); + tft.fillScreen(TFT_BLACK); + tft.setRotation(1); + + lv_tick_set_cb(my_tick); + + lvDisplay = lv_display_create(screenWidth, screenHeight); + lv_display_set_color_format(lvDisplay, LV_COLOR_FORMAT_RGB565); + lv_display_set_flush_cb(lvDisplay, my_disp_flush); + lv_display_set_buffers(lvDisplay, lvBuffer[0], lvBuffer[1], lvBufferSize, LV_DISPLAY_RENDER_MODE_PARTIAL); + + lvInput = lv_indev_create(); + lv_indev_set_type(lvInput, LV_INDEV_TYPE_POINTER); + lv_indev_set_read_cb(lvInput, my_touchpad_read); + +} + +void hal_loop(void) +{ + // NO while loop in this function! (handled by framework) + lv_timer_handler(); // Update the UI- + delay(5); +} diff --git a/hal/esp32/app_hal.h b/hal/esp32/app_hal.h new file mode 100644 index 0000000..58a5b9d --- /dev/null +++ b/hal/esp32/app_hal.h @@ -0,0 +1,17 @@ +#ifndef DRIVER_H +#define DRIVER_H + +#ifdef __cplusplus +extern "C" { +#endif + + +void hal_setup(void); +void hal_loop(void); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*DRIVER_H*/ diff --git a/platformio.ini b/platformio.ini index 153fee1..a85654c 100644 --- a/platformio.ini +++ b/platformio.ini @@ -90,3 +90,21 @@ build_src_filter = +<../hal/stm32f429_disco> ; Force compile LVGL demo, remove when working on your own project +<../.pio/libdeps/stm32f429_disco/lvgl/demos> + +[env:esp32_sc01_plus] +platform = espressif32 +board = esp32-s3-devkitm-1 +framework = arduino +build_flags = + ${env.build_flags} + -D LV_LOG_LEVEL=LV_LOG_LEVEL_NONE + ; Add recursive dirs for hal headers search + !python -c "import os; print(' '.join(['-I {}'.format(i[0].replace('\x5C','/')) for i in os.walk('hal/esp32')]))" +lib_deps = + ${env.lib_deps} + smartpanle/PanelLan@^0.0.1 +build_src_filter = + +<*> + +<../hal/esp32> + ; Force compile LVGL demo, remove when working on your own project + +<../.pio/libdeps/esp32_sc01_plus/lvgl/demos> \ No newline at end of file diff --git a/src/main.c b/src/main.cpp similarity index 69% rename from src/main.c rename to src/main.cpp index 24f33f6..37317e7 100644 --- a/src/main.c +++ b/src/main.cpp @@ -14,6 +14,21 @@ #include "demos/lv_demos.h" +#ifdef ARDUINO +#include + +void setup() { + lv_init(); + hal_setup(); + lv_demo_widgets(); +} + +void loop() { + hal_loop(); // -< do not use while loop in this function +} + +#else + int main(void) { lv_init(); @@ -24,3 +39,5 @@ int main(void) hal_loop(); } + +#endif \ No newline at end of file