diff --git a/src/config.h b/src/config.h index 7593191..5cb7ab4 100644 --- a/src/config.h +++ b/src/config.h @@ -31,6 +31,6 @@ /* * firmeware version string */ - #define __FIRMWARE__ "2020080603" + #define __FIRMWARE__ "2020080605" #endif // _CONFIG_H diff --git a/src/gui/mainbar/setup_tile/wlan_settings/wlan_settings.cpp b/src/gui/mainbar/setup_tile/wlan_settings/wlan_settings.cpp index d8ebaf3..590f73d 100644 --- a/src/gui/mainbar/setup_tile/wlan_settings/wlan_settings.cpp +++ b/src/gui/mainbar/setup_tile/wlan_settings/wlan_settings.cpp @@ -292,6 +292,7 @@ static void exit_wifi_password_event_cb( lv_obj_t * obj, lv_event_t event ) { } lv_obj_t *wifi_autoon_onoff; +static void wps_start_event_handler( lv_obj_t * obj, lv_event_t event ); static void wifi_autoon_onoff_event_handler( lv_obj_t * obj, lv_event_t event ); void wlan_setup_tile_setup( uint32_t wifi_setup_tile_num ) { @@ -333,12 +334,25 @@ void wlan_setup_tile_setup( uint32_t wifi_setup_tile_num ) { lv_label_set_text( wifi_autoon_label, "enable on wakeup"); lv_obj_align( wifi_autoon_label, wifi_autoon_onoff_cont, LV_ALIGN_IN_LEFT_MID, 5, 0 ); + lv_obj_t *wps_btn = lv_btn_create( wifi_setup_tile, NULL); + lv_obj_set_event_cb( wps_btn, wps_start_event_handler ); + lv_obj_align( wps_btn, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, -40); + lv_obj_t *wps_btn_label = lv_label_create( wps_btn, NULL ); + lv_label_set_text( wps_btn_label, "start WPS"); + if ( wifictl_get_autoon() ) lv_switch_on( wifi_autoon_onoff, LV_ANIM_OFF); else lv_switch_off( wifi_autoon_onoff, LV_ANIM_OFF); } +static void wps_start_event_handler( lv_obj_t * obj, lv_event_t event ) { + switch( event ) { + case( LV_EVENT_CLICKED ): wifictl_start_wps(); + break; + } +} + static void enter_wifi_setup_event_cb( lv_obj_t * obj, lv_event_t event ) { switch( event ) { case( LV_EVENT_CLICKED ): mainbar_jump_to_tilenumber( wifi_setup_tile_num, LV_ANIM_ON ); diff --git a/src/hardware/powermgm.h b/src/hardware/powermgm.h index 374f3b4..8724642 100644 --- a/src/hardware/powermgm.h +++ b/src/hardware/powermgm.h @@ -34,9 +34,10 @@ #define POWERMGM_BMA_WAKEUP _BV(7) #define POWERMGM_WIFI_ON_REQUEST _BV(8) #define POWERMGM_WIFI_OFF_REQUEST _BV(9) - #define POWERMGM_WIFI_ACTIVE _BV(10) - #define POWERMGM_WIFI_SCAN _BV(11) - #define POWERMGM_WIFI_CONNECTED _BV(12) + #define POWERMGM_WIFI_WPS_REQUEST _BV(10) + #define POWERMGM_WIFI_ACTIVE _BV(11) + #define POWERMGM_WIFI_SCAN _BV(12) + #define POWERMGM_WIFI_CONNECTED _BV(13) /* * @brief setp power managment, coordinate managment beween CPU, wifictl, pmu, bma, display, backlight and lvgl diff --git a/src/hardware/wifictl.cpp b/src/hardware/wifictl.cpp index 6236c29..7cf640b 100644 --- a/src/hardware/wifictl.cpp +++ b/src/hardware/wifictl.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include "powermgm.h" #include "wifictl.h" @@ -42,6 +43,8 @@ char *wifipassword=NULL; struct networklist wifictl_networklist[ NETWORKLIST_ENTRYS ]; wifictl_config_t wifictl_config; +static esp_wps_config_t esp_wps_config; + void wifictl_save_network( void ); void wifictl_load_network( void ); void wifictl_save_config( void ); @@ -56,7 +59,7 @@ void wifictl_setup( void ) { return; wifi_init = true; - powermgm_clear_event( POWERMGM_WIFI_ACTIVE | POWERMGM_WIFI_OFF_REQUEST | POWERMGM_WIFI_ON_REQUEST | POWERMGM_WIFI_CONNECTED | POWERMGM_WIFI_SCAN ); + powermgm_clear_event( POWERMGM_WIFI_ACTIVE | POWERMGM_WIFI_OFF_REQUEST | POWERMGM_WIFI_ON_REQUEST | POWERMGM_WIFI_CONNECTED | POWERMGM_WIFI_SCAN | POWERMGM_WIFI_WPS_REQUEST ); // clean network list table for ( int entry = 0 ; entry < NETWORKLIST_ENTRYS ; entry++ ) { @@ -74,13 +77,19 @@ void wifictl_setup( void ) { powermgm_clear_event( POWERMGM_WIFI_OFF_REQUEST | POWERMGM_WIFI_ON_REQUEST | POWERMGM_WIFI_SCAN | POWERMGM_WIFI_CONNECTED ); statusbar_style_icon( STATUSBAR_WIFI, STATUSBAR_STYLE_GRAY ); statusbar_show_icon( STATUSBAR_WIFI ); - statusbar_wifi_set_state( true, "scan ..." ); - WiFi.scanNetworks(); + if ( powermgm_get_event( POWERMGM_WIFI_WPS_REQUEST ) ) + statusbar_wifi_set_state( true, "wait for WPS" ); + else { + powermgm_set_event( POWERMGM_WIFI_SCAN ); + statusbar_wifi_set_state( true, "scan ..." ); + WiFi.scanNetworks(); + } + lv_obj_invalidate( lv_scr_act() ); }, WiFiEvent_t::SYSTEM_EVENT_STA_DISCONNECTED); WiFi.onEvent([](WiFiEvent_t event, WiFiEventInfo_t info) { powermgm_set_event( POWERMGM_WIFI_ACTIVE ); - powermgm_clear_event( POWERMGM_WIFI_OFF_REQUEST | POWERMGM_WIFI_ON_REQUEST | POWERMGM_WIFI_SCAN | POWERMGM_WIFI_CONNECTED ); + powermgm_clear_event( POWERMGM_WIFI_OFF_REQUEST | POWERMGM_WIFI_ON_REQUEST | POWERMGM_WIFI_SCAN | POWERMGM_WIFI_CONNECTED | POWERMGM_WIFI_WPS_REQUEST ); statusbar_style_icon( STATUSBAR_WIFI, STATUSBAR_STYLE_GRAY ); statusbar_show_icon( STATUSBAR_WIFI ); int len = WiFi.scanComplete(); @@ -95,11 +104,17 @@ void wifictl_setup( void ) { } } } + lv_obj_invalidate( lv_scr_act() ); }, WiFiEvent_t::SYSTEM_EVENT_SCAN_DONE ); WiFi.onEvent([](WiFiEvent_t event, WiFiEventInfo_t info) { powermgm_set_event( POWERMGM_WIFI_CONNECTED | POWERMGM_WIFI_ACTIVE ); - powermgm_clear_event( POWERMGM_WIFI_OFF_REQUEST | POWERMGM_WIFI_ON_REQUEST | POWERMGM_WIFI_SCAN ); + if ( powermgm_get_event( POWERMGM_WIFI_WPS_REQUEST ) ) { + Serial.printf("SSID: %s, psk: %s\r\n", WiFi.SSID().c_str(), WiFi.psk().c_str() ); + wifictl_insert_network( WiFi.SSID().c_str(), WiFi.psk().c_str() ); + wifictl_save_config(); + } + powermgm_clear_event( POWERMGM_WIFI_OFF_REQUEST | POWERMGM_WIFI_ON_REQUEST | POWERMGM_WIFI_SCAN | POWERMGM_WIFI_WPS_REQUEST ); statusbar_style_icon( STATUSBAR_WIFI, STATUSBAR_STYLE_WHITE ); statusbar_show_icon( STATUSBAR_WIFI ); String label(wifiname); @@ -110,22 +125,49 @@ void wifictl_setup( void ) { // label.concat(WiFi.localIPv6().toString()); statusbar_wifi_set_state( true, label.c_str() ); asyncwebserver_setup(); + lv_obj_invalidate( lv_scr_act() ); }, WiFiEvent_t::SYSTEM_EVENT_STA_GOT_IP ); WiFi.onEvent([](WiFiEvent_t event, WiFiEventInfo_t info) { - powermgm_set_event( POWERMGM_WIFI_ACTIVE | POWERMGM_WIFI_SCAN ); + powermgm_set_event( POWERMGM_WIFI_ACTIVE ); powermgm_clear_event( POWERMGM_WIFI_CONNECTED | POWERMGM_WIFI_OFF_REQUEST | POWERMGM_WIFI_ON_REQUEST ); statusbar_style_icon( STATUSBAR_WIFI, STATUSBAR_STYLE_GRAY ); statusbar_show_icon( STATUSBAR_WIFI ); - statusbar_wifi_set_state( true, "scan ..." ); - WiFi.scanNetworks(); + if ( powermgm_get_event( POWERMGM_WIFI_WPS_REQUEST ) ) + statusbar_wifi_set_state( true, "wait for WPS" ); + else { + powermgm_set_event( POWERMGM_WIFI_SCAN ); + statusbar_wifi_set_state( true, "scan ..." ); + WiFi.scanNetworks(); + } + lv_obj_invalidate( lv_scr_act() ); }, WiFiEvent_t::SYSTEM_EVENT_WIFI_READY ); WiFi.onEvent([](WiFiEvent_t event, WiFiEventInfo_t info) { - powermgm_clear_event( POWERMGM_WIFI_ACTIVE | POWERMGM_WIFI_CONNECTED | POWERMGM_WIFI_OFF_REQUEST | POWERMGM_WIFI_ON_REQUEST | POWERMGM_WIFI_SCAN ); + powermgm_clear_event( POWERMGM_WIFI_ACTIVE | POWERMGM_WIFI_CONNECTED | POWERMGM_WIFI_OFF_REQUEST | POWERMGM_WIFI_ON_REQUEST | POWERMGM_WIFI_SCAN | POWERMGM_WIFI_WPS_REQUEST ); statusbar_hide_icon( STATUSBAR_WIFI ); statusbar_wifi_set_state( false, "" ); + lv_obj_invalidate( lv_scr_act() ); }, WiFiEvent_t::SYSTEM_EVENT_STA_STOP ); + + WiFi.onEvent([](WiFiEvent_t event, WiFiEventInfo_t info) { + esp_wifi_wps_disable(); + WiFi.begin(); + lv_obj_invalidate( lv_scr_act() ); + }, WiFiEvent_t::SYSTEM_EVENT_STA_WPS_ER_SUCCESS ); + + WiFi.onEvent([](WiFiEvent_t event, WiFiEventInfo_t info) { + esp_wifi_wps_disable(); + statusbar_wifi_set_state( true, "WPS failed" ); + lv_obj_invalidate( lv_scr_act() ); + }, WiFiEvent_t::SYSTEM_EVENT_STA_WPS_ER_FAILED ); + + WiFi.onEvent([](WiFiEvent_t event, WiFiEventInfo_t info) { + esp_wifi_wps_disable(); + statusbar_wifi_set_state( true, "WPS timeout" ); + lv_obj_invalidate( lv_scr_act() ); + }, WiFiEvent_t::SYSTEM_EVENT_STA_WPS_ER_TIMEOUT ); + xTaskCreate( wifictl_Task, /* Function to implement the task */ "wifictl Task", /* Name of the task */ 5000, /* Stack size in words */ @@ -259,7 +301,7 @@ bool wifictl_insert_network( const char *ssid, const char *password ) { // check if existin for( int entry = 0 ; entry < NETWORKLIST_ENTRYS; entry++ ) { if( !strcmp( ssid, wifictl_networklist[ entry ].ssid ) ) { - strncpy( wifictl_networklist[ entry ].ssid, ssid, sizeof( wifictl_networklist[ entry ].ssid ) ); + strncpy( wifictl_networklist[ entry ].password, password, sizeof( wifictl_networklist[ entry ].password ) ); wifictl_save_network(); WiFi.scanNetworks(); powermgm_set_event( POWERMGM_WIFI_SCAN ); @@ -287,7 +329,7 @@ void wifictl_on( void ) { if ( wifi_init == false ) return; - if ( powermgm_get_event( POWERMGM_WIFI_OFF_REQUEST ) || powermgm_get_event( POWERMGM_WIFI_ON_REQUEST )) { + if ( powermgm_get_event( POWERMGM_WIFI_OFF_REQUEST ) || powermgm_get_event( POWERMGM_WIFI_ON_REQUEST ) ) { return; } else { @@ -315,7 +357,7 @@ void wifictl_off( void ) { void wifictl_standby( void ) { log_i("standby"); if ( powermgm_get_event( POWERMGM_WIFI_ACTIVE ) ) wifictl_off(); - while( powermgm_get_event( POWERMGM_WIFI_ACTIVE | POWERMGM_WIFI_CONNECTED | POWERMGM_WIFI_OFF_REQUEST | POWERMGM_WIFI_ON_REQUEST | POWERMGM_WIFI_SCAN ) ) { yield(); } + while( powermgm_get_event( POWERMGM_WIFI_ACTIVE | POWERMGM_WIFI_CONNECTED | POWERMGM_WIFI_OFF_REQUEST | POWERMGM_WIFI_ON_REQUEST | POWERMGM_WIFI_SCAN | POWERMGM_WIFI_WPS_REQUEST ) ) { yield(); } } void wifictl_wakeup( void ) { @@ -324,6 +366,37 @@ void wifictl_wakeup( void ) { wifictl_on(); } } + +void wifictl_start_wps( void ) { + if ( powermgm_get_event( POWERMGM_WIFI_WPS_REQUEST ) ) + return; + + log_e("start WPS"); + + esp_wps_config.crypto_funcs = &g_wifi_default_wps_crypto_funcs; + esp_wps_config.wps_type = ESP_WPS_MODE; + strcpy(esp_wps_config.factory_info.manufacturer, ESP_MANUFACTURER); + strcpy(esp_wps_config.factory_info.model_number, ESP_MODEL_NUMBER); + strcpy(esp_wps_config.factory_info.model_name, ESP_MODEL_NAME); + strcpy(esp_wps_config.factory_info.device_name, ESP_DEVICE_NAME); + + WiFi.mode( WIFI_OFF ); + esp_wifi_stop(); + + statusbar_style_icon( STATUSBAR_WIFI, STATUSBAR_STYLE_GRAY ); + statusbar_show_icon( STATUSBAR_WIFI ); + statusbar_wifi_set_state( true, "wait for WPS" ); + lv_obj_invalidate( lv_scr_act() ); + + powermgm_set_event( POWERMGM_WIFI_WPS_REQUEST ); + + ESP_ERROR_CHECK( esp_wifi_set_mode( WIFI_MODE_STA ) ); + ESP_ERROR_CHECK( esp_wifi_start() ); + + ESP_ERROR_CHECK( esp_wifi_wps_enable( &esp_wps_config ) ); + ESP_ERROR_CHECK( esp_wifi_wps_start( 120000 ) ); +} + /* * */ @@ -335,11 +408,13 @@ void wifictl_Task( void * pvParameters ) { vTaskDelay( 500 ); if ( powermgm_get_event( POWERMGM_WIFI_ON_REQUEST ) ) { statusbar_wifi_set_state( true, "activate" ); + lv_obj_invalidate( lv_scr_act() ); WiFi.mode( WIFI_STA ); powermgm_clear_event( POWERMGM_WIFI_OFF_REQUEST | POWERMGM_WIFI_ACTIVE | POWERMGM_WIFI_CONNECTED | POWERMGM_WIFI_SCAN | POWERMGM_WIFI_ON_REQUEST ); } else if ( powermgm_get_event( POWERMGM_WIFI_OFF_REQUEST ) ) { statusbar_wifi_set_state( false, "" ); + lv_obj_invalidate( lv_scr_act() ); WiFi.mode( WIFI_OFF ); esp_wifi_stop(); powermgm_clear_event( POWERMGM_WIFI_OFF_REQUEST | POWERMGM_WIFI_ACTIVE | POWERMGM_WIFI_CONNECTED | POWERMGM_WIFI_SCAN | POWERMGM_WIFI_ON_REQUEST ); diff --git a/src/hardware/wifictl.h b/src/hardware/wifictl.h index 88e0346..018520d 100644 --- a/src/hardware/wifictl.h +++ b/src/hardware/wifictl.h @@ -27,6 +27,12 @@ #define WIFICTL_LIST_FILE "/wifilist.cfg" #define WIFICTL_CONFIG_FILE "/wificfg.cfg" + #define ESP_WPS_MODE WPS_TYPE_PBC + #define ESP_MANUFACTURER "ESPRESSIF" + #define ESP_MODEL_NUMBER "ESP32" + #define ESP_MODEL_NAME "ESPRESSIF IOT" + #define ESP_DEVICE_NAME "ESP STATION" + struct networklist { char ssid[64]=""; char password[64]=""; @@ -75,5 +81,6 @@ void wifictl_wakeup( void ); bool wifictl_get_autoon( void ); void wifictl_set_autoon( bool autoon ); + void wifictl_start_wps( void ); #endif // _WIFICTL_H \ No newline at end of file diff --git a/ttgo-t-watch2020_v1.ino.bin b/ttgo-t-watch2020_v1.ino.bin index eafc092..a838516 100644 Binary files a/ttgo-t-watch2020_v1.ino.bin and b/ttgo-t-watch2020_v1.ino.bin differ diff --git a/ttgo-t-watch2020_v1.version.json b/ttgo-t-watch2020_v1.version.json index 78e787d..cd1b712 100644 --- a/ttgo-t-watch2020_v1.version.json +++ b/ttgo-t-watch2020_v1.version.json @@ -1 +1 @@ -{"version":"2020080603","host":"http://www.neo-guerillaz.de","file":"ttgo-t-watch2020_v1.ino.bin"} +{"version":"2020080605","host":"http://www.neo-guerillaz.de","file":"ttgo-t-watch2020_v1.ino.bin"}