Просмотр исходного кода

add: luat_shell添加文件系统操作lsdir/fread

Wendal Chen 4 лет назад
Родитель
Сommit
27e6149ea6

+ 100 - 1
components/shell/luat_shell.c

@@ -27,20 +27,37 @@ extern void i2c_tools(const char * data,size_t len);
 #include "luat_ymodem.h"
 #endif
 
-luat_shell_t shell_ctx;
+luat_shell_t shell_ctx = {
+    .echo_enable = 1
+};
 extern luat_cmux_t cmux_ctx;
 
 static int luat_shell_loadstr(lua_State *L, void* ptr);
 
+// 查询BSP
 static void cmd_ati(char* uart_buff, size_t len);
+// 复位重启
 static void cmd_reset(char* uart_buff, size_t len);
+// AT回显OK
 static void cmd_at(char* uart_buff, size_t len);
+// AT回显设置
 static void cmd_ate(char* uart_buff, size_t len);
+// 查询内存状态
 static void cmd_free(char* uart_buff, size_t len);
+// 查询芯片唯一id
 static void cmd_cgsn(char* uart_buff, size_t len);
+
+// cmux初始化
 static void cmd_cmux_cmd_init(char* uart_buff, size_t len);
+
+// rpel 操作
 static void cmd_loadstr(char* uart_buff, size_t len);
+
+// 文件操作
 static void cmd_ry(char* uart_buff, size_t len);
+static void cmd_lsdir(char* uart_buff, size_t len);
+static void cmd_fread(char* uart_buff, size_t len);
+static void cmd_fwrite(char* uart_buff, size_t len);
 
 luat_shell_cmd_reg_t cmd_regs[] = {
     {"ATI", cmd_ati},
@@ -65,6 +82,9 @@ luat_shell_cmd_reg_t cmd_regs[] = {
 #ifdef LUAT_USE_YMODEM
     {"ry\r",       cmd_ry},
 #endif
+    {"lsdir ",     cmd_lsdir},
+    {"fread ",     cmd_fread},
+    {"fwrite ",    cmd_fwrite},
     {NULL, NULL}
 };
 
@@ -175,9 +195,11 @@ static void cmd_cmux_cmd_init(char* uart_buff, size_t len) {
     luat_shell_write("OK\r\n", 4);
 }
 
+#ifdef LUAT_USE_I2CTOOLS
 static void cmd_i2c_tools(char* uart_buff, size_t len) {
     i2c_tools(uart_buff, len);
 }
+#endif
 
 #ifdef LUAT_USE_LOADSTR
 static void cmd_loadstr(char* uart_buff, size_t len) {
@@ -223,6 +245,83 @@ static void cmd_ry(char* uart_buff, size_t len) {
 }
 #endif
 
+#include <string.h>
+#include "luat_fs.h"
+// 文件相关的命令
+static void cmd_lsdir(char* uart_buff, size_t len) {
+    if (uart_buff[len - 1] == '\r') {
+        uart_buff[len - 1] = 0;
+    }
+    if (uart_buff[len - 2] == '\r') {
+        uart_buff[len - 2] = 0;
+    }
+    strtok(uart_buff, " ");
+    char* path = strtok(NULL, " ");
+    luat_fs_dirent_t* ents = luat_heap_malloc(sizeof(luat_fs_dirent_t) * 10);
+    if (ents == NULL) {
+        LLOGE("out of memory when malloc luat_fs_dirent_t");
+        return;
+    }
+    int i = 0;
+    int ret = 0;
+    while (1)
+    {
+        //LLOGD("lsdir for %s %d %d", path, i* 10, 10);
+        ret = luat_fs_lsdir(path, ents, i* 10, 10);
+        //LLOGD("luat_fs_lsdir %d", ret);
+        if (ret < 1)
+            break;
+        for (size_t i = 0; i < ret; i++)
+        {
+            LLOGD(">> %s %s", ents[i].d_type == 0 ? "FILE" : "DIR ", ents[i].d_name);
+        }
+        if (ret != 10)
+            break;
+    }
+    luat_heap_free(ents);
+}
+
+static void cmd_fread(char* uart_buff, size_t len) {
+    if (uart_buff[len - 1] == '\r') {
+        uart_buff[len - 1] = 0;
+    }
+    if (uart_buff[len - 2] == '\r') {
+        uart_buff[len - 2] = 0;
+    }
+    strtok(uart_buff, " ");
+    char* path = strtok(NULL, " ");
+    size_t flen = luat_fs_fsize(path);
+    if (flen < 1) {
+        LLOGD("ERR FILE NOT FOUND");
+        return;
+    }
+    FILE* fd = luat_fs_fopen(path, "rb");
+    if (fd == NULL) {
+        LLOGD("ERR FILE NOT FOUND");
+        return;
+    }
+    LLOGD("OK %d", flen);
+    char* buff = luat_heap_malloc(4096);
+    if (buff == NULL) {
+        luat_fs_fclose(fd);
+        LLOGE("out of memory when read file");
+        return;
+    }
+    int count = 0;
+    while (count < flen) {
+        int rlen = luat_fs_fread(buff, 4096, 1, fd);
+        if (rlen < 1)
+            break;
+        luat_shell_write(buff, rlen);
+    }
+    luat_fs_fclose(fd);
+}
+
+static void cmd_fwrite(char* uart_buff, size_t len) {
+    LLOGD("not support yet");
+    return;
+}
+
 /// 已废弃的函数
 
 //===============================================================================

+ 92 - 0
lua/src/liolib.c

@@ -149,6 +149,9 @@ typedef luaL_Stream LStream;
 #define isclosed(p)	((p)->closef == NULL)
 
 #include "luat_fs.h"
+#define LUAT_LOG_TAG "io"
+#include "luat_log.h"
+
 #undef fopen
 #undef fclose
 #undef fread
@@ -881,6 +884,11 @@ static int f_fill(lua_State *L) {
 }
 #endif
 
+static int io_mkfs (lua_State *L);
+static int io_mkdir (lua_State *L);
+static int io_rmdir (lua_State *L);
+static int io_lsdir (lua_State *L);
+
 /*
 ** functions for 'io' library
 */
@@ -903,6 +911,13 @@ static const rotable_Reg_t iolib[] = {
   {"fileSize", ROREG_FUNC(io_fileSize)},
   {"readFile", ROREG_FUNC(io_readFile)},
   {"writeFile", ROREG_FUNC(io_writeFile)},
+  {"mkdir",     ROREG_FUNC(io_mkdir)},
+  {"rmdir",     ROREG_FUNC(io_rmdir)},
+  {"lsdir",     ROREG_FUNC(io_lsdir)},
+  {"mkfs",      ROREG_FUNC(io_mkfs)},
+
+  {"FILE",      ROREG_INT(0)},
+  {"DIR",       ROREG_INT(1)},
   {NULL, {}}
 };
 
@@ -995,3 +1010,80 @@ LUAMOD_API int luaopen_io (lua_State *L) {
   return 1;
 }
 
+// dir methods
+
+static int io_mkfs (lua_State *L) {
+  // const char* path = luaL_checkstring(L, 1);
+  // int ret = luat_fs_mkfs(path);
+  // lua_pushboolean(L, ret == 0 ? 1 : 0);
+  // lua_pushinteger(L, ret);
+  // return 2;
+  return 0;
+}
+
+static int io_mkdir (lua_State *L) {
+  const char* path = luaL_checkstring(L, 1);
+  int ret = luat_fs_mkdir(path);
+  lua_pushboolean(L, ret == 0 ? 1 : 0);
+  lua_pushinteger(L, ret);
+  return 2;
+}
+
+static int io_rmdir (lua_State *L) {
+  const char* path = luaL_checkstring(L, 1);
+  int ret = luat_fs_rmdir(path);
+  lua_pushboolean(L, ret == 0 ? 1 : 0);
+  lua_pushinteger(L, ret);
+  return 2;
+}
+
+static int io_lsdir (lua_State *L) {
+  const char* path = luaL_checkstring(L, 1);
+  int len = luaL_optinteger(L, 2, 10);
+  int offset = luaL_optinteger(L, 3, 0);
+
+  if (len < 0) {
+    len = 10;
+  } else if (len > 50) {
+    len = 50;
+  }
+  if (offset < 0)
+    offset = 0;
+
+  luat_fs_dirent_t* ents = luat_heap_malloc(sizeof(luat_fs_dirent_t) * len);
+  if (ents == NULL) {
+    LLOGE("out of memory when malloc luat_fs_dirent_t");
+    return 0;
+  }
+  int ret = luat_fs_lsdir(path, ents, offset, len);
+  if (ret == 0) {
+    luat_heap_free(ents);
+    lua_pushboolean(L, 1);
+    lua_newtable(L);
+    return 2;
+  }
+  else if (ret > 0) {
+    lua_pushboolean(L, 1);
+    lua_createtable(L, ret, 0);
+    
+    for (size_t i = 0; i < ret; i++)
+    {
+      lua_createtable(L, 0, 2);
+      lua_pushinteger(L, ents[i].d_type);
+      lua_setfield(L, -2, "type");
+      lua_pushstring(L, ents[i].d_name);
+      lua_setfield(L, -2, "name");
+      lua_seti(L, -2, i + 1);
+    }
+    luat_heap_free(ents);
+    return 2;
+  }
+  else {
+    luat_heap_free(ents);
+    lua_pushboolean(L, 0);
+    lua_pushinteger(L, ret);
+    return 2;
+  }
+
+  return 0;
+}

+ 6 - 0
luat/vfs/luat_fs_fatfs.c

@@ -169,6 +169,11 @@ int luat_vfs_fatfs_rmdir(void* userdata, char const* _DirName) {
     return -1;
 }
 
+int luat_vfs_fatfs_lsdir(void* userdata, char const* _DirName) {
+    LLOGE("not support yet : lsdir");
+    return 0;
+}
+
 int luat_vfs_fatfs_info(void* userdata, const char* path, luat_fs_info_t *conf) {
     // DWORD fre_clust = 0;
     // DWORD fre_sect = 0
@@ -195,6 +200,7 @@ const struct luat_vfs_filesystem vfs_fs_fatfs = {
         T(umount),
         T(mkdir),
         T(rmdir),
+        T(lsdir),
         T(remove),
         T(rename),
         T(fsize),

+ 1 - 0
luat/vfs/luat_fs_luadb.c

@@ -470,6 +470,7 @@ const struct luat_vfs_filesystem vfs_fs_luadb = {
         T(umount),
         T(mkdir),
         T(rmdir),
+        T(lsdir),
         T(remove),
         T(rename),
         T(fsize),

+ 4 - 3
luat/vfs/luat_fs_posix.c

@@ -223,11 +223,12 @@ int luat_vfs_posix_info(void* userdata, const char* path, luat_fs_info_t *conf)
 const struct luat_vfs_filesystem vfs_fs_posix = {
     .name = "posix",
     .opts = {
-        T(mkfs),
+        .mkfs = NULL,
         T(mount),
         T(umount),
-        T(mkdir),
-        T(rmdir),
+        .mkdir = NULL,
+        .rmdir = NULL,
+        .lsdir = NULL,
         T(remove),
         T(rename),
         T(fsize),

+ 10 - 1
luat/vfs/luat_vfs.c

@@ -287,8 +287,17 @@ int luat_fs_rmdir(char const* _DirName) {
 }
 
 int luat_fs_lsdir(char const* _DirName, luat_fs_dirent_t* ents, size_t offset, size_t len) {
+    if (len == 0)
+        return 0;
     luat_vfs_mount_t *mount = getmount(_DirName);
-    if (mount == NULL || mount->fs->opts.lsdir == NULL) return 0;
+    if (mount == NULL) {
+        LLOGD("no such mount");
+        return 0;
+    }
+    if (mount->fs->opts.lsdir == NULL) {
+        LLOGD("such mount not support lsdir");
+        return 0;
+    }
     return mount->fs->opts.lsdir(mount->userdata,  _DirName + strlen(mount->prefix), ents, offset, len);
 }
 

+ 5 - 0
luat/weak/luat_fs_weak.c

@@ -87,3 +87,8 @@ LUAT_WEAK int luat_fs_rmdir(char const* _DirName) {
     LLOGE("not support yet : rmdir");
     return -1;
 }
+
+LUAT_WEAK int luat_fs_lsdir(char const* _DirName, luat_fs_dirent_t* ents, size_t offset, size_t len) {
+    LLOGE("not support yet : lsdir");
+    return 0;
+}