/*
|
|
|
|
WIFI MODULE
|
|
|
|
Copyright (C) 2016-2019 by Xose Pérez <xose dot perez at gmail dot com>
|
|
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <Arduino.h>
|
|
|
|
#include <lwip/init.h>
|
|
#if LWIP_VERSION_MAJOR == 1
|
|
#include <netif/etharp.h>
|
|
#elif LWIP_VERSION_MAJOR >= 2
|
|
#include <lwip/etharp.h>
|
|
#endif
|
|
|
|
// (HACK) allow us to use internal lwip struct.
|
|
// esp8266 re-defines enum values from tcp header... include them first
|
|
#define LWIP_INTERNAL
|
|
#include <ESP8266WiFi.h>
|
|
#include <Ticker.h>
|
|
#undef LWIP_INTERNAL
|
|
|
|
extern "C" {
|
|
#include <lwip/opt.h>
|
|
#include <lwip/ip.h>
|
|
#include <lwip/tcp.h>
|
|
#include <lwip/inet.h> // ip_addr_t
|
|
#include <lwip/err.h> // ERR_x
|
|
#include <lwip/dns.h> // dns_gethostbyname
|
|
#include <lwip/ip_addr.h> // ip4/ip6 helpers
|
|
};
|
|
|
|
// ref: https://github.com/me-no-dev/ESPAsyncTCP/pull/115/files#diff-e2e636049095cc1ff920c1bfabf6dcacR8
|
|
// This is missing with Core 2.3.0 and is sometimes missing from the build flags. Assume HIGH_BANDWIDTH version.
|
|
#ifndef TCP_MSS
|
|
#define TCP_MSS (1460)
|
|
#endif
|
|
|
|
namespace wifi {
|
|
|
|
enum class Event {
|
|
Initial, // aka boot
|
|
Mode, // when opmode changes
|
|
StationInit, // station initialized by the connetion routine
|
|
StationScan, // scanning before the connection
|
|
StationConnecting, // network was selected and connection is in progress
|
|
StationConnected, // successful connection
|
|
StationDisconnected, // disconnected from the current network
|
|
StationTimeout, // timeout after the previous connecting state
|
|
StationReconnect // timeout after all connection loops failed
|
|
};
|
|
|
|
using EventCallback = void(*)(Event event);
|
|
|
|
enum class StaMode {
|
|
Disabled,
|
|
Enabled
|
|
};
|
|
|
|
enum class ApMode {
|
|
Disabled,
|
|
Enabled,
|
|
Fallback
|
|
};
|
|
|
|
} // namespace wifi
|
|
|
|
// Note that 'connected' status is *only* for the WiFi STA.
|
|
// Overall connectivity depends on low-level network stack and it may be
|
|
// useful to check whether relevant interfaces are up and have a routable IP
|
|
// instead of exclusively depending on the WiFi API.
|
|
// (e.g. when we have injected ethernet, wireguard, etc. interfaces.
|
|
// esp8266 implementation specifically uses lwip, ref. `netif_list`)
|
|
bool wifiConnected();
|
|
|
|
// Whether the AP is up and running
|
|
bool wifiConnectable();
|
|
|
|
// Current STA connection
|
|
String wifiStaSsid();
|
|
IPAddress wifiStaIp();
|
|
|
|
// Request to change the current STA / AP status
|
|
// Current state persists until reset or configuration reload
|
|
void wifiToggleAp();
|
|
void wifiToggleSta();
|
|
|
|
// Disconnects STA intefrace
|
|
// (and will immediatly trigger a reconnection)
|
|
void wifiDisconnect();
|
|
|
|
// Toggle WiFi modem
|
|
void wifiTurnOff();
|
|
void wifiTurnOn();
|
|
|
|
// Trigger fallback check for the AP
|
|
void wifiApCheck();
|
|
|
|
void wifiRegister(wifi::EventCallback);
|
|
void wifiSetup();
|