Hallo,
man kann alle Tasten in C abfragen. Du kannst sogar auf die Numlock-Taste im Programm reagieren.
Anbei ein auf das Wesentliche reduzierte Testprogramm:
Code:
// Compile with: GCC -o /var/scripte/tastaturtest /var/scripte/tastaturtest.c -L/usr/local/lib -lpthread
//nice -1 /var/scripte/tastaturtest < /dev/input/event0 &
#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>
int ziffer=0;
int beenden=2;
int zeit=0;
int shiftl=0;
int shiftr=0;
int strgl=0;
int strgr=0;
int capsl=0;
unsigned char runterfahren(){
system("halt");
}
unsigned char zahlentaste()
{
printf("Zahlentaste: %d\n", ziffer);
}
unsigned char tnull()
{
ziffer=0;
zahlentaste();
}
unsigned char teins()
{
ziffer=1;
zahlentaste();
}
unsigned char tzwei()
{
ziffer=2;
zahlentaste();
}
unsigned char tdrei()
{
ziffer=3;
zahlentaste();
}
unsigned char tvier()
{
ziffer=4;
zahlentaste();
}
unsigned char tfuenf()
{
ziffer=5;
zahlentaste();
}
unsigned char tsechs()
{
ziffer=6;
zahlentaste();
}
unsigned char tsieben()
{
ziffer=7;
zahlentaste();
}
unsigned char tacht()
{
ziffer=8;
zahlentaste();
}
unsigned char tneun()
{
ziffer=9;
zahlentaste();
}
unsigned char tdel()
{
printf("Delete\n");
}
unsigned char tnum()
{
printf("Numlock\n");
}
unsigned char tenter()
{ printf("Enter\n");
}
unsigned char tplus()
{
printf("Plus\n");
}
unsigned char tminus()
{
printf("Minus\n");
}
unsigned char tmal()
{
printf("Mal\n");
}
unsigned char tgeteilt()
{
printf("Geteilt\n");
}
unsigned char tbs()
{
printf("Backspace\n");
}
unsigned char tq()
{
beenden=1;
}
unsigned char status()
{
printf("SHIFTL: %d, SHIFTR: %d, STRGL: %d, STRGR: %d\n",shiftl,shiftr,strgl,strgr);
}
unsigned char tf1()
{
if(shiftl>=1 || shiftr>=1){
printf("SHIFT + F1\n");
}else{
printf("F1\n");
}
}
void tastatur(void *name)
{
struct input_event event;
while ((read(0, &event, sizeof(event)) > 0) && (beenden==2) ) {
if (event.type != EV_KEY) continue;
// if (event.value != EV_KEY) continue; //Nur Tastendrücke erkennen, kein Loslassen. 0=losgelassen, 1=gedrückt, 2=Wiederholung(lang gedrückt)
printf("Typ: %d; Wert: %d; Code: %d\n",event.type,event.value,event.code);
switch (event.code) {
case 42: shiftl=event.value; break;
case 54: shiftr=event.value; break;
case 29: strgl=event.value; break;
case 97: strgr=event.value; break;
case 16: tq(); break; //q
case 82: tnull(); break; //0
case 79: teins(); break; //1
case 80: tzwei(); break; //2
case 81: tdrei(); break; //3
case 75: tvier(); break; //4
case 76: tfuenf(); break; //5
case 77: tsechs(); break; //6
case 71: tsieben(); break; //7
case 72: tacht(); break; //8
case 73: tneun(); break; //9
case 83: tdel(); break; //DEL
case 96: tenter(); break; //ENTER
case 78: tplus(); break; //+
case 74: tminus(); break; //-
case 55: tmal(); break; //*
case 98: tgeteilt(); break; ///
case 14: tbs(); break; //Backspace
case 69: tnum(); break; //NumLock
case 59: tf1(); break; //F1
case 31: status(); break; //s
}
}
beenden=0;
pthread_exit((void *) 0);
}
int main(int argc, char** argv)
{
pthread_t t1;
if(pthread_create(&t1, NULL, (void *)&tastatur, (void *)"Tastatur") != 0)
{
fprintf(stderr, "Fehler bei Tastatur......\n");
exit(0);
}
while (beenden > 0)
{ sleep(1);
zeit++;
if (zeit==30)
{
zeit=0;
printf("Wieder 30 Sekunden um.\n");
}
}
usleep(50);
printf("***********Ende************\n");
return 0;
}
Dieses Programm zeigt die Codes an, welche an einer AM RASPI ANGESCHLOSSENEN Tastatur gedrückten / losgelassenen Taste entspricht. Ein Beispiel mit F1 ohne und mit SHIFT habe ich eingefügt.
Das Programm wird mit q beendet. Als Startparameter muss das Device der Tastatur angegeben werden. Bei nur einer Tastatur reicht die zweite Zeile im Programmkopf zum Starten. Den Pfad (auch den zum zum kompilieren) natürlich anpassen.
Lesezeichen