Skip to content

Commit 992b70b

Browse files
committed
Add Lilygo T-Deck support to fileview utility
1 parent cb55264 commit 992b70b

File tree

4 files changed

+110
-58
lines changed

4 files changed

+110
-58
lines changed

PyDOS.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def PyDOS():
6767
global envVars
6868
if "envVars" not in globals().keys():
6969
envVars = {}
70-
_VER = "1.28"
70+
_VER = "1.29"
7171
prmpVals = ['>','(',')','&','|','\x1b','\b','<','=',' ',_VER,'\n','$','']
7272

7373
print("Starting Py-DOS...")

cpython/lib/optional/pydos_ui_lilygokbd.py

Lines changed: 78 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@
1111
class PyDOS_UI:
1212

1313
def __init__(self):
14+
self.scrollable = False
15+
self.arrow = ""
16+
self._cmdhistlock = False
17+
self._seqCnt = 0
1418
self._key = bytearray(1)
1519
self._touched = False
1620
_ADDRESS_KBD = 0x55
@@ -27,26 +31,48 @@ def __init__(self):
2731
self.click = keypad.Keys([board.TRACKBALL_CLICK], value_when_pressed=False)
2832

2933
def get_screensize(self):
30-
#return (round(self._display.height*.04),round(self._display.width*.0817))
31-
#return (
32-
# round(self._display.height/(terminalio.FONT.bitmap.height*displayio.CIRCUITPYTHON_TERMINAL.scale))-1,
33-
# round(self._display.width/((terminalio.FONT.bitmap.width/95)*displayio.CIRCUITPYTHON_TERMINAL.scale))-1
34-
#)
35-
return (19,53)
34+
return (19,51)
3635

3736
def serial_bytes_available(self):
3837
if not self._touched:
3938
retval = 0
40-
with self._i2c as i2c:
41-
try:
42-
i2c.readinto(self._key)
43-
except:
44-
self._key=bytearray(1)
45-
if self._key[0] != 0:
46-
retval = 1
47-
self._touched = True
48-
else:
49-
retval = self.uart_bytes_available()
39+
40+
# Find the last direction the trackball was moved
41+
# and wait for trackball to stop moving
42+
largestDir = 0
43+
self.arrow = ''
44+
trackloop = True
45+
while trackloop:
46+
trackloop = False
47+
for p,c in Pydos_ui.trackball.items():
48+
if c.count > largestDir:
49+
trackloop = True
50+
if p not in "AB" or not self._cmdhistlock:
51+
self.arrow = p
52+
largestDir = c.count
53+
c.reset()
54+
else:
55+
c.reset()
56+
if self.arrow != "" and not trackloop:
57+
time.sleep(.05)
58+
# clear all counters
59+
for p,c in Pydos_ui.trackball.items():
60+
if c.count > 0:
61+
c.reset()
62+
retval = 1
63+
self._touched = True
64+
65+
if not self._touched:
66+
with self._i2c as i2c:
67+
try:
68+
i2c.readinto(self._key)
69+
except:
70+
self._key=bytearray(1)
71+
if self._key[0] != 0:
72+
retval = 1
73+
self._touched = True
74+
else:
75+
retval = self.uart_bytes_available()
5076
else:
5177
retval = 1
5278

@@ -63,13 +89,29 @@ def read_keyboard(self,num):
6389
while num > 0:
6490
self.serial_bytes_available()
6591
if self._touched:
66-
retval = chr(self._key[0])
67-
self._touched = False
68-
num -= 1
92+
if self.arrow != "":
93+
if self._seqCnt == 0:
94+
retval += chr(27)
95+
self._seqCnt = 1
96+
num -= 1
97+
elif self._seqCnt == 1:
98+
retval += chr(91)
99+
self._seqCnt = 2
100+
num -= 1
101+
elif self._seqCnt == 2:
102+
retval += self.arrow
103+
self._seqCnt = 0
104+
self._touched = False
105+
self.arrow = ""
106+
num -= 1
107+
else:
108+
retval += chr(self._key[0])
109+
self._touched = False
110+
num -= 1
69111
else:
70112
if self.uart_bytes_available():
71-
retval = stdin.read(1)
72-
num -= 1
113+
retval = stdin.read(num)
114+
num -= len(retval)
73115

74116
return retval
75117

@@ -86,6 +128,7 @@ def input(disp_text=None):
86128
bld_started = False
87129

88130
histPntr = len(Pydos_ui.commandHistory)
131+
Pydos_ui._cmdhistlock = False
89132

90133
keys = ''
91134
editCol = 0
@@ -101,31 +144,8 @@ def input(disp_text=None):
101144
#print(editCol,keys)
102145
if ctrlkeys == '':
103146
arrow = ""
104-
trackloop = True
105147
else:
106148
ctrlkeys = ''
107-
trackloop = False
108-
109-
# Find the last direction the trackball was moved
110-
# and wait for trackball to stop moving
111-
largestDir = 0
112-
while trackloop:
113-
trackloop = False
114-
for p,c in Pydos_ui.trackball.items():
115-
if c.count > largestDir:
116-
trackloop = True
117-
if p not in "AB" or onLast:
118-
arrow = p
119-
largestDir = c.count
120-
c.reset()
121-
else:
122-
c.reset()
123-
if arrow != "" and not trackloop:
124-
time.sleep(.05)
125-
# clear all counters
126-
for p,c in Pydos_ui.trackball.items():
127-
if c.count > 0:
128-
c.reset()
129149

130150
if arrow == 'A' or arrow == 'B':
131151
if len(Pydos_ui.commandHistory) > 0:
@@ -145,6 +165,7 @@ def input(disp_text=None):
145165
else:
146166
onFirst = False
147167
elif arrow == 'D':
168+
Pydos_ui._cmdhistlock = True
148169
if len(keys) > editCol:
149170
print(keys[editCol:editCol+1]+"\x08",end="")
150171
elif editCol == len(keys):
@@ -171,19 +192,23 @@ def input(disp_text=None):
171192
if not onLast:
172193
print(keys[editCol-1:],end="")
173194
onLast = True
195+
Pydos_ui._cmdhistlock = False
174196

175197
if Pydos_ui.serial_bytes_available():
176198
if Pydos_ui.uart_bytes_available():
177199
keys = keys[:editCol]+stdin.read(1)+keys[editCol:]
178-
editCol += 1
179-
if keys[editCol-1] == '\x1b':
180-
keys = keys[:editCol-1]+keys[editCol:]
181-
ctrlkeys = stdin.read(2)
182-
# ctrlkeys = up:[A down:[B right:[C left:[D
183-
arrow = ctrlkeys[1]
184200
else:
185201
keys = keys[:editCol]+Pydos_ui.read_keyboard(1)+keys[editCol:]
186-
editCol += 1
202+
203+
editCol += 1
204+
if keys[editCol-1] == '\x1b':
205+
keys = keys[:editCol-1]+keys[editCol:]
206+
if Pydos_ui.uart_bytes_available():
207+
ctrlkeys = stdin.read(2)
208+
else:
209+
ctrlkeys = Pydos_ui.read_keyboard(2)
210+
# ctrlkeys = up:[A down:[B right:[C left:[D
211+
arrow = ctrlkeys[1]
187212

188213
# Convert two character sequences into missing keyboard keys
189214
# '_-' -> '=' '(+' -> '[' '+)' -> ']'
@@ -197,6 +222,8 @@ def input(disp_text=None):
197222
print('\x08'+keys[editCol-2:]+' '+('\x08'*(len(keys[editCol:])+(1 if onLast else 2))),end="")
198223
editCol -= 1
199224
bld_done = True
225+
elif bld_chr1.find(keys[editCol-1:editCol]) != -1 and arrow == "":
226+
bld_started = True
200227
else:
201228
bld_started = False
202229

fileview.py

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,17 @@ def absolutePath(argPath,currDir):
6060

6161
scrLines = int(envVars["_scrHeight"])
6262
scrWidth = int(envVars["_scrWidth"])
63+
elif 'get_screensize' in dir(Pydos_ui):
64+
(scrLines,scrWidth) = Pydos_ui.get_screensize()
6365
else:
6466
scrLines = 24
6567
scrWidth = 80
6668

69+
try:
70+
scrollable = Pydos_ui.scrollable
71+
except:
72+
scrollable = False
73+
6774
savDir = os.getcwd()
6875
args = absolutePath(args,savDir)
6976

@@ -109,15 +116,24 @@ def absolutePath(argPath,currDir):
109116
seqCnt = 0
110117
if currLineNum > scrLines:
111118
currLineNum -= 1
112-
print (chr(27)+"[1;1H"+chr(27)+"M",end="")
119+
print (chr(27)+"[1;1H",end="")
113120
#print (chr(27)+"[2;0H"+chr(27)+"[T",end="")
114121
f.seek(index[currLineNum-scrLines])
115122
line = f.readline()
116-
print((line[:-1])[strtCol:scrWidth+strtCol],end="")
117123
scrnMem.pop()
118124
scrnMem.insert(0,line[:-1])
119125
linelengths.pop()
120126
linelengths.insert(0,len(line[:-1]))
127+
if not scrollable:
128+
#cret = chr(27)+"[H"
129+
cret = " "*scrWidth+chr(8)*scrWidth
130+
print(cret+((line[:-1])[strtCol:scrWidth+strtCol]),end="")
131+
cret = "\n"+(" "*scrWidth)+chr(8)*scrWidth
132+
for line in scrnMem[1:]:
133+
print(cret+line[strtCol:scrWidth+strtCol],end="")
134+
#cret = "\n"
135+
else:
136+
print((chr(27)+"M")+(line[:-1])[strtCol:scrWidth+strtCol],end="")
121137

122138
elif ord(cmnd) == 66 and seqCnt == 2:
123139
# Down Arrow
@@ -129,7 +145,16 @@ def absolutePath(argPath,currDir):
129145
if currLineNum == maxRead:
130146
index.append(index[currLineNum]+len(line))
131147
maxRead += 1
132-
print(chr(27)+"["+str(scrLines)+";1H"+chr(27)+"D",end="")
148+
149+
if not scrollable:
150+
cret = chr(27)+"[1;1H"+(" "*scrWidth)+chr(8)*scrWidth
151+
for _ in scrnMem[1:]:
152+
print(cret+_[strtCol:scrWidth+strtCol],end="")
153+
cret = "\n"+(" "*scrWidth)+chr(8)*scrWidth
154+
155+
print(chr(27)+"["+str(scrLines)+";1H"+chr(8)+(" "*scrWidth)+chr(8)*scrWidth,end="")
156+
else:
157+
print(chr(27)+"["+str(scrLines)+";1H"+chr(27)+"D",end="")
133158
#print(chr(27)+"["+str(scrLines+1)+";0H"+chr(27)+"[S",end="")
134159
print((line[:-1])[strtCol:scrWidth+strtCol],end="")
135160
scrnMem.pop(0)
@@ -145,7 +170,7 @@ def absolutePath(argPath,currDir):
145170
seqCnt = 0
146171
if max(linelengths) > scrWidth+strtCol:
147172
strtCol += 1
148-
cret = chr(27)+"[H"
173+
cret = chr(27)+"[1;1H"
149174
for line in scrnMem:
150175
if scrWidth+strtCol > len(line.rstrip()):
151176
print(cret+line[strtCol:len(line.rstrip())]+" ",end="")
@@ -158,7 +183,7 @@ def absolutePath(argPath,currDir):
158183
seqCnt = 0
159184
if strtCol > 0:
160185
strtCol -= 1
161-
cret = chr(27)+"[H"
186+
cret = chr(27)+"[1;1H"
162187
for line in scrnMem:
163188
print(cret+line[strtCol:scrWidth+strtCol],end="")
164189
cret = "\n"

lib/pydos_ui.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
class PyDOS_UI:
1212

1313
def __init__(self):
14-
pass
14+
self.scrollable = True
1515

1616
def serial_bytes_available(self):
1717
if implementation.name.upper() == "CIRCUITPYTHON":

0 commit comments

Comments
 (0)