Ich stimme fschrempf zu. Deine vorgeschalgenen Änderungen würden eine tiefgreifende Änderung in dem Programmcode bedeuten. Plus muss die Konfiguration wahrscheinlich zu einem großen Teil im RAM gehalten werden. Das bringt einge Herausforderungen mit sich, das optimal für den RAM-Verbrauch auszuführen (und dabei so flexibel wie möglich zu bleiben).
Ein Beispiel wie wir es nicht lösen sollten (was aber gleichzeitig natürlich die größte Flexibilität mit sich bringt) könnt ihr in squeezelite-esp32 anschauen. Da wird die Konfiguration als JSON Objekt in den externen RAM geladen. Das bringt aber mit sich, dass wir zwingend einen WROVER haben müssen. Sonst reicht der RAM & Flash nicht aus.
Aktuell geht die SW auch sehr gut mit WROOM (also ESP32’s ohen externen RAM) und das will ich ehrlich auch behalten.Da haben wir aktuell um die 60kB Heap für die MP3 Dekodierung. Bluetooth Source funktioniert zB nicht, da der Heap dann auf 5k - 25k zusammenbricht (siehe Neustartschleife nach gescheitertem Anschluss eines Bluetoothkopfhörers). Damit ist es dann nicht mehr verwendbar, da für die MP3 Dekodierung leider gilt: „Mehr ist immer Besser und nur noch mehr ist noch besser“
Ich habe die Makros gesucht (und bin halb verzweifelt dran). Jetzt weiß ich wo ich abkupfern muss ! Danke!!
Des weiteren kann mit c++17 constexpr if verwendet werden indem wir schreiben if constexpr(IS_ENABLED(XYZ))
(order wie in der LED PR if constexpr(NUM_LEDS ==1)
.
Das sind Ausdrücke die zur Compile-Zeit ausgewertet werden und entsprechend dem Ergenbis Pfade genommen werden. Der andere Pfad wird aus dem resultierenden Binary gelöscht.
Bei unserer Verwendung ist das equivalent zu dem #if
, aber mit dem riesen Vorteil, dass man zu dem Zeitpunkt einen c++17 Compiler am „Steuerrad“ hat. D.h. er findet auch Tipp- und Syntaxfehler in dem „nicht genommenem“ Zweig und es könne auch komplexe Ausdrücke und std-Funktionen wie zb if constexpr (std::is_pointer_v<T>)
verwendet werden.
EIn zusätzlicher Vorteil von constexpr if’s ist, wenn der Ausdruck nicht zur Compile-Zeit evaluiert werden kann (weil man zB den Inhalt einer nicht const variable abfragt), kriegt man das als Fehler vom Compiler um die Ohren geschmissen. Das heißt, man kann darauf vertrauen, dass dann auch nur 1 Pfad ohne eine if-Abfrage schlussendlich drin sein wird.
Hier ist eine sehr gute Diskussion drüber: https://www.reddit.com/r/cpp_questions/comments/x6didv/is_using_if_constexpr_equal_to_using_preprocessor/