meshcore-repeater/src/EthernetManager.h
Ryan Malloy 7516c808a7 Add ENC28J60 Ethernet support with INetworkManager abstraction
- Create INetworkManager interface for network abstraction
- Add EthernetManager for ENC28J60 module using EthernetENC library
- Update WiFiManager to implement INetworkManager interface
- Update MQTTBridge to use INetworkManager* instead of WiFiManager&
- Add heltec_v3_ethernet PlatformIO environment
- Uses HSPI bus (GPIO 19/20/47/48) separate from LoRa SPI
2026-02-05 09:45:16 -07:00

79 lines
2.1 KiB
C++

#pragma once
#ifdef WITH_ETHERNET
#include <Arduino.h>
#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