knx
ETS configurable knx-stack
esp32_platform.cpp
Go to the documentation of this file.
1 #include "esp32_platform.h"
2 
3 #ifdef ARDUINO_ARCH_ESP32
4 #include <Arduino.h>
5 #include <EEPROM.h>
6 
7 #include "knx/bits.h"
8 
9 #ifndef KNX_SERIAL
10  #define KNX_SERIAL Serial1
11  #pragma warn "KNX_SERIAL not defined, using Serial1"
12 #endif
13 
14 #ifdef KNX_IP_LAN
15  #include "ETH.h"
16  #define KNX_NETIF ETH
17 #else // KNX_IP_WIFI
18  #include <WiFi.h>
19  #define KNX_NETIF WiFi
20 #endif
21 
23 #ifndef KNX_NO_DEFAULT_UART
24  : ArduinoPlatform(&KNX_SERIAL)
25 #endif
26 {
27 #ifdef KNX_UART_RX_PIN
28  _rxPin = KNX_UART_RX_PIN;
29 #endif
30 #ifdef KNX_UART_TX_PIN
31  _txPin = KNX_UART_TX_PIN;
32 #endif
33 }
34 
35 Esp32Platform::Esp32Platform(HardwareSerial* s) : ArduinoPlatform(s)
36 {
37 }
38 
39 void Esp32Platform::knxUartPins(int8_t rxPin, int8_t txPin)
40 {
41  _rxPin = rxPin;
42  _txPin = txPin;
43 }
44 
45 // ESP specific uart handling with pins
47 {
48  _knxSerial->begin(19200, SERIAL_8E1, _rxPin, _txPin);
49 
50  while (!_knxSerial)
51  ;
52 }
53 
55 {
56  return KNX_NETIF.localIP();
57 }
58 
60 {
61  return KNX_NETIF.subnetMask();
62 }
63 
65 {
66  return KNX_NETIF.gatewayIP();
67 }
68 
69 void Esp32Platform::macAddress(uint8_t* addr)
70 {
71  KNX_NETIF.macAddress(addr);
72 }
73 
75 {
76  uint64_t chipid = ESP.getEfuseMac();
77  uint32_t upperId = (chipid >> 32) & 0xFFFFFFFF;
78  uint32_t lowerId = (chipid & 0xFFFFFFFF);
79  return (upperId ^ lowerId);
80 }
81 
83 {
84  println("restart");
85  ESP.restart();
86 }
87 
88 void Esp32Platform::setupMultiCast(uint32_t addr, uint16_t port)
89 {
90  IPAddress mcastaddr(htonl(addr));
91 
92  KNX_DEBUG_SERIAL.printf("setup multicast addr: %s port: %d ip: %s\n", mcastaddr.toString().c_str(), port,
93  KNX_NETIF.localIP().toString().c_str());
94  uint8_t result = _udp.beginMulticast(mcastaddr, port);
95  KNX_DEBUG_SERIAL.printf("multicast setup result %d\n", result);
96 }
97 
99 {
100  _udp.stop();
101 }
102 
103 bool Esp32Platform::sendBytesMultiCast(uint8_t* buffer, uint16_t len)
104 {
105  //printHex("<- ",buffer, len);
106  _udp.beginMulticastPacket();
107  _udp.write(buffer, len);
108  _udp.endPacket();
109  return true;
110 }
111 
112 int Esp32Platform::readBytesMultiCast(uint8_t* buffer, uint16_t maxLen, uint32_t& src_addr, uint16_t& src_port)
113 {
114  int len = _udp.parsePacket();
115 
116  if (len == 0)
117  return 0;
118 
119  if (len > maxLen)
120  {
121  println("Unexpected UDP data packet length - drop packet");
122 
123  for (size_t i = 0; i < len; i++)
124  _udp.read();
125 
126  return 0;
127  }
128 
129  _udp.read(buffer, len);
130  _remoteIP = _udp.remoteIP();
131  _remotePort = _udp.remotePort();
132  src_addr = htonl(_remoteIP);
133  src_port = _remotePort;
134 
135  // print("Remote IP: ");
136  // print(_udp.remoteIP().toString().c_str());
137  // printHex("-> ", buffer, len);
138 
139  return len;
140 }
141 
142 bool Esp32Platform::sendBytesUniCast(uint32_t addr, uint16_t port, uint8_t* buffer, uint16_t len)
143 {
144  IPAddress ucastaddr(htonl(addr));
145 
146  if (!addr)
147  ucastaddr = _remoteIP;
148 
149  if (!port)
150  port = _remotePort;
151 
152  if (_udp.beginPacket(ucastaddr, port) == 1)
153  {
154  _udp.write(buffer, len);
155 
156  if (_udp.endPacket() == 0)
157  println("sendBytesUniCast endPacket fail");
158  }
159  else
160  println("sendBytesUniCast beginPacket fail");
161 
162  return true;
163 }
164 
165 uint8_t* Esp32Platform::getEepromBuffer(uint32_t size)
166 {
167  uint8_t* eepromptr = EEPROM.getDataPtr();
168 
169  if (eepromptr == nullptr)
170  {
171  EEPROM.begin(size);
172  eepromptr = EEPROM.getDataPtr();
173  }
174 
175  return eepromptr;
176 }
177 
179 {
180  EEPROM.getDataPtr(); // trigger dirty flag in EEPROM lib to make sure data will be written to flash
181  EEPROM.commit();
182 }
183 
184 #endif
void println(const char *s)
HardwareSerial * _knxSerial
void closeMultiCast() override
void knxUartPins(int8_t rxPin, int8_t txPin)
uint32_t uniqueSerialNumber() override
void setupUart() override
int readBytesMultiCast(uint8_t *buffer, uint16_t maxLen, uint32_t &src_addr, uint16_t &src_port) override
uint8_t * getEepromBuffer(uint32_t size)
void setupMultiCast(uint32_t addr, uint16_t port) override
void macAddress(uint8_t *addr) override
IPAddress _remoteIP
uint32_t currentSubnetMask() override
bool sendBytesMultiCast(uint8_t *buffer, uint16_t len) override
uint32_t currentDefaultGateway() override
uint16_t _remotePort
uint32_t currentIpAddress() override
bool sendBytesUniCast(uint32_t addr, uint16_t port, uint8_t *buffer, uint16_t len) override
Wiznet5500lwIP KNX_NETIF