ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/padSDL/padsdl.c
Revision: 1.1
Committed: 2003-02-06T21:54:03Z (21 years, 9 months ago) by cebix
Content type: text/plain
Branch: MAIN
Branch point for: cebix
Log Message:
Initial revision

File Contents

# User Rev Content
1 cebix 1.1 /*
2     * PSEmu plugin for SDL joysticks
3     *
4     * Written in 2003 by Christian Bauer
5     */
6    
7     #include <SDL/SDL.h>
8     #include <string.h>
9    
10     typedef char HWND;
11     #include "psemu.h"
12    
13     static SDL_Joystick *js1 = NULL, *js2 = NULL;
14     static int num_buttons1 = 0, num_buttons2 = 0;
15     static int num_axes1 = 0, num_axes2 = 0;
16    
17     // Maps SDL button number to PSX button bit number
18     static int button_map[16] = {
19     12, // Triangle
20     13, // Circle
21     14, // Cross
22     15, // Square
23     8, // L2
24     9, // R2
25     10, // L1
26     11, // R1
27     0, // Select
28     1, // Left analog
29     2, // Right analog
30     3, // Start
31     4, // Up
32     5, // Right
33     6, // Down
34     7 // Left
35     };
36    
37     char *PSEgetLibName(void)
38     {
39     return "Cebix' SDL Joystick Plugin";
40     }
41    
42     unsigned long PSEgetLibType(void)
43     {
44     return PSE_LT_PAD;
45     }
46    
47     unsigned long PSEgetLibVersion(void)
48     {
49     return (1 << 16) | (VERSION << 8) | BUILD;
50     }
51    
52     long PADinit(long flags)
53     {
54     if (SDL_Init(SDL_INIT_JOYSTICK) < 0)
55     return PSE_INIT_ERR_NOHARDWARE;
56     if (SDL_NumJoysticks() < 1)
57     return PSE_INIT_ERR_NOHARDWARE;
58     SDL_JoystickEventState(SDL_IGNORE);
59    
60     return PSE_INIT_ERR_SUCCESS;
61     }
62    
63     void PADshutdown(void)
64     {
65     SDL_Quit();
66     }
67    
68     long PADopen(unsigned long *disp)
69     {
70     js1 = SDL_JoystickOpen(0);
71     if (js1) {
72     num_axes1 = SDL_JoystickNumAxes(js1);
73     num_buttons1 = SDL_JoystickNumButtons(js1);
74     }
75     js2 = SDL_JoystickOpen(1);
76     if (js2) {
77     num_axes2 = SDL_JoystickNumAxes(js2);
78     num_buttons2 = SDL_JoystickNumButtons(js2);
79     }
80     return (js1 || js2) ? PSE_PAD_ERR_SUCCESS : PSE_PAD_ERR_FAILURE;
81     }
82    
83     long PADclose(void)
84     {
85     if (js1) {
86     SDL_JoystickClose(js1);
87     js1 = NULL;
88     }
89     if (js2) {
90     SDL_JoystickClose(js2);
91     js2 = NULL;
92     }
93     return PSE_PAD_ERR_SUCCESS;
94     }
95    
96     long PADquery(void)
97     {
98     return PSE_PAD_USE_PORT1 | PSE_PAD_USE_PORT2;
99     }
100    
101     static read_pad(SDL_Joystick *js, int num_buttons, int num_axes, PadDataS *pad)
102     {
103     Uint16 buttons = 0;
104     unsigned i;
105    
106     memset(pad, 0, sizeof(PadDataS));
107     pad->controllerType = PSE_PAD_TYPE_ANALOGPAD;
108    
109     for (i=0; i<num_buttons; i++) {
110     if (SDL_JoystickGetButton(js, i) == SDL_PRESSED)
111     buttons |= (1 << button_map[i]);
112     }
113     pad->buttonStatus = ~buttons;
114    
115     if (num_axes >= 2) {
116     pad->leftJoyX = SDL_JoystickGetAxis(js, 0) / 256 + 128;
117     pad->leftJoyY = SDL_JoystickGetAxis(js, 1) / 256 + 128;
118     } else
119     pad->leftJoyX = pad->leftJoyY = 128;
120    
121     if (num_axes >= 4) {
122     pad->rightJoyX = SDL_JoystickGetAxis(js, 2) / 256 + 128;
123     pad->rightJoyY = SDL_JoystickGetAxis(js, 3) / 256 + 128;
124     } else
125     pad->rightJoyX = pad->rightJoyY = 128;
126    
127     pad->moveX = pad->moveY = 0;
128     }
129    
130     long PADreadPort1(PadDataS *pad)
131     {
132     if (js1) {
133     SDL_JoystickUpdate();
134     read_pad(js1, num_buttons1, num_axes1, pad);
135     } else {
136     pad->controllerType = PSE_PAD_TYPE_ANALOGPAD;
137     pad->buttonStatus = 0xffff;
138     }
139     return PSE_PAD_ERR_SUCCESS;
140     }
141    
142     long PADreadPort2(PadDataS *pad)
143     {
144     if (js2) {
145     SDL_JoystickUpdate();
146     read_pad(js2, num_buttons2, num_axes2, pad);
147     } else {
148     pad->controllerType = PSE_PAD_TYPE_ANALOGPAD;
149     pad->buttonStatus = 0xffff;
150     }
151     return PSE_PAD_ERR_SUCCESS;
152     }
153    
154     long PADtest(void)
155     {
156     return PSE_ERR_SUCCESS;
157     }
158    
159     long PADconfigure(void)
160     {
161     return PSE_ERR_SUCCESS;
162     }
163    
164     void PADabout(void)
165     {
166     }