ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/padSDL/padsdl.c
Revision: 1.2
Committed: 2003-02-14T22:06:54Z (21 years, 1 month ago) by cebix
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 1.1: +4 -0 lines
Log Message:
added ePSXe support

File Contents

# Content
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 #ifdef EPSXE
114 pad->buttonStatus = ~((buttons >> 8) | (buttons << 8));
115 #else
116 pad->buttonStatus = ~buttons;
117 #endif
118
119 if (num_axes >= 2) {
120 pad->leftJoyX = SDL_JoystickGetAxis(js, 0) / 256 + 128;
121 pad->leftJoyY = SDL_JoystickGetAxis(js, 1) / 256 + 128;
122 } else
123 pad->leftJoyX = pad->leftJoyY = 128;
124
125 if (num_axes >= 4) {
126 pad->rightJoyX = SDL_JoystickGetAxis(js, 2) / 256 + 128;
127 pad->rightJoyY = SDL_JoystickGetAxis(js, 3) / 256 + 128;
128 } else
129 pad->rightJoyX = pad->rightJoyY = 128;
130
131 pad->moveX = pad->moveY = 0;
132 }
133
134 long PADreadPort1(PadDataS *pad)
135 {
136 if (js1) {
137 SDL_JoystickUpdate();
138 read_pad(js1, num_buttons1, num_axes1, pad);
139 } else {
140 pad->controllerType = PSE_PAD_TYPE_ANALOGPAD;
141 pad->buttonStatus = 0xffff;
142 }
143 return PSE_PAD_ERR_SUCCESS;
144 }
145
146 long PADreadPort2(PadDataS *pad)
147 {
148 if (js2) {
149 SDL_JoystickUpdate();
150 read_pad(js2, num_buttons2, num_axes2, pad);
151 } else {
152 pad->controllerType = PSE_PAD_TYPE_ANALOGPAD;
153 pad->buttonStatus = 0xffff;
154 }
155 return PSE_PAD_ERR_SUCCESS;
156 }
157
158 long PADtest(void)
159 {
160 return PSE_ERR_SUCCESS;
161 }
162
163 long PADconfigure(void)
164 {
165 return PSE_ERR_SUCCESS;
166 }
167
168 void PADabout(void)
169 {
170 }