288 lines
8.4 KiB
C++
288 lines
8.4 KiB
C++
#include "frame_wifiscan.h"
|
|
#include "frame_wifipassword.h"
|
|
#include <WiFi.h>
|
|
|
|
#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;
|
|
} |