diff --git a/src/components/fs/FS.cpp b/src/components/fs/FS.cpp index 0bb59afa..95b40824 100644 --- a/src/components/fs/FS.cpp +++ b/src/components/fs/FS.cpp @@ -45,7 +45,6 @@ void FS::Init() { #ifndef PINETIME_IS_RECOVERY VerifyResource(); - LVGLFileSystemInit(); #endif } @@ -139,65 +138,3 @@ int FS::SectorRead(const struct lfs_config* c, lfs_block_t block, lfs_off_t off, lfs.flashDriver.Read(address, static_cast(buffer), size); return 0; } - -/* - - ----------- LVGL filesystem integration ----------- - -*/ - -namespace { - 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); - 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) { - 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) { - 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) { - FS* filesys = static_cast(drv->user_data); - lfs_file_t* file = static_cast(file_p); - filesys->FileSeek(file, pos); - return LV_FS_RES_OK; - } -} - -void FS::LVGLFileSystemInit() { - - 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 = this; - - lv_fs_drv_register(&fs_drv); -} diff --git a/src/components/fs/FS.h b/src/components/fs/FS.h index 9730e474..aba30509 100644 --- a/src/components/fs/FS.h +++ b/src/components/fs/FS.h @@ -11,7 +11,6 @@ namespace Pinetime { FS(Pinetime::Drivers::SpiNorFlash&); void Init(); - void LVGLFileSystemInit(); int FileOpen(lfs_file_t* file_p, const char* fileName, const int flags); int FileClose(lfs_file_t* file_p); diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index 1648a090..ccba7ee6 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -91,7 +91,7 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd, brightnessController {brightnessController}, touchHandler {touchHandler}, filesystem {filesystem}, - lvgl {lcd} { + lvgl {lcd, filesystem} { } void DisplayApp::Start(System::BootErrors error) { diff --git a/src/displayapp/LittleVgl.cpp b/src/displayapp/LittleVgl.cpp index 1326c566..89893cf7 100644 --- a/src/displayapp/LittleVgl.cpp +++ b/src/displayapp/LittleVgl.cpp @@ -4,6 +4,8 @@ #include #include #include "drivers/St7789.h" +#include "littlefs/lfs.h" +#include "components/fs/FS.h" using namespace Pinetime::Components; @@ -12,6 +14,43 @@ 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; + } } static void disp_flush(lv_disp_drv_t* disp_drv, const lv_area_t* area, lv_color_t* color_p) { @@ -34,7 +73,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() { @@ -42,6 +81,7 @@ void LittleVgl::Init() { InitTheme(); InitDisplay(); InitTouchpad(); + InitFileSystem(); } void LittleVgl::InitDisplay() { @@ -75,6 +115,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; diff --git a/src/displayapp/LittleVgl.h b/src/displayapp/LittleVgl.h index 38f1f00e..9a15ae15 100644 --- a/src/displayapp/LittleVgl.h +++ b/src/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];