Skip to main content

dual_shock4_controller/
gamepad.rs

1/********************************************************
2* Copyright (C): 2020-2021 OOKI CENT,Ltd. All Rights Reserved. 
3* FileName:  gamepad.rs  
4* Author: http://www.ookicent.com
5* Date: 2020-08-19  10:36
6* Version: 0.1.1
7* Description: 
8**********************************************************/
9
10#[derive(Copy, Clone, Debug)]
11pub struct  StickInfo{
12    pub x:u8,
13    pub y:u8
14}
15#[derive(Copy, Clone, Debug)]
16pub struct Stick{
17    pub left_stick:StickInfo,
18    pub right_stick:StickInfo,
19}
20
21#[derive(Copy, Clone, Debug)]
22pub struct  Button{
23    pub pressed:bool
24}
25
26#[derive(Copy, Clone, Debug)]
27pub struct  GamePad{
28    pub up_left_button:Button,
29    pub up_right_button:Button,
30    pub down_left_button:Button,
31    pub down_right_button:Button,
32    pub left_button:Button,
33    pub right_button:Button,
34    pub up_button:Button,
35    pub down_button:Button,
36    pub l1_button:Button,
37    pub l2_button:Button,
38    pub r1_button:Button,
39    pub r2_button:Button,
40    pub x_button:Button,
41    pub o_button:Button,
42    pub square_button:Button,
43    pub triangle_button:Button,
44    pub share_button:Button,
45    pub option_button:Button,
46    pub ps_button:Button,
47    pub left_stick_button:Button,
48    pub right_stick_button:Button,
49    pub stick:Stick
50}
51
52impl GamePad{
53    pub fn new()->Self{
54        GamePad{
55            up_left_button: Button{pressed:false},
56            up_right_button: Button{pressed:false},
57            down_left_button: Button{pressed:false},
58            down_right_button: Button{pressed:false},
59            left_button: Button{pressed:false},
60            right_button: Button{pressed:false},
61            up_button: Button{pressed:false},
62            down_button: Button{pressed:false},
63            l1_button:Button{pressed:false},
64            l2_button:Button{pressed:false},
65            r1_button:Button{pressed:false},
66            r2_button:Button{pressed:false},
67            x_button:Button{pressed:false},
68            o_button:Button{pressed:false},
69            square_button:Button{pressed:false},
70            triangle_button:Button{pressed:false},
71            share_button:Button{pressed:false},
72            option_button:Button{pressed:false},
73            ps_button:Button{pressed:false},
74            left_stick_button: Button{pressed:false},
75            right_stick_button: Button{pressed:false},
76            stick: Stick {
77                left_stick:StickInfo{x:0,y:0},
78                right_stick: StickInfo{x:0,y:0},
79            }
80        }
81    }
82    pub fn get_state(&self,buf:&[u8])->Self{
83        GamePad{
84            up_left_button: Button{pressed:check_button_pressed((0x05, 0x07, 0xf), buf)},
85            up_right_button: Button{pressed:check_button_pressed((0x05, 0x01, 0xf), buf)},
86            down_left_button: Button{pressed:check_button_pressed((0x05, 0x05, 0xf), buf)},
87            down_right_button: Button{pressed:check_button_pressed((0x05, 0x03, 0xf), buf)},
88            left_button: Button{pressed:check_button_pressed((0x05, 0x06, 0xf), buf)},
89            right_button: Button{pressed:check_button_pressed((0x05, 0x02, 0xf), buf)},
90            up_button: Button{pressed:check_button_pressed((0x05, 0x00, 0xf), buf)},
91            down_button: Button{pressed:check_button_pressed((0x05, 0x04, 0xf), buf)},
92            l1_button:Button{pressed:check_button_pressed((0x06, 0x01, 0xff), buf)},
93            l2_button:Button{pressed:check_button_pressed((0x06,0x04,0xff),buf)},
94            r1_button:Button{pressed:check_button_pressed((0x06,0x02,0xff),buf)},
95            r2_button:Button{pressed:check_button_pressed((0x06,0x08,0xff),buf)},
96            x_button:Button{pressed:check_button_pressed((0x05,0x20,0xff),buf)},
97            o_button:Button{pressed:check_button_pressed((0x05,0x40,0xff),buf)},
98            square_button:Button{pressed:check_button_pressed((0x05,0x10,0xff),buf)},
99            triangle_button:Button{pressed:check_button_pressed((0x05,0x80,0xff),buf)},
100            share_button:Button{pressed:check_button_pressed((0x06,0x10,0xff),buf)},
101            option_button:Button{pressed:check_button_pressed((0x06,0x20,0xff),buf)},
102            ps_button:Button{pressed:check_button_pressed((0x07,0x01,0xff),buf)},
103            left_stick_button: Button{pressed:check_button_pressed((0x06,0x40,0xff),buf)},
104            right_stick_button: Button{pressed:check_button_pressed((0x06,0x80,0xff),buf)},
105            stick:check_stick_rock(buf)
106        }
107    }
108}
109
110pub fn check_button_pressed(conf:(usize,u8,u8),buf:&[u8])->bool{
111    let rev = buf[conf.0] & conf.2;
112
113    if conf.0 == 0x05 && conf.1 == 0x00 {
114        return  rev == 0x00
115    }
116
117    let result = rev & conf.1;
118    result == conf.1
119}
120
121pub fn check_stick_rock(buf:&[u8])->Stick{
122
123    let left_stick = StickInfo{
124        x: buf[0x01],
125        y: buf[0x02],
126    };
127
128    let right_stick = StickInfo{
129        x: buf[0x03],
130        y: buf[0x04],
131    };
132
133    Stick{
134        left_stick,
135        right_stick
136    }
137
138}