From aec5ccdd0e4e3a36256443dd097b0211c29ab57e Mon Sep 17 00:00:00 2001 From: rtlopez Date: Wed, 5 Feb 2025 23:11:27 +0100 Subject: [PATCH] standard c++17 --- lib/EscDriver/src/EscDriverEsp32.cpp | 2 +- lib/EscDriver/src/EscDriverEsp32.h | 4 +-- lib/Espfc/src/Blackbox/BlackboxFlashfs.cpp | 2 +- lib/Espfc/src/Blackbox/BlackboxSerialBuffer.h | 16 +++++++-- lib/Espfc/src/Connect/Cli.cpp | 8 ++--- lib/Espfc/src/Device/BusSPI.h | 8 ++--- lib/Espfc/src/Device/InputCRSF.h | 4 +-- lib/Espfc/src/Device/InputEspNow.h | 2 +- lib/Espfc/src/Device/InputPPM.h | 4 +-- lib/Espfc/src/Device/InputSBUS.h | 4 +-- lib/Espfc/src/Input.h | 4 +-- lib/Espfc/src/ModelConfig.h | 4 +-- lib/Espfc/src/Sensor/GyroSensor.cpp | 4 +++ lib/Espfc/src/Sensor/GyroSensor.h | 1 + lib/Espfc/src/Utils/FFTAnalyzer.hpp | 22 +++++++----- lib/Espfc/src/Utils/FFTAnalyzer.ipp | 16 ++++++++- lib/Espfc/src/Utils/Filter.h | 2 +- lib/Espfc/src/Utils/Logger.h | 12 +++++++ lib/Espfc/src/Utils/Storage.h | 6 ++-- partitions_4M_nota.csv | 10 +++--- platformio.ini | 34 +++++++++++++++---- 21 files changed, 118 insertions(+), 51 deletions(-) diff --git a/lib/EscDriver/src/EscDriverEsp32.cpp b/lib/EscDriver/src/EscDriverEsp32.cpp index f4c0809..e08f1dc 100644 --- a/lib/EscDriver/src/EscDriverEsp32.cpp +++ b/lib/EscDriver/src/EscDriverEsp32.cpp @@ -8,7 +8,7 @@ #include "hal/gpio_ll.h" #include "esp_rom_gpio.h" -static const size_t DURATION_CLOCK = 25; // [ns] doubled value to increase precision +static constexpr size_t DURATION_CLOCK = 25; // [ns] doubled value to increase precision #define TO_INTERVAL_US(v) (1 * 1000 * 1000 / (v)) // [us] #define RMT_RX_CHANNEL_ENCODING_START (SOC_RMT_CHANNELS_PER_GROUP - SOC_RMT_TX_CANDIDATES_PER_GROUP) diff --git a/lib/EscDriver/src/EscDriverEsp32.h b/lib/EscDriver/src/EscDriverEsp32.h index e2b6e3f..742f260 100644 --- a/lib/EscDriver/src/EscDriverEsp32.h +++ b/lib/EscDriver/src/EscDriverEsp32.h @@ -58,8 +58,8 @@ class EscDriverEsp32: public EscDriverBase return (int)pin != -1; } - static const size_t ITEM_COUNT = DSHOT_BIT_COUNT + 1; - static const int32_t DURATION_MAX = 0x7fff; // max in 15 bits + static constexpr size_t ITEM_COUNT = DSHOT_BIT_COUNT + 1; + static constexpr int32_t DURATION_MAX = 0x7fff; // max in 15 bits rmt_item32_t items[ITEM_COUNT]; int pin; diff --git a/lib/Espfc/src/Blackbox/BlackboxFlashfs.cpp b/lib/Espfc/src/Blackbox/BlackboxFlashfs.cpp index 41e1228..5bef9e0 100644 --- a/lib/Espfc/src/Blackbox/BlackboxFlashfs.cpp +++ b/lib/Espfc/src/Blackbox/BlackboxFlashfs.cpp @@ -7,7 +7,7 @@ #include "Utils/RingBuf.h" #include "Utils/Math.hpp" -static const uint32_t FLASHFS_ERASED_VAL = 0xffffffff; +static constexpr uint32_t FLASHFS_ERASED_VAL = 0xffffffff; using BufferType = Espfc::Utils::RingBuf; diff --git a/lib/Espfc/src/Blackbox/BlackboxSerialBuffer.h b/lib/Espfc/src/Blackbox/BlackboxSerialBuffer.h index 0cd95e7..6df25cf 100644 --- a/lib/Espfc/src/Blackbox/BlackboxSerialBuffer.h +++ b/lib/Espfc/src/Blackbox/BlackboxSerialBuffer.h @@ -10,11 +10,22 @@ namespace Blackbox { class BlackboxSerialBuffer: public Device::SerialDevice { public: - BlackboxSerialBuffer(): _dev(nullptr), _idx(0) {} + static constexpr size_t SIZE = SERIAL_TX_FIFO_SIZE;//128; + + BlackboxSerialBuffer(): _dev(nullptr), _idx(0), _data(nullptr) {} + + ~BlackboxSerialBuffer() + { + if(!_data) return; + + delete[] _data; + _data = nullptr; + } virtual void wrap(Espfc::Device::SerialDevice * s) { _dev = s; + _data = new uint8_t[SIZE]; } virtual void begin(const Espfc::SerialDeviceConfig& conf) @@ -74,11 +85,10 @@ class BlackboxSerialBuffer: public Device::SerialDevice virtual bool isSoft() const { return false; }; virtual operator bool() const { return (bool)(*_dev); } - static const size_t SIZE = SERIAL_TX_FIFO_SIZE;//128; Device::SerialDevice * _dev; size_t _idx; - uint8_t _data[SIZE]; + uint8_t* _data; }; } diff --git a/lib/Espfc/src/Connect/Cli.cpp b/lib/Espfc/src/Connect/Cli.cpp index 16b45f0..d7a2cd0 100644 --- a/lib/Espfc/src/Connect/Cli.cpp +++ b/lib/Espfc/src/Connect/Cli.cpp @@ -1332,7 +1332,7 @@ void Cli::execute(CliCmd& cmd, Stream& s) else if(strcmp_P(cmd.args[0], PSTR("logs")) == 0) { s.print(_model.logger.c_str()); - s.print(PSTR("total: ")); + s.print(PSTR("usage: ")); s.println(_model.logger.length()); } #ifdef USE_FLASHFS @@ -1442,13 +1442,13 @@ void Cli::printVersion(Stream& s) const s.print(buildDate); s.print(' '); s.print(buildTime); - s.print(' '); + s.print(" api="); s.print(API_VERSION_MAJOR); s.print('.'); s.print(API_VERSION_MINOR); - s.print(' '); + s.print(" gcc="); s.print(__VERSION__); - s.print(' '); + s.print(" std="); s.print(__cplusplus); } diff --git a/lib/Espfc/src/Device/BusSPI.h b/lib/Espfc/src/Device/BusSPI.h index 1192057..1f9ca6e 100644 --- a/lib/Espfc/src/Device/BusSPI.h +++ b/lib/Espfc/src/Device/BusSPI.h @@ -12,11 +12,11 @@ class BusSPI: public BusDevice public: BusSPI(ESPFC_SPI_0_DEV_T& spi); - static const uint8_t SPI_READ = 0x80; - static const uint8_t SPI_WRITE = 0x7f; + static constexpr uint8_t SPI_READ = 0x80; + static constexpr uint8_t SPI_WRITE = 0x7f; - static const uint32_t SPI_SPEED_NORMAL = 1000000; - static const uint32_t SPI_SPEED_FAST = 16000000; + static constexpr uint32_t SPI_SPEED_NORMAL = 1000000; + static constexpr uint32_t SPI_SPEED_FAST = 16000000; BusType getType() const override; diff --git a/lib/Espfc/src/Device/InputCRSF.h b/lib/Espfc/src/Device/InputCRSF.h index 1d145ff..465fd9a 100644 --- a/lib/Espfc/src/Device/InputCRSF.h +++ b/lib/Espfc/src/Device/InputCRSF.h @@ -43,8 +43,8 @@ class InputCRSF: public InputDevice void applyChannels(const Rc::CrsfMessage& msg); void applyMspReq(const Rc::CrsfMessage& msg); - static const size_t CHANNELS = 16; - static const size_t TELEMETRY_INTERVAL = 20000; + static constexpr size_t CHANNELS = 16; + static constexpr size_t TELEMETRY_INTERVAL = 20000; Device::SerialDevice * _serial; TelemetryManager * _telemetry; diff --git a/lib/Espfc/src/Device/InputEspNow.h b/lib/Espfc/src/Device/InputEspNow.h index 1b5c083..9d1cb9f 100644 --- a/lib/Espfc/src/Device/InputEspNow.h +++ b/lib/Espfc/src/Device/InputEspNow.h @@ -23,7 +23,7 @@ class InputEspNow: public InputDevice private: EspNowRcLink::Receiver _rx; - static const size_t CHANNELS = EspNowRcLink::RC_CHANNEL_MAX + 1; + static constexpr size_t CHANNELS = EspNowRcLink::RC_CHANNEL_MAX + 1; uint16_t _channels[CHANNELS]; }; diff --git a/lib/Espfc/src/Device/InputPPM.h b/lib/Espfc/src/Device/InputPPM.h index 4ef4cb7..baa9d57 100644 --- a/lib/Espfc/src/Device/InputPPM.h +++ b/lib/Espfc/src/Device/InputPPM.h @@ -24,8 +24,8 @@ class InputPPM: public InputDevice bool needAverage() const override; private: - static const size_t CHANNELS = 16; - static const uint32_t BROKEN_LINK_US = 100000UL; // 100ms + static constexpr size_t CHANNELS = 16; + static constexpr uint32_t BROKEN_LINK_US = 100000UL; // 100ms void handle(); static void handle_isr(void* args); diff --git a/lib/Espfc/src/Device/InputSBUS.h b/lib/Espfc/src/Device/InputSBUS.h index dbf54c7..c15d215 100644 --- a/lib/Espfc/src/Device/InputSBUS.h +++ b/lib/Espfc/src/Device/InputSBUS.h @@ -64,8 +64,8 @@ class InputSBUS: public InputDevice void apply(); uint16_t convert(int v); - const static size_t SBUS_FRAME_SIZE = sizeof(SbusData); - static const size_t CHANNELS = 16; + static constexpr size_t SBUS_FRAME_SIZE = sizeof(SbusData); + static constexpr size_t CHANNELS = 16; Device::SerialDevice * _serial; SbusState _state; diff --git a/lib/Espfc/src/Input.h b/lib/Espfc/src/Input.h index 89aeba3..11af6b4 100644 --- a/lib/Espfc/src/Input.h +++ b/lib/Espfc/src/Input.h @@ -69,8 +69,8 @@ class Input Device::InputEspNow _espnow; #endif - static const uint32_t TENTH_TO_US = 100000UL; // 1_000_000 / 10; - static const uint32_t FRAME_TIME_DEFAULT_US = 23000; // 23 ms + static constexpr uint32_t TENTH_TO_US = 100000UL; // 1_000_000 / 10; + static constexpr uint32_t FRAME_TIME_DEFAULT_US = 23000; // 23 ms }; } diff --git a/lib/Espfc/src/ModelConfig.h b/lib/Espfc/src/ModelConfig.h index 8c48b93..5196b5a 100644 --- a/lib/Espfc/src/ModelConfig.h +++ b/lib/Espfc/src/ModelConfig.h @@ -509,11 +509,11 @@ enum ArmingDisabledFlags { ARMING_DISABLED_ARM_SWITCH = (1 << 25), // Needs to be the last element, since it's always activated if one of the others is active when arming }; -static const size_t ARMING_DISABLED_FLAGS_COUNT = 25; +static constexpr size_t ARMING_DISABLED_FLAGS_COUNT = 25; struct WirelessConfig { - static const size_t MAX_LEN = 32; + static constexpr size_t MAX_LEN = 32; int16_t port = 1111; char ssid[MAX_LEN + 1]; char pass[MAX_LEN + 1]; diff --git a/lib/Espfc/src/Sensor/GyroSensor.cpp b/lib/Espfc/src/Sensor/GyroSensor.cpp index 648f314..dda7f6b 100644 --- a/lib/Espfc/src/Sensor/GyroSensor.cpp +++ b/lib/Espfc/src/Sensor/GyroSensor.cpp @@ -18,6 +18,10 @@ GyroSensor::GyroSensor(Model &model) : _dyn_notch_denom(1), _model(model) { } +GyroSensor::~GyroSensor() +{ +} + int GyroSensor::begin() { _gyro = _model.state.gyro.dev; diff --git a/lib/Espfc/src/Sensor/GyroSensor.h b/lib/Espfc/src/Sensor/GyroSensor.h index ea38857..dc3bef9 100644 --- a/lib/Espfc/src/Sensor/GyroSensor.h +++ b/lib/Espfc/src/Sensor/GyroSensor.h @@ -21,6 +21,7 @@ class GyroSensor: public BaseSensor { public: GyroSensor(Model& model); + ~GyroSensor(); int begin(); int read(); diff --git a/lib/Espfc/src/Utils/FFTAnalyzer.hpp b/lib/Espfc/src/Utils/FFTAnalyzer.hpp index 5e3528b..b061b74 100644 --- a/lib/Espfc/src/Utils/FFTAnalyzer.hpp +++ b/lib/Espfc/src/Utils/FFTAnalyzer.hpp @@ -22,16 +22,18 @@ class FFTAnalyzer { public: FFTAnalyzer(); + ~FFTAnalyzer(); + int begin(int16_t rate, const DynamicFilterConfig& config, size_t axis); int update(float v); - static const size_t PEAKS_MAX = 8; + static constexpr size_t PEAKS_MAX = 8; Utils::Peak peaks[PEAKS_MAX]; private: void clearPeaks(); - static const size_t BINS = SAMPLES >> 1; + static constexpr size_t BINS = SAMPLES >> 1; int16_t _rate; int16_t _freq_min; @@ -44,14 +46,18 @@ class FFTAnalyzer size_t _end; float _bin_width; - // fft input - __attribute__((aligned(16))) float _in[SAMPLES]; + // // fft input + // __attribute__((aligned(16))) float _in[SAMPLES]; + + // // fft output + // __attribute__((aligned(16))) float _out[SAMPLES]; - // fft output - __attribute__((aligned(16))) float _out[SAMPLES]; + // // Window coefficients + // __attribute__((aligned(16))) float _win[SAMPLES]; - // Window coefficients - __attribute__((aligned(16))) float _win[SAMPLES]; + float* _in; + float* _out; + float* _win; }; } diff --git a/lib/Espfc/src/Utils/FFTAnalyzer.ipp b/lib/Espfc/src/Utils/FFTAnalyzer.ipp index d521986..959c3ab 100644 --- a/lib/Espfc/src/Utils/FFTAnalyzer.ipp +++ b/lib/Espfc/src/Utils/FFTAnalyzer.ipp @@ -6,6 +6,7 @@ #include "Utils/FFTAnalyzer.hpp" #include "dsps_fft4r.h" #include "dsps_wind_hann.h" +#include "esp_heap_caps.h" #include namespace Espfc { @@ -13,7 +14,20 @@ namespace Espfc { namespace Utils { template -FFTAnalyzer::FFTAnalyzer(): _idx(0), _phase(PHASE_COLLECT) {} +FFTAnalyzer::FFTAnalyzer(): _idx(0), _phase(PHASE_COLLECT), _begin(0), _end(0), _in(nullptr), _out(nullptr), _win(nullptr) +{ + _in = static_cast(heap_caps_aligned_alloc(16u, SAMPLES, MALLOC_CAP_DEFAULT)); + _out = static_cast(heap_caps_aligned_alloc(16u, SAMPLES, MALLOC_CAP_DEFAULT)); + _win = static_cast(heap_caps_aligned_alloc(16u, SAMPLES, MALLOC_CAP_DEFAULT)); +} + +template +FFTAnalyzer::~FFTAnalyzer() +{ + heap_caps_free(_in); + heap_caps_free(_out); + heap_caps_free(_win); +} template int FFTAnalyzer::begin(int16_t rate, const DynamicFilterConfig& config, size_t axis) diff --git a/lib/Espfc/src/Utils/Filter.h b/lib/Espfc/src/Utils/Filter.h index e37dc71..74a861f 100644 --- a/lib/Espfc/src/Utils/Filter.h +++ b/lib/Espfc/src/Utils/Filter.h @@ -47,7 +47,7 @@ class DynamicFilterConfig { int16_t q = 300; int16_t min_freq = 80; int16_t max_freq = 400; - static const int MIN_FREQ = 1000; + static constexpr int MIN_FREQ = 1000; }; namespace Utils { diff --git a/lib/Espfc/src/Utils/Logger.h b/lib/Espfc/src/Utils/Logger.h index f037eb4..9a896d4 100644 --- a/lib/Espfc/src/Utils/Logger.h +++ b/lib/Espfc/src/Utils/Logger.h @@ -9,6 +9,18 @@ namespace Utils { class Logger { public: + Logger(): _buff(nullptr), _size(0), _tail(0) { } + + ~Logger() + { + if(!_buff) return; + + delete[] _buff; + _buff = nullptr; + _size = 0; + _tail = 0; + } + int begin(size_t size = 1024) { _size = size; diff --git a/lib/Espfc/src/Utils/Storage.h b/lib/Espfc/src/Utils/Storage.h index c2b90f1..a27489e 100644 --- a/lib/Espfc/src/Utils/Storage.h +++ b/lib/Espfc/src/Utils/Storage.h @@ -31,9 +31,9 @@ class Storage StorageResult save(const ModelConfig& config); private: - static const uint8_t EEPROM_MAGIC = 0xA5; - static const uint8_t EEPROM_VERSION = 0x01; - static const size_t EEPROM_SIZE = 2048; + static constexpr uint8_t EEPROM_MAGIC = 0xA5; + static constexpr uint8_t EEPROM_VERSION = 0x01; + static constexpr size_t EEPROM_SIZE = 2048; }; } diff --git a/partitions_4M_nota.csv b/partitions_4M_nota.csv index 71d9f5e..feb4435 100644 --- a/partitions_4M_nota.csv +++ b/partitions_4M_nota.csv @@ -1,6 +1,6 @@ # Name, Type, SubType, Offset, Size, Flags -nvs, data, nvs, 0x9000, 0x5000, -otadata, data, ota, 0xe000, 0x2000, -app0, app, ota_0, 0x10000, 0x100000, -spiffs, data, spiffs, 0x110000,0x2E0000, -coredump, data, coredump,0x3F0000,0x10000, +nvs, data, nvs, 0x009000, 0x005000, +otadata, data, ota, 0x00e000, 0x002000, +app0, app, ota_0, 0x010000, 0x140000, +spiffs, data, spiffs, 0x150000, 0x2A0000, +coredump, data, coredump,0x3F0000, 0x010000, diff --git a/platformio.ini b/platformio.ini index 91cd381..fc1322e 100644 --- a/platformio.ini +++ b/platformio.ini @@ -12,9 +12,8 @@ default_envs = esp32, esp32s2, esp32s3, esp32c3, esp8266, rp2040, rp2350 [env] build_flags = - -std=c++14 + -std=gnu++17 -Wall - -O2 ; -DESPFC_DEBUG_SERIAL ; -DESPFC_DEBUG_PIN=2 ; specify pin number (board specific) ; -DESPFC_DEV_PRESET_MODES @@ -28,10 +27,15 @@ build_flags = ; -DDEBUG_RP2040_PORT=Serial ; -DDEBUG_RP2040_SPI +build_unflags = + -std=gnu++11 + -ggdb + monitor_speed = 115200 upload_speed = 921600 ; monitor_filters = esp8266_exception_decoder ; monitor_filters = esp32_exception_decoder + lib_deps = yoursunny/WifiEspNow @ ^0.0.20230713 https://github.com/rtlopez/espnow-rclink/archive/refs/tags/v0.1.1.zip @@ -47,6 +51,8 @@ board_build.flash_mode = qio board_build.partitions = partitions_4M_nota.csv lib_deps = ${env.lib_deps} +build_unflags = + ${env.build_unflags} build_flags = ${env.build_flags} extra_scripts = merge_firmware.py @@ -61,13 +67,14 @@ board_build.flash_mode = qio board_build.partitions = partitions_4M_nota.csv lib_deps = ${env.lib_deps} +build_unflags = + ${env.build_unflags} + -DBOARD_HAS_PSRAM build_flags = ${env.build_flags} -DESP32S3 -DARDUINO_USB_MODE=1 -DARDUINO_USB_CDC_ON_BOOT=1 -build_unflags = - -DBOARD_HAS_PSRAM extra_scripts = merge_firmware.py board_upload.use_1200bps_touch = yes board_upload.wait_for_upload_port = yes @@ -80,8 +87,11 @@ framework = arduino board_build.f_cpu = 240000000L board_build.f_flash = 80000000L board_build.flash_mode = qio +board_build.partitions = partitions_4M_nota.csv lib_deps = ${env.lib_deps} +build_unflags = + ${env.build_unflags} build_flags = ${env.build_flags} -DESP32S2 @@ -102,6 +112,8 @@ board_build.f_flash = 80000000L board_build.flash_mode = qio lib_deps = ${env.lib_deps} +build_unflags = + ${env.build_unflags} build_flags = ${env.build_flags} -DESP32C3 @@ -121,6 +133,8 @@ board_build.ldscript = eagle.flash.4m3m.ld ;board_build.ldscript = eagle.flash.16m15m.ld ; d1_mini_pro lib_deps = ${env.lib_deps} +build_unflags = + ${env.build_unflags} build_flags = ${env.build_flags} @@ -131,6 +145,8 @@ platform = https://github.com/maxgerhardt/platform-raspberrypi.git framework = arduino board_build.core = earlephilhower lib_deps = +build_unflags = + ${env.build_unflags} build_flags = ${env.build_flags} -DARCH_RP2040 @@ -144,6 +160,8 @@ platform = https://github.com/maxgerhardt/platform-raspberrypi.git framework = arduino board_build.core = earlephilhower lib_deps = +build_unflags = + ${env.build_unflags} build_flags = ${env.build_flags} -DARCH_RP2040 @@ -155,11 +173,13 @@ build_flags = [env:native] platform = native lib_deps = - ArduinoFake + fabiobatsilva/ArduinoFake@^0.4.0 + throwtheswitch/Unity@^2.6.0 +build_unflags = + -std=gnu++11 build_flags = -DIRAM_ATTR="" -DUNIT_TEST - -std=c++14 - -g + -std=c++17 -DNO_GLOBAL_INSTANCES ; -DUNITY_INCLUDE_PRINT_FORMATTED