examples(micropython): add a few missing MP examples (#3672)

This commit is contained in:
Uli Raich
2022-09-21 11:21:36 +02:00
committed by GitHub
parent d5e6ffdd87
commit 29ec34be77
16 changed files with 1151 additions and 27 deletions

View File

@@ -0,0 +1,142 @@
from micropython import const
# Define a message ID
MSG_LOGIN_ATTEMPT = const(1)
MSG_LOG_OUT = const(2)
MSG_LOGIN_ERROR = const(3)
MSG_LOGIN_OK = const(4)
# Define the object that will be sent as msg payload
class Message:
def __init__(self, value):
self.value = value
def message(self):
return self.value
def auth_manager(m,passwd):
payload = m.get_payload()
pin_act = payload.__cast__().message()
# print("pin act: ",pin_act,end="")
# print(", pin axpected: ",passwd)
pin_expected = passwd
if pin_act == pin_expected:
lv.msg_send(MSG_LOGIN_OK, None)
else:
lv.msg_send(MSG_LOGIN_ERROR, Message("Incorrect PIN"))
def textarea_event_cb(e):
ta = e.get_target()
code = e.get_code()
if code == lv.EVENT.READY:
passwd = Message(ta.get_text())
lv.msg_send(MSG_LOGIN_ATTEMPT, passwd)
elif code == lv.EVENT.MSG_RECEIVED:
m = e.get_msg()
id = m.get_id()
if id == MSG_LOGIN_ERROR:
# If there was an error, clean the text area
msg = m.get_payload().__cast__()
if len(msg.message()):
ta.set_text("")
elif id == MSG_LOGIN_OK:
ta.add_state(lv.STATE.DISABLED)
ta.clear_state(lv.STATE.FOCUSED | lv.STATE.FOCUS_KEY)
elif id == MSG_LOG_OUT:
ta.set_text("");
ta.clear_state(lv.STATE.DISABLED)
def log_out_event_cb(e):
code = e.get_code()
if code == lv.EVENT.CLICKED:
lv.msg_send(MSG_LOG_OUT, None)
elif code == lv.EVENT.MSG_RECEIVED:
m = e.get_msg()
btn = e.get_target()
id = m.get_id()
if id == MSG_LOGIN_OK:
btn.clear_state(lv.STATE.DISABLED)
elif id == MSG_LOG_OUT:
btn.add_state(lv.STATE.DISABLED)
def start_engine_msg_event_cb(e):
m = e.get_msg()
btn = e.get_target()
id = m.get_id()
if id == MSG_LOGIN_OK:
btn.clear_state(lv.STATE.DISABLED)
elif id == MSG_LOG_OUT:
btn.add_state(lv.STATE.DISABLED)
def info_label_msg_event_cb(e):
label = e.get_target()
m = e.get_msg()
id = m.get_id()
if id == MSG_LOGIN_ERROR:
payload = m.get_payload()
label.set_text(payload.__cast__().message())
label.set_style_text_color(lv.palette_main(lv.PALETTE.RED), 0)
elif id == MSG_LOGIN_OK:
label.set_text("Login successful")
label.set_style_text_color(lv.palette_main(lv.PALETTE.GREEN), 0)
elif id == MSG_LOG_OUT:
label.set_text("Logged out")
label.set_style_text_color(lv.palette_main(lv.PALETTE.GREY), 0)
def register_auth(msg_id,auth_msg):
lv.msg_subscribe(MSG_LOGIN_ATTEMPT, lambda m: auth_msg(m,"hello"), None)
#
# Simple PIN login screen.
# No global variables are used, all state changes are communicated via messages.
register_auth(MSG_LOGIN_ATTEMPT,auth_manager)
# lv.msg_subscribe_obj(MSG_LOGIN_ATTEMPT, auth_manager, "Hello")
# Create a slider in the center of the display
ta = lv.textarea(lv.scr_act())
ta.set_pos(10, 10)
ta.set_width(200)
ta.set_one_line(True)
ta.set_password_mode(True)
ta.set_placeholder_text("The password is: hello")
ta.add_event_cb(textarea_event_cb, lv.EVENT.ALL, None)
lv.msg_subscribe_obj(MSG_LOGIN_ERROR, ta, None)
lv.msg_subscribe_obj(MSG_LOGIN_OK, ta, None)
lv.msg_subscribe_obj(MSG_LOG_OUT, ta, None)
kb = lv.keyboard(lv.scr_act())
kb.set_textarea(ta)
# Create a log out button which will be active only when logged in
btn = lv.btn(lv.scr_act())
btn.set_pos(240, 10)
btn.add_event_cb(log_out_event_cb, lv.EVENT.ALL, None)
lv.msg_subscribe_obj(MSG_LOGIN_OK, btn, None)
lv.msg_subscribe_obj(MSG_LOG_OUT, btn, None)
label = lv.label(btn);
label.set_text("LOG OUT")
# Create a label to show info
label = lv.label(lv.scr_act());
label.set_text("")
label.add_event_cb(info_label_msg_event_cb, lv.EVENT.MSG_RECEIVED, None)
label.set_pos(10, 60)
lv.msg_subscribe_obj(MSG_LOGIN_ERROR, label, None)
lv.msg_subscribe_obj(MSG_LOGIN_OK, label, None)
lv.msg_subscribe_obj(MSG_LOG_OUT, label, None)
#Create button which will be active only when logged in
btn = lv.btn(lv.scr_act())
btn.set_pos(10, 80)
btn.add_event_cb(start_engine_msg_event_cb, lv.EVENT.MSG_RECEIVED, None)
btn.add_flag(lv.obj.FLAG.CHECKABLE)
lv.msg_subscribe_obj(MSG_LOGIN_OK, btn, None)
lv.msg_subscribe_obj(MSG_LOG_OUT, btn, None)
label = lv.label(btn)
label.set_text("START ENGINE")
lv.msg_send(MSG_LOG_OUT, None)

View File

@@ -0,0 +1,122 @@
# Define a message ID
MSG_INC = 1
MSG_DEC = 2
MSG_SET = 3
MSG_UPDATE = 4
MSG_UPDATE_REQUEST = 5
# Define the object that will be sent as msg payload
class NewValue:
def __init__(self, value):
self.value = value
def __repr__(self):
return f"{self.value} %"
class LV_Example_Msg_2:
def __init__(self):
self.value = 10
lv.msg_subscribe(MSG_INC, self.value_handler, None)
lv.msg_subscribe(MSG_DEC, self.value_handler, None)
lv.msg_subscribe(MSG_SET, self.value_handler, None)
lv.msg_subscribe(MSG_UPDATE, self.value_handler, None)
lv.msg_subscribe(MSG_UPDATE_REQUEST, self.value_handler, None)
panel = lv.obj(lv.scr_act())
panel.set_size(250, lv.SIZE_CONTENT)
panel.center()
panel.set_flex_flow(lv.FLEX_FLOW.ROW)
panel.set_flex_align(lv.FLEX_ALIGN.SPACE_BETWEEN, lv.FLEX_ALIGN.CENTER, lv.FLEX_ALIGN.START)
# Up button
btn = lv.btn(panel)
btn.set_flex_grow(1)
btn.add_event_cb(self.btn_event_cb, lv.EVENT.ALL, None)
label = lv.label(btn)
label.set_text(lv.SYMBOL.LEFT)
label.center()
# Current value
label = lv.label(panel)
label.set_flex_grow(2)
label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
label.set_text("?")
lv.msg_subscribe_obj(MSG_UPDATE, label, None)
label.add_event_cb(self.label_event_cb, lv.EVENT.MSG_RECEIVED, None)
# Down button
btn = lv.btn(panel)
btn.set_flex_grow(1)
btn.add_event_cb(self.btn_event_cb, lv.EVENT.ALL, None)
label = lv.label(btn)
label.set_text(lv.SYMBOL.RIGHT)
label.center()
# Slider
slider = lv.slider(panel)
slider.set_flex_grow(1)
slider.add_flag(lv.OBJ_FLAG_FLEX_IN_NEW_TRACK)
slider.add_event_cb(self.slider_event_cb, lv.EVENT.ALL, None)
lv.msg_subscribe_obj(MSG_UPDATE, slider, None)
# As there are new UI elements that don't know the system's state
# send an UPDATE REQUEST message which will trigger an UPDATE message with the current value
lv.msg_send(MSG_UPDATE_REQUEST, None)
def value_handler(self,m):
old_value = self.value
id = m.get_id()
if id == MSG_INC:
if self.value < 100:
self.value +=1
elif id == MSG_DEC:
if self.value > 0:
self.value -=1
elif id == MSG_SET:
payload = m.get_payload()
new_value=payload.__cast__()
self.value = new_value.value
# print("value_handler: new value: {:d}".format(new_value.value))
elif id == MSG_UPDATE_REQUEST:
lv.msg_send(MSG_UPDATE, NewValue(self.value))
if self.value != old_value:
lv.msg_send(MSG_UPDATE, NewValue(self.value));
def btn_event_cb(self,e):
btn = e.get_target()
code = e.get_code()
if code == lv.EVENT.CLICKED or code == lv.EVENT.LONG_PRESSED_REPEAT:
if btn.get_index() == 0: # rst object is the dec. button
lv.msg_send(MSG_DEC, None)
else :
lv.msg_send(MSG_INC, None)
def label_event_cb(self,e):
label = e.get_target()
code = e.get_code()
if code == lv.EVENT.MSG_RECEIVED:
m = e.get_msg()
if m.get_id() == MSG_UPDATE:
payload = m.get_payload()
value=payload.__cast__()
# print("label_event_cb: " + str(value))
label.set_text(str(value))
def slider_event_cb(self,e):
slider = e.get_target()
code = e.get_code()
if code == lv.EVENT.VALUE_CHANGED:
v = slider.get_value()
# print("slider_event_cb: {:d}".format(v))
lv.msg_send(MSG_SET, NewValue(v))
elif code == lv.EVENT.MSG_RECEIVED:
m = e.get_msg()
if m.get_id() == MSG_UPDATE:
v = m.get_payload()
value = v.__cast__()
slider.set_value(value.value, lv.ANIM.OFF)
lv_example_msg_2 = LV_Example_Msg_2()