/ firmware / src / networking / wifi_sta.cpp
wifi_sta.cpp
 1  #include "wifi_internal.h"
 2  
 3  #include <led.h>
 4  #include <identity.h>
 5  
 6  #include <Arduino.h>
 7  #include <ESPmDNS.h>
 8  #include <WiFi.h>
 9  
10  void networking::wifi::internal::configureMdnsServices(const char *hostname) {
11    MDNS.setInstanceName(hostname);
12    MDNS.addService("ssh", "tcp", config::ssh::PORT);
13    MDNS.addService("http", "tcp", config::http::PORT);
14    MDNS.addServiceTxt("http", "tcp", "path", "/");
15    MDNS.addServiceTxt("http", "tcp", "fw", ESP.getSdkVersion());
16  }
17  
18  void networking::wifi::sta::initialize() {
19    static bool setup_done = false;
20    if (setup_done) return;
21    setup_done = true;
22  
23    WiFi.setAutoReconnect(false);
24    WiFi.mode(WIFI_MODE_STA);
25  
26    WiFi.onEvent([](arduino_event_id_t event, arduino_event_info_t info) {
27      switch (event) {
28        case ARDUINO_EVENT_WIFI_STA_CONNECTED:
29          Serial.printf("[wifi] %s\n", WiFi.eventName(event));
30          break;
31  
32        case ARDUINO_EVENT_WIFI_STA_DISCONNECTED:
33          Serial.printf("[wifi] %s reason: %s\n",
34                        WiFi.eventName(event),
35                        WiFi.disconnectReasonName(
36                            (wifi_err_reason_t)info.wifi_sta_disconnected.reason));
37          LED.set(colors::Yellow);
38          break;
39  
40        case ARDUINO_EVENT_WIFI_STA_GOT_IP:
41          Serial.printf("[wifi] %s %s\n", WiFi.eventName(event),
42                        WiFi.localIP().toString().c_str());
43          LED.set(colors::Green);
44          if (!networking::wifi::internal::mdns_started && MDNS.begin(services::identity::access_hostname())) {
45            networking::wifi::internal::configureMdnsServices(services::identity::access_hostname());
46            Serial.printf("[mdns] %s.local\n", services::identity::access_hostname());
47            networking::wifi::internal::mdns_started = true;
48          }
49          break;
50  
51        default:
52          break;
53      }
54    });
55  }
56  
57  void networking::wifi::configure_hostname(const char *hostname) {
58    if (!hostname || hostname[0] == '\0') return;
59  
60    WiFi.setHostname(hostname);
61  
62    if (networking::wifi::internal::mdns_started) {
63      MDNS.end();
64      networking::wifi::internal::mdns_started = false;
65    }
66  
67    if (WiFi.isConnected() && MDNS.begin(hostname)) {
68      networking::wifi::internal::configureMdnsServices(hostname);
69      networking::wifi::internal::mdns_started = true;
70    }
71  }
72  
73  bool networking::wifi::sta::connect() {
74    WifiConnectCommand command = {
75      .request = {
76        .ssid = nullptr,
77        .password = nullptr,
78        .enable_ap_fallback = false,
79      },
80      .result = {},
81    };
82    return networking::wifi::connect(&command);
83  }