diff --git a/cores/esp32/IPAddress.cpp b/cores/esp32/IPAddress.cpp index 0575363f254..e1b8a2b9f1d 100644 --- a/cores/esp32/IPAddress.cpp +++ b/cores/esp32/IPAddress.cpp @@ -20,62 +20,62 @@ #include #include #include +#include -IPAddress::IPAddress() -{ - _address.dword = 0; -} +// IPAddress::IPAddress() +// { +// _address.dword = 0; +// } IPAddress::IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet) -{ - _address.bytes[0] = first_octet; - _address.bytes[1] = second_octet; - _address.bytes[2] = third_octet; - _address.bytes[3] = fourth_octet; -} + : _address({first_octet, + second_octet, + third_octet, + fourth_octet}) +{} IPAddress::IPAddress(uint32_t address) { - _address.dword = address; + uint32_t& addressRef = reinterpret_cast(_address.front()); + addressRef = address; } -IPAddress::IPAddress(const uint8_t *address) -{ - memcpy(_address.bytes, address, sizeof(_address.bytes)); -} +IPAddress::IPAddress(const uint8_t *address) : _address({address[0], address[1], address[2], address[3]}) +{} IPAddress& IPAddress::operator=(const uint8_t *address) { - memcpy(_address.bytes, address, sizeof(_address.bytes)); + std::copy(address, address + _address.size(), _address.begin()); return *this; } IPAddress& IPAddress::operator=(uint32_t address) { - _address.dword = address; + uint32_t& addressRef = reinterpret_cast(_address.front()); + addressRef = address; return *this; } bool IPAddress::operator==(const uint8_t* addr) const { - return memcmp(addr, _address.bytes, sizeof(_address.bytes)) == 0; + return std::equal(_address.begin(), _address.end(), addr); } size_t IPAddress::printTo(Print& p) const { size_t n = 0; for(int i = 0; i < 3; i++) { - n += p.print(_address.bytes[i], DEC); + n += p.print(_address[i], DEC); n += p.print('.'); } - n += p.print(_address.bytes[3], DEC); + n += p.print(_address[3], DEC); return n; } String IPAddress::toString() const { char szRet[16]; - sprintf(szRet,"%u.%u.%u.%u", _address.bytes[0], _address.bytes[1], _address.bytes[2], _address.bytes[3]); + sprintf(szRet,"%u.%u.%u.%u", _address[0], _address[1], _address[2], _address[3]); return String(szRet); } @@ -103,7 +103,7 @@ bool IPAddress::fromString(const char *address) // Too much dots (there must be 3 dots) return false; } - _address.bytes[dots++] = acc; + _address[dots++] = acc; acc = 0; } else @@ -117,7 +117,7 @@ bool IPAddress::fromString(const char *address) // Too few dots (there must be 3 dots) return false; } - _address.bytes[3] = acc; + _address[3] = acc; return true; } diff --git a/cores/esp32/IPAddress.h b/cores/esp32/IPAddress.h index 3bedd4f8749..c0ebf225d20 100644 --- a/cores/esp32/IPAddress.h +++ b/cores/esp32/IPAddress.h @@ -23,16 +23,14 @@ #include #include #include +#include // A class to make it easier to handle and pass around IP addresses class IPAddress: public Printable { private: - union { - uint8_t bytes[4]; // IPv4 address - uint32_t dword; - } _address; + alignas(alignof(uint32_t)) std::array _address{}; // IPv4 address // Access the raw byte array containing the address. Because this returns a pointer // to the internal structure rather than a copy of the address this function should only @@ -40,12 +38,12 @@ class IPAddress: public Printable // stored. uint8_t* raw_address() { - return _address.bytes; + return _address.data(); } public: // Constructors - IPAddress(); + IPAddress() = default; IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet); IPAddress(uint32_t address); IPAddress(const uint8_t *address); @@ -54,26 +52,27 @@ class IPAddress: public Printable bool fromString(const char *address); bool fromString(const String &address) { return fromString(address.c_str()); } + // Overloaded cast operator to allow IPAddress objects to be used where a pointer // to a four-byte uint8_t array is expected operator uint32_t() const { - return _address.dword; + return reinterpret_cast(_address.front()); } bool operator==(const IPAddress& addr) const { - return _address.dword == addr._address.dword; + return _address == addr._address; } bool operator==(const uint8_t* addr) const; // Overloaded index operator to allow getting and setting individual octets of the address uint8_t operator[](int index) const { - return _address.bytes[index]; + return _address[index]; } uint8_t& operator[](int index) { - return _address.bytes[index]; + return _address[index]; } // Overloaded copy operators to allow initialisation of IPAddress objects from other types diff --git a/libraries/Wire/src/Wire.cpp b/libraries/Wire/src/Wire.cpp index 2568e3c9413..2bcd9bc2112 100644 --- a/libraries/Wire/src/Wire.cpp +++ b/libraries/Wire/src/Wire.cpp @@ -588,48 +588,48 @@ void TwoWire::flush(void) //i2cFlush(num); // cleanup } -size_t TwoWire::requestFrom(uint8_t address, size_t len, bool sendStop) -{ - return requestFrom(static_cast(address), static_cast(len), static_cast(sendStop)); -} - -uint8_t TwoWire::requestFrom(uint8_t address, uint8_t len, uint8_t sendStop) -{ - return requestFrom(static_cast(address), static_cast(len), static_cast(sendStop)); -} - -uint8_t TwoWire::requestFrom(uint16_t address, uint8_t len, uint8_t sendStop) -{ - return requestFrom(address, static_cast(len), static_cast(sendStop)); -} - -/* Added to match the Arduino function definition: https://github.com/arduino/ArduinoCore-API/blob/173e8eadced2ad32eeb93bcbd5c49f8d6a055ea6/api/HardwareI2C.h#L39 - * See: https://github.com/arduino-libraries/ArduinoECCX08/issues/25 -*/ -uint8_t TwoWire::requestFrom(uint16_t address, uint8_t len, bool stopBit) -{ - return requestFrom((uint16_t)address, (size_t)len, stopBit); -} - -uint8_t TwoWire::requestFrom(uint8_t address, uint8_t len) -{ - return requestFrom(static_cast(address), static_cast(len), true); -} - -uint8_t TwoWire::requestFrom(uint16_t address, uint8_t len) -{ - return requestFrom(address, static_cast(len), true); -} - -uint8_t TwoWire::requestFrom(int address, int len) -{ - return requestFrom(static_cast(address), static_cast(len), true); -} - -uint8_t TwoWire::requestFrom(int address, int len, int sendStop) -{ - return static_cast(requestFrom(static_cast(address), static_cast(len), static_cast(sendStop))); -} +// size_t TwoWire::requestFrom(uint8_t address, size_t len, bool sendStop) +// { +// return requestFrom(static_cast(address), static_cast(len), static_cast(sendStop)); +// } +// +// uint8_t TwoWire::requestFrom(uint8_t address, uint8_t len, uint8_t sendStop) +// { +// return requestFrom(static_cast(address), static_cast(len), static_cast(sendStop)); +// } +// +// uint8_t TwoWire::requestFrom(uint16_t address, uint8_t len, uint8_t sendStop) +// { +// return requestFrom(address, static_cast(len), static_cast(sendStop)); +// } +// +// /* Added to match the Arduino function definition: https://github.com/arduino/ArduinoCore-API/blob/173e8eadced2ad32eeb93bcbd5c49f8d6a055ea6/api/HardwareI2C.h#L39 +// * See: https://github.com/arduino-libraries/ArduinoECCX08/issues/25 +// */ +// uint8_t TwoWire::requestFrom(uint16_t address, uint8_t len, bool stopBit) +// { +// return requestFrom((uint16_t)address, (size_t)len, stopBit); +// } +// +// uint8_t TwoWire::requestFrom(uint8_t address, uint8_t len) +// { +// return requestFrom(static_cast(address), static_cast(len), true); +// } +// +// uint8_t TwoWire::requestFrom(uint16_t address, uint8_t len) +// { +// return requestFrom(address, static_cast(len), true); +// } +// +// uint8_t TwoWire::requestFrom(int address, int len) +// { +// return requestFrom(static_cast(address), static_cast(len), true); +// } +// +// uint8_t TwoWire::requestFrom(int address, int len, int sendStop) +// { +// return static_cast(requestFrom(static_cast(address), static_cast(len), static_cast(sendStop))); +// } void TwoWire::beginTransmission(int address) { diff --git a/libraries/Wire/src/Wire.h b/libraries/Wire/src/Wire.h index a4cdb117443..5af1e7ff939 100644 --- a/libraries/Wire/src/Wire.h +++ b/libraries/Wire/src/Wire.h @@ -100,11 +100,7 @@ class TwoWire: public Stream { return begin(addr, -1, -1, 0); } - inline bool begin(int addr) - { - return begin(static_cast(addr), -1, -1, 0); - } - bool end(); + bool end(); size_t setBufferSize(size_t bSize); @@ -121,15 +117,15 @@ class TwoWire: public Stream uint8_t endTransmission(bool sendStop); uint8_t endTransmission(void); - size_t requestFrom(uint16_t address, size_t size, bool sendStop); - uint8_t requestFrom(uint16_t address, uint8_t size, bool sendStop); - uint8_t requestFrom(uint16_t address, uint8_t size, uint8_t sendStop); - size_t requestFrom(uint8_t address, size_t len, bool stopBit); - uint8_t requestFrom(uint16_t address, uint8_t size); - uint8_t requestFrom(uint8_t address, uint8_t size, uint8_t sendStop); - uint8_t requestFrom(uint8_t address, uint8_t size); - uint8_t requestFrom(int address, int size, int sendStop); - uint8_t requestFrom(int address, int size); + size_t requestFrom(uint16_t address, size_t size, bool sendStop = true); + // uint8_t requestFrom(uint16_t address, uint8_t size, bool sendStop); + // uint8_t requestFrom(uint16_t address, uint8_t size, uint8_t sendStop); + // size_t requestFrom(uint8_t address, size_t len, bool stopBit); + // uint8_t requestFrom(uint16_t address, uint8_t size); + // uint8_t requestFrom(uint8_t address, uint8_t size, uint8_t sendStop); + // uint8_t requestFrom(uint8_t address, uint8_t size); + // uint8_t requestFrom(int address, int size, int sendStop); + // uint8_t requestFrom(int address, int size); size_t write(uint8_t); size_t write(const uint8_t *, size_t);