1 #include "../../lv_examples.h"
2 #if LV_USE_MSG && LV_USE_SLIDER && LV_USE_LABEL && LV_BUILD_EXAMPLES
3
4 /*Define a message ID*/
5 #define MSG_LOGIN_ATTEMPT 1
6 #define MSG_LOG_OUT 2
7 #define MSG_LOGIN_ERROR 3
8 #define MSG_LOGIN_OK 4
9
10 static void auth_manager(void * s, lv_msg_t * m);
11 static void textarea_event_cb(lv_event_t * e);
12 static void log_out_event_cb(lv_event_t * e);
13 static void start_engine_msg_event_cb(lv_event_t * e);
14 static void info_label_msg_event_cb(lv_event_t * e);
15
16 /**
17 * Simple PIN login screen.
18 * No global variables are used, all state changes are communicated via messages.
19 */
lv_example_msg_2(void)20 void lv_example_msg_2(void)
21 {
22 lv_msg_subsribe(MSG_LOGIN_ATTEMPT, auth_manager, "hello");
23
24 /*Create a slider in the center of the display*/
25 lv_obj_t * ta = lv_textarea_create(lv_scr_act());
26 lv_obj_set_pos(ta, 10, 10);
27 lv_obj_set_width(ta, 200);
28 lv_textarea_set_one_line(ta, true);
29 lv_textarea_set_password_mode(ta, true);
30 lv_textarea_set_placeholder_text(ta, "The password is: hello");
31 lv_obj_add_event_cb(ta, textarea_event_cb, LV_EVENT_ALL, NULL);
32 lv_msg_subsribe_obj(MSG_LOGIN_ERROR, ta, NULL);
33 lv_msg_subsribe_obj(MSG_LOGIN_OK, ta, NULL);
34 lv_msg_subsribe_obj(MSG_LOG_OUT, ta, NULL);
35
36 lv_obj_t * kb = lv_keyboard_create(lv_scr_act());
37 lv_keyboard_set_textarea(kb, ta);
38
39 lv_obj_t * btn;
40 lv_obj_t * label;
41
42 /*Create a log out button which will be active only when logged in*/
43 btn = lv_btn_create(lv_scr_act());
44 lv_obj_set_pos(btn, 240, 10);
45 lv_obj_add_event_cb(btn, log_out_event_cb, LV_EVENT_ALL, NULL);
46 lv_msg_subsribe_obj(MSG_LOGIN_OK, btn, NULL);
47 lv_msg_subsribe_obj(MSG_LOG_OUT, btn, NULL);
48
49 label = lv_label_create(btn);
50 lv_label_set_text(label, "LOG OUT");
51
52 /*Create a label to show info*/
53 label = lv_label_create(lv_scr_act());
54 lv_label_set_text(label, "");
55 lv_obj_add_event_cb(label, info_label_msg_event_cb, LV_EVENT_MSG_RECEIVED, NULL);
56 lv_obj_set_pos(label, 10, 60);
57 lv_msg_subsribe_obj(MSG_LOGIN_ERROR, label, NULL);
58 lv_msg_subsribe_obj(MSG_LOGIN_OK, label, NULL);
59 lv_msg_subsribe_obj(MSG_LOG_OUT, label, NULL);
60
61 /*Create button which will be active only when logged in*/
62 btn = lv_btn_create(lv_scr_act());
63 lv_obj_set_pos(btn, 10, 80);
64 lv_obj_add_event_cb(btn, start_engine_msg_event_cb, LV_EVENT_MSG_RECEIVED, NULL);
65 lv_obj_add_flag(btn, LV_OBJ_FLAG_CHECKABLE);
66 lv_msg_subsribe_obj(MSG_LOGIN_OK, btn, NULL);
67 lv_msg_subsribe_obj(MSG_LOG_OUT, btn, NULL);
68
69 label = lv_label_create(btn);
70 lv_label_set_text(label, "START ENGINE");
71
72 lv_msg_send(MSG_LOG_OUT, NULL);
73 }
74
auth_manager(void * s,lv_msg_t * m)75 static void auth_manager(void * s, lv_msg_t * m)
76 {
77 LV_UNUSED(s);
78 const char * pin_act = lv_msg_get_payload(m);
79 const char * pin_expexted = lv_msg_get_user_data(m);
80 if(strcmp(pin_act, pin_expexted) == 0) {
81 lv_msg_send(MSG_LOGIN_OK, NULL);
82 }
83 else {
84 lv_msg_send(MSG_LOGIN_ERROR, "Incorrect PIN");
85 }
86
87 }
88
textarea_event_cb(lv_event_t * e)89 static void textarea_event_cb(lv_event_t * e)
90 {
91 lv_obj_t * ta = lv_event_get_target(e);
92 lv_event_code_t code = lv_event_get_code(e);
93 if(code == LV_EVENT_READY) {
94 lv_msg_send(MSG_LOGIN_ATTEMPT, lv_textarea_get_text(ta));
95 }
96 else if(code == LV_EVENT_MSG_RECEIVED) {
97 lv_msg_t * m = lv_event_get_msg(e);
98 switch(lv_msg_get_id(m)) {
99 case MSG_LOGIN_ERROR:
100 /*If there was an error, clean the text area*/
101 if(strlen(lv_msg_get_payload(m))) lv_textarea_set_text(ta, "");
102 break;
103 case MSG_LOGIN_OK:
104 lv_obj_add_state(ta, LV_STATE_DISABLED);
105 lv_obj_clear_state(ta, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY);
106 break;
107 case MSG_LOG_OUT:
108 lv_textarea_set_text(ta, "");
109 lv_obj_clear_state(ta, LV_STATE_DISABLED);
110 break;
111 }
112 }
113 }
114
log_out_event_cb(lv_event_t * e)115 static void log_out_event_cb(lv_event_t * e)
116 {
117 lv_event_code_t code = lv_event_get_code(e);
118 if(code == LV_EVENT_CLICKED) {
119 lv_msg_send(MSG_LOG_OUT, NULL);
120 }
121 else if(code == LV_EVENT_MSG_RECEIVED) {
122 lv_msg_t * m = lv_event_get_msg(e);
123 lv_obj_t * btn = lv_event_get_target(e);
124 switch(lv_msg_get_id(m)) {
125 case MSG_LOGIN_OK:
126 lv_obj_clear_state(btn, LV_STATE_DISABLED);
127 break;
128 case MSG_LOG_OUT:
129 lv_obj_add_state(btn, LV_STATE_DISABLED);
130 break;
131 }
132 }
133 }
134
start_engine_msg_event_cb(lv_event_t * e)135 static void start_engine_msg_event_cb(lv_event_t * e)
136 {
137 lv_msg_t * m = lv_event_get_msg(e);
138 lv_obj_t * btn = lv_event_get_target(e);
139 switch(lv_msg_get_id(m)) {
140 case MSG_LOGIN_OK:
141 lv_obj_clear_state(btn, LV_STATE_DISABLED);
142 break;
143 case MSG_LOG_OUT:
144 lv_obj_add_state(btn, LV_STATE_DISABLED);
145 break;
146 }
147 }
148
info_label_msg_event_cb(lv_event_t * e)149 static void info_label_msg_event_cb(lv_event_t * e)
150 {
151 lv_obj_t * label = lv_event_get_target(e);
152 lv_msg_t * m = lv_event_get_msg(e);
153 switch(lv_msg_get_id(m)) {
154 case MSG_LOGIN_ERROR:
155 lv_label_set_text(label, lv_msg_get_payload(m));
156 lv_obj_set_style_text_color(label, lv_palette_main(LV_PALETTE_RED), 0);
157 break;
158 case MSG_LOGIN_OK:
159 lv_label_set_text(label, "Login successful");
160 lv_obj_set_style_text_color(label, lv_palette_main(LV_PALETTE_GREEN), 0);
161 break;
162 case MSG_LOG_OUT:
163 lv_label_set_text(label, "Logged out");
164 lv_obj_set_style_text_color(label, lv_palette_main(LV_PALETTE_GREY), 0);
165 break;
166 default:
167 break;
168 }
169 }
170
171 #endif
172