From: <sk...@us...> - 2010-09-23 11:56:41
|
Revision: 2392 http://linuxconsole.svn.sourceforge.net/linuxconsole/?rev=2392&view=rev Author: skitt Date: 2010-09-23 11:56:32 +0000 (Thu, 23 Sep 2010) Log Message: ----------- When applying an axis map, carry calibration data over to the new axis assignments. Patch provided by Krzysztof A. Sobiecki; see http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=529865 Modified Paths: -------------- trunk/utils/jscal.c Modified: trunk/utils/jscal.c =================================================================== --- trunk/utils/jscal.c 2010-09-23 11:54:38 UTC (rev 2391) +++ trunk/utils/jscal.c 2010-09-23 11:56:32 UTC (rev 2392) @@ -62,6 +62,7 @@ int fd; struct js_corr corr[MAX_AXES]; __u8 axmap[ABS_MAX + 1]; +__u8 axmap2[ABS_MAX + 1]; __u16 buttonmap[(KEY_MAX - BTN_MISC + 1)]; char axes, buttons, fuzz; int version; @@ -354,8 +355,7 @@ exit(1); } if (ioctl(fd, JSIOCGBTNMAP, &buttonmap)) { - perror("jscal: error getting button map"); - exit(1); + buttons=0; } printf("jscal -u %d", axes); @@ -373,6 +373,48 @@ printf(" %s\n",devicename); } + +void get_axmap2(void) +{ + if (ioctl(fd, JSIOCGAXMAP, &axmap2)) { + perror("jscal: error getting axis map"); + exit(1); + } +} + +/* + * Remap the calibration data to fit the (potentially) new axis map. + * axmap2 stores the original axis map, axmap the new one. + */ +void correct_axes(void) +{ + int axmes[ABS_MAX + 1]; + struct js_corr corr_tmp[MAX_AXES]; + int i; + int ax[axes]; + //Create remapping table + for(i=0;i<axes;++i){ + axmes[(axmap2[i])]=i; + } + for(i=0;i<axes;++i){ + ax[i]=axmes[(axmap[i])]; + } + //Read again current callibration settings + if (ioctl(fd, JSIOCGCORR, &corr)) { + perror("jscal: error getting correction"); + exit(1); + } + //Remap callibration settings + for (i = 0; i < axes; i++) { + corr_tmp[i]=corr[(ax[i])]; + } + if (ioctl(fd, JSIOCSCORR, &corr_tmp)) { + perror("jscal: error setting correction"); + exit(1); + } + +} + void print_settings(char *devicename) { int i,j; @@ -425,7 +467,7 @@ exit(1); } - //axes + //axes sscanf(p, "%d", &axes_on_cl); p = strstr(p, ","); @@ -457,15 +499,15 @@ sscanf(++p, "%d", &btns_on_cl); p = strstr(p, ","); - if (btns_on_cl != buttons) { + if ((btns_on_cl != buttons)&&(btns_on_cl!=0)) { 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++) - { + for (i = 0; i < btns_on_cl; i++) + { if (!p) { fprintf(stderr, "jscal: missing mapping for button %d\n", i); exit(1); @@ -483,21 +525,31 @@ exit(1); } buttonmap[i] = btn_mapping; - } + } if (p) { fprintf(stderr, "jscal: too many values\n"); exit(1); } + + // Save the current axis map + get_axmap2(); + // Apply the new axis map 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); - } + + // Move the calibration data accordingly + correct_axes(); + + if (btns_on_cl!=0){ + if (ioctl(fd, JSIOCSBTNMAP, &buttonmap)) { + perror("jscal: error setting button map"); + exit(1); + } + } } void set_correction(char *p) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |