Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/joy/joy.c
Show First 20 Lines • Show All 165 Lines • ▼ Show 20 Lines | #ifndef __i386__ | ||||
s = splhigh(); | s = splhigh(); | ||||
#else | #else | ||||
disable_intr (); | disable_intr (); | ||||
#endif | #endif | ||||
nanotime(&t); | nanotime(&t); | ||||
end.tv_sec = 0; | end.tv_sec = 0; | ||||
end.tv_nsec = joy->timeout[joypart(dev)] * 1000; | end.tv_nsec = joy->timeout[joypart(dev)] * 1000; | ||||
timespecadd(&end, &t); | timespecadd(&end, &t, &end); | ||||
for (; timespeccmp(&t, &end, <) && (bus_space_read_1(bt, port, 0) & 0x0f); nanotime(&t)) | for (; timespeccmp(&t, &end, <) && (bus_space_read_1(bt, port, 0) & 0x0f); nanotime(&t)) | ||||
; /* nothing */ | ; /* nothing */ | ||||
bus_space_write_1 (bt, port, 0, 0xff); | bus_space_write_1 (bt, port, 0, 0xff); | ||||
nanotime(&start); | nanotime(&start); | ||||
end.tv_sec = 0; | end.tv_sec = 0; | ||||
end.tv_nsec = joy->timeout[joypart(dev)] * 1000; | end.tv_nsec = joy->timeout[joypart(dev)] * 1000; | ||||
timespecadd(&end, &start); | timespecadd(&end, &start, &end); | ||||
t = start; | t = start; | ||||
timespecclear(&x); | timespecclear(&x); | ||||
timespecclear(&y); | timespecclear(&y); | ||||
while (timespeccmp(&t, &end, <)) { | while (timespeccmp(&t, &end, <)) { | ||||
state = bus_space_read_1 (bt, port, 0); | state = bus_space_read_1 (bt, port, 0); | ||||
if (joypart(dev) == 1) | if (joypart(dev) == 1) | ||||
state >>= 2; | state >>= 2; | ||||
nanotime(&t); | nanotime(&t); | ||||
if (!timespecisset(&x) && !(state & 0x01)) | if (!timespecisset(&x) && !(state & 0x01)) | ||||
x = t; | x = t; | ||||
if (!timespecisset(&y) && !(state & 0x02)) | if (!timespecisset(&y) && !(state & 0x02)) | ||||
y = t; | y = t; | ||||
if (timespecisset(&x) && timespecisset(&y)) | if (timespecisset(&x) && timespecisset(&y)) | ||||
break; | break; | ||||
} | } | ||||
#ifndef __i386__ | #ifndef __i386__ | ||||
splx(s); | splx(s); | ||||
#else | #else | ||||
enable_intr (); | enable_intr (); | ||||
#endif | #endif | ||||
if (timespecisset(&x)) { | if (timespecisset(&x)) { | ||||
timespecsub(&x, &start); | timespecsub(&x, &start, &x); | ||||
c.x = joy->x_off[joypart(dev)] + x.tv_nsec / 1000; | c.x = joy->x_off[joypart(dev)] + x.tv_nsec / 1000; | ||||
} else | } else | ||||
c.x = 0x80000000; | c.x = 0x80000000; | ||||
if (timespecisset(&y)) { | if (timespecisset(&y)) { | ||||
timespecsub(&y, &start); | timespecsub(&y, &start, &y); | ||||
c.y = joy->y_off[joypart(dev)] + y.tv_nsec / 1000; | c.y = joy->y_off[joypart(dev)] + y.tv_nsec / 1000; | ||||
} else | } else | ||||
c.y = 0x80000000; | c.y = 0x80000000; | ||||
state >>= 4; | state >>= 4; | ||||
c.b1 = ~state & 1; | c.b1 = ~state & 1; | ||||
c.b2 = ~(state >> 1) & 1; | c.b2 = ~(state >> 1) & 1; | ||||
return (uiomove((caddr_t)&c, sizeof(struct joystick), uio)); | return (uiomove((caddr_t)&c, sizeof(struct joystick), uio)); | ||||
} | } | ||||
Show All 35 Lines |