You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
185 lines
6.2 KiB
185 lines
6.2 KiB
#include <Arduino.h>
|
|
#include <WiFi.h>
|
|
#include <ESPmDNS.h>
|
|
#include "settings.h"
|
|
#include "AudioPlayer.h"
|
|
#include "RotaryEncoder.h"
|
|
#include "Log.h"
|
|
#include "System.h"
|
|
#include "Web.h"
|
|
|
|
// Don't change anything here unless you know what you're doing
|
|
// HELPER //
|
|
// WiFi
|
|
unsigned long wifiCheckLastTimestamp = 0;
|
|
bool wifiEnabled; // Current status if wifi is enabled
|
|
uint32_t wifiStatusToggledTimestamp = 0;
|
|
bool wifiNeedsRestart = false;
|
|
|
|
// AP-WiFi
|
|
IPAddress apIP(192, 168, 4, 1); // Access-point's static IP
|
|
IPAddress apNetmask(255, 255, 255, 0); // Access-point's netmask
|
|
bool accessPointStarted = false;
|
|
|
|
void accessPointStart(const char *SSID, IPAddress ip, IPAddress netmask);
|
|
bool getWifiEnableStatusFromNVS(void);
|
|
void writeWifiStatusToNVS(bool wifiStatus);
|
|
bool Wlan_IsConnected(void);
|
|
int8_t Wlan_GetRssi(void);
|
|
|
|
uint32_t lastPrintRssiTimestamp = 0;
|
|
|
|
void Wlan_Init(void) {
|
|
wifiEnabled = getWifiEnableStatusFromNVS();
|
|
}
|
|
|
|
void Wlan_Cyclic(void) {
|
|
// If wifi would not be activated, return instantly
|
|
if (!wifiEnabled) {
|
|
return;
|
|
}
|
|
|
|
if (!wifiCheckLastTimestamp || wifiNeedsRestart) {
|
|
// Get credentials from NVS
|
|
String strSSID = gPrefsSettings.getString("SSID", "-1");
|
|
if (!strSSID.compareTo("-1")) {
|
|
Log_Println((char *) FPSTR(ssidNotFoundInNvs), LOGLEVEL_ERROR);
|
|
}
|
|
String strPassword = gPrefsSettings.getString("Password", "-1");
|
|
if (!strPassword.compareTo("-1")) {
|
|
Log_Println((char *) FPSTR(wifiPwdNotFoundInNvs), LOGLEVEL_ERROR);
|
|
}
|
|
const char *_ssid = strSSID.c_str();
|
|
const char *_pwd = strPassword.c_str();
|
|
|
|
// Get (optional) hostname-configration from NVS
|
|
String hostname = gPrefsSettings.getString("Hostname", "-1");
|
|
if (hostname.compareTo("-1")) {
|
|
//WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE);
|
|
WiFi.setHostname(hostname.c_str());
|
|
snprintf(Log_Buffer, Log_BufferLength, "%s: %s", (char *) FPSTR(restoredHostnameFromNvs), hostname.c_str());
|
|
Log_Println(Log_Buffer, LOGLEVEL_INFO);
|
|
} else {
|
|
Log_Println((char *) FPSTR(wifiHostnameNotSet), LOGLEVEL_INFO);
|
|
}
|
|
|
|
// Add configration of static IP (if requested)
|
|
#ifdef STATIC_IP_ENABLE
|
|
snprintf(Log_Buffer, Log_BufferLength, "%s", (char *) FPSTR(tryStaticIpConfig));
|
|
Log_Println(Log_Buffer, LOGLEVEL_NOTICE);
|
|
if (!WiFi.config(IPAddress(LOCAL_IP), IPAddress(GATEWAY_IP), IPAddress(SUBNET_IP), IPAddress(DNS_IP))) {
|
|
snprintf(Log_Buffer, Log_BufferLength, "%s", (char *) FPSTR(staticIPConfigFailed));
|
|
Log_Println(Log_Buffer, LOGLEVEL_ERROR);
|
|
}
|
|
#endif
|
|
|
|
// Try to join local WiFi. If not successful, an access-point is opened
|
|
WiFi.begin(_ssid, _pwd);
|
|
|
|
uint8_t tryCount = 0;
|
|
while (WiFi.status() != WL_CONNECTED && tryCount <= 12) {
|
|
delay(500);
|
|
Serial.print(F("."));
|
|
tryCount++;
|
|
wifiCheckLastTimestamp = millis();
|
|
if (tryCount >= 4 && WiFi.status() == WL_CONNECT_FAILED) {
|
|
WiFi.begin(_ssid, _pwd); // ESP32-workaround (otherwise WiFi-connection sometimes fails)
|
|
}
|
|
}
|
|
|
|
if (WiFi.status() == WL_CONNECTED) {
|
|
IPAddress myIP = WiFi.localIP();
|
|
#if (LANGUAGE == DE)
|
|
snprintf(Log_Buffer, Log_BufferLength, "Aktuelle IP: %d.%d.%d.%d", myIP[0], myIP[1], myIP[2], myIP[3]);
|
|
#else
|
|
snprintf(Log_Buffer, Log_BufferLength, "Current IP: %d.%d.%d.%d", myIP[0], myIP[1], myIP[2], myIP[3]);
|
|
#endif
|
|
Log_Println(Log_Buffer, LOGLEVEL_NOTICE);
|
|
} else { // Starts AP if WiFi-connect wasn't successful
|
|
accessPointStart((char *) FPSTR(accessPointNetworkSSID), apIP, apNetmask);
|
|
}
|
|
|
|
#ifdef MDNS_ENABLE
|
|
// zero conf, make device available as <hostname>.local
|
|
if (MDNS.begin(hostname.c_str())) {
|
|
MDNS.addService("http", "tcp", 80);
|
|
}
|
|
#endif
|
|
|
|
wifiNeedsRestart = false;
|
|
}
|
|
|
|
if (Wlan_IsConnected()) {
|
|
if (millis() - lastPrintRssiTimestamp >= 60000) {
|
|
lastPrintRssiTimestamp = millis();
|
|
snprintf(Log_Buffer, Log_BufferLength, "RSSI: %d dBm", Wlan_GetRssi());
|
|
Log_Println(Log_Buffer, LOGLEVEL_DEBUG);
|
|
}
|
|
}
|
|
}
|
|
|
|
void Wlan_ToggleEnable(void) {
|
|
writeWifiStatusToNVS(!getWifiEnableStatusFromNVS());
|
|
}
|
|
|
|
String Wlan_GetIpAddress(void) {
|
|
return WiFi.localIP().toString();
|
|
}
|
|
|
|
int8_t Wlan_GetRssi(void) {
|
|
return WiFi.RSSI();
|
|
}
|
|
|
|
// Initialize soft access-point
|
|
void accessPointStart(const char *SSID, IPAddress ip, IPAddress netmask) {
|
|
WiFi.mode(WIFI_AP);
|
|
WiFi.softAPConfig(ip, ip, netmask);
|
|
WiFi.softAP(SSID);
|
|
delay(500);
|
|
|
|
Log_Println((char *) FPSTR(apReady), LOGLEVEL_NOTICE);
|
|
snprintf(Log_Buffer, Log_BufferLength, "IP-Adresse: %d.%d.%d.%d", apIP[0], apIP[1], apIP[2], apIP[3]);
|
|
Log_Println(Log_Buffer, LOGLEVEL_NOTICE);
|
|
|
|
Web_Init();
|
|
|
|
accessPointStarted = true;
|
|
}
|
|
|
|
// Reads stored WiFi-status from NVS
|
|
bool getWifiEnableStatusFromNVS(void) {
|
|
uint32_t wifiStatus = gPrefsSettings.getUInt("enableWifi", 99);
|
|
|
|
// if not set so far, preseed with 1 (enable)
|
|
if (wifiStatus == 99) {
|
|
gPrefsSettings.putUInt("enableWifi", 1);
|
|
wifiStatus = 1;
|
|
}
|
|
|
|
return wifiStatus;
|
|
}
|
|
|
|
// Writes to NVS whether WiFi should be activated
|
|
void writeWifiStatusToNVS(bool wifiStatus) {
|
|
if (!wifiStatus) {
|
|
if (gPrefsSettings.putUInt("enableWifi", 0)) { // disable
|
|
Log_Println((char *) FPSTR(wifiDisabledAfterRestart), LOGLEVEL_NOTICE);
|
|
if (gPlayProperties.isWebstream) {
|
|
AudioPlayer_TrackControlToQueueSender(STOP);
|
|
}
|
|
delay(300);
|
|
WiFi.mode(WIFI_OFF);
|
|
wifiEnabled = false;
|
|
}
|
|
} else {
|
|
if (gPrefsSettings.putUInt("enableWifi", 1)) { // enable
|
|
Log_Println((char *) FPSTR(wifiEnabledAfterRestart), LOGLEVEL_NOTICE);
|
|
wifiNeedsRestart = true;
|
|
wifiEnabled = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
bool Wlan_IsConnected(void) {
|
|
return (WiFi.status() == WL_CONNECTED);
|
|
}
|