|
@@ -14,9 +14,12 @@
|
|
|
#include <esp_sntp.h>
|
|
|
#include <esp_wifi.h>
|
|
|
|
|
|
+#include "IP4.h"
|
|
|
+
|
|
|
WiFiUDP UDP;
|
|
|
|
|
|
-static const char *ssid, *password, *hostname, *dnsserver;
|
|
|
+static const char *ssid, *password, *hostname;
|
|
|
+static IP4 dnsserver;
|
|
|
static TimerHandle_t sta_failure_timer;
|
|
|
|
|
|
enum connected {
|
|
@@ -28,6 +31,15 @@ static volatile bool sta_timeout_enabled;
|
|
|
static volatile unsigned int sta_timeout_count;
|
|
|
static unsigned int connected;
|
|
|
|
|
|
+static inline bool setvar_ip4(enum sysvar_enum var, const IP4 &ip)
|
|
|
+{
|
|
|
+ return setvar_ip(var, static_cast<uint32_t>(ip));
|
|
|
+}
|
|
|
+static inline IP4 getvar_ip4(enum sysvar_enum var)
|
|
|
+{
|
|
|
+ return IP4(getvar_ip(var));
|
|
|
+}
|
|
|
+
|
|
|
static void sta_bounce(void)
|
|
|
{
|
|
|
if (!ssid)
|
|
@@ -93,13 +105,13 @@ static void sntp_sync_cb(struct timeval *tv)
|
|
|
|
|
|
static void my_sntp_start(void)
|
|
|
{
|
|
|
- setenv_bool("status.net.sntp.sync", false);
|
|
|
+ setvar_bool(status_net_sntp_sync, false);
|
|
|
|
|
|
- if (getenv_bool("sntp.enabled")) {
|
|
|
+ if (getvar_bool(config_sntp_enabled)) {
|
|
|
sntp_set_time_sync_notification_cb(sntp_sync_cb);
|
|
|
|
|
|
sntp_setoperatingmode(SNTP_OPMODE_POLL);
|
|
|
- sntp_servermode_dhcp(!getenv_bool("ip4.dhcp.nosntp"));
|
|
|
+ sntp_servermode_dhcp(!getvar_bool(config_ip4_dhcp_nosntp));
|
|
|
sntp_set_sync_mode(SNTP_SYNC_MODE_IMMED); // Until first sync
|
|
|
sntp_init();
|
|
|
} else {
|
|
@@ -119,21 +131,15 @@ static void stop_services(void)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static inline bool invalid_ip(const ip_addr_t *ip)
|
|
|
-{
|
|
|
- return !memcmp(ip, &ip_addr_any, sizeof *ip);
|
|
|
-}
|
|
|
-
|
|
|
static void sntp_server_show(void)
|
|
|
{
|
|
|
- const ip_addr_t *sntp_ip = sntp_getserver(0);
|
|
|
+ IP4 sntp_ip = *sntp_getserver(0);
|
|
|
|
|
|
- if (!invalid_ip(sntp_ip)) {
|
|
|
- const char *sntp_server = inet_ntoa(*sntp_ip);
|
|
|
- printf("[SNTP] Time server: %s\n", sntp_server);
|
|
|
- setenv_cond("status.net.sntp.server", sntp_server);
|
|
|
+ if (!sntp_ip) {
|
|
|
+ printf("[SNTP] Time server: %s\n", sntp_ip.cstr());
|
|
|
+ setvar_ip4(status_net_sntp_server, sntp_ip);
|
|
|
} else {
|
|
|
- setenv_cond("status.net.sntp.server", NULL);
|
|
|
+ setvar_ip4(status_net_sntp_server, null_ip);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -143,7 +149,7 @@ static void sntp_server_found(const char *name, const ip_addr_t *addr,
|
|
|
(void)name;
|
|
|
(void)arg;
|
|
|
|
|
|
- if (invalid_ip(addr))
|
|
|
+ if (!IP4(*addr))
|
|
|
return;
|
|
|
|
|
|
sntp_setserver(0, addr);
|
|
@@ -163,29 +169,19 @@ static void sntp_set_server(const char *name)
|
|
|
|
|
|
static void dns_setup(void)
|
|
|
{
|
|
|
- const ip_addr_t *dns_ip = dns_getserver(0);
|
|
|
+ IP4 dns_ip = *dns_getserver(0);
|
|
|
|
|
|
- if (invalid_ip(dns_ip) || getenv_bool("ip4.dhcp.nodns")) {
|
|
|
+ if (!dns_ip || getvar_bool(config_ip4_dhcp_nodns)) {
|
|
|
/* Static DNS server configuration */
|
|
|
- ip_addr_t addr;
|
|
|
- if (dnsserver && inet_aton(dnsserver, &addr)) {
|
|
|
- if (memcmp(dns_ip, &addr, sizeof addr))
|
|
|
- dns_setserver(0, &addr);
|
|
|
+ if (dns_ip != dnsserver) {
|
|
|
+ ip_addr_t addr = dnsserver;
|
|
|
+ dns_setserver(0, &addr);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- dns_ip = dns_getserver(0);
|
|
|
- const char *dns_server_str = inet_ntoa(*dns_ip);
|
|
|
- printf("[DNS] DNS server: %s\n", dns_server_str);
|
|
|
- setenv_cond("status.net.dns.server", dns_server_str);
|
|
|
-}
|
|
|
-
|
|
|
-static esp_ip_addr_t ipaddr_toesp(IPAddress ip)
|
|
|
-{
|
|
|
- esp_ip_addr_t eip;
|
|
|
- memset(&eip, 0, sizeof eip);
|
|
|
- eip.u_addr.ip4.addr = (uint32_t)ip;
|
|
|
- return eip;
|
|
|
+ dns_ip = *dns_getserver(0);
|
|
|
+ printf("[DNS] DNS server: %s\n", dns_ip.cstr());
|
|
|
+ setvar_ip4(status_net_dns_server, dns_ip);
|
|
|
}
|
|
|
|
|
|
static void mdns_setup(void)
|
|
@@ -204,7 +200,7 @@ static void mdns_setup(void)
|
|
|
if (mdns_started)
|
|
|
mdns_free();
|
|
|
|
|
|
- if (!getenv_bool("mdns.enabled"))
|
|
|
+ if (!getvar_bool(config_mdns_enabled))
|
|
|
return;
|
|
|
|
|
|
mdns_started = mdns_init() == ESP_OK;
|
|
@@ -219,7 +215,7 @@ static void mdns_setup(void)
|
|
|
snprintf(unique_name, sizeof unique_name, "MAX80-%s", serial_number);
|
|
|
if (connected & CON_STA) {
|
|
|
mdns_ip_addr_t iplist;
|
|
|
- iplist.addr = ipaddr_toesp(WiFi.localIP());
|
|
|
+ iplist.addr = IP4(WiFi.localIP());
|
|
|
iplist.next = NULL;
|
|
|
unique_mdns = mdns_delegate_hostname_add(unique_name, &iplist);
|
|
|
printf("[MDNS] mDNS unique hostname: %s\n", unique_name);
|
|
@@ -242,11 +238,12 @@ static void start_services(void)
|
|
|
|
|
|
// If Arduino supported both of these at the same that would be
|
|
|
// awesome, but it requires ESP-IDF reconfiguration...
|
|
|
- if (getenv_bool("sntp.enabled")) {
|
|
|
- if (!invalid_ip(sntp_getserver(0))) {
|
|
|
+ if (getvar_bool(config_sntp_enabled)) {
|
|
|
+ IP4 sntp_ip = *sntp_getserver(0);
|
|
|
+ if (sntp_ip) {
|
|
|
sntp_server_show();
|
|
|
} else {
|
|
|
- sntp_set_server(getenv("sntp.server"));
|
|
|
+ sntp_set_server(getvar_str(config_sntp_server));
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -259,18 +256,6 @@ static void start_services(void)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static const char *ip_str(const IPAddress &ip)
|
|
|
-{
|
|
|
- static char ip_buf[4*4];
|
|
|
- const IPAddress ip_none(0,0,0,0);
|
|
|
- return strcpy(ip_buf, ip == ip_none ? "" : ip.toString().c_str());
|
|
|
-}
|
|
|
-
|
|
|
-static void setenv_ip(const char *var, const IPAddress &ip)
|
|
|
-{
|
|
|
- setenv_config(var, ip_str(ip));
|
|
|
-}
|
|
|
-
|
|
|
static bool force_conn_update;
|
|
|
|
|
|
static void WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info)
|
|
@@ -280,8 +265,8 @@ static void WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info)
|
|
|
unsigned int prev_connected = connected;
|
|
|
static int ap_clients;
|
|
|
int prev_ap_clients = ap_clients;
|
|
|
- IPAddress wifi_local_ip = WiFi.localIP();
|
|
|
- const char *local_ip = ip_str(wifi_local_ip);
|
|
|
+ IP4 wifi_local_ip = WiFi.localIP();
|
|
|
+ const char *local_ip = wifi_local_ip.cstr();
|
|
|
|
|
|
switch (event) {
|
|
|
case ARDUINO_EVENT_WIFI_READY:
|
|
@@ -416,20 +401,20 @@ static void WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info)
|
|
|
force_conn_update = false;
|
|
|
|
|
|
if (conn_change & CON_STA) {
|
|
|
- setenv_bool("status.net.sta.conn", connected & CON_STA);
|
|
|
- setenv_config("status.net.sta.ip4",
|
|
|
- connected & CON_STA ? local_ip : "");
|
|
|
- setenv_ip("status.net.sta.ip4.mask", WiFi.subnetMask());
|
|
|
- setenv_ip("status.net.sta.ip4.gw", WiFi.gatewayIP());
|
|
|
+ setvar_bool(status_net_sta_conn, connected & CON_STA);
|
|
|
+ setvar_ip4(status_net_sta_ip4,
|
|
|
+ connected & CON_STA ? wifi_local_ip : null_ip);
|
|
|
+ setvar_ip4(status_net_sta_ip4_mask, WiFi.subnetMask());
|
|
|
+ setvar_ip4(status_net_sta_ip4_gw, WiFi.gatewayIP());
|
|
|
}
|
|
|
if (conn_change & CON_AP)
|
|
|
- setenv_bool("status.net.ap.conn", connected & CON_AP);
|
|
|
+ setvar_bool(status_net_ap_conn, connected & CON_AP);
|
|
|
if (conn_change & CON_ETH) {
|
|
|
- setenv_bool("status.net.eth.conn", connected & CON_ETH);
|
|
|
- setenv_config("status.net.eth.ip4",
|
|
|
- connected & CON_ETH ? local_ip : "");
|
|
|
- setenv_ip("status.net.eth.ip4.mask", WiFi.subnetMask());
|
|
|
- setenv_ip("status.net.eth.ip4.gw", WiFi.gatewayIP());
|
|
|
+ setvar_bool(status_net_eth_conn, connected & CON_ETH);
|
|
|
+ setvar_ip4(status_net_eth_ip4,
|
|
|
+ connected & CON_STA ? wifi_local_ip : null_ip);
|
|
|
+ setvar_ip4(status_net_eth_ip4_mask, WiFi.subnetMask());
|
|
|
+ setvar_ip4(status_net_eth_ip4_gw, WiFi.gatewayIP());
|
|
|
}
|
|
|
|
|
|
if (!ssid) {
|
|
@@ -445,7 +430,7 @@ static void WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info)
|
|
|
}
|
|
|
|
|
|
if (ap_clients != prev_ap_clients)
|
|
|
- setenv_ul("status.net.ap.clients", ap_clients);
|
|
|
+ setvar_uint(status_net_ap_clients, ap_clients);
|
|
|
|
|
|
/*
|
|
|
* Don't keep retrying if there are AP clients - makes the AP
|
|
@@ -456,39 +441,29 @@ static void WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void setenv_mac(const char *var, const uint8_t mac[6])
|
|
|
-{
|
|
|
- char mac_str[3*6];
|
|
|
-
|
|
|
- snprintf(mac_str, sizeof mac_str, "%02x:%02x:%02x:%02x:%02x:%02x",
|
|
|
- mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
|
|
|
- setenv_cond(var, mac_str);
|
|
|
-}
|
|
|
-
|
|
|
static void wifi_config_ap(void)
|
|
|
{
|
|
|
/* No network configuration set */
|
|
|
- IPAddress AP_IP = IPAddress(192,168,0,1);
|
|
|
- IPAddress AP_Netmask = IPAddress(255,255,255,0);
|
|
|
- IPAddress AP_Gateway = IPAddress(0,0,0,0); // No gateway
|
|
|
+ IP4 AP_IP = IP4(192,168,0,1);
|
|
|
+ IP4 AP_Netmask = IP4(255,255,255,0);
|
|
|
+ IP4 AP_Gateway = IP4(0,0,0,0); // No gateway
|
|
|
unsigned int channel = (time(NULL) % 11) + 1; // Pseudo-random
|
|
|
uint8_t mac[6];
|
|
|
static char ap_ssid[64];
|
|
|
|
|
|
WiFi.softAPmacAddress(mac);
|
|
|
- setenv_mac("status.net.ap.mac", mac);
|
|
|
+ setvar_mac(status_net_ap_mac, mac);
|
|
|
|
|
|
/* The last two bytes of the efuse MAC */
|
|
|
snprintf(ap_ssid, sizeof ap_ssid, "MAX80_%02X%02X",
|
|
|
efuse_default_mac[4], efuse_default_mac[5]);
|
|
|
|
|
|
- printf("[WIFI] AP SSID %s IP %s netmask %s channel %u\n",
|
|
|
- ap_ssid, AP_IP.toString().c_str(),
|
|
|
- AP_Netmask.toString().c_str(), channel);
|
|
|
- setenv_cond("status.net.ap.ssid", ap_ssid);
|
|
|
- setenv_ip("status.net.ap.ip4", AP_IP);
|
|
|
- setenv_ip("status.net.ap.ip4.mask", AP_Netmask);
|
|
|
- setenv_ul("status.net.ap.clients", 0);
|
|
|
+ printf("[WIFI] AP SSID %s IP %s ", ap_ssid, AP_IP.cstr());
|
|
|
+ printf("netmask %s channel %u\n", AP_Netmask.cstr(), channel);
|
|
|
+ setvar_str(status_net_ap_ssid, ap_ssid);
|
|
|
+ setvar_ip4(status_net_ap_ip4, AP_IP);
|
|
|
+ setvar_ip4(status_net_ap_ip4_mask, AP_Netmask);
|
|
|
+ setvar_uint(status_net_ap_clients, 0);
|
|
|
|
|
|
printf("WiFi.softAP\n");
|
|
|
WiFi.softAP(ap_ssid, NULL, channel, 0, 4, true);
|
|
@@ -513,10 +488,10 @@ static void wifi_config_sta(void)
|
|
|
printf("WiFi.macAddress\n");
|
|
|
WiFi.macAddress(mac);
|
|
|
printf("setenv_mac\n");
|
|
|
- setenv_mac("status.net.sta.mac", mac);
|
|
|
+ setvar_mac(status_net_sta_mac, mac);
|
|
|
|
|
|
printf("setenv ssid\n");
|
|
|
- setenv_cond("status.net.sta.ssid", ssid);
|
|
|
+ setvar_str(status_net_sta_ssid, ssid);
|
|
|
if (!ssid) {
|
|
|
WiFi.enableSTA(false);
|
|
|
return;
|
|
@@ -539,10 +514,10 @@ static void wifi_config_sta(void)
|
|
|
|
|
|
static void wifi_config(void)
|
|
|
{
|
|
|
- ssid = getenv_notempty("wifi.ssid");
|
|
|
- password = getenv_notempty("wifi.psk");
|
|
|
- hostname = getenv_def("hostname", "max80");
|
|
|
- dnsserver = getenv_notempty("ip4.dns");
|
|
|
+ ssid = dupstr(getvar_str(config_wifi_ssid));
|
|
|
+ password = dupstr(getvar_str(config_wifi_psk));
|
|
|
+ hostname = dupstr(getvar_str(config_hostname));
|
|
|
+ dnsserver = getvar_ip4(config_ip4_dns);
|
|
|
|
|
|
force_conn_update = true;
|
|
|
|
|
@@ -553,7 +528,7 @@ static void wifi_config(void)
|
|
|
|
|
|
WiFi.setTxPower(WIFI_POWER_19_5dBm);
|
|
|
|
|
|
- setenv_config("status.hostname", hostname);
|
|
|
+ setvar_str(status_hostname, hostname);
|
|
|
WiFi.hostname(hostname);
|
|
|
|
|
|
printf("wifi_config_ap\n");
|