Skip to content

Commit dc5bae2

Browse files
New app: files
1 parent 02d9c3e commit dc5bae2

4 files changed

Lines changed: 153 additions & 0 deletions

File tree

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Manifest-Version: 1.0
2+
Name: Files
3+
Start-Script: assets/files.py
Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
import lvgl as lv
2+
import uos
3+
import machine
4+
import time
5+
6+
subwindow.clean()
7+
canary = lv.obj(subwindow)
8+
canary.add_flag(lv.obj.FLAG.HIDDEN)
9+
10+
# LVGL File System Driver for LittleFS
11+
class LittleFSDriver:
12+
def __init__(self, letter='L'):
13+
self.letter = letter
14+
self.files = {} # Track open files
15+
def init(self):
16+
drv = lv.fs_drv_t()
17+
lv.fs_drv_init(drv)
18+
drv.letter = ord(self.letter)
19+
drv.open_cb = self.open_cb
20+
drv.close_cb = self.close_cb
21+
drv.read_cb = self.read_cb
22+
drv.write_cb = self.write_cb
23+
drv.seek_cb = self.seek_cb
24+
drv.tell_cb = self.tell_cb
25+
drv.dir_open_cb = self.dir_open_cb
26+
drv.dir_read_cb = self.dir_read_cb
27+
drv.dir_close_cb = self.dir_close_cb
28+
lv.fs_drv_register(drv)
29+
def open_cb(self, drv, path, mode):
30+
path = path.decode().lstrip(self.letter + ':')
31+
try:
32+
if mode & lv.FS_MODE_WR:
33+
file = open(path, 'wb' if mode == lv.FS_MODE_WR else 'r+b')
34+
else:
35+
file = open(path, 'rb')
36+
self.files[id(file)] = file
37+
return id(file)
38+
except Exception as e:
39+
print(f"Open error: {e}")
40+
return None
41+
def close_cb(self, drv, file_p):
42+
file_id = file_p
43+
if file_id in self.files:
44+
self.files[file_id].close()
45+
del self.files[file_id]
46+
return lv.FS_RES_OK
47+
return lv.FS_RES_NOT_EX
48+
def read_cb(self, drv, file_p, buf, btr, br):
49+
file_id = file_p
50+
if file_id in self.files:
51+
try:
52+
data = self.files[file_id].read(btr)
53+
br[0] = len(data)
54+
for i, b in enumerate(data):
55+
buf[i] = b
56+
return lv.FS_RES_OK
57+
except:
58+
return lv.FS_RES_FS_ERR
59+
return lv.FS_RES_NOT_EX
60+
def write_cb(self, drv, file_p, buf, btw, bw):
61+
file_id = file_p
62+
if file_id in self.files:
63+
try:
64+
data = bytes([buf[i] for i in range(btw)])
65+
self.files[file_id].write(data)
66+
bw[0] = btw
67+
return lv.FS_RES_OK
68+
except:
69+
return lv.FS_RES_FS_ERR
70+
return lv.FS_RES_NOT_EX
71+
def seek_cb(self, drv, file_p, pos, whence):
72+
file_id = file_p
73+
if file_id in self.files:
74+
try:
75+
if whence == lv.FS_SEEK_SET:
76+
self.files[file_id].seek(pos, 0)
77+
elif whence == lv.FS_SEEK_CUR:
78+
self.files[file_id].seek(pos, 1)
79+
elif whence == lv.FS_SEEK_END:
80+
self.files[file_id].seek(pos, 2)
81+
return lv.FS_RES_OK
82+
except:
83+
return lv.FS_RES_FS_ERR
84+
return lv.FS_RES_NOT_EX
85+
def tell_cb(self, drv, file_p, pos):
86+
file_id = file_p
87+
if file_id in self.files:
88+
try:
89+
pos[0] = self.files[file_id].tell()
90+
return lv.FS_RES_OK
91+
except:
92+
return lv.FS_RES_FS_ERR
93+
return lv.FS_RES_NOT_EX
94+
def dir_open_cb(self, drv, path):
95+
path = path.decode().lstrip(self.letter + ':')
96+
try:
97+
dir_list = uos.listdir(path or '/')
98+
dir_obj = {'path': path or '/', 'list': dir_list, 'index': 0}
99+
dir_id = id(dir_obj)
100+
self.files[dir_id] = dir_obj
101+
return dir_id
102+
except:
103+
return None
104+
def dir_read_cb(self, drv, dir_p, fn):
105+
dir_id = dir_p
106+
if dir_id in self.files:
107+
dir_obj = self.files[dir_id]
108+
if dir_obj['index'] < len(dir_obj['list']):
109+
name = dir_obj['list'][dir_obj['index']]
110+
# Check if it's a directory
111+
try:
112+
uos.stat(dir_obj['path'] + '/' + name + '/')
113+
name = '/' + name # Prefix directories with '/'
114+
except:
115+
pass
116+
dir_obj['index'] += 1
117+
fn.assign(name)
118+
return lv.FS_RES_OK
119+
fn.assign('')
120+
return lv.FS_RES_OK
121+
return lv.FS_RES_NOT_EX
122+
def dir_close_cb(self, drv, dir_p):
123+
dir_id = dir_p
124+
if dir_id in self.files:
125+
del self.files[dir_id]
126+
return lv.FS_RES_OK
127+
return lv.FS_RES_NOT_EX
128+
129+
130+
# Register the LittleFS driver
131+
fs_drv = LittleFSDriver('L')
132+
fs_drv.init()
133+
134+
# Create File Explorer
135+
def file_explorer_event_cb(e):
136+
code = e.get_code()
137+
obj = e.get_target()
138+
if code == lv.EVENT_VALUE_CHANGED:
139+
file_path = obj.get_selected_file_path()
140+
print(f"Selected file: {file_path}")
141+
142+
143+
explorer = lv.file_explorer(subwindow)
144+
explorer.set_size(lv.pct(100), lv.pct(100))
145+
#explorer.set_root_path("L:/")
146+
explorer.add_event_cb(file_explorer_event_cb, lv.EVENT.VALUE_CHANGED, None)
147+
148+
while canary.is_valid():
149+
time.sleep_ms(100)
Binary file not shown.

internal_filesystem/autostart.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../autostart.py

0 commit comments

Comments
 (0)