File: controller.h

package info (click to toggle)
pcsx2 1.4.0%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 22,172 kB
  • ctags: 40,348
  • sloc: cpp: 232,892; ansic: 22,912; asm: 2,273; lisp: 1,346; sh: 561; perl: 253; makefile: 113; xml: 69
file content (143 lines) | stat: -rw-r--r-- 3,784 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*  OnePAD - author: arcum42(@gmail.com)
 *  Copyright (C) 2009
 *
 *  Based on ZeroPAD, author zerofrog@gmail.com
 *  Copyright (C) 2006-2007
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
 */

#pragma once
#include <string.h> // for memset
#ifdef __linux__
#define MAX_KEYS 24
#else
#define MAX_KEYS 20
#endif

enum KeyType
{
	PAD_JOYBUTTONS = 0,
	PAD_AXIS,
	PAD_HAT,
	PAD_NULL = -1
};

extern void set_keyboad_key(int pad, int keysym, int index);
extern int get_keyboard_key(int pad, int keysym);
extern void set_key(int pad, int index, int value);
extern int get_key(int pad, int index);
extern bool IsAnalogKey(int index);

extern KeyType type_of_joykey(int pad, int index);
extern int key_to_button(int pad, int index);
extern int key_to_axis(int pad, int index);
extern bool key_to_axis_sign(int pad, int index);
extern bool key_to_axis_type(int pad, int index);
extern int key_to_hat_dir(int pad, int index);

extern int button_to_key(int button_id);
extern int axis_to_key(int full_axis, int sign, int axis_id);
extern int hat_to_key(int dir, int axis_id);

extern int PadEnum[2][2];

class PADconf
{
	u32 ff_intensity;
	u32 sensibility;
	public:
	union {
		struct {
			u16 forcefeedback :1;
			u16 reverse_lx :1;
			u16 reverse_ly :1;
			u16 reverse_rx :1;
			u16 reverse_ry :1;
			u16 mouse_l :1;
			u16 mouse_r :1;
			u16 sixaxis_usb :1;
			u16 sixaxis_pressure :1;
			u16 _free : 7; // The 8 remaining bits are unused, do what you wish with them ;)
		} pad_options[2]; // One for each pads
		u32 packed_options; // Only first 8 bits of each 16 bits series are really used, rest is padding
	};

	u32 keys[2][MAX_KEYS];
	u32 log;
	u32 joyid_map;
	map<u32,u32> keysym_map[2];

	PADconf() { init(); }

	void init() {
		memset(&keys, 0, sizeof(keys));
		log = packed_options = joyid_map = 0;
		ff_intensity = 0x7FFF; // set it at max value by default
		sensibility = 500;
		for (int pad = 0; pad < 2 ; pad++)
			keysym_map[pad].clear();
	}

	void set_joyid(u32 pad, u32 joy_id) {
		int shift = 8 * pad;
		joyid_map &= ~(0xFF << shift); // clear
		joyid_map |= (joy_id & 0xFF) << shift; // set
	}

	u32 get_joyid(u32 pad) {
		int shift = 8 * pad;
		return ((joyid_map >> shift) & 0xFF);
	}
	
	/**
	 * Return (a copy of) private memner ff_instensity
	 **/
	u32 get_ff_intensity()
	{
		return ff_intensity;
	}

	/**
	 * Set intensity while checking that the new value is within
	 * valid range, more than 0x7FFF will cause pad not to rumble(and less than 0 is obviously bad)
	 **/
	void set_ff_intensity(u32 new_intensity)
	{
		if(new_intensity < 0x7FFF && new_intensity >= 0)
		{
			ff_intensity = new_intensity;
		}
	}

	/**
	 * Set sensibility value, sensibility is not yet implemented(and will probably be after evdev)
	 * However, there will be an upper range too, less than 0 is an obvious wrong
	 * Anyway, we are doing object oriented code, members are definitely not supposed to be public
	 **/
	void set_sensibility(u32 new_sensibility)
	{
		if(sensibility > 0)
		{
			sensibility = new_sensibility;
		}
	}

	u32 get_sensibility()
	{
		return sensibility;
	}
};
extern PADconf *conf;