Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/crates/bevy_gilrs/src/gilrs_system.rs
6601 views
1
use crate::{
2
converter::{convert_axis, convert_button},
3
Gilrs, GilrsGamepads,
4
};
5
use bevy_ecs::event::EventWriter;
6
use bevy_ecs::prelude::Commands;
7
use bevy_ecs::system::ResMut;
8
use bevy_input::gamepad::{
9
GamepadConnection, GamepadConnectionEvent, RawGamepadAxisChangedEvent,
10
RawGamepadButtonChangedEvent, RawGamepadEvent,
11
};
12
use gilrs::{ev::filter::axis_dpad_to_button, EventType, Filter};
13
14
pub fn gilrs_event_startup_system(
15
mut commands: Commands,
16
mut gilrs: ResMut<Gilrs>,
17
mut gamepads: ResMut<GilrsGamepads>,
18
mut events: EventWriter<GamepadConnectionEvent>,
19
) {
20
gilrs.with(|gilrs| {
21
for (id, gamepad) in gilrs.gamepads() {
22
// Create entity and add to mapping
23
let entity = commands.spawn_empty().id();
24
gamepads.id_to_entity.insert(id, entity);
25
gamepads.entity_to_id.insert(entity, id);
26
events.write(GamepadConnectionEvent {
27
gamepad: entity,
28
connection: GamepadConnection::Connected {
29
name: gamepad.name().to_string(),
30
vendor_id: gamepad.vendor_id(),
31
product_id: gamepad.product_id(),
32
},
33
});
34
}
35
});
36
}
37
38
pub fn gilrs_event_system(
39
mut commands: Commands,
40
mut gilrs: ResMut<Gilrs>,
41
mut gamepads: ResMut<GilrsGamepads>,
42
mut events: EventWriter<RawGamepadEvent>,
43
mut connection_events: EventWriter<GamepadConnectionEvent>,
44
mut button_events: EventWriter<RawGamepadButtonChangedEvent>,
45
mut axis_event: EventWriter<RawGamepadAxisChangedEvent>,
46
) {
47
gilrs.with(|gilrs| {
48
while let Some(gilrs_event) = gilrs.next_event().filter_ev(&axis_dpad_to_button, gilrs) {
49
gilrs.update(&gilrs_event);
50
match gilrs_event.event {
51
EventType::Connected => {
52
let pad = gilrs.gamepad(gilrs_event.id);
53
let entity = gamepads.get_entity(gilrs_event.id).unwrap_or_else(|| {
54
let entity = commands.spawn_empty().id();
55
gamepads.id_to_entity.insert(gilrs_event.id, entity);
56
gamepads.entity_to_id.insert(entity, gilrs_event.id);
57
entity
58
});
59
60
let event = GamepadConnectionEvent::new(
61
entity,
62
GamepadConnection::Connected {
63
name: pad.name().to_string(),
64
vendor_id: pad.vendor_id(),
65
product_id: pad.product_id(),
66
},
67
);
68
events.write(event.clone().into());
69
connection_events.write(event);
70
}
71
EventType::Disconnected => {
72
let gamepad = gamepads
73
.id_to_entity
74
.get(&gilrs_event.id)
75
.copied()
76
.expect("mapping should exist from connection");
77
let event =
78
GamepadConnectionEvent::new(gamepad, GamepadConnection::Disconnected);
79
events.write(event.clone().into());
80
connection_events.write(event);
81
}
82
EventType::ButtonChanged(gilrs_button, raw_value, _) => {
83
let Some(button) = convert_button(gilrs_button) else {
84
continue;
85
};
86
let gamepad = gamepads
87
.id_to_entity
88
.get(&gilrs_event.id)
89
.copied()
90
.expect("mapping should exist from connection");
91
events.write(
92
RawGamepadButtonChangedEvent::new(gamepad, button, raw_value).into(),
93
);
94
button_events.write(RawGamepadButtonChangedEvent::new(
95
gamepad, button, raw_value,
96
));
97
}
98
EventType::AxisChanged(gilrs_axis, raw_value, _) => {
99
let Some(axis) = convert_axis(gilrs_axis) else {
100
continue;
101
};
102
let gamepad = gamepads
103
.id_to_entity
104
.get(&gilrs_event.id)
105
.copied()
106
.expect("mapping should exist from connection");
107
events.write(RawGamepadAxisChangedEvent::new(gamepad, axis, raw_value).into());
108
axis_event.write(RawGamepadAxisChangedEvent::new(gamepad, axis, raw_value));
109
}
110
_ => (),
111
};
112
}
113
gilrs.inc();
114
});
115
}
116
117