Go Down

Topic: Projekt: LCDMenuLib / LCDMenuLib2 ( LCDML ) - Menü mit mehreren Ebenen  (Read 342548 times) previous topic - next topic

Demokrit

Hallo Jomelo,

ich hatte dich im Januar mit vielen Fragen - u.a. zur Mehrsprachigkeit - beschäftigt. Mein LCD-Menü funktionierte damals, hatte aber einen Phantomeintrag, welcher wohl durch eine Condition entstand. Mein erstes komplexes Projekt war damals hardwareseitig fertig, und softwareseitig fast fertig. Was fehlte waren 3D-gedruckte Teile - für mich ein neues Thema mit steiler Lernkurve hinsichtlich 3D-Software / FreeCAD und Druckersoftware. Das Thema ist jetzt erledigt :-)

Seit einer Woche arbeite ich am Finetuning der Software, und habe in dem Rahmen auch den Update auf die neueste Version der LCDMenuLib2 vorgenommen. Nach den wenigen, erforderlichen Änderungen hat alles auf Anhieb funktioniert - und auch der Phantomeintrag war weg.

Eine Sache ist mir aufgefallen. Es betrifft den Screensaver. In meiner Anwendung steppt (u.a.) ein Kamera-Robot über eine 1m lange Linearachse. Aktiviere ich den Screensaver, so stockt der Motor (hör- und sichtbar) im Zyklus der Screensaver-Intervalls. Der Screensaver scheint also softwareseitig recht "teuer". Für mich kein Problem, denn ich benötige den SS nicht wirklich.

Ich möchte mich an dieser Stelle nochmals für deinen tollen Einsatz bedanken. Du hast ein Top Produkt geschaffen!

Beste Grüße,
Thomas

Demokrit

Ich nochmal, mit neuen Fragen und einer merkwürdigen Beobachtung.

Die Frage: Ich habe mehrere Menüfunktionen von "LCDML_addAdvanced" auf "LCDML_add" umgestellt, und dabei den Speicherbedarf beobachtet. Er war identisch. Falls es nicht Gründe dagegen gibt, wäre es nicht sinnvoll, den Standardtyp ganz raus zu nehmen? Einfachere Doku, konsistentere Beispiele?

Dann die Beobachtung: Meine Anwendung basiert auf 5 Libraries und dem TaskMacro als State Machine. Bei der Umstellung auf die neueste LCDMenuLib2 Version habe ich 5 Tasks im Loop deaktiviert, und nur den LCDML.loop() drin gelassen - um schneller voran zu kommen. Mein Menü umfasst 21 Positionen, von denen sich 19 auf 3 mehrfach nutzbare Menüfunktionen verteilen lassen. Unterschiedlich parametriert per"switch", basierend auf dem  "param". Die Funktionen waren mehrheitlich identisch mit denen der vorletzten Version. Und sie schienen auch bestens zu funktionieren. Bis ich im Loop die auskommentierten Tasks wieder aktiviert hatte. Dadurch wechselte die Speichernutzung auf 82/62%. Mutmaßlich noch im grünen Bereich.

Beim neuerlichen Upload war das Menü einwandfrei, solange man keinen Punkt anwählte. Wählte man jedoch einen, so war fast alles zerschossen. Deutlich im Sinne von Zugriff auf falschen Speicher. Alle zeigten einen identischen Hilfstext von einer der Unterfunktionen (immer der gleichen, der 2. von 6).

Sobald ich die Tasks im Loop wieder auskommentierte, funktionierte das Menü einwandfrei. Dann fiel mir auf, dass nicht alle Menüfunktionen betroffen waren. Die, welche ohne Parameter auskommen, waren einwandfrei. Danach habe ich eine Funktion aus einer Sammelfunktion entnommen, und ohne "param" neu angelegt. Auch diese Funktion klappte danach mit allen Tasks zusammen. Dann habe ich in den Sammelfunktionen auf den "param" gedebuggt. Und dieser war immer "2", egal welcher param tatsächlich aus der Menüdefinition übergeben wurde.

Nach erneutem Auskommentieren der fremden Tasks im Loop wurden die Parameter sofort korrekt übertragen, und das Menü war wieder einwandfrei.

Aktuell habe ich alle Menü-Sammelfunktionen durch individuelle (ohne param) ersetzt. Speicherbedarf jetzt 87%/58%. Alle Tasks aktiviert. Keine Menüprobleme.

Jetzt zur Analyse:

1) Am Speicherbedarf kann es nicht liegen, denn er ist höher, wenn ich die Sammelfunktionen auflöse.
2) Ohne fremde Tasks tritt das Problem nicht auf. Die Sammelfunktionen klappen.
3) Sammelfunktionen durch Einzelfunktionen ersetzt (kein param), und alles klappt immer.
4) Wechsel ich zurück zur vorletzten Version, so tritt "dieses" Problem nicht auf, mit und ohne fremde Tasks. Dafür gibt's dann die alten Probs :-)
5) Wenn das Problem auftritt, wird immer ein falscher Parameter (2) erkannt.

Dies ist deutlich kein Bug-Report! Es kann zahllose Gründe für das Verhalten geben, die vielleicht ausschließlich in meiner Restanwendung liegen, oder im Zusammenspiel mehrerer installierter Libraries. Vielleicht mal im Auge behalten, falls auch an anderer Stelle Probs mit "param" auftreten sollten.

Bei Bedarf kann ich eine meiner Sammelfunktionen posten. Vielleicht liegt ja da der Hase im Pfeffer :-)




Jomelo

Moin,
danke für die detaillierte Information. Es deutet irgendwie darauf hin, dass der dynamische Speicher (nicht durch globale Variablen belegt) überläuft.

Hierfür gibt es in der Tat sehr viele Möglichkeiten.
 
while(!success){try++;}

Demokrit

Ja, den Eindruck macht es. Ist auch nicht weiter schlimm, denn mit den (eigentlich speicherhungrigeren) Einzel-Menü-Funktionen klappt es ja anstandslos.

Ich habe gestern übrigens Unfug geschrieben. VOR dem Releasewechsel habe ich in mehrfach genutzten Funktionen nicht mit Parametern gearbeitet, sondern die ID ausgewertet (LCDML.FUNC_getID();), und darüber verzweigt. Als alles mit der neuesten Release lief, habe ich auf die Parameter umgestellt - und die Probs fingen an.

Davon nicht betroffen ist übrigens die Funktion "mFunc_information", die ich intensiv mit Parametern nutze (14 verschiedene). Diese werden jedoch nur im Setup benötigt - im Gegensatz zu Menüfunktionen mit Mehrfachnutzung, wo ich die param(s) auch im Loop benötige.

Trotzdem bleibt es ein merkwürdiges Problem(chen)

Demokrit

Hallo Jomelo,

ich wollte noch schnell bestätigen, dass die Conditions jetzt auch in komplexen und tief verschachtelten Menüs funktionieren. Damit ist es mir möglich, in Abhängigkeit der Betriebsart (meine Maschine hat derer 4) nur die Menü-Elemente einzublenden, die für diesen Modus auch relevant sind. Die Bedienergonomie gewinnt gewaltig - und ich bin begeistert!

Grüße,
Thomas

timtailors

Hallo,

bei meinem SAMD21 und 28 Einträgen kommen nun Probleme mit dem RAM. In manchen Menüteilen findet man nun kryptische Zeichen. Offenbar scheint das der RAM nicht mehr ausreichend.
Gibt es eine Möglichkeit das Menü resourcesparender aufzubauen?

Jomelo

Moin,
- ohne das du dein Programm zur Verfügung stellst kann dir niemand helfen.
- ohne das du etwas über dein Programm preisgibst kann dir niemand helfen.
- ohne weitere Details gibt es keine Hilfe.

Das Menü belegt nicht viel Ram, meistens ist der Schuldige in der Anwendung zu suchen.
while(!success){try++;}

timtailors

Moin,

ich habe das Problem an mehreren Stellen, ich möchte momentan auch nicht alle 15 Tabs veröffentlichen, weil dort IPs und Zugangsdaten enthalten sind.

Diese merkwürdigen Zeichen treten auf bei einer bestimmten Anzahl von Menüeinträgen, aber dann auch bei solchen Sachen wie

Code: [Select]
if (rpibefehl==2) { Serial.println(F("RPIready!")); sprintf(str1, "opt: %d.%02d", (int)voltage, (int)(voltage*100)%100);  }

voltage werden ganz am Anfang des Programs definiert und in der loop dann mit analogRead ausgelesen und enthält ein float-Wert von 2.23 zB

Schreibe ich in den Code noch statts die Variable voltage direkt sonder in einer eigenen

Code: [Select]
float f = 2.23;
if (rpibefehl==2) { Serial.println(F("RPIready!")); sprintf(str1, "opt: %d.%02d", (int)f, (int)(f*100)%100);  }

funktionierts.


Das hier wiederrum funktioniert nicht mehr, also es werden auf dem Display wieder komische Zeichen dargestellt. Gebe ich die Variable str1 zusätzlich per Serial.println aus, dann ist die serielle Ausgabe korrekt, das Display zeigt dennoch Müll

Code: [Select]
float f = voltage;
if (rpibefehl==2) { Serial.println(F("RPIready!")); sprintf(str1, "opt: %d.%02d", (int)f, (int)(f*100)%100);  }


Es scheint auch nur die Anzeige betroffen zu sein. Auch wenn dieser Zeichensalat auftaucht, funktioniert das Programm sonst dennoch korrekt.

Dieser ganze Code liegt auch in einer Schleife, die gar nicht ausgeführt wird, wenn man das Menu aufruft, erst wenn man auf einen Untermenüpunkt klickt.

Jomelo

Moin,

ich vermute, dass dein RAM um dein Programm fehlerfrei auszuführen. Welchen Kontroller verwendest du und wie ist die RAM Auslastung die dir unten in der Konsole angezeigt wird. (Dies entspricht der statischen Auslastung) Der dynamische Anteil wird nicht von der Arduinoumgebung angezeigt.
while(!success){try++;}

timtailors

Hi,

ich verwende den ATSAMD21G18A. Das ist der Chip, der auch im Arduino Zero/m0 ist.
Er hat  32 KB RAM, 256 KB Flash
Die Arduino IDE zeigt leider nur den Programmspeicher an
Code: [Select]
Der Sketch verwendet 74528 Bytes (28%) des Programmspeicherplatzes. Das Maximum sind 262144 Bytes.


Laut der Bibliothek MemoryFree beträgt der Platz:
Free RAM = 26235
(https://github.com/mpflaga/Arduino-MemoryFree)

timtailors

Hallo,
gibt es eigentlich auch eine Möglichkeit Elemente je nach Modus auszutauschen?
Also ich habe verschiedene Elemente mittels "LCDML_addAdvanced.." registriert und möchte die je nach Einstellung im Untermenü austauschen oder entfernen
Ist das möglich?

Jomelo

Guten Morgen,

direkt entfernen kannst du die Elemente nicht, aber mit dem "visible" Flag könntest du den Menüpunkt ausblenden und zuvor definierte Punkte einblenden. Es sollte nur vorher alles angelegt sein.
 

while(!success){try++;}

timtailors

Hallo,

ok, gibt es irgendwie ein Beispiel wie das geschieht?

Jomelo

Klar,
in jedem Beispiel ist diese Funktionalität enthalten. Du kannst bei den "Advanced" MenuItems verschiedenen "Condetions" setzen.

Im Beispiel ist dies mit einer "Condetion" gemacht. Wenn du dir nun eine neue anlegest, in der du z.B. eine globale Variable abfragst, dann kannst du je nachdem wo du den Wert der globalen Variable veränderst den Menüinhalt, der angezeigt werden soll, beeinflussen.
while(!success){try++;}

timtailors

Ok, jetzt habe ich das verstanden. Das war mir nicht klar, dass das geht, da ich das mit "COND_hide,  "screensaver" "  mit dem Bildschirmschoner nur in Verbindung gebracht habe

Go Up