Files
arcs/modules/lisaui/widgets/voice/lisa_ui_scr_setting_net.c
2026-08-13 16:50:52 +08:00

487 lines
18 KiB
C

#include "lvgl.h"
#include "lisa_ui.h"
#include "lisa_ui_assets.h"
#include "lisa_ui_src_base.h"
#include "lisa_ui_scr_setting_net.h"
#include "lisa_ui_scr_kb_input.h"
#include "stdio.h"
#include "lisa_ui_toast.h"
#include "stdio.h"
#define TAG "ui.setting.net"
static void lisa_ui_wifi_item_connecting(lv_obj_t *obj);
struct lisa_ui_scr_setting_net {
lisa_ui_scr_base_t base;
lv_obj_t *list_mine;
lv_obj_t *list_other;
lv_obj_t *curr_item;
lv_obj_t *cont_switch;
lv_obj_t *label_mine;
lv_obj_t *label_other;
bool connecting;
};
typedef struct lisa_ui_scr_setting_net lisa_ui_scr_setting_net_t;
static void lisa_ui_scr_setting_net_constructor(const lv_obj_class_t *class_p, lv_obj_t *obj);
const lv_obj_class_t lv_lisa_ui_scr_setting_net_class = {
.constructor_cb = lisa_ui_scr_setting_net_constructor,
.base_class = &lisa_ui_base_class,
.instance_size = sizeof(lisa_ui_scr_setting_net_t),
};
#define MY_CLASS &lv_lisa_ui_scr_setting_net_class
enum {
LISA_UI_WIFI_LIST_ITEM_STATE_NONE = 0,
LISA_UI_WIFI_LIST_ITEM_STATE_CONNECTING,
LISA_UI_WIFI_LIST_ITEM_STATE_CONNECTED,
};
typedef struct {
lv_obj_t obj;
lv_obj_t *status_anim;
lv_obj_t *lbl;
lv_obj_t *img;
bool encrypted;
lisa_ui_scr_setting_net_wifi_connecting_cb_t cb;
void *user_data;
uint8_t state;
lv_obj_t *scr;
} lisa_ui_wifi_list_item_t;
const lv_obj_class_t lv_lisa_ui_wifi_list_item_class = {
.base_class = &lv_btn_class,
.instance_size = sizeof(lisa_ui_wifi_list_item_t),
};
const void *ic_wifi_connecting[] = {
&loading_00,
&loading_01,
&loading_02,
&loading_03,
&loading_04,
&loading_05,
&loading_06,
&loading_07,
&loading_08,
&loading_10,
&loading_11,
&loading_12,
&loading_13,
&loading_14,
};
const void *ic_wifi_connected[] = {
&ic_ok,
};
const void *ic_wifi_encrypted_list[] = {
&ic_wifi_list_0,
&ic_wifi_list_1,
&ic_wifi_list_2,
&ic_wifi_list_3,
};
static void lisa_ui_scr_setting_net_switch_event_cb(lv_event_t *event)
{
lv_obj_t *obj = lv_event_get_target(event);
lv_event_code_t code = lv_event_get_code(event);
lisa_ui_scr_setting_net_t *scr_setting_net = (lisa_ui_scr_setting_net_t *)lv_event_get_user_data(event);
uint32_t state = lv_obj_get_state(obj);
if (code == LV_EVENT_VALUE_CHANGED) {
lv_event_send((lv_obj_t*)scr_setting_net, LV_EVENT_VALUE_CHANGED, &state);
}
}
static void lisa_ui_scr_setting_net_constructor(const lv_obj_class_t *class_p, lv_obj_t *obj)
{
lv_obj_t *container = lisa_ui_scr_base_container_get(obj);
lisa_ui_scr_setting_net_t *scr_setting_net = (lisa_ui_scr_setting_net_t *)obj;
lv_obj_set_flex_flow(container, LV_FLEX_FLOW_COLUMN);
lv_obj_set_flex_grow(container, 1);
lv_obj_t *cont = lv_obj_create(container);
lv_obj_set_size(cont, LV_PCT(100), LV_SIZE_CONTENT);
lv_obj_set_style_bg_opa(cont, LV_OPA_60, LV_PART_MAIN);
lv_obj_set_style_border_width(cont, 0, LV_PART_MAIN);
lv_obj_t *cont_label = lv_label_create(cont);
lv_obj_align(cont_label, LV_ALIGN_LEFT_MID, 0, 0);
lv_label_set_text(cont_label, "无线局域网");
lv_obj_set_style_text_font(cont_label, &lv_font_chinese_18, LV_PART_MAIN);
lv_obj_t *cont_switch = lv_switch_create(cont);
lv_obj_align(cont_switch, LV_ALIGN_RIGHT_MID, 0, 0);
// lv_obj_add_state(cont_switch, LV_STATE_CHECKED);
lv_obj_set_style_bg_color(cont_switch, lv_color_hex(0xFABE00), LV_PART_INDICATOR);
lv_obj_add_event_cb(cont_switch, lisa_ui_scr_setting_net_switch_event_cb, LV_EVENT_VALUE_CHANGED, obj);
scr_setting_net->cont_switch = cont_switch;
lv_obj_t *label = lv_label_create(container);
lv_label_set_text(label, "我的");
lv_obj_set_style_text_font(label, &lv_font_chinese_18, LV_PART_MAIN);
scr_setting_net->label_mine = label;
scr_setting_net->list_mine = lv_list_create(container);
lv_obj_set_size(scr_setting_net->list_mine, LV_PCT(100), LV_SIZE_CONTENT);
lv_obj_set_style_bg_opa(scr_setting_net->list_mine, LV_OPA_60, LV_PART_MAIN);
// lv_obj_set_style_border_width(scr_setting_net->list_mine, 0, LV_PART_MAIN);
label = lv_label_create(container);
lv_label_set_text(label, "其他");
scr_setting_net->label_other = label;
lv_obj_set_style_text_font(label, &lv_font_chinese_18, LV_PART_MAIN);
scr_setting_net->list_other = lv_list_create(container);
lv_obj_set_size(scr_setting_net->list_other, LV_PCT(100), LV_SIZE_CONTENT);
lv_obj_set_style_bg_opa(scr_setting_net->list_other, LV_OPA_60, LV_PART_MAIN);
// lv_obj_set_style_border_width(scr_setting_net->list_other, 0, LV_PART_MAIN);
scr_setting_net->connecting = false;
}
static void lisa_ui_scr_kb_input_ready_event_cb(lv_event_t *event)
{
lv_event_code_t code = lv_event_get_code(event);
if (code == LV_EVENT_READY) {
lv_obj_t *obj = lv_event_get_target(event);
const char *password = lisa_ui_scr_kb_input_get_text(obj);
if (password == NULL || strlen(password) < 8) {
lisa_ui_toast_show("密码长度必须大于8");
return;
}
lisa_ui_wifi_list_item_t *item = (lisa_ui_wifi_list_item_t *)lv_event_get_user_data(event);
item->cb(lv_label_get_text(item->lbl), password, item->encrypted, false, item->user_data);
lisa_ui_wifi_item_connecting((lv_obj_t *)item);
lv_obj_del(obj);
lisa_ui_scr_setting_net_t *scr_setting_net = (lisa_ui_scr_setting_net_t *)item->scr;
scr_setting_net->connecting = false;
LOGI("lisa_ui_scr_kb_input_ready_event_cb, connecting:%d\n",scr_setting_net->connecting);
}
}
static void lisa_ui_scr_kb_input_cancel_event_cb(lv_event_t *event)
{
lv_event_code_t code = lv_event_get_code(event);
if (code == LV_EVENT_CANCEL) {
lv_obj_t *obj = lv_event_get_target(event);
lisa_ui_wifi_list_item_t *item = (lisa_ui_wifi_list_item_t *)lv_event_get_user_data(event);
lisa_ui_scr_setting_net_t *scr_setting_net = (lisa_ui_scr_setting_net_t *)item->scr;
scr_setting_net->connecting = false;
lv_obj_del(obj);
}
}
static void lisa_ui_wifi_list_item_click_event_cb(lv_event_t *event)
{
lisa_ui_wifi_list_item_t *item = (lisa_ui_wifi_list_item_t *)lv_event_get_target(event);
lv_event_code_t code = lv_event_get_code(event);
if (code != LV_EVENT_CLICKED) {
return;
}
if (item->state == LISA_UI_WIFI_LIST_ITEM_STATE_CONNECTING ||
item->state == LISA_UI_WIFI_LIST_ITEM_STATE_CONNECTED) {
return;
}
lv_obj_t *list = lv_obj_get_parent((lv_obj_t *)item);
lisa_ui_scr_setting_net_t *scr_setting_net = (lisa_ui_scr_setting_net_t *)item->scr;
scr_setting_net->connecting = true;
LOGI("lisa_ui_wifi_list_item_click_event_cb, connecting:%d\n",scr_setting_net->connecting);
if (list == scr_setting_net->list_mine) {
item->cb(lv_label_get_text(item->lbl), NULL, item->encrypted, true, item->user_data);
scr_setting_net->connecting = false;
LOGI("lisa_ui_wifi_list_item_click_event_cb, list_mine, connecting:%d\n",scr_setting_net->connecting);
} else {
if (!item->encrypted) {
item->cb(lv_label_get_text(item->lbl), NULL, false, false, item->user_data);
scr_setting_net->connecting = false;
LOGI("lisa_ui_wifi_list_item_click_event_cb, list_other, connecting:%d\n",scr_setting_net->connecting);
} else {
lv_obj_t *scr_kb_input = lisa_ui_scr_kb_input_create();
const char *title = lv_label_get_text(item->lbl);
lisa_ui_scr_kb_input_set_title(scr_kb_input, title);
lisa_ui_scr_kb_input_set_tips(scr_kb_input, "请输入WiFi密码");
lv_obj_add_event_cb(scr_kb_input, lisa_ui_scr_kb_input_ready_event_cb, LV_EVENT_READY, item);
lv_obj_add_event_cb(scr_kb_input, lisa_ui_scr_kb_input_cancel_event_cb, LV_EVENT_CANCEL, item);
}
}
}
static lv_obj_t *lisa_ui_wifi_list_item_add(lv_obj_t *list, const char *txt, bool encrypted,uint8_t rssi_level,uint8_t connect_state,
lisa_ui_scr_setting_net_wifi_connecting_cb_t cb, void *user_data)
{
lv_obj_t *obj = lv_obj_class_create_obj(&lv_lisa_ui_wifi_list_item_class, list);
lv_obj_class_init_obj(obj);
lv_obj_set_style_border_side(obj, LV_BORDER_SIDE_BOTTOM, LV_PART_MAIN);
lv_obj_set_style_border_width(obj, 1, LV_PART_MAIN);
lv_obj_set_style_border_color(obj, lv_color_hex(0xCCCCCC), LV_PART_MAIN);
lv_obj_set_style_bg_opa(obj, LV_OPA_TRANSP, LV_PART_MAIN);
static lv_style_t style;
lv_style_init(&style);
lv_style_set_border_side(&style, LV_BORDER_SIDE_BOTTOM);
lv_style_set_border_width(&style, 1);
lv_style_set_border_color(&style, lv_color_hex(0xFABE00));
lv_obj_add_style(obj, &style, LV_STATE_PRESSED);
lisa_ui_wifi_list_item_t *item = (lisa_ui_wifi_list_item_t *)obj;
item->cb = cb;
item->encrypted = encrypted;
item->user_data = user_data;
lv_obj_set_size(obj, LV_PCT(100), LV_SIZE_CONTENT);
lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW);
lv_obj_set_style_flex_main_place(obj, LV_FLEX_ALIGN_START, LV_PART_MAIN);
lv_obj_set_style_flex_main_place(obj, LV_FLEX_ALIGN_END, LV_PART_MAIN);
lv_obj_set_style_flex_cross_place(obj, LV_FLEX_ALIGN_CENTER, LV_PART_MAIN);
item->lbl = lv_label_create(obj);
// lv_obj_set_size(item->lbl, LV_PCT(80), LV_SIZE_CONTENT);
lv_label_set_text(item->lbl, txt);
lv_label_set_long_mode(item->lbl, LV_LABEL_LONG_SCROLL_CIRCULAR);
lv_obj_set_style_text_font(item->lbl, &lv_font_chinese_18, LV_PART_MAIN);
lv_obj_set_style_flex_grow(item->lbl, 1, LV_PART_MAIN);
lv_obj_set_style_pad_right(item->lbl, 5, LV_PART_MAIN);
uint8_t level = rssi_level >= sizeof(ic_wifi_encrypted_list) / sizeof(ic_wifi_encrypted_list[0])
? sizeof(ic_wifi_encrypted_list) / sizeof(ic_wifi_encrypted_list[0]) - 1
: rssi_level;
item->status_anim = lv_animimg_create(obj);
lv_img_set_src(item->status_anim, ic_wifi_encrypted_list[level]);
lv_obj_set_style_pad_ver(item->status_anim, 5, LV_PART_MAIN);
item->img = lv_img_create(obj);
const void *icon = encrypted ? &ic_wifi_lock_1 : &ic_wifi_list_1;
lv_img_set_src(item->img, icon);
lv_obj_set_size(item->img, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
lv_obj_set_style_pad_ver(item->img, 5, LV_PART_MAIN);
lv_obj_add_flag(item->img, LV_OBJ_FLAG_HIDDEN);
// lv_obj_add_flag(item->status_anim, LV_OBJ_FLAG_HIDDEN);
lv_obj_add_event_cb((lv_obj_t *)item, lisa_ui_wifi_list_item_click_event_cb, LV_EVENT_CLICKED, obj);
lv_obj_add_flag((lv_obj_t *)item, LV_OBJ_FLAG_CLICKABLE);
lv_obj_set_user_data((lv_obj_t *)item, lv_obj_get_parent(list));
item->state = LISA_UI_WIFI_LIST_ITEM_STATE_NONE;
return obj;
}
static lv_obj_t *lisa_ui_wifi_list_item_get_by_txt(lv_obj_t *list, const char *txt)
{
int cnt = lv_obj_get_child_cnt(list);
for (int i = 0; i < cnt; i++) {
lv_obj_t *child = lv_obj_get_child(list, i);
lisa_ui_wifi_list_item_t *item = (lisa_ui_wifi_list_item_t *)child;
if (strcmp(lv_label_get_text(item->lbl), txt) == 0) {
return child;
}
}
return NULL;
}
static const char *lisa_ui_wifi_list_item_get_txt(lv_obj_t *obj)
{
lisa_ui_wifi_list_item_t *item = (lisa_ui_wifi_list_item_t *)obj;
return lv_label_get_text(item->lbl);
}
static void lisa_ui_wifi_list_item_cb(const char *ssid, const char *pwd, bool is_encrypted, bool is_mine,
void *user_data)
{
LOGI("ssid: %s, pwd: %s, is_encrypted: %d, is_mine: %d\n", ssid, pwd, is_encrypted, is_mine);
}
lv_obj_t *lisa_ui_scr_setting_net_create(lv_obj_t *parent)
{
lv_obj_t *obj = lv_obj_class_create_obj(MY_CLASS, parent);
lv_obj_class_init_obj(obj);
lisa_ui_scr_setting_net_t *scr_setting_net = (lisa_ui_scr_setting_net_t *)obj;
// lisa_ui_wifi_item_add_to_list_mine(obj, "WiFi1", false, lisa_ui_wifi_list_item_cb, NULL);
// lisa_ui_wifi_item_add_to_list_mine(obj, "WiFi2", true, lisa_ui_wifi_list_item_cb, NULL);
// lisa_ui_wifi_item_add_to_list_mine(obj, "WiFi3", false, lisa_ui_wifi_list_item_cb, NULL);
// lisa_ui_scr_setting_net_wifi_item_connecting(obj, "WiFi1");
// lisa_ui_scr_setting_net_wifi_item_connected(obj, "WiFi2");
// for (int i = 0; i < 10; i++) {
// lisa_ui_wifi_item_add_to_list_other(obj, "WiFi", true, lisa_ui_wifi_list_item_cb, NULL);
// }
return obj;
}
lv_obj_t *lisa_ui_wifi_item_add_to_list_other(lv_obj_t *obj, const char *txt, bool encrypted,uint8_t rssi_level,uint8_t connect_state,
lisa_ui_scr_setting_net_wifi_connecting_cb_t cb, void *user_data)
{
lisa_ui_scr_setting_net_t *scr_setting_net = (lisa_ui_scr_setting_net_t *)obj;
if (scr_setting_net->connecting) {
return NULL;
}
lisa_ui_wifi_list_item_t *item = (lisa_ui_wifi_list_item_t *)lisa_ui_wifi_list_item_add(scr_setting_net->list_other, txt, encrypted,rssi_level,connect_state, cb, user_data);
item->scr = obj;
return (lv_obj_t *)item;
}
lv_obj_t *lisa_ui_wifi_item_add_to_list_mine(lv_obj_t *obj, const char *txt, bool encrypted,uint8_t rssi_level,uint8_t connect_state,
lisa_ui_scr_setting_net_wifi_connecting_cb_t cb, void *user_data)
{
lisa_ui_scr_setting_net_t *scr_setting_net = (lisa_ui_scr_setting_net_t *)obj;
if (scr_setting_net->connecting) {
return NULL;
}
lisa_ui_wifi_list_item_t *item = (lisa_ui_wifi_list_item_t *)lisa_ui_wifi_list_item_add(scr_setting_net->list_mine, txt, encrypted, rssi_level,
connect_state, cb, user_data);
lv_obj_clear_flag((lv_obj_t *)item, LV_OBJ_FLAG_CLICKABLE);
item->scr = obj;
return (lv_obj_t *)item;
}
static void lisa_ui_wifi_item_connecting(lv_obj_t *obj)
{
lisa_ui_wifi_list_item_t *item = (lisa_ui_wifi_list_item_t *)obj;
lv_animimg_set_src(item->status_anim, ic_wifi_connecting,
sizeof(ic_wifi_connecting) / sizeof(ic_wifi_connecting[0]));
lv_animimg_set_duration(item->status_anim, 1000);
lv_animimg_set_repeat_count(item->status_anim, LV_ANIM_REPEAT_INFINITE);
lv_animimg_start(item->status_anim);
item->state = LISA_UI_WIFI_LIST_ITEM_STATE_CONNECTING;
}
void lisa_ui_scr_setting_net_wifi_item_connecting(lv_obj_t *obj, const char *txt)
{
lisa_ui_scr_setting_net_t *scr_setting_net = (lisa_ui_scr_setting_net_t *)obj;
lisa_ui_wifi_list_item_t *item =
(lisa_ui_wifi_list_item_t *)lisa_ui_wifi_list_item_get_by_txt(scr_setting_net->list_mine, txt);
if (item == NULL) {
item = (lisa_ui_wifi_list_item_t *)lisa_ui_wifi_list_item_get_by_txt(scr_setting_net->list_other, txt);
}
if (item == NULL) {
return;
}
lisa_ui_wifi_item_connecting((lv_obj_t *)item);
lv_obj_set_parent((lv_obj_t *)item, scr_setting_net->list_mine);
lv_obj_move_to_index((lv_obj_t *)item, 0);
}
void lisa_ui_scr_setting_net_wifi_item_connected(lv_obj_t *obj, const char *txt)
{
lisa_ui_scr_setting_net_t *scr_setting_net = (lisa_ui_scr_setting_net_t *)obj;
lisa_ui_wifi_list_item_t *item =
(lisa_ui_wifi_list_item_t *)lisa_ui_wifi_list_item_get_by_txt(scr_setting_net->list_mine, txt);
if (item == NULL) {
item = (lisa_ui_wifi_list_item_t *)lisa_ui_wifi_list_item_get_by_txt(scr_setting_net->list_other, txt);
}
if (item == NULL) {
return;
}
lisa_ui_wifi_list_item_t *prev = (lisa_ui_wifi_list_item_t *)lv_obj_get_child(scr_setting_net->list_mine, 0);
if (prev != NULL) {
lv_obj_add_flag(prev->status_anim, LV_OBJ_FLAG_HIDDEN);
}
lv_obj_set_parent((lv_obj_t *)item, scr_setting_net->list_mine);
lv_obj_move_to_index((lv_obj_t *)item, 0);
lv_animimg_set_repeat_count(item->status_anim, 1);
lv_animimg_set_duration(item->status_anim, 100);
lv_animimg_set_src(item->status_anim, ic_wifi_connected, sizeof(ic_wifi_connected) / sizeof(ic_wifi_connected[0]));
lv_animimg_start(item->status_anim);
lv_obj_clear_flag(item->status_anim, LV_OBJ_FLAG_HIDDEN);
item->state = LISA_UI_WIFI_LIST_ITEM_STATE_CONNECTED;
}
void lisa_ui_scr_setting_net_wifi_item_connecting_failed(lv_obj_t *obj, const char *txt)
{
lisa_ui_scr_setting_net_t *scr_setting_net = (lisa_ui_scr_setting_net_t *)obj;
lisa_ui_wifi_list_item_t *item =
(lisa_ui_wifi_list_item_t *)lisa_ui_wifi_list_item_get_by_txt(scr_setting_net->list_mine, txt);
if (item == NULL) {
item = (lisa_ui_wifi_list_item_t *)lisa_ui_wifi_list_item_get_by_txt(scr_setting_net->list_other, txt);
}
if (item == NULL) {
return;
}
lv_animimg_set_repeat_count(item->status_anim, 1);
lv_animimg_set_duration(item->status_anim, 100);
lv_animimg_set_src(item->status_anim, ic_wifi_connected, sizeof(ic_wifi_connected) / sizeof(ic_wifi_connected[0]));
lv_animimg_start(item->status_anim);
scr_setting_net->curr_item = NULL;
}
void lisa_ui_scr_setting_net_wifi_list_clear(lv_obj_t *obj)
{
lisa_ui_scr_setting_net_t *scr_setting_net = (lisa_ui_scr_setting_net_t *)obj;
if (scr_setting_net->connecting) {
return;
}
lv_obj_clean(scr_setting_net->list_mine);
lv_obj_clean(scr_setting_net->list_other);
}
int lisa_ui_scr_setting_net_switch_add_state(const lv_obj_t *obj, lv_state_t state)
{
lisa_ui_scr_setting_net_t *scr_setting_net = (lisa_ui_scr_setting_net_t *)obj;
if (state & LV_STATE_CHECKED) {
lv_obj_clear_flag(scr_setting_net->label_mine, LV_OBJ_FLAG_HIDDEN);
lv_obj_clear_flag(scr_setting_net->list_mine, LV_OBJ_FLAG_HIDDEN);
lv_obj_clear_flag(scr_setting_net->label_other, LV_OBJ_FLAG_HIDDEN);
lv_obj_clear_flag(scr_setting_net->list_other, LV_OBJ_FLAG_HIDDEN);
}
lv_obj_add_state(scr_setting_net->cont_switch, state);
}
int lisa_ui_scr_setting_net_switch_clear_state(const lv_obj_t *obj, lv_state_t state)
{
lisa_ui_scr_setting_net_t *scr_setting_net = (lisa_ui_scr_setting_net_t *)obj;
if (state & LV_STATE_CHECKED) {
lv_obj_add_flag(scr_setting_net->label_mine, LV_OBJ_FLAG_HIDDEN);
lv_obj_add_flag(scr_setting_net->list_mine, LV_OBJ_FLAG_HIDDEN);
lv_obj_add_flag(scr_setting_net->label_other, LV_OBJ_FLAG_HIDDEN);
lv_obj_add_flag(scr_setting_net->list_other, LV_OBJ_FLAG_HIDDEN);
}
lv_obj_clear_state(scr_setting_net->cont_switch, state);
}
bool lisa_ui_scr_setting_net_is_connecting(lv_obj_t *obj)
{
lisa_ui_scr_setting_net_t *scr_setting_net = (lisa_ui_scr_setting_net_t *)obj;
LOGI("lisa_ui_scr_setting_net_is_connecting, connecting:%d\n",scr_setting_net->connecting);
return scr_setting_net->connecting;
}