Last active
June 5, 2019 22:37
-
-
Save amirgon/7f2a0702932a8d08611241d10c1f0e57 to your computer and use it in GitHub Desktop.
advanced_demo.py for online simulator (lvgl v5.3)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import lvgl as lv | |
# lvgl must be initialized before any lvgl function is called or object/struct is constructed! | |
lv.init() | |
# Create a style based on style_plain but with a symbol font | |
symbolstyle = lv.style_t(lv.style_plain) | |
symbolstyle.text.font = lv.font_symbol_40 | |
# The following two lines do the same thing. | |
# They show how to initialize struct either directly or through a dict | |
symbolstyle.text.color = lv.color_hex(0xffffff) | |
symbolstyle.text.color = {"ch": {"red":0xff, "green":0xff, "blue":0xff, "alpha":0xff}} | |
def get_member_name(obj, value): | |
for member in dir(obj): | |
if getattr(obj, member) == value: | |
return member | |
class SymbolButton(lv.btn): | |
def __init__(self, parent, symbol, text): | |
super().__init__(parent) | |
self.symbol = lv.label(self) | |
self.symbol.set_text(symbol) | |
self.symbol.set_style(symbolstyle) | |
self.label = lv.label(self) | |
self.label.set_text(text) | |
class Page_Buttons: | |
def __init__(self, app, page): | |
self.app = app | |
self.page = page | |
self.btn1 = SymbolButton(page, lv.SYMBOL.PLAY, "Play") | |
self.btn1.set_size(140,100) | |
self.btn1.align(page, lv.ALIGN.IN_TOP_LEFT, 30, 30) | |
self.btn2 = SymbolButton(page, lv.SYMBOL.PAUSE, "Pause") | |
self.btn2.set_size(140,100) | |
self.btn2.align(page, lv.ALIGN.IN_TOP_RIGHT, -30, 30) | |
self.label = lv.label(page) | |
self.label.align(page, lv.ALIGN.IN_BOTTOM_LEFT, 30, -30) | |
# Currently only single callback per object is supported | |
for btn, name in [(self.btn1, 'Play'), (self.btn2, 'Pause')]: | |
btn.set_event_cb(lambda obj=None, event=-1, name=name: self.label.set_text('%s %s' % (name, get_member_name(lv.EVENT, event)))) | |
class Page_Simple: | |
def __init__(self, app, page): | |
self.app = app | |
self.page = page | |
# slider | |
self.slider = lv.slider(page) | |
self.slider.align(page, lv.ALIGN.IN_TOP_LEFT, 20, 20) | |
self.slider_label = lv.label(page) | |
self.slider_label.align(self.slider, lv.ALIGN.OUT_RIGHT_MID, 15, 0) | |
self.slider.set_event_cb(self.on_slider_changed) | |
self.on_slider_changed(None) | |
# style selector | |
self.styles = [('Plain', lv.style_plain), ('Plain color', lv.style_plain_color), ('Pretty', lv.style_pretty), ('Pretty color', lv.style_pretty_color)] | |
self.style_selector = lv.ddlist(page) | |
self.style_selector.align(self.slider, lv.ALIGN.IN_BOTTOM_LEFT, 0, 40) | |
self.style_selector.set_options('\n'.join(x[0] for x in self.styles)) | |
self.style_selector.set_event_cb(self.on_style_selector_changed) | |
self.counter_btn = lv.btn(page) | |
self.counter_btn.set_size(140,100) | |
self.counter_btn.align(self.page, lv.ALIGN.IN_TOP_RIGHT, -20, 20) | |
self.counter_label = lv.label(self.counter_btn) | |
self.counter_label.set_text('Count') | |
self.counter_btn.set_event_cb(self.on_counter_btn) | |
self.counter = 0 | |
def on_slider_changed(self, obj=None, event=-1): | |
self.slider_label.set_text(str(self.slider.get_value())) | |
def on_style_selector_changed(self, obj=None, event=-1): | |
selected = self.style_selector.get_selected() | |
self.app.screen_main.tabview.set_style(lv.tabview.STYLE.BG, self.styles[selected][1]) | |
def on_counter_btn(self, obj, event): | |
if event == lv.EVENT.CLICKED: | |
self.counter += 1 | |
self.counter_label.set_text(str(self.counter)) | |
class Anim(lv.anim_t): | |
def __init__(self, obj, val, size, exec_cb, path_cb, time=500, playback = False, ready_cb=None): | |
super().__init__() | |
lv.anim_init(self) | |
lv.anim_set_time(self, time, 0) | |
lv.anim_set_values(self, val, val+size) | |
try: | |
lv.anim_set_exec_cb(self, obj, exec_cb) | |
except TypeError: | |
lv.anim_set_custom_exec_cb(self, exec_cb) | |
lv.anim_set_path_cb(self, path_cb ) | |
if playback: lv.anim_set_playback(self, 0) | |
if ready_cb: lv.anim_set_ready_cb(self, ready_cb) | |
lv.anim_create(self) | |
def animate_chart(chart, val, size): | |
def anim_phase1(): | |
Anim( | |
chart, | |
val, | |
size, | |
lambda a, val: chart.set_range(0, val), | |
lv.anim_path_ease_in, | |
ready_cb=lambda a:anim_phase2(), | |
time=2000) | |
def anim_phase2(): | |
Anim( | |
chart, | |
val+size, | |
-size, | |
lambda a, val: chart.set_range(0, val), | |
lv.anim_path_ease_out, | |
ready_cb=lambda a:anim_phase1(), | |
time=500) | |
anim_phase1() | |
class Page_Chart(): | |
def __init__(self, app, page): | |
self.app = app | |
self.page = page | |
self.chart = lv.chart(page) | |
self.chart.set_width(page.get_width() - 50) | |
self.chart.align(page, lv.ALIGN.CENTER, 0, 0) | |
self.series1 = self.chart.add_series(lv.color_hex(0xFF0000)) | |
self.chart.set_type(self.chart.TYPE.POINT | self.chart.TYPE.LINE) | |
self.chart.set_series_width(3) | |
self.chart.set_range(0,100) | |
self.chart.init_points(self.series1, 10) | |
self.chart.set_points(self.series1, [10,20,30,20,10,40,50,90,95,90]) | |
animate_chart(self.chart, 100, 1000) | |
class Screen_Main(lv.obj): | |
def __init__(self, app, *args, **kwds): | |
self.app = app | |
super().__init__(*args, **kwds) | |
self.tabview = lv.tabview(self) | |
self.page_simple = Page_Simple(self.app, self.tabview.add_tab('Simple')) | |
self.page_buttons = Page_Buttons(self.app, self.tabview.add_tab('Buttons')) | |
self.page_chart = Page_Chart(self.app, self.tabview.add_tab('Chart')) | |
class AdvancedDemoApplication(): | |
def init_gui_SDL(self): | |
import SDL | |
SDL.init() | |
# Register SDL display driver. | |
disp_buf1 = lv.disp_buf_t() | |
buf1_1 = bytes(480*10) | |
lv.disp_buf_init(disp_buf1,buf1_1, None, len(buf1_1)//4) | |
disp_drv = lv.disp_drv_t() | |
lv.disp_drv_init(disp_drv) | |
disp_drv.buffer = disp_buf1 | |
disp_drv.flush_cb = SDL.monitor_flush | |
disp_drv.hor_res = 480 | |
disp_drv.ver_res = 320 | |
lv.disp_drv_register(disp_drv) | |
# Regsiter SDL mouse driver | |
indev_drv = lv.indev_drv_t() | |
lv.indev_drv_init(indev_drv) | |
indev_drv.type = lv.INDEV_TYPE.POINTER; | |
indev_drv.read_cb = SDL.mouse_read; | |
lv.indev_drv_register(indev_drv); | |
def init_gui_esp32(self): | |
import lvesp32 | |
import ILI9341 as ili | |
# Initialize ILI9341 display | |
disp = ili.display(miso=5, mosi=18, clk=19, cs=13, dc=12, rst=4, backlight=2) | |
disp.init() | |
# Register display driver | |
disp_drv = lv.disp_drv_t() | |
lv.disp_drv_init(disp_drv) | |
disp_drv.flush_cb = disp.flush | |
lv.disp_drv_register(disp_drv) | |
# Register raw resistive touch driver | |
import rtch | |
touch = rtch.touch(xp = 32, yp = 33, xm = 25, ym = 26, touch_rail = 27, touch_sense = 33) | |
touch.init() | |
indev_drv = lv.indev_drv_t() | |
lv.indev_drv_init(indev_drv) | |
indev_drv.type = lv.INDEV_TYPE.POINTER; | |
indev_drv.read_cb = touch.read; | |
lv.indev_drv_register(indev_drv); | |
def init_gui(self): | |
# Identify platform and initialize it | |
try: | |
self.init_gui_esp32() | |
except ImportError: | |
pass | |
try: | |
self.init_gui_SDL() | |
except ImportError: | |
pass | |
# Create the main screen and load it. | |
self.screen_main = Screen_Main(self) | |
lv.scr_load(self.screen_main) | |
app = AdvancedDemoApplication() | |
app.init_gui() | |
import utime | |
#if __name__ == '__main__': | |
# while True: | |
# pass | |
# |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment