| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- Add axis and button remapping. Patch provided by Dr. László Kaján; see
- http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=444142
- Note that the patch provided also changed the jscal man page; this part of
- the patch is merged directly into the diff.gz to avoid having quilt patches
- which change Debian-specific files.
- --- joystick-20051019.orig/utils/jscal.c
- +++ joystick-20051019/utils/jscal.c
- @@ -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');
- }
-
- @@ -329,6 +337,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;
- @@ -355,6 +399,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;
- @@ -474,14 +619,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) {
- @@ -490,10 +639,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':
- @@ -553,9 +704,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;
|