@@ -10,6 +10,22 @@ namespace sc
1010 task::Task SmartConfig::taskhandle{};
1111 eventgroup::Eventgroup SmartConfig::event_group{};
1212
13+ [[nodiscard]] wifi_config_t ssid_pswd_to_config (const smartconfig_event_got_ssid_pswd_t &evt)
14+ {
15+ wifi_config_t wifi_config{};
16+
17+ std::copy (evt.ssid , evt.ssid + std::min (sizeof (evt.ssid ), sizeof (wifi_config.sta .ssid )), wifi_config.sta .ssid );
18+ std::copy (evt.password , evt.password + std::min (sizeof (evt.password ), sizeof (wifi_config.sta .password )), wifi_config.sta .password );
19+
20+ if (evt.bssid_set )
21+ {
22+ wifi_config.sta .bssid_set = evt.bssid_set ;
23+ std::copy (evt.bssid , evt.bssid + std::min (sizeof (evt.bssid ), sizeof (wifi_config.sta .bssid )), wifi_config.sta .bssid );
24+ }
25+
26+ return wifi_config;
27+ }
28+
1329 SmartConfig::EventHandlers::handle_success_t SmartConfig::EventHandlers::handle_sc_event (SmartConfig::EventHandlers::args_t args)
1430 {
1531 switch (args.event_id )
@@ -24,42 +40,27 @@ namespace sc
2440 {
2541 ESP_LOGI (TAG, " Got SSID and password" );
2642
27- const smartconfig_event_got_ssid_pswd_t *const evt = reinterpret_cast <const smartconfig_event_got_ssid_pswd_t *>(args.event_data );
28- wifi_config_t wifi_config{};
43+ wifi_config_t wifi_config{ssid_pswd_to_config (*reinterpret_cast <const smartconfig_event_got_ssid_pswd_t *>(args.event_data ))};
44+
45+ const auto [ssidview, passwordview] = wifi::config_to_ssidpasswordview (wifi_config);
46+ ESP_LOGI (TAG, " SSID:%.*s" , ssidview.size (), ssidview.data ());
47+ ESP_LOGI (TAG, " PASSWORD:%.*s" , passwordview.size (), passwordview.data ());
2948
30- std::copy (evt->ssid , evt->ssid + std::min (sizeof (evt->ssid ), sizeof (wifi_config.sta .ssid )), wifi_config.sta .ssid );
31- std::copy (evt->password , evt->password + std::min (sizeof (evt->password ), sizeof (wifi_config.sta .password )), wifi_config.sta .password );
32- if (evt->bssid_set )
49+ if (ssidview.empty () or passwordview.empty ())
3350 {
34- wifi_config. sta . bssid_set = evt-> bssid_set ;
35- std::copy (evt-> bssid , evt-> bssid + std::min ( sizeof (evt-> bssid ), sizeof (wifi_config. sta . bssid )), wifi_config. sta . bssid ) ;
51+ ESP_LOGW (TAG, " SSID or password is empty " ) ;
52+ return handle_success_t ::FAIL ;
3653 }
3754
38- std::string_view ssid_view (reinterpret_cast <const char *>(wifi_config.sta .ssid ), sizeof (wifi_config.sta .ssid ));
39- std::string_view password_view (reinterpret_cast <const char *>(wifi_config.sta .password ), sizeof (wifi_config.sta .password ));
40-
41- ESP_LOGI (TAG, " SSID:%.*s" , ssid_view.size (), ssid_view.data ());
42- ESP_LOGI (TAG, " PASSWORD:%.*s" , password_view.size (), password_view.data ());
43-
44- if (SC_TYPE_ESPTOUCH_V2 == evt->type )
55+ if (not wifiobj->reconnect_to (wifi_config))
4556 {
46- uint8_t rvd_data[33 ]{};
47- ESP_ERROR_CHECK (esp_smartconfig_get_rvd_data (rvd_data, sizeof (rvd_data)));
48- ESP_LOGI (TAG, " RVD_DATA:" );
49- for (const auto i : rvd_data)
50- {
51- printf (" %02x " , i);
52- }
53- printf (" \n " );
57+ ESP_LOGW (TAG, " Failed to reconnect" );
58+ return handle_success_t ::FAIL;
5459 }
55-
56- ESP_ERROR_CHECK (esp_wifi_disconnect ());
57- ESP_ERROR_CHECK (esp_wifi_set_config (WIFI_IF_STA, &wifi_config));
58- esp_wifi_connect ();
5960 break ;
6061 }
6162 case SC_EVENT_SEND_ACK_DONE:
62- xEventGroupSetBits (event_group. get () , ESPTOUCH_DONE_BIT);
63+ eventgroup::set_bits (event_group, ESPTOUCH_DONE_BIT);
6364 break ;
6465 [[unlikely]] default :
6566 ESP_LOGW (TAG, " Unhandled SC_EVENT %d" , args.event_id );
@@ -72,10 +73,26 @@ namespace sc
7273 {
7374 while (true )
7475 {
75- const auto uxBits = xEventGroupWaitBits (event_group.get (), ESPTOUCH_DONE_BIT, true , false , portMAX_DELAY);
76+ // const auto uxBits = xEventGroupWaitBits(event_group.get(), ESPTOUCH_DONE_BIT, true, false, portMAX_DELAY);
77+ const auto bits = eventgroup::wait_bits (event_group, ESPTOUCH_DONE_BIT, true , false , portMAX_DELAY);
7678
77- if (uxBits & ESPTOUCH_DONE_BIT)
79+ // if (uxBits & ESPTOUCH_DONE_BIT)
80+ if (bits)
7881 {
82+ const auto [ssidview, passwordview] = wifi::config_to_ssidpasswordview (wifiobj->config ());
83+
84+ if (ssidview.empty () or passwordview.empty ()) [[unlikely]]
85+ {
86+ ESP_LOGE (TAG, " SSID or password is empty!" );
87+ }
88+ else
89+ {
90+ ESP_LOGI (TAG, " Saving creds to NVS" );
91+
92+ wifiobj->nvs_ssid (ssidview);
93+ wifiobj->nvs_password (passwordview);
94+ }
95+
7996 ESP_LOGI (TAG, " Done!" );
8097 esp_smartconfig_stop ();
8198 state = state_t ::DONE;
0 commit comments