mirror of
https://github.com/esphome/esphome.git
synced 2026-01-24 03:49:10 -07:00
Compare commits
1 Commits
dev
...
rp2040_pre
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
66a21d3059 |
@@ -8,7 +8,6 @@
|
||||
#include "preferences.h"
|
||||
|
||||
#include <cstring>
|
||||
#include <vector>
|
||||
|
||||
#include "esphome/core/helpers.h"
|
||||
#include "esphome/core/log.h"
|
||||
@@ -25,6 +24,9 @@ static bool s_flash_dirty = false; // NOLINT(cppcoreguidelines-avoid-no
|
||||
|
||||
static const uint32_t RP2040_FLASH_STORAGE_SIZE = 512;
|
||||
|
||||
// Stack buffer size for preferences - covers virtually all real-world preferences without heap allocation
|
||||
static constexpr size_t PREF_BUFFER_SIZE = 64;
|
||||
|
||||
extern "C" uint8_t _EEPROM_start;
|
||||
|
||||
template<class It> uint8_t calculate_crc(It first, It last, uint32_t type) {
|
||||
@@ -42,12 +44,14 @@ class RP2040PreferenceBackend : public ESPPreferenceBackend {
|
||||
uint32_t type = 0;
|
||||
|
||||
bool save(const uint8_t *data, size_t len) override {
|
||||
std::vector<uint8_t> buffer;
|
||||
buffer.resize(len + 1);
|
||||
memcpy(buffer.data(), data, len);
|
||||
buffer[buffer.size() - 1] = calculate_crc(buffer.begin(), buffer.end() - 1, type);
|
||||
const size_t buffer_size = len + 1;
|
||||
SmallBufferWithHeapFallback<PREF_BUFFER_SIZE> buffer_alloc(buffer_size);
|
||||
uint8_t *buffer = buffer_alloc.get();
|
||||
|
||||
for (uint32_t i = 0; i < len + 1; i++) {
|
||||
memcpy(buffer, data, len);
|
||||
buffer[len] = calculate_crc(buffer, buffer + len, type);
|
||||
|
||||
for (size_t i = 0; i < buffer_size; i++) {
|
||||
uint32_t j = offset + i;
|
||||
if (j >= RP2040_FLASH_STORAGE_SIZE)
|
||||
return false;
|
||||
@@ -60,22 +64,23 @@ class RP2040PreferenceBackend : public ESPPreferenceBackend {
|
||||
return true;
|
||||
}
|
||||
bool load(uint8_t *data, size_t len) override {
|
||||
std::vector<uint8_t> buffer;
|
||||
buffer.resize(len + 1);
|
||||
const size_t buffer_size = len + 1;
|
||||
SmallBufferWithHeapFallback<PREF_BUFFER_SIZE> buffer_alloc(buffer_size);
|
||||
uint8_t *buffer = buffer_alloc.get();
|
||||
|
||||
for (size_t i = 0; i < len + 1; i++) {
|
||||
for (size_t i = 0; i < buffer_size; i++) {
|
||||
uint32_t j = offset + i;
|
||||
if (j >= RP2040_FLASH_STORAGE_SIZE)
|
||||
return false;
|
||||
buffer[i] = s_flash_storage[j];
|
||||
}
|
||||
|
||||
uint8_t crc = calculate_crc(buffer.begin(), buffer.end() - 1, type);
|
||||
if (buffer[buffer.size() - 1] != crc) {
|
||||
uint8_t crc = calculate_crc(buffer, buffer + len, type);
|
||||
if (buffer[len] != crc) {
|
||||
return false;
|
||||
}
|
||||
|
||||
memcpy(data, buffer.data(), len);
|
||||
memcpy(data, buffer, len);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1060,11 +1060,11 @@ bool ThermostatClimate::cooling_required_() {
|
||||
auto temperature = this->supports_two_points_ ? this->target_temperature_high : this->target_temperature;
|
||||
|
||||
if (this->supports_cool_) {
|
||||
if (this->current_temperature >= temperature + this->cooling_deadband_) {
|
||||
// if the current temperature reaches or exceeds the target + deadband, cooling is required
|
||||
if (this->current_temperature > temperature + this->cooling_deadband_) {
|
||||
// if the current temperature exceeds the target + deadband, cooling is required
|
||||
return true;
|
||||
} else if (this->current_temperature <= temperature - this->cooling_overrun_) {
|
||||
// if the current temperature is less than or equal to the target - overrun, cooling should stop
|
||||
} else if (this->current_temperature < temperature - this->cooling_overrun_) {
|
||||
// if the current temperature is less than the target - overrun, cooling should stop
|
||||
return false;
|
||||
} else {
|
||||
// if we get here, the current temperature is between target + deadband and target - overrun,
|
||||
@@ -1081,11 +1081,11 @@ bool ThermostatClimate::fanning_required_() {
|
||||
|
||||
if (this->supports_fan_only_) {
|
||||
if (this->supports_fan_only_cooling_) {
|
||||
if (this->current_temperature >= temperature + this->cooling_deadband_) {
|
||||
// if the current temperature reaches or exceeds the target + deadband, fanning is required
|
||||
if (this->current_temperature > temperature + this->cooling_deadband_) {
|
||||
// if the current temperature exceeds the target + deadband, fanning is required
|
||||
return true;
|
||||
} else if (this->current_temperature <= temperature - this->cooling_overrun_) {
|
||||
// if the current temperature is less than or equal to the target - overrun, fanning should stop
|
||||
} else if (this->current_temperature < temperature - this->cooling_overrun_) {
|
||||
// if the current temperature is less than the target - overrun, fanning should stop
|
||||
return false;
|
||||
} else {
|
||||
// if we get here, the current temperature is between target + deadband and target - overrun,
|
||||
@@ -1103,12 +1103,11 @@ bool ThermostatClimate::heating_required_() {
|
||||
auto temperature = this->supports_two_points_ ? this->target_temperature_low : this->target_temperature;
|
||||
|
||||
if (this->supports_heat_) {
|
||||
if (this->current_temperature <= temperature - this->heating_deadband_) {
|
||||
// if the current temperature is below or equal to the target - deadband, heating is required
|
||||
if (this->current_temperature < temperature - this->heating_deadband_) {
|
||||
// if the current temperature is below the target - deadband, heating is required
|
||||
return true;
|
||||
} else if (this->current_temperature >= temperature + this->heating_overrun_) {
|
||||
// if the current temperature is above or equal to the target + overrun, heating should stop
|
||||
|
||||
} else if (this->current_temperature > temperature + this->heating_overrun_) {
|
||||
// if the current temperature is above the target + overrun, heating should stop
|
||||
return false;
|
||||
} else {
|
||||
// if we get here, the current temperature is between target - deadband and target + overrun,
|
||||
|
||||
Reference in New Issue
Block a user