#include "frame_wifiscan.h" #include "frame_wifipassword.h" #include #define MAX_BTN_NUM 14 #define MAX_WIFI_NUM (MAX_BTN_NUM - 1) bool _update_flag = false; EPDGUI_Button *_connect_key = NULL; const uint8_t *kIMGWifiLevel[4] = { NULL, ImageResource_item_icon_wifi_1_32x32, ImageResource_item_icon_wifi_2_32x32, ImageResource_item_icon_wifi_3_32x32 }; void key_wifi_cb(epdgui_args_vector_t &args) { if(((EPDGUI_Button*)(args[0]))->GetCustomString() == "_$refresh$_") { _update_flag = true; } else { _connect_key = (EPDGUI_Button*)(args[0]); Frame_Base *frame = EPDGUI_GetFrame("Frame_WifiPassword"); if(frame == NULL) { frame = new Frame_WifiPassword(false); EPDGUI_AddFrame("Frame_WifiPassword", frame); } EPDGUI_PushFrame(frame); *((int*)(args[1])) = 0; } } Frame_WifiScan::Frame_WifiScan(void) { _frame_name = "Frame_WifiScan"; for(int i = 0; i < MAX_BTN_NUM; i++) { _key_wifi[i] = new EPDGUI_Button(4, 100 + i * 60, 532, 61); _key_wifi[i]->SetHide(true); _key_wifi[i]->CanvasNormal()->setTextSize(26); _key_wifi[i]->CanvasNormal()->setTextDatum(CL_DATUM); _key_wifi[i]->CanvasNormal()->setTextColor(15); _key_wifi[i]->AddArgs(EPDGUI_Button::EVENT_RELEASED, 0, _key_wifi[i]); _key_wifi[i]->AddArgs(EPDGUI_Button::EVENT_RELEASED, 1, (void*)(&_is_run)); _key_wifi[i]->Bind(EPDGUI_Button::EVENT_RELEASED, key_wifi_cb); } exitbtn("Home"); _canvas_title->drawString("WLAN", 270, 34); _key_exit->AddArgs(EPDGUI_Button::EVENT_RELEASED, 0, (void*)(&_is_run)); _key_exit->Bind(EPDGUI_Button::EVENT_RELEASED, &Frame_Base::exit_cb); _update_flag = true; _connected = 0; } Frame_WifiScan::~Frame_WifiScan(void) { for(int i = 0; i < MAX_BTN_NUM; i++) { delete _key_wifi[i]; } } void Frame_WifiScan::DrawItem(EPDGUI_Button *btn, String ssid, int rssi) { int level = 0; if(rssi > -55) { level = 3; } else if(rssi > -88) { level = 2; } else { level = 1; } if(ssid.length() > 22) { ssid = ssid.substring(0, 22) + "..."; } btn->SetHide(false); btn->CanvasNormal()->fillCanvas(0); btn->CanvasNormal()->drawRect(0, 0, 532, 61, 15); btn->CanvasNormal()->drawString(ssid, 15, 35); btn->SetCustomString(ssid); btn->CanvasNormal()->pushImage(532 - 15 - 32, 14, 32, 32, kIMGWifiLevel[level]); *(btn->CanvasPressed()) = *(btn->CanvasNormal()); btn->CanvasPressed()->ReverseColor(); } int Frame_WifiScan::run() { if(_connect) { _connect = false; Connect(); } if(_update_flag) { _update_flag = false; scan(); } return 1; } int Frame_WifiScan::scan() { WiFi.mode(WIFI_STA); // WiFi.disconnect(); WiFi.scanNetworks(true); if(_scan_count > 0) { M5.EPD.WriteFullGram4bpp(GetWallpaper()); _canvas_title->pushCanvas(0, 8, UPDATE_MODE_NONE); _key_exit->Draw(UPDATE_MODE_NONE); M5.EPD.UpdateFull(UPDATE_MODE_GC16); } _scan_count++; int wifi_num; while(1) { wifi_num = WiFi.scanComplete(); if(wifi_num >= 0) { break; } } int connect_wifi_idx = -1; if(_connected) { for(int i = 0; i < wifi_num; i++) { String ssid = WiFi.SSID(i); if(ssid == _connect_ssid) { connect_wifi_idx = i; if(WiFi.RSSI(i) < -90) { connect_wifi_idx = -1; } break; } } if(connect_wifi_idx == -1) { WiFi.disconnect(); _key_wifi[0]->SetEnable(true); _connected = 0; for(int i = 1; i < MAX_BTN_NUM; i++) { _key_wifi[i]->SetPos(_key_wifi[i]->getX(), _key_wifi[i]->getY() - 32); } } } wifi_num = wifi_num > MAX_WIFI_NUM ? MAX_WIFI_NUM : wifi_num; wifi_num -= _connected; for(int i = _connected; i < MAX_BTN_NUM; i++) { _key_wifi[i]->SetHide(true); } if(_connected) { _key_wifi[0]->Draw(UPDATE_MODE_A2); } int idx = 0, cnt = _connected; while(1) { if(idx == connect_wifi_idx) { idx++; continue; } String ssid = WiFi.SSID(idx); DrawItem(_key_wifi[cnt], ssid, WiFi.RSSI(idx)); _key_wifi[cnt]->Draw(UPDATE_MODE_A2); idx++; if(idx == wifi_num) { break; } cnt++; } _key_wifi[wifi_num]->SetCustomString("_$refresh$_"); _key_wifi[wifi_num]->SetHide(false); _key_wifi[wifi_num]->CanvasNormal()->fillCanvas(0); _key_wifi[wifi_num]->CanvasNormal()->drawRect(0, 0, 532, 61, 15); _key_wifi[wifi_num]->CanvasNormal()->pushImage(15, 14, 32, 32, ImageResource_item_icon_refresh_32x32); _key_wifi[wifi_num]->CanvasNormal()->drawString("Refresh", 58, 35); *(_key_wifi[wifi_num]->CanvasPressed()) = *(_key_wifi[wifi_num]->CanvasNormal()); _key_wifi[wifi_num]->CanvasPressed()->ReverseColor(); _key_wifi[wifi_num]->Draw(UPDATE_MODE_A2); M5.EPD.UpdateFull(UPDATE_MODE_GL16); // M5.EPD.UpdateArea(0, 64, 540, 72, UPDATE_MODE_GL16); WiFi.scanDelete(); return 0; } void Frame_WifiScan::Connect() { int anime_cnt = 0; int x = 532 - 15 - 32; int y = _connect_key->getY() + 14; M5EPD_Canvas loading(&M5.EPD); loading.createCanvas(32, 32); loading.fillCanvas(0); loading.pushCanvas(x, y, UPDATE_MODE_GL16); _connect_ssid = _connect_key->GetCustomString(); log_d("SSID = [%s]\n", _connect_ssid.c_str()); log_d("PSWD = [%s]\n", _connect_password.c_str()); WiFi.disconnect(); WiFi.begin(_connect_ssid.c_str(), _connect_password.c_str()); uint32_t start_time = millis(); while (WiFi.status() != WL_CONNECTED) { loading.pushImage(0, 0, 32, 32, GetLoadingIMG_32x32(anime_cnt)); loading.pushCanvas(x, y, UPDATE_MODE_DU4); anime_cnt++; if(anime_cnt == 16) { anime_cnt = 0; } if (millis() - start_time > 10000) { M5EPD_Canvas err(&M5.EPD); err.createCanvas(300, 100); err.fillCanvas(15); err.setTextSize(26); err.setTextColor(0); err.setTextDatum(CC_DATUM); err.drawString("Wrong password", 150, 55); err.pushCanvas(120, 430, UPDATE_MODE_GL16); return; } } for(int i = 1; i < MAX_BTN_NUM; i++) { _key_wifi[i]->SetPos(_key_wifi[i]->getX(), _key_wifi[i]->getY() + 32); } _connect_key->CanvasNormal()->pushImage(532 - 15 - 32, 14, 32, 32, ImageResource_item_icon_success_32x32); _key_wifi[0]->SetEnable(false); _key_wifi[0]->SetHide(false); if(_connect_key != _key_wifi[0]) { *(_key_wifi[0]->CanvasNormal()) = *(_connect_key->CanvasNormal()); *(_key_wifi[0]->CanvasPressed()) = *(_connect_key->CanvasNormal()); _key_wifi[0]->CanvasPressed()->ReverseColor(); } loading.pushImage(0, 0, 32, 32, ImageResource_item_icon_success_32x32); loading.pushCanvas(x, y, UPDATE_MODE_GL16); _connected = 1; SetWifi(_connect_ssid, _connect_password); // SyncNTPTime(); scan(); } void Frame_WifiScan::SetConnected(String ssid, int rssi) { _connect_ssid = ssid; DrawItem(_key_wifi[0], ssid, rssi); for(int i = 1; i < MAX_BTN_NUM; i++) { _key_wifi[i]->SetPos(_key_wifi[i]->getX(), _key_wifi[i]->getY() + 32); } _key_wifi[0]->SetEnable(false); _key_wifi[0]->SetHide(false); _connected = 1; } int Frame_WifiScan::init(epdgui_args_vector_t &args) { _is_run = 1; _connect = false; M5.EPD.WriteFullGram4bpp(GetWallpaper()); _canvas_title->pushCanvas(0, 8, UPDATE_MODE_NONE); if(args.size() > 0) { String *password = (String*)(args[0]); _connect_password = *password; delete password; args.pop_back(); for(int i = 0; i < MAX_BTN_NUM; i++) { EPDGUI_AddObject(_key_wifi[i]); } _update_flag = false; _connect = true; } else { for(int i = 0; i < MAX_BTN_NUM; i++) { _key_wifi[i]->SetHide(true); EPDGUI_AddObject(_key_wifi[i]); } if(_connected) { _key_wifi[0]->SetHide(false); } _update_flag = true; _scan_count = 0; _connect = false; } EPDGUI_AddObject(_key_exit); return 3; }