1#[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}