4
#include <linux/joystick.h>
8
void print_data(int aval[], int bval[], int axes, int btns) {
10
for (i=0; i<btns; i++) {
11
printf("%2d |", bval[i]);
13
for (i=0; i<axes; i++) {
14
printf(" %5d |", aval[i]);
20
void print_data_hdr(int aval[], int bval[], int axes, int btns) {
22
printf("js0: axes=%d, buttons=%d\n", axes, btns);
23
for (i=0; i<btns; i++) {
26
for (i=0; i<axes; i++) {
27
printf(" a%02d |", i, aval[i]);
30
for (i=0; i<btns; i++) {
33
for (i=0; i<axes; i++) {
39
int main(int argc, char *argv[]) {
49
unsigned char axes, btns;
51
struct js_corr cor[64];
53
fd=open(argv[1], O_RDONLY|O_NONBLOCK);
55
fd=open("/dev/input/js0", O_RDONLY|O_NONBLOCK);
57
perror("Failed to open device");
60
ioctl(fd, JSIOCGAXES, &axes);
61
ioctl(fd, JSIOCGBUTTONS, &btns);
62
for (i=0; i<64; i++) {
63
cor[i].type=JS_CORR_NONE;
66
cor[i].coef[2]=65536*64;
67
cor[i].coef[3]=65536*64;
69
ioctl(fd, JSIOCSCORR, cor);
71
printf("Leave all axes centred, press a button when ready\n");
72
print_data_hdr(aval, bval, axes, btns);
74
for (i=0; i<axes; i++) aval[i]=128;
75
for (i=0; i<axes; i++) bval[i]=0;
79
while (read(fd, &ev, sizeof(ev))==sizeof(ev)) {
80
if (ev.type&JS_EVENT_BUTTON)
81
bval[ev.number]=ev.value;
82
if (ev.type&JS_EVENT_AXIS)
83
aval[ev.number]=ev.value;
85
print_data(aval, bval, axes, btns);
87
for (i=0; i<btns; i++) nobutton+=bval[i];
89
//set initial deadzone
90
for (i=0; i<axes; i++) dmin[i]=dmax[i]=aval[i];
93
//wait five seconds for scan of deadzone
96
while (read(fd, &ev, sizeof(ev))==sizeof(ev)) {
97
if (ev.type&JS_EVENT_BUTTON)
98
bval[ev.number]=ev.value;
99
if (ev.type&JS_EVENT_AXIS) {
100
aval[ev.number]=ev.value;
101
if (aval[ev.number]<dmin[ev.number])
102
dmin[ev.number]=aval[ev.number];
103
if (aval[ev.number]>dmax[ev.number])
104
dmax[ev.number]=aval[ev.number];
107
print_data(aval, bval, axes, btns);
113
for (i=0; i<axes; i++) min[i]=max[i]=aval[i];
115
printf("Move axes through complete range of motion.\n");
116
printf("Press a button when complete\n");
117
print_data_hdr(aval, bval, axes, btns);
118
while (nobutton==0) {
119
while (read(fd, &ev, sizeof(ev))==sizeof(ev)) {
120
if (ev.type&JS_EVENT_BUTTON)
121
bval[ev.number]=ev.value;
122
if (ev.type&JS_EVENT_AXIS) {
123
aval[ev.number]=ev.value;
124
if (aval[ev.number]<min[ev.number])
125
min[ev.number]=aval[ev.number];
126
if (aval[ev.number]>max[ev.number])
127
max[ev.number]=aval[ev.number];
130
print_data(aval, bval, axes, btns);
132
for (i=0; i<btns; i++) nobutton+=bval[i];
135
for (i=0; i<axes; i++) {
136
cor[i].type=JS_CORR_BROKEN;
137
printf("%d: %d %d %d %d\n", i, dmin[i], dmax[i], min[i], max[i]);
138
if (max[i]==dmax[i]) dmax[i]=max[i]-1;
139
if (min[i]==dmin[i]) dmin[i]=min[i]+1;
140
cor[i].coef[0]=dmin[i];
141
cor[i].coef[1]=dmax[i];
142
cor[i].coef[2]=32768*16384/(dmin[i]-min[i]);
143
cor[i].coef[3]=32768*16384/(max[i]-dmax[i]);
145
ioctl(fd, JSIOCSCORR, cor);