From dc5bae2108a44da6690009158aacbaf673018d08 Mon Sep 17 00:00:00 2001 From: Thomas Farstrike Date: Sun, 27 Apr 2025 20:24:18 +0200 Subject: [PATCH] New app: files --- .../com.example.files/META-INF/MANIFEST.MF | 3 + .../apps/com.example.files/assets/files.py | 149 ++++++++++++++++++ .../res/mipmap-mdpi/icon_64x64.bin | Bin 0 -> 8204 bytes internal_filesystem/autostart.py | 1 + 4 files changed, 153 insertions(+) create mode 100644 internal_filesystem/apps/com.example.files/META-INF/MANIFEST.MF create mode 100644 internal_filesystem/apps/com.example.files/assets/files.py create mode 100644 internal_filesystem/apps/com.example.imutest/res/mipmap-mdpi/icon_64x64.bin create mode 120000 internal_filesystem/autostart.py diff --git a/internal_filesystem/apps/com.example.files/META-INF/MANIFEST.MF b/internal_filesystem/apps/com.example.files/META-INF/MANIFEST.MF new file mode 100644 index 00000000..7877dd11 --- /dev/null +++ b/internal_filesystem/apps/com.example.files/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Name: Files +Start-Script: assets/files.py diff --git a/internal_filesystem/apps/com.example.files/assets/files.py b/internal_filesystem/apps/com.example.files/assets/files.py new file mode 100644 index 00000000..71e01ce9 --- /dev/null +++ b/internal_filesystem/apps/com.example.files/assets/files.py @@ -0,0 +1,149 @@ +import lvgl as lv +import uos +import machine +import time + +subwindow.clean() +canary = lv.obj(subwindow) +canary.add_flag(lv.obj.FLAG.HIDDEN) + +# LVGL File System Driver for LittleFS +class LittleFSDriver: + def __init__(self, letter='L'): + self.letter = letter + self.files = {} # Track open files + def init(self): + drv = lv.fs_drv_t() + lv.fs_drv_init(drv) + drv.letter = ord(self.letter) + drv.open_cb = self.open_cb + drv.close_cb = self.close_cb + drv.read_cb = self.read_cb + drv.write_cb = self.write_cb + drv.seek_cb = self.seek_cb + drv.tell_cb = self.tell_cb + drv.dir_open_cb = self.dir_open_cb + drv.dir_read_cb = self.dir_read_cb + drv.dir_close_cb = self.dir_close_cb + lv.fs_drv_register(drv) + def open_cb(self, drv, path, mode): + path = path.decode().lstrip(self.letter + ':') + try: + if mode & lv.FS_MODE_WR: + file = open(path, 'wb' if mode == lv.FS_MODE_WR else 'r+b') + else: + file = open(path, 'rb') + self.files[id(file)] = file + return id(file) + except Exception as e: + print(f"Open error: {e}") + return None + def close_cb(self, drv, file_p): + file_id = file_p + if file_id in self.files: + self.files[file_id].close() + del self.files[file_id] + return lv.FS_RES_OK + return lv.FS_RES_NOT_EX + def read_cb(self, drv, file_p, buf, btr, br): + file_id = file_p + if file_id in self.files: + try: + data = self.files[file_id].read(btr) + br[0] = len(data) + for i, b in enumerate(data): + buf[i] = b + return lv.FS_RES_OK + except: + return lv.FS_RES_FS_ERR + return lv.FS_RES_NOT_EX + def write_cb(self, drv, file_p, buf, btw, bw): + file_id = file_p + if file_id in self.files: + try: + data = bytes([buf[i] for i in range(btw)]) + self.files[file_id].write(data) + bw[0] = btw + return lv.FS_RES_OK + except: + return lv.FS_RES_FS_ERR + return lv.FS_RES_NOT_EX + def seek_cb(self, drv, file_p, pos, whence): + file_id = file_p + if file_id in self.files: + try: + if whence == lv.FS_SEEK_SET: + self.files[file_id].seek(pos, 0) + elif whence == lv.FS_SEEK_CUR: + self.files[file_id].seek(pos, 1) + elif whence == lv.FS_SEEK_END: + self.files[file_id].seek(pos, 2) + return lv.FS_RES_OK + except: + return lv.FS_RES_FS_ERR + return lv.FS_RES_NOT_EX + def tell_cb(self, drv, file_p, pos): + file_id = file_p + if file_id in self.files: + try: + pos[0] = self.files[file_id].tell() + return lv.FS_RES_OK + except: + return lv.FS_RES_FS_ERR + return lv.FS_RES_NOT_EX + def dir_open_cb(self, drv, path): + path = path.decode().lstrip(self.letter + ':') + try: + dir_list = uos.listdir(path or '/') + dir_obj = {'path': path or '/', 'list': dir_list, 'index': 0} + dir_id = id(dir_obj) + self.files[dir_id] = dir_obj + return dir_id + except: + return None + def dir_read_cb(self, drv, dir_p, fn): + dir_id = dir_p + if dir_id in self.files: + dir_obj = self.files[dir_id] + if dir_obj['index'] < len(dir_obj['list']): + name = dir_obj['list'][dir_obj['index']] + # Check if it's a directory + try: + uos.stat(dir_obj['path'] + '/' + name + '/') + name = '/' + name # Prefix directories with '/' + except: + pass + dir_obj['index'] += 1 + fn.assign(name) + return lv.FS_RES_OK + fn.assign('') + return lv.FS_RES_OK + return lv.FS_RES_NOT_EX + def dir_close_cb(self, drv, dir_p): + dir_id = dir_p + if dir_id in self.files: + del self.files[dir_id] + return lv.FS_RES_OK + return lv.FS_RES_NOT_EX + + +# Register the LittleFS driver +fs_drv = LittleFSDriver('L') +fs_drv.init() + +# Create File Explorer +def file_explorer_event_cb(e): + code = e.get_code() + obj = e.get_target() + if code == lv.EVENT_VALUE_CHANGED: + file_path = obj.get_selected_file_path() + print(f"Selected file: {file_path}") + + +explorer = lv.file_explorer(subwindow) +explorer.set_size(lv.pct(100), lv.pct(100)) +#explorer.set_root_path("L:/") +explorer.add_event_cb(file_explorer_event_cb, lv.EVENT.VALUE_CHANGED, None) + +while canary.is_valid(): + time.sleep_ms(100) diff --git a/internal_filesystem/apps/com.example.imutest/res/mipmap-mdpi/icon_64x64.bin b/internal_filesystem/apps/com.example.imutest/res/mipmap-mdpi/icon_64x64.bin new file mode 100644 index 0000000000000000000000000000000000000000..ddf9eb8d5157acfa9c1384c3fcada235ba9cbe32 GIT binary patch literal 8204 zcmb0XVqkD!aA0U)U|{&1J_<)eU^E0qLtr!naD_m=pO(pUr4H?LuA2v-v|Me&00*g3 z{(iVzNgHuKKe**k#tQ9^VYIOeo2k!~pw^;Lr)`Sjv8krE*yeN;Ymqq3oaygy zibt{%gLzD90*zw=zx^Nwaq1Y-FeV7w&%m&dLC1D7jod(t{h&}_5#slwMQXrjzY^y` zkkxSPu6%*&sR6hBoI0D+C&lyFD!}arF|tg8s2UTv?LX%V$?F@!o(O_$hG8YnTq>5* zgzf*FZWP}p1+yJOQ?HaJ#(t0sP{RP^3hI>7#M%Ejy&w!^Cn{E8puChO*8b1wS|+Hr zLwJih&rwuL6L0@VEFl1K!!srFOKCjz`-0N{<@9&Hlb|{7r8dMqY$TTnd8ITV`;Fom z7}}(az%KB|Xel7Ok$)_A@Z3 zD{oFGY`?oQ@ji#BB-VZghGkOdr4Y!+=$O>@EAjTD+k~A@YCTO|`=2R6LX~)uy7udn z+;*p?{W{PZlX%~MPDiyrnN!DhLzrQ_V7$MdU^vJeNdChf*T|yewoQ=je{l}z0@r{nxxq|G$hN;sx zLD=uWfUU>pu8hrY>h;YK_A@Z7wn6v(1gxP?d8-Fu53>CX48ABiI4Is#2;KM8Y4zc< zpMinX>vX|4(`LZiJFt`fw*kY>#kkyW|M?+vV N1V%$(Gz5qZ0RW(c;P3zd literal 0 HcmV?d00001 diff --git a/internal_filesystem/autostart.py b/internal_filesystem/autostart.py new file mode 120000 index 00000000..89102683 --- /dev/null +++ b/internal_filesystem/autostart.py @@ -0,0 +1 @@ +../autostart.py \ No newline at end of file