From 02f980f2781dca8a9160401776e59fd4de5b6586 Mon Sep 17 00:00:00 2001 From: Reinhold Gschweicher Date: Sun, 26 Feb 2023 23:42:03 +0100 Subject: [PATCH] sim: LittleVgl: update s.t. LVGL-FS driver is initialized by LittleVgl InfiniTime moved the LVGL-FS driver initialization to the LittleVgl constructor and passed the FS member to do that. Update the simulator copy of LittleVgl to do just that. Fixes: https://github.com/InfiniTimeOrg/InfiniSim/issues/89 --- CMakeLists.txt | 14 ++------ InfiniTime | 2 +- main.cpp | 8 ++--- sim/displayapp/LittleVgl.cpp | 68 ++++++++++++++++++++++++++++++------ sim/displayapp/LittleVgl.h | 5 ++- 5 files changed, 68 insertions(+), 29 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cf00821..49cd262 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -211,18 +211,10 @@ target_sources(infinisim PUBLIC ${InfiniTime_DIR}/src/systemtask/SystemMonitor.cpp ) -if(EXISTS ${InfiniTime_DIR}/src/displayapp/InfiniTimeTheme.cpp) - target_compile_definitions(infinisim PUBLIC INFINITIME_THEME_CPP) - target_sources(infinisim PUBLIC - ${InfiniTime_DIR}/src/displayapp/InfiniTimeTheme.cpp - ${InfiniTime_DIR}/src/displayapp/InfiniTimeTheme.h +target_sources(infinisim PUBLIC + ${InfiniTime_DIR}/src/displayapp/InfiniTimeTheme.cpp + ${InfiniTime_DIR}/src/displayapp/InfiniTimeTheme.h ) -else() - target_sources(infinisim PUBLIC - ${InfiniTime_DIR}/src/displayapp/lv_pinetime_theme.h - ${InfiniTime_DIR}/src/displayapp/lv_pinetime_theme.c - ) -endif() # littlefs add_library(littlefs STATIC diff --git a/InfiniTime b/InfiniTime index ce2277c..9bbd2dd 160000 --- a/InfiniTime +++ b/InfiniTime @@ -1 +1 @@ -Subproject commit ce2277cbcac0f28b27c1483fba09921f43d590cd +Subproject commit 9bbd2ddbc4e44742913e35e25b21b80d80efe36b diff --git a/main.cpp b/main.cpp index 5b89ef0..d95537f 100644 --- a/main.cpp +++ b/main.cpp @@ -21,11 +21,7 @@ #include "lv_drivers/indev/mousewheel.h" // get PineTime header -#if defined(INFINITIME_THEME_CPP) #include "displayapp/InfiniTimeTheme.h" -#else -#include "displayapp/lv_pinetime_theme.h" -#endif #include #include @@ -330,8 +326,6 @@ Pinetime::Drivers::Cst816S touchPanel; // {twiMaster, touchPanelTwiAddress}; // #include "displayapp/LittleVgl.h" // #include "displayapp/DisplayApp.h" //#endif -Pinetime::Components::LittleVgl lvgl {lcd}; - Pinetime::Drivers::Bma421 motionSensor {twiMaster, motionSensorTwiAddress}; Pinetime::Drivers::Hrs3300 heartRateSensor {twiMaster, heartRateSensorTwiAddress}; @@ -347,6 +341,8 @@ Pinetime::Controllers::FS fs {spiNorFlash}; Pinetime::Controllers::Settings settingsController {fs}; Pinetime::Controllers::MotorController motorController {}; +Pinetime::Components::LittleVgl lvgl {lcd, fs}; + Pinetime::Controllers::DateTime dateTimeController {settingsController}; Pinetime::Drivers::Watchdog watchdog; Pinetime::Controllers::NotificationManager notificationManager; diff --git a/sim/displayapp/LittleVgl.cpp b/sim/displayapp/LittleVgl.cpp index 1e8c1a6..04a7482 100644 --- a/sim/displayapp/LittleVgl.cpp +++ b/sim/displayapp/LittleVgl.cpp @@ -1,20 +1,17 @@ #include "displayapp/LittleVgl.h" -#if defined(INFINITIME_THEME_CPP) #include "displayapp/InfiniTimeTheme.h" -#else -#include "displayapp/lv_pinetime_theme.h" -#endif #include #include #include -////#include -#include "drivers/Cst816s.h" #include "drivers/St7789.h" +#include "littlefs/lfs.h" +#include "components/fs/FS.h" // lv-sim monitor display driver for monitor_flush() function #include "lv_drivers/display/monitor.h" +#include #include using namespace Pinetime::Components; @@ -24,8 +21,44 @@ namespace { lv_theme_t* theme = lv_pinetime_theme_init(); lv_theme_set_act(theme); } + + lv_fs_res_t lvglOpen(lv_fs_drv_t* drv, void* file_p, const char* path, lv_fs_mode_t /*mode*/) { + lfs_file_t* file = static_cast(file_p); + Pinetime::Controllers::FS* filesys = static_cast(drv->user_data); + int res = filesys->FileOpen(file, path, LFS_O_RDONLY); + if (res == 0) { + if (file->type == 0) { + return LV_FS_RES_FS_ERR; + } else { + return LV_FS_RES_OK; + } + } + return LV_FS_RES_NOT_EX; + } + + lv_fs_res_t lvglClose(lv_fs_drv_t* drv, void* file_p) { + Pinetime::Controllers::FS* filesys = static_cast(drv->user_data); + lfs_file_t* file = static_cast(file_p); + filesys->FileClose(file); + + return LV_FS_RES_OK; + } + + lv_fs_res_t lvglRead(lv_fs_drv_t* drv, void* file_p, void* buf, uint32_t btr, uint32_t* br) { + Pinetime::Controllers::FS* filesys = static_cast(drv->user_data); + lfs_file_t* file = static_cast(file_p); + filesys->FileRead(file, static_cast(buf), btr); + *br = btr; + return LV_FS_RES_OK; + } + + lv_fs_res_t lvglSeek(lv_fs_drv_t* drv, void* file_p, uint32_t pos) { + Pinetime::Controllers::FS* filesys = static_cast(drv->user_data); + lfs_file_t* file = static_cast(file_p); + filesys->FileSeek(file, pos); + return LV_FS_RES_OK; + } } -lv_style_t* LabelBigStyle = nullptr; static void disp_flush(lv_disp_drv_t* disp_drv, const lv_area_t* area, lv_color_t* color_p) { auto* lvgl = static_cast(disp_drv->user_data); @@ -47,7 +80,7 @@ bool touchpad_read(lv_indev_drv_t* indev_drv, lv_indev_data_t* data) { return lvgl->GetTouchPadInfo(data); } -LittleVgl::LittleVgl(Pinetime::Drivers::St7789& lcd) : lcd {lcd} { +LittleVgl::LittleVgl(Pinetime::Drivers::St7789& lcd, Pinetime::Controllers::FS& filesystem) : lcd {lcd}, filesystem {filesystem} { } void LittleVgl::Init() { @@ -55,6 +88,7 @@ void LittleVgl::Init() { InitTheme(); InitDisplay(); InitTouchpad(); + InitFileSystem(); } void LittleVgl::InitDisplay() { @@ -88,6 +122,22 @@ void LittleVgl::InitTouchpad() { lv_indev_drv_register(&indev_drv); } +void LittleVgl::InitFileSystem() { + lv_fs_drv_t fs_drv; + lv_fs_drv_init(&fs_drv); + + fs_drv.file_size = sizeof(lfs_file_t); + fs_drv.letter = 'F'; + fs_drv.open_cb = lvglOpen; + fs_drv.close_cb = lvglClose; + fs_drv.read_cb = lvglRead; + fs_drv.seek_cb = lvglSeek; + + fs_drv.user_data = &filesystem; + + lv_fs_drv_register(&fs_drv); +} + void LittleVgl::SetFullRefresh(FullRefreshDirections direction) { if (scrollDirection == FullRefreshDirections::None) { scrollDirection = direction; @@ -204,7 +254,6 @@ void LittleVgl::FlushDisplay(const lv_area_t* area, lv_color_t* color_p) { scrollOffset = (totalNbLines) -toScroll; } lcd.VerticalScrollStartAddress(scrollOffset); - } // move the whole screen down and draw the new screen at the top of the display MoveScreen(&disp_drv, static_cast(height)); @@ -298,7 +347,6 @@ void LittleVgl::CancelTap() { } } - bool LittleVgl::GetTouchPadInfo(lv_indev_data_t* ptr) { ptr->point.x = touchPoint.x; ptr->point.y = touchPoint.y; diff --git a/sim/displayapp/LittleVgl.h b/sim/displayapp/LittleVgl.h index 38f1f00..9a15ae1 100644 --- a/sim/displayapp/LittleVgl.h +++ b/sim/displayapp/LittleVgl.h @@ -1,6 +1,7 @@ #pragma once #include +#include namespace Pinetime { namespace Drivers { @@ -11,7 +12,7 @@ namespace Pinetime { class LittleVgl { public: enum class FullRefreshDirections { None, Up, Down, Left, Right, LeftAnim, RightAnim }; - LittleVgl(Pinetime::Drivers::St7789& lcd); + LittleVgl(Pinetime::Drivers::St7789& lcd, Pinetime::Controllers::FS& filesystem); LittleVgl(const LittleVgl&) = delete; LittleVgl& operator=(const LittleVgl&) = delete; @@ -37,8 +38,10 @@ namespace Pinetime { private: void InitDisplay(); void InitTouchpad(); + void InitFileSystem(); Pinetime::Drivers::St7789& lcd; + Pinetime::Controllers::FS& filesystem; lv_disp_buf_t disp_buf_2; lv_color_t buf2_1[LV_HOR_RES_MAX * 4];