let make new platform implementation in external components (#7615)

Co-authored-by: Tomasz Duda <tomaszduda23@gmai.com>
This commit is contained in:
tomaszduda23 2024-10-29 04:58:36 +01:00 committed by GitHub
parent abbd7faa64
commit 71e1e3b5f8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 39 additions and 22 deletions

View file

@ -10,6 +10,7 @@
#include <cstdarg> #include <cstdarg>
#include <cstdio> #include <cstdio>
#include <cstring> #include <cstring>
#include <strings.h>
#ifdef USE_HOST #ifdef USE_HOST
#ifndef _WIN32 #ifndef _WIN32
@ -188,37 +189,39 @@ uint32_t fnv1_hash(const std::string &str) {
return hash; return hash;
} }
uint32_t random_uint32() {
#ifdef USE_ESP32 #ifdef USE_ESP32
return esp_random(); uint32_t random_uint32() { return esp_random(); }
#elif defined(USE_ESP8266) #elif defined(USE_ESP8266)
return os_random(); uint32_t random_uint32() { return os_random(); }
#elif defined(USE_RP2040) #elif defined(USE_RP2040)
uint32_t random_uint32() {
uint32_t result = 0; uint32_t result = 0;
for (uint8_t i = 0; i < 32; i++) { for (uint8_t i = 0; i < 32; i++) {
result <<= 1; result <<= 1;
result |= rosc_hw->randombit; result |= rosc_hw->randombit;
} }
return result; return result;
}
#elif defined(USE_LIBRETINY) #elif defined(USE_LIBRETINY)
return rand(); uint32_t random_uint32() { return rand(); }
#elif defined(USE_HOST) #elif defined(USE_HOST)
uint32_t random_uint32() {
std::random_device dev; std::random_device dev;
std::mt19937 rng(dev()); std::mt19937 rng(dev());
std::uniform_int_distribution<uint32_t> dist(0, std::numeric_limits<uint32_t>::max()); std::uniform_int_distribution<uint32_t> dist(0, std::numeric_limits<uint32_t>::max());
return dist(rng); return dist(rng);
#else
#error "No random source available for this configuration."
#endif
} }
#endif
float random_float() { return static_cast<float>(random_uint32()) / static_cast<float>(UINT32_MAX); } float random_float() { return static_cast<float>(random_uint32()) / static_cast<float>(UINT32_MAX); }
bool random_bytes(uint8_t *data, size_t len) {
#ifdef USE_ESP32 #ifdef USE_ESP32
bool random_bytes(uint8_t *data, size_t len) {
esp_fill_random(data, len); esp_fill_random(data, len);
return true; return true;
}
#elif defined(USE_ESP8266) #elif defined(USE_ESP8266)
return os_get_random(data, len) == 0; bool random_bytes(uint8_t *data, size_t len) { return os_get_random(data, len) == 0; }
#elif defined(USE_RP2040) #elif defined(USE_RP2040)
bool random_bytes(uint8_t *data, size_t len) {
while (len-- != 0) { while (len-- != 0) {
uint8_t result = 0; uint8_t result = 0;
for (uint8_t i = 0; i < 8; i++) { for (uint8_t i = 0; i < 8; i++) {
@ -228,10 +231,14 @@ bool random_bytes(uint8_t *data, size_t len) {
*data++ = result; *data++ = result;
} }
return true; return true;
}
#elif defined(USE_LIBRETINY) #elif defined(USE_LIBRETINY)
bool random_bytes(uint8_t *data, size_t len) {
lt_rand_bytes(data, len); lt_rand_bytes(data, len);
return true; return true;
}
#elif defined(USE_HOST) #elif defined(USE_HOST)
bool random_bytes(uint8_t *data, size_t len) {
FILE *fp = fopen("/dev/urandom", "r"); FILE *fp = fopen("/dev/urandom", "r");
if (fp == nullptr) { if (fp == nullptr) {
ESP_LOGW(TAG, "Could not open /dev/urandom, errno=%d", errno); ESP_LOGW(TAG, "Could not open /dev/urandom, errno=%d", errno);
@ -244,10 +251,8 @@ bool random_bytes(uint8_t *data, size_t len) {
} }
fclose(fp); fclose(fp);
return true; return true;
#else
#error "No random source available for this configuration."
#endif
} }
#endif
// Strings // Strings
@ -619,11 +624,13 @@ void hsv_to_rgb(int hue, float saturation, float value, float &red, float &green
#if defined(USE_ESP8266) || defined(USE_RP2040) || defined(USE_HOST) #if defined(USE_ESP8266) || defined(USE_RP2040) || defined(USE_HOST)
// ESP8266 doesn't have mutexes, but that shouldn't be an issue as it's single-core and non-preemptive OS. // ESP8266 doesn't have mutexes, but that shouldn't be an issue as it's single-core and non-preemptive OS.
Mutex::Mutex() {} Mutex::Mutex() {}
Mutex::~Mutex() {}
void Mutex::lock() {} void Mutex::lock() {}
bool Mutex::try_lock() { return true; } bool Mutex::try_lock() { return true; }
void Mutex::unlock() {} void Mutex::unlock() {}
#elif defined(USE_ESP32) || defined(USE_LIBRETINY) #elif defined(USE_ESP32) || defined(USE_LIBRETINY)
Mutex::Mutex() { handle_ = xSemaphoreCreateMutex(); } Mutex::Mutex() { handle_ = xSemaphoreCreateMutex(); }
Mutex::~Mutex() {}
void Mutex::lock() { xSemaphoreTake(this->handle_, portMAX_DELAY); } void Mutex::lock() { xSemaphoreTake(this->handle_, portMAX_DELAY); }
bool Mutex::try_lock() { return xSemaphoreTake(this->handle_, 0) == pdTRUE; } bool Mutex::try_lock() { return xSemaphoreTake(this->handle_, 0) == pdTRUE; }
void Mutex::unlock() { xSemaphoreGive(this->handle_); } void Mutex::unlock() { xSemaphoreGive(this->handle_); }
@ -657,11 +664,13 @@ void HighFrequencyLoopRequester::stop() {
} }
bool HighFrequencyLoopRequester::is_high_frequency() { return num_requests > 0; } bool HighFrequencyLoopRequester::is_high_frequency() { return num_requests > 0; }
void get_mac_address_raw(uint8_t *mac) { // NOLINT(readability-non-const-parameter)
#if defined(USE_HOST) #if defined(USE_HOST)
void get_mac_address_raw(uint8_t *mac) { // NOLINT(readability-non-const-parameter)
static const uint8_t esphome_host_mac_address[6] = USE_ESPHOME_HOST_MAC_ADDRESS; static const uint8_t esphome_host_mac_address[6] = USE_ESPHOME_HOST_MAC_ADDRESS;
memcpy(mac, esphome_host_mac_address, sizeof(esphome_host_mac_address)); memcpy(mac, esphome_host_mac_address, sizeof(esphome_host_mac_address));
}
#elif defined(USE_ESP32) #elif defined(USE_ESP32)
void get_mac_address_raw(uint8_t *mac) { // NOLINT(readability-non-const-parameter)
#if defined(CONFIG_SOC_IEEE802154_SUPPORTED) #if defined(CONFIG_SOC_IEEE802154_SUPPORTED)
// When CONFIG_SOC_IEEE802154_SUPPORTED is defined, esp_efuse_mac_get_default // When CONFIG_SOC_IEEE802154_SUPPORTED is defined, esp_efuse_mac_get_default
// returns the 802.15.4 EUI-64 address, so we read directly from eFuse instead. // returns the 802.15.4 EUI-64 address, so we read directly from eFuse instead.
@ -677,16 +686,20 @@ void get_mac_address_raw(uint8_t *mac) { // NOLINT(readability-non-const-parame
esp_efuse_mac_get_default(mac); esp_efuse_mac_get_default(mac);
} }
#endif #endif
#elif defined(USE_ESP8266)
wifi_get_macaddr(STATION_IF, mac);
#elif defined(USE_RP2040) && defined(USE_WIFI)
WiFi.macAddress(mac);
#elif defined(USE_LIBRETINY)
WiFi.macAddress(mac);
#else
// this should be an error, but that messes with CI checks. #error No mac address method defined
#endif
} }
#elif defined(USE_ESP8266)
void get_mac_address_raw(uint8_t *mac) { // NOLINT(readability-non-const-parameter)
wifi_get_macaddr(STATION_IF, mac);
}
#elif defined(USE_RP2040) && defined(USE_WIFI)
void get_mac_address_raw(uint8_t *mac) { // NOLINT(readability-non-const-parameter)
WiFi.macAddress(mac);
}
#elif defined(USE_LIBRETINY)
void get_mac_address_raw(uint8_t *mac) { // NOLINT(readability-non-const-parameter)
WiFi.macAddress(mac);
}
#endif
std::string get_mac_address() { std::string get_mac_address() {
uint8_t mac[6]; uint8_t mac[6];

View file

@ -7,6 +7,7 @@
#include <string> #include <string>
#include <type_traits> #include <type_traits>
#include <vector> #include <vector>
#include <limits>
#include "esphome/core/optional.h" #include "esphome/core/optional.h"
@ -545,6 +546,7 @@ class Mutex {
public: public:
Mutex(); Mutex();
Mutex(const Mutex &) = delete; Mutex(const Mutex &) = delete;
~Mutex();
void lock(); void lock();
bool try_lock(); bool try_lock();
void unlock(); void unlock();
@ -554,6 +556,8 @@ class Mutex {
private: private:
#if defined(USE_ESP32) || defined(USE_LIBRETINY) #if defined(USE_ESP32) || defined(USE_LIBRETINY)
SemaphoreHandle_t handle_; SemaphoreHandle_t handle_;
#else
void *handle_; // d-pointer to store private data on new platforms
#endif #endif
}; };