Files
CYD-Klipper/CYD-Klipper-Display/src/ui/wifi_setup.cpp
2023-11-13 14:28:17 +01:00

159 lines
4.4 KiB
C++

#include "lvgl.h"
#include "wifi_setup.h"
#include "../conf/global_config.h"
#include "WiFi.h"
void wifi_init_inner();
static void reset_btn_event_handler(lv_event_t * e) {
lv_event_code_t code = lv_event_get_code(e);
if(code == LV_EVENT_CLICKED) {
global_config.wifiConfigured = false;
wifi_init_inner();
}
}
static void refresh_btn_event_handler(lv_event_t * e){
lv_event_code_t code = lv_event_get_code(e);
if(code == LV_EVENT_CLICKED) {
wifi_init_inner();
}
}
static void ta_event_cb(lv_event_t * e) {
lv_event_code_t code = lv_event_get_code(e);
lv_obj_t * ta = lv_event_get_target(e);
if (code == LV_EVENT_READY)
{
const char * txt = lv_textarea_get_text(ta);
int len = strlen(txt);
if (len > 0)
{
global_config.wifiConfigured = true;
strcpy(global_config.wifiPassword, txt);
WriteGlobalConfig();
wifi_init_inner();
}
}
else if (code == LV_EVENT_CANCEL)
{
wifi_init_inner();
}
}
void wifi_pass_entry(const char* ssid){
lv_obj_clean(lv_scr_act());
lv_obj_t * label = lv_label_create(lv_scr_act());
lv_label_set_text(label, "Enter WiFi Password");
lv_obj_align(label, LV_ALIGN_TOP_LEFT, 10, 10 + 2);
lv_obj_t * passEntry = lv_textarea_create(lv_scr_act());
lv_textarea_set_one_line(passEntry, true);
lv_textarea_set_text(passEntry, "");
lv_obj_align(passEntry, LV_ALIGN_TOP_LEFT, 10, 40);
lv_obj_add_event_cb(passEntry, ta_event_cb, LV_EVENT_ALL, NULL);
lv_obj_set_size(passEntry, TFT_HEIGHT - 20, 60);
lv_obj_t * keyboard = lv_keyboard_create(lv_scr_act());
lv_keyboard_set_textarea(keyboard, passEntry);
}
static void wifi_btn_event_handler(lv_event_t * e){
lv_event_code_t code = lv_event_get_code(e);
if(code == LV_EVENT_CLICKED) {
delay(100);
char* ssid = (char*)e->user_data;
strcpy(global_config.wifiSSID, ssid);
Serial.println(ssid);
wifi_pass_entry(ssid);
}
}
void wifi_init_inner(){
WiFi.disconnect();
if (global_config.wifiConfigured){
WiFi.begin(global_config.wifiSSID, global_config.wifiPassword);
lv_obj_clean(lv_scr_act());
lv_obj_t * label = lv_label_create(lv_scr_act());
lv_label_set_text(label, "Connecting to WiFi");
lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
lv_obj_t * resetBtn = lv_btn_create(lv_scr_act());
lv_obj_add_event_cb(resetBtn, reset_btn_event_handler, LV_EVENT_ALL, NULL);
lv_obj_align(resetBtn, LV_ALIGN_CENTER, 0, 40);
label = lv_label_create(resetBtn);
lv_label_set_text(label, "Reset");
lv_obj_center(label);
return;
}
lv_obj_clean(lv_scr_act());
lv_obj_t * label = lv_label_create(lv_scr_act());
lv_label_set_text(label, "Scanning for networks...");
lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
lv_timer_handler();
lv_task_handler();
lv_refr_now(NULL);
int n = WiFi.scanNetworks();
lv_obj_clean(lv_scr_act());
lv_obj_t * refreshBtn = lv_btn_create(lv_scr_act());
lv_obj_add_event_cb(refreshBtn, reset_btn_event_handler, LV_EVENT_ALL, NULL);
lv_obj_align(refreshBtn, LV_ALIGN_TOP_RIGHT, -5, 5 - 1);
label = lv_label_create(refreshBtn);
lv_label_set_text(label, LV_SYMBOL_REFRESH);
lv_obj_center(label);
label = lv_label_create(lv_scr_act());
lv_label_set_text(label, "Select a network");
lv_obj_align(label, LV_ALIGN_TOP_LEFT, 10, 10 + 2);
lv_obj_t * list = lv_list_create(lv_scr_act());
lv_obj_align(list, LV_ALIGN_TOP_LEFT, 10, 40);
lv_obj_set_size(list, TFT_HEIGHT - 20, TFT_WIDTH - 40 - 5);
for (int i = 0; i < n; ++i) {
const char* ssid = WiFi.SSID(i).c_str();
int len = strlen(ssid);
if (len == 0)
continue;
const char* ssid_copy = (const char*)malloc(len + 1);
strcpy((char*)ssid_copy, ssid);
lv_obj_t * btn = lv_list_add_btn(list, LV_SYMBOL_WIFI, ssid_copy);
lv_obj_add_event_cb(btn, wifi_btn_event_handler, LV_EVENT_ALL, (void*)ssid_copy);
}
}
void wifi_init(){
WiFi.mode(WIFI_STA);
wifi_init_inner();
while (!global_config.wifiConfigured || WiFi.status() != WL_CONNECTED){
lv_timer_handler();
lv_task_handler();
}
}
void wifi_ok(){
if (WiFi.status() != WL_CONNECTED){
ESP.restart();
}
}