aboutsummaryrefslogtreecommitdiff
path: root/core/src/data/controller/controller_runtime.rs
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/data/controller/controller_runtime.rs')
-rw-r--r--core/src/data/controller/controller_runtime.rs75
1 files changed, 75 insertions, 0 deletions
diff --git a/core/src/data/controller/controller_runtime.rs b/core/src/data/controller/controller_runtime.rs
new file mode 100644
index 0000000..5e7bb6d
--- /dev/null
+++ b/core/src/data/controller/controller_runtime.rs
@@ -0,0 +1,75 @@
+use std::collections::{HashMap, VecDeque};
+use std::sync::atomic::AtomicBool;
+use std::sync::atomic::Ordering::SeqCst;
+use log::trace;
+use crate::data::game::types::GameInfo;
+use crate::data::message::message_enums::{ControlMessage, GameMessage};
+use crate::data::message::traits::MessageManager;
+use crate::data::player::player_data::Player;
+use crate::service::service_types::ServiceType;
+
+/// Controller-side runtime
+/// Stores all data involved in game pad_client interactions during runtime
+#[derive(Default)]
+pub struct ControllerRuntime {
+
+ pub(crate) service_type: ServiceType,
+ pub(crate) received: HashMap<(ServiceType, u8), VecDeque<GameMessage>>,
+ pub(crate) send: HashMap<(ServiceType, u8), VecDeque<ControlMessage>>,
+
+ pub(crate) player: Player,
+
+ pub game_info: GameInfo,
+ pub close: AtomicBool,
+}
+
+/// Message manager for controller-side runtime
+/// After the service starts, it can be accessed or relevant messages can be stored.
+impl MessageManager<GameMessage, ControlMessage, u8> for ControllerRuntime {
+ fn borrow_received_list_mut(&mut self) -> &mut HashMap<(ServiceType, u8), VecDeque<GameMessage>> {
+ &mut self.received
+ }
+
+ fn borrow_send_list_mut(&mut self) -> &mut HashMap<(ServiceType, u8), VecDeque<ControlMessage>> {
+ &mut self.send
+ }
+}
+
+impl ControllerRuntime {
+
+ pub fn close(&mut self) {
+ if !self.close.load(SeqCst) {
+ self.close.store(true, SeqCst);
+ trace!("[Controller Runtime] Closed.");
+ }
+ }
+
+ pub fn message(&mut self, message: String) {
+ self.send_message(ControlMessage::Msg(message));
+ }
+
+ pub fn press_button(&mut self, key: u8) {
+ self.send_message(ControlMessage::Pressed(key));
+ }
+
+ pub fn release_button(&mut self, key: u8) {
+ self.send_message(ControlMessage::Released(key));
+ }
+
+ pub fn change_axis(&mut self, key: u8, ax_val: f64) {
+ self.send_message(ControlMessage::Axis(key, ax_val));
+ }
+
+ pub fn change_direction(&mut self, key: u8, x: f64, y: f64) {
+ self.send_message(ControlMessage::Dir(key, (x, y)));
+ }
+
+ pub fn pop(&mut self) -> Option<GameMessage> {
+ self.receive(0, self.service_type.clone())
+ }
+
+ fn send_message (&mut self, msg: ControlMessage) {
+ let service = self.service_type.clone();
+ self.send(msg, 0, service);
+ }
+} \ No newline at end of file