#pragma once #ifdef WITH_ETHERNET #include #include "INetworkManager.h" // ENC28J60 SPI pin configuration for Heltec V3 // Using available GPIOs that don't conflict with LoRa SPI #ifndef ETH_SPI_SCK #define ETH_SPI_SCK 19 // GPIO19 - safe for external use #endif #ifndef ETH_SPI_MOSI #define ETH_SPI_MOSI 20 // GPIO20 - safe for external use #endif #ifndef ETH_SPI_MISO #define ETH_SPI_MISO 47 // GPIO47 - safe for external use #endif #ifndef ETH_SPI_CS #define ETH_SPI_CS 48 // GPIO48 - safe for external use #endif // Configuration for Ethernet manager struct EthernetConfig { uint8_t spi_sck; uint8_t spi_mosi; uint8_t spi_miso; uint8_t spi_cs; uint32_t connect_timeout_ms; uint32_t reconnect_interval_ms; bool use_dhcp; // true = DHCP, false = static IP // Static IP config (only used if use_dhcp = false) uint32_t static_ip; uint32_t gateway; uint32_t subnet; uint32_t dns1; uint32_t dns2; // MAC address (if all zeros, generate from ESP32 chip ID) uint8_t mac[6]; }; class EthernetManager : public INetworkManager { public: EthernetManager(); // Initialize Ethernet with configuration void begin(const EthernetConfig& config); // INetworkManager interface void loop() override; void end() override; NetworkState getState() const override { return _state; } bool isConnected() const override { return _state == NetworkState::CONNECTED; } IPAddress getLocalIP() const override; String getMacAddress() const override; int32_t getRSSI() const override { return 0; } // Wired = no RSSI const char* getConnectionName() const override { return "ENC28J60"; } void reconnect() override; uint32_t getConnectionUptime() const override; const char* getNetworkType() const override { return "Ethernet"; } // Ethernet-specific bool isLinkUp() const; private: EthernetConfig _config; NetworkState _state; unsigned long _connect_start_time; unsigned long _last_connect_attempt; unsigned long _connected_since; bool _initialized; uint8_t _mac[6]; void attemptConnection(); void generateMacFromChipId(); }; #endif // WITH_ETHERNET