im Prinzip ist mir die Ebene egal, ich lese die Tastatur in einer Art pthread "keyboard watcher task" - bisher wird nur die Taste ESC überwacht für einen program abort, aber nun sollen auch andere Tasten überwacht werden, insbesondere Sondertasten:
*arrrgs* wieder kein Code Tag!!!kbhit habe ich als conio-mimic hierraus:Code:void* thread1Go(void *) // medium priority: keyboard + heartbeat monitoring { int c; // keyboard key while(_TASKS_ACTIVE_) { c=0; if (kbhit()) { // <<<<<<<<<<<<<<<<<< c = getchar(); if( c==27 ) { // ESC to quit program printf("\n\n ESC pressed - program terminated by user \n"); _TASKS_ACTIVE_=0; // semaphore to stop all tasks printf("\n wait for tasks to join main()... \n\n"); return NULL; } } //... ***SNIP*** delay(50); } return NULL; }
Code:#ifndef RPICONIO_H #define RPICONIO_H #include <stdbool.h> #include <stdio.h> #include <string.h> #include <termio.h> #include <unistd.h> bool kbhit(void) { struct termios original; tcgetattr(STDIN_FILENO, &original); struct termios term; memcpy(&term, &original, sizeof(term)); term.c_lflag &= ~ICANON; tcsetattr(STDIN_FILENO, TCSANOW, &term); int characters_buffered = 0; ioctl(STDIN_FILENO, FIONREAD, &characters_buffered); tcsetattr(STDIN_FILENO, TCSANOW, &original); bool pressed = (characters_buffered != 0); return pressed; } //... ***SNIP*** #endif
über wiederholtes getchar() Auslesen ginge es zwar prinzipiell, aber F1 liefert 3 Zechen im keyb-Puffer (27,79,80) und shift-F1 wohl sogar 6, was ein Unding wäre, das über eine extra state machine verarbeiten zu wollen - für alle 102x7 möglichen key+modifier-Kombis.
Also wird eine Art "Scancode" gebraucht, so wie es das schon früher bei Turbo Pascal und Turbo C optional, zusätzlich zu readkey oder getchar gab.







Zitieren

Lesezeichen