micropython-micro-gui/gui/demos/vtest.py

114 wiersze
3.8 KiB
Python

# vtest.py Test/demo of Dial for micro-gui
# Released under the MIT License (MIT). See LICENSE.
# Copyright (c) 2021 Peter Hinch
# Create SSD instance. Must be done first because of RAM use.
from hardware_setup import ssd
import urandom
import time
from cmath import rect, pi
import uasyncio as asyncio
from gui.core.ugui import Screen
from gui.core.writer import CWriter
from gui.fonts import font10
from gui.core.colors import *
# Widgets
from gui.widgets.label import Label
from gui.widgets.buttons import Button, CloseButton
from gui.widgets.dial import Pointer, Dial
def fwdbutton(wri, row, col, cls_screen, text='Next'):
def fwd(button):
Screen.change(cls_screen)
Button(wri, row, col, height = 30, callback = fwd, fgcolor = BLACK, bgcolor = GREEN,
text = text, shape = RECTANGLE, width = 100)
class BackScreen(Screen):
def __init__(self):
super().__init__()
wri = CWriter(ssd, font10, GREEN, BLACK, verbose=False)
Label(wri, 2, 2, 'Ensure back refreshes properly')
CloseButton(wri)
# Create a random vector. Interpolate between current vector and the new one.
# Change pointer color dependent on magnitude.
async def ptr_test(dial):
ptr = Pointer(dial)
v = 0j
steps = 20 # No. of interpolation steps
grv = lambda : urandom.getrandbits(16) / 2**15 - 1 # Random: range -1.0 to +1.0
while True:
v1 = grv() + 1j * grv() # Random vector
dv = (v1 - v) / steps # Interpolation vector
for _ in range(steps):
v += dv
mag = abs(v)
if mag < 0.3:
ptr.value(v, BLUE)
elif mag < 0.7:
ptr.value(v, GREEN)
else:
ptr.value(v, RED)
await asyncio.sleep_ms(200)
# Analog clock demo. Note this could also be achieved using the Dial class.
async def aclock(dial, lbldate, lbltim):
uv = lambda phi : rect(1, phi) # Return a unit vector of phase phi
days = ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday',
'Sunday')
months = ('January', 'February', 'March', 'April', 'May', 'June', 'July',
'August', 'September', 'October', 'November', 'December')
hrs = Pointer(dial)
mins = Pointer(dial)
secs = Pointer(dial)
hstart = 0 + 0.7j # Pointer lengths. Position at top.
mstart = 0 + 1j
sstart = 0 + 1j
while True:
t = time.localtime()
hrs.value(hstart * uv(-t[3] * pi/6 - t[4] * pi / 360), CYAN)
mins.value(mstart * uv(-t[4] * pi/30), CYAN)
secs.value(sstart * uv(-t[5] * pi/30), RED)
lbltim.value('{:02d}.{:02d}.{:02d}'.format(t[3], t[4], t[5]))
lbldate.value('{} {} {} {}'.format(days[t[6]], t[2], months[t[1] - 1], t[0]))
await asyncio.sleep(1)
class VScreen(Screen):
def __init__(self):
super().__init__()
labels = {'bdcolor' : RED,
'fgcolor' : WHITE,
'bgcolor' : DARKGREEN,
}
wri = CWriter(ssd, font10, GREEN, BLACK, verbose=False)
fwdbutton(wri, 200, 2, BackScreen, 'Forward')
CloseButton(wri)
# Set up random vector display with two pointers
dial = Dial(wri, 2, 2, height = 100, ticks = 12, fgcolor = YELLOW, style=Dial.COMPASS)
self.reg_task(ptr_test(dial))
self.reg_task(ptr_test(dial))
# Set up clock display: instantiate labels
lbldate = Label(wri, 110, 2, 200, **labels)
lbltim = Label(wri, 150, 2, 80, **labels)
dial = Dial(wri, 2, 120, height = 100, ticks = 12, fgcolor = GREEN, pip = GREEN)
self.reg_task(aclock(dial, lbldate, lbltim))
def test():
if ssd.height < 240 or ssd.width < 320:
print(' This test requires a display of at least 320x240 pixels.')
else:
print('Testing micro-gui...')
Screen.change(VScreen)
test()