TimeOut für das Adminmenü

Ich habe jetzt per Zufall festgestellt, dass der Standbytimer nicht gestartet wird, wenn man das Adminmenü aufruft, aber keine Funktion aufruft. ( Auch nicht über langen Druck Pause abbricht). Bin drauf gekommen als ich mal eine Adminkarte auf dem Reader liegen hatte, dann aber nichts weiter gemacht habe, weil ich schnell was anderes erledigen musste. Meine Idee wäre eine Timeoutfunktion beim Start des Adminmenüs zu aktivieren (Ähnlich dem Standbytimer), die wenn über eine bestimmte Zeit hinaus keine Taste zur Auswahl einer Funktion gedrückt wurde, das Adminmenü automatisch nach z.B 5 Minuten beendet und den Standbytimer startet. Hab es aber leider programmtechnisch noch nicht hingekriegt. Vielleicht hat schon jemand in dieser Richtung eine Lösung parat. Wäre echt toll.

Programmtechnisch gar nicht so trivial, da das Adminmenü nicht in einer Schleife läuft… :thinking:

Wenn ich es richtig im Kopf habe, dann müsstest du eine Schleife im Hauptmenü (adminMenu) machen, welche so lange durchlaufen wird, bis man eine Taste drückt. Innerhalb der Schleife kann man dann einen Timer ablaufen lassen, welcher dann das Adminmenü beendet. Aber wie es in den Untermenüs des Adminmenüs aussehen müsste, habe ich gerade keine Ahnung.

Das wurde dich schon behandelt und glöst, oder nicht?
Ach ich hab das falsch verstanden und mitbetwad anderem verwechselt.

Meinst du das hier?

Das war nur, wenn man aus dem Adminmenü aussteigt (Abbruch) , ohne etwas gemacht zu haben…

Ich würde euch empfehlen, das irgendwie in voiceMenu() zu machen. Da werden ja irgendwo in ner schleife die die Buttons abgefragt… dann wäre das überall aktiv wo interaktives Menü am Start ist.

2 Like

Die Idee kam mir auch.
Das ist die beste stelle, dann kann man über millis() eine Timeout in der while Bedingungen integrieren.

Hab jetzt gerade den Code angeschaut. Dachte, dass voiceMenu() erst für die Untermenüs aufgerufen wird. Aber es wird schon zu Beginn des Adminmenüs aufgerufen (was ja auch Sinn macht).

Kann es gerade nicht testen, und kann man sicher schöner schreiben:
vor der do { Schleife folgenden Code rein machen:

unsigned long millisVoiceM = 0;
MillisVoiceM = millis();

und in der Schleife aus

    if (pauseButton.pressedFor(LONG_PRESS) {
      mp3.playMp3FolderTrack(802);
      ignorePauseButton = true;
      return defaultValue;
    }

dann

    if (pauseButton.pressedFor(LONG_PRESS) || millis() - MillisVoiceM >= 5 * 1000 * 60) {
      mp3.playMp3FolderTrack(802);
      ignorePauseButton = true;
      return defaultValue;
    }

machen.
Die 5 in der IF-Bedingung durch eine gewünschte Minutenzahl ersetzen.

Wie gesagt, nicht getestet und ich bin kein guter C-Programmierer.

1 Like

Danke für die Tipps. Mein Ansatz war zunächst über die millis() Funktion einen Countdown nach dem Starten des Adminmenüs zu starten, der nach Ablauf den Aussprung aus dem Adminmenü veranlasst. Das hat aber nicht funktioniert, weil ja auf die Eingabe einer Taste gewartet wird. Die Idee das im Voicemenü zu machen kam mir vorhin auch schon, hatte es nur noch nicht ausprobiert. Der Vorschlag von @Manu sieht vielversprechend aus. DANKE !!

1 Like

Hallo @Manu , auch für @stephan und @marco-117
Ich habe es jetzt am laufen. Manus Ansatz war prinzipiell richtig. Ein paar Änderungen waren aber trotzdem nötig um es ans laufen zu bringen. Das Adminmenü verhält sich jetzt wie gewünscht. Ist es aktiviert und es wird keine weitere Taste zur Auswahl einer Option gedrückt wird das Adminmenü automatisch nach 5 Minuten verlassen und der Standbytimer gestartet. Das gilt auch in den Untermenüs des Adminmenüs. Sowie eine Taste gedrückt wurde, wird der Countdown für den AdmTimeOut neu gestartet und die Timeoutzeit beginnt neu.
Hier der Code

mp3.playMp3FolderTrack(startMessage);
  Serial.print(F("=== voiceMenu() ("));
  Serial.print(numberOfOptions);
  Serial.println(F(" Options)"));

  unsigned long AdmTimeOut = 0;
  unsigned long SollAdmTimeOut = 5*60000;           // Vorgabe der AdmTimeOut Zeit in millisekunden , Die 5 ist dieZeit in Minuten
  AdmTimeOut = millis();
  Serial.print(F("AdmTimeOut :"));
  Serial.println(SollAdmTimeOut);
  do 
    {
       //Serial.println((millis() - AdmTimeOut));
       if((millis() - AdmTimeOut) >= SollAdmTimeOut)         
     {
      Serial.println(F("TimeOut"));
      mp3.playMp3FolderTrack(802);                  //802- "OK, ich habe den Vorgang abgebrochen.
        //ignorePauseButton = true;
        setstandbyTimer(); 
        return defaultValue;  
     }

     
    if (Serial.available() > 0) 
      {
      int optionSerial = Serial.parseInt();
      if (optionSerial != 0 && optionSerial <= numberOfOptions)
        return optionSerial;
      }
    
      
    readButtons();   

In den readButtons muss die Variable bei drücken einer Taste auf den neuen millis() wert gesetzt werden um den TimeOut neu zu starten.

readButtons();
      mp3.loop();
     
        if (pauseButton.pressedFor(LONG_PRESS)) // Abbruch
        {
        mp3.playMp3FolderTrack(802);                  //802- "OK, ich habe den Vorgang abgebrochen.
        ignorePauseButton = true;
        setstandbyTimer(); 
        return defaultValue;
        }
      if (pauseButton.wasReleased()) 
        {
        if (returnValue != 0) 
          {
          AdmTimeOut = millis();
          Serial.print(F("=== "));
          Serial.print(returnValue);
          Serial.println(F(" ==="));
          return returnValue;
          }
        delay(1000);
         }

    if (upButton.pressedFor(LONG_PRESS)) 
      {
      AdmTimeOut = millis();  
      returnValue = min(returnValue + 10, numberOfOptions);             // 10 Schritte hoch
      Serial.println(returnValue);
      mp3.pause();                                                                      
      mp3.playMp3FolderTrack(messageOffset + returnValue);
      waitForTrackToFinish();

       //************preview 10-er Schritt** vorwärts ************** 
      
      if (preview) 
        {
        if (previewFromFolder == 0)
          mp3.playFolderTrack(returnValue, 1);
        else
          mp3.playFolderTrack(previewFromFolder, returnValue);
        }
       
      ignoreUpButton = true;
    }
    else if (upButton.wasReleased()) 
      {
      AdmTimeOut = millis();
      if (!ignoreUpButton) 
        {
        returnValue = min(returnValue + 1, numberOfOptions);
        Serial.println(returnValue);
        mp3.pause();                                                            
        mp3.playMp3FolderTrack(messageOffset + returnValue);
        if (preview) 
          {
          waitForTrackToFinish();
          if (previewFromFolder == 0) 
            {
            mp3.playFolderTrack(returnValue, 1);
            } 
            else
              {
              mp3.playFolderTrack(previewFromFolder, returnValue);
              }
            delay(1000);
          }
        } 
        else 
        {
        ignoreUpButton = false;
        }
    }

    if (downButton.pressedFor(LONG_PRESS)) 
      {
      AdmTimeOut = millis();
      returnValue = max(returnValue - 10, 1);             // 10 Schritte zurück
      Serial.println(returnValue);
      mp3.pause();                                                          
      mp3.playMp3FolderTrack(messageOffset + returnValue);
      waitForTrackToFinish();
      
      //************preview 10-er Schritt* zurück ***************
       
      if (preview) 
        {
        if (previewFromFolder == 0)
          mp3.playFolderTrack(returnValue, 1);
        else
          mp3.playFolderTrack(previewFromFolder, returnValue);
        }
       
        
      ignoreDownButton = true;
      }
      else if (downButton.wasReleased()) 
        {
        AdmTimeOut = millis();  
        if (!ignoreDownButton) 
          {
          returnValue = max(returnValue - 1, 1);
          Serial.println(returnValue);
          mp3.pause();                                                      
          mp3.playMp3FolderTrack(messageOffset + returnValue);
          if (preview) 
            {
            waitForTrackToFinish();
            if (previewFromFolder == 0) 
              {
              mp3.playFolderTrack(returnValue, 1);
              }
            else 
            {
            mp3.playFolderTrack(previewFromFolder, returnValue);
            }
          delay(1000);
            }
          } 
          else 
          {
          ignoreDownButton = false;
          }
      }
    } while (true);
}

Das funktioniert so.

2 Like

Kann man das dann auch in GitHub pushen? Ist ja essentiell.

Habe leider keinen Github account. Wenn das jemand tun möchte, wäre das super.
Vielleicht kann das @Thorsten ja in die DEV direkt übernehmen.