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 --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