1 /**
2 * @file lv_demo_stress.c
3 *
4 */
5
6 /*********************
7 * INCLUDES
8 *********************/
9 #include "lv_demo_stress.h"
10
11 #if LV_USE_DEMO_STRESS
12 /*********************
13 * DEFINES
14 *********************/
15
16 /**********************
17 * TYPEDEFS
18 **********************/
19
20 /**********************
21 * STATIC PROTOTYPES
22 **********************/
23 static void auto_delete(lv_obj_t * obj, uint32_t delay);
24 static void msgbox_delete(lv_timer_t * tmr);
25 static void set_y_anim(void * obj, int32_t v);
26 static void set_width_anim(void * obj, int32_t v);
27 static void arc_set_end_angle_anim(void * obj, int32_t v);
28 static void obj_test_task_cb(lv_timer_t * tmr);
29
30 /**********************
31 * STATIC VARIABLES
32 **********************/
33 static lv_obj_t * main_page;
34 static lv_obj_t * ta;
35 static size_t mem_free_start = 0;
36 static int16_t g_state = -1;
37
38 /**********************
39 * MACROS
40 **********************/
41
42 /**********************
43 * GLOBAL FUNCTIONS
44 **********************/
45
lv_demo_stress(void)46 void lv_demo_stress(void)
47 {
48 LV_LOG_USER("Starting stress test. (< 100 bytes permanent memory leak is normal due to fragmentation)");
49 lv_timer_t * t = lv_timer_create(obj_test_task_cb, LV_DEMO_STRESS_TIME_STEP, NULL);
50 lv_timer_ready(t); /*Prepare the test right now in first state change.*/
51 }
52
lv_demo_stress_finished(void)53 bool lv_demo_stress_finished(void)
54 {
55 return g_state == -1;
56 }
57
58 /**********************
59 * STATIC FUNCTIONS
60 **********************/
61
obj_test_task_cb(lv_timer_t * tmr)62 static void obj_test_task_cb(lv_timer_t * tmr)
63 {
64 (void) tmr; /*Unused*/
65
66 lv_anim_t a;
67 lv_obj_t * obj;
68
69 switch(g_state) {
70 case -1: {
71 lv_result_t res = lv_mem_test();
72 if(res != LV_RESULT_OK) {
73 LV_LOG_ERROR("Memory integrity error");
74 }
75
76 lv_mem_monitor_t mon;
77 lv_mem_monitor(&mon);
78
79 if(mem_free_start == 0) mem_free_start = mon.free_size;
80
81 LV_LOG_USER("mem leak since start: %zu, frag: %3d %%", mem_free_start - mon.free_size, mon.frag_pct);
82 }
83 break;
84 case 0:
85 /* Holder for all object types */
86 main_page = lv_obj_create(lv_screen_active());
87 lv_obj_set_size(main_page, LV_HOR_RES / 2, LV_VER_RES);
88 lv_obj_set_flex_flow(main_page, LV_FLEX_FLOW_COLUMN);
89
90 obj = lv_button_create(main_page);
91 lv_obj_set_size(obj, 100, 70);
92 obj = lv_label_create(obj);
93 lv_label_set_text(obj, "Multi line\n"LV_SYMBOL_OK LV_SYMBOL_CLOSE LV_SYMBOL_WIFI);
94 break;
95
96 case 1: {
97 obj = lv_tabview_create(lv_screen_active());
98 lv_tabview_set_tab_bar_size(obj, 50);
99 lv_obj_set_size(obj, LV_HOR_RES / 2, LV_VER_RES / 2);
100 lv_obj_align(obj, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
101 lv_obj_t * t = lv_tabview_add_tab(obj, "First");
102
103 t = lv_tabview_add_tab(obj, "Second");
104 lv_obj_t * label = lv_label_create(t);
105 lv_label_set_text(label, "Label on tabview");
106 t = lv_tabview_add_tab(obj, LV_SYMBOL_EDIT " Edit");
107 t = lv_tabview_add_tab(obj, LV_SYMBOL_CLOSE);
108
109 lv_tabview_set_active(obj, 1, LV_ANIM_ON);
110 auto_delete(obj, LV_DEMO_STRESS_TIME_STEP * 5 + 30);
111 }
112 break;
113
114 case 2:
115 obj = lv_button_create(main_page);
116 lv_obj_set_size(obj, 200, 70);
117
118 /*Move to disabled state very slowly*/
119 lv_obj_add_state(obj, LV_STATE_DISABLED);
120
121 /*Add an infinite width change animation*/
122 lv_anim_init(&a);
123 lv_anim_set_var(&a, obj);
124 lv_anim_set_duration(&a, LV_DEMO_STRESS_TIME_STEP * 2);
125 lv_anim_set_exec_cb(&a, set_width_anim);
126 lv_anim_set_values(&a, 100, 200);
127 lv_anim_set_reverse_duration(&a, LV_DEMO_STRESS_TIME_STEP * 2);
128 lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);
129 lv_anim_start(&a);
130
131 /*Delete the object a few sec later*/
132 auto_delete(obj, LV_DEMO_STRESS_TIME_STEP * 10);
133
134 obj = lv_label_create(obj);
135 lv_label_set_text_fmt(obj, "Formatted:\n%d %s", 12, "Volt");
136 break;
137
138 case 3:
139 ta = lv_textarea_create(lv_screen_active());
140 lv_obj_align_to(ta, main_page, LV_ALIGN_OUT_RIGHT_TOP, 10, 10);
141 lv_obj_set_size(ta, LV_HOR_RES / 3, LV_VER_RES / 4);
142 lv_textarea_set_placeholder_text(ta, "The placeholder");
143 break;
144
145 case 4:
146 obj = lv_button_create(main_page);
147 lv_obj_set_size(obj, 100, 70);
148 lv_obj_set_style_bg_image_src(obj, LV_SYMBOL_DUMMY"Text from\nstyle", 0);
149 lv_obj_delete_async(obj); /*Delete on next call of `lv_timer_handler` (so not now)*/
150 break;
151
152 case 5:
153 lv_textarea_set_one_line(ta, true);
154 break;
155 case 6:
156 lv_obj_set_flex_flow(main_page, LV_FLEX_FLOW_COLUMN_WRAP);
157 break;
158
159 case 7:
160 obj = lv_bar_create(main_page);
161 lv_bar_set_range(obj, -1000, 2000);
162 lv_bar_set_value(obj, 1800, LV_ANIM_ON);
163 lv_bar_set_start_value(obj, -500, LV_ANIM_ON);
164
165 auto_delete(obj, LV_DEMO_STRESS_TIME_STEP * 2 + 70);
166
167 obj = lv_slider_create(main_page);
168 lv_obj_set_style_anim_duration(obj, LV_DEMO_STRESS_TIME_STEP * 8, 0);
169 lv_slider_set_value(obj, 5000, LV_ANIM_ON); /*Animate to out of range value*/
170 auto_delete(obj, LV_DEMO_STRESS_TIME_STEP * 5 + 22);
171
172 obj = lv_switch_create(main_page);
173
174 obj = lv_switch_create(main_page);
175 lv_obj_add_state(obj, LV_STATE_CHECKED);
176 auto_delete(obj, 730);
177
178 break;
179
180 case 8:
181 obj = lv_win_create(lv_screen_active());
182 lv_obj_set_size(obj, LV_HOR_RES / 2, LV_VER_RES / 2);
183 lv_obj_align(obj, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
184 lv_win_add_title(obj, "Window title");
185 lv_win_add_button(obj, LV_SYMBOL_CLOSE, 40);
186 lv_win_add_button(obj, LV_SYMBOL_DOWN, 40);
187 auto_delete(obj, LV_DEMO_STRESS_TIME_STEP * 3 + 5);
188
189 obj = lv_calendar_create(lv_win_get_content(obj));
190 break;
191 case 9:
192 lv_textarea_set_text(ta, "A very very long text which will should make the text area scrollable"
193 "Here area some dummy sentences to be sure the text area will be really scrollable.");
194 break;
195 case 10:
196 obj = lv_keyboard_create(lv_screen_active());
197 lv_keyboard_set_mode(obj, LV_KEYBOARD_MODE_TEXT_UPPER);
198 lv_anim_init(&a);
199 lv_anim_set_var(&a, obj);
200 lv_anim_set_values(&a, LV_VER_RES, LV_VER_RES - lv_obj_get_height(obj));
201 lv_anim_set_duration(&a, LV_DEMO_STRESS_TIME_STEP + 3);
202 lv_anim_set_exec_cb(&a, set_y_anim);
203 lv_anim_start(&a);
204
205 auto_delete(obj, LV_DEMO_STRESS_TIME_STEP * 2 + 18);
206 break;
207
208 case 11:
209 obj = lv_dropdown_create(main_page);
210 lv_dropdown_set_options(obj, "Zero\nOne\nTwo\nThree\nFour\nFive\nSix\nSeven\nEight");
211 lv_dropdown_open(obj);
212 lv_dropdown_set_selected(obj, 2, LV_ANIM_ON);
213 auto_delete(obj, LV_DEMO_STRESS_TIME_STEP * 3 + 11);
214 break;
215
216 case 12:
217 obj = lv_roller_create(main_page);
218 lv_roller_set_options(obj, "Zero\nOne\nTwo\nThree\nFour\nFive\nSix\nSeven\nEight", LV_ROLLER_MODE_INFINITE);
219 lv_roller_set_selected(obj, 2, LV_ANIM_ON);
220 auto_delete(obj, LV_DEMO_STRESS_TIME_STEP * 20 + 22);
221 break;
222
223 case 13:
224 obj = lv_arc_create(main_page);
225 lv_anim_init(&a);
226 lv_anim_set_var(&a, obj);
227 lv_anim_set_values(&a, 180, 400);
228 lv_anim_set_duration(&a, LV_DEMO_STRESS_TIME_STEP * 2);
229 lv_anim_set_delay(&a, LV_DEMO_STRESS_TIME_STEP + 25);
230 lv_anim_set_reverse_duration(&a, LV_DEMO_STRESS_TIME_STEP * 5);
231 lv_anim_set_repeat_count(&a, 3);
232 lv_anim_set_exec_cb(&a, arc_set_end_angle_anim);
233 lv_anim_start(&a);
234
235 obj = lv_scale_create(main_page);
236 lv_scale_set_mode(obj, LV_SCALE_MODE_ROUND_INNER);
237 lv_obj_scroll_to_view(obj, LV_ANIM_ON);
238
239 auto_delete(obj, LV_DEMO_STRESS_TIME_STEP * 6 + 30);
240 break;
241
242 case 14:
243 obj = lv_msgbox_create(NULL);
244 lv_msgbox_add_title(obj, "Title");
245 lv_msgbox_add_header_button(obj, LV_SYMBOL_AUDIO);
246 lv_msgbox_add_text(obj, "Some text");
247 lv_msgbox_add_footer_button(obj, "Button 1");
248 lv_msgbox_add_footer_button(obj, "Button 2");
249 {
250 lv_timer_t * msgbox_tmr = lv_timer_create(msgbox_delete, LV_DEMO_STRESS_TIME_STEP * 5 + 30, obj);
251 lv_timer_set_repeat_count(msgbox_tmr, 1);
252 lv_obj_align(obj, LV_ALIGN_RIGHT_MID, -10, 0);
253 }
254 break;
255
256 case 15:
257 lv_textarea_set_one_line(ta, false);
258 break;
259
260 case 16: {
261 lv_obj_t * tv = lv_tileview_create(lv_screen_active());
262 lv_obj_set_size(tv, 200, 200);
263 auto_delete(tv, LV_DEMO_STRESS_TIME_STEP * 4 + 5);
264
265 obj = lv_tileview_add_tile(tv, 0, 0, LV_DIR_ALL);
266 obj = lv_label_create(obj);
267 lv_label_set_text(obj, "Tile: 0;0");
268
269 obj = lv_tileview_add_tile(tv, 0, 1, LV_DIR_ALL);
270 obj = lv_label_create(obj);
271 lv_label_set_text(obj, "Tile: 0;1");
272
273 obj = lv_tileview_add_tile(tv, 1, 1, LV_DIR_ALL);
274 obj = lv_label_create(obj);
275 lv_label_set_text(obj, "Tile: 1;1");
276
277 lv_tileview_set_tile_by_index(tv, 1, 1, LV_ANIM_ON);
278 }
279 break;
280
281 case 18:
282 obj = lv_list_create(main_page);
283 {
284 lv_obj_t * b;
285 b = lv_list_add_button(obj, LV_SYMBOL_OK, "1. Some very long text to scroll");
286 auto_delete(b, 10);
287 lv_list_add_button(obj, LV_SYMBOL_OK, "2. Some very long text to scroll");
288 lv_list_add_button(obj, LV_SYMBOL_OK, "3. Some very long text to scroll");
289 b = lv_list_add_button(obj, LV_SYMBOL_OK, "4. Some very long text to scroll");
290 auto_delete(b, LV_DEMO_STRESS_TIME_STEP);
291 b = lv_list_add_button(obj, LV_SYMBOL_OK, "5. Some very long text to scroll");
292 auto_delete(b, LV_DEMO_STRESS_TIME_STEP + 90);
293 b = lv_list_add_button(obj, LV_SYMBOL_OK, "6. Some very long text to scroll");
294 auto_delete(b, LV_DEMO_STRESS_TIME_STEP + 10);
295 lv_obj_scroll_to_view(lv_obj_get_child(obj, -1), LV_ANIM_ON);
296 }
297 auto_delete(obj, LV_DEMO_STRESS_TIME_STEP * 5 + 15);
298
299 obj = lv_table_create(main_page);
300 lv_table_set_cell_value(obj, 0, 0, "0,0");
301 lv_table_set_cell_value_fmt(obj, 3, 0, "%d,%d", 5, 0);
302 lv_table_set_row_count(obj, 5);
303 lv_table_set_cell_value_fmt(obj, 1, 0, "%s", "1,0");
304 lv_table_set_cell_value(obj, 1, 3, "1,3");
305 break;
306
307 case 19:
308 lv_textarea_set_cursor_pos(ta, 10);
309 lv_textarea_set_text(ta, "__INSERTED TEXT" LV_SYMBOL_EDIT"__");
310 break;
311
312 case 20:
313 lv_obj_set_flex_flow(main_page, LV_FLEX_FLOW_ROW_WRAP);
314 break;
315
316 case 21:
317 lv_textarea_set_cursor_pos(ta, 0);
318 lv_textarea_add_char(ta, '0');
319 lv_textarea_add_char(ta, '1');
320 lv_textarea_add_char(ta, '2');
321 lv_textarea_add_char(ta, '3');
322 lv_textarea_add_char(ta, '4');
323 lv_textarea_add_char(ta, '5');
324 lv_textarea_add_char(ta, '6');
325 lv_textarea_add_char(ta, '7');
326 lv_textarea_add_char(ta, '8');
327 lv_textarea_add_char(ta, '9');
328 lv_textarea_add_char(ta, 'A');
329 lv_textarea_add_char(ta, 'B');
330 lv_textarea_add_char(ta, 'C');
331 lv_textarea_add_char(ta, 'D');
332 lv_textarea_add_char(ta, 'E');
333 lv_textarea_add_char(ta, 'F');
334 lv_textarea_add_text(ta, LV_SYMBOL_OK);
335 lv_textarea_add_text(ta, LV_SYMBOL_CLOSE);
336 lv_textarea_add_text(ta, LV_SYMBOL_COPY);
337 lv_textarea_add_text(ta, LV_SYMBOL_SAVE);
338 lv_textarea_add_text(ta, LV_SYMBOL_PASTE);
339 break;
340
341 case 22:
342 obj = lv_spinbox_create(main_page);
343 lv_spinbox_set_digit_format(obj, 6, 3);
344 lv_spinbox_set_value(obj, 5678);
345 lv_spinbox_set_step(obj, 10);
346 lv_spinbox_increment(obj);
347 lv_spinbox_increment(obj);
348 lv_spinbox_increment(obj);
349 lv_spinbox_set_step(obj, 100);
350 lv_spinbox_increment(obj);
351 lv_spinbox_increment(obj);
352 lv_spinbox_set_step(obj, 1);
353 lv_spinbox_increment(obj);
354 lv_spinbox_increment(obj);
355 auto_delete(obj, LV_DEMO_STRESS_TIME_STEP * 2 + 15);
356
357 lv_obj_scroll_by(main_page, 0, 20, LV_ANIM_ON);
358
359 break;
360
361 case 23:
362 obj = lv_chart_create(main_page);
363 {
364 lv_chart_series_t * s1 = lv_chart_add_series(obj, lv_palette_main(LV_PALETTE_RED), LV_CHART_AXIS_PRIMARY_Y);
365 lv_chart_set_next_value(obj, s1, 36);
366 lv_chart_set_next_value(obj, s1, -29);
367 lv_chart_set_next_value(obj, s1, 51);
368 lv_chart_set_next_value(obj, s1, 107);
369 lv_chart_set_next_value(obj, s1, 70);
370 lv_chart_set_next_value(obj, s1, 36);
371 lv_chart_set_next_value(obj, s1, -2);
372 lv_chart_set_next_value(obj, s1, 63);
373 lv_chart_set_next_value(obj, s1, 48);
374 lv_chart_set_next_value(obj, s1, 72);
375
376 auto_delete(obj, LV_DEMO_STRESS_TIME_STEP * 3);
377 }
378
379 lv_obj_scroll_by(main_page, 0, 20, LV_ANIM_ON);
380 break;
381
382 case 24:
383 obj = lv_checkbox_create(main_page);
384 lv_checkbox_set_text(obj, "An option to select");
385 auto_delete(obj, LV_DEMO_STRESS_TIME_STEP * 2 + 20);
386
387 obj = lv_checkbox_create(main_page);
388 lv_obj_add_state(obj, LV_STATE_CHECKED);
389
390 obj = lv_checkbox_create(main_page);
391 lv_obj_add_state(obj, LV_STATE_CHECKED | LV_STATE_DISABLED);
392 auto_delete(obj, LV_DEMO_STRESS_TIME_STEP * 1 + 60);
393
394 lv_obj_scroll_by(main_page, 0, 20, LV_ANIM_ON);
395
396 break;
397
398 case 25:
399 lv_textarea_set_cursor_pos(ta, 20);
400 {
401 uint16_t i;
402 for(i = 0; i < 64; i++) {
403 lv_textarea_delete_char_forward(ta);
404 }
405 }
406 break;
407
408 case 26:
409 lv_textarea_set_one_line(ta, true);
410 break;
411 case 29:
412 lv_obj_clean(main_page);
413 lv_obj_delete(ta);
414 ta = NULL;
415 break;
416 case 31:
417 lv_obj_clean(lv_screen_active());
418 main_page = NULL;
419 g_state = -2;
420 break;
421 default:
422 break;
423 }
424
425 g_state++;
426 }
427
auto_delete(lv_obj_t * obj,uint32_t delay)428 static void auto_delete(lv_obj_t * obj, uint32_t delay)
429 {
430 lv_anim_t a;
431 lv_anim_init(&a);
432 lv_anim_set_var(&a, obj);
433 lv_anim_set_duration(&a, 0);
434 lv_anim_set_delay(&a, delay);
435 lv_anim_set_completed_cb(&a, lv_obj_delete_anim_completed_cb);
436 lv_anim_start(&a);
437 }
438
msgbox_delete(lv_timer_t * tmr)439 static void msgbox_delete(lv_timer_t * tmr)
440 {
441 lv_msgbox_close(lv_timer_get_user_data(tmr));
442 }
443
set_y_anim(void * obj,int32_t v)444 static void set_y_anim(void * obj, int32_t v)
445 {
446 lv_obj_set_y(obj, v);
447 }
448
set_width_anim(void * obj,int32_t v)449 static void set_width_anim(void * obj, int32_t v)
450 {
451 lv_obj_set_width(obj, v);
452 }
453
arc_set_end_angle_anim(void * obj,int32_t v)454 static void arc_set_end_angle_anim(void * obj, int32_t v)
455 {
456 lv_arc_set_end_angle(obj, v);
457 }
458
459 #endif /* LV_USE_DEMO_STRESS */
460