(C++) Roboterprogramm soll Tastaturpuffer lesen.

  • Hallo,

    mein Roboterprogram (C++) arbeitet alles in Zeitscheiben ab. U.a. liest es jede Sekunde eine Steuerdatei aus die gewisse Befehle für ihn vorhält. Ein "t" z.B. für terminate.

    Ich möchte das jetzt aber mit Tastatureingaben vom Roboterprogramm aus bewerkstelligen - das Programm soll aber nicht anhalten und auf Tastatureingaben warten. Kann mir da jemand einen Tipp geben mit Tastaturpuffer auslesen o.ä. ? Kenne mich da wenig aus.


    Danke

  • Ich kann libevent empfehlen, die macht das und gibt dir auch timer.

  • Vielen Dank,

    habe mir mal vieles im Internet angesehen bzgl. select, poll und auch die libevent-Lib aber finde keinen Ansatzpunkt (für mein skill ^^) und kein Beispiel.

    Hättet ihr da vielleicht etwas detailliertere Infos für mich?

    Danke

  • Du findest kein Beispiel? Da haste aber nicht lange gesucht.


    Hier ist eines: gist.github.com/mythosil/1303479


    (Du musst das kopieren, das Forum hat ein bug mit der URL)


    ACHTUNG: um einzelne Tastendrücke vom Terminal einzulesen, musst du das noch in den nicht-kanonischen Modus schalten: https://www.gnu.org/software/l…ode/Canonical-or-Not.html

  • Hallo,

    ich weis, hier ist kein C-Kurs aber vielleicht hilft mir jemand mal generell auf die Sprünge wenn es darum geht so eine Funktion in ein Programm einzubinden. Bisher hatte ich nur mit den Standardbibliotheken zu tun und vielleicht noch mit wiring_pi.


    - Hier ist jetzt eine event.h als include erforderlich.

    - die event.c verlangt jetzt dutzende .h und letztendlich .c aus unterschiedlichen Verzeichnissen :conf::denker:

    - muss ich jetzt in github ein "clone" machen und die Dateien purzeln dann entsprechend in ihre Verzeichnisse? Oder die libevent-2.1.11-stable.tar.gz runterladen, entpacken und dann auf dem Rechner mit git alles einsortieren lassen?


    Danke :helpnew:

  • Du solltest die eigentlich aus der Paketverwaltung installieren koennen. `apt-get install libevent-dev` oder so. Und ja, dann brauchst du einen include. Wie im Beispiel.

  • ok, habe ich so gemacht (woher weist du übrigens, dass es das Paket libevent-dev ist???)

    Habe jetzt mal nur compiliert:


    Code
    g++ -Wall r_libevent.cpp


    Code
    pi@raspberrypi:~/prodz2/cpp/r_libevent $ ./release
    /usr/bin/ld: /tmp/ccLzC5sb.o: in function `main':
    r_libevent.cpp:(.text+0x10c): undefined reference to `event_base_new'
    /usr/bin/ld: r_libevent.cpp:(.text+0x140): undefined reference to `event_new'
    /usr/bin/ld: r_libevent.cpp:(.text+0x158): undefined reference to `event_add'
    /usr/bin/ld: r_libevent.cpp:(.text+0x160): undefined reference to `event_base_dispatch'
    /usr/bin/ld: r_libevent.cpp:(.text+0x168): undefined reference to `event_free'
    /usr/bin/ld: r_libevent.cpp:(.text+0x170): undefined reference to `event_base_free'


    ganz zu schweigen was ich dann beim linken wohl angeben muss :conf:.

  • -levent


    sollte helfen. Und Pakete werden in Linux meistens in die Bibliothek und eine dev Variante mit den Headern geteilt. Denn die braucht nur, wer auch entwickelt.


    Das ist aber wirklich alles Grundlagen C Entwicklung, ggf speziell unter Linux. Das zu wird es ausreichend Tutorials geben, die erklären, was header sind, was linking bedeute, etc.

  • Ich verstehe die cmake Frage nicht. Cmake ist gut, benutz das, aber warum ist die Version so entscheidend?

  • In der Bibliothek gibt es einige CMake Makefiles. Hatte gedacht ich müsste mir hier eine aussuchen.


    so hat es jetzt geklappt:

    Code
    gcc -I . -o r_libevent.exe r_libevent.c -Wall -l event

    Habe schon meine Grundlagen in modularer Programmgestaltung, compilieren und linken. Aber nur Grundlagen! -l event ist doch eigentlich ein Kommando für den Linker um eine Objektdatei einzubinden. Diese finde ich nicht und ich frage mich woher ich diese Info bekomme was einzubinden ist.

  • -levent


    sollte helfen. Und Pakete werden in Linux meistens in die Bibliothek und eine dev Variante mit den Headern geteilt. Denn die braucht nur, wer auch entwickelt.


    Das ist aber wirklich alles Grundlagen C Entwicklung, ggf speziell unter Linux. Das zu wird es ausreichend Tutorials geben, die erklären, was header sind, was linking bedeute, etc.

    Ja, speziell unter Linux werde ich noch versuchen ausführliche Infos zu bekommen.

  • Das ist die Quelldistribution der Bibliothek selbst, das ist dazu gedacht, die zu bauen. Dir hilft das nix. Denn das haben die Paket-Maintanier von Debian ja schon fuer dich gemacht.


    Und das -l ein Kommando waere, eine Objektdatei einzubinden (.o) waere mir neu. Das macht man einfach durch Angabe der .o-Datei selbst. -l dient dazu, Bibliotheken zu linken. libevent.so oder libevent.a in deinem Fall. Und *was* du linken musst haengt davon ab, was in dem Paket (oder Paketen) drin ist. dpkg -L libevent-core-2.1-6 zeigt einem das zB.


    Ich wuerde dir uebrigens dringend raten, selbst cmake zu benutzen. Damit sollte das linken, vor allem aber auch ggf. notwendige andere Compiler-Einstellungen, die sonst zu Fehlern fuehren, von alleine konfiguriert werden.

  • Und das -l ein Kommando waere, eine Objektdatei einzubinden (.o) waere mir neu.

    oje wie peinlich :rolleyes:


    Quote

    Das macht man einfach durch Angabe der .o-Datei selbst. -l dient dazu, Bibliotheken zu linken. libevent.so oder libevent.a in deinem Fall. Und *was* du linken musst haengt davon ab, was in dem Paket (oder Paketen) drin ist. dpkg -L libevent-core-2.1-6 zeigt einem das zB.

    Danke für die Info


    Quote


    Ich wuerde dir uebrigens dringend raten, selbst cmake zu benutzen. Damit sollte das linken, vor allem aber auch ggf. notwendige andere Compiler-Einstellungen, die sonst zu Fehlern fuehren, von alleine konfiguriert werden.

    Für Windowsprogramme nutze ich die IDE Codelite - die kann Cmake - was ich mir aber noch nicht angetan habe. Auf meinen Zero bräuchte ich für Codelite die grafische Oberfläche (wird dann zäh) und arbeite dann lieber in der Kommandoebene - was mir "sauspaß" macht - mit release und debug-scripten und dann auch gerne mal händisch mit GDB.

    Du hast mir meine Baustellen aufgezeigt und ich werde schauen ob ich da gute Unterlagen finde - es bleibt ein schönes Hobby und freue mich hier über die netten Kontakte mit den wertvollen Hilfestellungen.

  • cmake hat nichts mit IDE zu tun. Das ist eine Datei CMakeLists.txt, und du kannst alles mit cmake und cmake --build machen, also mit der Kommandozeile. Mit mehr features, und mehr Komfort.

  • Meine IDE hat einen Plugin "Cmake" und dann müsste es dann vielleicht eine Importfunktion sein um eine CmakeLists.txt einzulesen??? Wie es in Raspian über die Kommandozeile geht schaue ich mir dann an wenn ich die Hintergrundabfrage der Tastaureingaben verstanden habe. Sicher habe ich da auch noch Fragen :whistling: .

  • Keine Ahnung. Geben tut es sowas, ja. Ob deine das so macht - kA. Ist aber wahrscheinlich, ja.

  • Dein o.g. Kommando ergibt (ältere Version) :


    Quote


    Und *was* du linken musst haengt davon ab, was in dem Paket (oder Paketen) drin ist. dpkg -L libevent-core-2.1-6 zeigt einem das zB.


    Die Bibliothek ist riesengroß. Und warum die libevent.a und nicht z.B. die ..core.a? Btw. ist das eine compilierte Objektdatei?