ubuntuusers.de

USB GameController mit C auslesen

Status: Gelöst | Ubuntu-Version: Ubuntu 15.10 (Wily Werewolf)
Antworten |

Rob_Rob

Anmeldungsdatum:
25. Mai 2014

Beiträge: 109

Hey, hier Robert. ich habe ein USB Game Controller und wollte mit dem ein einfaches selbst geschriebenes Spiel steuern. Das Spiel Existiert noch nicht, da ich erst mit dem unbekannten anfangen wollte. Meine erste Ungewissheit ist: wo ist der Gamecontroller eingehängt? ich habe gelesen, dass alle USB Geräte unter Linux als Serielle Schnittstellen unter dev/ttySX (wobei X hier eine Nummer darstellt) eingebunden werden und das man über die entsprechende Datei mit den den Geräten Kommunizieren kann. Aber welches von den vielen ttySX Daten gehört zu meinen Controller? Ich habe mir dieses Programm genommen(http://stackoverflow.com/questions/10242648/programming-linux-serial-port-ttys0) und es ausprobiert aber ich bekomm die Datei nicht auf. müssen dort andere rechte vergeben werden?

hier nochmal der benutzte code:

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
#include <unistd.h>

int main()
{
    printf("hello world\n");
//    int n;
    int fd;
    char c;
    int bytes;

    char buffer[10];
    char *bufptr;
 //   int nbytes;
 //   int tries;
    int x;
    struct termios options;


    fd = open("/dev/ttyS2", O_RDWR | O_NOCTTY | O_NDELAY);
    if(fd == -1)
    {
        perror("open_port: Unable to open:");
    }
    else
    {
        fcntl(fd, F_SETFL, 0);
        printf("hi again\n");
    }

    tcgetattr(fd, &options);

    cfsetispeed(&options, B115200);
    cfsetospeed(&options, B115200);
    options.c_cflag |= (CLOCAL | CREAD);
    options.c_cflag &= ~PARENB;
//  options.c_cflag &= ~CSTOPB;
	options.c_cflag &= ~CSTOPB;
    options.c_cflag &= ~CSIZE;
    options.c_cflag |= CS8;
    options.c_cflag &= ~( ICANON | ECHO | ECHOE |ISIG );
    options.c_iflag &= ~(IXON | IXOFF | IXANY );
    options.c_oflag &= ~OPOST;

    tcsetattr(fd, TCSANOW, &options);


    write(fd, "ATZ\r",4);
    printf(" wrote\n");
    bufptr = buffer;


    fcntl(fd, F_SETFL, FNDELAY);
     bytes = read(fd, bufptr, sizeof(buffer));
    printf("number of bytes read is %d\n", bytes);
    perror ("read error:");

    for (x = 0; x < 10 ; x++)
    {
        c = buffer[x];
        printf("%d  ",c);
    }
    close(fd);

    //puts(buffer[0]);
    printf("\nshould of put something out \n");

    return (0);
}

ich stelle mich anscheinend generell ungeschickt an, zu diesem Thema brauchbare Informationen zu suchen. Kann mir jemand ein paar Seiten empfehlen, die es nützlich wäre durchzulesen, bevor ich anfange zu Programmieren?

Rob_Rob

(Themenstarter)

Anmeldungsdatum:
25. Mai 2014

Beiträge: 109

könnte bitte ein Admin diesen Thred ins Forum "Projekte" verschieben? denke dort ist es besser aufgehoben. Ich selbst kann es anscheinend nicht verschieben.

Danke

Rob_Rob

(Themenstarter)

Anmeldungsdatum:
25. Mai 2014

Beiträge: 109

wenn man Gamecontroller bei seinen suchen durch das Wort Joystick austauscht findet man zu diesem Thema wieder ausreichend Infomaterial.

Hier mein Code:

 // code inspieriert von: https://scaryreasoner.wordpress.com/2008/02/22/programming-joysticks-with-linux/	
 	
 	
 	#include <stdio.h>
 	#include <sys/types.h>
 	#include <sys/stat.h>
 	#include <fcntl.h>
 	#include <unistd.h>
 	#include <stdlib.h>
 	#include <string.h>

 	struct js_event {
 	        unsigned int time;      /* event timestamp in milliseconds */
 	        short value;   /* value */
 	        unsigned char type;     /* event type */
 	        unsigned char number;   /* axis/button number */
		};

int open_joystick(){
	int joystick_fd = open("/dev/input/js1", O_RDONLY | O_NONBLOCK); 
	
	if (joystick_fd < 0){
		printf("Konnte Joystick nicht einlesen. Mit den PC verbunden?\n");
		exit(1);
	}	
	return joystick_fd;
}

int read_joystick_event(struct js_event *jse, int fd){

	int bytes = read(fd, jse, sizeof(*jse)); 

	if (bytes == sizeof(*jse)) // Joystick angeschlosssen und sendet irgendwas
			return 1;
	if (bytes == -1) //Joystick angeschlossen, doch gerade ist keine Taste gedrückt
 	        return 0;
	printf("Joysick angeschlossen, doch das lesen ist nicht möglich.\nNoch mal anschließen?");
	exit(1);
	return -1;	
}

void close_joystick(int fd){
		close(fd);
}
	
int main(){
	int fd, rc;

	struct js_event jse;
	fd = open_joystick();
	while (1) {
		rc = read_joystick_event(&jse,fd);
		if (rc == 1) {
			printf("Event: time %8u, value %8hd, type: %3u, axis/button: %u\n", 
			jse.time, jse.value, jse.type, jse.number);
		}
	}
 }
Antworten |