@@ -74,6 +74,41 @@ def _fs_write_cb(drv, fs_file, buf, btw, bw):
7474
7575return lv .FS_RES .OK
7676
77+ def _fs_dir_open_cb (drv ,path ):
78+ #print(f"_fs_dir_open_cb for path '{path}'")
79+ try :
80+ import os # for ilistdir()
81+ return {'iterator' :os .ilistdir (path )}
82+ except Exception as e :
83+ print (f"_fs_dir_open_cb exception:{ e } " )
84+ return None
85+
86+ def _fs_dir_read_cb (drv ,lv_fs_dir_t ,buf ,btr ):
87+ try :
88+ iterator = lv_fs_dir_t .__cast__ ()['iterator' ]
89+ nextfile = iterator .__next__ ()
90+ #print(f"nextfile: {nextfile}")
91+ filename = nextfile [0 ]
92+ entry_type = nextfile [1 ]# Type field
93+ if entry_type == 0x4000 :
94+ #print(f"{filename} is a directory")
95+ filename = f"/{ filename } "
96+ # Convert filename to bytes with null terminator
97+ tmp_data_bytes = filename .encode ()+ b'\x00 '
98+ buf .__dereference__ (btr )[0 :len (tmp_data_bytes )]= tmp_data_bytes
99+ return lv .FS_RES .OK
100+ except StopIteration :
101+ # Clear buffer and return FS_ERR when iteration ends
102+ buf .__dereference__ (btr )[0 :1 ]= b'\x00 ' # Empty string (null byte)
103+ return lv .FS_RES .NOT_EX # Next entry "does not exist"
104+ except Exception as e :
105+ print (f"_fs_dir_read_cb exception:{ e } " )
106+ return lv .FS_RES .UNKNOWN
107+
108+ def _fs_dir_close_cb (drv ,lv_fs_dir_t ):
109+ #print(f"_fs_dir_close_cb called")
110+ # No need to cleanup the iterator so nothing to do
111+ return lv .FS_RES .OK
77112
78113def fs_register (fs_drv ,letter ,cache_size = 500 ):
79114
@@ -85,6 +120,9 @@ def fs_register(fs_drv, letter, cache_size=500):
85120fs_drv .seek_cb = _fs_seek_cb
86121fs_drv .tell_cb = _fs_tell_cb
87122fs_drv .close_cb = _fs_close_cb
123+ fs_drv .dir_open_cb = _fs_dir_open_cb
124+ fs_drv .dir_read_cb = _fs_dir_read_cb
125+ #fs_drv.dir_close_cb = _fs_dir_close_cb
88126
89127if cache_size >= 0 :
90128fs_drv .cache_size = cache_size