xref: /OK3568_Linux_fs/app/lvgl_demo/rk_demo/setting/wifi_ui.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <stdint.h>
4 #include <time.h>
5 #include <unistd.h>
6 
7 #include <lvgl/lvgl.h>
8 
9 #include "main.h"
10 #include "cJSON.h"
11 #include "Rk_wifi.h"
12 #include "ui_resource.h"
13 
14 static int init_done = 0;
15 
16 static lv_obj_t * bg;
17 static lv_obj_t * item_scan;
18 static lv_obj_t * item_scan_icon;
19 
20 static lv_obj_t * part_switch;
21 static lv_obj_t * part_saved;
22 static lv_obj_t * part_scaned;
23 
24 static lv_obj_t * wifi_label;
25 static lv_obj_t * wifi_switch;
26 
27 static lv_obj_t * item_label_saved;
28 static lv_obj_t * item_label_scaned;
29 
30 static lv_obj_t * item_list_saved;
31 static lv_obj_t * item_list_scaned;
32 
33 static lv_obj_t * kb;
34 
35 static lv_timer_t * timer;
36 
37 static lv_anim_t icon_anim;
38 
39 static lv_style_t style_txt;
40 static lv_style_t style_list;
41 
42 static cJSON *aps = NULL;
43 
44 static volatile bool rkwifi_gonff = false;
45 static RK_WIFI_RUNNING_State_e wifi_state = 0;
46 static int wifi_result = 0;
47 
48 static void lv_saved_wifi_list(lv_obj_t * parent);
49 static void connect_wifi(lv_event_t * e);
50 
wifi_connected(void)51 int wifi_connected(void)
52 {
53     return wifi_state == RK_WIFI_State_CONNECTED ||
54            wifi_state == RK_WIFI_State_DHCP_OK;
55 }
56 
read_saved_wifi(int check)57 static void read_saved_wifi(int check)
58 {
59     RK_WIFI_SAVED_INFO_s *wsi;
60     int ap_cnt = 0;
61 
62     RK_wifi_getSavedInfo(&wsi, &ap_cnt);
63     if (ap_cnt <= 0) {
64         printf("not found saved ap!\n");
65         return;
66     }
67 
68     if (!check)
69         return;
70 
71     lv_obj_clean(item_list_saved);
72     for (int i = 1; i < ap_cnt; i++) {
73         lv_obj_t *btn;
74         char *ssid, *bssid;
75         ssid = wsi[i].ssid;
76         bssid = wsi[i].bssid;
77         printf("id: %d, name: %s, bssid: %s, state: %s\n",
78                     wsi[i].id,
79                     wsi[i].ssid,
80                     wsi[i].bssid,
81                     wsi[i].state);
82         btn = lv_list_add_btn(item_list_saved, NULL,
83                               (ssid && (strlen(ssid) > 0)) ? ssid : bssid);
84         lv_obj_add_event_cb(btn, connect_wifi, LV_EVENT_CLICKED, btn);
85         if (strcmp(wsi[i].state, "[CURRENT]") == 0)
86         {
87             lv_obj_t * label;
88             label = lv_list_add_text(item_list_saved, "已连接");
89             lv_obj_remove_style_all(label);
90             lv_obj_add_style(label, &style_txt, LV_PART_MAIN);
91             lv_obj_set_size(label, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
92             lv_obj_add_flag(label, LV_OBJ_FLAG_IGNORE_LAYOUT);
93             lv_obj_align_to(label, btn, LV_ALIGN_RIGHT_MID, 0, 0);
94         }
95     }
96 
97     if (wsi != NULL)
98         free(wsi);
99 }
100 
printf_connect_info(RK_WIFI_INFO_Connection_s * info)101 static void printf_connect_info(RK_WIFI_INFO_Connection_s *info)
102 {
103     if(!info)
104         return;
105 
106     printf("	id: %d\n", info->id);
107     printf("	bssid: %s\n", info->bssid);
108     printf("	ssid: %s\n", info->ssid);
109     printf("	freq: %d\n", info->freq);
110     printf("	mode: %s\n", info->mode);
111     printf("	wpa_state: %s\n", info->wpa_state);
112     printf("	ip_address: %s\n", info->ip_address);
113     printf("	mac_address: %s\n", info->mac_address);
114 }
115 
rk_wifi_state_callback(RK_WIFI_RUNNING_State_e state,RK_WIFI_INFO_Connection_s * info)116 static int rk_wifi_state_callback(RK_WIFI_RUNNING_State_e state, RK_WIFI_INFO_Connection_s *info)
117 {
118     printf("%s state: %d\n", __func__, state);
119 
120     if (state != RK_WIFI_State_SCAN_RESULTS)
121         wifi_state = state;
122 
123     switch (state)
124     {
125     case RK_WIFI_State_IDLE:
126         break;
127     case RK_WIFI_State_CONNECTING:
128         break;
129     case RK_WIFI_State_CONNECTFAILED:
130         printf("RK_WIFI_State_CONNECTFAILED\n");
131         break;
132     case RK_WIFI_State_CONNECTFAILED_WRONG_KEY:
133         printf("RK_WIFI_State_CONNECTFAILED_WRONG_KEY\n");
134         break;
135     case RK_WIFI_State_CONNECTED:
136         printf("RK_WIFI_State_CONNECTED\n");
137         //printf_connect_info(info);
138         //RK_wifi_get_connected_ap_rssi();
139         break;
140     case RK_WIFI_State_DISCONNECTED:
141         printf("RK_WIFI_State_DISCONNECTED\n");
142         break;
143     case RK_WIFI_State_OPEN:
144         rkwifi_gonff = true;
145         printf("RK_WIFI_State_OPEN\n");
146         break;
147     case RK_WIFI_State_OFF:
148         rkwifi_gonff = false;
149         printf("RK_WIFI_State_OFF\n");
150         break;
151     case RK_WIFI_State_SCAN_RESULTS:
152         char *scan_r;
153         printf("RK_WIFI_State_SCAN_RESULTS\n");
154         scan_r = RK_wifi_scan_r();
155         if (aps)
156             cJSON_Delete(aps);
157         aps = cJSON_Parse(scan_r);
158         wifi_result = 1;
159         free(scan_r);
160         break;
161     case RK_WIFI_State_DHCP_OK:
162         printf("RK_WIFI_State_DHCP_OK\n");
163         break;
164     }
165 
166     return 0;
167 }
168 
style_init(void)169 static void style_init(void)
170 {
171     lv_style_init(&style_txt);
172     lv_style_set_text_font(&style_txt, ttf_main_s.font);
173     lv_style_set_text_color(&style_txt, lv_color_make(0xff, 0x23, 0x23));
174 
175     lv_style_init(&style_list);
176     lv_style_set_text_font(&style_list, ttf_main_m.font);
177     lv_style_set_text_color(&style_list, lv_color_black());
178 }
179 
event_cb(lv_event_t * e)180 static void event_cb(lv_event_t * e)
181 {
182     lv_obj_t * obj = lv_event_get_target(e);
183     lv_obj_t * ibox = lv_obj_get_parent(obj);
184     const char *ssid;
185     const char *psk;
186 
187     if (strcmp(lv_inputbox_get_active_btn_text(ibox), "确认") == 0)
188     {
189         ssid = lv_list_get_btn_text(item_list_scaned, lv_event_get_user_data(e));
190         psk = lv_textarea_get_text(lv_inputbox_get_text_area(ibox));
191         printf("connect %s, %s\n", ssid, psk);
192 
193         if (RK_wifi_connect((char *)ssid, (char *)psk) < 0)
194             printf("RK_wifi_connect1 fail!\n");
195 
196         read_saved_wifi(init_done);
197     }
198     lv_msgbox_close(ibox);
199     lv_obj_del(kb);
200 }
201 
connect_wifi(lv_event_t * e)202 static void connect_wifi(lv_event_t * e)
203 {
204     char title[128];
205     static const char * btns[] = {"确认", "取消", ""};
206 
207     lv_obj_t *btn = lv_event_get_user_data(e);
208     printf("try connect %s\n", lv_list_get_btn_text(item_list_scaned, btn));
209     snprintf(title, sizeof(title), "连接到%s", lv_list_get_btn_text(item_list_scaned, btn));
210 
211     lv_obj_t *ibox = lv_inputbox_create(NULL, title, "请输入密码", btns, false);
212     lv_obj_add_event_cb(ibox, event_cb, LV_EVENT_VALUE_CHANGED, btn);
213     lv_obj_add_style(ibox, &style_txt, LV_PART_MAIN);
214     lv_obj_set_size(ibox, lv_pct(80), lv_pct(20));
215     lv_obj_align(ibox, LV_ALIGN_TOP_MID, 0, lv_pct(15));
216 
217     kb = lv_keyboard_create(lv_layer_sys());
218     lv_obj_set_size(kb, lv_pct(100), lv_pct(30));
219     lv_obj_set_align(kb, LV_ALIGN_BOTTOM_MID);
220     lv_keyboard_set_textarea(kb, lv_inputbox_get_text_area(ibox));
221 }
222 
icon_anim_end(lv_anim_t * anim)223 static void icon_anim_end(lv_anim_t *anim)
224 {
225     if (!init_done)
226         return;
227 
228     lv_obj_clear_flag(item_scan, LV_OBJ_FLAG_HIDDEN);
229     lv_obj_add_flag(item_scan_icon, LV_OBJ_FLAG_HIDDEN);
230 
231     if (aps)
232     {
233         cJSON *sub;
234         lv_obj_clean(item_list_scaned);
235         cJSON_ArrayForEach(sub, aps)
236         {
237             lv_obj_t *btn;
238             char *ssid;
239             char *bssid;
240 
241             ssid = cJSON_GetStringValue(
242                         cJSON_GetObjectItem(sub, "ssid"));
243             bssid = cJSON_GetStringValue(
244                         cJSON_GetObjectItem(sub, "bssid"));
245 
246             btn = lv_list_add_btn(item_list_scaned, NULL,
247                                   (ssid && (strlen(ssid) > 0)) ? ssid : bssid);
248             lv_obj_add_event_cb(btn, connect_wifi, LV_EVENT_CLICKED, btn);
249         }
250     }
251 }
252 
icon_anim_cb(void * var,int32_t v)253 static void icon_anim_cb(void * var, int32_t v)
254 {
255     lv_img_set_angle(var, v);
256 }
257 
scan_btn_cb(lv_event_t * e)258 static void scan_btn_cb(lv_event_t * e)
259 {
260     lv_obj_add_flag(item_scan, LV_OBJ_FLAG_HIDDEN);
261     lv_obj_clear_flag(item_scan_icon, LV_OBJ_FLAG_HIDDEN);
262     lv_anim_start(&icon_anim);
263     RK_wifi_scan();
264 }
265 
label_drawed_cb(lv_event_t * e)266 static void label_drawed_cb(lv_event_t * e)
267 {
268     if (!item_scan)
269         return;
270 
271     lv_obj_align_to(item_scan, lv_event_get_target(e),
272                     LV_ALIGN_OUT_TOP_RIGHT, 0, 0);
273 }
274 
wifi_update(lv_timer_t * timer)275 static void wifi_update(lv_timer_t * timer)
276 {
277     static RK_WIFI_RUNNING_State_e last_state = 0;
278 
279     if (last_state != wifi_state)
280     {
281         last_state = wifi_state;
282         switch(last_state)
283         {
284         case RK_WIFI_State_DHCP_OK:
285         case RK_WIFI_State_CONNECTED:
286             read_saved_wifi(init_done);
287             break;
288         default:
289             break;
290         }
291     }
292     if (wifi_result)
293     {
294         lv_anim_del(&icon_anim, NULL);
295         wifi_result = 0;
296     }
297 }
298 
menu_wifi_init(lv_obj_t * parent)299 lv_obj_t * menu_wifi_init(lv_obj_t * parent)
300 {
301     if (RK_wifi_enable(1) < 0)
302         printf("RK_wifi_enable 1 fail!\n");
303     RK_wifi_register_callback(rk_wifi_state_callback);
304 
305     style_init();
306 
307     bg = lv_img_create(parent);
308     lv_obj_remove_style_all(bg);
309     lv_obj_set_size(bg, lv_pct(100), lv_pct(100));
310     lv_obj_set_flex_flow(bg, LV_FLEX_FLOW_COLUMN);
311     lv_obj_center(bg);
312 
313     part_switch = lv_obj_create(bg);
314     //lv_obj_remove_style_all(part_switch);
315     lv_obj_set_width(part_switch, lv_pct(100));
316     lv_obj_set_height(part_switch, LV_SIZE_CONTENT);
317     lv_obj_add_style(part_switch, &style_txt, LV_PART_MAIN);
318 
319     wifi_label = lv_label_create(part_switch);
320     lv_obj_align(wifi_label, LV_ALIGN_LEFT_MID, 0, 0);
321     lv_label_set_text(wifi_label, "WIFI");
322     lv_obj_add_style(wifi_label, &style_txt, LV_PART_MAIN);
323     wifi_switch = lv_switch_create(part_switch);
324     lv_obj_align(wifi_switch, LV_ALIGN_RIGHT_MID, 0, 0);
325     lv_obj_add_state(wifi_switch, LV_STATE_CHECKED | LV_STATE_DISABLED);
326 
327     item_label_saved = lv_label_create(bg);
328     lv_label_set_text(item_label_saved, "已保存网络");
329     lv_obj_add_style(item_label_saved, &style_txt, LV_PART_MAIN);
330 
331     part_saved = lv_obj_create(bg);
332     lv_obj_remove_style_all(part_saved);
333     lv_obj_set_width(part_saved, lv_pct(100));
334     lv_obj_set_height(part_saved, LV_SIZE_CONTENT);
335     lv_obj_set_flex_flow(part_saved, LV_FLEX_FLOW_COLUMN);
336 
337     item_label_scaned = lv_label_create(bg);
338     lv_label_set_text(item_label_scaned, "可用网络");
339     lv_obj_add_style(item_label_scaned, &style_txt, LV_PART_MAIN);
340 
341     part_scaned = lv_obj_create(bg);
342     lv_obj_remove_style_all(part_scaned);
343     lv_obj_set_width(part_scaned, lv_pct(100));
344     lv_obj_set_height(part_scaned, LV_SIZE_CONTENT);
345     lv_obj_set_flex_flow(part_scaned, LV_FLEX_FLOW_COLUMN);
346 
347     lv_obj_add_event_cb(part_scaned, label_drawed_cb, LV_EVENT_DRAW_POST_END, NULL);
348 
349     item_list_saved = lv_list_create(part_saved);
350     lv_obj_set_size(item_list_saved, lv_pct(100), LV_SIZE_CONTENT);
351     lv_obj_add_style(item_list_saved, &style_list, LV_PART_MAIN);
352     lv_list_add_btn(item_list_saved, NULL, "无");
353 
354     item_list_scaned = lv_list_create(part_scaned);
355     lv_obj_set_size(item_list_scaned, lv_pct(100), LV_SIZE_CONTENT);
356     lv_obj_add_style(item_list_scaned, &style_list, LV_PART_MAIN);
357     lv_list_add_btn(item_list_scaned, NULL, "无");
358 
359     read_saved_wifi(1);
360 
361     item_scan = lv_label_create(bg);
362     lv_label_set_text(item_scan, "刷新");
363     lv_obj_add_style(item_scan, &style_txt, LV_PART_MAIN);
364     lv_obj_align_to(item_scan, part_scaned, LV_ALIGN_OUT_TOP_RIGHT, 0, 0);
365     lv_obj_add_event_cb(item_scan, scan_btn_cb, LV_EVENT_CLICKED, NULL);
366     lv_obj_add_flag(item_scan, LV_OBJ_FLAG_CLICKABLE | LV_OBJ_FLAG_IGNORE_LAYOUT);
367 
368     item_scan_icon = lv_img_create(bg);
369     lv_img_set_src(item_scan_icon, WIFI_SCANNING);
370     lv_img_set_angle(item_scan_icon, 0);
371     lv_obj_align_to(item_scan_icon, item_scan, LV_ALIGN_CENTER, 0, 0);
372     lv_obj_add_flag(item_scan_icon, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_IGNORE_LAYOUT);
373 
374     lv_anim_init(&icon_anim);
375     lv_anim_set_var(&icon_anim, item_scan_icon);
376     lv_anim_set_values(&icon_anim, 0, 3600);
377     lv_anim_set_time(&icon_anim, 1000);
378     lv_anim_set_exec_cb(&icon_anim, icon_anim_cb);
379     lv_anim_set_path_cb(&icon_anim, lv_anim_path_linear);
380     lv_anim_set_deleted_cb(&icon_anim, icon_anim_end);
381     lv_anim_set_repeat_count(&icon_anim, 3/*LV_ANIM_REPEAT_INFINITE*/);
382     scan_btn_cb(NULL);
383 
384     timer = lv_timer_create(wifi_update, 1000, NULL);
385     lv_timer_enable(timer);
386 
387     init_done = 1;
388 
389     return bg;
390 }
391 
menu_wifi_deinit(void)392 void menu_wifi_deinit(void)
393 {
394     init_done = 0;
395     lv_timer_del(timer);
396     lv_anim_set_deleted_cb(&icon_anim, NULL);
397     lv_anim_set_exec_cb(&icon_anim, NULL);
398     lv_anim_del(&icon_anim, NULL);
399     lv_obj_del(bg);
400     bg = NULL;
401 }
402 
403