455 lines
13 KiB
C
455 lines
13 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stdint.h>
|
|
#include <time.h>
|
|
#include <unistd.h>
|
|
|
|
#include <lvgl/lvgl.h>
|
|
|
|
#include "main.h"
|
|
#include "cJSON.h"
|
|
#include "Rk_wifi.h"
|
|
#include "ui_resource.h"
|
|
#include "wifibt.h"
|
|
|
|
#if WIFIBT_EN
|
|
static int init_done = 0;
|
|
static int waiting_scanning = 0;
|
|
|
|
static lv_obj_t *bg;
|
|
static lv_obj_t *item_scan;
|
|
static lv_obj_t *item_scan_icon;
|
|
|
|
static lv_obj_t *part_switch;
|
|
static lv_obj_t *part_saved;
|
|
static lv_obj_t *part_scaned;
|
|
|
|
static lv_obj_t *wifi_label;
|
|
static lv_obj_t *wifi_switch;
|
|
|
|
static lv_obj_t *item_label_saved;
|
|
static lv_obj_t *item_label_scaned;
|
|
|
|
static lv_obj_t *item_list_saved;
|
|
static lv_obj_t *item_list_scaned;
|
|
static lv_obj_t *item_label_current;
|
|
|
|
static lv_obj_t *kb;
|
|
|
|
static lv_timer_t *timer;
|
|
|
|
static lv_anim_t icon_anim;
|
|
|
|
static lv_style_t style_txt;
|
|
static lv_style_t style_list;
|
|
|
|
LV_IMG_DECLARE(wifi_none);
|
|
LV_IMG_DECLARE(wifi_wpa);
|
|
LV_IMG_DECLARE(wifi_wep);
|
|
LV_IMG_DECLARE(wifi_wpa3);
|
|
|
|
static const char *key_mgmts[] = {"NONE", "WPA", "WEP", "WPA3"};
|
|
static const lv_img_dsc_t *key_mgmt_icons[] =
|
|
{
|
|
&wifi_none, &wifi_wpa, &wifi_wep, &wifi_wpa3
|
|
};
|
|
|
|
static int last_state = -1;
|
|
|
|
static void lv_saved_wifi_list(lv_obj_t *parent);
|
|
static void connect_saved_wifi(lv_event_t *e);
|
|
static void connect_wifi(lv_event_t *e);
|
|
|
|
static lv_obj_t *btn_add_tag(lv_obj_t *btn, const char *txt)
|
|
{
|
|
lv_obj_t *label;
|
|
|
|
label = lv_label_create(btn);
|
|
lv_obj_remove_style_all(label);
|
|
lv_label_set_text(label, txt);
|
|
lv_obj_add_style(label, &style_txt, LV_PART_MAIN);
|
|
lv_obj_set_size(label, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
|
|
lv_obj_add_flag(label, LV_OBJ_FLAG_IGNORE_LAYOUT);
|
|
lv_obj_align(label, LV_ALIGN_RIGHT_MID, 0, 0);
|
|
|
|
return label;
|
|
}
|
|
|
|
static void read_saved_wifi(int check)
|
|
{
|
|
RK_WIFI_SAVED_INFO_s *wsi;
|
|
int ap_cnt = 0;
|
|
int start = 0;
|
|
|
|
RK_wifi_getSavedInfo(&wsi, &ap_cnt);
|
|
if (ap_cnt < 1)
|
|
{
|
|
printf("not found saved ap!\n");
|
|
return;
|
|
}
|
|
|
|
if ((strncmp(wsi[0].ssid, "SSID", 4) == 0))
|
|
{
|
|
start = 1;
|
|
if (ap_cnt <= 1)
|
|
{
|
|
printf("not found saved ap!\n");
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (!check)
|
|
return;
|
|
|
|
lv_obj_clean(item_list_saved);
|
|
item_label_current = NULL;
|
|
for (int i = start; i < ap_cnt; i++)
|
|
{
|
|
lv_obj_t *btn;
|
|
char *ssid, *bssid;
|
|
intptr_t key_mgmt = NONE;
|
|
ssid = wsi[i].ssid;
|
|
bssid = wsi[i].bssid;
|
|
printf("id: %d, name: %s, bssid: %s, state: %s\n",
|
|
wsi[i].id,
|
|
wsi[i].ssid,
|
|
wsi[i].bssid,
|
|
wsi[i].state);
|
|
if ((strncmp(wsi[i].ssid, "SSID", 4) == 0))
|
|
continue;
|
|
if (strstr(wsi[i].key_mgmt, "WPA3"))
|
|
key_mgmt = WPA3;
|
|
else if (strstr(wsi[i].key_mgmt, "WPA"))
|
|
key_mgmt = WPA;
|
|
else if (strstr(wsi[i].key_mgmt, "WEP"))
|
|
key_mgmt = WEP;
|
|
else
|
|
key_mgmt = NONE;
|
|
btn = lv_list_add_btn(item_list_saved, key_mgmt_icons[key_mgmt],
|
|
(ssid && (strlen(ssid) > 0)) ? ssid : bssid);
|
|
lv_obj_add_event_cb(btn, connect_saved_wifi, LV_EVENT_CLICKED, btn);
|
|
lv_obj_set_user_data(btn, (void *)key_mgmt);
|
|
if (strcmp(wsi[i].state, "[CURRENT]") == 0)
|
|
item_label_current = btn_add_tag(btn, "已连接");
|
|
}
|
|
lv_obj_refr_size(part_scaned);
|
|
lv_obj_refr_pos(part_scaned);
|
|
lv_obj_align_to(item_scan, part_scaned, LV_ALIGN_OUT_TOP_RIGHT, 0, 0);
|
|
lv_obj_align_to(item_scan_icon, item_scan, LV_ALIGN_CENTER, 0, 0);
|
|
|
|
if (wsi != NULL)
|
|
free(wsi);
|
|
}
|
|
|
|
static void style_init(void)
|
|
{
|
|
lv_style_init(&style_txt);
|
|
lv_style_set_text_font(&style_txt, ttf_main_s.font);
|
|
lv_style_set_text_color(&style_txt, lv_color_make(0xff, 0x23, 0x23));
|
|
|
|
lv_style_init(&style_list);
|
|
lv_style_set_text_font(&style_list, ttf_main_m.font);
|
|
lv_style_set_text_color(&style_list, lv_color_black());
|
|
}
|
|
|
|
static void event_cb(lv_event_t *e)
|
|
{
|
|
lv_obj_t *obj = lv_event_get_target(e);
|
|
lv_obj_t *ibox = lv_obj_get_parent(obj);
|
|
lv_obj_t *list_btn = lv_event_get_user_data(e);
|
|
const char *ssid;
|
|
const char *psk;
|
|
intptr_t key_mgmt = NONE;
|
|
|
|
if (strcmp(lv_inputbox_get_active_btn_text(ibox), "确认") == 0)
|
|
{
|
|
ssid = lv_list_get_btn_text(item_list_scaned, list_btn);
|
|
psk = lv_textarea_get_text(lv_inputbox_get_text_area(ibox));
|
|
key_mgmt = (intptr_t)lv_obj_get_user_data(list_btn);
|
|
printf("connect %s, %s, %s\n", ssid, psk, key_mgmts[key_mgmt]);
|
|
|
|
if (RK_wifi_connect((char *)ssid, (char *)psk, key_mgmt, NULL) < 0)
|
|
printf("RK_wifi_connect1 fail!\n");
|
|
last_state = -1;
|
|
|
|
read_saved_wifi(init_done);
|
|
}
|
|
lv_msgbox_close(ibox);
|
|
lv_obj_del(kb);
|
|
}
|
|
|
|
static void connect_saved_wifi(lv_event_t *e)
|
|
{
|
|
lv_obj_t *btn = lv_event_get_user_data(e);
|
|
const char *ssid;
|
|
const char *psk;
|
|
intptr_t key_mgmt = NONE;
|
|
|
|
ssid = lv_list_get_btn_text(item_list_saved, btn);
|
|
key_mgmt = (intptr_t)lv_obj_get_user_data(btn);
|
|
printf("try to connect saved wifi [%s, %s]\n", ssid, key_mgmts[key_mgmt]);
|
|
if (item_label_current)
|
|
lv_obj_del(item_label_current);
|
|
item_label_current = btn_add_tag(btn, "正在连接");
|
|
int ret = RK_wifi_connect_with_ssid(ssid, key_mgmt);
|
|
printf("RK_wifi_connect_with_ssid ret = %d\n", ret);
|
|
last_state = -1;
|
|
}
|
|
|
|
static void connect_wifi(lv_event_t *e)
|
|
{
|
|
char title[128];
|
|
static const char *btns_txt[] = {"确认", "取消", ""};
|
|
|
|
waiting_scanning = 0;
|
|
lv_obj_t *btn = lv_event_get_user_data(e);
|
|
printf("try connect %s\n", lv_list_get_btn_text(item_list_scaned, btn));
|
|
snprintf(title, sizeof(title), "连接到%s",
|
|
lv_list_get_btn_text(item_list_scaned, btn));
|
|
|
|
lv_obj_t *ibox = lv_inputbox_create(NULL, title, "请输入密码", btns_txt,
|
|
false);
|
|
lv_obj_t *btns = lv_inputbox_get_btns(ibox);
|
|
lv_obj_set_size(btns, lv_pct(50), lv_pct(15));
|
|
lv_obj_add_event_cb(ibox, event_cb, LV_EVENT_VALUE_CHANGED, btn);
|
|
lv_obj_add_style(ibox, &style_txt, LV_PART_MAIN);
|
|
lv_obj_set_size(ibox, lv_pct(80), lv_pct(50));
|
|
lv_obj_align(ibox, LV_ALIGN_TOP_MID, 0, lv_pct(15));
|
|
|
|
kb = lv_keyboard_create(lv_layer_sys());
|
|
lv_obj_set_size(kb, lv_pct(100), lv_pct(30));
|
|
lv_obj_set_align(kb, LV_ALIGN_BOTTOM_MID);
|
|
lv_keyboard_set_textarea(kb, lv_inputbox_get_text_area(ibox));
|
|
}
|
|
|
|
static void icon_anim_deled(lv_anim_t *anim)
|
|
{
|
|
if (!init_done)
|
|
return;
|
|
|
|
lv_obj_clear_flag(item_scan, LV_OBJ_FLAG_HIDDEN);
|
|
lv_obj_add_flag(item_scan_icon, LV_OBJ_FLAG_HIDDEN);
|
|
}
|
|
|
|
static void icon_anim_end(lv_anim_t *anim)
|
|
{
|
|
static cJSON *aps = NULL;
|
|
char *scan_r;
|
|
|
|
if (!init_done)
|
|
return;
|
|
|
|
lv_obj_clear_flag(item_scan, LV_OBJ_FLAG_HIDDEN);
|
|
lv_obj_add_flag(item_scan_icon, LV_OBJ_FLAG_HIDDEN);
|
|
|
|
scan_r = RK_wifi_scan_r();
|
|
if (!scan_r)
|
|
return;
|
|
|
|
aps = cJSON_Parse(scan_r);
|
|
if (aps)
|
|
{
|
|
cJSON *sub;
|
|
lv_obj_clean(item_list_scaned);
|
|
cJSON_ArrayForEach(sub, aps)
|
|
{
|
|
lv_obj_t *btn;
|
|
char *ssid;
|
|
char *bssid;
|
|
char *flags;
|
|
intptr_t key_mgmt = NONE;
|
|
|
|
/* For debug */
|
|
/*
|
|
char *info = cJSON_Print(sub);
|
|
printf("#[%s]#\n", info);
|
|
free(info);
|
|
*/
|
|
|
|
ssid = cJSON_GetStringValue(cJSON_GetObjectItem(sub, "ssid"));
|
|
bssid = cJSON_GetStringValue(cJSON_GetObjectItem(sub, "bssid"));
|
|
flags = cJSON_GetStringValue(cJSON_GetObjectItem(sub, "flags"));
|
|
|
|
if (strstr(flags, "WPA3"))
|
|
key_mgmt = WPA3;
|
|
else if (strstr(flags, "WPA"))
|
|
key_mgmt = WPA;
|
|
else if (strstr(flags, "WEP"))
|
|
key_mgmt = WEP;
|
|
else
|
|
key_mgmt = NONE;
|
|
|
|
btn = lv_list_add_btn(item_list_scaned, key_mgmt_icons[key_mgmt],
|
|
(ssid && (strlen(ssid) > 0)) ? ssid : bssid);
|
|
lv_obj_add_event_cb(btn, connect_wifi, LV_EVENT_CLICKED, btn);
|
|
lv_obj_set_user_data(btn, (void *)key_mgmt);
|
|
}
|
|
cJSON_Delete(aps);
|
|
}
|
|
free(scan_r);
|
|
}
|
|
|
|
static void icon_anim_cb(void *var, int32_t v)
|
|
{
|
|
lv_img_set_angle(var, v);
|
|
}
|
|
|
|
static void scan_btn_cb(lv_event_t *e)
|
|
{
|
|
lv_obj_add_flag(item_scan, LV_OBJ_FLAG_HIDDEN);
|
|
lv_obj_clear_flag(item_scan_icon, LV_OBJ_FLAG_HIDDEN);
|
|
lv_anim_start(&icon_anim);
|
|
RK_wifi_scan();
|
|
waiting_scanning = 1;
|
|
}
|
|
|
|
static void label_drawed_cb(lv_event_t *e)
|
|
{
|
|
if (!item_scan)
|
|
return;
|
|
|
|
lv_obj_align_to(item_scan, lv_event_get_target(e),
|
|
LV_ALIGN_OUT_TOP_RIGHT, 0, 0);
|
|
}
|
|
|
|
static void wifi_update(lv_timer_t *timer)
|
|
{
|
|
if (last_state != wifi_connected())
|
|
{
|
|
last_state = wifi_connected();
|
|
if (last_state)
|
|
read_saved_wifi(init_done);
|
|
}
|
|
if (waiting_scanning == 1
|
|
&& wifi_scanning_done())
|
|
{
|
|
waiting_scanning = 0;
|
|
lv_anim_del(&icon_anim, NULL);
|
|
icon_anim_end(NULL);
|
|
}
|
|
}
|
|
|
|
static struct wifibt_cmdarg cmdarg;
|
|
static void switch_toggled(lv_event_t *e)
|
|
{
|
|
int en;
|
|
if (e->code == LV_EVENT_VALUE_CHANGED)
|
|
{
|
|
en = lv_obj_has_state(wifi_switch, LV_STATE_CHECKED);
|
|
if (en)
|
|
cmdarg.cmd = WIFI_ENABLE;
|
|
else
|
|
cmdarg.cmd = WIFI_DISABLE;
|
|
wifi_query(&cmdarg, sizeof(cmdarg));
|
|
if (en)
|
|
scan_btn_cb(NULL);
|
|
}
|
|
}
|
|
|
|
lv_obj_t *menu_wifi_init(lv_obj_t *parent)
|
|
{
|
|
style_init();
|
|
|
|
bg = lv_img_create(parent);
|
|
lv_obj_remove_style_all(bg);
|
|
lv_obj_set_size(bg, lv_pct(100), lv_pct(100));
|
|
lv_obj_set_flex_flow(bg, LV_FLEX_FLOW_COLUMN);
|
|
lv_obj_center(bg);
|
|
|
|
part_switch = lv_obj_create(bg);
|
|
//lv_obj_remove_style_all(part_switch);
|
|
lv_obj_set_width(part_switch, lv_pct(100));
|
|
lv_obj_set_height(part_switch, LV_SIZE_CONTENT);
|
|
lv_obj_add_style(part_switch, &style_txt, LV_PART_MAIN);
|
|
|
|
wifi_label = lv_label_create(part_switch);
|
|
lv_obj_align(wifi_label, LV_ALIGN_LEFT_MID, 0, 0);
|
|
lv_label_set_text(wifi_label, "WIFI");
|
|
lv_obj_add_style(wifi_label, &style_txt, LV_PART_MAIN);
|
|
wifi_switch = lv_switch_create(part_switch);
|
|
lv_obj_align(wifi_switch, LV_ALIGN_RIGHT_MID, 0, 0);
|
|
lv_obj_add_event_cb(wifi_switch, switch_toggled, LV_EVENT_VALUE_CHANGED, NULL);
|
|
if (wifi_enabled())
|
|
lv_obj_add_state(wifi_switch, LV_STATE_CHECKED);
|
|
|
|
item_label_saved = lv_label_create(bg);
|
|
lv_label_set_text(item_label_saved, "已保存网络");
|
|
lv_obj_add_style(item_label_saved, &style_txt, LV_PART_MAIN);
|
|
|
|
part_saved = lv_obj_create(bg);
|
|
lv_obj_remove_style_all(part_saved);
|
|
lv_obj_set_width(part_saved, lv_pct(100));
|
|
lv_obj_set_height(part_saved, LV_SIZE_CONTENT);
|
|
lv_obj_set_flex_flow(part_saved, LV_FLEX_FLOW_COLUMN);
|
|
|
|
item_label_scaned = lv_label_create(bg);
|
|
lv_label_set_text(item_label_scaned, "可用网络");
|
|
lv_obj_add_style(item_label_scaned, &style_txt, LV_PART_MAIN);
|
|
|
|
part_scaned = lv_obj_create(bg);
|
|
lv_obj_remove_style_all(part_scaned);
|
|
lv_obj_set_width(part_scaned, lv_pct(100));
|
|
lv_obj_set_height(part_scaned, LV_SIZE_CONTENT);
|
|
lv_obj_set_flex_flow(part_scaned, LV_FLEX_FLOW_COLUMN);
|
|
lv_obj_refr_size(part_scaned);
|
|
lv_obj_refr_pos(part_scaned);
|
|
|
|
item_list_saved = lv_list_create(part_saved);
|
|
lv_obj_set_size(item_list_saved, lv_pct(100), LV_SIZE_CONTENT);
|
|
lv_obj_add_style(item_list_saved, &style_list, LV_PART_MAIN);
|
|
lv_list_add_btn(item_list_saved, NULL, "无");
|
|
item_label_current = NULL;
|
|
|
|
item_list_scaned = lv_list_create(part_scaned);
|
|
lv_obj_set_size(item_list_scaned, lv_pct(100), LV_SIZE_CONTENT);
|
|
lv_obj_add_style(item_list_scaned, &style_list, LV_PART_MAIN);
|
|
lv_list_add_btn(item_list_scaned, NULL, "无");
|
|
|
|
item_scan = lv_label_create(bg);
|
|
lv_label_set_text(item_scan, "刷新");
|
|
lv_obj_add_style(item_scan, &style_txt, LV_PART_MAIN);
|
|
lv_obj_align_to(item_scan, part_scaned, LV_ALIGN_OUT_TOP_RIGHT, 0, 0);
|
|
lv_obj_add_event_cb(item_scan, scan_btn_cb, LV_EVENT_CLICKED, NULL);
|
|
lv_obj_add_flag(item_scan, LV_OBJ_FLAG_CLICKABLE | LV_OBJ_FLAG_IGNORE_LAYOUT);
|
|
|
|
item_scan_icon = lv_img_create(bg);
|
|
lv_img_set_src(item_scan_icon, WIFI_SCANNING);
|
|
lv_img_set_angle(item_scan_icon, 0);
|
|
lv_obj_align_to(item_scan_icon, item_scan, LV_ALIGN_CENTER, 0, 0);
|
|
lv_obj_add_flag(item_scan_icon, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_IGNORE_LAYOUT);
|
|
|
|
if (wifi_enabled())
|
|
read_saved_wifi(1);
|
|
|
|
lv_anim_init(&icon_anim);
|
|
lv_anim_set_var(&icon_anim, item_scan_icon);
|
|
lv_anim_set_values(&icon_anim, 0, 3600);
|
|
lv_anim_set_time(&icon_anim, 1000);
|
|
lv_anim_set_exec_cb(&icon_anim, icon_anim_cb);
|
|
lv_anim_set_deleted_cb(&icon_anim, icon_anim_deled);
|
|
lv_anim_set_path_cb(&icon_anim, lv_anim_path_linear);
|
|
lv_anim_set_repeat_count(&icon_anim, 3/*LV_ANIM_REPEAT_INFINITE*/);
|
|
if (wifi_enabled())
|
|
scan_btn_cb(NULL);
|
|
|
|
timer = lv_timer_create(wifi_update, 1000, NULL);
|
|
lv_timer_enable(timer);
|
|
|
|
init_done = 1;
|
|
|
|
return bg;
|
|
}
|
|
|
|
void menu_wifi_deinit(void)
|
|
{
|
|
init_done = 0;
|
|
lv_timer_del(timer);
|
|
lv_anim_set_deleted_cb(&icon_anim, NULL);
|
|
lv_anim_set_exec_cb(&icon_anim, NULL);
|
|
lv_anim_del(&icon_anim, NULL);
|
|
lv_obj_del(bg);
|
|
bg = NULL;
|
|
}
|
|
#endif
|
|
|