aboutsummaryrefslogtreecommitdiff
path: root/src/services/hid.rs
blob: 03c9c4ea703cc1420ffc72d302c65e5a7cdd167d (plain) (blame)
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 ::Result;

use ::raw::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
}

fn to_raw_padkey(key: PadKey) -> u32 {
    use ::raw::services::hid::PAD_KEY::*;
    use self::PadKey::*;

    match key {
        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 fn init() -> Result {
    unsafe {
        // TODO allow sharedMem argument?
        return hid::hidInit(0 as *mut u32);
    }
}

pub fn exit() -> () {
    unsafe {
        hid::hidExit();
    }
}

/// Update ctrulib's button states.
///
/// # Examples
///
/// ```
/// use ctru::service::apt;
///
/// apt::main_loop(|| {
///     scan_input();
///     if key_down(PadKey::A) {
///         apt::set_status(apt::AppStatus::Exiting);
///     }
/// });
/// ```
pub fn scan_input() -> () {
    unsafe {
        hid::hidScanInput();
    }
}

pub fn key_down(key: PadKey) -> bool {
    unsafe {
        if hid::hidKeysDown() & to_raw_padkey(key) != 0 {
            return true;
        } else {
            return false;
        }
    }
}

pub fn key_held(key: PadKey) -> bool {
    unsafe {
        if hid::hidKeysHeld() & to_raw_padkey(key) != 0 {
            return true;
        } else {
            return false;
        }
    }
}

pub fn key_up(key: PadKey) -> bool {
    unsafe {
        if hid::hidKeysUp() & to_raw_padkey(key) != 0 {
            return true;
        } else {
            return false;
        }
    }
}