Mehrere Programme über ein Hauptprogramm steuern?

  • Hallo zusammen,

    ich habe mit dem Kauf des PIs mit Python begonnen und komme aufgrund meiner Erfahrungen mit anderen Programmiersprachen damit ganz gut zurecht. Jetzt möchte ich mehrere Programme über ein "Hauptprogramm" steuern. Die Ausgabe aller Programme erfolgt einzig auf einem angeschlossenen LCD, die einzelnen Programmfunktionen werden über Tasten gesteuert.

    Da ich nicht alle einzelnen Programme (momentan 4) in ein Script packen und im Speicher halten möchte (so lassen sich die einzelnen Programme auch besser pflegen), dachte ich an folgenden, modularen Aufbau:

    Das Hauptprogramm (zeigt z.B. nur Uhrzeit und Datum an) fragt in einer Loop einen bestimmten Taster ab und startet beim Drücken des Tasters dann Programm 1 und beendet sich. Derselbe Taster startet beim Drücken in Programm 1 dann Programm 2 und beendet Programm 1, etc. Irgendwann landet man so wieder im Hauptprogramm.

    Ist das eine praktikable Vorgehensweise oder gibt es da Python-spezifisch bessere Mechanismen?

    Mir ist die Technik von Modulen bekannt, aber ich möchte immer nur einen Programmteil im Speicher haben. Bei importierten Modulen habe ich dann ja immer alle im Speicher. Oder kann man Module laden und wieder entladen?

    Einmal editiert, zuletzt von Igotcha (15. September 2013 um 01:08)

  • Mehrere Programme über ein Hauptprogramm steuern?? Schau mal ob du hier fündig wirst!

  • Um was für Programme handelt es sich dabei überhaupt?

    Und wieso möchtest du in Programm-2 kommen solange Programm-1 noch läuft und der selbe Taster gedrückt wird?


    Kenn mich mit Python zwar nicht sooo gut aus aber ich glaube nicht das "loop" so Sinnvoll wäre da es permanent Resourcen frisst von dem der RPI nicht unbedingt sooo viel hat..
    Ein möglicher Ansatz ist hier zu finden: http://www.pi-supply.com/pi-supply-swit…-code-examples/

  • Der "selbe" Taster ist Quasi derjenige der den Modus bestimmt:

    Datum/Uhrzeit (Wecker) > Radio > Einkaufslistenscanner

    Durch Bestätigen des Tasters gelangt man so von Modul zu Modul. Wie gesagt, es gibt nur das LCD Display und 5 Taster, keine Tastatur.

    Es handelt sich dabei alles um eigene Python-Skripts. Ich habe das jetzt mit Modulen gelöst, die stehen zwar sofort im Speicher, man kann das aber durch eine in allen vorkommende Funktion (Loop) in den Modulen aber sehr gut steuern.

  • Hm ich würd das vielleicht eher so machen das man den Taster mehrmals betätigen müsste also zum Beispiel:

    Taster 1x betätigt: Wecker
    Taster 2x betätigt: Radio
    Taster 3x betätigt: Einkaufslistenscanner

    Dabei müsste man eben eine gewisse Zeitspanne festlegen in der man Zeit fürs drücken gibt also zum Beispiel:

    Wenn der Taster betätigt wurde, wird 2 Sekunden Zeit gegeben den Taster erneut zu betätigen und der HIT auf 1 gesetzt
    Wird der Taster dann erneut innerhalb dieser Zeitspanne gedrückt wird der HIT auf 2 gesetzt und erneut 2 Sekunden Zeit gegeben...usw...
    Wenn die Zeitspanne abläuft werden die HIT's genutzt um zu bestimmen welches Programm gestartet wird


    PS: Hab den Post oben auch nochmal editiert

  • Hallo!

    Ich verstehe nicht, was gegen ein einziges Programm spricht. Der ursprüngliche Ansatz (Hauptprogramm wartet auf Taster, startet Prg 1, dieses wartet auf Taster, startet Prg 2 usw.) hat einige Nachteile, gerade mit Hinblick auf Wiederverwendbarkeit und Modularisierung:

    • Jedes Programm muss selbst den Zugang zu den Tastern, zum LCD und ggf. zu anderen Systemteilen regeln.
    • Jedes Programm muss seinen Nachfolger in der Sequenz kennen, d.h. das Wissen über die "Menustruktur" ist in ALLEN Programmen verteilt.


    Das Argument "alles auf einmal in den Speicher laden" zählt auch nicht. Die einzelnen Python-Module werden zwar alle beim Skriptstart geladen, allerdings macht das dem Raspi nicht wirklich etwas aus. Sie "fressen kein Brot", solange sie einfach nur im Speicher stehen. Und wenn man seine Daten ordentlich organisiert (keine globalen Variablen etc.) beschränkt sich die Speicherbelegung auch auf den Programmcode und die Daten des gerade aktiven Programmteils, also wohl wenige kByte.

    Ich würde es in etwa so strukturieren:

    • 1 Hauptprogramm, das die Bedienelemente ansteuert bzw. abfragt und die Verzweigungslogik steuert.
    • Pro "Programm" ein separates Python-Modul, das die ganze Funktionalität in einer Klasse kapselt. Daten werden ausschließlich als Attribute der Klasse verwaltet.


    Das Hauptprogramm instanziert dann einfach ein Objekt der entsprechenden Klasse, um ein "Programm" auszuführen. Wird dieses Objekt wieder gelöscht, so verschwinden auch alle Daten aus dem Speicher, so wie du es wolltest.

    Der einzige Knackpunkt bei dieser Struktur ist die Nebenläufigkeit von Hauptprogramm (zur Abfrage der Taste und Ansteuerung des LCD) und Unterprogramm. Aber das lässt sich in Python ganz easy über das Modul threading lösen. Das Hauptprogramm startet einen Thread, in dem dann das Unterprogramm läuft, und schließt ihn wieder, wenn auf ein anderes Unterprogramm umgeschaltet werden soll. Zur Kommunikation zwischen Hauptprogramm und Unterprogramm (z.B. um Tastenbefehle an das Unterprogramm weiterzureichen oder von dort aus auf das LCD zu schreiben, kannst du Callbacks oder Queues verwenden.

  • Callback ist trivial: du übergibst dem Thread bzw. dem Unterprogramm-Objekt beim Start ein Funktionsobjekt (also trivial gesagt den Namen einer Funktion ohne Klammern dahinter). Die kann das Objekt dann aufrufen, um Daten ans Hauptprogramm zu übergeben.

    Eine Queue ist auch nicht kompliziert: einfach ein Queue-Objekt erzeugen. Nun kann ein Thread Daten in das Objekt schreiben und ein anderer Thread kann am anderen Ende der Queue schlafen, bis Daten ankommen.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!