Durch Switch-Case While-Schleife aufrufen und solange ausfüren wie Benutzereingabe

  • Hallo zusammen :),

    ich bin noch in den Kinderschuhe was C++ Programmieren angeht. Ich weiss zwar
    wie es sein soll, aber nicht wie ich es genau in Code umgesetzt bekomme.

    Und zwar möchte ich eine Schleife haben die nur läuft und Informationen ans Display ausgibt.

    Gleichzeitig soll eine Switch-Case-Struktur laufen wo jeweils pro Case eine While-Schleife läuft.
    Diese Schleife soll solange ausgeführt werden wie der Benutzer eine Eingabe tätigt. Meinetwegen
    Case Vorwärts ausführen solange "W" gedrückt ist. Danach wieder ins Auswahlmenü springen.

    usw...

    So in etwa hatte ich mir das vorgestellt. Nur anstelle der "Benutzereingabe" sollte dort sowas wie "kbhit" (hatte ich in dem Bezug häufiger gelesen) stehen.

    Kann mir da jemand weiterhelfen? :helpnew:

    Einmal editiert, zuletzt von Timmi (16. April 2014 um 11:29)

  • Durch Switch-Case While-Schleife aufrufen und solange ausfüren wie Benutzereingabe? Schau mal ob du hier fündig wirst!

  • Hi Tuxerli ...

    bist Du Dir mit Deiner Anforderung sicher?
    Das klingt sehr nach multithreading ....
    Ein einzelner Programmthread kann nur eine Aufgabe nachd er anderen erledigen, und nicht gleichzeitig was anderes tun ( in Ausnahmefällen schon ... aber das würde jetzt zu weit führen ).

    Wenn Du die Anforderung ein wenig abänderst, kriegen wie das auch so hin ... probiers mal ;) ...


    cu,
    -ds-

  • Tuxerli? :lol:

    Hmm.. Was meinst du mit Anforderungen abändern?
    Was mir Vorschwebt ist im Prinzip auf dem Display nur Infos
    rauszugeben. So nacheinander abfolgend IP-Adresse, Uhrzeit/Datum, usw.

    So und dann möchte ich halt den Pi dazu benutzen das er das fährt (Chassis wird von Makeblock das StarterKit). Zuerst nur per "Kommandozeile" und später möchte das das dann in eine Website umswitchen, wo ich dann auch das Kamerabild sehen kann und den Roboter dann per Pfeiltasten bedienen kann.

    Das ist so das Ziel der ganzen Sache :).

    Ist das zu Komplex? Nicht wirklich, oder? :s

  • Hallo Timmi,

    zwar möchte ich nicht als Spielverderber erscheinen, aber meiner Einschätzung nach solltest Du Dich erst einmal mit den Grundlagen der C++-Programmierung befassen.

    Simple Beispiele, Zahlenspielereien, Konstrukte wie if-then-else und andern Käse ... äh ... case, switch & Co., um daraus zu lernen und Erfolgserlebnisse zu haben. Ja, es gibt nicht vieles, was größere Gefühle als ein selbgeschriebenes funktionierendes Programm hervorruft.

    Normalerweise beantworte ich solche oder ähnliche Anfragen mit einem Code-Ausschnitt.

    Dir bringt es momentan gar nichts, wenn irgendeiner von uns Dir den Code schreibt, bevor Du die grndlegenede Befehle nicht sicher anwenden kannst.

    Um einen Roboter anzusteuern, musst Du ganz sicherlich eine Bibliothek öffnen. Hast Du daran gedacht? Hast Du eine solche Bibliothek?


    Nix für ungut - ansonsten helfe ich gern...

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Hallo Andreas,

    also die Grundlagen "beherrsche" ich schon.
    Ich hab nur den ganzen Code nicht gepostet weil ich den noch nicht geschrieben habe.
    Aber ich sagmal so Sachen wie If-then-else, oder For und While Schleifen kann ich so soweit schreiben. Natürlich ist das halt noch alles recht "wackelig" da gebe ich dir vollkommen Recht.

    Als Bibliothek nutze ich die wiringPi. Damit komme ich auch soweit gut zurecht.
    Natürlich wird es hier und da sicherlich mal haken. Aber im Großen und ganzen
    mache ich mir da keine Sorgen das nicht hinzubekommen :).

    Ich würde mir das ja auch alles soweit selber schreiben, nur (das Display mal außen vor)
    ich weiss nicht so ganz mit welchem Befehl der die Schleife beendet bzw. dabei auf eine Benutzereingabe reagiert. Mehr brauche ich erstmal garnicht :).

    • Offizieller Beitrag

    Du musst dich mit Keypress Events auseinandersetzen. Damit kannst du auch die schleife solange durchlaufen kassen wie ein bestimmter Key gedrückt wurde.

    Das ist alles andere als leichter Tobak, selbst unter python kann einem das schon das ein oder andere graue Haar bescheren (zum Glück fallen meine gleich aus und überspringen das Grau werden gleich ;) )

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

    Einmal editiert, zuletzt von dbv (15. April 2014 um 20:01)

  • Haha :lol:
    Okay. Ich wollte das auch jetzt nicht als leicht abtun, um Gottes Willen.
    Aber ich bin halt dabei C++ (Schultechnisch) zu erlernen und da mir das
    generell Spass macht möchte ich das ganze halt in so einem "Projekt" umsetzen.

    Vielleicht war es was hoch gegriffen direkt ein Display mit rein nehmen zu wollen,
    aber ich sehe das nicht als Problem sondern eher als Herausforderung :thumbs1:.

    Ich werde mich die Tage mal hinsetzen und einen Code auf die Beine stellen und dann mal sehen was dabei rum kommt.

    Trotzdem schonmal vielen Dank für die Hilfe :).

    Einmal editiert, zuletzt von Timmi (15. April 2014 um 20:38)

  • Die Info die dir noch keiner Verraten (aber Dreamshader angedeutet) hat ist, dass du dafür keine gleichzeitige Ausführung brauchst. Mache eine Schleife in der du auf Benutzereingaben reagierst, und am Ende zeigst du die aktuellsten Informationen an. Das geht schnell genug das nicht auffällt, dass es nciht geichzeitig geschieht. Vor allem wenn du bedenkst, dass wirklich gleichzeitig garnicht funktioniert, weil der Pi nur einen Prozessor hat. Auch Mehrere Threads würden also im Wechsel ausgeführt werden...
    Das du wirklich suchst ist "nicht blockierende Funktionen" (engl. non blocking) um die Tastatureingaben mitzubekommen.


  • Die Info die dir noch keiner Verraten (aber Dreamshader angedeutet) hat ist, dass du dafür keine gleichzeitige Ausführung brauchst. Mache eine Schleife in der du auf Benutzereingaben reagierst, und am Ende zeigst du die aktuellsten Informationen an.

    das war auch mein erster Gedanke, wer hindert den TO denn daran in der Loop die Ausgaben zu machen und zwischendurch bis zum nächsten Loop die Tasten abzufragen ?

    loopt immer -> gibt aus und liest tasten und reagiert darauf

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Ja also so wie ihr das hier vorgeschlagen habt klingt das erstmal ganz gut.
    Ich dacht halt nur das wär keine "saubere" Lösung. Aber um das zu beurteilen bin
    ich halt noch nicht tief genug in der Materie.

    Zur Zeit bin ich dabei den Code mit Visual-Studio aufzusetzen und dann anstelle der
    Motoransteuerung auf dem Pi gebe ich da einfach nur mit cout << "Vorwärtsfahrt"; aus.

    Das reicht ja zum testen erstmal. Damit kann ich dann soweit programmieren und probieren.
    Später kann ich den Code auf dem Pi unter Geany dann neu schreiben und das dann durch die Motoransteuerung ersetzen.

    Ich würde dann soweit die Case-Fälle für die Ansteuerung aufsetzen und noch zwei zusätzliche für die LED-Scheinwerfer ein- bzw. auszuschalten.

    Und dann am Ende der vier Case-Fälle jeweils eine Ausgabe ans Display schicken.
    Meinetwegen für Vorwärts: Pi-Bot V1.0, für Rückwärts: Datum/Uhrzeit, für Links: IP-Adresse und für Rechts: k.A. ... Da ich mit dem Roboter ja sowieso die ganze Zeit fahre, ändern sich ja auch die Angaben auf dem Display ständig.

    Ich hätte es prinzipiell zwar schöner gefunden für das Display eine eigene Schleife zu haben wo ich dann z.B. jede Info für 10 Sek. anzeige und dann zur nächsten übergehe, aber wenn das zu schwierig/ nicht möglich ist, muss ich es halt so lösen.

    Viele Grüße,
    Timmi

  • Hi Timmi,

    nun ... sagen wir mal so: die Variante mit mehreren Threads wäre die, die imho für eine Steuerung vorzuziehen wäre.
    Und da bin ich auch schon auf dem Punkt: eine Steuerung ist m.E. alles andere als das geeignete Projekt um C zu lernen. Das mag für eine einfache Aufgabe wie Ventilator ein/aus noch anders aussehen, aber wenn es um so was wie Roboter-Steuerung geht, geht es schon ein wenig mehr zur Sache und über kurz oder lang kommst Du um mehrere Threads nicht drumherum.
    Und so würde ich z.B. so eine Steuerung auch aufbauen: ein Hauptthread der nur immer wieder die "Weichen" einer "Statemachine" stellt und die "Arbeitsthreads", die die Aufgaben dann erledigen.

    Für einen Einsteiger, füchte ich, ist da der Frust schon vorprogrammiert, da hier wohl mit Lock- und Synchronisierungs-Mechanismen gearbeitet wird und evtl. auch Interprozess-Kommunikation mit einfliesst usw. .
    All das sind doch wohl eher Themen für Fortgeschrittene ...

    Also überdenkt vielleicht Dein Vorhaben noch einmal und reduziere es vielleicht auf das für Dich Leistbare.

    cu,
    -ds-

  • ok, es kommt stark auf die Komplexität an. Eine einfache Steuerung wie sie Timmi vorschwebt braucht keine Threads, sobald dann aber nicht-real-time-planung dazukommt ist das absolut nötig.
    Eine weitere Möglichkeit wäre Interrupthandling, ich weiß garnicht wie das bei dem Pi funktioniert... Das ist das Mittel der Wahl bei Microprozessoren.

  • @ Horroreyes: Entschuldige, das war mir nicht bewusst...

    dreamshader:

    Ohje, Ohje.. Das kann ja noch heiter werden.. Nagut, dann werde ich wohl erst mal die "einfache" Lösung nutzen und dann vielleicht später das Programm umschreiben.
    Weil eigentlich möchte ich das ja später per Website steuern und dann kann ich mein C++Programm eh nicht mehr nutzen, richtig? Oder kann ich per Website auch auf die
    Kommandozeile zugreifen? Weil so wie ich das bei den meisten Leuten gesehen habe, steuern die ihre GPIOs dann direkt per PHP.

    Gruß,
    Thomas

  • Du kannst deinen C(++) Code weiternutzen.
    Ist ermessenssache was besser ist.
    Wenn du AUF EWIG UND NUR per Website das steuern willst kannst du das mit PHP super machen,
    Wenn du das aber auch mal irgendwie anders steuern willst (App, autonom, fernsteuerung, ...) dann solltest du eine vernünftige Steuerung in C(++) schreiben und die dann auch im Webinterface nutzen.

    (nur um einen verbreitenen Irrglauben vorzubeugen, du musst für ein Webinterface auch kein PHP verwenden! Du kannst Websites in etlichen anderen Sprachen wunderbar programmieren. Es geht sogar in C(++), aber das würde ich dann tatsächlich nicht mehr als "wunderbar" beschreiben. Obwohl ich zugeben muss, dass ich es noch nie ausprobiert habe wie wunderbar es in C++ ist.)

  • Hi,

    machen kann man (fast) alles.
    Nur sollte von vornherein die Vorgehensweise stimmen.
    Gutes Beispiel dafür ist Dein "kbhit()" - das ist, wenn ich mich recht entsinne, eine Funktion aus der DOS-/Windows-Welt. Diese Funktion reagiert auf den Tastatur-Interrupt der lokalen Tastatur - das würde bedeuten, Du müsstest eine Tastatur an den RPi anstöpseln, damit Du diese Funktion überhaupt nutzen kannst. Ein Roboter, hinter dem man herlaufen und die Vorwärts-Taste gedrückt halten muss, ist allerdings Unfug. Also würde es schon bei diesem simplen Vorgang scheitern ...
    Du verstehst, was ich meine?
    Hier wäre m.E. eben eine Kommando-Schnittstelle ("Weichenstell-Thread") angesagt, der Kommandos empfängt und die entsprechenden Aktionen anstösst (nicht ausführt).
    Nun, können wir uns irgendwann gerne mal zu Gemüte führen ... aber vielleicht versuchst Du erst mal in C sattelfest zu werden.

    cu,
    -ds-

  • Also mit C++ habe ich das Projekt eigentlich nur angefangen weil das halt ein wenig programmieren kann. Das es so schwierig wird, hatte ich jetzt nicht gedacht :blush:.

    Letztendlich soll das Programm wirklich nur per Website steuerbar sein, eventuell später mal eine eigens dafür gemacht App (da kenne ich den Schwierigkeitsgrad allerdings nicht).

    Ich würde das später gerne per iPad steuern (über den Browser als Website) wo ich dann das Videobild,
    die 4 Pfeiltasten, und jeweils einen Button für LED's an und aus drauf sehe :).

    Das soll sozusagen das "Endprodukt" werden.

    Einmal editiert, zuletzt von Timmi (16. April 2014 um 12:20)

  • Naja ... dann wäre zu überdenken, ob C überhaupt notwendig ist.
    Oder zumindest ob nicht andere (Script-)Sprachen hier für Teilaufgaben sinnvoller sind.
    Für HTML-Seiten wäre mein Tool der Wahl z.b. PHP (owohl das genauso auch in C ginge).
    App-technisch kann ich jetzt nichts beisteuern, aber ich glaube mich zu erinnern, dass trek_star da schon eine Oberfläche für Smartphones in Arbeit hat ( PiBot-Projekt ).
    Da Du ja jetzt physikalisch keine Verbindung mehr zum RPi hast, müsste eine Art Server auf dem RPi laufen, der in der Lage ist irgendwelche Kommandos entgegenzunehmen und/oder den aktuellen Status beizubehalten.
    Das würde ich z.B. über ein Common Gateway Interface (cgi) realisieren, ... aber um das zu vertiefen müsste ich da jetzt anfangen drüber nachzudenken.
    Die Spezies hier können Dir aber sicher sagen, ob sowas in Python oder einer anderen Sprache realisierbar ist ( in C ist das lösbar - logisch ).

    cu,
    -ds-

Jetzt mitmachen!

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