- 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
79 lines
2.1 KiB
C++
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
|