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