summaryrefslogtreecommitdiffstats
path: root/system/joystick/joystick.diff
blob: 37e21bd07e601817b9ae8ae6cd42fed4bb78f18f (plain)
Only in joystick-20051019: debian
Only in /home/kajla/usr/src/joystick/: .svn
diff -ur joystick-20051019/utils/jscal.c /home/kajla/usr/src/joystick/utils/jscal.c
--- joystick-20051019/utils/jscal.c	2004-10-19 09:51:52.000000000 +0200
+++ /home/kajla/usr/src/joystick/utils/jscal.c	2007-09-26 12:56:33.000000000 +0200
@@ -61,6 +61,8 @@
 
 int fd;
 struct js_corr corr[MAX_AXES];
+__u8 axmap[ABS_MAX + 1];
+__u16 buttonmap[(KEY_MAX - BTN_MISC + 1)];
 char axes, buttons, fuzz;
 int version;
 struct correction_data corda[MAX_AXES];
@@ -163,6 +165,12 @@
 	puts("  -V             --version           Prints the version numbers");
 	puts("  -p             --print-correction  Prints the current settings as a jscal");
 	puts("                                       command line");
+	puts("  -q             --print-mappings    Print the current axis and button");
+  puts("                                       mappings as a jscal command line");
+	puts("  -u <n_of_axes,axmap1,axmap2,...,");
+  puts("      n_of_buttons,btnmap1,btnmap2,");
+  puts("      ...>       --set-mappings      Sets axis and button mappings to the");
+  puts("                                        specified values");
 	putchar('\n');
 }
 
@@ -316,6 +324,42 @@
 		(version >> 8) & 0xff, version & 0xff);
 }
 
+void print_mappings(char *devicename)
+{
+	int i;
+
+	if (ioctl(fd, JSIOCGAXES, &axes)) {
+		perror("jscal: error getting axes");
+		exit(1);
+	}
+	if (ioctl(fd, JSIOCGBUTTONS, &buttons)) {
+		perror("jscal: error getting buttons");
+		exit(1);
+	}
+	if (ioctl(fd, JSIOCGAXMAP, &axmap)) {
+		perror("jscal: error getting axis map");
+		exit(1);
+	}
+	if (ioctl(fd, JSIOCGBTNMAP, &buttonmap)) {
+		perror("jscal: error getting button map");
+		exit(1);
+	}
+
+	printf("jscal -u %d", axes);
+	for (i = 0; i < axes; i++)
+  {
+		printf( ",%d", axmap[i]);
+	}
+
+  printf(",%d", buttons);
+	for (i = 0; i < buttons; i++)
+  {
+		printf( ",%d", buttonmap[i]);
+	}
+
+	printf(" %s\n",devicename);
+}
+
 void print_settings(char *devicename)
 {
 	int i,j;
@@ -342,6 +386,107 @@
 	printf(" %s\n",devicename);
 }
 
+// n axes                      n buttons
+// 10,0,1,2,5,6,16,17,40,41,42:13,288,289,290,291,292,293,294,295,296,297,298,299,300
+void set_mappings(char *p)
+{
+	int i;
+	int axes_on_cl = 0;
+	int btns_on_cl = 0;
+  int axis_mapping = 0;
+  int btn_mapping = 0;
+
+	if (ioctl(fd, JSIOCGAXES, &axes)) {
+		perror("jscal: error getting axes");
+		exit(1);
+	}
+	if (ioctl(fd, JSIOCGBUTTONS, &buttons)) {
+		perror("jscal: error getting buttons");
+		exit(1);
+	}
+
+	if (axes > MAX_AXES) axes = MAX_AXES;
+
+	if (!p) {
+		fprintf(stderr, "jscal: missing argument for --set-mappings\n");
+		exit(1);
+	}
+
+  //axes
+	sscanf(p, "%d", &axes_on_cl);
+	p = strstr(p, ",");
+
+	if (axes_on_cl != axes) {
+		fprintf(stderr, "jscal: joystick has %d axes and not %d as specified on command line\n", 
+			axes, axes_on_cl);
+		exit(1);
+	}
+
+
+	for (i = 0; i < axes; i++)
+  {
+		if (!p) {
+			fprintf(stderr, "jscal: missing mapping for axis %d\n", i);
+			exit(1);
+		}
+		sscanf(++p, "%d", &axis_mapping);
+		p = strstr(p, ",");
+
+
+		if (axis_mapping > ABS_MAX + 1) {
+			fprintf(stderr, "jscal: invalid axis mapping for axis %d (max is %d)\n", i, ABS_MAX + 1);
+			exit(1);
+		}
+		axmap[i] = axis_mapping;
+	}
+
+  //buttons
+	sscanf(++p, "%d", &btns_on_cl);
+	p = strstr(p, ",");
+
+	if (btns_on_cl != buttons) {
+		fprintf(stderr, "jscal: joystick has %d buttons and not %d as specified on command line\n", 
+			buttons, btns_on_cl);
+		exit(1);
+	}
+
+
+	for (i = 0; i < buttons; i++)
+  {
+		if (!p) {
+			fprintf(stderr, "jscal: missing mapping for button %d\n", i);
+			exit(1);
+		}
+		sscanf(++p, "%d", &btn_mapping);
+		p = strstr(p, ",");
+
+
+		if (btn_mapping > KEY_MAX) {
+			fprintf(stderr, "jscal: invalid button mapping for button %d (max is %d)\n", i, KEY_MAX);
+			exit(1);
+		}
+		if (btn_mapping < BTN_MISC) {
+			fprintf(stderr, "jscal: invalid button mapping for button %d (min is %d)\n", i, BTN_MISC);
+			exit(1);
+		}
+		buttonmap[i] = btn_mapping;
+	}
+
+	if (p) {
+		fprintf(stderr, "jscal: too many values\n");
+		exit(1);
+	}
+	
+	if (ioctl(fd, JSIOCSAXMAP, &axmap)) {
+		perror("jscal: error setting axis map");
+		exit(1);
+	}
+	if (ioctl(fd, JSIOCSBTNMAP, &buttonmap)) {
+		perror("jscal: error setting button map");
+		exit(1);
+	}
+}
+
 void set_correction(char *p)
 {
 	int i,j;
@@ -461,14 +606,18 @@
 	char *parameter = NULL;
 	int t;
 
+  // /usr/include/getopt.h
 	static struct option long_options[] =
 	{
 		{"calibrate", no_argument, NULL, 'c'},
 		{"help", no_argument, NULL, 'h'},
 		{"set-correction", required_argument, NULL, 's'},
+		{"set-mappings", required_argument, NULL, 'u'},
 		{"test-center", no_argument, NULL, 't'},
 		{"version", no_argument, NULL, 'V'},
-		{"print-correction", no_argument, NULL, 'p'}
+		{"print-correction", no_argument, NULL, 'p'},
+		{"print-mappings", no_argument, NULL, 'q'},
+    {NULL, no_argument, NULL, 0 }
 	};
 
 	if (argc == 1) {
@@ -477,10 +626,12 @@
 	}
 
 	do {
-		t = getopt_long(argc, argv, "chps:vVt", long_options, &option_index);
+		t = getopt_long(argc, argv, "chpqu:s:vVt", long_options, &option_index);
 		switch (t) {
 			case 'p':
+			case 'q':
 			case 's':
+			case 'u':
 			case 'c':
 			case 't':
 			case 'V':
@@ -540,9 +691,15 @@
 		case 'p':
 			print_settings(argv[argc -1]);
 			break;
+		case 'q':
+			print_mappings(argv[argc -1]);
+			break;
 		case 's':
 			set_correction(parameter);
 			break;
+		case 'u':
+			set_mappings(parameter);
+			break;
 		case 't':
 			test_center();
 			break;
Only in /home/kajla/usr/src/joystick/utils: .svn