Neue Features: Dynamisches Button-Layout, Webcontrol und neue Filetypen

Du musst du irgendwie nochmal konkreter werden. Was ist doppelt und wo fehlt FTP_ENABLE?

Da hat das Forum die Sprungmarken verschluckt:

Gilt analog für die anderen HTML Files.

1 „Gefällt mir“

Oh, da warst aber echt aufmerksam :slight_smile:
Danke für den Hinweis. Hab’s eben gefixt. Im englischen html-File ist der Part noch nicht drin. Das hängt aktuell einigermaßen hinterher.

Ist mein Job :wink: Bin bei uns Leiter der Softwareentwicklung und muss täglich Code überprüfen. da fällt mir sowas beim drüber schauen schnell auf.

Hi , nach 9 Tagen Abstinenz ein Riesenupdate …vielen Dank auch an alle Mitwirkenden .
Mir war eigentlich die Bedienung per WebGui nicht wichtig , aber wenn es jetzt schon mal da ist , dann will man (ich) gleich mehr .
@biologist . Ich vermisse eine Power_Off_Button , vielleicht oben neben dem Restart_Button ?

Da soll es nicht dran scheitern. Das ist schnell gemacht :grin:

Dachte ich mir , danke schonmal .

Tolle Umsetzung schon mal. Kleine Frage bezüglich der Codeästetik. Ich habe noch nicht so oft mit Makros gearbeitet, aber wäre eine Lösung mit 2D array nicht auch möglich? Dann könnte man den code im main.cpp deutlich verschlanken. Ich werde mir das noch mal näher anschauen, falls da von Eurer Seite nichts fundamentales dagegen spricht.
Also an dieser Stelle:

So was in der Art:

 // Do corresponding actions for all buttons
void doButtonActions(void) {
    int16_t i,j;
    

    if (lockControls) {
        return; // Avoid button-handling if buttons are locked
    }
    for(i=0;i<5;i++){
        for(j=i+1;j<6;j++){
            if (buttons[i].isPressed && buttons[j].isPressed) {
                buttons[i].isPressed = false;
                buttons[j].isPressed = false;
                doCmdAction(actions[i,j]);
            }
        }
    }
}

Ja die Idee ist nicht schlecht. Dafür braucht’s ein 2d-Array mit uint16_t-Datentypen. Die Ende der Schleife bestimmt man mit sizeof.
Ich kümmere mich drum, weil da gibt’s noch was zu beachten :slight_smile:

Danke für den Hinweis.

1 „Gefällt mir“

Ich habe mir das eben nochmal angeschaut und bin der Meinung, dass es doch nicht so eine gute Idee ist, das per Iteration zu machen.

Array:

  • Mit „einfach“ 2d-Array ist es ja nicht getan, du musst dieses ja auch mit Leben (den Multi-Buttons) füllen. Da hast dann auch wieder in einigen Zeilen untereinander stehen.
  • Noch doofer ist allerdings, dass du ein Array mit 6x6 machen musst, so viele Felder jedoch gar nicht brauchst. Z.B. wenn du einen Multi-Button 01 hast, dann brauchst du dafür die Felder 0/1 jedoch nicht mehr 1/0. Das ist dann in dreierlei Hinsicht unpraktisch: a) Du musst prüfen, ob im jeweiligen Element ein valides Item drin ist. b) du belegst 36 Byte zusätzlichen Speicher, obwohl du davon nur einen Teil brauchst. c) Du iterierst über 36 Elemente, obwohl nur manche davon gebraucht werden - das kostet Rechenzeit.

Struct-Array

  • Die passendere Variante wäre eigentlich ein Struct-Array, welches den Action-Wert und i und j besitzt.
  • Aber auch hier braucht man zusätzlichen Speicher und wenn man die ganze Initialisierung runterschreibt, sieht das am Ende nicht groß weniger dreckig aus, als wenn man Code-Duplikation betreibt. Zumal sich der Code für die Iteration noch anschließt + Definition des Struct-Arrays.

Also ich gebe dir Recht, dass das von der Code-Ästhetik aktuell keine Schönheit ist, aber es ist die schnellste Variante und braucht keinen zusätzlichen RAM. Klar, mit Bitfeldern im Struct-Array kann man etwas RAM einsparen, aber das kostet auch Rechenzeit und mehr RAM ist es unterm Strich auf jeden Fall. Und da wir uns auf einem Mikrocontroller befinden, finde ich die Effizienz in diesem Fall wichtiger.

@compactflash: Hab den Restart implementiert. Kann getestet werden :slight_smile:

Da wirst du wohl Recht haben. Mir fehlt dafür die Erfahrung in Mikrocontrollern. Für HPC werden oft sparse Arrays genutzt, ist aber auch nicht so schön und ich weiß nicht, ob das in der Standard Lib drin ist.

In der Anleitung bei den FAQ könnte noch der Abschnitt geändert werden :slight_smile::

Kann die Änderung der Lautstärke auch über Tasten anstelle Drehencoder erfolgen?
Nein, es gibt aber Leute, die es für ESPuino bereits implementiert haben. Ich bin der Meinung, dass ein Drehencoder für so etwas die bessere Wahl ist, deshalb hat er es bisher nicht anders implementiert

Jaja, ich weiß. Zu den Anleitungen bin ich bisher noch nicht gekommen :woman_shrugging:
Heute Abend vielleicht :slight_smile:

So, ich habe die Doku aktualisiert. Wer noch Unstimmigkeiten findet, kann sie mir gerne melden :smiley:

2 „Gefällt mir“

Der Thread ist zwar schon etwas älter aber ich bin heute über ein Problem mit „m4a“ Dateien gestolpert. Ich dachte erst, der Dateityp wird nicht unterstützt, bis mich die Forensuche hierher geführt hat :slight_smile:

Zum testen habe ich mit Jdownloader von Youtube aus einem Video die Audiospur extrahiert. Das Ergebnis ist eine .m4a datei, die beim Abspielen zuverlässig zu einem reboot führt:

RFID-Karte empfangen: 003208058153
Playlist-Generierung: cached
Freier Speicher: 87084
Anzahl gültiger Files/Webstreams: 15
Modus: Alle Tracks eines Ordners sortiert (alphabetisch) in Endlosschleife
Neue Playlist empfangen mit 15 Titel(n)
Free heap: 87952
info        : PSRAM found, inputBufferSize: 283615 bytes
info        : buffers freed, free Heap: 87524 bytes
info        : Reading file: "/test.m4a"
info        : AACDecoder has been initialized, free Heap: 66536 bytes
'/test.m4a' wird abgespielt (1 von 15)info        : stream ready
[E][Audio.cpp:1678] read_M4A_Header(): subtype 'MA4 ' expected, but found 'isom '
Guru Meditation Error: Core  0 panic'ed (LoadProhibited). Exception was unhandled.
Core 0 register dump:
PC      : 0x400d303a  PS      : 0x00060e30  A0      : 0x800d6073  A1      : 0x3ffdb020
A2      : 0x3ffc4c40  A3      : 0x00000010  A4      : 0x3ffc4ef0  A5      : 0x00000001  
A6      : 0xc23500ca  A7      : 0x00b73d00  A8      : 0x800d30a3  A9      : 0x00000018
A10     : 0x00000010  A11     : 0x3ffc4efc  A12     : 0x3ffc4eff  A13     : 0x3ffc4ee4
A14     : 0x00000063  A15     : 0x00000004  SAR     : 0x0000001b  EXCCAUSE: 0x0000001c
EXCVADDR: 0xc23500ce  LBEG    : 0x4009538e  LEND    : 0x40095399  LCOUNT  : 0x00000000  

ELF file SHA256: 0000000000000000

Backtrace: 0x400d303a:0x3ffdb020 0x400d6070:0x3ffdb060 0x400d70e1:0x3ffdb080 0x400990da:0x3ffdb0c0

Rebooting...
ets Jul 29 2019 12:21:46

VLC verrät mir, dass der codec mp4a ist, was mir aber nicht viel weiter hilft.

Hier die Testdatei (einfach .m4a.txt in .m4a umbenennen):
Earth – MusicbyAden (No Copyright Music) (128kbit_AAC).m4a.txt (3,9 MB)

Das ist auf jeden Fall ein Fehler, den die Audiolib von @Wolle zurückgibt. Muss er vielleicht was zu sagen. Ich würde einfach mp3-Files nehmen, dann gibt’s keinen Stress :slight_smile:.

Die Beispiledatei brachte in meiner Testumgebung die Meldung:
read_M4A_Header(): subtype 'MA4 ' expected, but found 'isom '
M4A Dateien haben intern eine Baumstruktur bestehend aus Containern und Atomen. Das Atom ‚isom‘ hatte ich noch nie. Das ist jetzt eingearbeitet, die Audiodatei ist nun abspielbar.

audio_info   : Reading file: "/m4a/Earth MusicbyAden (No Copyright Music) (128kbit_AAC) (Kopie).m4a"
audio_info   : AACDecoder has been initialized, free Heap: 148364 bytes
audio_info   : stream ready
audio_info   : Audio-Length: 4084862
audio_info   : Content-Length: 4084906
audio_info   : syncword found at pos 0
audio_info   : Channels: 2
audio_info   : SampleRate: 44100
audio_info   : BitsPerSample: 16
audio_info   : BitRate: 127821
audio_info   : AAC HeaderFormat: RAW
audio_info   : VBR recognized, audioFileDuration is estimated

Keine Ahnung warun das System abgestürzt ist. Ich habe für ungültige Audioheader noch eine Sicherung eingebaut, vielleicht hilft es. Ihr könnt biite mal testen, ob die Datei abspielbar ist.
P.S. im Dateinamen gibt es ein ‚En Dash‘ (U+2013), das ist kein ASCII Zeichen

2 „Gefällt mir“

@Wolle gute Arbeit, perfekt läuft!

Vorher::

[E][Audio.cpp:1591] read_M4A_Header(): subtype 'MA4 ' expected, but found 'isom '

Jetzt:

info        : PSRAM found, inputBufferSize: 283615 bytes
info        : buffers freed, free Heap: 93200 bytes
info        : Reading file: "/TestM4A.m4a"
info        : AACDecoder has been initialized, free Heap: 72300 bytes
'/TestM4A.m4a' wird abgespielt (1 von 1)

:ok_hand:

Das ging fix! Danke, ich werde es im Laufe der Woche mal testen aber es wurde ja schon bestätigt, dass es geht :slight_smile: Sehr cool!