knx
ETS configurable knx-stack
esp_platform.cpp
Go to the documentation of this file.
1 #include "esp_platform.h"
2 
3 #ifdef ARDUINO_ARCH_ESP8266
4 #include <user_interface.h>
5 #include <Arduino.h>
6 #include <EEPROM.h>
7 
8 #include "knx/bits.h"
9 
10 #ifndef KNX_SERIAL
11  #define KNX_SERIAL Serial
12 #endif
13 
15 #ifndef KNX_NO_DEFAULT_UART
16  : ArduinoPlatform(&KNX_SERIAL)
17 #endif
18 {
19 }
20 
21 EspPlatform::EspPlatform( HardwareSerial* s) : ArduinoPlatform(s)
22 {
23 }
24 
26 {
27  return WiFi.localIP();
28 }
29 
31 {
32  return WiFi.subnetMask();
33 }
34 
36 {
37  return WiFi.gatewayIP();
38 }
39 
40 void EspPlatform::macAddress(uint8_t* addr)
41 {
42  wifi_get_macaddr(STATION_IF, addr);
43 }
44 
46 {
47  return ESP.getChipId();
48 }
49 
51 {
52  println("restart");
53  ESP.reset();
54 }
55 
56 void EspPlatform::setupMultiCast(uint32_t addr, uint16_t port)
57 {
58  _multicastAddr = htonl(addr);
59  _multicastPort = port;
60  IPAddress mcastaddr(_multicastAddr);
61 
62  KNX_DEBUG_SERIAL.printf("setup multicast addr: %s port: %d ip: %s\n", mcastaddr.toString().c_str(), port,
63  WiFi.localIP().toString().c_str());
64  uint8 result = _udp.beginMulticast(WiFi.localIP(), mcastaddr, port);
65  KNX_DEBUG_SERIAL.printf("multicast setup result %d\n", result);
66 }
67 
69 {
70  _udp.stop();
71 }
72 
73 bool EspPlatform::sendBytesMultiCast(uint8_t* buffer, uint16_t len)
74 {
75  //printHex("<- ",buffer, len);
76  _udp.beginPacketMulticast(_multicastAddr, _multicastPort, WiFi.localIP());
77  _udp.write(buffer, len);
78  _udp.endPacket();
79  return true;
80 }
81 
82 int EspPlatform::readBytesMultiCast(uint8_t* buffer, uint16_t maxLen)
83 {
84  int len = _udp.parsePacket();
85 
86  if (len == 0)
87  return 0;
88 
89  if (len > maxLen)
90  {
91  KNX_DEBUG_SERIAL.printf("udp buffer to small. was %d, needed %d\n", maxLen, len);
92  fatalError();
93  }
94 
95  _udp.read(buffer, len);
96  //printHex("-> ", buffer, len);
97  return len;
98 }
99 
100 bool EspPlatform::sendBytesUniCast(uint32_t addr, uint16_t port, uint8_t* buffer, uint16_t len)
101 {
102  IPAddress ucastaddr(htonl(addr));
103  println("sendBytesUniCast endPacket fail");
104 
105  if (_udp.beginPacket(ucastaddr, port) == 1)
106  {
107  _udp.write(buffer, len);
108 
109  if (_udp.endPacket() == 0)
110  println("sendBytesUniCast endPacket fail");
111  }
112  else
113  println("sendBytesUniCast beginPacket fail");
114 
115  return true;
116 }
117 
118 uint8_t* EspPlatform::getEepromBuffer(uint32_t size)
119 {
120  uint8_t* eepromptr = EEPROM.getDataPtr();
121 
122  if (eepromptr == nullptr)
123  {
124  EEPROM.begin(size);
125  eepromptr = EEPROM.getDataPtr();
126  }
127 
128  return eepromptr;
129 }
130 
132 {
133  EEPROM.commit();
134 }
135 #endif
void println(const char *s)
void setupMultiCast(uint32_t addr, uint16_t port) override
void commitToEeprom()
uint32_t uniqueSerialNumber() override
void restart()
uint32_t currentSubnetMask() override
void macAddress(uint8_t *addr) override
bool sendBytesUniCast(uint32_t addr, uint16_t port, uint8_t *buffer, uint16_t len) override
uint8_t * getEepromBuffer(uint32_t size)
bool sendBytesMultiCast(uint8_t *buffer, uint16_t len) override
void closeMultiCast() override
uint32_t currentDefaultGateway() override
uint32_t currentIpAddress() override
int readBytesMultiCast(uint8_t *buffer, uint16_t maxLen) override