|
|
1.1 root 1: /*
2: * UAE - The Un*x Amiga Emulator
3: *
4: * Joystick emulation for Linux and BSD. They share too much code to
5: * split this file.
6: *
7: * Copyright 1997 Bernd Schmidt
8: * Copyright 1998 Krister Walfridsson
9: */
10:
11: #include "sysconfig.h"
12: #include "sysdeps.h"
13:
14: #include "config.h"
15: #include "options.h"
16: #include "memory.h"
17: #include "custom.h"
18: #include "joystick.h"
19: #include "SDL.h"
20:
21: int nr_joysticks;
22:
23: static SDL_Joystick *joy0, *joy1;
24:
25: struct joy_range
26: {
27: int minx, maxx, miny, maxy;
28: } range0, range1;
29:
30: void read_joystick(int nr, unsigned int *dir, int *button)
31: {
32: int x_axis, y_axis;
33: int left = 0, right = 0, top = 0, bot = 0;
34: int len, i, num;
35: SDL_Joystick *joy = nr == 0 ? joy0 : joy1;
36: struct joy_range *r = nr == 0 ? &range0 : &range1;
37:
38: *dir = 0;
39: *button = 0;
40: if (nr >= nr_joysticks)
41: return;
42:
43: SDL_JoystickUpdate ();
44:
45: x_axis = SDL_JoystickGetAxis (joy, 0);
46: y_axis = SDL_JoystickGetAxis (joy, 1);
47:
48: if (x_axis < r->minx) r->minx = x_axis;
49: if (y_axis < r->miny) r->miny = y_axis;
50: if (x_axis > r->maxx) r->maxx = x_axis;
51: if (y_axis > r->maxy) r->maxy = y_axis;
52:
53: if (x_axis < (r->minx + (r->maxx - r->minx)/3))
54: left = 1;
55: else if (x_axis > (r->minx + 2*(r->maxx - r->minx)/3))
56: right = 1;
57:
58: if (y_axis < (r->miny + (r->maxy - r->miny)/3))
59: top = 1;
60: else if (y_axis > (r->miny + 2*(r->maxy - r->miny)/3))
61: bot = 1;
62:
63: if (left) top = !top;
64: if (right) bot = !bot;
65: *dir = bot | (right << 1) | (top << 8) | (left << 9);
66: num = SDL_JoystickNumButtons (joy);
67: if (num > 16)
68: num = 16;
69: for (i = 0; i < num; i++)
70: *button |= (SDL_JoystickGetButton (joy, i) & 1) << i;
71: }
72:
73: void init_joystick(void)
74: {
75: int i;
76: nr_joysticks = SDL_NumJoysticks ();
77: if (nr_joysticks > 0)
78: joy0 = SDL_JoystickOpen (0);
79: if (nr_joysticks > 1)
80: joy1 = SDL_JoystickOpen (1);
81: range0.minx = INT_MAX;
82: range0.maxx = INT_MIN;
83: range0.miny = INT_MAX;
84: range0.maxy = INT_MIN;
85: range1.minx = INT_MAX;
86: range1.maxx = INT_MIN;
87: range1.miny = INT_MAX;
88: range1.maxy = INT_MIN;
89: }
90:
91: void close_joystick(void)
92: {
93: if (nr_joysticks > 0)
94: SDL_JoystickClose (joy0);
95: if (nr_joysticks > 1)
96: SDL_JoystickClose (joy1);
97: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.