Modifikationskarten Idee

Hallo liebe Tonuino Gemeinde. Ich bin grade dabei 2 Tonuinos für meine Kids zu bauen, sie funktionieren schon. Allerdings würde ich mir eine Modifikationskarte wünschen mit der ich eine maximale Lautstärke festlegen kann. Also Karte auflegen = max Lautstärke z.b. 15.
Karte nochmal auflegen, Lautstärke wieder freigegeben.

Ich möchte nicht jedes mal in das Admin Menü um die max. Lautstärke anzupassen.

Ist das möglich?

Hintergrund ist das ich verhindern möchte das die Kiddies die Nachtruhe stören :slight_smile:

Das würde mich auch sehr interessieren! Ich dachte eigentlich dass ich dazu schon was im Forum gelesen hätte, aber finde es nicht mehr. Ich bräuchte die Karten um die maximale Lautstärke beim Anschluss eines Kopfhörers einfach begrenzen zu können… Danke auch von mir!

Hallo,
Ja das ist möglich.

Schau dir mal den FeedbackModifier an. Einzig das Zurücksetzen beim Entfernen müsste zusätzlich implementiert werden. Wenn man aber einfach den Modofier um einen destruktor erweitert, wäre das kein Problem.

Mit Integration im Adminmenü und Erstellung der MP3s ca. 30 min Arbeit.

Wenn ich gleich am PC bin, schreib ich ich mal was dazu.

Die Idee ist ja eigentlich auch, dass man das genau einmal - für seine Box abgestimmt - macht. Wenn du da ständig ran musst sind deine mp3 vielleicht sehr unterschiedlich laut? Es gibt im Forum Hilfen zur Normalisierung. Vielleicht schaust du dir das mal an.

Ja wie @pit schon erläutert, im Prinzip ja. Allerdings kann nur ein Modifikatoren zu einer Zeit aktiv sein. Ich weiß nicht ob ich das für sowas wie Lautstärke „opfern“ würde.

Ich würde ich das eher durch die Erkennung Kopfhörer drin ja/nein lösen. Nicht durch einen zusätzliche Aktion.

Zur Verwendung zwecks Kopfhörer stimme ich @stephan zu, wenn es möglich ist die Kopfhörerbuchse zu tauschen, ist das definitiv der elegantere Weg.

Grundsätzlich sollte der Modifikator wie folgt funktionieren:
Integration eines Destruktors in die Basisklasse.

class Modifier {
  public:
    virtual void loop() {}
    virtual bool handlePause() {
      return false;
    }
    virtual bool handleNext() {
      return false;
    }
    virtual bool handlePrevious() {
      return false;
    }
    virtual bool handleNextButton() {
      return false;
    }
    virtual bool handlePreviousButton() {
      return false;
    }
    virtual bool handleVolumeUp() {
      return false;
    }
    virtual bool handleVolumeDown() {
      return false;
    }
    virtual bool handleRFID(nfcTagObject *newCard) {
      return false;
    }
    virtual uint8_t getActive() {
      return 0;
    }
            
    Modifier() {}
    virtual ~Modifier(){}
};

Dann der eigentliche Modifier:

class LimitVolumeModifier: public Modifier {
  private:
    uint8_t oldVolume = 0;
    uint8_t limitVolume = 0;

  public:

    // only allow increase of volume till limit volume
    virtual bool handleVolumeUp() {
        if (volume >= this->limitVolume) {
            return true;
        }

        return false;
    }
    
    // reset volume on modifier removal
    virtual ~LimitVolumeModifier()
    {
        volume = this->oldVolume; // restore saved volume
        mp3.setVolume(volume);
    }
    
    // limitVolume will be passed during initialization (stored on modifier card)
    virtual LimitVolumeModifier(uint8_t limitVolume)
    {
        this->oldVolume = volume; // save current volume for restore
        this->limitVolume = limitVolume;
        
        // reduce volume if to loud
        if(volume > limitVolume){
            volume = limitVolume;
            mp3.setVolume(volume);
        }
    }
};

Kann es grade nicht auf einem TonUINO ausprobieren, sollte aber so funktionieren. Es fehlt jetzt nur noch Initialisierung/Entfernung und Integration ins Adminmenü.

Außerdem ist es fraglich, ob es sinnvoll ist, beim Entfernen des Modifiers die Lautstärke automatisch wieder zurückzusetzen. Es sollte eigentlich reichen, die „Limitierung“ zu entfernen. Also ggf. die Zeilen

    // reset volume on modifier removal
    virtual ~LimitVolumeModifier()
    {
        volume = this->oldVolume; // restore saved volume
        mp3.setVolume(volume);
    }

ersetzen durch

    virtual ~LimitVolumeModifier()
    {
    }

bzw. einfach den destruktor komplett weglassen.

2 „Gefällt mir“

Alternativ könntest du auch das neue Limit ganz normal in den Settings setzen und sogar im Flash speichern.

@pit
Vielen Dank! Ich probiere es bei nächster Gelegenheit aus.

Mit dem Speichern im Flash wäre zu überlegen.

Ich habe bei mir dafür persistente Modifier integriert, damit lassen sich einige Modifier z.B. SleepTimer oder ToddlerMode auch über das Ausschalten hinweg persistent speichern.
Es muss also der Modifier explizit wieder deaktiviert werden.

Beispiel: Wenn der Schlafmodus abgeschaltet hat und das Kind den TonUINO neustartet, schaltet er sich automatisch (nach 1 min, zum möglichen Deaktivieren) wieder aus.