Auslesen des initialien Zustandes

Dies ist das deutsche Forum für alle Themen um den JoyWarrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
tbauer
Posts: 6
Joined: Tue Sep 20, 2011 3:46 pm

Auslesen des initialien Zustandes

Post by tbauer »

Hallo,
ich versuche den initialen Zustand des JW24A10L auszulesen. Leider scheint der initiale Zustand stets zum Programmstart nicht abfragbar zu sein. Erst nach einer Änderung des jeweiligen Zustandes ist dies fuer eine IO-Komponente möglich.
Mein Code dazu sieht folgendermassen aus:

Code: Select all

#include <sys/ioctl.h>
#include <linux/joystick.h>
...
int main() {
        // struct for joywarrior state defined in jw24a10l.h
	jw24a10l_state jwstate;
	for (int i=0; i<4; i++) 	jwstate.axis[i] 	= 0;
	for (int i=0; i<16; i++) 	jwstate.buttons[i] 	= 0;

        struct js_event msg;
	std::string str = "/dev/input/js0";
	char * device = new char[str.length()];
	strcpy(device,str.c_str());
	int fd = open(device, O_NONBLOCK);

        while(1) {
                while (read (fd, &msg, sizeof(struct js_event)) > 0) {
			  if(msg.type == JS_EVENT_BUTTON) 	jwstate.buttons[msg.number] = msg.value;
			  if(msg.type == JS_EVENT_AXIS)		jwstate.axis[msg.number] 	= msg.value;
                } 
                printState(jwstate); // gibt aktuellen jwstate aus
                usleep(10000);
       }
}
Im obigen Code wird der Linux-Kerneltreiber fuer Joysticks verwendet. Leider ist bis zu einer Aenderung des Zustandes jeweils der Wert nicht abfragbar bzw. wird nicht geliefert. Mit obigem Code wird beim Start des Programmes 19 mal der State ausgegeben, 3mal fuer die Achsen und 16mal fuer die angeschlosse Buttonmatrix. Die Wert werden allerdings erst ungleich Null, sobald ein Button gedrueckt oder eine Achse bewegt wurde.
Ist dieses Verhalten fuer den Joywarrior normal?

bg, Tobias

EDIT: Nachtrag: Hab das ganze eben mal unter WindowsXP getestet mit den Hausmitteln aus der Systemsteuerung. Dort werden die Initialwerte nach dem Anschliessen des Chips erkannt. also liegt das Problem wohl am Linuxtreiber. :(
Hat jemand schonmal den JW unter Linux ohne den Joystick-Treiber verwendet?
tbauer
Posts: 6
Joined: Tue Sep 20, 2011 3:46 pm

Re: Auslesen des initialien Zustandes

Post by tbauer »

Habe die Loesung gefunden. Der Code lautet:

Code: Select all

#define JOY_DEV "/dev/js0"
#include <sys/ioctl.h>
#include <linux/joystick.h>
#include <stdlib.h>
int main() {
	sleep(1);
	// struct for joywarrior state
	jw24a10l_state jwstate;
	for (int i=0; i<4; i++) 	jwstate.axis[i] 	= 0;
	for (int i=0; i<16; i++) 	jwstate.buttons[i] 	= 0;
	for (int i=0; i<4; i++) 	jwstate.out[i] 		= 0;
    
	struct js_event msg;
	std::string str = "/dev/input/js0";
	
	char * device = new char[str.length()];
	strcpy(device,str.c_str());
	int fd = open(device, O_NONBLOCK);
	
	printf("Start reading device...\n");
	while(!kbhit()) {
		while (read (fd, &msg, sizeof(struct js_event)) > 0) {
			if((msg.type & ~JS_EVENT_INIT) == JS_EVENT_BUTTON) 	jwstate.buttons[msg.number] 	= msg.value;
			if((msg.type & ~JS_EVENT_INIT) == JS_EVENT_AXIS)	jwstate.axis[msg.number] 	= msg.value;
			prinstState();
			usleep(10000);
		}
	}
	close(fd);
	return 0;
}
Wichtig war bei der if-Abfrage von event.type das Einfuegen von ((msg.type & ~JS_EVENT_INIT). Die synthetischen Events bei der Initialisierung sind 0x81 fuer Buttons und 0x82 Achsen. Die regulaeren Events sind 0x01 fuer Buttons und 0x02 fuer Achsen, daher kann man schlicht 0x80 (JS_EVENT_INIT) durch die Bitoperatoren raushauen und schon gehts ;) .
Post Reply