Hallo,
es geht auch mit g++ und ohne Parameter.
Dafür musste ich die Vorgehensweise ändern.
Folgendes Beispiel sollte auch für Dich anpassbar sein. Der Scancode wird in der Variable keybscan abgelegt. Danach kannst Du eine Sub aufrufen oder die Variable in Deiner Mainloop pollen.
Code:
// Compile with: g++ -o /var/scripte/tastaturtest1 /var/scripte/tastaturtest1.c -L/usr/local/lib -lpthread
// /var/scripte/tastaturtest1
// 05.04.2016 - peterfido
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdint.h>
#include <sys/sysinfo.h>
#include <time.h>
#include <linux/input.h>
#include <pthread.h>
#include <errno.h>
#include <termios.h>
#include <signal.h>
#include <sys/types.h>
#include <fcntl.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/select.h>
int ziffer=0;
int beenden=2;
int zeit=0;
int shiftl=0;
int shiftr=0;
int shift =0;
int strgl=0;
int strgr=0;
int strg=0;
int capsl=0;
int alt=0;
int altgr=0;
int windows=0;
int kontext=0;
int keybscan=0;
void* thread1Go(void *)
{
int _TASKS_ACTIVE_=0;
struct input_event ev[64];
int fd, rd, value, size = sizeof (struct input_event);
if ((fd = open ("/dev/input/event0", O_RDONLY)) == -1){
printf ("Fehler mit Tastatur");
}else{
_TASKS_ACTIVE_=1;
}
struct input_event event;
while (_TASKS_ACTIVE_) {
/* _lastbeat_ = _heartbeat_;
_heartbeat_ = recvbuf[TERM];
if(abs(_heartbeat_ - _lastbeat_) ==0)
{ if(_missedbeats_ <998) _missedbeats_++; }
else _missedbeats_ = 0;
_REMOTE_OK_ = _missedbeats_ < 100;
delay(50);
*/
if ((rd = read (fd, ev, size * 64)) < size)
printf ("Fehler mit Tastatur");
if (ev[1].type != EV_KEY) continue;
if (ev[1].value==0){ //Taste losgelassen
switch (ev[1].code) {
case 42: shiftl=0; break;
case 54: shiftr=0; break;
case 29: strgl=0; break;
case 97: strgr=0; break;
case 56: alt=0; break;
case 125: windows=0; break;
case 100: altgr=0; break;
case 127: kontext=0; break;
}
}else{
if (ev[1].value==1){ //==1 für nur einen Druck ohne Wiederholung. >=1 für Erkennung von gedrückt gehaltener Taste
switch (ev[1].code) {
case 42: shiftl=1; break;
case 54: shiftr=1; break;
case 29: strgl=1; break;
case 97: strgr=1; break;
case 56: alt=1; break;
case 125: windows=1; break;
case 100: altgr=1; break;
case 127: kontext=1; break;
// Ab hier 'normale Tasten'
case 1: beenden=0; _TASKS_ACTIVE_=0; break; //ESC
default: keybscan=ev[1].code;// Scancode ablegen
printf("SHIFTL: %d, SHIFTR: %d, STRGL: %d, STRGR: %d; ",shiftl,shiftr,strgl,strgr);
printf("Typ: %d; Wert: %d; Code: %d\n",ev[1].type,ev[1].value,ev[1].code);
break;
}
}
}
}
beenden=0;
pthread_exit((void *) 0);
}
int main()
{
pthread_t thread1;
struct sched_param param;
if(pthread_create(&thread1, NULL, thread1Go, NULL) != 0)
{
fprintf(stderr, "Fehler bei Tastatur......\n");
exit(0);
}
param.sched_priority = 20;
pthread_setschedparam(thread1, SCHED_RR, ¶m);
beenden=1;
while (beenden > 0)
{ sleep(1);
zeit++;
if (zeit==30)
{
zeit=0;
printf("Wieder 30 Sekunden um.\n");
}
}
usleep(50);
printf("***********Ende************\n");
return 0;
}
Das Threading habe ich soweit von Dir übernommen. Einige Variablen fehlten mir, deren Deklaration muss dann in Deinem Programm wieder raus. Die Heartbeat-Geschichte habe ich einfach komplett auskommentiert. Die brauchst eigentlich nur wieder einkommentieren.
Lesezeichen