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
|
use core::convert::Into;
use core::marker::PhantomData;
use libctru::services::hid;
pub enum PadKey {
A,
B,
Select,
Start,
DPadRight,
DPadLeft,
DPadUp,
DPadDown,
R,
L,
X,
Y,
ZL,
ZR,
Touch,
CSRight,
CSLeft,
CSUp,
CSDown,
CRight,
CLeft,
CUp,
CDown,
// convenience catch-all for dpad and cpad
Up,
Down,
Left,
Right
}
impl From<PadKey> for u32 {
fn from(p: PadKey) -> u32 {
use libctru::services::hid::PAD_KEY::*;
use self::PadKey::*;
match p {
Up => KEY_DUP as u32 | KEY_CPAD_UP as u32,
Down => KEY_DDOWN as u32 | KEY_CPAD_DOWN as u32,
Left => KEY_DLEFT as u32 | KEY_CPAD_LEFT as u32,
Right => KEY_DRIGHT as u32 | KEY_CPAD_RIGHT as u32,
A => KEY_A as u32,
B => KEY_B as u32,
X => KEY_X as u32,
Y => KEY_Y as u32,
L => KEY_L as u32,
R => KEY_R as u32,
ZL => KEY_ZL as u32,
ZR => KEY_ZR as u32,
Start => KEY_START as u32,
Select => KEY_SELECT as u32,
Touch => KEY_TOUCH as u32,
CSRight => KEY_CSTICK_RIGHT as u32,
CSLeft => KEY_CSTICK_LEFT as u32,
CSUp => KEY_CSTICK_UP as u32,
CSDown => KEY_CSTICK_DOWN as u32,
CRight => KEY_CPAD_RIGHT as u32,
CLeft => KEY_CPAD_LEFT as u32,
CDown => KEY_CPAD_DOWN as u32,
CUp => KEY_CPAD_UP as u32,
DPadLeft => KEY_DLEFT as u32,
DPadRight => KEY_DRIGHT as u32,
DPadUp => KEY_DUP as u32,
DPadDown => KEY_DDOWN as u32
}
}
}
pub struct Hid {
pd: PhantomData<i32>
}
impl Hid {
pub fn new() -> Result<Hid, i32> {
unsafe {
let r = hid::hidInit();
if r < 0 {
Err(r)
} else {
Ok(Hid { pd: PhantomData })
}
}
}
pub fn scan_input(&mut self) {
unsafe { hid::hidScanInput() };
}
pub fn key_down(&self, key: PadKey) -> bool {
let k: u32 = key.into();
unsafe {
if hid::hidKeysDown() & k != 0 {
true
} else {
false
}
}
}
pub fn key_held(&self, key: PadKey) -> bool {
let k: u32 = key.into();
unsafe {
if hid::hidKeysHeld() & k != 0 {
true
} else {
false
}
}
}
pub fn key_up(&self, key: PadKey) -> bool {
let k: u32 = key.into();
unsafe {
if hid::hidKeysUp() & k != 0 {
return true;
} else {
return false;
}
}
}
}
impl Drop for Hid {
fn drop(&mut self) {
unsafe { hid::hidExit() };
}
}
|