From ae845e24b2bc7ba38e891b5d80fdc8d31f79c284 Mon Sep 17 00:00:00 2001 From: Orphey <15167344+frostmorn@users.noreply.github.com> Date: Sat, 30 Mar 2024 15:11:38 +0000 Subject: [PATCH] Restore original lualilka_sdcard, few fixes of fileutils --- firmware/doom/src/main.cpp | 2 +- .../{fileutils_test.lua => sdcard_test.lua} | 4 +- firmware/keira/src/apps/launcher.cpp | 4 +- ...ilka_fileutils.cpp => lualilka_sdcard.cpp} | 48 +++++++++++-------- ...lualilka_fileutils.h => lualilka_sdcard.h} | 4 +- firmware/keira/src/apps/lua/luarunner.cpp | 12 +++-- sdk/lib/lilka/src/lilka/fileutils.cpp | 12 ++--- sdk/lib/lilka/src/lilka/fileutils.h | 1 + sdk/lib/lilka/src/lilka/multiboot.cpp | 5 +- 9 files changed, 53 insertions(+), 39 deletions(-) rename firmware/keira/sdcard/{fileutils_test.lua => sdcard_test.lua} (70%) rename firmware/keira/src/apps/lua/{lualilka_fileutils.cpp => lualilka_sdcard.cpp} (80%) rename firmware/keira/src/apps/lua/{lualilka_fileutils.h => lualilka_sdcard.h} (57%) diff --git a/firmware/doom/src/main.cpp b/firmware/doom/src/main.cpp index a3809085..2998591b 100644 --- a/firmware/doom/src/main.cpp +++ b/firmware/doom/src/main.cpp @@ -141,7 +141,7 @@ void setup() { name.toLowerCase(); lilka::serial_log("Checking file: %s\n", name.c_str()); if (name.startsWith("doom") && name.endsWith(".wad")) { - strcpy(arg3, (String("/sd") + firmwareDir + "/" + file.name()).c_str()); + strcpy(arg3, (lilka::fileutils.getSDRoot() + firmwareDir + "/" + file.name()).c_str()); lilka::serial_log("Found .WAD file: %s\n", arg3); found = true; file.close(); diff --git a/firmware/keira/sdcard/fileutils_test.lua b/firmware/keira/sdcard/sdcard_test.lua similarity index 70% rename from firmware/keira/sdcard/fileutils_test.lua rename to firmware/keira/sdcard/sdcard_test.lua index 51d5c94f..f779201f 100644 --- a/firmware/keira/sdcard/fileutils_test.lua +++ b/firmware/keira/sdcard/sdcard_test.lua @@ -1,4 +1,4 @@ -local file_dir = fileutils.ls("/sd") +local file_dir = sdcard.ls("/") print(#file_dir) @@ -6,7 +6,7 @@ for i = 0, #file_dir do print(file_dir[i]) end -file = file("/sd/test.txt", "a+") +file = file("/test.txt", "a+") file:write("HELLOWORLD") diff --git a/firmware/keira/src/apps/launcher.cpp b/firmware/keira/src/apps/launcher.cpp index 10512eab..0d49251b 100644 --- a/firmware/keira/src/apps/launcher.cpp +++ b/firmware/keira/src/apps/launcher.cpp @@ -218,6 +218,7 @@ void LauncherApp::sdBrowserMenu(FS* fSysDriver, const String& path) { void LauncherApp::selectFile(String path) { String lowerCasedPath = path; lowerCasedPath.toLowerCase(); + //lilka::serial_log("FileBrowser : Selected path %s", path.c_str()); if (lowerCasedPath.endsWith(".rom") || lowerCasedPath.endsWith(".nes")) { AppManager::getInstance()->runApp(new NesApp(path)); } else if (lowerCasedPath.endsWith(".bin")) { @@ -382,7 +383,8 @@ void LauncherApp::settingsMenu() { const uint32_t workSize = FF_MAX_SS * 4; void* work = ps_malloc(workSize ); // Buffer (4 sectors), otherwise f_mkfs tries to allocate in stack and fails due to task stack size - FRESULT result = f_mkfs("/sd", FM_ANY, 0, work, workSize); // TODO - hardcoded mountpoint + FRESULT result = + f_mkfs(lilka::fileutils.getSDRoot().c_str(), FM_ANY, 0, work, workSize); // TODO - hardcoded mountpoint free(work); if (result != FR_OK) { this->alert("Помилка", "Не вдалося сформатувати SD-карту, код помилки: " + String(result)); diff --git a/firmware/keira/src/apps/lua/lualilka_fileutils.cpp b/firmware/keira/src/apps/lua/lualilka_sdcard.cpp similarity index 80% rename from firmware/keira/src/apps/lua/lualilka_fileutils.cpp rename to firmware/keira/src/apps/lua/lualilka_sdcard.cpp index 95991166..befe1b5e 100644 --- a/firmware/keira/src/apps/lua/lualilka_fileutils.cpp +++ b/firmware/keira/src/apps/lua/lualilka_sdcard.cpp @@ -1,10 +1,11 @@ -#include "lualilka_fileutils.h" +#include "lualilka_sdcard.h" #include "lilka.h" static int lualilka_create_object_file(lua_State* L) { String path = luaL_checkstring(L, 1); String mode = luaL_checkstring(L, 2); - *reinterpret_cast(lua_newuserdata(L, sizeof(FILE*))) = fopen((path).c_str(), mode.c_str()); + *reinterpret_cast(lua_newuserdata(L, sizeof(FILE*))) = + fopen((lilka::fileutils.getSDRoot() + path).c_str(), mode.c_str()); luaL_setmetatable(L, FILE_OBJECT); return 1; } @@ -72,27 +73,27 @@ static int lualilka_file_write(lua_State* L) { return luaL_error(L, "write error"); } -int lualilka_list_dir(lua_State* L) { +int lualilka_sdcard_list_dir(lua_State* L) { int n = lua_gettop(L); if (n != 1) { return luaL_error(L, "Очікується 1 аргумент, отримано %d", n); } + if (!lilka::fileutils.isSDAvailable()) { + return luaL_error(L, "SD card not found"); + } + String path = lua_tostring(L, 1); - size_t _numEntries = lilka::fileutils.getEntryCount( - lilka::fileutils.getFSysDriverByFullPath(path), lilka::fileutils.getRelativePath(path) - ); + size_t _numEntries = lilka::fileutils.getEntryCount(&SD, path); if (_numEntries == 0) { return luaL_error(L, "Директорія порожня, або сталася помилка читання директорії"); } lilka::Entry* entries = new lilka::Entry[_numEntries]; - int numEntries = lilka::fileutils.listDir( - lilka::fileutils.getFSysDriverByFullPath(path), lilka::fileutils.getRelativePath(path), entries - ); + int numEntries = lilka::fileutils.listDir(&SD, path, entries); std::unique_ptr entriesPtr(entries); if (_numEntries != numEntries) { @@ -109,16 +110,20 @@ int lualilka_list_dir(lua_State* L) { return 1; } -int lualilka_remove(lua_State* L) { +int lualilka_sdcard_remove(lua_State* L) { int n = lua_gettop(L); if (n != 1) { return luaL_error(L, "Очікується 1 аргумент, отримано %d", n); } + if (!lilka::fileutils.isSDAvailable()) { + return luaL_error(L, "SD card not found"); + } + String path = lua_tostring(L, 1); - int ret = remove(path.c_str()); + int ret = remove((lilka::fileutils.getSDRoot() + path).c_str()); if (ret != 0) { return luaL_error(L, "Error remove file: %d", ret); @@ -127,17 +132,22 @@ int lualilka_remove(lua_State* L) { return 0; } -int lualilka_rename(lua_State* L) { +int lualilka_sdcard_rename(lua_State* L) { int n = lua_gettop(L); if (n != 2) { return luaL_error(L, "Очікується 1 аргумент, отримано %d", n); } + if (!lilka::fileutils.isSDAvailable()) { + return luaL_error(L, "SD card not found"); + } + String old_name = lua_tostring(L, 1); String new_name = lua_tostring(L, 2); - int ret = rename((old_name).c_str(), (new_name).c_str()); + int ret = + rename((lilka::fileutils.getSDRoot() + old_name).c_str(), (lilka::fileutils.getSDRoot() + new_name).c_str()); if (ret != 0) { return luaL_error(L, "Error renaming file: %d", ret); @@ -147,13 +157,13 @@ int lualilka_rename(lua_State* L) { } static const luaL_Reg lualilka_sdcard[] = { - {"ls", lualilka_list_dir}, - {"remove", lualilka_remove}, - {"rename", lualilka_rename}, + {"ls", lualilka_sdcard_list_dir}, + {"remove", lualilka_sdcard_remove}, + {"rename", lualilka_sdcard_rename}, {NULL, NULL}, }; -int lualilka_fileutils_register(lua_State* L) { +int lualilka_sdcard_register(lua_State* L) { lua_register(L, FILE_OBJECT, lualilka_create_object_file); luaL_newmetatable(L, FILE_OBJECT); lua_pushcfunction(L, lualilka_delete_object_file); @@ -173,7 +183,7 @@ int lualilka_fileutils_register(lua_State* L) { lua_pop(L, 1); luaL_newlib(L, lualilka_sdcard); - lua_setglobal(L, "fileutils"); + lua_setglobal(L, "sdcard"); return 0; -} \ No newline at end of file +} diff --git a/firmware/keira/src/apps/lua/lualilka_fileutils.h b/firmware/keira/src/apps/lua/lualilka_sdcard.h similarity index 57% rename from firmware/keira/src/apps/lua/lualilka_fileutils.h rename to firmware/keira/src/apps/lua/lualilka_sdcard.h index 7721aabc..b48f30c0 100644 --- a/firmware/keira/src/apps/lua/lualilka_fileutils.h +++ b/firmware/keira/src/apps/lua/lualilka_sdcard.h @@ -2,7 +2,7 @@ #include #include - +#include #define FILE_OBJECT "file" -int lualilka_fileutils_register(lua_State* L); +int lualilka_sdcard_register(lua_State* L); diff --git a/firmware/keira/src/apps/lua/luarunner.cpp b/firmware/keira/src/apps/lua/luarunner.cpp index ee683176..c90bd1dc 100644 --- a/firmware/keira/src/apps/lua/luarunner.cpp +++ b/firmware/keira/src/apps/lua/luarunner.cpp @@ -15,7 +15,7 @@ #include "lualilka_util.h" #include "lualilka_buzzer.h" #include "lualilka_state.h" -#include "lualilka_fileutils.h" +#include "lualilka_sdcard.h" #include "lualilka_wifi.h" #include "lualilka_imageTransform.h" @@ -158,7 +158,7 @@ void AbstractLuaRunnerApp::luaSetup(const char* dir) { lualilka_gpio_register(L); lualilka_util_register(L); lualilka_buzzer_register(L); - lualilka_fileutils_register(L); + lualilka_sdcard_register(L); lualilka_wifi_register(L); lualilka_imageTransform_register(L); @@ -285,7 +285,7 @@ LuaFileRunnerApp::LuaFileRunnerApp(String path) : AbstractLuaRunnerApp("Lua file void LuaFileRunnerApp::run() { #ifndef LILKA_NO_LUA // Get dir name from path (without the trailing slash) - String dir = path.substring(0, path.lastIndexOf('/')); + String dir = lilka::fileutils.stripPath(path); luaSetup(dir.c_str()); @@ -408,6 +408,7 @@ void LuaLiveRunnerApp::run() { } // TODO: This is a temporary fix: https://github.com/espressif/arduino-esp32/issues/9221 + lilka::fileutils.isSDAvailable(); execSource(code); @@ -423,7 +424,7 @@ void LuaLiveRunnerApp::run() { void LuaLiveRunnerApp::execSource(String source) { #ifndef LILKA_NO_LUA - luaSetup("/sd"); // TODO: hard-coded + luaSetup(lilka::fileutils.getSDRoot().c_str()); lilka::serial_log("lua: run source"); @@ -449,7 +450,7 @@ LuaReplApp::LuaReplApp() : AbstractLuaRunnerApp("Lua REPL") { void LuaReplApp::run() { #ifndef LILKA_NO_LUA - luaSetup("/sd"); // TODO: hard-coded + luaSetup(lilka::fileutils.getSDRoot().c_str()); // TODO: hard-coded canvas->setFont(FONT_10x20); canvas->setCursor(8, 48); @@ -462,6 +463,7 @@ void LuaReplApp::run() { lilka::serial_log("lua: start REPL"); // TODO: This is a temporary fix: https://github.com/espressif/arduino-esp32/issues/9221 + lilka::fileutils.initSD(); bool quit = false; while (!quit) { diff --git a/sdk/lib/lilka/src/lilka/fileutils.cpp b/sdk/lib/lilka/src/lilka/fileutils.cpp index 3aa4abc9..d8dd2646 100644 --- a/sdk/lib/lilka/src/lilka/fileutils.cpp +++ b/sdk/lib/lilka/src/lilka/fileutils.cpp @@ -150,16 +150,16 @@ size_t FileUtils::listDir(FS* fSysDriver, const String& path, Entry entries[]) { FS* FileUtils::getFSysDriverByFullPath(const String& path) { FS* fs = NULL; - if (path.startsWith(LILKA_SDROOT)) { + if (path.startsWith(LILKA_SDROOT LILKA_SLASH)) { fs = static_cast(sdfs); - } else if (path.startsWith(LILKA_SPIFFS_ROOT)) { + } else if (path.startsWith(LILKA_SPIFFS_ROOT LILKA_SLASH)) { fs = static_cast(spiffs); } return fs; } const String FileUtils::getFullPath(const FS* fSysDriver, const String& path) { // Allready okay - if (path.startsWith(LILKA_SDROOT) || path.startsWith(LILKA_SPIFFS_ROOT)) return path; + if (path.startsWith(LILKA_SDROOT LILKA_SLASH) || path.startsWith(LILKA_SPIFFS_ROOT LILKA_SLASH)) return path; if (fSysDriver == sdfs) { return String(LILKA_SDROOT) + path; @@ -172,9 +172,9 @@ const String FileUtils::getFullPath(const FS* fSysDriver, const String& path) { const String FileUtils::getRelativePath(const String& path) { String relativePath; - if (path.startsWith(LILKA_SDROOT)) { + if (path.startsWith(LILKA_SDROOT LILKA_SLASH)) { relativePath = "/" + path.substring(LILKA_SDROOT_LEN); - } else if (path.startsWith(LILKA_SPIFFS_ROOT)) { + } else if (path.startsWith(LILKA_SPIFFS_ROOT LILKA_SLASH)) { relativePath = "/" + path.substring(LILKA_SPIFFS_ROOT_LEN); } else // Maybe path is allready relative? @@ -183,7 +183,7 @@ const String FileUtils::getRelativePath(const String& path) { } bool FileUtils::isSDAvailable() { - return (sdfs->cardType() == CARD_NONE || sdfs->cardType() == CARD_UNKNOWN); + return !(sdfs->cardType() == CARD_NONE || sdfs->cardType() == CARD_UNKNOWN); } bool FileUtils::isSPIFFSAvailable() { diff --git a/sdk/lib/lilka/src/lilka/fileutils.h b/sdk/lib/lilka/src/lilka/fileutils.h index b8eed5b3..42c7eab3 100644 --- a/sdk/lib/lilka/src/lilka/fileutils.h +++ b/sdk/lib/lilka/src/lilka/fileutils.h @@ -5,6 +5,7 @@ #include "config.h" #define LILKA_SDROOT "/sd" #define LILKA_SPIFFS_ROOT "/fs" +#define LILKA_SLASH "/" #define LILKA_SDROOT_LEN 3 #define LILKA_SPIFFS_ROOT_LEN 3 #define H_FILE_SIZE 6 diff --git a/sdk/lib/lilka/src/lilka/multiboot.cpp b/sdk/lib/lilka/src/lilka/multiboot.cpp index 276507cd..dc88036b 100644 --- a/sdk/lib/lilka/src/lilka/multiboot.cpp +++ b/sdk/lib/lilka/src/lilka/multiboot.cpp @@ -150,9 +150,8 @@ int MultiBoot::start(String path) { // Remove "/sd" prefix // TODO: Maybe we should use absolute path (including "/sd")? // TODO: Store arg in RAM? - if (arg.startsWith("/sd/")) { - arg = arg.substring(3); - } + arg = lilka::fileutils.getRelativePath(arg); + prefs.putString(MULTIBOOT_PATH_KEY, arg); prefs.end();