# Verbesserung Neopixel Anzeige im Modus Bluetooth Lautsprecher

**URL:** <https://forum.espuino.de/t/verbesserung-neopixel-anzeige-im-modus-bluetooth-lautsprecher/1969>\
**Category:** Software\
**Created:** [22. Mai 2023 um 09:18 UTC](https://forum.espuino.de/t/verbesserung-neopixel-anzeige-im-modus-bluetooth-lautsprecher/1969 "2023-05-22T09:18:55Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![tueddy](https://forum.espuino.de/user_avatar/forum.espuino.de/tueddy/32/22_2.png) [@tueddy](https://forum.espuino.de/u/tueddy)\
**Post date:** [22. Mai 2023 um 09:18 UTC](https://forum.espuino.de/t/verbesserung-neopixel-anzeige-im-modus-bluetooth-lautsprecher/1969/1 "2023-05-22T09:18:56Z")

</div>

Mir war aufgefallen das die Neopixel Anzeige bei Modus Bluetooth-Lautsprecher nur eine Pause signalisiert, also die LEDs nur blau rotieren. Habe das etwas erweitert, der Neopixel zeigt jetzt diese Zustände an:

- Noch nicht verbunden: LED rotieren Blau-violett (Genauso wie bei BT-Kopfhörer)
- Pairing hergestellt: LED wechseln zu Blau
- Audio gestartet: LED leuchten genauso wie im Webradio-Modus, nur eben blau
- Lautstärke Änderungen der Quelle z.B. am Handy werden genauso wie in allen anderen Modi visualisiert

Die Änderungen sind minimal, evt. könnt Ihr Euch das mal anschauen und eine Meinung dazu abgeben?

> <https://github.com/biologist79/ESPuino/pull/239>
>
> \- BT-Sink disconnected: Show blue-violet (same as in BT-source mode)
> \- BT-Sink …connected: switch to blue
> \- start audio: show neopixel in webstream mode but with blue leds
> \- show volume change same as in other modes

---

<div class="post-metadata">

**Author:** ![laszloh](https://forum.espuino.de/user_avatar/forum.espuino.de/laszloh/32/1975_2.png) [@laszloh](https://forum.espuino.de/u/laszloh)\
**Post date:** [22. Mai 2023 um 12:14 UTC](https://forum.espuino.de/t/verbesserung-neopixel-anzeige-im-modus-bluetooth-lautsprecher/1969/2 "2023-05-22T12:14:57Z")

</div>

Schaut gut aus.

Zwei Punkte könnten verbessert werden.

Punkt 1:  
Den Else-Zweig in Led.cpp rausziehen und mit dem if überschreiben. Das führt zu einer Branch Optimierung mit der Annahme, dass Bluetooth normalerweise nicht aktiv ist.

Led.cpp, Zeile 647:

```cpp
			CRGB::HTMLColorCode generalColor = CRGB::Orange;
			if (OPMODE_BLUETOOTH_SINK == System_GetOperationMode()) {
				generalColor = CRGB::Blue;
			}

```

und gleiches Vorgehen in Zeile 681:

```cpp
						leds[Led_Address(ledPosWebstream)].setHue(webstreamColor);
						leds[(Led_Address(ledPosWebstream) + leds.size() / 2) % leds.size()].setHue(webstreamColor++);
						if (OPMODE_BLUETOOTH_SINK == System_GetOperationMode()) {
							leds[Led_Address(ledPosWebstream)] = CRGB::Blue;
							leds[(Led_Address(ledPosWebstream) + leds.size() / 2) % leds.size()] = CRGB::Blue;
						}

```

Punkt 2:  
CRGB::Blue und CRGB::BlueViolet in `static constexpr CRGB::HTMLColorCode` Variablen raus ziehen, die verwenden wir schon recht oft, das würde eine Änderung des Farbschemas erleichtern.

---

<div class="post-metadata">

**Author:** ![tueddy](https://forum.espuino.de/user_avatar/forum.espuino.de/tueddy/32/22_2.png) [@tueddy](https://forum.espuino.de/u/tueddy)\
**Post date:** [22. Mai 2023 um 13:00 UTC](https://forum.espuino.de/t/verbesserung-neopixel-anzeige-im-modus-bluetooth-lautsprecher/1969/3 "2023-05-22T13:00:37Z")

</div>

@laszloh Danke für’s rüberschauen!  
Leider hat die Einführung von `constexpr ` dazu geführt das der DEV-Branch nicht mehr mit Arduino 1.0.6 kompiliert, wir hatten das lange ermöglicht. Aber OK, dann ist so…

Welchen Vorteil bringt das eigentlich? Spart das Speicher? Kann der Compiler besser optimieren?

---

<div class="post-metadata">

**Author:** ![laszloh](https://forum.espuino.de/user_avatar/forum.espuino.de/laszloh/32/1975_2.png) [@laszloh](https://forum.espuino.de/u/laszloh)\
**Post date:** [22. Mai 2023 um 13:57 UTC](https://forum.espuino.de/t/verbesserung-neopixel-anzeige-im-modus-bluetooth-lautsprecher/1969/4 "2023-05-22T13:57:31Z")

</div>

Hm… das ist nervig, der Absturz ist bei `if constexpr([...])`, das kennt c++11 natürlich nicht. Ich hatte [hier](https://forum.espuino.de/t/automatische-code-formatierung/1908/12) mal beschrieben, was genau das macht (forciert den Compiler zur Optimierung der Verzweigung zur Compile-Zeit). Ist aber ein std++17 Feature und der gcc von Arduino 1.0 spricht leider nur c++11…

Aber wenn ich das repariere, tun sich einige andere Problemstellen auf (zB `ESP_ARDUINO_VERSION_VAL` ist undefined, `std::clamp` gibt es nicht, etc.).

Ich denke das sollten wir generell in der Dev-Branch ansprechen, ob Rückwärtskompatibilität zu Arduino 1.0 gewünscht ist.

  

Vorteil ist dass der Code pflegeleichter wird, wenn wir die Farben in globale Variablen raus ziehen. Und wenn jemand ein anderes Farbschema hat, kann er es einfach an einer Stelle ändern und das ändert dann alle relevanten Teile des Codes (da wir zB für die Playlist ja auch die Farbe Blau verwenden wäre diese auch von search&replace betroffen)

constexpr ist grundsätzlich eine Variable, dessen Wert zur Zeitpunkt des compilierens bekannt ist (gegenüber zB einem const, der zur Laufzeit 1x gesetzt wird). Das erlaubt es dem gcc diese Variable zu optimieren und bringt einiges an Vorteilen gegenüber einem Makro. zB Sichtbarkeit (#define ist im ganzen Code gültig über namespaces hinaus), Sicherheit bei einer Zuweisung.

> <https://stackoverflow.com/questions/42388077/constexpr-vs-macros>

Ein weiterer großer Punkt ist, dass constexpr dich zwingt sauberen C++ Code zu schreiben. ZB:

```cpp
#define begin() x=4
#define end() x=17
[...] // viele Zeilen code
void x(){
  int x = 33;
  begin(); // begin verändert x ohne dass der Programmierer davon __hier__ etwas mitbekommt
  printf("%d", x);
  end();
}

// mit constexpr 
constexpr int begin() {
  return 4;
}

void x(){
  int x = 33;
  begin(); // hier hat begin keine Auswirkung auf x
  [...]
}

```

---

<div class="post-metadata">

**Author:** ![tueddy](https://forum.espuino.de/user_avatar/forum.espuino.de/tueddy/32/22_2.png) [@tueddy](https://forum.espuino.de/u/tueddy)\
**Post date:** [22. Mai 2023 um 14:13 UTC](https://forum.espuino.de/t/verbesserung-neopixel-anzeige-im-modus-bluetooth-lautsprecher/1969/5 "2023-05-22T14:13:05Z")

</div>

@laszloh Danke für die Ausführungen!

> [@laszloh](#):
>
> Ich denke das sollten wir generell in der Dev-Branch ansprechen, ob Rückwärtskompatibilität zu Arduino 1.0 gewünscht ist.

Das ist bereits [hier](https://forum.espuino.de/t/dev-branch/1835/130) angestoßen 😉

---

<div class="post-metadata">

**Author:** ![tueddy](https://forum.espuino.de/user_avatar/forum.espuino.de/tueddy/32/22_2.png) [@tueddy](https://forum.espuino.de/u/tueddy)\
**Post date:** [25. Mai 2023 um 20:28 UTC](https://forum.espuino.de/t/verbesserung-neopixel-anzeige-im-modus-bluetooth-lautsprecher/1969/6 "2023-05-25T20:28:13Z")

</div>

@laszloh Punkt 1 ist [umgesetzt](https://github.com/biologist79/ESPuino/pull/239/commits/4ecc83857d95d46718ed5ab78b0e4c7aa19a2706#). Zu Punkt 2:  
Die Intention dazu kann ich nachvollziehen, allerdings geht das über das eigentliche Thema etwas hinaus. Ziehe ich jetzt die Bluetooth Farbe Blau als Farbschema heraus müsste ich das eigentluch für alle Farbdefinitionen machen. Es ist ja jetzt keine neue Farbe hinzugekommen sondern lediglich das bestehende BT-Source auf BT-Sink übernommen. Ich habe mich hier an den bestehenden Code gehalten.

Vorschlag: Wir übernehmen das so zunächst & sobald jemand das Farbschema anfassen möchte dann macht der das dann 😉  
Farbschema sehe ich auch eher für die Weboberfläche (Darkmodus ist der heiße Sch…). beim Neopixel eher weniger, Kapitän [Blauzahn](https://www.youtube.com/watch?v=duxvNTvVLF4) leuchtet eben immer blau…

---

<div class="post-metadata">

**Author:** ![tueddy](https://forum.espuino.de/user_avatar/forum.espuino.de/tueddy/32/22_2.png) [@tueddy](https://forum.espuino.de/u/tueddy)\
**Post date:** [1. Juni 2023 um 20:51 UTC](https://forum.espuino.de/t/verbesserung-neopixel-anzeige-im-modus-bluetooth-lautsprecher/1969/7 "2023-06-01T20:51:15Z")

</div>

Die verbesserte Neopixel Anzeige im Modus „ESPuno als Buetooth-Lautsprecher“ ist jetzt im DEV-Branch verfügbar.
