1 /**
2  * @file lv_demo_high_res_api_example.c
3  *
4  */
5 
6 /*********************
7  *      INCLUDES
8  *********************/
9 
10 #include "lv_demo_high_res.h"
11 #if LV_USE_DEMO_HIGH_RES
12 
13 /*********************
14  *      DEFINES
15  *********************/
16 
17 /**********************
18  *      TYPEDEFS
19  **********************/
20 
21 /**********************
22  *  STATIC PROTOTYPES
23  **********************/
24 
25 static void exit_cb(lv_demo_high_res_api_t * api);
26 static void output_subject_observer_cb(lv_observer_t * observer, lv_subject_t * subject);
27 static void locked_observer_cb(lv_observer_t * observer, lv_subject_t * subject);
28 static void locked_timer_cb(lv_timer_t * t);
29 static void delete_timer_cb(lv_event_t * e);
30 static void clock_timer_cb(lv_timer_t * t);
31 
32 /**********************
33  *  STATIC VARIABLES
34  **********************/
35 
36 /**********************
37  *      MACROS
38  **********************/
39 
40 /**********************
41  *   GLOBAL FUNCTIONS
42  **********************/
43 
lv_demo_high_res_api_example(const char * assets_path,const char * logo_path,const char * slides_path)44 void lv_demo_high_res_api_example(const char * assets_path, const char * logo_path, const char * slides_path)
45 {
46     lv_demo_high_res_api_t * api = lv_demo_high_res(assets_path, logo_path, slides_path, exit_cb);
47 
48     /* see lv_demo_high_res.h for documentation of the available subjects */
49     lv_subject_set_int(&api->subjects.volume, 50);
50     lv_subject_set_pointer(&api->subjects.month_name, "August");
51     lv_subject_set_int(&api->subjects.month_day, 1);
52     lv_subject_set_pointer(&api->subjects.week_day_name, "Wednesday");
53     lv_subject_set_int(&api->subjects.temperature_outdoor, 16 * 10); /* 16 degrees C */
54     lv_subject_set_int(&api->subjects.main_light_temperature, 4500); /* 4500 degrees K */
55     lv_subject_set_int(&api->subjects.thermostat_target_temperature, 25 * 10); /* 25 degrees C */
56     lv_subject_set_pointer(&api->subjects.wifi_ssid, "my home Wi-Fi network");
57     lv_subject_set_pointer(&api->subjects.wifi_ip, "192.168.1.1");
58 
59     lv_subject_add_observer(&api->subjects.music_play, output_subject_observer_cb, (void *)"music_play");
60     lv_subject_add_observer(&api->subjects.locked, output_subject_observer_cb, (void *)"locked");
61     lv_subject_add_observer(&api->subjects.volume, output_subject_observer_cb, (void *)"volume");
62     lv_subject_add_observer(&api->subjects.main_light_temperature, output_subject_observer_cb,
63                             (void *)"main_light_temperature");
64     lv_subject_add_observer(&api->subjects.main_light_intensity, output_subject_observer_cb,
65                             (void *)"main_light_intensity");
66     lv_subject_add_observer(&api->subjects.thermostat_fan_speed, output_subject_observer_cb,
67                             (void *)"thermostat_fan_speed");
68     lv_subject_add_observer(&api->subjects.thermostat_target_temperature, output_subject_observer_cb,
69                             (void *)"thermostat_target_temperature");
70 
71     /* unlock after being locked for 3 seconds */
72     lv_timer_t * locked_timer = lv_timer_create_basic();
73     lv_obj_add_event_cb(api->base_obj, delete_timer_cb, LV_EVENT_DELETE, locked_timer);
74     lv_subject_add_observer(&api->subjects.locked, locked_observer_cb, locked_timer);
75 
76     /* slowly increment the time */
77     lv_timer_t * clock_timer = lv_timer_create(clock_timer_cb, 10000, api);
78     lv_obj_add_event_cb(api->base_obj, delete_timer_cb, LV_EVENT_DELETE, clock_timer);
79 }
80 
81 /**********************
82  *   STATIC FUNCTIONS
83  **********************/
84 
exit_cb(lv_demo_high_res_api_t * api)85 static void exit_cb(lv_demo_high_res_api_t * api)
86 {
87     lv_obj_delete(api->base_obj);
88 }
89 
output_subject_observer_cb(lv_observer_t * observer,lv_subject_t * subject)90 static void output_subject_observer_cb(lv_observer_t * observer, lv_subject_t * subject)
91 {
92     const char * subject_name = lv_observer_get_user_data(observer);
93     LV_LOG_USER("%s output subject value: %"PRId32, subject_name, lv_subject_get_int(subject));
94 }
95 
locked_observer_cb(lv_observer_t * observer,lv_subject_t * subject)96 static void locked_observer_cb(lv_observer_t * observer, lv_subject_t * subject)
97 {
98     if(lv_subject_get_int(subject)) {
99         /* unlock after being locked for 3 seconds */
100         lv_timer_t * timer = lv_observer_get_user_data(observer);
101         lv_timer_set_cb(timer, locked_timer_cb);
102         lv_timer_set_period(timer, 3000);
103         lv_timer_set_user_data(timer, subject);
104         lv_timer_set_repeat_count(timer, 1);
105         lv_timer_set_auto_delete(timer, false);
106         lv_timer_resume(timer);
107     }
108 }
109 
locked_timer_cb(lv_timer_t * t)110 static void locked_timer_cb(lv_timer_t * t)
111 {
112     lv_subject_t * locked_subject = lv_timer_get_user_data(t);
113     lv_subject_set_int(locked_subject, 0);
114 }
115 
delete_timer_cb(lv_event_t * e)116 static void delete_timer_cb(lv_event_t * e)
117 {
118     lv_timer_t * timer = lv_event_get_user_data(e);
119     lv_timer_delete(timer);
120 }
121 
clock_timer_cb(lv_timer_t * t)122 static void clock_timer_cb(lv_timer_t * t)
123 {
124     /* slowly increment the time */
125     lv_demo_high_res_api_t * api = lv_timer_get_user_data(t);
126     int32_t minutes = lv_subject_get_int(&api->subjects.minute);
127     minutes += 1;
128     if(minutes > 59) {
129         minutes = 0;
130         int32_t hour = lv_subject_get_int(&api->subjects.hour);
131         hour += 1;
132         if(hour > 12) {
133             hour = 1;
134         }
135         lv_subject_set_int(&api->subjects.hour, hour);
136     }
137     lv_subject_set_int(&api->subjects.minute, minutes);
138 }
139 
140 #endif /*LV_USE_DEMO_HIGH_RES*/
141